ZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGggYi8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZmQ1NTcKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InV0aWwvc3JjL21haW4vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InV0aWwvc3JjL3Rlc3QvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbXBpbGVyL3NyYy9tYWluL2phdmFjYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbXBpbGVyL3NyYy9tYWluL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21waWxlci90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9qYXZhY2MvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbXBpbGVyL3NyYy90ZXN0L2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21waWxlci9zcmMvdGVzdC9yZXNvdXJjZXMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwbHVnaW5zL2FudC9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGx1Z2lucy9hbnQvc3JjL21haW4vcmVzb3VyY2VzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGx1Z2lucy9hbnQvc3JjL3Rlc3QvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJiaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJpbmRpbmcteG1sL2NvbXBpbGVyL3NyYy9tYWluL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJiaW5kaW5nLXhtbC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0cy9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMvc3JjL21haW4vcmVzb3VyY2VzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMvdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMvc3JjL3Rlc3QvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4YW1wbGVzL2NoYXQvc3JjL21haW4vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4YW1wbGVzL2NoYXQvdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXhhbXBsZXMvY2hhdC9zcmMvdGVzdC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXhhbXBsZXMvZGlzdG1hcC90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleGFtcGxlcy9kaXN0bWFwL3NyYy90ZXN0L2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleGFtcGxlcy9leGFtcGxlL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4YW1wbGVzL2V4YW1wbGUvc3JjL3Rlc3QvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4YW1wbGVzL3BlcmYvc3JjL21haW4vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4YW1wbGVzL3BlcmYvdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXhhbXBsZXMvcGVyZi9zcmMvdGVzdC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iYmluZGluZy1jL2NvbXBpbGVyL3NyYy9tYWluL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJiaW5kaW5nLWMvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iYmluZGluZy1weXRob24vY29tcGlsZXIvc3JjL21haW4vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJpbmRpbmctcHl0aG9uL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iaW50ZXJvcHRlc3Rlci9leGFtcGxlL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZpY2VzL2NvbmZpZy9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmljZXMvY29uZmlnL3NyYy90ZXN0L2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzZXJ2aWNlcy9jb25maWcvdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmljZXMvY29uZmlnL2V4YW1wbGUvc3JjL21haW4vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5VU0VSX0xJQlJBUlkvRVRDSF9ERVBFTkRFTlRfSkFSUyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8ucHJvamVjdCBiLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDk3OGEKLS0tIC9kZXYvbnVsbAorKysgYi8ucHJvamVjdApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5ldGNoPC9uYW1lPgorCTxjb21tZW50PkphdmFDQyBOYXR1cmU8L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPnNmLmVjbGlwc2UuamF2YWNjLmphdmFjY2J1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5zZi5lY2xpcHNlLmphdmFjYy5qYXZhY2NuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcucHl0aG9uLnB5ZGV2LnB5dGhvbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZTg4NgotLS0gL2Rldi9udWxsCisrKyBiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSwzIEBACisjV2VkIEp1bCAxNiAxNDoyNjoxOCBDRFQgMjAwOA0KK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPg0KZGlmZiAtLWdpdCBhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY1ZTgzCi0tLSAvZGV2L251bGwKKysrIGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI1NhdCBBdWcgMTggMTU6MjQ6NDQgQ0RUIDIwMDcNCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UNCmRpZmYgLS1naXQgYS9CVUlMRC50eHQgYi9CVUlMRC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyMGRkNgotLS0gL2Rldi9udWxsCisrKyBiL0JVSUxELnR4dApAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqLworQnVpbGQgSW5zdHJ1Y3Rpb25zIGZvciBBcGFjaGUgRXRjaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb250ZW50cworLS0tLS0tLS0KKyAgU291cmNlIHRyZWUKKyAgRGVwZW5kZW5jaWVzCisgIFNldHVwIERldmVsb3BtZW50IEVudmlyb25tZW50CisgIEJ1aWxkaW5nIGZyb20gQU5UCisgIEJ1aWxkaW5nIGZyb20gRWNsaXBzZQorICAKKworU291cmNlIHRyZWUKKy0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdGhlIHNvdXJjZSB0cmVlIGZvciBFdGNoLiBJdCBpcyBvcmdhbml6ZWQgYXMgZm9sbG93czoKKworICAgYnVpbGQueG1sICAgICAgICAgLSB0b3AtbGV2ZWwgYW50IGJ1aWxkIHNjcmlwdAorICAgYnVpbGQuZGVwZW5kZWNpZXMgLSBsb2NhdGlvbnMgZm9yIGphcnMgdGhpcyBjb21waWxlIGRlcGVuZHMgb24KKyAgIGV0Y2gucHJvcGVydGllcyAgIC0gc3RhdGljIGJ1aWxkIHByb3BlcnRpZXMgCisgICAKKyAgIGNvbXBpbGVyLyAgICAgIC0gY29yZSBjb21waWxlcgorICAgYnVpbGQtc3VwcG9ydC8gLSBjb21tb24gYW50IHNjcmlwdHMgc2hhcmVkIGJ5IGFsbCBtb2R1bGVzCisgICBwbHVnaW5zLyAgICAgICAtIGV4dGVuc2lvbnMgdGhhdCBlbWJlZCB0aGUgY29tcGlsZXIsIGUuZy4gYW50LCBtYXZlbiwgZXRjLgorICAgc2NyaXB0cy8gICAgICAgLSBjb21tb24gc2NyaXB0cyBmb3IgZWNsaXBzZQorICAgdXRpbC8gICAgICAgICAgLSBzaGFyZWQgamF2YSBjbGFzc2VzCisgICB0ZXN0cy8gICAgICAgICAtIGZ1bmN0aW9uYWwgdGVzdHMKKyAgIGV4YW1wbGVzLyAgICAgIC0gRXRjaCBhcHBsaWNhdGlvbiBleGFtcGxlcworICAgICAgY2hhdC8gICAgICAgLSBzaW1wbGUgSU0gYXBwbGljYXRpb24KKyAgICAgIGRpc3RtYXAvICAgIC0gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpc3RyaWJ1dGVkIG1hcCBpbiBldGNoCisgICAgICBwZXJmLyAgICAgICAtIGV0Y2ggY2xpZW50L3NlcnZlciBwZXJmb3JtYW5jZSB0ZXN0CisgICAgICBleGFtcGxlLyAgICAtIG1pbmltYWwgZXhhbXBsZQorICAgaW5zdGFsbGVycy8gICAgLSBwcm9qZWN0IGZvciBOU0lTIGluc3RhbGxlciBhbmQgdGFyLmd6LCAuemlwIGFyY2hpdmVzCisgICAgICAgCisgICBiaW5kaW5nLXhtbCAgICAtIHhtbCBiaW5kaW5nCisgICBiaW5kaW5nLWphdmEgICAtIGphdmEtbGFuZ3VhZ2UgYmluZGluZworICAgYmluZGluZy1jc2hhcnAgLSBDIy1sYW5ndWFnZSBiaW5kaW5nCisgICAKKworICBBYm91dCB0aGUgU3RydWN0dXJlIG9mIEV0Y2ggYmluZGluZ3MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VhY2ggYmluZGluZyBpcyBmYWN0b3JlZCBpbnRvIGl0cyBvd24gc3RydWN0dXJlIGludG8gdGhlIGJ1aWxkIHRyZWUuIFRoZSBpbnRlbnQKK2lzIHRvIHByb3ZpZGUgYW4gZWFzeSBwYXR0ZXJuIGZvciBwb3RlbnRpYWwgYmluZGluZyBhdXRob3JzIHRvIGVtdWxhdGUuCitFc3NlbnRpYWxseSBlYWNoIGJpbmRpbmcgaGFzIHR3byBjb21wb25lbnRzOgorCisgICAtIGNvbXBpbGVyLworICAgLSBydW50aW1lLworICAgCitUaGUgJ2NvbXBpbGVyJyBpcyBhbHdheXMgaW1wbGVtZW50ZWQgaW4gSmF2YSBhbmQgaXMgY29kZWQgdG8gaW1wbGVtZW50IGEKK2JhY2tlbmQgaW50ZXJmYWNlIGZvciB0aGUgdGFyZ2V0IG9mIGNob2ljZS4KKworVGhlICdydW50aW1lJyBpcyBjb2RlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBUaGUgbW9zdCB1c2VmdWwgbGFuZ3VhZ2UKK2JpbmRpbmdzIGltcGxlbWVudCBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBhcyB0aGUgSmF2YSBhbmQgQyMgYmluZGluZ3MuCitOb24tbGFuZ3VhZ2VzIGJpbmRpbmdzIChsaWtlIGJpbmRpbmcteG1sKSBtYXkgbm90IGhhdmUgYSBydW50aW1lIGNvbXBvbmVudAorYXQgYWxsLgorCitEZXBlbmRlbmNpZXMKKy0tLS0tLS0tLS0tLQorCitUbyBidWlsZCB0aGUgY29tcGlsZXIgY29yZSBhbmQgdGhlIEphdmEgYW5kIFhNTCBiaW5kaW5ncyBhbmQgSmF2YS1iYXNlZCBleGFtcGxlcywKK3lvdSBuZWVkIHRoZSBmb2xsb3dpbmc6CisKKyAqIEphdmEgSkRLIDEuNV8wMTEgb3IgbGF0ZXIKKyAqIEFwYWNoZSBBbnQgMS43KworICogSmF2YUNDIDQuMAorICogSnVuaXQgNC4zLjEKKyAqIFZlbG9jaXR5IDEuNQorCitUbyBjb21waWxlIHRoZSBDIyBiaW5kaW5ncyBhbmQgZXhhbXBsZXM6CisKKyAqIEFwYWNoZSBBbnQgRG90TmV0IDEuMAorICogLk5FVCBGcmFtZXdvcmsgMi4wIChWaXN1YWwgU3R1ZGlvIDIwMDUpCisgKiogKE1vbm8gMS45IHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsKQorICogTlVuaXQgMi40LjcKKyAKK1RvIGNvbXBpbGUgTlNJUyBpbnN0YWxsZXJzOgorCisgKiBOU0lTIDIuMjMKKworU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBwcmltYXJ5IGRldmVsb3BtZW50IGVudmlyb25tZW50cyBmb3IgdGhlIEV0Y2ggY29tbWl0dGVycyBhcmUgV2luMzIgYW5kCisqbml4IChNYWMgT1MgWCkuIEFzIHN1Y2ggd2UgaGF2ZSBhdHRlbXB0ZWQgdG8gbWFrZSB0aGUgYnVpbGQgcHJvY2VzcyBwbGF0Zm9ybQorbmV1dHJhbC4gSW4gYWRkaXRpb24sIEV0Y2ggYnVpbGRzIGFyZSBkb25lIGRhaWx5IG9uIG91ciBpbnRlcm5hbCBCYW1ib28gc2VydmVyCitoZXJlIGF0IENpc2NvIG9uIHRoZSB3aW4zMiBwbGF0Zm9ybS4gVGhpcyBtZWFucyB0aGF0IHdlIHRlbmQgdG8gaGF2ZSBhIGJpYXMKK3Rvd2FyZHMgYSB3b3JraW5nIFdpbjMyIGJ1aWxkLiBUbyBmdXJ0aGVyIGNvbXBsaWNhdGUgbWF0dGVycywgd2UgaGF2ZSBtdWNoCitkZXZlbG9wbWVudC1lbnZpcm9ubWVudCBkaXZlcmdlbmNlIGluIG91ciBjb21taXR0ZXIgYmFzZSwgc29tZSBvZiB1cyBiZWluZyB2ZXJ5CitzaGVsbC1jZW50cmljIChkaXhzb24pIHdoaWxlIG90aGVycyBvZiB1cyBiZWluZyBmaXJtbHkgcm9vdGVkIGluIEVjbGlwc2UgKHNjY29tZXIpLgorU28gdGhlIGNvbXByb21pc2UgaGFzIGJlZW4gdG8gYXR0ZW1wdCB0byBzdHJ1Y3R1cmUgdGhlIGJ1aWxkIHN1Y2ggaXQgY2FuIGJlCitmcmllbmRseSBhbmQgcHJvZHVjdGl2ZSB0byBib3RoIGdyb3VwcyBhbmQga2VlcCB0aGUgc2VjdGFyaWFuIHZpb2xlbmNlIHRvCithIG1pbmltdW0uIDotKQorCisxLiBJbnN0YWxsIEpESy4gTWFrZSBjZXJ0YWluIHRoYXQgeW91IHNldCB5b3VyIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24uCisgICAKK0J1aWxkaW5nIGZyb20gQU5UCistLS0tLS0tLS0tLS0tLS0tLQorCisxLiBJbnN0YWxsIEFwYWNoZSBBTlQgKHZlcnNpb24gMS43IG9yIGxhdGVyKS4gCisKKzIuIFB1dCAvcGF0aC90by9hcGFjaGUtYW50LTEuNy9iaW4gaW4geW91ciBQQVRILgorCiszLiBJZiB5b3UgaGF2ZSBNb25vLCBtYWtlIGNlcnRhaW4gTU9OT19IT01FIGlzIHNldCBjb3JyZWN0bHkuIElmIHlvdSBoYXZlIC5ORVQKKyAgIGZyYW1ld29yaywgbWFrZSBjZXJ0YWluIG1zYnVpbGQuZXhlIGlzIGluIHlvdXIgUEFUSC4KKworNC4gSWYgYnVpbGRpbmcgQyMsIG1ha2UgY2VydGFpbiBOVU5JVF9IT01FIGlzIHNldCBjb3JyZWN0bHkuCisKKzUuIElmIGJ1aWxkaW5nIG9uIFdpbjMyIGFuZCB5b3Ugd2FudCB0byBidWlsZCB0aGUgTlNJUyBpbnN0YWxsZXJzLCBzZXQKKyAgIE5TSVNfSE9NRSB0byAvcGF0aC90by9uc2lzLzIuMjMuCisKKzYuIFtJTVBPUlRBTlRdIFVwZGF0ZSAnYnVpbGQuZGVwZW5kZW5jaWVzJyB3aXRoIHRoZSBjb3JyZWN0IHBhdGhzIHRvIHRoZSBqYXIncworICAgdGhpcyBwcm9qZWN0IGRlcGVuZHMgdXBvbjoKKworICAqIGphdmFjYy5ob21lPS9wYXRoL3RvL2phdmFjYy00LjAgICAgICAKKyAgICAgICAgKCcke2phdmFjYy5ob21lfS9iaW4vbGliL2phdmFjYy5qYXInIHNob3VsZCBleGlzdCkKKyAgICAgICAgCisgICoganVuaXQubGliPS9wYXRoL3RvL2p1bml0LTQuMy4xCisgICAgICAgICgnJHtqdW5pdC5saWJ9L2p1bml0LTQuMy4xLmphcicgc2hvdWxkIGV4aXN0KQorICAgICAgICAKKyAgKiB2ZWxvY2l0eS5saWI9L3BhdGgvdG8vdmVsb2NpdHktMS41ICAgICAgICAgICAgCisgICAgICAgICgnJHt2ZWxvY2l0eS5saWJ9L3ZlbG9jaXR5LWRlcC0xLjUuamFyJyBzaG91bGQgZXhpc3QpCisKKyAgLS1PUFRJT05BTC0tICAgICAgICAKKyAgKiBhbnQtZG90bmV0LmxpYj0vcGF0aC90by9hcGFjaGUtYW50LWRvdG5ldC0xLjAgCisKKyhkaXhzb24pIFRoaXMgaXMgYSBoYWNrIHVudGlsIEkgZ2V0IGF1dG9jb25mIHdvcmtpbmcuIEp1c3Qgbm90IHRoZXJlIHlldCA6LSgKKworCis3LiBBdCB0aGUgc2hlbGwgcHJvbXB0IHR5cGU6CisKKyA+IGFudCByZWxlYXNlCisKK1RoaXMgd2lsbCBidWlsZCBhbGwgY29tcGlsZXJzIGFuZCBhbGwgdGhlIGJpbmRpbmdzIGZvciB3aGljaCB5b3UgaGF2ZSBzZXR1cAorZGVwZW5kZW5jaWVzLiBJdCB3aWxsIGFsc28gYnVpbGQgYW5kIHJ1biBhbGwgdW5pdC9mdW5jdGlvbmFsIHRlc3RzIGFuZCBidWlsZAorYWxsIHRoZSBleGFtcGxlcyBpbiBleGFtcGxlcy8uCisKK09uY2UgY29tcGxldGUsIHRoZSBkaXN0IHRyZWUgY2FuIGJlIGZvdW5kIGluICd0YXJnZXQvSW5zdGFsbGVycy9kaXN0Jy4gQ29weQordGhpcyBkaXJlY3RvcnkgbWFudWFsbHkgdG8gdGhlIGRlc2lyZWQgaW5zdGFsbCBsb2NhdGlvbi4KKworQnVpbGRpbmcgZnJvbSBFY2xpcHNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgeW91IGNoZWNrb3V0IHRoZSBwcm9qZWN0IGluIGVjbGlwc2UsIHlvdSB3aWxsIGxpa2VseSBiZSB0b2xkIHRoYXQgdGhlcmUgYXJlCitidWlsZCBwYXRoIHByb2JsZW1zLiBUaGVyZSBhcmUgdGhyZWUgZGVwZW5kZW50IHByb2plY3RzIHlvdSBuZWVkIHRvIGdldCBnb2luZyB3aXRoCitldGNoIGZvciBlY2xpcHNlLCBhbmQgb25lIHBsdWdpbjoKKworIGphdmFjYyA0LjAKKyBhbnQgMS43LjAKKyBqdW5pdCA0LjMuMQorIHZlbG9jaXR5IDEuNQorCitKYXZhQ0MgaXMgYW4gZWNsaXBzZSBwbHVnaW4sIGdldCBpdCBmcm9tIGhlcmU6CisKKyBodHRwOi8vZWNsaXBzZS1qYXZhY2Muc291cmNlZm9yZ2UubmV0LworCitPbiB0aGF0IHBhZ2UgYXJlIGRpcmVjdGlvbnMgdG8gaW5zdGFsbCB0aGUgcGx1Z2luIGZyb20gd2l0aGluIGVjbGlwc2UuIFRoZSBvdGhlciB0d28KK3lvdSBkb3dubG9hZDoKKworIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvanVuaXQvCisgaHR0cDovL3ZlbG9jaXR5LmFwYWNoZS5vcmcvZW5naW5lL3JlbGVhc2VzL3ZlbG9jaXR5LTEuNS8KKyBodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50L2JpbmFyaWVzLworCitOT1RFOiBqdW5pdC00LjMuMSBpcyBhIGhhcmQgZGVwZW5kZW5jeS4gTGF0ZXIgdmVyc2lvbnMgb2YgYW50LCBKYXZhQ0MgYW5kIFZlbG9jaXR5IG1heQord29yaywgYnV0IGxhdGVyIHZlcnNpb25zIG9mIEpVbml0IHdpbGwgbm90ICh0cnVlIGFzIG9mIGV0Y2gtMS4wLjIpLgorCitPbmNlIGRvd25sb2FkZWQsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIChmb3IgZXhhbXBsZSk6CisKKyBFVENIX0RFUEVOREVOVF9KQVJTPUM6XHdvcmtzcGFjZS1ldGNoXHRvb2xzXHZlbG9jaXR5XDEuNVx2ZWxvY2l0eS1kZXAtMS41LmphcgorCitUaGVzZSBhcmUgdGhlIGV4dHJhIGphciBmaWxlcyByZXF1aXJlZCB0byBhY3R1YWxseSBydW4gdGhlIGNvbXBpbGVyLiBZb3Ugd2lsbCBuZWVkCit0byByZXN0YXJ0IGVjbGlwc2UgaWYgaXQgaXMgcnVubmluZy4gT25jZSBlY2xpcHNlIGlzIHN0YXJ0ZWQsIHlvdSB3aWxsIG5lZWQgdG8gCitjb25maWd1cmUgdGhlIEV0Y2ggcHJvamVjdDoKKworIFJpZ2h0IGNsaWNrIG9uIHRoZSBldGNoIHByb2plY3QsIGFuZCBzZWxlY3QgQnVpbGQgUGF0aCAvIENvbmZpZ3VyZSBCdWlsZCBQYXRoCisgCisgU2VsZWN0IHRoZSBMaWJyYXJpZXMgdGFiIG9uIHRoZSByaWdodC4KKyAKKyBJZiBFVENIX0RFUEVOREVOVF9KQVJTIGlzIGhlcmUsIGRlbGV0ZSBpdC4KKworIFNlbGVjdCBBZGQgTGlicmFyeS4uLiBvbiB0aGUgcmlnaHQuCisKKyBTZWxlY3QgVXNlciBMaWJyYXJ5IGFuZCBjbGljayBOZXh0LgorCisgU2VsZWN0IFVzZXIgTGlicmFyaWVzLi4uCisKKyBTZWxlY3QgTmV3Li4uCisKKyBFbnRlciB0aGUgbmFtZSBFVENIX0RFUEVOREVOVF9KQVJTIGFuZCBjbGljayBPay4KKworIFdpdGggRVRDSF9ERVBFTkRFTlRfSkFSUyBzZWxlY3RlZCwgY2xpY2sgQWRkIEpBUnMuLi4KKworIE5hdmlnYXRlIHRvIGp1bml0LTQuMy4xLmphciBhbmQgc2VsZWN0IGl0LgorCisgV2l0aCBFVENIX0RFUEVOREVOVF9KQVJTIHNlbGVjdGVkLCBjbGljayBBZGQgSkFScy4uLiBhZ2Fpbi4uLgorCisgTmF2aWdhdGUgdG8gdmVsb2NpdHktZGVwLTEuNS5qYXIgYW5kIHNlbGVjdCBpdC4KKworIE5hdmlnYXRlIHRvIGFudC5qYXIgYW5kIHNlbGVjdCBpdC4KKworIENsaWNrIE9rLgorCisgQ2xpY2sgRmluaXNoLgorCisgQ2xpY2sgT2suCisKK0VjbGlwc2Ugc2hvdWxkIHJlYnVpbGQgdGhlIHByb2plY3QuIFRoZXJlIG1heSBzdGlsbCBiZSBlcnJvcnMsIHRoYXQncyBvazoKKworIE9wZW4gV2luZG93IC8gUHJlZmVyZW5jZXMgLyBKYXZhIC8gQ29tcGlsZXIgLyBCdWlsZGluZy4KKworIEV4cGFuZCBCdWlsZCBwYXRoIHByb2JsZW1zLgorCisgU2V0IEluY29tcGxldGUgYnVpbGQgcGF0aCB0byBiZSBhIHdhcm5pbmcuCisgCisgU2V0IENpcmN1bGFyIGRlcGVuZGVuY2llcyB0byBiZSBhbiBlcnJvci4KKworIFNldCBJbmNvbXBhdGlibGUgcmVxdWlyZWQgYmluYXJpZXMgdG8gd2FybmluZy4KKworIENsaWNrIE9rLgorCitNYWtlIHN1cmUgSmF2YUNDIGNvbXBpbGVkIEV0Y2hHcmFtbWFyLmpqLiBUaGVyZSBzaG91bGQgYmUgYSBKYXZhQ0MgY29uc29sZQordmlldyBvcGVuLiBJZiBub3QsIG9wZW4gaXQgKFdpbmRvdyAvIFNob3cgVmlldyAvIE90aGVyLi4uIC8gSmF2YUNDIGNvbnNvbGUgLworSmF2YUNDIGNvbnNvbGUpLgorCitJZiBKYXZhQ0MgY29uc29sZSBpcyBlbXB0eSwgU2VsZWN0IFByb2plY3QgLyBDbGVhbi4uLiBhbmQgY2xlYW4gYWxsIHByb2plY3RzLgorQSBmZXcgSmF2YUNDIG1lc3NhZ2VzIHNob3VsZCBhcHBlYXIuIEl0IGlzIG9rIGlmIEphdmFDQyB3YXJucyBhYm91dCBjcmVhdGluZworYSBkaXJlY3RvcnkuCisKK05vdyB0aGF0IHRoZSBjb21waWxlciBpcyBidWlsdCwgeW91IHdpbGwgc3RpbGwgaGF2ZSBlcnJvcnMgZm9yIGV0Y2ggYnVpbGQKK3Byb2R1Y3RzIHdoaWNoIGFyZSBtaXNzaW5nLiB5b3Ugd2lsbCBuZWVkIHRvIHJlY29tcGlsZSBhbGwgdGhlIGV0Y2ggZmlsZXMuCitZb3UgY2FuIGRvIHRoaXMgYnk6CisKKyBTZWxlY3QgdGhlIGV0Y2ggcHJvamVjdC4KKworIFNlbGVjdCBSdW4gLyBFeHRlcm5hbCBUb29scyAvIENvbXBpbGUgSmF2YSBFdGNoIEZpbGVzLgorCisoWW91IG1heSB3YW50IHRvIGNvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgdG9vbHMgZmlyc3QuIFNlbGVjdCBSdW4gLyBFeHRlcm5hbAorVG9vbHMgLyBPcmdhbml6ZSBGYXZvcml0ZXMuLi4gQ2xpY2sgQWRkLi4uIFNlbGVjdCBBbGwuIE9rLiBPay4pCisKK1lvdSBzaG91bGQgc2VlIGEgbmljZSBvdXRwdXQgaW4gdGhlIENvbnNvbGUgcmVwb3J0aW5nIHN1Y2Nlc3NmdWwgY29tcGlsYXRpb24KK29mIGEgYnVuY2ggb2YgZXRjaCBmaWxlcy4gRWNsaXBzZSBzaG91bGQgdGhlbiByZWJ1aWx0IHRoZSBwcm9qZWN0LgorCitGaW5hbGx5LCB5b3UgY2FuIGNoZWNrIHRoaW5ncyBvdXQgYnkgcnVubmluZyB0aGUgdW5pdCB0ZXN0cy4KKworIFJpZ2h0IGNsaWNrIG9uIHRoZSBldGNoIHByb2plY3QsIHNlbGVjdCBSdW4gYXMuLi4gLyBKdW5pdCB0ZXN0LgorCitZb3UnbGwgZ2V0IHNvbWUgb3V0cHV0IG9uIHRoZSBjb25zb2xlIHdpbmRvdywgaW5jbHVkaW5nIHNjYXJ5IGxvb2tpbmcgc3RhY2sKK3RyYWNlcy4gVGhhdCdzIG9rLiBKVW5pdCBydW5uZXIgc2hvdWxkIHRlbGwgeW91IHRoYXQgMTE5NyB0ZXN0cyBwYXNzZWQsIDIyCitpZ25vcmVkLCB3aXRoIDAgZXJyb3JzIGFuZCAwIGZhaWx1cmVzLiBUaGlzIHRha2VzIDY2IHNlY29uZHMgZm9yIG1lIChzY2NvbWVyKS4KKworWW91J3JlIGRvbmUsIHN0YXJ0IGV4cGxvcmluZy4gQ2hlY2sgb3V0IGV4YW1wbGVzLCBwZXJmIG9yIGNoYXQuCisKZGlmZiAtLWdpdCBhL0NTaGFycC5zbG4gYi9DU2hhcnAuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDhiY2EKLS0tIC9kZXYvbnVsbAorKysgYi9DU2hhcnAuc2xuCkBAIC0wLDAgKzEsMTQwIEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDkuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDA1CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkV0Y2hUZXN0UHJvaiIsICJiaW5kaW5nLWNzaGFycFxydW50aW1lXHNyY1x0ZXN0XGNzaGFycFxFdGNoVGVzdFByb2ouY3Nwcm9qIiwgInszRDQ0QzMzQy0wRTVGLTQ0M0ItQTBCNC1BQkRGMTZCNjRBQzV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJFdGNoUHJvaiIsICJiaW5kaW5nLWNzaGFycFxydW50aW1lXHNyY1xtYWluXGNzaGFycFxFdGNoUHJvai5jc3Byb2oiLCAiezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlBlcmZMaXN0ZW5lclByb2oiLCAiZXhhbXBsZXNccGVyZlxzcmNcbWFpblxjc2hhcnBcUGVyZkxpc3RlbmVyUHJvalxQZXJmTGlzdGVuZXJQcm9qLmNzcHJvaiIsICJ7NEI5Q0U3MzItNjAxQS00QTc0LUExRDUtQUY3ODI1MUZFREQyfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUGVyZkNsaWVudFByb2oiLCAiZXhhbXBsZXNccGVyZlxzcmNcbWFpblxjc2hhcnBcUGVyZkNsaWVudFByb2pcUGVyZkNsaWVudFByb2ouY3Nwcm9qIiwgIntEMkFBMDNEOC0xNTU1LTRBOUItODYxOC1GRjEyQTE1QkJCNkV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJEaXN0TWFwQ2xpZW50UHJvaiIsICJleGFtcGxlc1xkaXN0bWFwXHNyY1xtYWluXGNzaGFycFxEaXN0TWFwQ2xpZW50UHJvalxEaXN0TWFwQ2xpZW50UHJvai5jc3Byb2oiLCAiezc2MTM5NjFCLUZEODItNDBEQi1CRjk5LUVFRjUwQkIyMDg4N30iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fSA9IHswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9CisJRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiRGlzdE1hcExpc3RlbmVyUHJvaiIsICJleGFtcGxlc1xkaXN0bWFwXHNyY1xtYWluXGNzaGFycFxEaXN0TWFwTGlzdGVuZXJQcm9qXERpc3RNYXBMaXN0ZW5lclByb2ouY3Nwcm9qIiwgIns3NUY4QTUxMy00NTAwLTRBQzMtOEU5Ny04Qjc2MDlBOEFFQTl9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn0gPSB7MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNoYXRDbGllbnRQcm9qIiwgImV4YW1wbGVzXGNoYXRcc3JjXG1haW5cY3NoYXJwXENoYXRDbGllbnRQcm9qXENoYXRDbGllbnRQcm9qLmNzcHJvaiIsICJ7MTNCQkMyNjgtMkYzMS00QzY4LUI2MkItM0MyQ0ZEMDIyOEJFfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9ID0gezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDaGF0TGlzdGVuZXJQcm9qIiwgImV4YW1wbGVzXGNoYXRcc3JjXG1haW5cY3NoYXJwXENoYXRMaXN0ZW5lclByb2pcQ2hhdExpc3RlbmVyUHJvai5jc3Byb2oiLCAiezU3NEMyOEY5LTFEMEQtNDdDQi05RjE4LTIyMUU1MTI4RDVBNn0iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fSA9IHswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9CisJRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiRXhhbXBsZUNsaWVudFByb2oiLCAiZXhhbXBsZXNcZXhhbXBsZVxzcmNcbWFpblxjc2hhcnBcRXhhbXBsZUNsaWVudFByb2pcRXhhbXBsZUNsaWVudFByb2ouY3Nwcm9qIiwgInszODk1M0JDMC1BODM0LTQ5MzktQTI1Ri04QzdGMkM3Rjg3NTh9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJFeGFtcGxlTGlzdGVuZXJQcm9qIiwgImV4YW1wbGVzXGV4YW1wbGVcc3JjXG1haW5cY3NoYXJwXEV4YW1wbGVMaXN0ZW5lclByb2pcRXhhbXBsZUxpc3RlbmVyUHJvai5jc3Byb2oiLCAiezdFRUEyRjQ3LTBEOTYtNDE4Ny1COUVGLUNBMEI5RTgzOTg0MX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRlc3RzUHJvaiIsICJ0ZXN0c1xzcmNcdGVzdFxjc2hhcnBcVGVzdHNQcm9qXFRlc3RzUHJvai5jc3Byb2oiLCAiezcwNzAxNzQwLTY1MkEtNEUwNy05Qjg1LTU5RERDQzlENDNENH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkRpc3RNYXBUZXN0UHJvaiIsICJleGFtcGxlc1xkaXN0bWFwXHNyY1x0ZXN0XGNzaGFycFxEaXN0TWFwVGVzdFByb2pcRGlzdE1hcFRlc3RQcm9qLmNzcHJvaiIsICJ7Mzk2OTlGRUUtRDIxRS00MkFDLUFERDctMjI0ODRBOTg1QzI3fSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9ID0gezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJFeGFtcGxlVGVzdFByb2oiLCAiZXhhbXBsZXNcZXhhbXBsZVxzcmNcdGVzdFxjc2hhcnBcRXhhbXBsZVRlc3RQcm9qXEV4YW1wbGVUZXN0UHJvai5jc3Byb2oiLCAiezM2OTkxQUM2LTIxREUtNEY3QS04NjcyLThDRkNDOEFGNzBDN30iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fSA9IHswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9CisJRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiUGVyZlRlc3RQcm9qIiwgImV4YW1wbGVzXHBlcmZcc3JjXHRlc3RcY3NoYXJwXFBlcmZUZXN0UHJvalxQZXJmVGVzdFByb2ouY3Nwcm9qIiwgIns0N0ZEQjE1Qy02REUyLTQxOTEtQTQxQy0xOTkzQjcxNEI0Q0R9IgorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn0gPSB7MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNoYXRUZXN0UHJvaiIsICJleGFtcGxlc1xjaGF0XHNyY1x0ZXN0XGNzaGFycFxDaGF0VGVzdFByb2pcQ2hhdFRlc3RQcm9qLmNzcHJvaiIsICJ7MDFBN0YwQ0MtNzhBQi00Q0ZFLTg4REItMzJBQUM2RDZDMDBCfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9ID0gezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJJT1RMaXN0ZW5lclByb2oiLCAiaW50ZXJvcHRlc3RlclxleGFtcGxlXHNyY1xtYWluXGNzaGFycFxJT1RMaXN0ZW5lclByb2pcSU9UTGlzdGVuZXJQcm9qLmNzcHJvaiIsICJ7NUVFRDU1MkEtMDlDMS00MkQwLTlFMEEtNzgyMkIwRUMzNjAzfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiSU9UQ2xpZW50UHJvaiIsICJpbnRlcm9wdGVzdGVyXGV4YW1wbGVcc3JjXG1haW5cY3NoYXJwXElPVENsaWVudFByb2pcSU9UQ2xpZW50UHJvai5jc3Byb2oiLCAiezE0RDdBOTIzLTBDQjQtNDQyQS05NDk5LTdGMEMyNUMyMzlFRX0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezNENDRDMzNDLTBFNUYtNDQzQi1BMEI0LUFCREYxNkI2NEFDNX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXszRDQ0QzMzQy0wRTVGLTQ0M0ItQTBCNC1BQkRGMTZCNjRBQzV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezNENDRDMzNDLTBFNUYtNDQzQi1BMEI0LUFCREYxNkI2NEFDNX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7M0Q0NEMzM0MtMEU1Ri00NDNCLUEwQjQtQUJERjE2QjY0QUM1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0QjlDRTczMi02MDFBLTRBNzQtQTFENS1BRjc4MjUxRkVERDJ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NEI5Q0U3MzItNjAxQS00QTc0LUExRDUtQUY3ODI1MUZFREQyfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0QjlDRTczMi02MDFBLTRBNzQtQTFENS1BRjc4MjUxRkVERDJ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezRCOUNFNzMyLTYwMUEtNEE3NC1BMUQ1LUFGNzgyNTFGRUREMn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0QyQUEwM0Q4LTE1NTUtNEE5Qi04NjE4LUZGMTJBMTVCQkI2RX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEMkFBMDNEOC0xNTU1LTRBOUItODYxOC1GRjEyQTE1QkJCNkV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0QyQUEwM0Q4LTE1NTUtNEE5Qi04NjE4LUZGMTJBMTVCQkI2RX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RDJBQTAzRDgtMTU1NS00QTlCLTg2MTgtRkYxMkExNUJCQjZFfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzYxMzk2MUItRkQ4Mi00MERCLUJGOTktRUVGNTBCQjIwODg3fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezc2MTM5NjFCLUZEODItNDBEQi1CRjk5LUVFRjUwQkIyMDg4N30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzYxMzk2MUItRkQ4Mi00MERCLUJGOTktRUVGNTBCQjIwODg3fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NjEzOTYxQi1GRDgyLTQwREItQkY5OS1FRUY1MEJCMjA4ODd9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUY4QTUxMy00NTAwLTRBQzMtOEU5Ny04Qjc2MDlBOEFFQTl9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVGOEE1MTMtNDUwMC00QUMzLThFOTctOEI3NjA5QThBRUE5fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUY4QTUxMy00NTAwLTRBQzMtOEU5Ny04Qjc2MDlBOEFFQTl9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1RjhBNTEzLTQ1MDAtNEFDMy04RTk3LThCNzYwOUE4QUVBOX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezEzQkJDMjY4LTJGMzEtNEM2OC1CNjJCLTNDMkNGRDAyMjhCRX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsxM0JCQzI2OC0yRjMxLTRDNjgtQjYyQi0zQzJDRkQwMjI4QkV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezEzQkJDMjY4LTJGMzEtNEM2OC1CNjJCLTNDMkNGRDAyMjhCRX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MTNCQkMyNjgtMkYzMS00QzY4LUI2MkItM0MyQ0ZEMDIyOEJFfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NTc0QzI4RjktMUQwRC00N0NCLTlGMTgtMjIxRTUxMjhENUE2fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezU3NEMyOEY5LTFEMEQtNDdDQi05RjE4LTIyMUU1MTI4RDVBNn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NTc0QzI4RjktMUQwRC00N0NCLTlGMTgtMjIxRTUxMjhENUE2fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs1NzRDMjhGOS0xRDBELTQ3Q0ItOUYxOC0yMjFFNTEyOEQ1QTZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXszODk1M0JDMC1BODM0LTQ5MzktQTI1Ri04QzdGMkM3Rjg3NTh9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7Mzg5NTNCQzAtQTgzNC00OTM5LUEyNUYtOEM3RjJDN0Y4NzU4fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXszODk1M0JDMC1BODM0LTQ5MzktQTI1Ri04QzdGMkM3Rjg3NTh9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezM4OTUzQkMwLUE4MzQtNDkzOS1BMjVGLThDN0YyQzdGODc1OH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezdFRUEyRjQ3LTBEOTYtNDE4Ny1COUVGLUNBMEI5RTgzOTg0MX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3RUVBMkY0Ny0wRDk2LTQxODctQjlFRi1DQTBCOUU4Mzk4NDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezdFRUEyRjQ3LTBEOTYtNDE4Ny1COUVGLUNBMEI5RTgzOTg0MX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7N0VFQTJGNDctMEQ5Ni00MTg3LUI5RUYtQ0EwQjlFODM5ODQxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzA3MDE3NDAtNjUyQS00RTA3LTlCODUtNTlERENDOUQ0M0Q0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezcwNzAxNzQwLTY1MkEtNEUwNy05Qjg1LTU5RERDQzlENDNENH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzA3MDE3NDAtNjUyQS00RTA3LTlCODUtNTlERENDOUQ0M0Q0fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3MDcwMTc0MC02NTJBLTRFMDctOUI4NS01OUREQ0M5RDQzRDR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXszOTY5OUZFRS1EMjFFLTQyQUMtQURENy0yMjQ4NEE5ODVDMjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7Mzk2OTlGRUUtRDIxRS00MkFDLUFERDctMjI0ODRBOTg1QzI3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXszOTY5OUZFRS1EMjFFLTQyQUMtQURENy0yMjQ4NEE5ODVDMjd9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezM5Njk5RkVFLUQyMUUtNDJBQy1BREQ3LTIyNDg0QTk4NUMyN30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezM2OTkxQUM2LTIxREUtNEY3QS04NjcyLThDRkNDOEFGNzBDN30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXszNjk5MUFDNi0yMURFLTRGN0EtODY3Mi04Q0ZDQzhBRjcwQzd9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezM2OTkxQUM2LTIxREUtNEY3QS04NjcyLThDRkNDOEFGNzBDN30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MzY5OTFBQzYtMjFERS00RjdBLTg2NzItOENGQ0M4QUY3MEM3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDdGREIxNUMtNkRFMi00MTkxLUE0MUMtMTk5M0I3MTRCNENEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ3RkRCMTVDLTZERTItNDE5MS1BNDFDLTE5OTNCNzE0QjRDRH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDdGREIxNUMtNkRFMi00MTkxLUE0MUMtMTk5M0I3MTRCNENEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0N0ZEQjE1Qy02REUyLTQxOTEtQTQxQy0xOTkzQjcxNEI0Q0R9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswMUE3RjBDQy03OEFCLTRDRkUtODhEQi0zMkFBQzZENkMwMEJ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MDFBN0YwQ0MtNzhBQi00Q0ZFLTg4REItMzJBQUM2RDZDMDBCfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswMUE3RjBDQy03OEFCLTRDRkUtODhEQi0zMkFBQzZENkMwMEJ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezAxQTdGMENDLTc4QUItNENGRS04OERCLTMyQUFDNkQ2QzAwQn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezVFRUQ1NTJBLTA5QzEtNDJEMC05RTBBLTc4MjJCMEVDMzYwM30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs1RUVENTUyQS0wOUMxLTQyRDAtOUUwQS03ODIyQjBFQzM2MDN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezVFRUQ1NTJBLTA5QzEtNDJEMC05RTBBLTc4MjJCMEVDMzYwM30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NUVFRDU1MkEtMDlDMS00MkQwLTlFMEEtNzgyMkIwRUMzNjAzfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MTREN0E5MjMtMENCNC00NDJBLTk0OTktN0YwQzI1QzIzOUVFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezE0RDdBOTIzLTBDQjQtNDQyQS05NDk5LTdGMEMyNUMyMzlFRX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MTREN0E5MjMtMENCNC00NDJBLTk0OTktN0YwQzI1QzIzOUVFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsxNEQ3QTkyMy0wQ0I0LTQ0MkEtOTQ5OS03RjBDMjVDMjM5RUV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nLnR4dCBiL0NoYW5nZUxvZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5OTUyZgotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZy50eHQKQEAgLTAsMCArMSwzNjEgQEAKKy0tLS0tLS0tLS0tLS0KK1JlbGVhc2UgMS4wLjIKKy0tLS0tLS0tLS0tLS0KKworcjczODE2MCB8IHNjY29tZXIgfCAyMDA5LTAxLTI3IDExOjMwOjQzIENTVAorCitmaXggZm9yIEVUQ0gtMzE6IE15U2Vzc2lvbkxpc3RlbmVyIGluIFRjcFRyYW5zcG9ydEZhY3RvcnkgZG9lcyBub3Qgb3ZlcnJpZGUKK3RvU3RyaW5nKCkgbWV0aG9kIHRvIHNob3cgc29tZXRoaW5nIHVzZWZ1bCBhYm91dCB0aGUgdHJhbnNwb3J0IHN0YWNrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzM3OTg0IHwgZGl4c29uIHwgMjAwOS0wMS0yNiAyMToxNDozNiBDU1QKKwordXBkYXRlIFNWTiBhbmQgaG9tZXBhZ2UgdG8gYXBhY2hlLm9yZyBVUkxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzM3NzcwIHwgc2Njb21lciB8IDIwMDktMDEtMjYgMTE6NTk6MjQgQ1NUCisKK2ZpeCBmb3IgRVRDSC0yOTogSW5zdGFsbGluZyBhbGwgTWF2ZW4gYXJ0aWZhY3RzIGFsb25nIHdpdGggdGhlaXIgc291cmNlcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3Mzc3NjcgfCBzY2NvbWVyIHwgMjAwOS0wMS0yNiAxMTo1NToxMiBDU1QKKworZml4IGZvciBFVENILTI3OiBtaXhpbnMgY2F1c2UgdHJvdWJsZSB3aGVuIHR3byBvciBtb3JlIG1peGVkIGluIGZpbGVzIGRlZmluZSBhCit0eXBlIHdpdGggdGhlIHNhbWUgbmFtZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3Mzc3NjQgfCBzY2NvbWVyIHwgMjAwOS0wMS0yNiAxMTo0MzoxOSBDU1QKKworZml4IGZvciBFVENILTI4OiBFeGFtcGxlcyBkbyBub3QgYnVpbGQgZHVlIHRvIG91dGRhdGVkIGFudCBmaWxlcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MzY3MzcgfCBzY2NvbWVyIHwgMjAwOS0wMS0yMiAxMjozMjoxMyBDU1QKKworZml4IGZvciBFVENILTI0OiBUaGUgbWVzc2FnZSBkaXJlY3Rpb24gaXMgYWx3YXlzICJzZXJ2ZXIiIGZvciB0aGUgcmVzdWx0X21ldGhvZAorbWVzc2FnZXMgaW4gdGhlIGphdmEtYmluZGluZyB2YWx1ZWZhY3RvcnkgKGFsc28gY3NoYXJwKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjczNjcyNSB8IHNjY29tZXIgfCAyMDA5LTAxLTIyIDExOjQzOjE5IENTVAorCitjb21tZW50IG91dCBjb25mbGljdGluZyBhc3NpZ25tZW50IG9mIEpBVkFfSE9NRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjczNjcyNCB8IHNjY29tZXIgfCAyMDA5LTAxLTIyIDExOjQyOjQxIENTVAorCitidW1wIHRoZSB2ZXJzaW9uIG51bWJlciB0byAxLjAuMi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MzYxNjkgfCBzY2NvbWVyIHwgMjAwOS0wMS0yMCAxNzoyNTozNCBDU1QKKworZml4IGZvciBFVENILTI1OiBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlIGVuZHMgY2FsbCB3aXRoIG1iLkNsb3NlRGVsaXZlcnkoKSBhbmQgaXQKK3Nob3VsZCBlbmQgaXQgd2l0aCBtYi5DbG9zZVJlYWQoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjczMzg0MyB8IHJlYmFycmF6IHwgMjAwOS0wMS0xMiAxMToxMToxMiBDU1QKKworZml4IGZvciBFVENILTEzOiBhZGRlZCBleGFtcGxlcyB0byBkaXN0cmlidXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjQzNDAgfCBzY2NvbWVyIHwgMjAwOC0xMi0wOCAwNzozMjowNCBDU1QKKworZmFjdG9yIHBlcmYgdGVzdHMgaW50byBpbmRpdmlkdWFsIHN0YXRpYyBmdW5jdGlvbnMgY2FsbGVkIGZyb20gbWFpbi4KKworcHVsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHRvcC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjMzNDAgfCBzY2NvbWVyIHwgMjAwOC0xMi0wNCAwODo0OToyNCBDU1QKKworY3NoYXJwIGZpeCBmb3IgRVRDSC0xOTogQnJlYWsgb3V0IGNvbW1vbiB0Y3AgdHJhbnNwb3J0IG9wdGlvbnMgc28gdGhhdCB0aGV5IG1heQorYmUgc2hhcmVkIGFtb25nIHZhcmlvdXMgdHJhbnNwb3J0cy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjMxMTIgfCBzY2NvbWVyIHwgMjAwOC0xMi0wMyAxNjo0OToyMiBDU1QKKworZG8gdGhlIHJpZ2h0IG1hdGggcmVsYXRlZCB0byByZWxhdGl2ZSB0aW1pbmcgdGVzdHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzIzMDM0IHwgc2Njb21lciB8IDIwMDgtMTItMDMgMTM6NDI6MTkgQ1NUCisKK2NzaGFycCBmaXggZm9yIEVUQ0gtMTE6IEFsYXJtTWFuYWdlciBkZWFkbG9ja3MgZHVyaW5nIHNodXRkb3duKCkuIGJyZWFrIGxvY2sgb24KK0Fic3RyYWN0U3RhcnRhYmxlIHN0YXJ0KCkgYW5kIHN0b3AoKSBtZXRob2RzLiBBZGQgYmFjayBuZWNlc3Nhcnkgc3luY2hyb25pemF0aW9uCitmb3IgTW9uaXRvci5QdWxzZUFsbCgpIGluIFN0b3AwKCkuIFBvcnQgamF2YSB2ZXJzaW9uIG9mIHVuaXQgdGVzdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjMwMzIgfCBzY2NvbWVyIHwgMjAwOC0xMi0wMyAxMzozOTo1NiBDU1QKKworZHJvcCBibGFuayBzdHJpbmcgZm9yIHRocm93biBleGNlcHRpb24gaW4gdW5pdCB0ZXN0IGZvciBBbGFybU1hbmFnZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzIyNjQ2IHwgc2Njb21lciB8IDIwMDgtMTItMDIgMTY6Mzg6MjEgQ1NUCisKK2NoYW5nZSB0aGUgZXhjZXB0aW9uIHRocm93biBieSBBYnN0cmFjdFN0YXJ0YWJsZSBmb3IgYWxyZWFkeSBzdGFydGVkIGFuZCBpcyBub3QKK3N0YXJ0ZWQgdG8gRXhjZXB0aW9uIGZyb20gVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24uCisKK2NoYW5nZSBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIHRocm93biBieSBBbGFybU1hbmFnZXIgd2hlbiBsaXN0ZW5lciBpcyBudWxsIHRvCitBcmd1bWVudE51bGxFeGNlcHRpb24uCisKK3NoZWxsIG9mIHVuaXQgdGVzdCBmb3IgQWxhcm1NYW5hZ2VyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjcyMjYyOSB8IHNjY29tZXIgfCAyMDA4LTEyLTAyIDE2OjA0OjUyIENTVAorCitleHBhbmRlZCB1bml0IHRlc3QgZm9yIEFsYXJtTWFuYWdlci4KKworbW9zdGx5IGNvc21ldGljIGVkaXRzIGZvciBBbGFybU1hbmFnZXIsIGV4Y2VwdCB0aWdodGVuZWQgdXAgY29kZSB3aGljaCBub3RpZmllcword29ya2VyIHRocmVhZCB3aGVuIGFuIGFsYXJtIGlzIHJlbW92ZWQgKGlmIG5vIGFsYXJtIGlzIHJlbW92ZWQsIHRoZW4gbm90aWZ5IGlzCitub3QgbmVlZGVkKS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjIyNjIgfCBzY2NvbWVyIHwgMjAwOC0xMi0wMSAxNjoxNTowOSBDU1QKKworamF2YSBmaXggZm9yIEVUQ0gtMTE6IEFsYXJtTWFuYWdlciBkZWFkbG9ja3MgZHVyaW5nIHNodXRkb3duKCkuCisKK0FsYXJtTWFuYWdlci5zaHV0ZG93bigpIGp1c3QgY2FsbHMgQWJzdHJhY3RTdGFydGFibGUuc3RvcCgpIG9uIHRoZSBzdGF0aWMKK2luc3RhbmNlLgordGhlIGJ1ZyB3YXMgYWN0dWFsbHkgaW4gQWJzdHJhY3RTdGFydGFibGUuc3RvcCgpLgorY3JlYXRlZCB1bml0IHRlc3QgZm9yIEFsYXJtTWFuYWdlciB3aGljaCBjb3ZlcnMgdGhpcyBjYXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjcyMjI1MCB8IHNjY29tZXIgfCAyMDA4LTEyLTAxIDE1OjUwOjU2IENTVAorCitjc2hhcnAgZml4IGZvciBFVENILTE3OiBTZXNzaW9uTGlzdGVuZXIgbmVlZHMgdG8gYmUgbW9yZSBpbmRlcGVuZGVudC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjIyNDggfCBzY2NvbWVyIHwgMjAwOC0xMi0wMSAxNTo0ODo1MyBDU1QKKworaW1wcm92ZWQgdGhlIGNvbW1lbnQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzIyMjQyIHwgc2Njb21lciB8IDIwMDgtMTItMDEgMTU6MzE6NDEgQ1NUCisKK2ZpeCBFVENILTY6IGlmIGZyZWUgcG9vbCBleGNlZWRzIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdGhlIGV4Y2VwdGlvbiB0aHJvd24KK3dpbGwga2lsbCB0aGUgY29ubmVjdGlvbi4KKworYWxzbyByZWFycmFuZ2UgY29kZSBpbiBTdHViQmFzZSBzZXNzaW9uTWVzc2FnZSB0byBlbmFibGUgb3B0aW1pemF0aW9uIG9mIE5PTkUKK2Nhc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzIyMjQwIHwgc2Njb21lciB8IDIwMDgtMTItMDEgMTU6Mjk6MjEgQ1NUCisKK2ZpeCBpc3N1ZSB3aXRoIGNsb2NrIHRpY2sgcXVhbnRhIGluIGZyZWUgcG9vbCB0ZXN0cy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjIyMDggfCBzY2NvbWVyIHwgMjAwOC0xMi0wMSAxNDowMDozNyBDU1QKKworaW1wbGVtZW50ZWQgdW5pdCB0ZXN0cyBmb3IgRnJlZVBvb2wgaW4gYm90aCBjc2hhcnAgYW5kIGphdmEgYmluZGluZ3MuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzIyMjA1IHwgc2Njb21lciB8IDIwMDgtMTItMDEgMTM6NTg6NDQgQ1NUCisKK2ZpeCBmb3IgRVRDSC0yMzogRnJlZVBvb2wgaGFzIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgd2l0aCBxdWljayBiYWNrIHRvIGJhY2sKK2NhbGxzIHRvIFJ1bi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjIxMTYgfCBzY2NvbWVyIHwgMjAwOC0xMi0wMSAxMDozMzowNCBDU1QKKworY3NoYXJwIGZpeCBmb3IgRVRDSC0xODogS2VlcEFsaXZlIHRocm93cyBleGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIHNodXRkb3duCitjb25uZWN0aW9uLgorCitmaXhlZCBib3RoIGNzaGFycCBhbmQgamF2YSB2ZXJzaW9ucyB0byB1c2UgVG9kbyBkdXJpbmcgd2FrZXVwIHRvIHNlbmQgcmVxdWVzdAorc28gYXMgdG8gbm90IGJsb2NrIEFsYXJtTWFuYWdlciBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY29ubmVjdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjIwOTggfCBzY2NvbWVyIHwgMjAwOC0xMi0wMSAwOTozNToxNCBDU1QKKworZml4IHRoZSBmaXggZm9yIEVUQ0gtODogY2FuY2VsaW5nIG1haWxib3ggbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbiB0aHJvd3MKK2V4Y2VwdGlvbiBpZiBub3QgcmVnaXN0ZXJlZC4KKwordW5pdCB0ZXN0cyBmb3IgZml4IGZvciBFVENILTguCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjIwODUgfCBzY2NvbWVyIHwgMjAwOC0xMi0wMSAwODo0Mjo1OCBDU1QKKworamF2YSB1bml0IHRlc3QgZm9yIGZpeCBmb3IgRVRDSC04LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjcyMDU3MiB8IHNjY29tZXIgfCAyMDA4LTExLTI1IDEzOjQzOjQ0IENTVAorCitmaXggZm9yIEVUQ0gtODogY2FuY2VsaW5nIG1haWxib3ggbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbiB0aHJvd3MgZXhjZXB0aW9uIGlmCitub3QgcmVnaXN0ZXJlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MjAxMTUgfCBzY2NvbWVyIHwgMjAwOC0xMS0yMyAyMjo1Njo0NSBDU1QKKworY2hhbmdlcyBmb3Igc2VsZWN0b3IgY29kZSB0byBiZSBjb21wYXRpYmxlIHdpdGggamRrIDEuNS4wXzE2LgorCityZWd1bGFyaXplIHRoZSBzdGFydC9zdG9wIGhhbmRsaW5nIGJldHdlZW4gVGNwMkxpc3RlbmVyIGFuZCBUY3AyQ29ubmVjdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MTk2NDQgfCBzY2NvbWVyIHwgMjAwOC0xMS0yMSAxMToxNzo0OCBDU1QKKworZml4ZWQgdGhlIHRlc3QgZm9yIHdoZXRoZXIgYSBUY3AyQ29ubmVjdGlvbiBpcyBzdGFydGVkLgorCitmaW5hbGl6ZWQgc29tZSBpbnN0YW5jZSB2YXJpYWJsZXMsIGFuZCBtYWRlIGhhbmRsZXIgcHJpdmF0ZS4KKworc3luY2hyb25pemVkIHNldEhhbmRsZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzE5NDE0IHwgc2Njb21lciB8IDIwMDgtMTEtMjAgMTY6NTA6NTUgQ1NUCisKK2NoZWNrcG9pbnQgb24gc2VsZWN0b3JzIGFuZCB0cmFuc3BvcnQgd2hpY2ggdXNlcyB0aGVtLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjcxOTQxMyB8IHNjY29tZXIgfCAyMDA4LTExLTIwIDE2OjQzOjQzIENTVAorCitjb3JyZWN0IHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBvZiBUY3BMaXN0ZW5lci4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MTkyODYgfCBzY2NvbWVyIHwgMjAwOC0xMS0yMCAxMTowMjo0MiBDU1QKKworZml4IGZvciBldGNoLTE3OiBTZXNzaW9uTGlzdGVuZXIgbmVlZHMgdG8gYmUgbW9yZSBpbmRlcGVuZGVudC4KK2ZpeCBmb3IgZXRjaC0xOTogQnJlYWsgb3V0IGNvbW1vbiB0Y3AgdHJhbnNwb3J0IG9wdGlvbnMgc28gdGhhdCB0aGV5IG1heSBiZQorc2hhcmVkIGFtb25nIHZhcmlvdXMgdHJhbnNwb3J0cy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MTkyNzkgfCBzY2NvbWVyIHwgMjAwOC0xMS0yMCAxMDo0NzoxMiBDU1QKKworZml4IGZvciBldGNoLTE4OiBLZWVwQWxpdmUgdGhyb3dzIGV4Y2VwdGlvbiB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY29ubmVjdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MTM0MTcgfCBnc2FuZGhpciB8IDIwMDgtMTEtMTIgMTA6MTM6MzggQ1NUCisKK1Rlc3QgdG8gc2VlIGlmIGNvbW1pdCBnb2VzIHRocm91Z2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3MTMyNTcgfCBuaWNsYXMgfCAyMDA4LTExLTExIDIxOjU1OjIwIENTVAorCitDaGVja2luZyBteSBvd24gYWNjZXNzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjcxMjgxNCB8IHNjY29tZXIgfCAyMDA4LTA5LTMwIDEwOjEzOjEyIENEVAorCitmaXggYnVnIHdoZXJlYnkgYSBudWxsIGVudW0gdmFsdWUgd291bGQgbm90IGRlc2VyaWFsaXplIGNvcnJlY3RseS4gdGhpcyBhbHNvCitjYXVzZWQgcHJvYmxlbXMgd2hlbiBhZGRpdGlvbmFsIGVsZW1lbnRzIHdlcmUgYWRkZWQgdG8gYSBzZXJ2aWNlIGVudW0gYW5kIHRoZW4KK2EgbWl4IG9mIG9sZCBhbmQgbmV3IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2VydmljZSB1c2VkIHRvZ2V0aGVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjcxMjgxMyB8IGRpeHNvbjMgfCAyMDA4LTA5LTEwIDEwOjAwOjQxIENEVAorCitza2lwIGNzaGFycCBidWlsZCBvbiBub24td2luZG93cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tCitSZWxlYXNlIDEuMC4xCistLS0tLS0tLS0tLS0tCisKK3I4MCB8IHNjY29tZXIgfCAyMDA4LTA5LTA4IDE1OjMzOjMzIENEVAorCithZGRlZCBhbnRsaWIgcmVzb3VyY2UgZm9yIGV0Y2ggYW50IHBsdWdpbiwgY2hhbmdlZCBjaGF0IGV4YW1wbGUgdG8gdXNlIGl0LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjc5IHwgc2Njb21lciB8IDIwMDgtMDktMDggMTM6NDA6MTIgQ0RUCisKK2FkZCBjc2hhcnAgYnVpbGQgdG8gZGlzdCBjaGF0IGV4YW1wbGUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzggfCBzY2NvbWVyIHwgMjAwOC0wOS0wOCAxMzowMDozNiBDRFQKKworY3VzdG9tIFJFQURNRS50eHQgZm9yIGNoYXQgZGlzdCBhbmQgbWFrZSB0aGUgZGlyZWN0aW9ucyBhbGwgdmVyeSBzaW1pbGFyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjc3IHwgc2Njb21lciB8IDIwMDgtMDktMDggMTI6MzQ6MDIgQ0RUCisKK2FkZGVkIGNoYXQgc291cmNlIHRvIHRoZSBkaXN0cmlidXRpb24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNzYgfCBkaXhzb24zIHwgMjAwOC0wOS0wOCAxMDozMDozMiBDRFQKKworRmlsdGVyICdldGNoLW1hdmVuLWluc3RhbGwuYmF0JyB0byBpbmNsdWRlIHRoZSBjb3JyZWN0IHZlcnNpb24gbnVtYmVyIGZvciBldGNoCitVcGRhdGUgY3NoYXJwLXVuaXQtdGVzdCB0YXJnZXRzIHRvIG9ubHkgcnVuIHdoZW4gJ0JVSUxELmNzaGFycCcgaXMgc2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I3NSB8IHNjY29tZXIgfCAyMDA4LTA5LTA3IDEwOjE5OjIzIENEVAorCit1cGRhdGVkIENoYW5nZUxvZy50eHQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbGVhc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3I3NCB8IHNjY29tZXIgfCAyMDA4LTA5LTA3IDA5OjU2OjE4IENEVAorcjczIHwgc2Njb21lciB8IDIwMDgtMDktMDUgMTY6MDM6NDkgQ0RUCityNzIgfCBzY2NvbWVyIHwgMjAwOC0wOS0wNSAxNTozMjozNiBDRFQKK3I3MSB8IHNjY29tZXIgfCAyMDA4LTA5LTA1IDE1OjMxOjQ2IENEVAorcjcwIHwgZGl4c29uMyB8IDIwMDgtMDktMDUgMDg6MzE6NTMgQ0RUCityNjkgfCBzY2NvbWVyIHwgMjAwOC0wOS0wNCAxODowMzowNCBDRFQKK3I2OCB8IHNjY29tZXIgfCAyMDA4LTA5LTA0IDE4OjAyOjI0IENEVAorcjY3IHwgc2Njb21lciB8IDIwMDgtMDktMDQgMDk6MTY6MzggQ0RUCityNjYgfCBzY2NvbWVyIHwgMjAwOC0wOS0wNCAwOToxNDo1MyBDRFQKK3I2NSB8IHNjY29tZXIgfCAyMDA4LTA5LTAyIDE2OjI1OjAzIENEVAorcjY0IHwgZGl4c29uMyB8IDIwMDgtMDktMDIgMTU6NDQ6MzUgQ0RUCityNjMgfCBzY2NvbWVyIHwgMjAwOC0wOS0wMiAxNDozOToyMyBDRFQKK3I2MiB8IHNjY29tZXIgfCAyMDA4LTA5LTAyIDE0OjA3OjA5IENEVAorcjYxIHwgc2Njb21lciB8IDIwMDgtMDktMDIgMTM6NDI6NDcgQ0RUCityNjAgfCBkaXhzb24zIHwgMjAwOC0wOS0wMiAxMToxNjoxNyBDRFQKK3I1OSB8IHNjY29tZXIgfCAyMDA4LTA5LTAyIDEwOjQxOjU0IENEVAorCisodmFyaW91cyBpbXByb3ZlbWVudHMgdG8gYnVpbGQgc2NyaXB0cy4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNTggfCBzY2NvbWVyIHwgMjAwOC0wOS0wMiAxMDoyNzo0MCBDRFQKKworbWFrZSBUZXN0RXRjaE1haW4udGVzdDcgZHVtcCBtc2dzIHVwb24gZmFpbHVyZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I1NyB8IHNjY29tZXIgfCAyMDA4LTA5LTAyIDA3OjQ5OjIxIENEVAorcjU2IHwgc2Njb21lciB8IDIwMDgtMDktMDIgMDc6MzU6MjAgQ0RUCityNTUgfCBkaXhzb24zIHwgMjAwOC0wOC0yOSAyMTo1MjowMyBDRFQKK3I1NCB8IGRpeHNvbjMgfCAyMDA4LTA4LTI5IDE1OjQ4OjAxIENEVAorcjUzIHwgc2Njb21lciB8IDIwMDgtMDgtMjkgMTA6Mzc6MDUgQ0RUCityNTIgfCBzY2NvbWVyIHwgMjAwOC0wOC0yOCAxNjowNTo0OSBDRFQKK3I1MSB8IHNjY29tZXIgfCAyMDA4LTA4LTI4IDE1OjQwOjI2IENEVAorcjUwIHwgc2Njb21lciB8IDIwMDgtMDgtMjggMTQ6MjM6NTAgQ0RUCityNDkgfCBzY2NvbWVyIHwgMjAwOC0wOC0yOCAxMTowNDozMiBDRFQKKworKHZhcmlvdXMgaW1wcm92ZW1lbnRzIHRvIGJ1aWxkIHNjcmlwdHMuKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjQ4IHwgc2Njb21lciB8IDIwMDgtMDgtMjggMTA6MjA6MTggQ0RUCisKK21lcmdpbmcgY2hhbmdlcyB0byB2YXJpb3VzIGJ1aWxkLnhtbCBmcm9tIHJlbGVhc2UgMS4wLjAgcmV2IDUtNjogbW9ubyBzdXBwb3J0CitpcyBub3QgZnVsbHkgYmFrZWQsIHVzZSAtRFVTRS5tb25vIHRvIHRlc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I0NyB8IHNjY29tZXIgfCAyMDA4LTA4LTI4IDA5OjAwOjEzIENEVAorCitmaXhlZCBwcm9ibGVtIHdpdGggamF2YSBnZW5lcmF0ZWQgcmVtb3RlIHJlamVjdGluZyBleGNlcHRpb25zIHdoaWNoIGFyZQorc3ViY2xhc3NlcyBvZiBhbGxvd2VkIGV4Y2VwdGlvbnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNDYgfCBzY2NvbWVyIHwgMjAwOC0wOC0yNyAxOTozMTo0NCBDRFQKKworZml4IHNldmVyYWwgYnVncyBhbmQgYWRkIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSB0byB1cmwgc28gdGhhdCBqYXZhIGFuZCBjc2hhcnAKK3ZlcnNpb25zIHdvcmsgdGhlIHNhbWUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNDUgfCBzY2NvbWVyIHwgMjAwOC0wOC0yNyAxMjo0NDo1MCBDRFQKKworaWYgbGFzdCBjaGFuY2UgZXhjZXB0aW9uIGhhbmRsZXIgaW4gRXRjaE1haW4gY2F0Y2hlcyBhbiBleGNlcHRpb24sIGl0IHNob3VsZAorcHJpbnQgaXQuCisKK2NvcnJlY3Qgc3BlbGxpbmcgb2YgY3NoYXJwIFZhbGlkYXRvci5MZXZlbCBlbnVtIGVsZW1lbnQgTUlTU0lOR19PSy4KKworaW1wbGVtZW50IG5hbWUgZm9yIHR5cGVzIGFuZCBmaWVsZHMgaW4gY3NoYXJwIEJpbmFyeVRhZ2dlZERhdGFPdXRwdXQuCisKK2FkZCBuYW1lZCB0eXBlcyBhbmQgZmllbGRzIHRlc3RpbmcgZm9yIGNzaGFycCBiaW5hcnkgdGFnZ2VkIGRhdGEuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityNDQgfCBzY2NvbWVyIHwgMjAwOC0wOC0yNiAxMzoyOToyNCBDRFQKKworZml4IGNzaGFycCBCaW5hcnlUYWdnZWREYXRhSW5wdXQgdG8gc3VwcG9ydCBuYW1lcyBmb3IgdHlwZXMgYW5kIGZpZWxkcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I0MyB8IHNjY29tZXIgfCAyMDA4LTA4LTI2IDEwOjI0OjQ5IENEVAorCittZXJnZSBjb21waWxlciBkcml2ZXIgY2hhbmdlcyAoYW5kIGEgZmV3IG1pc2MgdXBkYXRlcyB0byB1bml0IHRlc3RzKSBmcm9tCiticmFuY2ggc2Njb21lci1jb21waWxlci0xIChyZXZzIDIwLTQyKSB0byB0cnVuay4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3IyOCB8IHNjY29tZXIgfCAyMDA4LTA4LTIyIDExOjM5OjI5IENEVAorCitzdXBwb3J0IGZvciBqYXZhIEJpbmFyeVRhZ2dlZERhdGFJbnB1dCBhbmQgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCB1c2luZyBuYW1lcworaW5zdGVhZCBvZiBoYXNoZXMgb2YgbmFtZXMgZm9yIHR5cGVzIGFuZCBmaWVsZHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityMjcgfCBzY2NvbWVyIHwgMjAwOC0wOC0yMiAxMTozODoyNCBDRFQKKworY2hhbmdlIGphdmEgdGVzdFVybCB0byBiZXR0ZXIgbmFtZSAoVGVzdFVybDEpLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjI2IHwgc2Njb21lciB8IDIwMDgtMDgtMjIgMTE6Mzc6NDEgQ0RUCisKK2NoYW5nZWQgamF2YSBjb2RlcyBmcm9tIHVzaW5nIEludGVnZXIgY29uc3RydWN0b3IgdG8gSW50ZWdlci52YWx1ZU9mLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjI1IHwgc2Njb21lciB8IDIwMDgtMDgtMjIgMTE6MzY6NTEgQ0RUCisKK2FkZGVkIGNvbW1hbmQgbGluZSBjb250cm9sIG9mIHN0YXJ0aW5nIGxpc3RlbmVyIGFsc28uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityMjQgfCBzY2NvbWVyIHwgMjAwOC0wOC0yMiAxMTozNTo0NSBDRFQKKworZml4IHVwIGphdmEgVVJMIHN1cHBvcnQgb2Ygbm9uLXN0cmluZyB0ZXJtcy4KKworZnVsbHkgc3VwcG9ydCBCb29sZWFuIGluIGphdmEgVVJMLgorCitwcm9wZXJseSBpbXBsZW1lbnQgaW4gamF2YSBVUkwgaGFuZGxpbmcgb2YgcmVtb3ZlKCBuYW1lLCB2YWx1ZSApIHdoZW4gdmFsdWUKK2lzIGEgc2luZ2xldG9uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjkgfCBzY2NvbWVyIHwgMjAwOC0wOC0wMSAxNTozNzo0OSBDRFQKKworY29ycmVjdGVkIGNzaGFycCBwcm9qZWN0IGRlcGVuZGVuY2VzLgorCitjb3JyZWN0ZWQgcG9ydCBudW1iZXJzIGluIGRpc3RtYXAgdGVzdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3I4IHwgc2Njb21lciB8IDIwMDgtMDgtMDEgMTQ6MTc6MjcgQ0RUCisKK2ludGVncmF0ZWQgcmVtYWluaW5nIGV4YW1wbGVzIGludG8gY3NoYXJwIGJ1aWxkLgorCitidW1wZWQgdmVyc2lvbiBudW1iZXJzIG9mIGV4cGVjdGVkIGJ1aWxkIHRvIDEuMC4xLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjcgfCBzY2NvbWVyIHwgMjAwOC0wNy0zMSAxNTo1ODoyOSBDRFQKKworYWRkZWQgY3NoYXJwIGJ1aWxkIG9mIG1vc3Qgb2YgdGhlIGV4YW1wbGVzLgorCitzdWJzdGl0dXRlIERPVE5FVF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBnbmFybGV5IGRvdCBuZXQgcGF0aCBpbiB2YXJpb3VzCitidWlsZC54bWwuIHRoaXMgYWxsb3dzIGRpc2FibGluZyB0aGUgY3NoYXJwIGJ1aWxkIGZvciB0aG9zZSB0aGF0IGRvbid0IHdhbnQgaXQuCisKK2V4YW1wbGUgYW50IGJ1aWxkIHNldHVwIChhbnRzZXR1cC5iYXQpLCBzaG93cyB3aGljaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQKK3BhdGggbWFuaXB1bGF0aW9ucyB5b3UgbmVlZCBmb3IgYSBidWlsZC4gYWxzbyBzaG93cyB3aGljaCBvbmVzIGFyZSBvcHRpb25hbC4KKworY29ycmVjdGVkIHBvcnQgbnVtYmVycyBvZiBkaXN0bWFwIGV4YW1wbGUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHYXVyYXYgd2FzIEhlcmUKKworLS0tLS0tLS0tLS0tLQorUmVsZWFzZSAxLjAuMAorLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvS0VZUyBiL0tFWVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZDQ4OAotLS0gL2Rldi9udWxsCisrKyBiL0tFWVMKQEAgLTAsMCArMSw0NiBAQAorVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQR1Aga2V5cyBvZiB2YXJpb3VzIGRldmVsb3BlcnMuCisKK1VzZXJzOiBwZ3AgPCBLRVlTCisgICAgICAgZ3BnIC0taW1wb3J0IEtFWVMKKyAgICAgICBEZXZlbG9wZXJzOiAKKyAgICAgICAgICAgICAgIHBncCAta3hhIDx5b3VyIG5hbWU+IGFuZCBhcHBlbmQgaXQgdG8gdGhpcyBmaWxlLgorICAgICAgICAgICAgICAgKHBncGsgLWxsIDx5b3VyIG5hbWU+ICYmIHBncGsgLXhhIDx5b3VyIG5hbWU+KSA+PiB0aGlzIGZpbGUuCisgICAgICAgICAgICAgICAoZ3BnIC0tbGlzdC1zaWdzIDx5b3VyIG5hbWU+CisgICAgICAgICAgICAgICAgICAgICYmIGdwZyAtLWFybW9yIC0tZXhwb3J0IDx5b3VyIG5hbWU+KSA+PiB0aGlzIGZpbGUuCisKK3B1YiAgIDEwMjREL0YxOEUyQTEzIDIwMDktMDItMDQKK3VpZCAgICAgICAgICAgICAgICAgIEphbWVzIERpeHNvbiAoQ09ERSBTSUdOSU5HIEtFWSkgPGRpeHNvbkBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEYxOEUyQTEzIDIwMDktMDItMDQgIEphbWVzIERpeHNvbiAoQ09ERSBTSUdOSU5HIEtFWSkgPGRpeHNvbkBhcGFjaGUub3JnPgorc3ViICAgMjA0OGcvMzUzNzIxRjkgMjAwOS0wMi0wNAorc2lnICAgICAgICAgIEYxOEUyQTEzIDIwMDktMDItMDQgIEphbWVzIERpeHNvbiAoQ09ERSBTSUdOSU5HIEtFWSkgPGRpeHNvbkBhcGFjaGUub3JnPgorCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjQuOSAoRGFyd2luKQorCittUUdpQkVtS0Vuc1JCQUNocmxHZ1pvbTh0QXVwL1dlTm5xMDlIanN2VXcxc2hFR21JWW1RMU15MHUrek5BME9LCitpRi9aa0pXNGFvMjJlWXFJdncrM2E4MENHL1FIcWY3VlBVZGg0OFRkZFZzRGVZZ3Bxb1lDTCtTYVhKMGRqV0gyCis0NXBpWm1BYXdkZDBnbnVKa1ZVR2pWbTJsSFFKSUFoZ3B4aDJkUjNCTjRSZ01JbnlaQXFYUmVxMFZ3Q2dudlJuCitpRG0zZG9DVW5maGwwMFVrUWNsNEtBRUQvUlJlYXZOdS90TlI1T3VydjYyS1RzMzZ5S0lCT3FmejBxKzlRRXJsCitoM0U5U1FzRXFZcDh0dVE4TXFPVm81MCt2dHJPbGRIRWlPbkJqYkxHMTJkTjhhblI0NGw5ck5UMDIySlJBM1YwCitrdVhRdzg1Y2hzVHk1bTZJQmNMUmVtQ2U0Y0tOMzdZSHlBemVGc1NMcnk0d3ljODRCMWpWSmlVZGFqdlRtVytwCitrUG5HQS85TVVkNm9JdkdUYTJmYmc0Vm84eVBIZU9xNFFmZ2tVOGhOVzcwdU1QVTR3Q01NSjZCSDVMZHdOck5jCitpcnVCVzR3RkFiQnVmV1lzVzVGQVkzajg5L0x2MW9IWWZNSWlIYVUxUWZycHptdmxGcG5sUFpFRkIxdVRKalFUCitNVTNkUXh6cTl0OEJ2bnFXcnhwUng3WnhRb3NJR3FGbUtMWG41R0VheWhOL2h5cXdJclF6U21GdFpYTWdSR2w0CitjMjl1SUNoRFQwUkZJRk5KUjA1SlRrY2dTMFZaS1NBOFpHbDRjMjl1UUdGd1lXTm9aUzV2Y21jK2lHQUVFeEVDCitBQ0FGQWttS0Vuc0NHd01HQ3drSUJ3TUNCQlVDQ0FNRUZnSURBUUllQVFJWGdBQUtDUkNlcmlnazhZNHFFMVl4CitBSjQ5NVJ5UFdrVHhWZktOM2c4S0dOdzZVR1ZGVWdDZUx3ZEhhb3luaHRIUDlUd0huSzNIVS9nUkxLNjVBZzBFCitTWW9TZXhBSUFOM2ZSQ095MEYvR2hCQTlvTkh0REs0SVJjczQ0WUY5UDNzVGxtR0luaUo3eEtzU1psWU5lNXd5CitWTFRybVhrMkVSV0Z1ZUg5alVCZURNOUF6SEdNUUJYKzhJcUtJNFozRG9vdzFyZzJWSExjbEVSUjlleVJ6SDNiCitTY3ViOEFzbjdxTFp3aHVCRnBJc0oxZ0d5Z2lyRncrd05sbVgwME1WUW1Id0ZKb3Vka0VYQmNYTXhobGVyZ2VTCitObGRCVElyYUtDNS9kelRha0VOcTVuSnFDS3FZajhDSHA0WkRmR1VGdlZhdytXemEyVnd6QmM1c0FDeHlJVnFPCit4ZlBSUmlFZlZoRXFkMVkzRFhrVFU0T1NxVHFabm5uVkdaeDNMWk55ZnlHNEt1OUZtNU9Xck9YNEd5MkhtcDdVCitLeFRyVjVlL0FGVXJpM21JQnNvWklEQlBsTi85Vkc4QUJBc0gvUkxiblppYjBIZTBKRzNldklxemtzNVNDSDc0CitmWEZqRXRPU3VEcWN5R1l1OTNlRCtVaTNCd3JNb2dFRFVRNjJNbHhLUmI0YnZiNkNxbGdHaE8wenIzOGk2aTgyCit5ZnczaUFuajhzNjJxS2dXL0ZrK00rUWk1NTk5ME5JSXlnYlJkb1JwMzkwa0pFU2NjTi9nYUU2MWo0RVMrZ3FRCisvRi9xQ3hiOWdtb3hDTlJKSWJoUmFjUmhYM1prMGRGOTltZXlnRjhoYysrbFhGOXAvL012MC9DVFJjaDZZSVc0CitWMFUwK1ZZc1MyZlpkRlQvd1NpcUk2V3QrQ1p4ekFvckVPN1FaT3JDU1U5dy84dHZGdVBwNXRkVHZKRGtPN2tXCis4YXZRd3Zwd3Izck9KV1pqMHYrQmVod1EwYnJES3FhdmdSM2FIcis4NVJ6dU1OZTdvc28zNGhyQWZCeUlTUVFZCitFUUlBQ1FVQ1NZb1Nld0liREFBS0NSQ2VyaWdrOFk0cUUvMnpBSjBZaDEyVnpuTDN0azIvT1pVMm9QSU1BMEZSCitzQUNmU24vTXl5eDNucnB3V3RRVEZmODNuLzhMdTJFPQorPUxMcHgKKy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KZGlmZiAtLWdpdCBhL0xJQ0VOU0UudHh0IGIvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MmJlYgotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKyAqCisgKiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorICoKKyAqICAgMS4gRGVmaW5pdGlvbnMuCisgKgorICogICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICogICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKyAqCisgKiAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgKiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKyAqCisgKiAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAqICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICogICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICogICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAqICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAqICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgKiAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisgKgorICogICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgKiAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisgKgorICogICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAqICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICogICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorICoKKyAqICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAqICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICogICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgKiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKyAqCisgKiAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgKiAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAqICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgKiAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisgKgorICogICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgKiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAqICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICogICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICogICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAqICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICogICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorICoKKyAqICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAqICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICogICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAqICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICogICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgKiAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAqICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAqICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAqICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAqICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgKiAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgKiAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorICoKKyAqICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAqICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgKiAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorICoKKyAqICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAqICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAqICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgKiAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICogICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorICoKKyAqICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAqICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAqICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgKiAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICogICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICogICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICogICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgKiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgKiAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgKiAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAqICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAqICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAqICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAqICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgKiAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgKiAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAqICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisgKgorICogICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgKiAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKyAqCisgKiAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICogICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICogICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAqICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAqICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKyAqCisgKiAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICogICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICogICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgKiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAqICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICogICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAqICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAqICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICogICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICogICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgKiAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgKiAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICogICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAqICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICogICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgKiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisgKgorICogICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAqICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgKiAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICogICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAqICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKyAqCisgKiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAqICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgKiAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICogICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgKiAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgKiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKyAqCisgKiAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAqICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICogICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAqICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisgKgorICogICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAqICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICogICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgKiAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgKiAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAqICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgKiAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICogICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisgKgorICogICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAqICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgKiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgKiAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgKiAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAqICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgKiAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAqICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICogICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICogICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgKiAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAqICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAqICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAqICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAqICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAqICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAqICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICogICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAqICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICogICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKyAqCisgKiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworICoKKyAqICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorICoKKyAqICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICogICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICogICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICogICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAqICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICogICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAqICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorICoKKyAqICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9OT1RJQ0UudHh0IGIvTk9USUNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDNkYWYzCi0tLSAvZGV2L251bGwKKysrIGIvTk9USUNFLnR4dApAQCAtMCwwICsxLDggQEAKK0FwYWNoZSBFdGNoIChpbmN1YmF0aW5nKQorCitDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KK0NvcHlyaWdodCAoQykgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0CitUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgorCmRpZmYgLS1naXQgYS9SRUFETUUudHh0IGIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU1MWIzCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDk3IEBACitXZWxjb21lIHRvIHRoZSAxLjAuMi1pbmN1YmF0aW5nIHJlbGVhc2Ugb2YgQXBhY2hlIEV0Y2guCisKK1RoZSBqdW1waW5nIG9mZiBwb2ludCBmb3IgRXRjaCBpbmZvcm1hdGlvbiBhbmQgaGVscCBpcyBoZXJlOgorCitodHRwOi8vY3dpa2kuYXBhY2hlLm9yZy9FVENICisKK1RoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIG9mIHRoZSBpbnN0YWxsIGltYWdlIGlzOgorCisJQ2hhbmdlTG9nLnR4dAorCUxJQ0VOU0UudHh0CisJUkVBRE1FLnR4dAorICAgIE5PVElDRS50eHQKKyAgICBSRUxFQVNFX05PVEVTLnR4dAorCWJpbi8KKwlsaWIvCisgICAgZXhhbXBsZXMvCisJbWF2ZW4vCisgICAgdW5pbnN0LmV4ZSAod2luZG93cyBvbmx5KQorCitQbGVhc2UgdGFrZSBhIG1vbWVudCB0byByZXZpZXcgdGhlIFJFTEVBU0VfTk9URVMudHh0LCBDaGFuZ2VMb2cudHh0IGFuZAorTElDRU5TRS50eHQgZmlsZXMuCisKK1RoZSBXaW5kb3dzIGluc3RhbGxlciAoYXBhY2hlLWV0Y2gtMS4wLjItaW5jdWJhdGluZy1zZXR1cC5leGUpIGhhcyBjcmVhdGVkIGEgCit1c2VyIGVudmlyb25tZW50IHZhcmlhYmxlIChFVENIX0hPTUUpIHdoaWNoIHBvaW50cyB0byB0aGUgRXRjaCBpbnN0YWxsYXRpb24KK2RpcmVjdG9yeS4gSWYgeW91IGluc3RhbGxlZCBFdGNoIHVzaW5nIGVpdGhlciBhcGFjaGUtZXRjaC0xLjAuMi1pbmN1YmF0aW5nLWJpbi50YXIuZ3oKK29yIGFwYWNoZS1ldGNoLTEuMC4yLWluY3ViYXRpbmctYmluLnppcCwgeW91IHdpbGwgd2FudCB0byBjcmVhdGUgdGhpcyBlbnZpcm9ubWVudAordmFyaWFibGUgeW91cnNlbGY6CisKK3dpbmRvd3M6CisJc2V0IEVUQ0hfSE9NRT1DOlxQcm9ncmFtIEZpbGVzXEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXGFwYWNoZS1ldGNoLTEuMC4yLWluY3ViYXRpbmcKKworKm5peDoKKwlleHBvcnQgRVRDSF9IT01FPS9wYXRoL3RvL2FwYWNoZS1ldGNoLTEuMC4yLWluY3ViYXRpbmcKKworVGhlIGJpbiBkaXJlY3RvcnkgaGFzIGFsc28gYmVlbiBwdXQgb24geW91ciBwYXRoIGJ5IHRoZSBXaW5kb3dzIGluc3RhbGxlci4gSWYKK3lvdSBhcmUgdXNpbmcgdGhlIGFyY2hpdmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIHRoaXMgeW91cnNlbGY6CisKK3dpbmRvd3M6CisJUEFUSCAlUEFUSCU7JUVUQ0hfSE9NRSVcYmluCisKKypuaXg6CisJZXhwb3J0IFBBVEg9IiRQQVRIOiRFVENIX0hPTUUvYmluIgorCitUaGUgYmluLyBkaXJlY3RvcnkgY29udGFpbnMgYSBXaW5kb3dzIGJhdCBzY3JpcHQgYW5kIGEgdW5peCBzaGVsbCBzY3JpcHQuCisKK1lvdSB3aWxsIGFsc28gbmVlZCB0byBoYXZlIGEgamF2YSBzZGsgaW5zdGFsbGVkIChsYXRlciB2ZXJzaW9ucyBvZiAxLjUgb3IKK2FueSB2ZXJzaW9uIG9mIDEuNikuIEEgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHNob3VsZCBwb2ludCB0byB0aGUKK2luc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgdGhlIGphdmEgc2RrLgorCitJbiB0aGUgZW5kLCBhdCBhIGNvbW1hbmQgbGluZSBvciBzaGVsbCwgeW91IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB0aGUgZXRjaAorY29tcGlsZXIgYW5kIHNlZSBzb21lIGJhc2ljIG91dHB1dDoKKword2luZG93czoKKwlDOlw+ZXRjaAorCWV0Y2g6IG9wdGlvbiAnLWIgYmluZGluZycgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorCit1bml4OgorCWJhc2gtMy4yJCBldGNoCisJZXRjaDogb3B0aW9uICctYiBiaW5kaW5nJyBtdXN0IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lCisKK1RoZSBsaWIgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSB2YXJpb3VzIGphciBmaWxlcywgemlwcGVkIHNvdXJjZXMsIGFuZCBhIEMjIGRsbDoKKworCUV0Y2guZGxsCisJZXRjaC1hbnQtcGx1Z2luLTEuMC4yLXNyYy56aXAKKwlldGNoLWFudC1wbHVnaW4tMS4wLjIuamFyCisJZXRjaC1qYXZhLXJ1bnRpbWUtMS4wLjItc3JjLnppcAorCWV0Y2gtamF2YS1ydW50aW1lLTEuMC4yLmphcgorCS4uLgorCitUaGUgbWFpbiBpdGVtcyBvZiBpbnRlcmVzdCBhcmUgdGhlIGxhbmd1YWdlIGJpbmRpbmcgcnVudGltZXMsIHdoaWNoIHlvdSBuZWVkIHRvCitsaW5rIHdpdGggeW91ciBwcm9qZWN0cy4KKworRm9yIGphdmEgeW91IG5lZWQgdG8gcHV0IG9uIHRoZSBjbGFzc3BhdGggb2YgeW91ciBwcm9qZWN0czogZXRjaC1qYXZhLXJ1bnRpbWUtMS4wLjIuamFyLgorVGhlcmUgaXMgc291cmNlIGNvZGUgdG8gZ28gd2l0aCBpdCBpbiBldGNoLWphdmEtcnVudGltZS0xLjAuMi1zcmMuemlwLgorCitUaGUgQyMgKC5ORVQgMi4wKSBFdGNoLmRsbCBzaG91bGQgYmUgYWRkZWQgdG8gYW55IEMjIHByb2plY3RzLgorCitUaGVyZSBpcyBhbiBhbnQgcGx1Z2luIHdoaWNoIHlvdSBjYW4gdXNlIHdpdGggYW50IDEuNy4wIG9yIGxhdGVyIHRvIGludm9rZSB0aGUKK2NvbXBpbGVyIGFzIGEgdGFzay4gSXQgaXMgZG9jdW1lbnRlZCBvbiB0aGUgd2lraSByZWZlcmVuY2VkIGFib3ZlLgorCitJZiB5b3UgYXJlIHVzaW5nIG1hdmVuLCB0aGVuIHlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIEV0Y2ggYXJ0aWZhY3RzIGludG8KK3lvdXIgbG9jYWwgbWF2ZW4gcmVwb3NpdG9yeS4gVGhlcmUgaXMgYSBXaW5kb3dzIGJhdCBzY3JpcHQgdG8gZG8gdGhpcyBpbiB0aGUKK21hdmVuIGRpcmVjdG9yeToKKworCWV0Y2gtbWF2ZW4taW5zdGFsbC5iYXQKKworWW91IG5lZWQgdG8gaGF2ZSBtYXZlbiBvbiB5b3VyIHBhdGggd2hlbiB5b3UgcnVuIHRoaXMgc2NyaXB0LiBUaGUgZmlsZQorZXRjaC1qYXZhLXJ1bnRpbWUtMS4wLjIuamFyIHdpbGwgYmUgaW5zdGFsbGVkIGludG8geW91ciBsb2NhbCByZXBvc2l0b3J5IHdpdGgKK2dyb3VwICJldGNoLmV0Y2giLCBhcnRpZmFjdCBpZCAiZXRjaC1qYXZhLXJ1bnRpbWUiLCBhbmQgdmVyc2lvbiAiMS4wLjIiLiBZb3UKK21heSB0aGVuIHJlZmVyZW5jZSBFdGNoIGZyb20geW91ciBtYXZlbiBwcm9qZWN0cy4KKworRXhhbXBsZXMgaGF2ZSBiZWVuIHByb3ZpZGVkIGluIHRoZSBleGFtcGxlcy8gc3ViZGlyZWN0b3J5LgorCitVbml0IHRlc3RzIGNhbiBiZSBoYWQgYnkgY2hlY2tpbmcgb3V0IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZQorc3VidmVyc2lvbiByZXBvc2l0b3J5IGFuZCBwZXJmb3JtaW5nIGEgY29tcGxldGUgYnVpbGQ6CisKKyBodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9pbmN1YmF0b3IvZXRjaC9yZWxlYXNlcy9yZWxlYXNlLTEuMC4yCmRpZmYgLS1naXQgYS9SRUxFQVNFX05PVEVTLnR4dCBiL1JFTEVBU0VfTk9URVMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NmNkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUxFQVNFX05PVEVTLnR4dApAQCAtMCwwICsxLDY4IEBACitXZWxjb21lIHRvIEFwYWNoZSBFdGNoIDEuMC4yLiBFdGNoIGlzIG5vdyBpbmN1YmF0aW5nIGF0IGFwYWNoZS5vcmcuIFlvdSBjYW4gZmluZAordXMgaGVyZToKKworUHJvamVjdCBpbmZvOgorCisJaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3Byb2plY3RzL2V0Y2guaHRtbAorCitEb2N1bWVudGF0aW9uIGluZm86CisKKwlodHRwOi8vY3dpa2kuYXBhY2hlLm9yZy9FVENILworCitJc3N1ZXM6CisKKwlodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VUQ0gKKworU1ZOOgorCisJaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9pbmN1YmF0b3IvZXRjaC8KKworTWFpbGluZyBsaXN0czoKKworCW1haWx0bzpldGNoLWRldkBpbmN1YmF0b3IuYXBhY2hlLm9yZyAoZXRjaCBkZXZlbG9wZXJzKQorCW1haWx0bzpldGNoLXVzZXJzQGluY3ViYXRvci5hcGFjaGUub3JnIChldGNoIHVzZXJzKQorCitTdWJzY3JpYmluZyB0byB0aGUgbWFpbGluZyBsaXN0czoKKworCW1haWx0bzpldGNoLWRldi1zdWJzY3JpYmVAaW5jdWJhdG9yLmFwYWNoZS5vcmcgKGV0Y2ggZGV2ZWxvcGVycykKKwltYWlsdG86ZXRjaC11c2Vycy1zdWJzY3JpYmVAaW5jdWJhdG9yLmFwYWNoZS5vcmcgKGV0Y2ggdXNlcnMpCisKK1RoaXMgcmVsZWFzZSBvZiBFdGNoIGlzIHRoZSBmaXJzdCBmcm9tIG91ciBuZXcgaG9tZSBhdCBBcGFjaGUuIEl0IGlzIGEgYnVnIGZpeAorcmVsZWFzZSBvbmx5LiBXaGlsZSBzb21lIG5ldyBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIGNvbW1pdHRlZCB0byB0aGUgdHJlZSwgaXQKK2lzIG5vdCB5ZXQgZnVuY3Rpb25hbCBlbm91Z2ggdG8gY2xhaW0gdGhhdCB5b3Ugc2hvdWxkIHVzZSBpdC4KKworSGVyZSBhcmUgdGhlIGlzc3VlcyByZXNvbHZlZCBpbiB0aGlzIHJlbGVhc2U6CisKK0tleQkJCVJlcwkJU3VtbWFyeQorRVRDSC02CQlGaXhlZAlJZiBmcmVlIHBvb2wgZXhjZWVkcyBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHRoZSBleGNlcHRpb24KKwkJCQkJdGhyb3duIHdpbGwga2lsbCB0aGUgY29ubmVjdGlvbi4KK0VUQ0gtOAkJRml4ZWQgCUNhbmNlbGluZyBtYWlsYm94IG5vdGlmaWNhdGlvbiByZWdpc3RyYXRpb24gdGhyb3dzIGV4Y2VwdGlvbgorCQkJCQlpZiBub3QgcmVnaXN0ZXJlZC4KK0VUQ0gtMTEgCUZpeGVkIAlBbGFybU1hbmFnZXIgZGVhZGxvY2tzIGR1cmluZyBzaHV0ZG93bigpLgorRVRDSC0xMyAJRml4ZWQgCUNvcHkgdGhlIHJlc3Qgb2YgdGhlIGV4YW1wbGUgc291cmNlcyBpbnRvIHRoZSBkaXN0cmlidXRpb24uCitFVENILTE3IAlGaXhlZCAJU2Vzc2lvbkxpc3RlbmVyIG5lZWRzIHRvIGJlIG1vcmUgaW5kZXBlbmRlbnQuCitFVENILTE4IAlGaXhlZCAJS2VlcEFsaXZlIHRocm93cyBleGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIHNodXRkb3duCisJCQkJCWNvbm5lY3Rpb24uCitFVENILTE5IAlGaXhlZCAJQnJlYWsgb3V0IGNvbW1vbiB0Y3AgdHJhbnNwb3J0IG9wdGlvbnMgc28gdGhhdCB0aGV5IG1heSBiZQorCQkJCQlzaGFyZWQgYW1vbmcgdmFyaW91cyB0cmFuc3BvcnRzLgorRVRDSC0yMyAJRml4ZWQgCUZyZWVQb29sIGhhcyBzeW5jaHJvbml6YXRpb24gaXNzdWVzIHdpdGggcXVpY2sgYmFjayB0byBiYWNrCisJCQkJCWNhbGxzIHRvIFJ1bi4KK0VUQ0gtMjQgCUZpeGVkIAlUaGUgbWVzc2FnZSBkaXJlY3Rpb24gaXMgYWx3YXlzICJzZXJ2ZXIiIGZvciB0aGUKKwkJCQkJcmVzdWx0X21ldGhvZCBtZXNzYWdlcyBpbiB0aGUgamF2YS1iaW5kaW5nIHZhbHVlZmFjdG9yeS4KK0VUQ0gtMjUgCUZpeGVkIAlEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlIGVuZHMgY2FsbCB3aXRoIG1iLkNsb3NlRGVsaXZlcnkoKSBhbmQKKwkJCQkJaXQgc2hvdWxkIGVuZCBpdCB3aXRoIG1iLkNsb3NlUmVhZCgpLgorRVRDSC0yNyAJRml4ZWQgCU1peGlucyBjYXVzZSB0cm91YmxlIHdoZW4gdHdvIG9yIG1vcmUgbWl4ZWQgaW4gZmlsZXMgZGVmaW5lCisJCQkJCWEgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuCitFVENILTI4IAlGaXhlZCAJRXhhbXBsZXMgZG8gbm90IGJ1aWxkIGR1ZSB0byBvdXRkYXRlZCBhbnQgZmlsZXMuCitFVENILTI5IAlGaXhlZCAJSW5zdGFsbGluZyBhbGwgTWF2ZW4gYXJ0aWZhY3RzIGFsb25nIHdpdGggdGhlaXIgc291cmNlcy4KK0VUQ0gtMzEgCUZpeGVkIAlNeVNlc3Npb25MaXN0ZW5lciBpbiBUY3BUcmFuc3BvcnRGYWN0b3J5IGRvZXMgbm90IG92ZXJyaWRlCisJCQkJCXRvU3RyaW5nKCkgbWV0aG9kIHRvIHNob3cgc29tZXRoaW5nIHVzZWZ1bCBhYm91dCB0aGUKKwkJCQkJdHJhbnNwb3J0IHN0YWNrLgorCitIZXJlIGFyZSB0aGUgb3V0c3RhbmRpbmcgaXNzdWVzIGluIHRoaXMgcmVsZWFzZToKKworS2V5IAkJU3VtbWFyeQorRVRDSC0xMiAJQW4gZXhjZXB0aW9uIHJldHVybiB2YWx1ZSBmcm9tIGEgbWVzc2FnZSBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEKKwkJCXRocm93biBleGNlcHRpb24uCitFVENILTI2IAlTb21lIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGlmIC5OZXQgRnJhbWV3b3JrIExhbmd1YWdlCisJCQlQYWNrIGlzIGluc3RhbGxlZC4KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL2J1aWxkLnhtbCBiL2JpbmRpbmctY3NoYXJwL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI0MTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvYnVpbGQueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy0tPgorPHByb2plY3QgbmFtZT0iZXRjaC1jc2hhcnAtYmluZGluZyIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+CisgICAgPGRlc2NyaXB0aW9uPkV0Y2gtdG8tQ3NoYXJwIEJpbmRpbmc8L2Rlc2NyaXB0aW9uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJhc2VkaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIiAvPgorICAgIDxpbXBvcnQgZmlsZT0iJHtFdGNoLmJhc2VkaXJ9L2J1aWxkLXN1cHBvcnQvZXRjaC5jb21tb24ueG1sIiAvPgorCTx0YXJnZXQgbmFtZT0iaGVscCI+PGVjaG8+UGxlYXNlIHNlbGVjdCBhIHRhcmdldC4uLjwvZWNobz48L3RhcmdldD4KKworICAgIDwhLS0gc3RhbmRhcmQsIHN1cHBvcnRlZCB0YXJnZXRzIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iRGVidWciICAgICAgICAgZGVwZW5kcz0iZGVidWciIC8+CisgICAgPHRhcmdldCBuYW1lPSJSZWxlYXNlIiAgICAgICBkZXBlbmRzPSJyZWxlYXNlIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iQ2xlYW4iICAgICAgICAgZGVwZW5kcz0iY2xlYW4iIC8+CisgICAgPHRhcmdldCBuYW1lPSJkZWJ1ZyIgICAgICAgICBkZXBlbmRzPSJpbml0LWRlYnVnLGNvbXBvbmVudC1hbGwscG9zdC1kZWJ1ZyIgICAvPgorICAgIDx0YXJnZXQgbmFtZT0icmVsZWFzZSIgICAgICAgZGVwZW5kcz0iaW5pdC1yZWxlYXNlLGNvbXBvbmVudC1hbGwscG9zdC1yZWxlYXNlIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iICAgICAgICAgZGVwZW5kcz0iaW5pdC1jbGVhbixjb21wb25lbnQtYWxsLHBvc3QtY2xlYW4iIC8+CisgICAgPHRhcmdldCBuYW1lPSJtYXZlbi1pbnN0YWxsIiBkZXBlbmRzPSJpbml0LW1hdmVuLHJlbGVhc2UiIC8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtbWF2ZW4iID4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkRPLm1hdmVuLmluc3RhbGwiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiID4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtFdGNoLmxvZ0RpcmVjdG9yeX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtZGVidWciIGRlcGVuZHM9InZhbGlkYXRlLWRlcGVuZGVuY2llcyIgPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiIHZhbHVlPSJEZWJ1ZyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMuZGVidWciIHZhbHVlPSJvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMub3B0aW1pemUiIHZhbHVlPSJvZmYiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InBvc3QtZGVidWciID4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1yZWxlYXNlIiBkZXBlbmRzPSJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiPgorICAgICAgICA8IS0tIEZvciBub3csIGtlZXAgZGVidWctc3ltYm9scyBhbmQgbm8tb3B0aW1pemUsIGV2ZW4gZm9yIHJlbGVhc2UgYnVpbGRzIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiIHZhbHVlPSJSZWxlYXNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5qYXZhYy5kZWJ1ZyIgIHZhbHVlPSJvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMub3B0aW1pemUiIHZhbHVlPSJvZmYiIC8+CisgICAgICAgIDwhLS0KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMuZGVidWciICB2YWx1ZT0ib2ZmIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5qYXZhYy5vcHRpbWl6ZSIgdmFsdWU9Im9uIiAvPgorICAgICAgICAtLT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icG9zdC1yZWxlYXNlIiA+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtY2xlYW4iIGRlcGVuZHM9InZhbGlkYXRlLWRlcGVuZGVuY2llcyI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJ1aWxkLnRhcmdldCIgdmFsdWU9IkNsZWFuIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJwb3N0LWNsZWFuIiA+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkV4ZWN1dGluZyBjbGVhbiIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcG9uZW50LWFsbCIgPgorICAgICAgICA8YnVpbGRfY29tcG9uZW50IGRpcj0iY29tcGlsZXIiIC8+CisgICAgICAgIDxidWlsZF9jb21wb25lbnQgZGlyPSJydW50aW1lIiAvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9jb21waWxlci9idWlsZC54bWwgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0ZGY0YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL2J1aWxkLnhtbApAQCAtMCwwICsxLDIyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLWNzaGFycC1jb21waWxlciIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+CisgICAgPGRlc2NyaXB0aW9uPkV0Y2gtdG8tQ3NoYXJwIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPCEtLSBTdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgc3ViLXByb2plY3QgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InByb2oiICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLmJhc2VkaXJ9L2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQiICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vdGFyZ2V0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiICAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vc3JjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5lcmF0ZWRTcmMiICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9nZW5lcmF0ZWQtc291cmNlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc0RpcmVjdG9yeSIgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vY2xhc3NlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2VzRGlyZWN0b3J5IiAgIGxvY2F0aW9uPSIke3RhcmdldH0vcmVzb3VyY2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0UmVzdWx0c0RpcmVjdG9yeSIgbG9jYXRpb249IiR7dGFyZ2V0fS90ZXN0LXJlc3VsdHMiIC8+CisKKyAgICA8IS0tIE1BQ1JPOiBpbml0LXRhcmdldCAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iaW5pdC10YXJnZXQiID4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgICBmYWlsb25lcnJvcj0iZmFsc2UiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7cmVzb3VyY2VzRGlyZWN0b3J5fSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3Jlc291cmNlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPCEtLSBNQUNSTzogY29tcGlsZS1zb3VyY2VzIC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJjb21waWxlLXNvdXJjZXMiID4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8IS0tIGNvbXBpbGUgY29tcGlsZXIgcGx1Z2luIC0tPgorICAgICAgICAgICAgPGphdmFjICBkZWJ1Zz0iJHtFdGNoLmphdmFjLmRlYnVnfSIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjUiCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPSIke0V0Y2guamF2YWMub3B0aW1pemV9IgorICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iID4KKyAgICAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfS9tYWluL2phdmEiIC8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJFdGNoLmRlcGVuZGVuY2llcy5qYXIucGF0aHMiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guSE9NRX0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPC9qYXZhYz4KKworICAgICAgICAgICAgPCEtLSBjb21waWxlciBwbHVnaW4gcmVzb3VyY2VzIC0tPgorICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vcmVzb3VyY2VzIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5rd2QiIC8+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoudm0iIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC9jb3B5PgorCisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICA8amF2YWMgIGRlYnVnPSIke0V0Y2guamF2YWMuZGVidWd9IgorICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9IjEuNSIKKyAgICAgICAgICAgICAgICAgICAgb3B0aW1pemU9IiR7RXRjaC5qYXZhYy5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vdGVzdCIgPgorICAgICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9L3Rlc3QvamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IkV0Y2guZGVwZW5kZW5jaWVzLmphci5wYXRocyIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guSE9NRX0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPC9qYXZhYz4KKyAgICAgICAgICAgIC0tPgorCisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPCEtLSBNQUNSTzogYnVuZGxlLWphcnMgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImJ1bmRsZS1qYXJzIiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzdCIgZGVmYXVsdD0iJHtFdGNoLmRpc3R9IiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IkB7ZGlzdH0vbGliIiAvPgorCisgICAgICAgICAgICA8IS0tIENSRUFURSBqYXJzIC0tPgorCisgICAgICAgICAgICA8IS0tIFBhY2thZ2UgdXAgZXRjaC1jc2hhcnAtY29tcGlsZXIgamFyIC0tPgorICAgICAgICAgICAgPGphciBqYXJmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtY3NoYXJwLWNvbXBpbGVyLmphcn0iID4KKyAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ29weXJpZ2h0IiAgICB2YWx1ZT0iJHtFdGNoLmNvcHlyaWdodE5vdGljZX0iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iVmVyc2lvbiIgICAgICB2YWx1ZT0iJHtFdGNoLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkxvbmdWZXJzaW9uIiAgdmFsdWU9IiR7RXRjaC5sb25ndmVyc2lvbn0iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVpbGQtVGFnIiAgICB2YWx1ZT0iJHtFdGNoLmJ1aWxkVGFnfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTVk4tUmV2aXNpb24iIHZhbHVlPSIke0V0Y2gucnVudGltZS5yZXZpc2lvbk51bWJlcn0iIC8+CisgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8bWV0YWluZiBkaXI9IiR7RXRjaC5iYXNlZGlyfSIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICA8L21ldGFpbmY+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvKioiIC8+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gPGluY2x1ZGUgbmFtZT0icmVzb3VyY2VzLyoqIiAvPiAtLT4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L2phcj4KKworICAgICAgICAgICAgPCEtLSBDUkVBVEUgc291cmNlIGFyY2hpdmVzIC0tPgorCisgICAgICAgICAgICA8IS0tIHBhY2thZ2UgdXAgZXRjaC1jc2hhcnAtY29tcGlsZXIgc3JjIC0tPgorICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0iQHtkaXN0fS9saWIvJHtldGNoLWNzaGFycC1jb21waWxlci1zcmMuemlwfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL3Jlc291cmNlcyIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvemlwPgorCisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPCEtLSBJTklUIFRBUkdFVCAtLT4KKyAgICA8IS0tIE1vZGlmeSB0aGlzIHRhcmdldCB0byBkZWZpbmUgcHJvamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzIHRoYXQgY2FuIG9ubHkgYmUgc2V0IGF0IHJ1bnRpbWUgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1pbml0Ij4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKworICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuZXJhdGVkU3JjfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtyZXNvdXJjZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3RSZXN1bHRzRGlyZWN0b3J5fSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gQ0xFQU4gVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8tY2xlYW4iPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBCVUlMRCBUQVJHRVQgLS0+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXNvdXJjZXMiID4KKyAgICAgICAgPCEtLSBHZW5lcmF0ZSB2ZXJzaW9uIGluZm8gLS0+CisgICAgICAgIDx1cGRhdGUtdG9rZW5zIGZpbGVuYW1lPSIke3NyY30vbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtZm9yLWRpc3QiID4KKyAgICAgICAgPCEtLSBJbml0aWFsaXplIHRhcmdldCBkaXJlY3RvcmllcyAtLT4KKyAgICAgICAgPGluaXQtdGFyZ2V0IC8+CisKKyAgICAgICAgPCEtLSBDb21waWxlIFNvdXJjZSAtLT4KKyAgICAgICAgPGNvbXBpbGUtc291cmNlcyAvPgorCisgICAgICAgIDwhLS0gQnVuZGxlIEphcnMgLS0+CisgICAgICAgIDxidW5kbGUtamFycyBkaXN0PSIke0V0Y2guZGlzdH0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtZm9yLWNsb3ZlciIgaWY9IkNsb3Zlci5lbmFibGVkIiA+CisKKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iUmVidWlsZGluZyB3aXRoIGNsb3ZlciIgLz4KKworICAgICAgICA8IS0tIGluaXRpYWxpemUtY2xvdmVyIC0tPgorICAgICAgICA8aW5pdGlhbGl6ZS1jbG92ZXIgc3VmZml4PSJldGNoY3NoYXJwY29tcGlsZXIiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgPHRlc3Rzb3VyY2VzIGRpcj0iJHtzcmN9L3Rlc3QvamF2YSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgPC90ZXN0c291cmNlcz4KKyAgICAgICAgICAgIC0tPgorICAgICAgICA8L2luaXRpYWxpemUtY2xvdmVyPgorCisgICAgICAgIDwhLS0gSW5pdGlhbGl6ZSB0YXJnZXQgZGlyZWN0b3JpZXMgLS0+CisgICAgICAgIDxpbml0LXRhcmdldCAvPgorCisgICAgICAgIDwhLS0gQ29tcGlsZSBTb3VyY2UgLS0+CisgICAgICAgIDxjb21waWxlLXNvdXJjZXMgLz4KKworICAgICAgICA8IS0tIEJ1bmRsZSBKYXJzIC0tPgorICAgICAgICA8YnVuZGxlLWphcnMgZGlzdD0iJHtFdGNoLmNsb3Zlci1kaXN0fSIgLz4KKworICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkby1idWlsZCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyxjb21waWxlLWZvci1kaXN0LGNvbXBpbGUtZm9yLWNsb3ZlciIgLz4KKworICAgIDwhLS0gVEVTVCBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby10ZXN0Ij4KKworICAgICAgICA8IS0tIFJ1biBVbml0IFRlc3RzIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ibm8iIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIKKyAgICAgICAgICAgIGVycm9yUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiIGZhaWx1cmVQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5IT01FfS9saWIvJHtldGNoLWNvbXBpbGVyLmphcn0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5jbG92ZXIuamFyfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIvPgorICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ0cnVlIiB0b2Rpcj0iJHt0ZXN0UmVzdWx0c0RpcmVjdG9yeX0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L3Rlc3QvamF2YSI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L2JhdGNodGVzdD4KKyAgICAgICAgPC9qdW5pdD4KKyAgICAgICAgLS0+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIFBPU1RCVUlMRCBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1wb3N0YnVpbGQiPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkby1wdWJsaXNoIiBpZj0iYnVpbGQudGVzdHMuZmFpbCI+CisgICAgICAgIDwhLS0gU2V0IGZsYWcgZmlsZSBpZiBhbnkgdGVzdHMgZmFpbGVkIC0tPgorICAgICAgICA8dG91Y2ggZmlsZT0iJHtFdGNoLnJ1bnRpbWUudGVzdHMuZmFpbH0iLz4KKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvQ29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY2MWFiCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKQEAgLTAsMCArMSwxMTYxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmNzaGFycC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5DbWRMaW5lT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuRXRjaEdyYW1tYXJDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkxvZ0hhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLk91dHB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuQnVpbHRpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LkV4Y2VwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lkl0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTWVzc2FnZURpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1vZHVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1zZ0RpckhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlJlc2VydmVkV29yZENoZWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuU3RydWN0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuVGhyb3duOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuVHlwZVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LlRvU3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuVG9TdHJpbmcuRmllbGRJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuVG9TdHJpbmcuRm10SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LlRvU3RyaW5nLlN0cmluZ0l0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5leGNlcHRpb24uUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZVNlcnZpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5sb2cuTG9nQ2h1dGU7CisKKworLyoqCisgKiBDb21waWxlciBpcyBhIGhlbHBlciBjbGFzcyBub3Qgb25seSBmb3IgQmFja2VuZCwgYnV0IGFsc28gZm9yIHRoZSB0ZW1wbGF0ZXMuCisgKiBUaGV5IGNhbGwgbWV0aG9kcyBoZXJlIHRvIHBlcmZvcm0gImhhcmQiIHRhc2tzLgorICovCitwdWJsaWMgY2xhc3MgQ29tcGlsZXIgZXh0ZW5kcyBCYWNrZW5kCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIHRtcGxQYXRoMSA9ICJvcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyLyI7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgdG1wbFBhdGgyID0gInJlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyLyI7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZm5TdWZmaXggPSAiLmNzIjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWRVJTSU9OID0gVmVyc2lvbi5WRVJTSU9OICsgIiAvICIKKwkJKyBDb21waWxlclZlcnNpb24uVkVSU0lPTjsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIENvbXBpbGVyLiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIG5vdCBvbmx5IGZvciBCYWNrZW5kLCBidXQKKwkgKiBhbHNvIGZvciB0aGUgdGVtcGxhdGVzLiBUaGV5IGNhbGwgbWV0aG9kcyBoZXJlIHRvIHBlcmZvcm0gImhhcmQiIHRhc2tzLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgQ29tcGlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpbml0VmVsb2NpdHkoKTsKKwkJCisJCVN0cmluZ1tdIHBhdGggPSB7IHRtcGxQYXRoMSwgdG1wbFBhdGgyIH07CisJCXZmX3ZtID0gZ2V0VGVtcGxhdGUoIHBhdGgsICJ2Zi52bSIgKTsKKwkJaW50Zl92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiaW50Zi52bSIgKTsKKwkJcmVtb3RlX3ZtID0gZ2V0VGVtcGxhdGUoIHBhdGgsICJyZW1vdGUudm0iICk7CisJCXN0dWJfdm0gPSBnZXRUZW1wbGF0ZSggcGF0aCwgInN0dWIudm0iICk7CisJCWhlbHBlcl92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiaGVscGVyLnZtIiApOworCQlyZWFkbWVfdm0gPSBnZXRUZW1wbGF0ZSggcGF0aCwgInJlYWRtZS52bSIgKTsKKwkJbWFpbl92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAibWFpbi52bSIgKTsKKwkJYmFzZV92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiYmFzZS52bSIgKTsKKwkJaW1wbF92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiaW1wbC52bSIgKTsKKworCQlsb2NhbF9rd2QgPSBnZXRQYXRoKCBwYXRoLCAiY3NoYXJwS2V5d29yZHMua3dkIiApOworCX0KKworCXByaXZhdGUgZmluYWwgVGVtcGxhdGUgdmZfdm07CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIGludGZfdm07CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIHJlbW90ZV92bTsKKworCXByaXZhdGUgZmluYWwgVGVtcGxhdGUgc3R1Yl92bTsKKworCXByaXZhdGUgZmluYWwgVGVtcGxhdGUgaGVscGVyX3ZtOworCisJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSByZWFkbWVfdm07CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIG1haW5fdm07CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIGJhc2Vfdm07CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIGltcGxfdm07CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbF9rd2Q7CisKKwlwcml2YXRlIExvZ0hhbmRsZXIgbGg7CisJCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdXNlIG9mIHZlbG9jaXR5IGVuZ2luZSBhbmQgc2V0cyB1cAorCSAqIHJlc291cmNlIGxvYWRlcnMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdFZlbG9jaXR5KCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmVsb2NpdHkuc2V0UHJvcGVydHkoIFZlbG9jaXR5LlJVTlRJTUVfTE9HX0xPR1NZU1RFTSwgbmV3IE15TG9nZ2VyKCkgKTsKKwkJCisJCVZlbG9jaXR5LnNldFByb3BlcnR5KCBWZWxvY2l0eS5SRVNPVVJDRV9MT0FERVIsICJmaWxlLCBjbGFzcyIgKTsKKworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLmRlc2NyaXB0aW9uIiwgIlZlbG9jaXR5IEZpbGUgUmVzb3VyY2UgTG9hZGVyIiApOworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLmNsYXNzIiwgIm9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5yZXNvdXJjZS5sb2FkZXIuRmlsZVJlc291cmNlTG9hZGVyIiApOworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLnBhdGgiLCAiLiIgKTsKKworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5kZXNjcmlwdGlvbiIsICJWZWxvY2l0eSBDbGFzc3BhdGggUmVzb3VyY2UgTG9hZGVyIiApOworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5jbGFzcyIsICJvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UubG9hZGVyLkNsYXNzcGF0aFJlc291cmNlTG9hZGVyIiApOworCQkKKwkJVmVsb2NpdHkuaW5pdCgpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUxvZ2dlciBpbXBsZW1lbnRzIExvZ0NodXRlCisJeworCQlwcml2YXRlIGZpbmFsIExvZ0hhbmRsZXIgbGggPSBudWxsOworCQkKKwkJcHVibGljIHZvaWQgaW5pdCggUnVudGltZVNlcnZpY2VzIHJ0cyApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJLy8gaWdub3JlLgorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNMZXZlbEVuYWJsZWQoIGludCBsZXZlbCApCisJCXsKKwkJCXJldHVybiBsZXZlbCA+PSAyOworCQl9CisKKwkJcHVibGljIHZvaWQgbG9nKCBpbnQgbGV2ZWwsIFN0cmluZyBtc2cgKQorCQl7CisJCQlpZiAobGV2ZWwgPCAyKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKGxoICE9IG51bGwpCisJCQkJbGgucmVwb3J0KCBsZXZlbCA9PSAyID8gTG9nSGFuZGxlci5MRVZFTF9XQVJOSU5HIDogTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwgbnVsbCwgbXNnICk7CisJCQllbHNlCisJCQkJU3lzdGVtLm91dC5wcmludGYoICJWZWxvY2l0eSBtc2cgKCVkKTogJXNcbiIsIGxldmVsLCBtc2cgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGxvZyggaW50IGxldmVsLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZSApCisJCXsKKwkJCWlmIChsZXZlbCA8IDIpCisJCQkJcmV0dXJuOworCQkJCisJCQlpZiAobGggIT0gbnVsbCkKKwkJCQlsaC5yZXBvcnQoIGxldmVsID09IDIgPyBMb2dIYW5kbGVyLkxFVkVMX1dBUk5JTkcgOiBMb2dIYW5kbGVyLkxFVkVMX0VSUk9SLCBudWxsLCBtc2cgKTsKKwkJCWVsc2UKKwkJCQlTeXN0ZW0ub3V0LnByaW50ZiggIlZlbG9jaXR5IG1zZyAoJWQpOiAlczogJXNcbiIsIGxldmVsLCBtc2csIGUgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXRoCisJICogQHBhcmFtIGZuCisJICogQHJldHVybiB0aGUgdmVsb2NpdHkgdGVtcGxhdGUKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgVGVtcGxhdGUgZ2V0VGVtcGxhdGUoIFN0cmluZ1tdIHBhdGgsIFN0cmluZyBmbiApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCVJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gcm5mZSA9IG51bGw7CisJCQorCQlmb3IgKFN0cmluZyBwOiBwYXRoKQorCQl7CisJCQlpZiAocCA9PSBudWxsKQorCQkJCWNvbnRpbnVlOworCQkJCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInRyeWluZyB0byBsb2FkIHRlbXBsYXRlICIrKHArZm4pICk7CisJCQl0cnkKKwkJCXsKKwkJCQlpZiAoVmVsb2NpdHkucmVzb3VyY2VFeGlzdHMoIHArZm4gKSkKKwkJCQkJcmV0dXJuIFZlbG9jaXR5LmdldFRlbXBsYXRlKCBwK2ZuICk7CisJCQl9CisJCQljYXRjaCAoIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSApCisJCQl7CisJCQkJcm5mZSA9IGU7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJpZ25vcmluZyAiK2UpOworCQkJfQorCQl9CisJCQorCQlpZiAocm5mZSAhPSBudWxsKQorCQkJdGhyb3cgcm5mZTsKKwkJCisJCXRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCJjb3VsZCBub3QgZmluZCByZXNvdXJjZTogIitmbik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZ2VuZXJhdGUoIE1vZHVsZSBtb2R1bGUsIENtZExpbmVPcHRpb25zIG9wdGlvbnMgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlsaCA9IG9wdGlvbnMubGg7CisKKwkJYm9vbGVhbiBpZ25vcmVHbG9iYWwgPSBvcHRpb25zLmlnbm9yZUdsb2JhbFdvcmRzTGlzdDsKKwkJYm9vbGVhbiBpZ25vcmVMb2NhbCA9IG9wdGlvbnMuaWdub3JlTG9jYWxXb3Jkc0xpc3Q7CisJCVN0cmluZyB1c2VyV29yZHMgPSBvcHRpb25zLnVzZXJXb3Jkc0xpc3QgIT0gbnVsbCA/IG9wdGlvbnMudXNlcldvcmRzTGlzdC5nZXRQYXRoKCkgOiBudWxsOworCQlTZXQ8U3RyaW5nPiB3aGF0ID0gb3B0aW9ucy53aGF0OworCisJCS8vIExvYWQgdGhlIHJlc2VydmVkIHdvcmRzIGxpc3RzIGlmIGFueSBoYXZlIGJlZW4gcHJvdmlkZWQuCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gd29yZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaWYgKCFpZ25vcmVHbG9iYWwpCisJCQltYXBXb3JkcyggZ2xvYmFsX2t3ZCwgd29yZHMgKTsKKwkJaWYgKCFpZ25vcmVMb2NhbCkKKwkJCW1hcFdvcmRzKCBsb2NhbF9rd2QsIHdvcmRzICk7CisJCWlmICh1c2VyV29yZHMgIT0gbnVsbCkKKwkJCW1hcFdvcmRzKCB1c2VyV29yZHMsIHdvcmRzICk7CisKKwkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbnMgd2l0aCB0aGUgcmVzZXJ2ZWQgd29yZCBsaXN0LgorCQlSZXNlcnZlZFdvcmRDaGVja2VyIGNoZWNrZXIgPSBuZXcgUmVzZXJ2ZWRXb3JkQ2hlY2tlciggd29yZHMsIGZhbHNlLCBsaCApOworCQltb2R1bGUudHJlZXdhbGsoIGNoZWNrZXIgKTsKKwkJaWYgKCFjaGVja2VyLm9rKCkpCisJCXsKKwkJCWxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwgbnVsbCwgIkVuY291bnRlcmVkIGVycm9ycyBkdXJpbmcgamF2YSBnZW5lcmF0aW9uLiIgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIG9rLCB3ZSdyZSByZWFkeSB0byBnZW5lcmF0ZSBjb2RlLiBtYWtlIHN1cmUgdGhlCisJCS8vIG91dHB1dCBkaXJlY3RvcmllcyBleGlzdC4KKworCQlPdXRwdXQgZGlyID0gb3B0aW9ucy5vdXRwdXQ7CisJCU91dHB1dCB0ZW1wbGF0ZURpciA9IG9wdGlvbnMudGVtcGxhdGVPdXRwdXQ7CisJCQorCQlTdHJpbmcgbSA9IG1vZHVsZS5uYW1lKCkubmFtZTsKKwkJaWYgKG0ubGVuZ3RoKCkgPiAwKQorCQl7CisJCQlkaXIgPSBkaXIubmV3UGFja2FnZSggbSApOworCQkJdGVtcGxhdGVEaXIgPSB0ZW1wbGF0ZURpci5uZXdQYWNrYWdlKCBtICk7CisJCX0KKwkJCisJCS8vIGdlbmVyYXRlIGNvZGUgZm9yIGVhY2ggc2VydmljZS4KKworCQlmb3IgKFNlcnZpY2UgaW50ZiA6IG1vZHVsZSkKKwkJeworCQkJZ2VuZXJhdGUoIGludGYsIHdoYXQsIGRpciwgdGVtcGxhdGVEaXIgKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZSggZmluYWwgU2VydmljZSBpbnRmLCBTZXQ8U3RyaW5nPiB3aGF0LCBPdXRwdXQgZGlyLAorCQlPdXRwdXQgdGVtcGxhdGVEaXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl3aGF0ID0gcG9wdWxhdGVXaGF0KCB3aGF0ICk7CisKKwkJaWYgKHdoYXQuaXNFbXB0eSgpKQorCQl7CisJCQkvLyBsaC5sb2dNZXNzYWdlKCBsaC5MRVZFTF9FUlJPUiwgbnVsbCwgIlVzZXIgaGFzIHNlbGVjdGVkIE5PTkVcbiIgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZpbmFsIE1lc3NhZ2VEaXJlY3Rpb24gbXNnRGlyID0gZ2V0TWVzc2FnZURpcmVjdGlvbiggd2hhdCApOworCisJCWlmICh3aGF0LmNvbnRhaW5zKCBXSEFUX0lOVEYgKSkKKwkJeworCQkJLy8gR2VuZXJhdGUgdGhlIHZhbHVlIGZhY3RvcnkgZmlsZS4KKwkJCQorCQkJZ2VuZXJhdGVWZiggaW50ZiwgZGlyICk7CisJCisJCQkvLyBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlLCByZW1vdGUsIGFuZCBzdHViIGZpbGVzLgorCQorCQkJZ2VuZXJhdGVJbnRmUmVtb3RlU3R1YiggaW50ZiwgZGlyLCBtc2dEaXIsIE1lc3NhZ2VEaXJlY3Rpb24uQk9USCwgZmFsc2UgKTsKKwkKKwkJCWdlbmVyYXRlSW50ZlJlbW90ZVN0dWIoIGludGYsIGRpciwgbXNnRGlyLCBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUiwgdHJ1ZSApOworCQorCQkJZ2VuZXJhdGVJbnRmUmVtb3RlU3R1YiggaW50ZiwgZGlyLCBtc2dEaXIsIE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5ULCB0cnVlICk7CisJCisJCQkvLyBHZW5lcmF0ZSBoZWxwZXIgZmlsZS4KKwkKKwkJCWdlbmVyYXRlSGVscGVyKCBpbnRmLCBkaXIsIG1zZ0RpciApOworCQkJCisJCQkvLyBHZW5lcmF0ZSBiYXNlIGZpbGUuCisJCQkKKwkJCWdlbmVyYXRlQmFzZSggaW50ZiwgZGlyLCBtc2dEaXIgKTsKKwkKKwkJCS8vIEdlbmVyYXRlIHJlYWRtZSBmaWxlLgorCQkJCisJCQlnZW5lcmF0ZVJlYWRtZSggaW50ZiwgZGlyLCBtc2dEaXIgKTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIG1haW4gdGVtcGxhdGUgZmlsZS4KKworCQlpZiAod2hhdC5jb250YWlucyggV0hBVF9NQUlOICkpCisJCQlnZW5lcmF0ZU1haW4oIGludGYsIHRlbXBsYXRlRGlyLCBtc2dEaXIgKTsKKworCQkvLyBHZW5lcmF0ZSBpbXBsIHRlbXBsYXRlIGZpbGUuCisKKwkJaWYgKHdoYXQuY29udGFpbnMoIFdIQVRfSU1QTCApKQorCQkJZ2VuZXJhdGVJbXBsKCBpbnRmLCB0ZW1wbGF0ZURpciwgbXNnRGlyICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUmVhZG1lKCBmaW5hbCBTZXJ2aWNlIGludGYsIE91dHB1dCBkaXIsCisJCWZpbmFsIE1lc3NhZ2VEaXJlY3Rpb24gbXNnRGlyICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZG9GaWxlKCBkaXIsICJyZWFkbWUtZXRjaC1jc2hhcnAtZmlsZXMudHh0IiwgbGgsIG5ldyBHZW4oKQorCQl7CisJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCWdlbmVyYXRlUmVhZG1lKCBwdywgaW50ZiwgbXNnRGlyICk7CisJCQl9CisJCX0gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVWZiggZmluYWwgU2VydmljZSBpbnRmLCBPdXRwdXQgZGlyICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZG9GaWxlKCBkaXIsIGdldFZmTmFtZSggaW50ZiApICsgZm5TdWZmaXgsIGxoLCBuZXcgR2VuKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlnZW5lcmF0ZVZmKCBwdywgaW50ZiApOworCQkJfQorCQl9ICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSGVscGVyKCBmaW5hbCBTZXJ2aWNlIGludGYsIE91dHB1dCBkaXIsCisJCWZpbmFsIE1lc3NhZ2VEaXJlY3Rpb24gbXNnRGlyICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZG9GaWxlKCBkaXIsIGdldEhlbHBlck5hbWUoIGludGYgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1biggUHJpbnRXcml0ZXIgcHcgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJZ2VuZXJhdGVIZWxwZXIoIHB3LCBpbnRmLCBtc2dEaXIgKTsKKwkJCX0KKwkJfSApOworCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZU1haW4oIGZpbmFsIFNlcnZpY2UgaW50ZiwgT3V0cHV0IGRpciwKKwkJTWVzc2FnZURpcmVjdGlvbiBtc2dEaXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAobXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USAorCQkJCXx8IG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLkNMSUVOVCkKKwkJCWRvRmlsZSggZGlyLCBnZXRNYWluTmFtZSggaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5DTElFTlQgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCQl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCWdlbmVyYXRlTWFpbiggcHcsIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5ULCBmYWxzZSApOworCQkJCX0KKwkJCX0gKTsKKworCQlpZiAobXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USAorCQkJCXx8IG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUikKKwkJCWRvRmlsZSggZGlyLCBnZXRNYWluTmFtZSggaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCQl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCWdlbmVyYXRlTWFpbiggcHcsIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uU0VSVkVSLCBmYWxzZSApOworCQkJCX0KKwkJCX0gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVCYXNlKCBmaW5hbCBTZXJ2aWNlIGludGYsIE91dHB1dCBkaXIsCisJCU1lc3NhZ2VEaXJlY3Rpb24gbXNnRGlyICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLkJPVEggfHwgbXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5UKQorCQkJZG9GaWxlKCBkaXIsIGdldEJhc2VOYW1lKCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLkNMSUVOVCApICsgZm5TdWZmaXgsIGxoLCBuZXcgR2VuKCkKKwkJCXsKKwkJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJCXsKKwkJCQkJZ2VuZXJhdGVCYXNlIChwdywgaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5DTElFTlQsIGZhbHNlICk7CisJCQkJfQorCQkJfSApOworCisJCWlmIChtc2dEaXIgPT0gTWVzc2FnZURpcmVjdGlvbi5CT1RIIHx8IG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUikKKwkJCWRvRmlsZSggZGlyLCBnZXRCYXNlTmFtZSggaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCQl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCWdlbmVyYXRlQmFzZSAocHcsIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uU0VSVkVSLCBmYWxzZSApOworCQkJCX0KKwkJCX0gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVJbXBsKCBmaW5hbCBTZXJ2aWNlIGludGYsIE91dHB1dCBkaXIsCisJCU1lc3NhZ2VEaXJlY3Rpb24gbXNnRGlyICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLkJPVEgKKwkJCQl8fCBtc2dEaXIgPT0gTWVzc2FnZURpcmVjdGlvbi5DTElFTlQpCisJCQlkb0ZpbGUoIGRpciwgZ2V0SW1wbE5hbWUoIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5UICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQkJeworCQkJCXB1YmxpYyB2b2lkIHJ1biggUHJpbnRXcml0ZXIgcHcgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQkJeworCQkJCQlnZW5lcmF0ZUltcGwoIHB3LCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLkNMSUVOVCwgZmFsc2UgKTsKKwkJCQl9CisJCQl9ICk7CisKKwkJaWYgKG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLkJPVEgKKwkJCQl8fCBtc2dEaXIgPT0gTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIpCisJCQlkb0ZpbGUoIGRpciwgZ2V0SW1wbE5hbWUoIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uU0VSVkVSICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQkJeworCQkJCXB1YmxpYyB2b2lkIHJ1biggUHJpbnRXcml0ZXIgcHcgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQkJeworCQkJCQlnZW5lcmF0ZUltcGwoIHB3LCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUiwgZmFsc2UgKTsKKwkJCQl9CisJCQl9ICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSW50ZlJlbW90ZVN0dWIoIGZpbmFsIFNlcnZpY2UgaW50ZiwgT3V0cHV0IGRpciwKKwkJZmluYWwgTWVzc2FnZURpcmVjdGlvbiB3aGF0LCBmaW5hbCBNZXNzYWdlRGlyZWN0aW9uIG1jLAorCQlmaW5hbCBib29sZWFuIGhhc0Jhc2VDbGFzcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIEdlbmVyYXRlIGludGVyZmFjZSBmaWxlCisKKwkJZG9GaWxlKCBkaXIsIGdldEludGZOYW1lKCBpbnRmLCBtYyApICsgZm5TdWZmaXgsIGxoLCBuZXcgR2VuKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlnZW5lcmF0ZUludGYoIHB3LCBpbnRmLCBtYywgaGFzQmFzZUNsYXNzICk7CisJCQl9CisJCX0gKTsKKworCQkvLyBHZW5lcmF0ZSByZW1vdGUgZmlsZQorCisJCWlmIChtYyA9PSBNZXNzYWdlRGlyZWN0aW9uLkJPVEggfHwgd2hhdCA9PSBNZXNzYWdlRGlyZWN0aW9uLkJPVEgKKwkJCQl8fCBtYyAhPSB3aGF0KQorCQkJZG9GaWxlKCBkaXIsIGdldFJlbW90ZU5hbWUoIGludGYsIG1jICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQkJeworCQkJCXB1YmxpYyB2b2lkIHJ1biggUHJpbnRXcml0ZXIgcHcgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQkJeworCQkJCQlnZW5lcmF0ZVJlbW90ZSggcHcsIGludGYsIG1jLCBoYXNCYXNlQ2xhc3MgKTsKKwkJCQl9CisJCQl9ICk7CisKKwkJLy8gR2VuZXJhdGUgc3R1YiBmaWxlCisKKwkJaWYgKG1jID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USCB8fCB3aGF0ID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USAorCQkJCXx8IG1jID09IHdoYXQpCisJCQlkb0ZpbGUoIGRpciwgZ2V0U3R1Yk5hbWUoIGludGYsIG1jICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQkJeworCQkJCXB1YmxpYyB2b2lkIHJ1biggUHJpbnRXcml0ZXIgcHcgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQkJeworCQkJCQlnZW5lcmF0ZVN0dWIoIHB3LCBpbnRmLCBtYywgaGFzQmFzZUNsYXNzICk7CisJCQkJfQorCQkJfSApOworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIHRoZSB2YWx1ZSBmYWN0b3J5IGZvciB0aGUgc2VydmljZS4KKwkgKgorCSAqIEBwYXJhbSBwdworCSAqIEBwYXJhbSBpbnRmCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwl2b2lkIGdlbmVyYXRlVmYoIFByaW50V3JpdGVyIHB3LCBTZXJ2aWNlIGludGYgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBwYXJhbXMga2VlcHMgdHJhY2sgb2YgdGhlIHRvdGFsIHNldCBvZiBwYXJhbWV0ZXJzCisJCS8vIG5hbWVkIChmb3IgZW51bXMsIHN0cnVjdHMsIGV4Y2VwdGlvbnMsIGFuZCBtZXNzYWdlcykuCisJCVNldDxTdHJpbmc+IHBhcmFtcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCWNvbnRleHQucHV0KCAidmVyc2lvbiIsIFZFUlNJT04gKTsKKwkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJY29udGV4dC5wdXQoICJwYXJhbXMiLCBwYXJhbXMgKTsKKwkJdmZfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2UuCisJICoKKwkgKiBAcGFyYW0gcHcKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBtYworCSAqIEBwYXJhbSBoYXNCYXNlQ2xhc3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVJbnRmKCBQcmludFdyaXRlciBwdywgU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jLAorCQlib29sZWFuIGhhc0Jhc2VDbGFzcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQljb250ZXh0LnB1dCggIm5vdyIsIG5ldyBEYXRlKCkgKTsKKwkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJY29udGV4dC5wdXQoICJpbnRmIiwgaW50ZiApOworCQljb250ZXh0LnB1dCggIm1jIiwgbWMgKTsKKwkJY29udGV4dC5wdXQoICJzdWZmaXgiLCBNc2dEaXJIZWxwZXIuZ2V0U3VmZml4KCBtYyApICk7CisJCWNvbnRleHQucHV0KCAiaGFzQmFzZUNsYXNzIiwgaGFzQmFzZUNsYXNzICk7CisJCWludGZfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIGNhbGwgdG8gbWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlLiBUaGlzIGNsYXNzCisJICogdHVybnMgY2FsbHMgb24gaXRzIG1ldGhvZHMgaW50byBtZXNzYWdlcyB3aGljaCBhcmUgc2VudCB0byB0aGUgcmVtb3RlCisJICogc3R1Yi4gRm9yIHR3by13YXkgY2FsbHMsIGl0IHRoZW4gd2FpdHMgZm9yIGEgcmVzcG9uc2UgbWVzc2FnZSwgcmV0dXJuaW5nCisJICogdGhlIHJlc3VsdCB0aGVyZWluIHRvIHRoZSBjYWxsZXIuCisJICoKKwkgKiBAcGFyYW0gcHcKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBtYworCSAqIEBwYXJhbSBoYXNCYXNlQ2xhc3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVSZW1vdGUoIFByaW50V3JpdGVyIHB3LCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMsCisJCWJvb2xlYW4gaGFzQmFzZUNsYXNzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmVsb2NpdHlDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7CisJCWNvbnRleHQucHV0KCAibm93IiwgbmV3IERhdGUoKSApOworCQljb250ZXh0LnB1dCggInZlcnNpb24iLCBWRVJTSU9OICk7CisJCWNvbnRleHQucHV0KCAiaGVscGVyIiwgdGhpcyApOworCQljb250ZXh0LnB1dCggImludGYiLCBpbnRmICk7CisJCWNvbnRleHQucHV0KCAibWMiLCBtYyApOworCQljb250ZXh0LnB1dCggInN1ZmZpeCIsIE1zZ0RpckhlbHBlci5nZXRTdWZmaXgoIG1jICkgKTsKKwkJY29udGV4dC5wdXQoICJoYXNCYXNlQ2xhc3MiLCBoYXNCYXNlQ2xhc3MgKTsKKwkJY29udGV4dC5wdXQoICJtZXRob2RMaXN0IiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQlyZW1vdGVfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIG1lc3NhZ2UgdG8gY2FsbCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBjbGFzcyBhY2NlcHRzIGEgbWVzc2FnZQorCSAqIGFuZCB0dXJucyBpdCBiYWNrIGludG8gYSBjYWxsIG9uIHRoZSB1c2VyJ3MgaW1wbGVtZW50YXRpb24uIEZvciB0d28td2F5CisJICogbWVzc2FnZXMsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgdXNlcidzIGltcGxlbWVudGF0aW9uIG1ldGhvZCBpcyB0dXJuZWQKKwkgKiBpbnRvIHRoZSBhcHByb3ByaWF0ZSByZXNwb25zZSBtZXNzYWdlIGFuZCBzZW50LgorCSAqCisJICogQHBhcmFtIHB3CisJICogQHBhcmFtIGludGYKKwkgKiBAcGFyYW0gbWMKKwkgKiBAcGFyYW0gaGFzQmFzZUNsYXNzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwl2b2lkIGdlbmVyYXRlU3R1YiggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYywKKwkJYm9vbGVhbiBoYXNCYXNlQ2xhc3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCWNvbnRleHQucHV0KCAidmVyc2lvbiIsIFZFUlNJT04gKTsKKwkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJY29udGV4dC5wdXQoICJtYyIsIG1jICk7CisJCWNvbnRleHQucHV0KCAic3VmZml4IiwgTXNnRGlySGVscGVyLmdldFN1ZmZpeCggbWMgKSApOworCQljb250ZXh0LnB1dCggImhhc0Jhc2VDbGFzcyIsIGhhc0Jhc2VDbGFzcyApOworCQlzdHViX3ZtLm1lcmdlKCBjb250ZXh0LCBwdyApOworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIHRoZSB0cmFuc3BvcnQgcGx1bWJpbmcgaGVscGVyLgorCSAqCisJICogQHBhcmFtIHB3CisJICogQHBhcmFtIGludGYKKwkgKiBAcGFyYW0gbWMKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVIZWxwZXIoIFByaW50V3JpdGVyIHB3LCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCWNvbnRleHQucHV0KCAidmVyc2lvbiIsIFZFUlNJT04gKTsKKwkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJY29udGV4dC5wdXQoICJtYyIsIG1jICk7CisKKwkJaGVscGVyX3ZtLm1lcmdlKCBjb250ZXh0LCBwdyApOworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIHRoZSByZWFkbWUudHh0LgorCSAqCisJICogQHBhcmFtIHB3CisJICogQHBhcmFtIGludGYKKwkgKiBAcGFyYW0gbWMKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVSZWFkbWUoIFByaW50V3JpdGVyIHB3LCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCWNvbnRleHQucHV0KCAidmVyc2lvbiIsIFZFUlNJT04gKTsKKwkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJY29udGV4dC5wdXQoICJtYyIsIG1jICk7CisKKwkJcmVhZG1lX3ZtLm1lcmdlKCBjb250ZXh0LCBwdyApOworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIHRoZSB0ZW1wbGF0ZSBtYWluIHByb2dyYW0uCisJICoKKwkgKiBAcGFyYW0gcHcKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBtYworCSAqIEBwYXJhbSBoYXNCYXNlQ2xhc3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVNYWluKCBQcmludFdyaXRlciBwdywgU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jLAorCQlib29sZWFuIGhhc0Jhc2VDbGFzcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQljb250ZXh0LnB1dCggIm5vdyIsIG5ldyBEYXRlKCkgKTsKKwkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJY29udGV4dC5wdXQoICJpbnRmIiwgaW50ZiApOworCQljb250ZXh0LnB1dCggIm1jIiwgbWMgKTsKKwkJY29udGV4dC5wdXQoICJzdWZmaXgiLCBNc2dEaXJIZWxwZXIuZ2V0U3VmZml4KCBtYyApICk7CisJCWNvbnRleHQucHV0KCAiaGFzQmFzZUNsYXNzIiwgaGFzQmFzZUNsYXNzICk7CisJCW1haW5fdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGVzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2VzLCB3aXRoIGVhY2gKKwkgKiBtZXRob2QgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHRvIHRoZSB0dW5lIHRoYXQgaXQgaXNuJ3QgaW1wbGVtZW50ZWQuCisJICogVXNlcidzIGltcGwgd2lsbCBleHRlbmQgdGhpcyBiYXNlIGltcGxlbWVudGF0aW9uLgorCSAqIEBwYXJhbSBwdworCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG1jCisJICogQHBhcmFtIGhhc0Jhc2VDbGFzcworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJdm9pZCBnZW5lcmF0ZUJhc2UoIFByaW50V3JpdGVyIHB3LCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMsCisJCWJvb2xlYW4gaGFzQmFzZUNsYXNzICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJCWNvbnRleHQucHV0KCAibm93IiwgbmV3IERhdGUoKSApOworCQkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCQljb250ZXh0LnB1dCggImludGYiLCBpbnRmICk7CisJCQljb250ZXh0LnB1dCggIm1jIiwgbWMgKTsKKwkJCWNvbnRleHQucHV0KCAic3VmZml4IiwgTXNnRGlySGVscGVyLmdldFN1ZmZpeCggbWMgKSApOworCQkJY29udGV4dC5wdXQoICJoYXNCYXNlQ2xhc3MiLCBoYXNCYXNlQ2xhc3MgKTsKKwkJCWNvbnRleHQucHV0KCAibWV0aG9kTGlzdCIsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKwkJCWJhc2Vfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIHRoZSB0ZW1wbGF0ZSB1c2VyIGltcGxlbWVudGlvbiBjbGFzcyB3aGljaCBleHRlbmRzIHRoZSBiYXNlCisJICogaW1wbGVtZW50YXRpb24gZ2VuZXJhdGVkIGFib3ZlLiBUaGlzIGNsYXNzIHdpbGwgb25seSBoYXZlIHRoZSBhcHByb3ByaWF0ZQorCSAqIGNvbnN0cnVjdG9yIGFuZCByZWZlcmVuY2UgdG8gdGhlIGFwcHJvcHJpYXRlIHJlbW90ZSwgYW5kIGEgY29tbWVudCBpbnZpdGluZworCSAqIHRoZSB1c2VyIHRvIG92ZXJyaWRlIG1ldGhvZHMuCisJICogQHBhcmFtIHB3CisJICogQHBhcmFtIGludGYKKwkgKiBAcGFyYW0gbWMKKwkgKiBAcGFyYW0gaGFzQmFzZUNsYXNzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwl2b2lkIGdlbmVyYXRlSW1wbCggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYywKKwkJYm9vbGVhbiBoYXNCYXNlQ2xhc3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCWNvbnRleHQucHV0KCAidmVyc2lvbiIsIFZFUlNJT04gKTsKKwkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJY29udGV4dC5wdXQoICJtYyIsIG1jICk7CisJCWNvbnRleHQucHV0KCAic3VmZml4IiwgTXNnRGlySGVscGVyLmdldFN1ZmZpeCggbWMgKSApOworCQljb250ZXh0LnB1dCggImhhc0Jhc2VDbGFzcyIsIGhhc0Jhc2VDbGFzcyApOworCQlpbXBsX3ZtLm1lcmdlKCBjb250ZXh0LCBwdyApOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFZmTmFtZSggU2VydmljZSBpbnRmICkKKwl7CisJCXJldHVybiAiVmFsdWVGYWN0b3J5IiArIGdldEludGZOYW1lKCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLkJPVEggKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRJbnRmTmFtZSggU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jICkKKwl7CisJCVN0cmluZyBzdWZmaXggPSBNc2dEaXJIZWxwZXIuZ2V0U3VmZml4KCBtYyApOworCQlyZXR1cm4gaW50Zi5uYW1lKCkgKyBzdWZmaXg7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TWFpbk5hbWUoIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYyApCisJeworCQlpZiAobWMgPT0gTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIpCisJCQlyZXR1cm4gIk1haW4iICsgaW50Zi5uYW1lKCkgKyAiTGlzdGVuZXIiOworCQlyZXR1cm4gIk1haW4iICsgZ2V0SW50Zk5hbWUoIGludGYsIG1jICk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0SW1wbE5hbWUoIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYyApCisJeworCQlyZXR1cm4gIkltcGwiICsgZ2V0SW50Zk5hbWUoIGludGYsIG1jICk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0UmVtb3RlTmFtZSggU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jICkKKwl7CisJCXJldHVybiAiUmVtb3RlIiArIGdldEludGZOYW1lKCBpbnRmLCBtYyApOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFN0dWJOYW1lKCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMgKQorCXsKKwkJcmV0dXJuICJTdHViIiArIGdldEludGZOYW1lKCBpbnRmLCBtYyApOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEhlbHBlck5hbWUoIFNlcnZpY2UgaW50ZiApCisJeworCQlyZXR1cm4gaW50Zi5uYW1lKCkgKyAiSGVscGVyIjsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZU5hbWUoIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYyApCisJeworCQlyZXR1cm4gIkJhc2UiICsgZ2V0SW50Zk5hbWUoIGludGYsIG1jICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBhc3luY1JlY2VpdmVyUG9vbE5hbWUoIE1lc3NhZ2UgbXNnICkKKwl7CisJCXJldHVybiBtc2cuZ2V0QXN5bmNSZWNlaXZlcigpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVWYWx1ZSggVHlwZVJlZiB0eXBlLCBUb2tlbiB2YWx1ZSApCisJeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJnZXRUeXBlVmFsdWUgY2FsbGVkIHdpdGg6ICIrdHlwZSsiOiAiK3ZhbHVlICk7CisJCVRva2VuIHQgPSB0eXBlLnR5cGUoKTsKKwkJc3dpdGNoICh0LmtpbmQpCisJCXsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuTE9ORzoKKwkJCQlyZXR1cm4gdmFsdWUuaW1hZ2UgKyAiTCI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUOgorCQkJCXJldHVybiB2YWx1ZS5pbWFnZSArICJGIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRE9VQkxFOgorCQkJCXJldHVybiB2YWx1ZS5pbWFnZSArICJEIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSSU5HOgorCQkJCXJldHVybiBwcm90ZWN0U3RyaW5nKCB2YWx1ZS5pbWFnZSApOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gdmFsdWUuaW1hZ2U7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBwcm90ZWN0U3RyaW5nKCBTdHJpbmcgcyApCisJeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJwcm90ZWN0U3RyaW5nIGNhbGxlZCB3aXRoOiAiK3MgKTsKKworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXNiLmFwcGVuZCggIlwiIiApOworCQlmb3IgKGNoYXIgYyA6IHMudG9DaGFyQXJyYXkoKSkKKwkJeworCQkJaWYgKGMgPT0gJ1x0JykKKwkJCXsKKwkJCQlzYi5hcHBlbmQoICJcXHQiICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYyA9PSAnXHInKQorCQkJeworCQkJCXNiLmFwcGVuZCggIlxcciIgKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjID09ICdcbicpCisJCQl7CisJCQkJc2IuYXBwZW5kKCAiXFxuIiApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGMgPT0gJ1wiJykKKwkJCXsKKwkJCQlzYi5hcHBlbmQoICJcXFwiIiApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGMgPT0gJ1xcJykKKwkJCXsKKwkJCQlzYi5hcHBlbmQoICJcXFxcIiApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGMgPj0gMzIgJiYgYyA8IDEyNykKKwkJCXsKKwkJCQlzYi5hcHBlbmQoIGMgKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNiLmFwcGVuZCggU3RyaW5nLmZvcm1hdCggIlxcdSUwNHgiLCAoaW50KSBjICkgKTsKKwkJfQorCQlzYi5hcHBlbmQoICJcIiIgKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcmV0dXJuIHR5cGUgbmFtZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGFzIGEgc3RydWN0dXJlIGVsZW1lbnQgb3IgZXhjZXB0aW9uCisJICogcGFyYW1ldGVyIG9yIGZ1bmN0aW9uIHBhcmFtZXRlciBvciByZXN1bHQuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSggVHlwZVJlZiB0eXBlICkKKwl7CisJCWlmICh0eXBlLmRpbSgpID4gMCkKKwkJCXJldHVybiBnZXROYXRpdmVUeXBlTmFtZSggdHlwZSApICsgZGltMnNwZWMoIHR5cGUuZGltKCkgKTsKKwkJcmV0dXJuIGdldFJlZlR5cGVOYW1lKCB0eXBlICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHR5cGUgdGhlIGV0Y2ggdHlwZQorCSAqIEByZXR1cm4gdGhlIGZ1bmRhbWVudGFsIG5hdGl2ZSB0eXBlIGZvciBqYXZhLiBzbyBldGNoIGludCAtPiBjc2hhcnAgaW50LAorCSAqIHdoaWxlIGV0Y2ggc3RyaW5nIC0+IGNzaGFycCBzdHJpbmcuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYXRpdmVUeXBlTmFtZSggVHlwZVJlZiB0eXBlICkKKwl7CisJCVRva2VuIHQgPSB0eXBlLnR5cGUoKTsKKwkJc3dpdGNoICh0LmtpbmQpCisJCXsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuVk9JRDoKKwkJCQlyZXR1cm4gInZvaWQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5CT09MRUFOOgorCQkJCXJldHVybiAiYm9vbCI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEU6CisJCQkJcmV0dXJuICJzYnl0ZSI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNIT1JUOgorCQkJCXJldHVybiAic2hvcnQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQ6CisJCQkJcmV0dXJuICJpbnQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5MT05HOgorCQkJCXJldHVybiAibG9uZyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUOgorCQkJCXJldHVybiAiZmxvYXQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6CisJCQkJcmV0dXJuICJkb3VibGUiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkc6CisJCQkJcmV0dXJuICJzdHJpbmciOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5PQkpFQ1Q6CisJCQkJcmV0dXJuICJPYmplY3QiOworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyB3ZSBoYXZlIHRvIHVzZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGhlcmUuCisJCQkJLy8gZmluZCB0aGUgYWN0dWFsIHR5cGUuLi4KKwkJCQlOYW1lZDw/PiBuID0gdHlwZS5pbnRmKCkuZ2V0KCB0LmltYWdlICk7CisJCQkJaWYgKG4gPT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJ1bmRlZmluZWQgb3IgYW1iaWd1b3VzIG5hbWUgYXQgbGluZSAlZDogJXMiLAorCQkJCQkJdC5iZWdpbkxpbmUsIHQuaW1hZ2UgKSApOworCQkJCXJldHVybiBuLmVmcW5hbWUoIHRoaXMgKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSB0eXBlIHRoZSBldGNoIHR5cGUKKwkgKiBAcmV0dXJuIHRoZSBmdW5kYW1lbnRhbCBuYXRpdmUgcmVmZXJlbmNlIHR5cGUgZm9yIGphdmEuIHNvIGV0Y2ggaW50IC0+CisJICogY3NoYXJwIGludD8sIHdoaWxlIGV0Y2ggc3RyaW5nIC0+IGNzaGFycCBzdHJpbmcuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0UmVmVHlwZU5hbWUoIFR5cGVSZWYgdHlwZSApCisJeworCQlUb2tlbiB0ID0gdHlwZS50eXBlKCk7CisJCXN3aXRjaCAodC5raW5kKQorCQl7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlZPSUQ6CisJCQkJcmV0dXJuICJ2b2lkIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQk9PTEVBTjoKKwkJCQlyZXR1cm4gImJvb2w/IjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQllURToKKwkJCQlyZXR1cm4gInNieXRlPyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNIT1JUOgorCQkJCXJldHVybiAic2hvcnQ/IjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuSU5UOgorCQkJCXJldHVybiAiaW50PyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkxPTkc6CisJCQkJcmV0dXJuICJsb25nPyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUOgorCQkJCXJldHVybiAiZmxvYXQ/IjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRE9VQkxFOgorCQkJCXJldHVybiAiZG91YmxlPyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUklORzoKKwkJCQlyZXR1cm4gInN0cmluZyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLk9CSkVDVDoKKwkJCQlyZXR1cm4gIk9iamVjdCI7CisJCQlkZWZhdWx0OgorCQkJeworCQkJCS8vIHdlIGhhdmUgdG8gdXNlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaGVyZS4KKwkJCQkvLyBmaW5kIHRoZSBhY3R1YWwgdHlwZS4uLgorCQkJCU5hbWVkPD8+IG4gPSB0eXBlLmludGYoKS5nZXQoIHQuaW1hZ2UgKTsKKwkJCQlpZiAobiA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkJInVuZGVmaW5lZCBvciBhbWJpZ3VvdXMgbmFtZSBhdCBsaW5lICVkOiAlcyIsCisJCQkJCQl0LmJlZ2luTGluZSwgdC5pbWFnZSApICk7CisJCQkJaWYgKG4uaXNFbnVteCgpKQorCQkJCQlyZXR1cm4gbi5lZnFuYW1lKCB0aGlzICkgKyAiPyI7CisJCQkJcmV0dXJuIG4uZWZxbmFtZSggdGhpcyApOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZGltMnNwZWMoIGludCBpICkKKwl7CisJCVN0cmluZyBzID0gIiI7CisJCXdoaWxlIChpLS0gPiAwKQorCQkJcyArPSAiW10iOworCQlyZXR1cm4gczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGZvcm1hdFN0cmluZyggUGFyYW1MaXN0PFNlcnZpY2U+IG4sIGJvb2xlYW4gaXNFeGNlcHQgKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uCisJeworCQlUb1N0cmluZyB0cyA9IChUb1N0cmluZykgbi5nZXRPcHQoICJUb1N0cmluZyIgKTsKKwkJTGlzdDxGbXRJdGVtPiBsaXN0OworCQlpZiAodHMgIT0gbnVsbCkKKwkJeworCQkJbGlzdCA9IHRzLmdldEZvcm1hdCgpOworCQkJbi5jaGVja0Zvcm1hdExpc3QoIHRzLmxpbmVubygpLCBsaXN0ICk7CisJCX0KKwkJZWxzZSBpZiAoaXNFeGNlcHQpCisJCXsKKwkJCWxpc3QgPSBuLm1rRm9ybWF0TGlzdCggdHJ1ZSwgKChFeGNlcHQpbikuaGFzRXh0ZW5kcygpICk7CisJCQkvLyBUZW1wIEZpeCA6cmVtb3ZlIG9uY2UgU2NvdHQgZml4ZXMgdGhlIFBhcmFtTGlzdCBjb2RlCisJCQltb2RpZnlGb3JtYXRMaXN0KGxpc3QsdHJ1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsaXN0ID0gbi5ta0Zvcm1hdExpc3QoIGZhbHNlLCAoKFN0cnVjdCluKS5oYXNFeHRlbmRzKCkgKTsKKy8vCQkJIFRlbXAgRml4IDpyZW1vdmUgb25jZSBTY290dCBmaXhlcyB0aGUgUGFyYW1MaXN0IGNvZGUKKwkJCW1vZGlmeUZvcm1hdExpc3QobGlzdCxmYWxzZSk7CisJCX0KKworCisJCWlmIChsaXN0LnNpemUoKSA9PSAxKQorCQl7CisJCQlyZXR1cm4gbGlzdC5nZXQoIDAgKS52YWx1ZSgpOworCQl9CisKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlzYi5hcHBlbmQoICJTdHJpbmcuRm9ybWF0KCAiICk7CisJCXNiLmFwcGVuZCggIlwiIiApOworCQlpbnQgaiA9IDA7CisJCWZvciAoRm10SXRlbSBpIDogbGlzdCkKKwkJeworCQkJaWYgKGkgaW5zdGFuY2VvZiBGaWVsZEl0ZW0pCisJCQl7CisJCQkJc2IuYXBwZW5kKCAieyIgKyBqICsgIn0iICk7CisJCQkJaisrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVzY2FwZSggc2IsICgoU3RyaW5nSXRlbSkgaSkudmFsdWUoKSApOworCQkJfQorCQl9CisJCWogPSAwOworCisJCXNiLmFwcGVuZCggIlwiIiApOworCQlmb3IgKEZtdEl0ZW0gaSA6IGxpc3QpCisJCXsKKwkJCWlmIChpIGluc3RhbmNlb2YgRmllbGRJdGVtKQorCQkJeworCQkJCXNiLmFwcGVuZCggIiwgIiApOworCQkJCXNiLmFwcGVuZCggKChGaWVsZEl0ZW0pIGkpLnZhbHVlKCkgKTsKKwkJCX0KKwkJfQorCQlzYi5hcHBlbmQoICIgKSIgKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGVzY2FwZSggU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgcyApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJU3RyaW5nUmVhZGVyIHJkciA9IG5ldyBTdHJpbmdSZWFkZXIoIHMgKTsKKwkJaW50IGM7CisJCXdoaWxlICgoYyA9IHJkci5yZWFkKCkpID49IDApCisJCXsKKwkJCWlmIChjID09ICciJykKKwkJCQlzYi5hcHBlbmQoICJcXFwiIiApOworCQkJZWxzZSBpZiAoYyA9PSAnXFwnKQorCQkJCXNiLmFwcGVuZCggIlxcXFwiICk7CisJCQllbHNlIGlmIChjID09ICdcdCcpCisJCQkJc2IuYXBwZW5kKCAiXFx0IiApOworCQkJZWxzZSBpZiAoYyA9PSAnXHInKQorCQkJCXNiLmFwcGVuZCggIlxcciIgKTsKKwkJCWVsc2UgaWYgKGMgPT0gJ1xuJykKKwkJCQlzYi5hcHBlbmQoICJcXG4iICk7CisJCQllbHNlCisJCQkJc2IuYXBwZW5kKCAoY2hhcikgYyApOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBtZnZuYW1lKCBTdHJpbmcgdm5hbWUgKQorCXsKKwkJcmV0dXJuICJfbWZfIiArIHZuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgbXR2bmFtZSggU3RyaW5nIHZuYW1lICkKKwl7CisJCXJldHVybiAiX210XyIgKyB2bmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldExhbmcoKQorCXsKKwkJcmV0dXJuICJjc2hhcnAiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZW51bV9lZnFuYW1lKCBTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwKKwkJU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZW51bU5hbWUgKQorCXsKKworLy8JCXJldHVybiBtb2R1bGVOYW1lICsgIi4iICsgIkNvbnN0cyIgKyBzZXJ2aWNlTmFtZSArICIuIiArIGVudW1OYW1lOworCQlyZXR1cm4gbW9kdWxlTmFtZSArICIuIiArICJ0eXBlcyIgKyAiLiIgKyBzZXJ2aWNlTmFtZSArICIuIiArIGVudW1OYW1lOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBleGNlcHRfZWZxbmFtZSggU3RyaW5nIGZxbmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUsCisJCVN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGV4Y2VwdE5hbWUgKQorCXsKKworLy8JCXJldHVybiBtb2R1bGVOYW1lICsgIi4iICsgIkNvbnN0cyIgKyBzZXJ2aWNlTmFtZSArICIuIiArIGV4Y2VwdE5hbWU7CisJCXJldHVybiBtb2R1bGVOYW1lICsgIi4iICsgInR5cGVzIiArICIuIiArIHNlcnZpY2VOYW1lICsgIi4iICsgZXhjZXB0TmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHN0cnVjdF9lZnFuYW1lKCBTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwKKwkJU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgc3RydWN0TmFtZSApCisJeworCisvLwkJcmV0dXJuIG1vZHVsZU5hbWUgKyAiLiIgKyAiQ29uc3RzIiArIHNlcnZpY2VOYW1lICsgIi4iICsgc3RydWN0TmFtZTsKKwkJcmV0dXJuIG1vZHVsZU5hbWUgKyAiLiIgKyAidHlwZXMiICsgIi4iICsgc2VydmljZU5hbWUgKyAiLiIgKyBzdHJ1Y3ROYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgcXVhbGlmeVBhcmFtZXRlck5hbWUoIFRva2VuIG5hbWUgKQorCXsKKwkJcmV0dXJuIG5hbWUuaW1hZ2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBxdWFsaWZ5Q29uc3RhbnROYW1lKCBTZXJ2aWNlIGludGYsIFRva2VuIG5hbWUgKQorCXsKKwkJU3RyaW5nIG1vZHVsZU5hbWUgPSBpbnRmLnBhcmVudCgpLm5hbWUoKS5uYW1lOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSBpbnRmLm5hbWUoKS5uYW1lOworCQlyZXR1cm4gbW9kdWxlTmFtZSArICIuIiArICJ0eXBlcyIgKyAiLiIgKyBzZXJ2aWNlTmFtZSArICIuIiArICJDb25zdHMiICsgc2VydmljZU5hbWUgKyAiLiIgKyBuYW1lLmltYWdlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgcXVhbGlmeUVudW1OYW1lKCBTZXJ2aWNlIGludGYsIFRva2VuIG5hbWUgKQorCXsKKwkJU3RyaW5nIG1vZHVsZU5hbWUgPSBpbnRmLnBhcmVudCgpLm5hbWUoKS5uYW1lOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSBpbnRmLm5hbWUoKS5uYW1lOworCQlyZXR1cm4gbW9kdWxlTmFtZSArICIuIiArICJ0eXBlcyIgKyAiLiIgKyBzZXJ2aWNlTmFtZSArICIuIiArICBuYW1lLmltYWdlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yKCBOYW1lZDw/PiBuYW1lZCApCisJeworCQlpZiAobmFtZWQgaW5zdGFuY2VvZiBQYXJhbWV0ZXIpCisJCXsKKwkJCVBhcmFtZXRlciBwYXJhbSA9IChQYXJhbWV0ZXIpIG5hbWVkOworCQkJVHlwZVJlZiB0eXBlID0gcGFyYW0udHlwZSgpOworCisJCQlpZiAodHlwZS5pc0J1aWx0aW4oKSkKKwkJCQlyZXR1cm4gIlZhbGlkYXRvcl8iICsgdHlwZS50eXBlKCkgKyAiLkdldCggIiArIHR5cGUuZGltKCkKKwkJCQkJKyAiICkiOworCisJCQlOYW1lZDw/PiBuID0gdHlwZS5nZXROYW1lZCggdHlwZS5pbnRmKCkgKTsKKworCQkJaWYgKG4uaXNCdWlsdGluKCkpCisJCQl7CisJCQkJQnVpbHRpbiBiID0gKEJ1aWx0aW4pIG47CisJCQkJU3RyaW5nIGNuID0gYi5jbGFzc05hbWUoKTsKKwkJCQlpZiAoY24uZW5kc1dpdGgoICI/IiApKQorCQkJCQljbiA9IGNuLnN1YnN0cmluZyggMCwgY24ubGVuZ3RoKCktMSApOworCQkJCQorCQkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVmFsaWRhdG9yX2N1c3RvbS5HZXQoIHR5cGVvZiglcyksICVkLCAlcyApIiwKKwkJCQkJY24sIHR5cGUuZGltKCksIGIuYWxsb3dTdWJjbGFzcygpICk7CisJCQl9CisKKwkJCS8vIEFsbG93IHN1YmNsYXNzaW5nIGZvciBldGNoIGRlZmluZWQgc3RydWN0cyBhbmQgZXh0ZXJucy4KKworCQkJaWYgKG4uaXNTdHJ1Y3QoKSB8fCBuLmlzRXhjZXB0KCkpCisJCQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJWYWxpZGF0b3JfY3VzdG9tLkdldCggdHlwZW9mKCVzKSwgJWQsIHRydWUgKSIsCisJCQkJCW4uZWZxbmFtZSggdGhpcyApLCB0eXBlLmRpbSgpICk7CisKKwkJCS8vIERvbid0IGFsbG93IHN1YmNsYXNzaW5nIGZvciBleHRlcm5zIG9yIGV0Y2ggZGVmaW5lZCBlbnVtcy4KKworCQkJaWYgKCEobi5pc0V4dGVybigpIHx8IG4uaXNFbnVteCgpKSkKKwkJCQlBc3NlcnRpb24uY2hlY2soIG4uaXNFeHRlcm4oKSB8fCBuLmlzRW51bXgoKSwKKwkJCQkJIm4uaXNFeHRlcm4oKSB8fCBuLmlzRW51bXgoKTogIituICk7CisKKwkJCXJldHVybiAiVmFsaWRhdG9yX2N1c3RvbS5HZXQoIHR5cGVvZiAoICIKKwkJCQkrIG4uZWZxbmFtZSggdGhpcyApICArICIgKSwgIiArIHR5cGUuZGltKCkKKwkJCQkrICIsIGZhbHNlICkiOworCQl9CisKKwkJaWYgKG5hbWVkIGluc3RhbmNlb2YgVGhyb3duKQorCQl7CisJCQlUaHJvd24gdGhyb3duID0gKFRocm93bikgbmFtZWQ7CisJCQlFeGNlcHQgZSA9IChFeGNlcHQpIHRocm93bi5nZXROYW1lZCgpOworCQkJcmV0dXJuICJWYWxpZGF0b3JfY3VzdG9tLkdldCggdHlwZW9mICggIiArIGUuZWZxbmFtZSggdGhpcyApCisJCQkJKyAiICkgLCAwLHRydWUgKSI7CisJCX0KKworCQlpZiAobmFtZWQgaW5zdGFuY2VvZiBJdGVtKQorCQkJcmV0dXJuICJWYWxpZGF0b3JfYm9vbGVhbi5HZXQoIDAgKSI7CisKKwkJcmV0dXJuICJudWxsIjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5hbWUgZm9yIGEgZ2V0dGVyIG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEdldHRlck5hbWUoIE5hbWUgbmFtZSApCisJeworCQlTdHJpbmcgcyA9IG5hbWUubmFtZTsKKwkJcmV0dXJuICJHZXQiICsgcy5zdWJzdHJpbmcoIDAsIDEgKS50b1VwcGVyQ2FzZSgpK3Muc3Vic3RyaW5nKCAxICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuYW1lIGZvciBhIHNldHRlciBtZXRob2QuCisJICovCisJcHVibGljIFN0cmluZyBnZXRTZXR0ZXJOYW1lKCBOYW1lIG5hbWUgKQorCXsKKwkJU3RyaW5nIHMgPSBuYW1lLm5hbWU7CisJCXJldHVybiAiU2V0IiArIHMuc3Vic3RyaW5nKCAwLCAxICkudG9VcHBlckNhc2UoKStzLnN1YnN0cmluZyggMSApOworCX0KKworCXByaXZhdGUgdm9pZCBtb2RpZnlGb3JtYXRMaXN0KExpc3Q8Rm10SXRlbT4gbGlzdCxib29sZWFuIGlzRXhjZXB0aW9uKSB7CisJCWZvcihpbnQgaT0wO2k8bGlzdC5zaXplKCk7aSsrKSB7CisJCQlGbXRJdGVtIGl0ZW0gPSBsaXN0LmdldCggaSApOworCisJCQlpZiAoaXRlbS52YWx1ZSgpLmNvbnRhaW5zKCAic3VwZXIuZ2V0TWVzc2FnZSgpIiApKSB7CisJCQkJbGlzdC5yZW1vdmUoIGkgKTsKKwkJCQlsaXN0LmFkZChpLCBuZXcgRmllbGRJdGVtKCAgImJhc2UuR2V0TWVzc2FnZSgpIiApICk7CisJCQl9CisJCQlpZiAoaXRlbS52YWx1ZSgpLmNvbnRhaW5zKCAic3VwZXIudG9TdHJpbmcoKSIgKSkgeworCQkJCWxpc3QucmVtb3ZlKCBpICk7CisJCQkJbGlzdC5hZGQoaSwgbmV3IEZpZWxkSXRlbSggICJiYXNlLlRvU3RyaW5nKCkiICkgKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZERlZmF1bHRzKCBTZXJ2aWNlIHNlcnZpY2UgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWFkZEJ1aWx0aW4oIHNlcnZpY2UsIG5ld05hbWUoICJMaXN0IiApLCAiU3lzdGVtLkNvbGxlY3Rpb25zLklMaXN0IiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiTWFwIiApLCAiU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5IiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiU2V0IiApLCAiU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZSIsIHRydWUgKTsKKwkJYWRkQnVpbHRpbiggc2VydmljZSwgbmV3TmFtZSggIkRhdGV0aW1lIiApLCAiU3lzdGVtLkRhdGVUaW1lPyIsIGZhbHNlICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhIGIvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmI3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5jc2hhcnAuY29tcGlsZXI7CisKKy8qKgorICogVGhlIHZlcnNpb24gaW5mbyBvZiB0aGlzIEV0Y2ggYmFja2VuZCAoY29tcGlsZXIpLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbXBpbGVyVmVyc2lvbgoreworCS8vIFRoaXMgZmlsZSBpcyBlZGl0ZWQgYnkgdGhlIHByb2R1Y3Rpb24gYnVpbGQgc3lzdGVtIHRvIHJlcGxhY2UgdGhlIHZhbHVlCisJLy8gb2YgVkVSU0lPTiBiZWxvdyB3aXRoIHdoYXRldmVyIGl0IHdhbnRzIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBhY3R1YWxseSBiZS4KKwkKKwkvKiogVGhlIHZlcnNpb24gb2YgdGhpcyBFdGNoIGJhY2tlbmQgKGNvbXBpbGVyKSAqLworCXB1YmxpYyBTdHJpbmcgVkVSU0lPTiA9ICJjc2hhcnAgMS4xLjAtaW5jdWJhdGluZyAoTE9DQUwtMCkiOworfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhLnRtcGwgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWMxN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhLnRtcGwKQEAgLTAsMCArMSwzMCBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmNzaGFycC5jb21waWxlcjsKKworLyoqCisgKiBUaGUgdmVyc2lvbiBpbmZvIG9mIHRoaXMgRXRjaCBiYWNrZW5kIChjb21waWxlcikuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29tcGlsZXJWZXJzaW9uCit7CisJLy8gVGhpcyBmaWxlIGlzIGVkaXRlZCBieSB0aGUgcHJvZHVjdGlvbiBidWlsZCBzeXN0ZW0gdG8gcmVwbGFjZSB0aGUgdmFsdWUKKwkvLyBvZiBWRVJTSU9OIGJlbG93IHdpdGggd2hhdGV2ZXIgaXQgd2FudHMgdGhlIHZlcnNpb24gc3RyaW5nIHRvIGFjdHVhbGx5IGJlLgorCQorCS8qKiBUaGUgdmVyc2lvbiBvZiB0aGlzIEV0Y2ggYmFja2VuZCAoY29tcGlsZXIpICovCisJcHVibGljIFN0cmluZyBWRVJTSU9OID0gImNzaGFycCBARXRjaExvbmdWZXJzaW9uQCAoQEV0Y2hCdWlsZFRhZ0ApIjsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL2Jhc2Uudm0gYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9iYXNlLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOGUyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9iYXNlLnZtCkBAIC0wLDAgKzEsMjc2IEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBlZGl0ZWQhCisvLyBSZS1pbXBsZW1lbnQgdGhlc2UgbWV0aG9kcyBieSBvdmVycmlkaW5nIHRoZW0gaW4gSW1wbCRpbnRmLm5hbWUoKSRzdWZmaXgKKy8vIG9yIGJ5IG1ha2luZyBhcHByb3ByaWF0ZSBhc3NpZ25tZW50cyB0byB0aGUgZGVsZWdhdGVzLgorI3NldCgkaSA9ICRpbnRmLm5hbWUoKSkKKyNzZXQoJHZmbmFtZSA9ICJWYWx1ZUZhY3RvcnkkaSIpCisjc2V0KCRpbnRmbmFtZSA9ICIkaSRzdWZmaXgiKQorI3NldCgkY2xuYW1lID0gIkJhc2UkaW50Zm5hbWUiKQorI2lmICgkaGVscGVyLmlzU2VydmVyKCRtYykpCisjc2V0KCRwZWVyID0gImNsaWVudCIpCisjc2V0KCRwZWVyY2xhc3MgPSAiUmVtb3RlJHtpfUNsaWVudCIpCisjZWxzZQorI3NldCgkcGVlciA9ICJzZXJ2ZXIiKQorI3NldCgkcGVlcmNsYXNzID0gIlJlbW90ZSR7aX1TZXJ2ZXIiKQorI2VuZAorCit1c2luZyBTeXN0ZW07CisKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNFeHRlcm4oKSkKKyNpZiAoJG4uaGFzSW1wb3J0KCAkaGVscGVyICkpCit1c2luZyAkbi5nZXRJbXBvcnQoICRoZWxwZXIgKTsKKyNlbmQKKyNlbmQKKyNlbmQKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEJhc2UgSW1wbGVtZW50YXRpb24gb2YgJGludGZuYW1lLCB3aXRoIGRlZmF1bHQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworLy8vIHdoaWNoIHRocm93IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi4gRWl0aGVyIGltcGxlbWVudCB0aGUgZGVsZWdhdGVzIG9yIGV4dGVuZAorLy8vIHRoaXMgY2xhc3MgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgJHBlZXIgCisvLy8gPC9zdW1tYXJ5PgorCituYW1lc3BhY2UgJGludGYucGFyZW50KCkubmFtZSgpCit7CisKKwkvLy88c3VtbWFyeT5DYWxsIHRvIG1lc3NhZ2UgdHJhbnNsYXRvciBmb3IgJGludGZuYW1lLjwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgJGNsbmFtZSA6ICRpbnRmbmFtZSwgT2JqU2Vzc2lvbgorCXsJCisjc2V0KCAkZGVsZWdhdGVUeXBlSGVhZGVyID0gIl9kZWxlZ2F0ZV90eXBlXyIgKQorI3NldCggJGRlbGVnYXRlVmFySGVhZGVyID0gIl9kZWxlZ2F0ZV8iICkKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCAoJG10aGQgaW4gJGludGYuaXRlcmF0b3IoKSkKKyNpZiAoJG10aGQuaXNNc2dEaXIoJG1jKSB8fCAkbXRoZC5pc01zZ0RpckJvdGgoKSkKKyNpZiAoISRtdGhkLmlzSGlkZGVuKCkpCisjaWYoISRtZXRob2RMaXN0LmNvbnRhaW5zKCIkZGVsZWdhdGVWYXJIZWFkZXIkbXRoZC5uYW1lKCkubmFtZSgpIikpCisjc2V0ICggJGFkZE1ldGhvZExpc3RTdGF0dXMgPSAkbWV0aG9kTGlzdC5hZGQoIiRkZWxlZ2F0ZVZhckhlYWRlciRtdGhkLm5hbWUoKS5uYW1lKCkiKSApCisJCS8vLyA8c3VtbWFyeT4KKyAgICAJLy8vIERlbGVnYXRlIERlZmluaXRpb247IFBsZWFzZSBkbyBub3QgbW9kaWZ5CisgICAgCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBkZWxlZ2F0ZSAkaGVscGVyLmdldFR5cGVOYW1lKCAkbXRoZC50eXBlKCkgKSAkZGVsZWdhdGVUeXBlSGVhZGVyJG10aGQubmFtZSgpCSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHBhcmFtIGluICRtdGhkLml0ZXJhdG9yKCkgKQorCQkJCQkJCQkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwYXJhbS50eXBlKCkgKSAkcGFyYW0ubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJCQkJCQkJCQkpOworCQkvLy8gPHN1bW1hcnk+CisgICAgCS8vLyBBZGQgeW91ciBpbXBsZW1lbnRhdGlvbiBtZXRob2QgdG8gdGhpcyB2YXJpYWJsZQorICAgIAkvLy8gPC9zdW1tYXJ5PgkJCQkJCQkKKwkJcHVibGljICRkZWxlZ2F0ZVR5cGVIZWFkZXIkbXRoZC5uYW1lKCkgICRkZWxlZ2F0ZVZhckhlYWRlciRtdGhkLm5hbWUoKTsKKworI2VuZAorI2VuZAorI2VuZAkKKyNlbmQKKyNmb3JlYWNoKCAkeCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJHguaXNNaXhpbigpICkKKworI3NldCggJG0gPSAkeC5nZXRNb2R1bGUoKSApCisjc2V0KCAkeiA9ICRtLml0ZXJhdG9yKCkubmV4dCgpICkKKworI2ZvcmVhY2goICRuIGluICR6Lm1lc3NhZ2VzKCB0cnVlICkgKQorI2lmKCRuLmlzTXNnRGlyKCRtYykgfHwgJG4uaXNNc2dEaXJCb3RoKCkgKQorI2lmKCEkbi5pc0hpZGRlbigpKQorI2lmKCEkbWV0aG9kTGlzdC5jb250YWlucygiJGRlbGVnYXRlVmFySGVhZGVyJG4ubmFtZSgpLm5hbWUoKSIpKQorI3NldCAoICRhZGRNZXRob2RMaXN0U3RhdHVzID0gJG1ldGhvZExpc3QuYWRkKCIkZGVsZWdhdGVWYXJIZWFkZXIkbi5uYW1lKCkubmFtZSgpIikgKQorI2lmKCRuLmlzT25ld2F5KCkpCisJCS8vLyA8c3VtbWFyeT4KKyAgICAJLy8vIERlbGVnYXRlIERlZmluaXRpb247IFBsZWFzZSBkbyBub3QgbW9kaWZ5CisgICAgCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBkZWxlZ2F0ZSAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkZGVsZWdhdGVUeXBlSGVhZGVyJG4ubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCSRzZXAkaGVscGVyLmdldFR5cGVOYW1lKCAkcC50eXBlKCkgKSAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCSk7CisJCQorCQkvLy8gPHN1bW1hcnk+CisgICAgCS8vLyBBZGQgeW91ciBpbXBsZW1lbnRhdGlvbiBtZXRob2QgdG8gdGhpcyB2YXJpYWJsZQorICAgIAkvLy8gPC9zdW1tYXJ5PgkJCQkJCQkKKwkJcHVibGljICRkZWxlZ2F0ZVR5cGVIZWFkZXIkbi5uYW1lKCkgICRkZWxlZ2F0ZVZhckhlYWRlciRuLm5hbWUoKTsKKwkKKyNlbHNlCisJCS8vLyA8c3VtbWFyeT4KKyAgICAJLy8vIERlbGVnYXRlIERlZmluaXRpb247IFBsZWFzZSBkbyBub3QgbW9kaWZ5CisgICAgCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBkZWxlZ2F0ZSAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkZGVsZWdhdGVUeXBlSGVhZGVyJG4ubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCSRzZXAkaGVscGVyLmdldFR5cGVOYW1lKCAkcC50eXBlKCkgKSAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJKTsKKwkKKwkJLy8vIDxzdW1tYXJ5PgorICAgIAkvLy8gQWRkIHlvdXIgaW1wbGVtZW50YXRpb24gbWV0aG9kIHRvIHRoaXMgdmFyaWFibGUKKyAgICAJLy8vIDwvc3VtbWFyeT4JCQkJCQkJCisJCXB1YmxpYyAkZGVsZWdhdGVUeXBlSGVhZGVyJG4ubmFtZSgpICAkZGVsZWdhdGVWYXJIZWFkZXIkbi5uYW1lKCk7CisJCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisKKwkKKwkJLy8vPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgJGNsbmFtZS48L3N1bW1hcnk+CisJCXB1YmxpYyAkY2xuYW1lKCkgCisJCXsKKwkJfQorCisJCXB1YmxpYyB2aXJ0dWFsIG9iamVjdCBfU2Vzc2lvblF1ZXJ5KE9iamVjdCBxdWVyeSkKKwkJeworCQkJdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiggInVua25vd24gcXVlcnk6ICIgKyBxdWVyeSk7CisJCX0KKworCQlwdWJsaWMgdmlydHVhbCB2b2lkIF9TZXNzaW9uQ29udHJvbChPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlKQorCQl7CisJCQl0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sOiAiICsgY29udHJvbCk7CisJCX0KKworCQlwdWJsaWMgdmlydHVhbCB2b2lkIF9TZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnRPYmopCisJCXsKKwkJCWlmIChldmVudE9iaiBpcyBFeGNlcHRpb24pCisJCQkJQ29uc29sZS5Xcml0ZUxpbmUoKEV4Y2VwdGlvbikgZXZlbnRPYmopOworCQl9ICAKKworCisjZm9yZWFjaCAoJG10aGQgaW4gJGludGYuaXRlcmF0b3IoKSkKKyNpZiAoJG10aGQuaXNNc2dEaXIoJG1jKSB8fCAkbXRoZC5pc01zZ0RpckJvdGgoKSkKKyNpZiAoISRtdGhkLmlzSGlkZGVuKCkpCisjaWYoISRtZXRob2RMaXN0LmNvbnRhaW5zKCRtdGhkLm5hbWUoKS5uYW1lKCkpKQorI3NldCAoICRhZGRNZXRob2RMaXN0U3RhdHVzID0gJG1ldGhvZExpc3QuYWRkKCRtdGhkLm5hbWUoKS5uYW1lKCkpICkKKwkJcHVibGljIHZpcnR1YWwgJGhlbHBlci5nZXRUeXBlTmFtZSggJG10aGQudHlwZSgpICkgJG10aGQubmFtZSgpICgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHBhcmFtIGluICRtdGhkLml0ZXJhdG9yKCkgKQorCQkJCSRzZXAkaGVscGVyLmdldFR5cGVOYW1lKCAkcGFyYW0udHlwZSgpICkgJHBhcmFtLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkpCisJCXsKKwkJaWYgKCRkZWxlZ2F0ZVZhckhlYWRlciRtdGhkLm5hbWUoKSAhPSBudWxsKQorCQkjaWYoJGhlbHBlci5nZXRUeXBlTmFtZSggJG10aGQudHlwZSgpICkuZXF1YWxzKCJ2b2lkIikpCisJCQkJJGRlbGVnYXRlVmFySGVhZGVyJG10aGQubmFtZSgpKCAKKwkJI3NldCggJHNlcCA9ICIiICkKKwkJCSNmb3JlYWNoKCAkcGFyYW0gaW4gJG10aGQuaXRlcmF0b3IoKSApCisJCQkkc2VwJHBhcmFtLm5hbWUoKQorCQkjc2V0KCAkc2VwID0gIiwiICkKKwkJCSNlbmQKKwkJCSk7CisJCSNlbHNlCisJCQkJcmV0dXJuICRkZWxlZ2F0ZVZhckhlYWRlciRtdGhkLm5hbWUoKSggCisJCSNzZXQoICRzZXAgPSAiIiApCisJCQkjZm9yZWFjaCggJHBhcmFtIGluICRtdGhkLml0ZXJhdG9yKCkgKQorCQkJJHNlcCRwYXJhbS5uYW1lKCkKKwkJI3NldCggJHNlcCA9ICIsIiApCisJCQkjZW5kCisJCQkpOworCQkjZW5kCisJCQllbHNlIAorCQkJCXRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oICIkbXRoZC5uYW1lKCkiICk7CisJCX0KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNmb3JlYWNoKCAkeCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJHguaXNNaXhpbigpICkKKworI3NldCggJG0gPSAkeC5nZXRNb2R1bGUoKSApCisjc2V0KCAkeiA9ICRtLml0ZXJhdG9yKCkubmV4dCgpICkKKworI2ZvcmVhY2goICRuIGluICR6Lm1lc3NhZ2VzKCB0cnVlICkgKQorI2lmKCRuLmlzTXNnRGlyKCRtYykgfHwgJG4uaXNNc2dEaXJCb3RoKCkgKQorI2lmKCEkbi5pc0hpZGRlbigpKQorI2lmKCEkbWV0aG9kTGlzdC5jb250YWlucygkbi5uYW1lKCkubmFtZSgpKSkKKyNzZXQgKCAkYWRkTWV0aG9kTGlzdFN0YXR1cyA9ICRtZXRob2RMaXN0LmFkZCgkbi5uYW1lKCkubmFtZSgpKSApCisjaWYoJG4uaXNPbmV3YXkoKSkKKwkJcHVibGljIHZpcnR1YWwgJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkgJG4ubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCSRzZXAkaGVscGVyLmdldFR5cGVOYW1lKCAkcC50eXBlKCkgKSAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJKQorCQl7CisJCQkJaWYgKCRkZWxlZ2F0ZVZhckhlYWRlciRuLm5hbWUoKSAhPSBudWxsKQorCQkJI2lmKCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRuLnR5cGUoKSApLmVxdWFscygidm9pZCIpKQorCQkJCSRkZWxlZ2F0ZVZhckhlYWRlciRuLm5hbWUoKSggCisJCSNzZXQoICRzZXAgPSAiIiApCisJCQkjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkkc2VwJHAubmFtZSgpCisJCSNzZXQoICRzZXAgPSAiLCIgKQorCQkJI2VuZAorCQkJKTsKKwkJCSNlbHNlCisJCQkJcmV0dXJuICRkZWxlZ2F0ZVZhckhlYWRlciRuLm5hbWUoKSggCisJCSNzZXQoICRzZXAgPSAiIiApCisJCQkjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkkc2VwJHAubmFtZSgpCisJCSNzZXQoICRzZXAgPSAiLCIgKQorCQkJI2VuZAorCQkJKTsKKwkJI2VuZAorCQkJZWxzZSAKKwkJCQl0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCAiJG4ubmFtZSgpIiApOworCQkKKwl9CisjZWxzZQorCQlwdWJsaWMgdmlydHVhbCAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkpCisJCXsKKwkJCWlmICgkZGVsZWdhdGVWYXJIZWFkZXIkbi5uYW1lKCkgIT0gbnVsbCkKKwkJI2lmKCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRuLnR5cGUoKSApLmVxdWFscygidm9pZCIpKQorCQkgCSRkZWxlZ2F0ZVZhckhlYWRlciRuLm5hbWUoKSggCisJCSNzZXQoICRzZXAgPSAiIiApCisJCQkjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkkc2VwJHAubmFtZSgpCisJCSNzZXQoICRzZXAgPSAiLCIgKQorCQkJI2VuZAorCQkJKTsKKwkJI2Vsc2UKKwkJCQlyZXR1cm4gJGRlbGVnYXRlVmFySGVhZGVyJG4ubmFtZSgpKCAKKwkJI3NldCggJHNlcCA9ICIiICkKKwkJCSNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCSRzZXAkcC5uYW1lKCkKKwkJI3NldCggJHNlcCA9ICIsIiApCisJCQkjZW5kCisJCQkpOworCQkjZW5kCisJCQllbHNlIAorCQkJCXRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oICIkbi5uYW1lKCkiICk7CisJCX0KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvY3NoYXJwS2V5d29yZHMua3dkIGIvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvY3NoYXJwS2V5d29yZHMua3dkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDVlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9jc2hhcnBLZXl3b3Jkcy5rd2QKQEAgLTAsMCArMSwxNSBAQAorIyAkSWQkCisjIAorIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIG9mIHRoZSBMaWNlbnNlIGF0CisjICAKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL2hlbHBlci52bSBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL2hlbHBlci52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWYwYjNkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvaGVscGVyLnZtCkBAIC0wLDAgKzEsMTY0IEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBlZGl0ZWQhCisjc2V0KCRpID0gJGludGYubmFtZSgpKQorCit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCisvLy8gPHN1bW1hcnk+CisvLy8gVHJhbnNwb3J0IGhlbHBlciBmb3IgJHtpfS4KKy8vLyA8L3N1bW1hcnk+CituYW1lc3BhY2UgJGludGYucGFyZW50KCkubmFtZSgpCit7CisgICAgcHVibGljIGNsYXNzICR7aX1IZWxwZXIgOiBUcmFuc3BvcnRIZWxwZXIKKyAgICB7CisjaWYgKCAkaGVscGVyLmlzU2VydmVyKCRtYykgfHwgJGhlbHBlci5pc0JvdGgoJG1jKSApCisKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgYSBuZXcgc2VydmVyIHNlc3Npb24gbGlzdGVuZXIgcGVyIHNwZWNpZmljYXRpb25zCisJCS8vLyBpbiB1cmkgYW5kIHJlc291cmNlcy48L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0idXJpIj4gY29udGFpbnMgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBzZXJ2ZXIgc2Vzc2lvbgorCQkvLy8gbGlzdGVuZXIgYW5kIGZvciB0aGUgc2VydmVyIHNlc3Npb24gdHJhbnNwb3J0IHN0YWNrLjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0icmVzb3VyY2VzIj4gYWRkaXRpb25hbCByZXNvdXJjZXMgdG8gYWlkIGluIGNvbnN0cnVjdGluZworCQkvLy8gbmV3IHNlcnZlciBzZXNzaW9ucy48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9ImltcGxGYWN0b3J5Ij4gY2FsbGVkIHVwb24gYWNjZXB0aW5nIGEgbmV3IHNlcnZlciBzZXNzaW9uIHRvCisJCS8vLyBjb25zdHJ1Y3QgYSBuZXcgc2VydmVyIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBtZXNzYWdlcworCQkvLy8gZnJvbSB0aGUgY2xpZW50IGR1cmluZyB0aGUgc2Vzc2lvbi48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+IGFuIG91dC1vZi1iYW5kIHNvdXJjZSB0aGF0IG1heSBiZSB1c2VkIHRvIGNvbnRyb2wKKwkJLy8vIHRoZSBsaXN0ZW5lci48L3JldHVybnM+CisKKwkJcHVibGljIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IE5ld0xpc3RlbmVyKCBzdHJpbmcgdXJpLAkJCisJCQlSZXNvdXJjZXMgcmVzb3VyY2VzLCAke2l9U2VydmVyRmFjdG9yeSBpbXBsRmFjdG9yeSApCisJCXsKKwkJCVJlc291cmNlcyByZXMgPSBJbml0UmVzb3VyY2VzKHJlc291cmNlcyk7CisJCQlUcmFuc3BvcnQ8U2VydmVyRmFjdG9yeT4gbGlzdGVuZXIgPSBUcmFuc3BvcnRGYWN0b3J5LkdldExpc3RlbmVyKHVyaSwgcmVzKTsKKwkJCXJldHVybiBuZXcgTXlTZXJ2ZXJGYWN0b3J5KGxpc3RlbmVyLCBpbXBsRmFjdG9yeSk7CisJCX0KKwkJCisJCXB1YmxpYyBjbGFzcyBNeVNlcnZlckZhY3RvcnkgOiBEZWZhdWx0U2VydmVyRmFjdG9yeQorCQl7CisJCQlwdWJsaWMgTXlTZXJ2ZXJGYWN0b3J5KFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBsaXN0ZW5lciwgJHtpfVNlcnZlckZhY3RvcnkgaW1wbEZhY3RvcnkgKQorCQkJCTogYmFzZShsaXN0ZW5lciwgaW1wbEZhY3RvcnkpCisJCQl7CisJCQkJX2xpc3RlbmVyID0gbGlzdGVuZXI7CisJCQkJX2ltcGxGYWN0b3J5ID0gaW1wbEZhY3Rvcnk7CisJCQl9CisKKwkJICAgIHByaXZhdGUgcmVhZG9ubHkgVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+IF9saXN0ZW5lcjsKKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSAke2l9U2VydmVyRmFjdG9yeSBfaW1wbEZhY3Rvcnk7CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE5ld1NlcnZlcihUcmFuc3BvcnRNZXNzYWdlIG0sIHN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisJCQl7CisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5IHZmID0gKFZhbHVlRmFjdG9yeSlyZXNvdXJjZXMuR2V0KFRyYW5zcG9ydENvbnN0cy5WQUxVRV9GQUNUT1JZKTsKKyAgICAgICAgICAgICAgICBNYWlsYm94TWFuYWdlciByID0gbmV3IFBsYWluTWFpbGJveE1hbmFnZXIobSwgdXJpLCByZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIERlbGl2ZXJ5U2VydmljZSBkID0gbmV3IERlZmF1bHREZWxpdmVyeVNlcnZpY2UociwgdXJpLCByZXNvdXJjZXMpOworCQkJCVJlbW90ZSR7aX1DbGllbnQgY2xpZW50ID0gbmV3IFJlbW90ZSR7aX1DbGllbnQoZCwgdmYpOworCQkJCSR7aX1TZXJ2ZXIgc2VydmVyID0gX2ltcGxGYWN0b3J5Lk5ldyR7aX1TZXJ2ZXIoY2xpZW50KTsKKyAgICAgICAgICAgICAgICBQb29sIHFwID0gKFBvb2wpcmVzb3VyY2VzW1FVRVVFRF9QT09MXTsKKyAgICAgICAgICAgICAgICBQb29sIGZwID0gKFBvb2wpcmVzb3VyY2VzW0ZSRUVfUE9PTF07CisJCQkJbmV3IFN0dWIke2l9U2VydmVyKGQsIHNlcnZlciwgcXAsIGZwKTsKKwkJCQljbGllbnQuX1N0YXJ0KCk7CisJCQl9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWx1ZUZhY3RvcnkgTmV3VmFsdWVGYWN0b3J5KHN0cmluZyB1cmkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUZhY3Rvcnkke2l9KHVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiJHtpfUhlbHBlci5TZXJ2ZXJGYWN0b3J5LyIgKyBfbGlzdGVuZXI7CisgICAgICAgICAgICB9CisJCX0KKwkJCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEZhY3RvcnkgZm9yIGEgTGlzdGVuZXIgdG8gdXNlIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mICR7aX1TZXJ2ZXIuCisJCS8vLyA8L3N1bW1hcnk+CisJCQorCQlwdWJsaWMgaW50ZXJmYWNlICR7aX1TZXJ2ZXJGYWN0b3J5CisJCXsKKwkJCS8vLyA8cGFyYW0gbmFtZT0iY2xpZW50Ij4gYW4gUmVtb3RlJHtpfUNsaWVudCBpbnN0YW5jZSBmb3Igc2VydmVyIGltcGxlbWVudGF0aW9uCisJCQkvLy8gdG8gdXNlIHRvIGNhbGwgYmFjayB0byB0aGUgY2xpZW50LjwvcGFyYW0+CisJCQkvLy8gPHJldHVybnM+IGFuIGluc3RhbmNlIG9mICR7aX1TZXJ2ZXIgKGUuZy4sIEltcGwke2l9U2VydmVyKSB0bworCQkJLy8vIGhhbmRsZSBtZXNzYWdlcyB3aGljaCBhcnJpdmUgZnJvbSB0aGUgY2xpZW50LjwvcmV0dXJucz4KKwkJCQorCQkJJHtpfVNlcnZlciBOZXcke2l9U2VydmVyKCBSZW1vdGUke2l9Q2xpZW50IGNsaWVudCApOworCQl9CQkKKyNlbmQKKyNpZiAoICRoZWxwZXIuaXNDbGllbnQoJG1jKSB8fCAkaGVscGVyLmlzQm90aCgkbWMpICkKKworCQkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyBhIG5ldyBjbGllbnQgc2Vzc2lvbiBwZXIgc3BlY2lmaWNhdGlvbnMgaW4gdXJpCisJCS8vLyBhbmQgcmVzb3VyY2VzLjwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPiBjb250YWlucyBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGNsaWVudCBzZXNzaW9uCisJCS8vLyB0cmFuc3BvcnQgc3RhY2suPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJyZXNvdXJjZXMiPiBhZGRpdGlvbmFsIHJlc291cmNlcyB0byBhaWQgaW4gY29uc3RydWN0aW5nCisJCS8vLyBuZXcgc2Vzc2lvbnMuPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJpbXBsRmFjdG9yeSI+ZmFjdG9yeSB1c2VkIHRvIGNvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBpbXBsZW1lbnRpbmcKKwkJLy8vICR7aX1DbGllbnQuIFRoZSBuZXcgaW5zdGFuY2Ugd2lsbCByZWNlaXZlIGFuZCBwcm9jZXNzIG1lc3NhZ2VzIGZyb20gdGhlCisJCS8vLwlzZXJ2ZXIgc2Vzc2lvbi48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+IG5ldyByZW1vdGUgc2VydmVyIGluc3RhbmNlIGluaXRpYWxpemVkIGJ5IHVyaQorCQkvLy8gYW5kIHJlc291cmNlcyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZW5kIG1lc3NhZ2VzIHRvIHRoZQorCQkvLy8gc2VydmVyIHNlc3Npb24uPC9yZXR1cm5zPgorCQkKKwkJcHVibGljIHN0YXRpYyBSZW1vdGUke2l9U2VydmVyIE5ld1NlcnZlciggc3RyaW5nIHVyaSwKKwkJCVJlc291cmNlcyByZXNvdXJjZXMsICR7aX1DbGllbnRGYWN0b3J5IGltcGxGYWN0b3J5ICkKKwkJeworCQkJcmVzb3VyY2VzID0gSW5pdFJlc291cmNlcyhyZXNvdXJjZXMpOworCQkJCisJCQlWYWx1ZUZhY3Rvcnkke2l9IHZmPSBuZXcgVmFsdWVGYWN0b3J5JHtpfSh1cmkpOworCQkJcmVzb3VyY2VzLkFkZCggVHJhbnNwb3J0Q29uc3RzLlZBTFVFX0ZBQ1RPUlksIHZmICk7CisJCQkKKwkJCVVSTCB1ID0gbmV3IFVSTCh1cmkpOworCisgICAgICAgICAgICBUcmFuc3BvcnRNZXNzYWdlIG0gPSBUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh1cmksIHJlc291cmNlcyk7CisgICAgICAgICAgICBNYWlsYm94TWFuYWdlciByID0gbmV3IFBsYWluTWFpbGJveE1hbmFnZXIobSwgdSwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIERlbGl2ZXJ5U2VydmljZSBkID0gbmV3IERlZmF1bHREZWxpdmVyeVNlcnZpY2UociwgdSwgcmVzb3VyY2VzKTsKKwkJCVJlbW90ZSR7aX1TZXJ2ZXIgc2VydmVyID0gbmV3IFJlbW90ZSR7aX1TZXJ2ZXIoZCwgdmYpOworCQkJJHtpfUNsaWVudCBjbGllbnQgPSBpbXBsRmFjdG9yeS5OZXcke2l9Q2xpZW50KHNlcnZlcik7CQkJCisJCQluZXcgU3R1YiR7aX1DbGllbnQoZCwKKwkJCQkJY2xpZW50LAorCQkJCQkoUG9vbCkgcmVzb3VyY2VzW1FVRVVFRF9QT09MXSwKKwkJCQkJKFBvb2wpIHJlc291cmNlc1tGUkVFX1BPT0xdKTsKKwkKKwkJCXJldHVybiBzZXJ2ZXI7CisJCX0KKwkJCisJCS8vLzxzdW1tYXJ5PgorCQkvLy9GYWN0b3J5IHVzZWQgYnkKKwkJLy8ve0BsaW5rICR7aX1IZWxwZXIjbmV3JHtpfVNlcnZlcihTdHJpbmcsIFJlc291cmNlcywgJHtpfUNsaWVudEZhY3RvcnkpfQorCQkvLy90byBjb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2UgaW1wbGVtZW50aW5nIHtAbGluayAke2l9Q2xpZW50fS4gVGhlIG5ldworCQkvLy9pbnN0YW5jZSB3aWxsIHJlY2VpdmUgYW5kIHByb2Nlc3MgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyIHNlc3Npb24uCisJCS8vLzwvc3VtbWFyeT4KKwkJCisJCXB1YmxpYyBpbnRlcmZhY2UgJHtpfUNsaWVudEZhY3RvcnkKKwkJeworCQkJLy8vPHN1bW1hcnk+CisJCQkvLy9Db25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIGltcGxlbWVudGluZyAke2l9Q2xpZW50LiBUaGUgbmV3CisJCQkvLy9pbnN0YW5jZSB3aWxsIHJlY2VpdmUgYW5kIHByb2Nlc3MgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyIHNlc3Npb24uPC9zdW1tYXJ5PgorCQkgCS8vLzxwYXJhbSBuYW1lPXNlcnZlcj4gYW4gaW5zdGFuY2Ugb2YgUmVtb3RlJHtpfVNlcnZlciB3aGljaCBtYXkgYmUgdXNlZCB0bworCQkJLy8vIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciBzZXNzaW9uLiA8L3BhcmFtPgorCQkJLy8vPHJldHVybnM+IG5ldyBpbnN0YW5jZSBpbXBsZW1lbnRpbmcgJHtpfUNsaWVudCAodHlwaWNhbGx5CisJCQkvLy9JbXBsJHtpfUNsaWVudCkuIDwvcmV0dXJucz4KKwkJCQorCQkJJHtpfUNsaWVudCBOZXcke2l9Q2xpZW50KCBSZW1vdGUke2l9U2VydmVyIHNlcnZlciApOwkJCQorCQl9CisjZW5kCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvaW1wbC52bSBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL2ltcGwudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhNGNhNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL2ltcGwudm0KQEAgLTAsMCArMSw3NSBAQAorIyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyMjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIyBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHlvdXIgY29udmVuaWVuY2UgYW5kIHdpbGwgbm90IGJlCisvLyBvdmVyd3JpdHRlbiBvbmNlIGl0IGV4aXN0cyEgUGxlYXNlIGVkaXQgdGhpcyBmaWxlIGFzIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQKKy8vIHlvdXIgc2VydmljZSBsb2dpYy4KKyNzZXQoJGkgPSAkaW50Zi5uYW1lKCkpCisjc2V0KCR2Zm5hbWUgPSAiVmFsdWVGYWN0b3J5JGkiKQorI3NldCgkaW50Zm5hbWUgPSAiJGkkc3VmZml4IikKKyNzZXQoJGNsbmFtZSA9ICJJbXBsJGludGZuYW1lIikKKyNzZXQoJGJhc2VjbG5hbWUgPSAiQmFzZSRpJHN1ZmZpeCIpCisjaWYgKCRoZWxwZXIuaXNTZXJ2ZXIoJG1jKSkKKyNzZXQoJHBlZXIgPSAiY2xpZW50IikKKyNzZXQoJHBlZXJjbGFzcyA9ICJSZW1vdGUke2l9Q2xpZW50IikKKyNlbHNlCisjc2V0KCRwZWVyID0gInNlcnZlciIpCisjc2V0KCRwZWVyY2xhc3MgPSAiUmVtb3RlJHtpfVNlcnZlciIpCisjZW5kCisKK3VzaW5nIFN5c3RlbTsKKworI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0V4dGVybigpKQorI2lmICgkbi5oYXNJbXBvcnQoICRoZWxwZXIgKSkKK3VzaW5nICRuLmdldEltcG9ydCggJGhlbHBlciApOworI2VuZAorI2VuZAorI2VuZAorCisjZm9yZWFjaCggJHggaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYoICR4LmlzTWl4aW4oKSApCisjc2V0KCAkbSA9ICR4LmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQordXNpbmcgJHttLm5hbWUoKX0udHlwZXMuJHoubmFtZSgpOworI2VuZAorI2VuZAorCit1c2luZyAke2ludGYucGFyZW50KCkubmFtZSgpfS50eXBlcy4ke2l9OworCisvLy88c3VtbWFyeT5Zb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiAkYmFzZWNsbmFtZS4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisvLy9pbXBsZW1lbnRhdGlvbiBvZiBtZXNzYWdlcyBmcm9tIHRoZSAkcGVlci4gPC9zdW1tYXJ5PgorbmFtZXNwYWNlICRpbnRmLnBhcmVudCgpLm5hbWUoKQoreworCS8vLzxzdW1tYXJ5PkltcGxlbWVudGF0aW9uIGZvciAkY2xuYW1lPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyAkY2xuYW1lIDogJGJhc2VjbG5hbWUKKwl7CisJCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSAkY2xuYW1lLjwvc3VtbWFyeT4KKyAJCS8vLyA8cGFyYW0gbmFtZT0iJHBlZXIiPmEgY29ubmVjdGlvbiB0byB0aGUgJHBlZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8KKyAJCS8vLyBzZW5kIGEgbWVzc2FnZSB0byB0aGUgJHBlZXIuPC9wYXJhbT4KKwkJcHVibGljICRjbG5hbWUoJHBlZXJjbGFzcyAkcGVlcikKKwkJeworCQkJdGhpcy4kcGVlciA9ICRwZWVyOworCQl9CisJCQorCQkvLy8gPHN1bW1hcnk+QSBjb25uZWN0aW9uIHRvIHRoZSAkcGVlciBzZXNzaW9uLiBVc2UgdGhpcyB0bworIAkJLy8vIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSAkcGVlci48L3N1bW1hcnk+CisJCXByaXZhdGUgcmVhZG9ubHkgJHBlZXJjbGFzcyAkcGVlcjsKKwkKKwkJLy8gVE9ETzogSW1wbGVtZW50IGRlbGVnYXRlcyBvciBwcm92aWRlIGltcGxlbWVudGF0aW9uIG9mICRpbnRmbmFtZQorCQkvLyBtZXNzYWdlcyBmcm9tIHRoZSAkcGVlcgkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvaW50Zi52bSBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL2ludGYudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2OGQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL2ludGYudm0KQEAgLTAsMCArMSwyOTYgQEAKKyMjIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisjIworIyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisjIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorIyMgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMjIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5OgorLy8gICAkdmVyc2lvbgorLy8gICAkbm93CisvLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCBzaG91bGQgbm90IGJlIGVkaXRlZCEKKwordXNpbmcgU3lzdGVtOworI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0V4dGVybigpKQorI2lmICgkbi5oYXNJbXBvcnQoICRoZWxwZXIgKSkKKwl1c2luZyAkbi5nZXRJbXBvcnQoICRoZWxwZXIgKTsKKyNlbmQKKyNlbmQKKyNlbmQKKworbmFtZXNwYWNlICRpbnRmLnBhcmVudCgpLm5hbWUoKQoreworI2lmKCAkaW50Zi5oYXNEZXNjcigpICkKKwkvLy88c3VtbWFyeT4KKyNmb3JlYWNoKCAkcyBpbiAkaW50Zi5kZXNjcigpICkKKwkvLy8kcworI2VuZAorCS8vLzwvc3VtbWFyeT4KKyNlbmQKKyNzZXQoJHNlcCA9ICI6IikKKyNpZiAoJGhhc0Jhc2VDbGFzcykKKwlwdWJsaWMgaW50ZXJmYWNlICRpbnRmLm5hbWUoKSRzdWZmaXggJHNlcCAkaW50Zi5uYW1lKCkKKyNzZXQgKCRzZXAgPSAiLCIpCisjZWxzZQorCXB1YmxpYyBpbnRlcmZhY2UgJGludGYubmFtZSgpJHN1ZmZpeAorI2VuZAorI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc01peGluKCkpCisJJHNlcCAkbi5mcW5hbWUoKSRzdWZmaXgKKyNzZXQoJHNlcCA9ICIsIikKKyNlbmQKKyNlbmQKKwl7CisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzTWVzc2FnZSgpKQorI2lmICgkbi5pc01zZ0RpcigkbWMpKQorI2lmICghJG4uaXNIaWRkZW4oKSkKKyNpZiAoJG4uaGFzRGVzY3IoKSkKKwkJLy8vPHN1bW1hcnk+CisjZm9yZWFjaCgkcyBpbiAkbi5kZXNjcigpKQorCQkvLy8kcworI2VuZAorCQkvLy88L3N1bW1hcnk+CisjZW5kCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisjc2V0KCRmaXJzdCA9IHRydWUpCisjc2V0ICgkY291bnQgPSAwKQorI2ZvcmVhY2goICRzIGluICRwLmRlc2NyKCkgKQorI2lmICgkZmlyc3QpCisjc2V0KCRjb3VudCA9ICRjb3VudCArIDEpCisjc2V0KCRmaXJzdCA9IGZhbHNlKQorCQkvLy88cGFyYW0gbmFtZT0iJHAubmFtZSgpIj4kcworI2Vsc2UKKwkJLy8vJHMKKyNlbmQKKyNlbmQKKyNpZiAoJGNvdW50ID4gMCkKKwkJLy8vPC9wYXJhbT4KKyNlbmQJCQorI2VuZAorI2lmICgkbi5oYXNSZXR1cm4oKSkKKyNzZXQoJGZpcnN0ID0gdHJ1ZSkKKyNmb3JlYWNoKCAkcyBpbiAkbi5yZXR1cm5EZXNjcigpICkKKyNpZiAoJGZpcnN0KQorI3NldCgkZmlyc3QgPSBmYWxzZSkKKwkJLy8vPHJldHVybnM+JHMKKyNlbHNlCisJCS8vLyRzCisjZW5kCisjZW5kCisJCS8vLzwvcmV0dXJucz4KKyNlbmQKKyNpZiAoJG4uaGFzVGhyb3duKCkpCisjaWYgKCRuLmhhc0Rlc2NyKCkpCisjZm9yZWFjaCgkdCBpbiAkbi50aHJvd24oKS5pdGVyYXRvcigpKQorCQkvLy88RXhjZXB0aW9uIGNyZWY9IiR0Lm5hbWUoKS5uYW1lKCkiPiB0aHJvd3MgJHQubmFtZSgpLm5hbWUoKTwvRXhjZXB0aW9uPgorI2VuZAorI2VuZAorI2VuZAorCQkkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkJKTsKKyNlbmQKKyNlbmQKKyNlbHNlaWYgKCRuLmlzQ29uc3RhbnQoKSkKKyNlbHNlaWYgKCRuLmlzRW51bXgoKSkKKyNlbHNlaWYgKCRuLmlzU3RydWN0KCkgfHwgJG4uaXNFeGNlcHQoKSkKKyNlbHNlaWYgKCRuLmlzRXh0ZXJuKCkpCisjIyBpZ25vcmUgZXh0ZXJuCisjZWxzZWlmICgkbi5pc01peGluKCkpCisjIyBpZ25vcmUgbWl4aW4KKyNlbHNlCisKKyNlbmQKKyNlbmQKKwl9CisjaWYgKCEkaGFzQmFzZUNsYXNzKQorCW5hbWVzcGFjZSB0eXBlcyAKKwl7CisJCW5hbWVzcGFjZSAkaW50Zi5uYW1lKCkkc3VmZml4CisJCXsKKwkJCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3RzJGludGYubmFtZSgpJHN1ZmZpeCAKKwkJCXsKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNDb25zdGFudCgpKQorI2lmICgkbi5oYXNEZXNjcigpKQorCQkJCS8vLzxzdW1tYXJ5PgorI2ZvcmVhY2goICRzIGluICRuLmRlc2NyKCkgKQorCQkJCS8vLyRzCisjZW5kCisJCQkJLy8vPC9zdW1tYXJ5PgorI2VuZAorCQkJCXB1YmxpYyBzdGF0aWMgJGhlbHBlci5nZXROYXRpdmVUeXBlTmFtZSggJG4udHlwZSgpICkgJG4ubmFtZSgpID0gJGhlbHBlci5nZXRUeXBlVmFsdWUoICRuLnR5cGUoKSwgJG4udmFsdWUoKSApOworI2VuZAorI2VuZAorCQkJfQorI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0VudW14KCkpCisjaWYgKCEkaGFzQmFzZUNsYXNzKQorI2lmICgkbi5oYXNEZXNjcigpKQorCQkJLy8vPHN1bW1hcnk+CisjZm9yZWFjaCggJHMgaW4gJG4uZGVzY3IoKSApCisJCQkvLy8kcworI2VuZAorCQkJLy8vPC9zdW1tYXJ5PgorI2VuZAorCQkJcHVibGljIGVudW0gJG4ubmFtZSgpCisJCQl7Cisjc2V0KCAkc2VwID0gIiIgKQkJCQkJCQorI2ZvcmVhY2goICRpIGluICRuLml0ZXJhdG9yKCkgKQorI2lmICgkaS5oYXNEZXNjcigpKQorCQkJCS8vLzxzdW1tYXJ5PgorI2ZvcmVhY2goICRzIGluICRpLmRlc2NyKCkgKQorCQkJCS8vLyRzCisjZW5kCisJCQkJLy8vPC9zdW1tYXJ5PgorI2VuZAorCQkJCSRzZXAkaS5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCX0JCisjZW5kCisjZWxzZWlmICgkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXhjZXB0KCkpCisjaWYgKCEkaGFzQmFzZUNsYXNzKQorI2lmICgkbi5oYXNEZXNjcigpKQorCQkJLy8vPHN1bW1hcnk+CisjZm9yZWFjaCggJHMgaW4gJG4uZGVzY3IoKSApCisJCQkvLy8kcworI2VuZAorCQkJLy8vPC9zdW1tYXJ5PgorI2VuZAorI2lmKCAkbi5oYXNFeHRlbmRzKCkgKQorCQkJcHVibGljIGNsYXNzICRuLm5hbWUoKQk6ICRuLmdldEV4dGVuZHMoKS5uYW1lKCkKKyNlbHNlCisjaWYoICRuLmlzRXhjZXB0KCkgKQorI2lmKCAkbi5pc1VuY2hlY2tlZCgpICkKKwkJCXB1YmxpYyBjbGFzcyAkbi5uYW1lKCkgOiBFeGNlcHRpb24KKyNlbHNlCisJCQlwdWJsaWMgY2xhc3MgJG4ubmFtZSgpIDogRXhjZXB0aW9uCisjZW5kCisjZWxzZQorCQkJW1NlcmlhbGl6YWJsZV0KKwkJCXB1YmxpYyBjbGFzcyAkbi5uYW1lKCkKKyNlbmQKKyNlbmQKKwkJCXsKKwkJCQorCQkJCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSAkbi5uYW1lKCkuIERvbid0IGluaXQgYW55dGhpbmcuPC9zdW1tYXJ5PgorCQkJCXB1YmxpYyAkbi5uYW1lKCkoKQorCQkJCXsKKwkJCQkJLy8gZG9uJ3QgaW5pdCBhbnl0aGluZy4KKwkJCQl9CisKKyNpZiAoJG4uaGFzQW55UGFyYW1ldGVycygpKQorCQkJCS8vLzxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlICRuLm5hbWUoKS48L3N1bW1hcnk+CisjZm9yZWFjaCggJGkgaW4gJG4uZ2V0QWxsUGFyYW1ldGVycygpICkKKyNpZiAoJGkuaGFzRGVzY3IoKSkKKwkJCQkvLy88cGFyYW0gbmFtZT0iJGkubmFtZSgpIj4KKyNmb3JlYWNoKCAkcyBpbiAkaS5kZXNjcigpICkKKwkJCQkvLy8kcworI2VuZAorCQkJCS8vLzwvcGFyYW0+CisjZW5kCisjZW5kCisJCQkJcHVibGljICRuLm5hbWUoKQorCQkJCSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJGkgaW4gJG4uZ2V0QWxsUGFyYW1ldGVycygpICkKKwkJCQkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRpLnR5cGUoKSApICRpLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkJCSkJCQorI2lmKCAkbi5oYXNFeHRlbmRzKCkgKQorCQkJIAk6IGJhc2UoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRpIGluICRuLmdldEV4dGVuZHMoKS5nZXRBbGxQYXJhbWV0ZXJzKCkgKQorCQkJCSRzZXAkaS5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCQkpCisJCQkJeworI2Vsc2UKKwkJCQl7CisjZW5kCisjZm9yZWFjaCggJGkgaW4gJG4uZ2V0UGFyYW1ldGVycygpICkKKwkJCQkJdGhpcy4kaS5uYW1lKCkgPSAkaS5uYW1lKCk7CisjZW5kCisJCQkJfQorI2VuZAorCisjaWYoICRuLmlzRXhjZXB0KCkgKQorI2lmICgkbi5oYXNFeHRlbmRzKCkpCisJCQkJcHVibGljIG5ldyBTdHJpbmcgR2V0TWVzc2FnZSgpCisjZWxzZQorCQkJCXB1YmxpYyBTdHJpbmcgR2V0TWVzc2FnZSgpCisjZW5kCisJCQkJeworCQkJCQlyZXR1cm4gJGhlbHBlci5mb3JtYXRTdHJpbmcoICRuLCB0cnVlICk7CisJCQkJfQorI2Vsc2UKKwkJCQlwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFRvU3RyaW5nKCkKKwkJCQl7CisJCQkJCXJldHVybiAkaGVscGVyLmZvcm1hdFN0cmluZyggJG4sIGZhbHNlICk7CisJCQkJfQorI2VuZAorCQorI2ZvcmVhY2goICRpIGluICRuLml0ZXJhdG9yKCkgKQorI2lmICgkaS5oYXNEZXNjcigpKQorCQkJCS8vLzxzdW1tYXJ5PgorI2ZvcmVhY2goICRzIGluICRpLmRlc2NyKCkgKQorCQkJCS8vLyRzCisjZW5kCisJCQkJLy8vPC9zdW1tYXJ5PgorI2VuZAorCQkJCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkaS50eXBlKCkgKSAkaS5uYW1lKCk7CisjaWYgKCRpLmhhc0Rlc2NyKCkpCQkJCQorCQkJCS8vLzxzdW1tYXJ5PkdldHMKKyNmb3JlYWNoKCAkcyBpbiAkaS5kZXNjcigpICkKKwkJIAkJLy8vJHMKKyNlbmQKKwkJCQkvLy88L3N1bW1hcnk+CisjZWxzZQorCQkJCS8vLzxzdW1tYXJ5PkdldHMgVmFsdWU8L3N1bW1hcnk+CisjZW5kCisJCQkJLy8vIDxyZXR1cm5zPnJldHVybiB0aGUgdmFsdWUuPC9yZXR1cm5zPgorCQkgCQlwdWJsaWMgJGhlbHBlci5nZXRUeXBlTmFtZSggJGkudHlwZSgpICkgJGhlbHBlci5nZXRHZXR0ZXJOYW1lKCAkaS5uYW1lKCkgKSgpCisJCQkJewkJCQkJCisJCQkJCQlyZXR1cm4gJGkubmFtZSgpOworCQkJCX0KKyNpZiAoJGkuaGFzRGVzY3IoKSkJCQkJCQorCQkJCS8vLzxzdW1tYXJ5PlNldHMKKyNmb3JlYWNoKCAkcyBpbiAkaS5kZXNjcigpICkKKwkJIAkJLy8vJHMKKyNlbmQKKwkJCQkvLy88L3N1bW1hcnk+CisjZWxzZQorCQkJCS8vLzxzdW1tYXJ5PlNldHMgVmFsdWU8L3N1bW1hcnk+CisjZW5kCisJCQkJLy8vPHBhcmFtIG5hbWU9InZhbHVlIj50aGUgdmFsdWU8L3BhcmFtPgorCQkJCXB1YmxpYyB2b2lkICRoZWxwZXIuZ2V0U2V0dGVyTmFtZSggJGkubmFtZSgpICkoICRoZWxwZXIuZ2V0VHlwZU5hbWUoICRpLnR5cGUoKSApIHZhbHVlICkKKwkJCQl7CisJCQkJCXRoaXMuJGkubmFtZSgpID0gdmFsdWU7CisJCQkJfQorI2VuZAorCQkJfQkKKyNlbmQKKyNlbHNlaWYgKCRuLmlzQnVpbHRpbigpKQorIyMgbm90aGluZyB0byBkby4KKyNlbHNlCQorI2VuZAorI2VuZAorCQl9CisJfQorI2VuZAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL21haW4udm0gYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9tYWluLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWJiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9tYWluLnZtCkBAIC0wLDAgKzEsMTA0IEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgeW91ciBjb252ZW5pZW5jZSBhbmQgd2lsbCBub3QgYmUKKy8vIG92ZXJ3cml0dGVuIG9uY2UgaXQgZXhpc3RzISBQbGVhc2UgZWRpdCB0aGlzIGZpbGUgYXMgbmVjZXNzYXJ5IHRvIGltcGxlbWVudAorLy8geW91ciBzZXJ2aWNlIGxvZ2ljLgorI3NldCgkaSA9ICRpbnRmLm5hbWUoKSkKKyNzZXQoJGludGZuYW1lID0gIiRpJHN1ZmZpeCIpCisjc2V0KCRiYXNlY2xuYW1lID0gIkJhc2UkaW50Zm5hbWUiKQorI3NldCgkY2xuYW1lID0gIkltcGwkaW50Zm5hbWUiKQorI2lmICgkaGVscGVyLmlzU2VydmVyKCRtYykpCisjc2V0KCRwZWVyID0gImNsaWVudCIpCisjc2V0KCRwZWVyY2xhc3MgPSAiUmVtb3RlJHtpfUNsaWVudCIpCisjZWxzZQorI3NldCgkcGVlciA9ICJzZXJ2ZXIiKQorI3NldCgkcGVlcmNsYXNzID0gIlJlbW90ZSR7aX1TZXJ2ZXIiKQorI2VuZAorCit1c2luZyBTeXN0ZW07CisjaWYgKCRoZWxwZXIuaXNTZXJ2ZXIoJG1jKSkKKwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCit1c2luZyAke2ludGYucGFyZW50KCkubmFtZSgpfS50eXBlcy4ke2l9OworI2Vsc2UKKwordXNpbmcgJHtpbnRmLnBhcmVudCgpLm5hbWUoKX0udHlwZXMuJHtpfTsKKyNlbmQgCisKK25hbWVzcGFjZSAkaW50Zi5wYXJlbnQoKS5uYW1lKCkKK3sKKyNpZiAoJGhlbHBlci5pc1NlcnZlcigkbWMpKQorCS8vLzxzdW1tYXJ5Pk1haW4gaW1wbGVtZW50YXRpb24gZm9yICR7aX1MaXN0ZW5lci48L3N1bW1hcnk+CisjZWxzZQorCS8vLzxzdW1tYXJ5Pk1haW4gaW1wbGVtZW50YXRpb24gZm9yICRpJHN1ZmZpeC48L3N1bW1hcnk+CisjZW5kCisjaWYgKCRoZWxwZXIuaXNTZXJ2ZXIoJG1jKSkKKwlwdWJsaWMgY2xhc3MgTWFpbiR7aX1MaXN0ZW5lciA6ICR7aX1IZWxwZXIuJHtpfVNlcnZlckZhY3RvcnkKKyNlbHNlCisJcHVibGljIGNsYXNzIE1haW4ke2l9Q2xpZW50IDogJHtpfUhlbHBlci4ke2l9Q2xpZW50RmFjdG9yeQorI2VuZAorCXsKKyNpZiAoJGhlbHBlci5pc1NlcnZlcigkbWMpKQorIAkJLy8vPHN1bW1hcnk+TWFpbiBmb3IgJHtpfUxpc3RlbmVyLjwvc3VtbWFyeT4KKyNlbHNlCisJCS8vLzxzdW1tYXJ5Pk1haW4gZm9yICR7aX1DbGllbnQ8L3N1bW1hcnk+CisjZW5kCisJCS8vLzxwYXJhbSBuYW1lPSJhcmdzIj5Db21tYW5kIExpbmUgQXJndW1lbnRzPC9wYXJhbT4KKwkJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oU3RyaW5nW10gYXJncykKKwkJeworCQkJLy8gVE9ETzogQ2hhbmdlIHRvIGNvcnJlY3QgVVJJCisJCQlzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAxIjsKKwkJCQorI2lmICgkaGVscGVyLmlzU2VydmVyKCRtYykpCisJCQlTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyID0gJHtpfUhlbHBlci5OZXdMaXN0ZW5lciggdXJpLCBudWxsLCBuZXcgTWFpbiR7aX1MaXN0ZW5lcigpKTsKKwkJCQorCQkJLy8gU3RhcnQgdGhlIExpc3RlbmVyCisJCQlsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKyNlbHNlCisJCQlSZW1vdGUke2l9U2VydmVyIHNlcnZlciA9ICR7aX1IZWxwZXIuTmV3U2VydmVyKCB1cmksIG51bGwsIG5ldyBNYWluJHtpfUNsaWVudCgpKTsKKwkJCisJCQkvLyBDb25uZWN0IHRvIHRoZSBzZXJ2aWNlCisJCQlzZXJ2ZXIuX1N0YXJ0QW5kV2FpdFVwKCA0MDAwICk7CisKKwkJCS8vIFRPRE86IEluc2VydCBZb3VyIENvZGUgSGVyZQorCisJCQkvLyBEaXNjb25uZWN0IGZyb20gdGhlIHNlcnZpY2UKKwkJCXNlcnZlci5fU3RvcEFuZFdhaXREb3duKCA0MDAwICk7CQkJCisjZW5kCisJCX0KKworI2lmICgkaGVscGVyLmlzU2VydmVyKCRtYykpCisJCS8vLzxzdW1tYXJ5PlJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiAke2l9U2VydmVyLjwvc3VtbWFyeT4KKwkJLy8vPHBhcmFtIG5hbWU9ImNsaWVudCI+UmVmZXJlbmNlIHRvIHJlbW90ZSBzZXJ2aWNlPC9wYXJhbT4KKwkJLy8vPHJldHVybnM+U2VydmVyIEltcGxlbWVudGF0aW9uPC9yZXR1cm5zPgorCQlwdWJsaWMgJHtpfVNlcnZlciBOZXcke2l9U2VydmVyKCBSZW1vdGUke2l9Q2xpZW50IGNsaWVudCApCisJCXsKKwkJCXJldHVybiBuZXcgSW1wbCR7aX1TZXJ2ZXIoIGNsaWVudCApOworCQl9CisjZWxzZQorCQkvLy88c3VtbWFyeT5SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgJHtpfUNsaWVudC48L3N1bW1hcnk+CisJCS8vLzxwYXJhbSBuYW1lPSJzZXJ2ZXIiPlJlZmVyZW5jZSB0byByZW1vdGUgc2VydmljZTwvcGFyYW0+CisJCS8vLzxyZXR1cm5zPkNsaWVudCBJbXBsZW1lbnRhdGlvbjwvcmV0dXJucz4KKwkJcHVibGljICR7aX1DbGllbnQgTmV3JHtpfUNsaWVudCggUmVtb3RlJHtpfVNlcnZlciBzZXJ2ZXIgKQorCQl7CisJCQlyZXR1cm4gbmV3IEltcGwke2l9Q2xpZW50KCBzZXJ2ZXIgKTsKKwkJfQorI2VuZAorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9yZWFkbWUudm0gYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9yZWFkbWUudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2ZGNlZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL3JlYWRtZS52bQpAQCAtMCwwICsxLDE0MCBAQAorIyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyMjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIyBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgZWRpdGVkIQorCitUaGlzIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGV0Y2gtZ2VuZXJhdGVkIGZpbGVzIGZvciB5b3VyIHNlcnZpY2UuCisKKy0tLS0tLS0tLS0tLS0tLS0KKy0gSG93IFRvIEJ1aWxkIC0KKy0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZXRjaCBmaWxlIGlzIGxvY2F0ZWQsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCitldGNoIC1xIC1kIC4gLUkgLiAtYiBjc2hhcnAgLXcgYWxsIEJsYWguZXRjaAorCitUaGlzIHdvdWxkIGNvbXBpbGUgdGhlIHNlcnZpY2UgZGVzY3JpcHRpb24gQmxhaC5ldGNoLCBnZW5lcmF0aW5nIGFsbCBjc2hhcnAgZmlsZXMsCitpbnRvIGNzaGFycCBuYW1lc3BhY2VzIHJvb3RlZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKC1kIC4pLCByZXNvbHZpbmcgaW5jbHVkZXMKK2FuZCBtaXhpbnMgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgKC1JIC4pIGFuZCBiZWluZyBxdWlldCBhYm91dCBpdCAoLXEpLgorCitBc3N1bWluZyB0aGUgQmxhaC5ldGNoIHNwZWNpZmllZCBhIG1vZHVsZSBvZiAiZGVtbyIgYW5kIGEgc2VydmljZSBvZiAiQmxhaCIsCit0aGUgY3NoYXJwIGZpbGVzIHdvdWxkIGJlIGdlbmVyYXRlZCBpbnRvIGEgc3ViLWRpcmVjdG9yeSBkZW1vIG9mIHRoZSBjdXJyZW50CitkaXJlY3RvcnkuIHlvdSBtYXkgbm93IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBhbmQgY29tcGlsZSB0aGUgcmVzdWx0aW5nIGZpbGVzOgorCitjZCBkZW1vCitjc2MgIi9yZWZlcmVuY2U6JUVUQ0hfSE9NRSVcbGliXEV0Y2g0Q1MuZGxsIiAvbWFpbjpkZW1vLk1haW5CbGFoTGlzdGVuZXIgKi5jcworY3NjICIvcmVmZXJlbmNlOiVFVENIX0hPTUUlXGxpYlxFdGNoNENTLmRsbCIgL21haW46ZGVtby5NYWluQmxhaENsaWVudCAqLmNzCisKKyhBc3N1bWluZyB3aW5kb3dzOyBmb3IgdW5peCwgcmVhZCB0aGUgbW9ubyBkaXJlY3Rpb25zLikKKworRGVwZW5kaW5nIHVwb24gaG93IGV0Y2ggd2FzIGluc3RhbGxlZCwgeW91IG1heSBuZWVkIHRvIGluc3RhbGwgdGhlIEV0Y2g0Q1MuZGxsCitpbnRvIHRoZSBzeXN0ZW0gZ2xvYmFsIGFzc2VtYmx5IGNhY2hlLiBUaGlzIGNvbW1hbmQgd2lsbCBkbyB0aGUgdHJpY2s6CisKK2NvcHkgL3kgIiVFVENIX0hPTUUlXGxpYlxFdGNoNENTLmRsbCIgJXdpbmRpciVcYXNzZW1ibHkKKworWW91IG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgYWZ0ZXIgZWFjaCBpbnN0YWxsYXRpb24gb2YgZXRjaC4gQW5kIG9uY2UgdGhlCitpbnN0YWxsZXIgaXMgZml4ZWQsIHlvdSB3b24ndCBuZWVkIHRvIGRvIGl0IGF0IGFsbC4KKworVG8gcnVuIHRoZSBzZXJ2aWNlICh3aGljaCBpbml0aWFsbHkgd29uJ3QgZG8gYW55dGhpbmcgYnV0IG1ha2UgYSBjb25uZWN0aW9uIGFuZAordGhlbiBjbG9zZSBpdCwgdXNlIHRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIGluIHNlcGFyYXRlIHNoZWxscyAoYWdhaW4sIGZyb20KK3RoZSBkZW1vIGRpcmVjdG9yeSk6CisKK01haW5CbGFoTGlzdGVuZXIKKworTWFpbkJsYWhDbGllbnQKKworVGhlIGZpcnN0IGNvbW1hbmQgKE1haW5CbGFoTGlzdGVuZXIpIHN0YXJ0cyB0aGUgc2VydmljZSBsaXN0ZW5lciB3aGljaCBhY2NlcHRzCitjb25uZWN0aW9ucy4gVGhlIHNlY29uZCBjb21tYW5kIChNYWluQmxhaENsaWVudCkgcnVucyBhIHNhbXBsZSBjbGllbnQsIHdoaWNoCittYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIHJ1bm5pbmcgbGlzdGVuZXIgYW5kIHRoZW4gY2xvc2VzIGl0IGFnYWluLgorCitPbmNlIHlvdSd2ZSBjb21waWxlZCB0aGUgc2VydmljZSBhbmQgdGVzdGVkIHRoZSByZXN1bHQsIHlvdSBtYXkgaW1wbGVtZW50IHlvdXIKK3NlcnZpY2UgYnkgYWRkaW5nIGNvbnRlbnQgdG8gdGhlIGV0Y2ggZmlsZSwgYWRkaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gdGhlCitJbXBsKi5jcyBhbmQgTWFpbiouY3MgZmlsZXMsIGFuZCByZWNvbXBpbGluZyB1c2luZyB0aGUgYWJvdmUgc3RlcHMuIFlvdSBtYXkgYWxzbworbG9hZCB0aGVzZSBmaWxlcyBpbnRvIGFuIElERSBzdWNoIGFzIHZpc3VhbCBzdHVkaW8sIG9yIHVzZSBhIGJ1aWxkIG1hbmFnZW1lbnQKK3N5c3RlbSBzdWNoIGFzIG1zYnVpbGQgb3IgbmFudC4gUmVtZW1iZXIsIHdoZW5ldmVyIHlvdSBjaGFuZ2UgdGhlIGV0Y2ggZmlsZSwgeW91CittdXN0IHJlLWV0Y2ggdGhlIHNlcnZpY2UgZGVzY3JpcHRpb24gYW5kIHRoZW4gcmUtY3NjIGFsbCB0aGUgY3MKK2ZpbGVzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tCistIEdlbmVyYXRlZCBGaWxlcyAtCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzIGZvciBhIHNlcnZpY2UgbmFtZWQgQmxhaC4KKworQmxhaC5jcworQmxhaENsaWVudC5jcworQmxhaFNlcnZlci5jcworCitUaGVzZSB0aHJlZSBmaWxlcyBhcmUgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgY2xhc3Nlcy4gU2VydmljZSBkZWZpbmVkIGNvbnN0YW50cworYW5kIHR5cGVzIGFyZSBpbiBCbGFoLmNzLCBhcyB3ZWxsIGFzIGRpcmVjdGlvbiAiYm90aCIgbWVzc2FnZXMsIHdoaWNoIGFyZQorbWVzc2FnZXMgd2hpY2ggYXJlIHNoYXJlZCBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLiBCbGFoQ2xpZW50LmNzIGFuZAorQmxhaFNlcnZlci5jcyBhcmUgcmVzcGVjdGl2ZWx5IHRoZSBtZXNzYWdlcyBmb3IganVzdCB0aGUgZGlyZWN0aW9uIGNsaWVudCBvcgorc2VydmVyLiBZb3Ugc2hvdWxkIG5vdCBlZGl0IHRoZXNlIGZpbGVzLgorCitSZW1vdGVCbGFoLmNzCitSZW1vdGVCbGFoQ2xpZW50LmNzCitSZW1vdGVCbGFoU2VydmVyLmNzCisKK1JlbW90ZUJsYWgqLmNzIGFyZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoZSBpbnRlcmZhY2VzLAord2l0aCBtZXNzYWdlIGltcGxlbWVudGF0aW9ucyB3aGljaCBlbmNvZGUgdGhlIG1lc3NhZ2UgdHlwZSBhbmQgYXJndW1lbnRzIGZvcgordHJhbnNwb3J0IHRvIHRoZSBjb25uZWN0aW9uIHBlZXIgYW5kIHRoZW4gcmVjZWl2ZSBhbmQgZGVjb2RlIGFueSByZXNwb25zZS4gWW91CitzaG91bGQgbm90IGVkaXQgdGhlc2UgZmlsZXMuCisKK1N0dWJCbGFoLmNzCitTdHViQmxhaENsaWVudC5jcworU3R1YkJsYWhTZXJ2ZXIuY3MKKworU3R1YkJsYWgqLmNzIGFyZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgd2hpY2ggcmVjZWl2ZSBtZXNzYWdlcyBlbmNvZGVkIGJ5CitSZW1vdGVCbGFoKi5jcyBhbmQgZGVjb2RlIHRoZW0sIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaW1wbGVtZW50YXRpb24KK2FuZCB0aGVuIGVuY29kaW5nIGFuZCBzZW5kaW5nIGFueSByZXN1bHQuIFlvdSBzaG91bGQgbm90IGVkaXQgdGhlc2UgZmlsZXMuCisKK1ZhbHVlRmFjdG9yeUJsYWguY3MKKworVmFsdWVGYWN0b3J5QmxhaC5jcyBpcyBhIGdlbmVyYXRlZCBjbGFzcyB3aGljaCBjb250YWlucyBoZWxwZXIgY29kZSB0bworc2VyaWFsaXplIHNlcnZpY2UgZGVmaW5lZCB0eXBlcyBhbmQgYWxzbyB0aGUgbWV0YSBkYXRhIHdoaWNoIGRlc2NyaWJlcyB0aGUKK21lc3NhZ2VzIGFuZCBmaWVsZHMsIGZpZWxkIHR5cGVzLCB0aW1lb3V0cywgZXRjLiBZb3Ugc2hvdWxkIG5vdCBlZGl0IHRoaXMgZmlsZS4KKworQmFzZUJsYWguY3MKK0Jhc2VCbGFoQ2xpZW50LmNzCitCYXNlQmxhaFNlcnZlci5jcworCitCYXNlQmxhaCouY3MgYXJlIGdlbmVyYXRlZCBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlcywgd2l0aAorbWVzc2FnZSBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggZG8gbm90aGluZyBidXQgdGhyb3cgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCitUaGV5IGNhbiBiZSB1c2VkIHRvIHN1cHBseSBhbiBpbXBsZW1lbnRhdGlvbiB3aGVuIHlvdSBkb24ndCB3YW50IHRvIGltbWVkaWF0ZWx5CitpbXBsZW1lbnQgYWxsIHRoZSBtZXNzYWdlcy4gWW91IHNob3VsZCBub3QgZWRpdCB0aGVzZSBmaWxlcy4KKworSW1wbEJsYWhDbGllbnQuY3MKK0ltcGxCbGFoU2VydmVyLmNzCisKK0ltcGxCbGFoKi5jcyBhcmUgdGhlIGdlbmVyYXRlZCBzYW1wbGUgY2xpZW50IGFuZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KK2NsYXNzZXMuIFRoZXkgZXh0ZW5kIHRoZSBnZW5lcmF0ZWQgYmFzZSBjbGFzc2VzLiBUaGVzZSBhcmUgdXNlZCBieSB0aGUgc2FtcGxlCittYWluIHByb2dyYW1zIHRvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBjbGllbnQgb3Igc2VydmVyIG1lc3NhZ2VzLiBFZGl0Cit0aGVzZSBmaWxlcyBhcyB5b3Ugd2lzaCB0byBpbXBsZW1lbnQgeW91ciBzZXJ2aWNlIChvdmVycmlkaW5nIHRoZSBkZWZhdWx0CitpbXBsZW1lbnRhdGlvbnMgZnJvbSB0aGUgZ2VuZXJhdGVkIGJhc2UgY2xhc3NlcykuCisKK0JsYWhIZWxwZXIuY3MKKworQmxhaEhlbHBlci5jcyBpcyBhIGdlbmVyYXRlZCBjbGFzcyB3aGljaCBpbmNsdWRlcyBzdGF0aWMgbWV0aG9kcyB0byBoZWxwCitjb25zdHJ1Y3QgdHJhbnNwb3J0cyBmb3IgY2xpZW50IGFuZCBsaXN0ZW5lci4gWW91IHNob3VsZCBub3QgZWRpdCB0aGlzIGZpbGUuCisKK01haW5CbGFoQ2xpZW50LmNzCitNYWluQmxhaExpc3RlbmVyLmNzCisKK01haW5CbGFoKi5jcyBhcmUgdGhlIGdlbmVyYXRlZCBzYW1wbGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWFpbiBwcm9ncmFtcy4KK1RoZXkgc2hvdyBob3cgdG8gc2V0dXAgYSB0cmFuc3BvcnQgYW5kIHN0YXJ0IGl0IGFuZCBob3cgdG8gY3JlYXRlIGEgc2Vzc2lvbi4KK0VkaXQgdGhlc2UgZmlsZXMgYXMgeW91IHdpc2ggdG8gaW1wbGVtZW50IHlvdXIgc2VydmljZSwgb3IganVzdCBjb3B5IHRoZSBjb2RlCitpbnRvIHlvdXIgb3duIGFwcGxpY2F0aW9uLgorCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9yZW1vdGUudm0gYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9yZW1vdGUudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliNDE3YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL3JlbW90ZS52bQpAQCAtMCwwICsxLDQ1MSBAQAorIyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyMjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIyBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgZWRpdGVkIQorI3NldCgkaSA9ICRpbnRmLm5hbWUoKSkKKyNzZXQoJHZmbmFtZSA9ICJWYWx1ZUZhY3RvcnkkaSIpCisjc2V0KCRpbnRmbmFtZSA9ICIkaSRzdWZmaXgiKQorI3NldCgkY2xuYW1lID0gIlJlbW90ZSRpbnRmbmFtZSIpCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlICRpbnRmLnBhcmVudCgpLm5hbWUoKQoreworCisjaWYgKCEkaGFzQmFzZUNsYXNzKQorI2VuZAorI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0V4dGVybigpKQorI2lmICgkbi5oYXNJbXBvcnQoICRoZWxwZXIgKSkKKwl1c2luZyAkbi5nZXRJbXBvcnQoICRoZWxwZXIgKTsKKyNlbmQKKyNlbmQKKyNlbmQKKwkvLy88c3VtbWFyeT5DYWxsIHRvIG1lc3NhZ2UgdHJhbnNsYXRvciBmb3IgJGludGZuYW1lLjwvc3VtbWFyeT4KKyNpZiAoJGhhc0Jhc2VDbGFzcykKKwlwdWJsaWMgY2xhc3MgJGNsbmFtZSA6IFJlbW90ZSRpLCAkaW50Zm5hbWUKKyNlbHNlCisJcHVibGljIGNsYXNzICRjbG5hbWUgOiBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQuUmVtb3RlQmFzZSwgJGludGZuYW1lCisjZW5kCisJeworI2lmICgkaGFzQmFzZUNsYXNzKQorCQkvLy88c3VtbWFyeT5DbGFzcyBJbnN0YW5jZSB1c2VkIHRvIGhpZGUgc3luY2hyb25vdXMgbWVzc2FnZSAKKwkJLy8vaW1wbGVtZW50YXRpb24uIFVzZSB0aGlzIHRvIGludm9rZSB0aGUgYXN5bmNocm9ub3VzIG1lc3NhZ2UKKwkJLy8vaW1wbGVtZW50YXRpb248L3N1bW1hcnk+IAorCQlwdWJsaWMgbmV3IHJlYWRvbmx5IF9Bc3luYyBfYXN5bmM7CisJCQorCQkvLy88c3VtbWFyeT5EZXByZWNhdGVkLjwvc3VtbWFyeT4KKwkJcHVibGljIG5ldyByZWFkb25seSBfQXN5bmMgX2lubmVyOworI2Vsc2UKKwkJLy8vPHN1bW1hcnk+Q2xhc3MgSW5zdGFuY2UgdXNlZCB0byBoaWRlIHN5bmNocm9ub3VzIG1lc3NhZ2UgCisJCS8vL2ltcGxlbWVudGF0aW9uLiBVc2UgdGhpcyB0byBpbnZva2UgdGhlIGFzeW5jaHJvbm91cyBtZXNzYWdlCisJCS8vL2ltcGxlbWVudGF0aW9uPC9zdW1tYXJ5PiAKKwkJcHVibGljIHJlYWRvbmx5IF9Bc3luYyBfYXN5bmM7CisJCQorCQkvLy88c3VtbWFyeT5EZXByZWNhdGVkLjwvc3VtbWFyeT4KKwkJcHVibGljIHJlYWRvbmx5IF9Bc3luYyBfaW5uZXI7CisjZW5kCisKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlICRjbG5hbWUuPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InN2YyI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ2ZiI+PC9wYXJhbT4KKwkJcHVibGljICRjbG5hbWUoIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydC5EZWxpdmVyeVNlcnZpY2Ugc3ZjLAorCQkJCU9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnLlZhbHVlRmFjdG9yeSB2ZiApCisJCQk6IGJhc2UoIHN2YywgdmYgKQorCQl7CisJCQlfYXN5bmMgPSBuZXcgX0FzeW5jKHRoaXMpOworCQkJX2lubmVyID0gX2FzeW5jOworI3NldCggJGsgPSAwICkKKyNmb3JlYWNoKCAkeCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJHguaXNNaXhpbigpICkKKyNzZXQoICRrID0gJGsgKyAxICkKKyNzZXQoICR2ID0gIl9taXhpbiRrIiApCisjc2V0KCAkbSA9ICR4LmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQorCQkJJHYgPSBuZXcgJHttLm5hbWUoKX0uUmVtb3RlJHoubmFtZSgpJHtzdWZmaXh9KCBzdmMsIHZmICk7CisjZW5kCisjZW5kCisJCX0KKworI2ZvcmVhY2ggKCRuIGluICRpbnRmLml0ZXJhdG9yKCkpCisjaWYgKCRuLmlzTXNnRGlyKCRtYykpCisjaWYgKCEkbi5pc0hpZGRlbigpKQorI2lmKCEkbWV0aG9kTGlzdC5jb250YWlucygkbi5uYW1lKCkubmFtZSgpKSkKKyNzZXQgKCAkYWRkTWV0aG9kTGlzdFN0YXR1cyA9ICRtZXRob2RMaXN0LmFkZCgkbi5uYW1lKCkubmFtZSgpKSkKKyNpZiAoJG4uaXNPbmV3YXkoKSkKKyNpZiAoJG4uaGFzRGVzY3IoKSkKKwkJLy8vPHN1bW1hcnk+CisjZm9yZWFjaCgkcyBpbiAkbi5kZXNjcigpKQorCQkvLy8kcworI2VuZAorCQkvLy88L3N1bW1hcnk+CisjZW5kCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisjc2V0KCRmaXJzdCA9IHRydWUpCisjc2V0ICgkY291bnQgPSAwKQorI2lmICgkcC5oYXNEZXNjcigpKQorI2ZvcmVhY2goICRzIGluICRwLmRlc2NyKCkgKQorI2lmICgkZmlyc3QpCisjc2V0KCRjb3VudCA9ICRjb3VudCArIDEpCisjc2V0KCRmaXJzdCA9IGZhbHNlKQorCQkvLy88cGFyYW0gbmFtZT0iJHAubmFtZSgpIj4kcworI2Vsc2UKKwkJLy8vJHMKKyNlbmQKKyNlbmQKKyNpZiAoJGNvdW50ID4gMCkKKwkJLy8vPC9wYXJhbT4KKyNlbmQKKyNlbmQKKyNlbmQKKyNpZiAoJG4uaGFzUmV0dXJuKCkpCisjc2V0KCRmaXJzdCA9IHRydWUpCisjc2V0ICgkcmV0Q291bnQgPSAwKQorI2lmICgkbi5oYXNEZXNjcigpKQorI2ZvcmVhY2goICRzIGluICRuLnJldHVybkRlc2NyKCkgKQorI2lmICgkZmlyc3QpCisjc2V0KCRyZXRDb3VudCA9ICRyZXRDb3VudCArIDEpCisjc2V0KCRmaXJzdCA9IGZhbHNlKQorCQkvLy88cmV0dXJucz4kcworI2Vsc2UKKwkJLy8vJHMKKyNlbmQKKyNlbmQKKyNpZiAoJHJldENvdW50ID4gMCkKKwkJLy8vPC9yZXR1cm5zPgorI2VuZAorI2VuZAorI2VuZAorI2lmICgkbi5oYXNUaHJvd24oKSkKKyNpZiAoJG4uaGFzRGVzY3IoKSkKKyNmb3JlYWNoKCR0IGluICRuLnRocm93bigpLml0ZXJhdG9yKCkpCisJCS8vLzxFeGNlcHRpb24gY3JlZj0iJHQubmFtZSgpLm5hbWUoKSI+IHRocm93cyAkdC5uYW1lKCkubmFtZSgpPC9FeGNlcHRpb24+CisjZW5kCisjZW5kCisjZW5kCisJCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkpCisJCXsKKwkJCU9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnLk1lc3NhZ2UgX21zZyA9IF9OZXdNZXNzYWdlKCAkdmZuYW1lLiRuLnZuYW1lKCAkaGVscGVyICkgKTsKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCV9tc2cuQWRkKCAkdmZuYW1lLiRwLnZuYW1lKCAkaGVscGVyICksICRwLm5hbWUoKSApOworI2VuZAorCQkJdHJ5CisJCQl7CisJCQkJX1NlbmQoIF9tc2cgKTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIF9lICkKKwkJCXsKKwkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAidW5leHBlY3RlZCIsIF9lICk7CisJCQl9CisJCX0KKyNlbHNlCisjaWYoJG4uaGFzRGVzY3IoKSkKKwkJLy8vPHN1bW1hcnk+CisjZm9yZWFjaCgkcyBpbiAkbi5kZXNjcigpKQorCQkvLy8kcworI2VuZAorCQkvLy88L3N1bW1hcnk+CisjZW5kCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisjc2V0KCRmaXJzdCA9IHRydWUpCisjaWYgKCRwLmhhc0Rlc2NyKCkpCisjZm9yZWFjaCggJHMgaW4gJHAuZGVzY3IoKSApCisjaWYgKCRmaXJzdCkKKyNzZXQoJGZpcnN0ID0gZmFsc2UpCisJCS8vLzxwYXJhbSBuYW1lPSIkcC5uYW1lKCkiPiRzCisjZWxzZQorCQkvLy8kcworI2VuZAorI2VuZAorCQkvLy88L3BhcmFtPgorI2VuZAorI2VuZAorI2lmICgkbi5oYXNSZXR1cm4oKSkKKyNzZXQoJGZpcnN0ID0gdHJ1ZSkKKyNzZXQoJHJldENvdW50ID0gMCkKKyNpZiAoJG4uaGFzRGVzY3IoKSkKKyNmb3JlYWNoKCAkcyBpbiAkbi5yZXR1cm5EZXNjcigpICkKKyNpZiAoJGZpcnN0KQorI3NldCgkZmlyc3QgPSBmYWxzZSkKKyNzZXQoJHJldENvdW50ID0gJHJldENvdW50ICsgMSkKKwkJLy8vPHJldHVybnM+JHMKKyNlbHNlCisJCS8vLyRzCisjZW5kCisjZW5kCisjaWYgKCRyZXRDb3VudCA+IDApCisJCS8vLzwvcmV0dXJucz4KKyNlbmQKKyNlbmQKKyNlbmQKKyNpZiAoJG4uaGFzVGhyb3duKCkpCisjaWYgKCRuLmhhc0Rlc2NyKCkpCisjZm9yZWFjaCgkdCBpbiAkbi50aHJvd24oKS5pdGVyYXRvcigpKQorCQkvLy88RXhjZXB0aW9uIGNyZWY9IiR0Lm5hbWUoKS5uYW1lKCkiPiB0aHJvd3MgJHQubmFtZSgpLm5hbWUoKTwvRXhjZXB0aW9uPgorI2VuZAorI2VuZAorI2VuZAorCQlwdWJsaWMgJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkgJG4ubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCSRzZXAkaGVscGVyLmdldFR5cGVOYW1lKCAkcC50eXBlKCkgKSAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJKQorCQl7CisjaWYgKCRuLmhhc1JldHVybigpKQorCQkJcmV0dXJuCisjZW5kCisJCQlfYXN5bmMuX2VuZF8ke24ubmFtZSgpfSggX2FzeW5jLl9iZWdpbl8ke24ubmFtZSgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkJJHNlcCRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkJKSApOworCQl9CisJCQorI2VuZAorI2VuZAorI2VuZAorI2VuZAorI2VuZAorI3NldCggJGsgPSAwICkKKyNmb3JlYWNoKCAkeCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJHguaXNNaXhpbigpICkKKworCQkvLyAtLS0tLSBtaXhpbiAkeC5uYW1lKCkgLS0tLS0gLy8KKyNzZXQoICRrID0gJGsgKyAxICkKKyNzZXQoICR2ID0gIl9taXhpbiRrIiApCisjc2V0KCAkbSA9ICR4LmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQorCQlwcml2YXRlICR7bS5uYW1lKCl9LlJlbW90ZSR6Lm5hbWUoKSRzdWZmaXggJHY7CisJCQorI2ZvcmVhY2goICRuIGluICR6Lm1lc3NhZ2VzKCB0cnVlICkgKQorI2lmKCRuLmlzTXNnRGlyKCRtYykpCisjaWYoISRuLmlzSGlkZGVuKCkpCisjaWYoISRtZXRob2RMaXN0LmNvbnRhaW5zKCRuLm5hbWUoKS5uYW1lKCkpKQorI3NldCAoICRhZGRNZXRob2RMaXN0U3RhdHVzID0gJG1ldGhvZExpc3QuYWRkKCRuLm5hbWUoKS5uYW1lKCkpICkKKwkJLy8gLS0tIGdlbmVyYXRlZCBtZXRob2RzIGZvciAkbi5uYW1lKCkgLS0tIC8vCisjaWYoJG4uaXNPbmV3YXkoKSkKKwkJcHVibGljICRoZWxwZXIuZ2V0VHlwZU5hbWUoICRuLnR5cGUoKSApICRuLm5hbWUoKSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkgJHAubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJCSkKKwkJeworCQkJJHt2fS4kbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJCSRzZXAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCSk7CisJCX0KKyNlbHNlCisJCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkpCisJCXsKKyNpZigkbi5oYXNSZXR1cm4oKSkKKwkJCXJldHVybgorI2VuZAorCQkJJHt2fS4kbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJCSRzZXAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCSk7CisJCX0KKwkJCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisKKwkJLy8vPHN1bW1hcnk+QXN5bmNocm9ub3VzIEltcGxlbWVudGF0aW9uIG9mIHNlcnZpY2UgbWV0aG9kczwvc3VtbWFyeT4KKyNpZiAoJGhhc0Jhc2VDbGFzcykKKwkJcHVibGljIG5ldyBjbGFzcyBfQXN5bmMgOiBSZW1vdGUke2l9Ll9Bc3luYworI2Vsc2UKKwkJcHVibGljIGNsYXNzIF9Bc3luYworI2VuZAorCQl7CisjaWYgKCRoYXNCYXNlQ2xhc3MpCisJCQlwdWJsaWMgbmV3ICRjbG5hbWUgX3BhcmVudDsKKyNlbHNlCisJCQlwdWJsaWMgJGNsbmFtZSBfcGFyZW50OworI2VuZAorCQkJCisJCQlwdWJsaWMgX0FzeW5jKCkKKwkJCXsKKwkJCX0KKworCQkJcHVibGljIF9Bc3luYygkY2xuYW1lIHBhcmVudCkKKwkJCXsKKwkJCQlfcGFyZW50ID0gcGFyZW50OworCQkJfQorCQkJCisjZm9yZWFjaCAoJG4gaW4gJGludGYuaXRlcmF0b3IoKSkKKyNpZiAoJG4uaXNNc2dEaXIoJG1jKSkKKyNpZiAoISRuLmlzSGlkZGVuKCkpCisjaWYoISRtZXRob2RMaXN0LmNvbnRhaW5zKCJfYmVnaW5fZW5kXyRuLm5hbWUoKS5uYW1lKCkiKSkKKyNzZXQgKCAkYWRkTWV0aG9kTGlzdFN0YXR1cyA9ICRtZXRob2RMaXN0LmFkZCgiX2JlZ2luX2VuZF8kbi5uYW1lKCkubmFtZSgpIikgKQorI2lmICghJG4uaXNPbmV3YXkoKSkKKwkJCS8vLzxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byAke24ubmFtZSgpfS48L3N1bW1hcnk+CisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisjaWYgKCRwLmhhc0Rlc2NyKCkpCisjc2V0KCRmaXJzdCA9IHRydWUpCisjZm9yZWFjaCggJHMgaW4gJHAuZGVzY3IoKSApCisjaWYgKCRmaXJzdCkKKyNzZXQoJGZpcnN0ID0gZmFsc2UpCisJCQkvLy88cGFyYW0gbmFtZSA9ICRwLm5hbWUoKT4kcworI2Vsc2UKKwkJCS8vLyRzCisjZW5kCisjZW5kCisJCQkvLy88L3BhcmFtPgorI2VuZAorI2VuZAorCQkJLy8vPHJldHVybnM+bWFpbGJveCB0byB1c2UgdG8gcmV0cmlldmUgdGhlIHJlc3VsdCB1c2luZyBfZW5kXyR7bi5uYW1lKCl9LjwvcmV0dXJucz4JCQkKKwkJCXB1YmxpYyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQuTWFpbGJveCBfYmVnaW5fJHtuLm5hbWUoKX0oCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJCSRzZXAkaGVscGVyLmdldFR5cGVOYW1lKCAkcC50eXBlKCkgKSAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCSkKKwkJCXsKKwkJCQlPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZy5NZXNzYWdlIF9tc2cgPSBfcGFyZW50Ll9OZXdNZXNzYWdlKCAkdmZuYW1lLiRuLnZuYW1lKCAkaGVscGVyICkgKTsKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCQlfbXNnLkFkZCggJHZmbmFtZS4kcC52bmFtZSggJGhlbHBlciApLCAkcC5uYW1lKCkgKTsKKyNlbmQKKwkJCQlyZXR1cm4gX3BhcmVudC5fQmVnaW5DYWxsKCBfbXNnICk7CisJCQl9CisJIAorCQkJLy8vIDxzdW1tYXJ5PldhaXRzIGZvciB0aGUgY2FsbCB0byBlbmQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC48L3N1bW1hcnk+CisJCQkvLy8gPHBhcmFtIG5hbWU9Il9tYiI+bWFpbGJveCByZXR1cm5lZCBieSBfYmVnaW5fJHtuLm5hbWUoKX0uPC9wYXJhbT4KKwkJCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSBfZW5kXyR7bi5uYW1lKCl9KCBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQuTWFpbGJveCBfbWIgKQorCQkJeworI2lmICgkbi5oYXNSZXR1cm4oKSkKKwkJCQlyZXR1cm4KKwkJCQkoJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkpCisjaWYgKCRuLnR5cGUoKS5kaW0oKSA+IDApCisJCQkJCS8vIFZhbHVlRmFjdG9yeSR7aX0udG9fJG4udHlwZSgpLnR5cGUoKSgKKwkJCQkJLy8JdHlwZW9mKCAke2hlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICl9ICksCisjZW5kCisJCQkJCV9wYXJlbnQuX0VuZENhbGwoIF9tYiwKKwkJCQkJCSR2Zm5hbWUuJG4uZ2V0UmVzdWx0TWVzc2FnZSgpLnZuYW1lKCAkaGVscGVyICkgKQorI2lmICgkbi50eXBlKCkuZGltKCkgPiAwKQorCQkJCQkvLykKKyNlbmQKKwkJCQk7CisjZWxzZQorCQkJCisJCQkJX3BhcmVudC5fRW5kQ2FsbCggX21iLAorCQkJCSR2Zm5hbWUuJG4uZ2V0UmVzdWx0TWVzc2FnZSgpLnZuYW1lKCAkaGVscGVyICkgKTsKKyNlbmQKKworCQkJfQorCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjc2V0KCAkayA9IDAgKQorI2ZvcmVhY2goICR4IGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmKCAkeC5pc01peGluKCkgKQorI3NldCggJGsgPSAkayArIDEgKQorI3NldCggJHYgPSAiX21peGluJGsiICkKKyNzZXQoICRtID0gJHguZ2V0TW9kdWxlKCkgKQorI3NldCggJHogPSAkbS5pdGVyYXRvcigpLm5leHQoKSApCisJCisjZm9yZWFjaCggJG4gaW4gJHoubWVzc2FnZXMoIHRydWUgKSApCisjaWYoJG4uaXNNc2dEaXIoJG1jKSkKKyNpZighJG4uaXNIaWRkZW4oKSkKKyNpZighJG1ldGhvZExpc3QuY29udGFpbnMoIl9iZWdpbl9lbmRfJG4ubmFtZSgpLm5hbWUoKSIpKQorI3NldCAoICRhZGRNZXRob2RMaXN0U3RhdHVzID0gJG1ldGhvZExpc3QuYWRkKCJfYmVnaW5fZW5kXyRuLm5hbWUoKS5uYW1lKCkiKSApCisJCQkvLyAtLS0gZ2VuZXJhdGVkIG1ldGhvZHMgZm9yICRuLm5hbWUoKSAtLS0gLy8KKworI2lmKCEgJG4uaXNPbmV3YXkoKSkKKwkJCS8vLzxzdW1tYXJ5PkJlZ2lucyBhIGNhbGwgdG8gJHtuLm5hbWUoKX0uPC9zdW1tYXJ5PgorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorI2lmICgkcC5oYXNEZXNjcigpKQorI3NldCgkZmlyc3QgPSB0cnVlKQorI2ZvcmVhY2goICRzIGluICRwLmRlc2NyKCkgKQorI2lmICgkZmlyc3QpCisjc2V0KCRmaXJzdCA9IGZhbHNlKQorCQkJLy8vPHBhcmFtIG5hbWUgPSAkcC5uYW1lKCk+JHMKKyNlbHNlCisJCQkvLy8kcworI2VuZAorI2VuZAorCQkJLy8vPC9wYXJhbT4KKyNlbmQKKyNlbmQKKworCQkJcHVibGljIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydC5NYWlsYm94IF9iZWdpbl8ke24ubmFtZSgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkJKQorCQkJeworCQkJCXJldHVybiBfcGFyZW50LiR7dn0uX2FzeW5jLl9iZWdpbl8ke24ubmFtZSgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkJCSRzZXAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCQkpOworCQkJfQorCQkJCisJCQkvLy88c3VtbWFyeT5FbmRzIGEgY2FsbCB0byAke24ubmFtZSgpfTwvc3VtbWFyeT4KKwkJCS8vLzxwYXJhbSBuYW1lID0gbWI+IG1haWxib3ggcmV0dXJuZWQgYnkgX2JlZ2luXyR7bi5uYW1lKCl9LiA8L3BhcmFtPgorCQkJcHVibGljICRoZWxwZXIuZ2V0VHlwZU5hbWUoICRuLnR5cGUoKSApIF9lbmRfJHtuLm5hbWUoKX0oIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydC5NYWlsYm94IF9tYiApCisJCQl7CisjaWYoJG4uaGFzUmV0dXJuKCkpCisJCQkJcmV0dXJuCisjZW5kCisJCQkJX3BhcmVudC4ke3Z9Ll9hc3luYy5fZW5kXyR7bi5uYW1lKCl9KCBfbWIgKTsKKwkJCX0KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQJCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci9zdHViLnZtIGIvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvc3R1Yi52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJmZWRkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvc3R1Yi52bQpAQCAtMCwwICsxLDE1NCBAQAorIyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyMjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIyBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgZWRpdGVkIQorI3NldCgkaSA9ICRpbnRmLm5hbWUoKSkKKwordXNpbmcgU3lzdGVtOworCQordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSAkaW50Zi5wYXJlbnQoKS5uYW1lKCkKK3sJCisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRXh0ZXJuKCkpCisjaWYgKCRuLmhhc0ltcG9ydCggJGhlbHBlciApKQorI3NldCgkeCA9ICRuLmdldEltcG9ydCggJGhlbHBlciApKQorI2lmICghJHguZXF1YWxzKCJFdGNoLlV0aWwiKSkKKwl1c2luZyAkeDsKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKworCS8vLzxzdW1tYXJ5PiBNZXNzYWdlIHRvIGNhbGwgdHJhbnNsYXRvciBmb3IgJGkkc3VmZml4LiA8L3N1bW1hcnk+CisJCisjaWYgKCRoYXNCYXNlQ2xhc3MpCisJcHVibGljIGNsYXNzIFN0dWIkaSRzdWZmaXggOiBTdHViJGkKKyNlbHNlCisJcHVibGljIGNsYXNzIFN0dWIkaSRzdWZmaXggOiBTdHViQmFzZQorI2VuZAorCXsKKwkJLy8vIDxzdW1tYXJ5PlN0dWIgZm9yICRpJHN1ZmZpeC48L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ic3JjIj50aGUgZGVsaXZlcnkgc2VydmljZSB0byB1c2UuPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJvYmoiPiB0aGUgaW1wbGVtZW50YXRpb24gb2YgJGkkc3VmZml4IHJlc3BvbnNpdmUgdG8gcmVxdWVzdHMuPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJxdWV1ZWQiPiB0aHJlYWQgcG9vbCB1c2VkIHRvIHJ1biBBc3luY1JlY2VpdmVyTW9kZS5RVUVVRUQgbWV0aG9kcy48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9ImZyZWUiPiB0aHJlYWQgcG9vbCB1c2VkIHRvIHJ1biBBc3luY1JlY2VpdmVyTW9kZS5GUkVFIG1ldGhvZHMuPC9wYXJhbT4JCQorCQlwdWJsaWMgU3R1YiRpJHN1ZmZpeCggRGVsaXZlcnlTZXJ2aWNlIHNyYywgb2JqZWN0IG9iaiwgUG9vbCBxdWV1ZWQsIFBvb2wgZnJlZSApCisJCQk6IGJhc2UoIHNyYywgb2JqLCBxdWV1ZWQsIGZyZWUgKQorCQl7CQorCQkJLy8gbm90aGluZyB0byBkby4KKwkJfQorCQkKKyNpZiAoISRoYXNCYXNlQ2xhc3MpCisJCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkKKyNlbHNlCisJCXB1YmxpYyBzdGF0aWMgbmV3IHZvaWQgaW5pdCgpCisjZW5kCisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8uCisJCX0KKworCQlzdGF0aWMgU3R1YiRpJHN1ZmZpeCgpCisJCXsKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJG4uaXNNaXhpbigpICkKKyNzZXQoICRtID0gJG4uZ2V0TW9kdWxlKCkgKQorI3NldCggJHogPSAkbS5pdGVyYXRvcigpLm5leHQoKSApCisJCQkke20ubmFtZSgpfS5TdHViJHt6Lm5hbWUoKX0ke3N1ZmZpeH0uaW5pdCgpOworI2VuZAorI2VuZAorI3NldCggJHN0dWJIZWxwZXJDb3VudD0wICkKKyNmb3JlYWNoKCAkbXRoZCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG10aGQuaXNNc2dEaXIoJG1jKSkKKyNpZiAoISRtdGhkLmlzSGlkZGVuKCkpCisjc2V0KCRzdHViSGVscGVyQ291bnQgPSAkc3R1YkhlbHBlckNvdW50ICsgMSkKKwkJCVN0dWJIZWxwZXJSdW4gaGVscGVyJHN0dWJIZWxwZXJDb3VudCA9IGRlbGVnYXRlKCBEZWxpdmVyeVNlcnZpY2UgX3NyYywgb2JqZWN0IF9vYmosIFdobyBfc2VuZGVyLCBNZXNzYWdlIF9tc2cgKSAKKwkJCQl7CisJCQkJCXRyeSB7CisjZm9yZWFjaCAoJHBhcmFtIGluICRtdGhkLml0ZXJhdG9yKCkpCisJCQkJCQkJJGhlbHBlci5nZXRUeXBlTmFtZSggJHBhcmFtLnR5cGUoKSApICRwYXJhbS5uYW1lKCkgPSAKKwkJCQkJCQkJKCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwYXJhbS50eXBlKCkgKSkKKwkJCQkJCQkJX21zZy5HZXQoIFZhbHVlRmFjdG9yeSRpLiRwYXJhbS52bmFtZSggJGhlbHBlciApICk7CisjZW5kCisKKyNpZiAoJG10aGQuaGFzQXV0aCgpKQorI3NldCggJGF1dGggPSAkbXRoZC5nZXRBdXRoKCkgKQorI2lmICgkYXV0aC5pc01ldGhvZEZhbHNlKCkpCisJCQkJCQkJaWYgKHRydWUpCisjZWxzZQorCQkJCQkJCWlmICgoYm9vbCkhKCgkaSRzdWZmaXgpX29iaikuJHthdXRoLm1ldGhvZCgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCgkYXJnIGluICRhdXRoLmFyZ3MoKSkKKyNpZiAoJGFyZy5pc0xpdGVyYWxDb25zdGFudCgpKQorCQkJCQkJCQkoJGhlbHBlci5nZXROYXRpdmVUeXBlTmFtZSggJGFyZy50eXBlKCkgKSkgJHNlcCRoZWxwZXIuZ2V0VHlwZVZhbHVlKCAkYXJnLnR5cGUoKSwgJGFyZy52YWx1ZSgpICkKKyNlbHNlaWYgKCRhcmcuaXNQYXJhbWV0ZXIoICRtdGhkICkpCisJCQkJCQkJCSRzZXAkaGVscGVyLnF1YWxpZnlQYXJhbWV0ZXJOYW1lKCAkYXJnLnZhbHVlKCkgKQorI2Vsc2VpZiAoJGFyZy5pc0NvbnN0YW50KCAkaW50ZiApKQorCQkJCQkJCQkkc2VwJGhlbHBlci5xdWFsaWZ5Q29uc3RhbnROYW1lKCAkaW50ZiwgJGFyZy52YWx1ZSgpICkKKyNlbHNlaWYgKCRhcmcuaXNFbnVtKCAkaW50ZiApKQorCQkJCQkJCQkkc2VwJGhlbHBlci5xdWFsaWZ5RW51bU5hbWUoICRpbnRmLCAkYXJnLnZhbHVlKCkgKQorI2Vsc2UKKwkJCQkJCQkJJHtzZXB9bnVsbAorI2VuZAorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkJCQkJCSkpIAorI2VuZAorCQkJCQkJCXRocm93IG5ldyBfRXRjaF9BdXRoRXhjZXB0aW9uKCAiJG10aGQubmFtZSgpIiApOworI2VuZAorCisjaWYgKCRtdGhkLmhhc1JldHVybigpKQorCQkJCQkJCU9iamVjdCBfcmVzdWx0ID0KKyNlbmQKKwkJCQkJCQkJKCgkaSRzdWZmaXgpX29iaikuJG10aGQubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoICgkcGFyYW0gaW4gJG10aGQuaXRlcmF0b3IoKSkKKwkJCQkJCQkJJHNlcCRwYXJhbS5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCQkJCQkJKTsKKwkJCQkJCQkJCisjaWYgKCEkbXRoZC5pc09uZXdheSgpKQorCQkJCQkJCU1lc3NhZ2UgX3Jtc2cgPSBfbXNnLlJlcGx5KCk7CisjaWYgKCRtdGhkLmhhc1JldHVybigpKQorCQkJCQkJCV9ybXNnLkFkZCggVmFsdWVGYWN0b3J5JGkuX21mX3Jlc3VsdCwgX3Jlc3VsdCApOworI2VuZAorCQkJCQkJCV9zcmMuVHJhbnNwb3J0TWVzc2FnZSggX3NlbmRlciwgX3Jtc2cgKTsKKyNlbmQKKwkJCQkJCX0KKwkJCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCQkJeworI2lmICghJG10aGQuaXNPbmV3YXkoKSkKKwkJCQkJCQlNZXNzYWdlIF9ybXNnID0gX21zZy5SZXBseSgpOworI2Vsc2UKKwkJCQkJCQlNZXNzYWdlIF9ybXNnID0gX21zZy5SZXBseSggX21zZy5WZi5nZXRfbXRfX2V4Y2VwdGlvbigpICk7CisjZW5kCisJCQkJCQkJX3Jtc2cuQWRkKCBWYWx1ZUZhY3RvcnkkaS5fbWZfcmVzdWx0LCBlICk7CisJCQkJCQkJX3NyYy5UcmFuc3BvcnRNZXNzYWdlKCBfc2VuZGVyLCBfcm1zZyApOworCQkJCQkJfQorCQkJCQl9OworCQkJVmFsdWVGYWN0b3J5JGkuJHttdGhkLnZuYW1lKCAkaGVscGVyICl9LlNldFN0dWJIZWxwZXIoIGhlbHBlciRzdHViSGVscGVyQ291bnQpOwkJCisjZW5kCisjZW5kCisjZW5kCisJCX0KKwl9Cit9CisKKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci92Zi52bSBiL2JpbmRpbmctY3NoYXJwL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvY3NoYXJwL2NvbXBpbGVyL3ZmLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDlhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2NzaGFycC9jb21waWxlci92Zi52bQpAQCAtMCwwICsxLDI4MiBAQAorIyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyMjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIyBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgZWRpdGVkIQorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OworI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0V4dGVybigpKQorI2lmICgkbi5oYXNJbXBvcnQoICRoZWxwZXIgKSkKK3VzaW5nICRuLmdldEltcG9ydCggJGhlbHBlciApOworI2VuZAorI2lmICgkbi5oYXNTZXJpYWxpemVySW1wb3J0KCAkaGVscGVyICkpCit1c2luZyAkbi5nZXRTZXJpYWxpemVySW1wb3J0KCAkaGVscGVyICk7CisjZW5kCisjZW5kCisjZW5kCisjc2V0KCAkaSA9ICRpbnRmLm5hbWUoKSApCisjc2V0KCAkdmYgPSAiVmFsdWVGYWN0b3J5JGkiICkKKworbmFtZXNwYWNlICRpbnRmLnBhcmVudCgpLm5hbWUoKQoreworCisvLy88c3VtbWFyeT5WYWx1ZUZhY3RvcnkgZm9yICRpLjwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyAke3ZmfSA6IERlZmF1bHRWYWx1ZUZhY3RvcnkKK3sKKwlwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBUeXBlTWFwIHR5cGVzID0gbmV3IFR5cGVNYXAoKTsKKyAgICAKKwlwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCSAKKwkvLy88c3VtbWFyeT5Db25zdHJ1Y3RzICR7dmZ9Ljwvc3VtbWFyeT4KKwlwdWJsaWMgJHt2Zn0oc3RyaW5nIHVyaSkgOiBiYXNlKHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUpCisJeworI2ZvcmVhY2ggKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNNaXhpbigpKQorI3NldCggJG0gPSAkbi5nZXRNb2R1bGUoKSApCisjc2V0KCAkcyA9ICRtLml0ZXJhdG9yKCkubmV4dCgpICkKKwkJYWRkTWl4aW4oIG5ldyAke20ubmFtZSgpfS5WYWx1ZUZhY3Rvcnkke3MubmFtZSgpfSh1cmkpICk7CisjZW5kCisjZW5kCQkKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBJbml0VHlwZXMoKQorCXsKKyNmb3JlYWNoICggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRW51bXgoKSB8fCAkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXh0ZXJuKCkgfHwgJG4uaXNFeGNlcHQoKSB8fCAkbi5pc01lc3NhZ2UoKSkKKwkJJG4udm5hbWUoICRoZWxwZXIgKSA9ICB0eXBlcy5HZXQoICIkbi5mcW5hbWUoKSIgKTsKKyNlbmQKKyNlbmQKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBJbml0UmVzdWx0cygpIAorCXsKKyNmb3JlYWNoICggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzTWVzc2FnZSgpKQorCQkke24udm5hbWUoICRoZWxwZXIgKX0uU2V0RGlyZWN0aW9uKCBEaXJlY3Rpb24uJG4ubXNnRGlyKCkgKTsKKyNpZiAoISRuLmlzSGlkZGVuKCkpCisjaWYgKCRuLmlzUXVldWVkQXN5bmNSZWNlaXZlcigpKQorCQkke24udm5hbWUoICRoZWxwZXIgKX0uU2V0QXN5bmNNb2RlKCBBc3luY01vZGUuUVVFVUVEICk7CisjZWxzZWlmICgkbi5pc0ZyZWVBc3luY1JlY2VpdmVyKCkpCisJCSR7bi52bmFtZSggJGhlbHBlciApfS5TZXRBc3luY01vZGUoIEFzeW5jTW9kZS5GUkVFICk7CisjZWxzZQorCQkke24udm5hbWUoICRoZWxwZXIgKX0uU2V0QXN5bmNNb2RlKCBBc3luY01vZGUuTk9ORSApOworI2VuZAorI2lmICghJG4uaXNPbmV3YXkoKSkKKyNzZXQoJHIgPSAkbi5nZXRSZXN1bHRNZXNzYWdlKCkpCisJCSR7bi52bmFtZSggJGhlbHBlciApfS5TZXRSZXN1bHQoICRyLnZuYW1lKCAkaGVscGVyICkgKTsKKwkJJHtyLnZuYW1lKCAkaGVscGVyICl9LlRpbWVvdXQgPSAkbi5nZXRUaW1lb3V0KCk7CisjZW5kCisjZW5kCisjZW5kCisjZW5kCQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIEluaXRGaWVsZHMoKQorCXsKKyNzZXQoICR4ID0gJHBhcmFtcy5jbGVhcigpICkKKyMjIHN0YW5kYXJkIHBhcmFtcyBmcm9tIERlZmF1bHRWYWx1ZUZhY3RvcnkKKyNzZXQoICR4ID0gJHBhcmFtcy5hZGQoICJtc2ciICkgKQorI3NldCggJHggPSAkcGFyYW1zLmFkZCggInJlc3VsdCIgKSApCisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRW51bXgoKSB8fCAkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXhjZXB0KCkgfHwgJG4uaXNNZXNzYWdlKCkpCisjZm9yZWFjaCggJHBhcmFtIGluICRuLml0ZXJhdG9yKCkgKQorI2lmICghJHBhcmFtcy5jb250YWlucygkcGFyYW0ubmFtZSgpLm5hbWUoKSkpCisjc2V0KCAkeCA9ICRwYXJhbXMuYWRkKCRwYXJhbS5uYW1lKCkubmFtZSgpKSApCisJCSRwYXJhbS52bmFtZSggJGhlbHBlciApID0gbmV3IEZpZWxkKCAiJHBhcmFtLm5hbWUoKS5uYW1lKCkiICk7CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZm9yZWFjaCAoICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc01lc3NhZ2UoKSkKKyNpZiAoISRuLmlzSGlkZGVuKCkpCisjaWYgKCEkbi5pc09uZXdheSgpKQorI3NldCggJHIgPSAkbi5nZXRSZXN1bHRNZXNzYWdlKCkgKQorCQkke3Iudm5hbWUoICRoZWxwZXIgKX0uUmVzcG9uc2VGaWVsZCA9IF9tZl9yZXN1bHQ7CisjZW5kCisjZW5kCisjZW5kCisjZW5kCQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIEluaXRQYXJhbXMoKQorCXsKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNFbnVteCgpIHx8ICRuLmlzU3RydWN0KCkgfHwgJG4uaXNFeGNlcHQoKSB8fCAkbi5pc01lc3NhZ2UoKSkKKyNpZiAoJG4uaXNTdHJ1Y3QoKSB8fCAkbi5pc0V4Y2VwdCgpKQorI2ZvcmVhY2goICRwYXJhbSBpbiAkbi5nZXRBbGxQYXJhbWV0ZXJzKCkgKQorCQkke24udm5hbWUoICRoZWxwZXIgKX0uUHV0VmFsaWRhdG9yKCAkcGFyYW0udm5hbWUoICRoZWxwZXIgKSwgJGhlbHBlci5nZXRWYWxpZGF0b3IoICRwYXJhbSApICk7CisjZW5kCisjZWxzZQorCQkvLyBwYXJhbXMgZm9yICRuLm5hbWUoKQorI2ZvcmVhY2goICRwYXJhbSBpbiAkbi5pdGVyYXRvcigpICkKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LlB1dFZhbGlkYXRvciggJHBhcmFtLnZuYW1lKCAkaGVscGVyICksICRoZWxwZXIuZ2V0VmFsaWRhdG9yKCAkcGFyYW0gKSApOworI2VuZAorI2VuZAorI2lmICgkbi5pc01lc3NhZ2UoKSkKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LlB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisjaWYgKCRuLmlzSGlkZGVuKCkpCisjc2V0KCAkcGFyYW0gPSAkbi5nZXRSZXN1bHRQYXJhbSgpICkKKyNzZXQoICRyZXFNc2cgPSAkbi5nZXRSZXF1ZXN0TWVzc2FnZSgpICkKKyNmb3JlYWNoKCAkdCBpbiAkcmVxTXNnLnRocm93bigpLml0ZXJhdG9yKCkgKQorCQkke24udm5hbWUoICRoZWxwZXIgKX0uUHV0VmFsaWRhdG9yKCAkcGFyYW0udm5hbWUoICRoZWxwZXIgKSwgJGhlbHBlci5nZXRWYWxpZGF0b3IoICR0ICkgKTsgLy8gdGhyb3duICR0Lm5hbWUoKQorI2VuZAorCQkke24udm5hbWUoICRoZWxwZXIgKX0uUHV0VmFsaWRhdG9yKCAkcGFyYW0udm5hbWUoICRoZWxwZXIgKSwgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uR2V0KCkgKTsgLy8gdGhyb3duIFJ1bnRpbWVFeGNlcHRpb24KKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LlB1dFZhbGlkYXRvciggX21mX19pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisJfQorCQorCQorCXN0YXRpYyAke3ZmfSgpCisJeworCQlEZWZhdWx0VmFsdWVGYWN0b3J5LkluaXQoIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCUluaXRUeXBlcygpOwkJCisJCUluaXRSZXN1bHRzKCk7CisJCUluaXRGaWVsZHMoKTsKKwkJSW5pdFBhcmFtcygpOworCisjIyAtLS0gaW1wb3J0L2V4cG9ydCAtLS0tCisKKyNmb3JlYWNoICggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzU3RydWN0KCkgfHwgJG4uaXNFeGNlcHQoKSkKKyNzZXQoICR0bmFtZSA9ICRuLmVmcW5hbWUoICRoZWxwZXIgKSApCisKKwkJY2xhc3MydHlwZS5BZGQoIHR5cGVvZiggJHt0bmFtZX0gKSwgJHtuLnZuYW1lKCAkaGVscGVyICl9ICk7CisJCSR7bi52bmFtZSggJGhlbHBlciApfS5TZXRDb21wb25lbnRUeXBlKCB0eXBlb2YoICR7dG5hbWV9ICkgKTsKKwkJI2lmICgkbi5oYXNFeHRlbmRzKCkpCisJCQkke24udm5hbWUoICRoZWxwZXIgKX0uU2V0U3VwZXJUeXBlKCAkbi5nZXRFeHRlbmRzKCkudm5hbWUoICRoZWxwZXIgKSApOworCQkjZW5kCisJCSR7bi52bmFtZSggJGhlbHBlciApfS5TZXRJbXBvcnRFeHBvcnRIZWxwZXIKKwkJCSggCisJCQkJbmV3IEltcG9ydEV4cG9ydEhlbHBlcigKKwkJCQkJZGVsZWdhdGUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkgCisJCQkJCXsKKwkJCQkJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCAke24udm5hbWUoICRoZWxwZXIgKX0sIHZmICk7CisJCQkJCQkkdG5hbWUgdiA9ICgkdG5hbWUpIHZhbHVlOworI2ZvcmVhY2goICRwIGluICRuLmdldEFsbFBhcmFtZXRlcnMoKSAgKQorCQkJCQkJc3YuQWRkKCAkcC52bmFtZSggJGhlbHBlciApLCB2LiRwLm5hbWUoKSApOworI2VuZAorCQkJCQkJcmV0dXJuIHN2OworCQkJCQl9LCAKKwkJCQkJZGVsZWdhdGUoIFN0cnVjdFZhbHVlIHN2ICkgCisJCQkJCXsKKwkJCQkJCSR0bmFtZSB2ID0gbmV3ICR7dG5hbWV9KCk7CisJCQkJCQkjZm9yZWFjaCAoJHAgaW4gJG4uZ2V0QWxsUGFyYW1ldGVycygpKQorCQkJCQkJdi4kcC5uYW1lKCkgPSAoJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkpIHN2LkdldCggJHAudm5hbWUoICRoZWxwZXIgKSApOworCQkJCQkJI2VuZAorCQkJCQkJcmV0dXJuIHY7CisJCQkJCQkKKwkJCQkJfSAKKwkJCQkpCisJCQkpOworCisjZWxzZWlmICgkbi5pc0V4dGVybigpKQorI3NldCggJHRuYW1lID0gJG4uZWZxbmFtZSggJGhlbHBlciApICkKKyNlbHNlaWYgKCRuLmlzRW51bXgoKSkKKyNzZXQoICR0bmFtZSA9ICRuLmVmcW5hbWUoICRoZWxwZXIgKSApCisKKwkJY2xhc3MydHlwZS5BZGQoIHR5cGVvZiggJHt0bmFtZX0gKSwgJHtuLnZuYW1lKCAkaGVscGVyICl9ICk7CisJCSR7bi52bmFtZSggJGhlbHBlciApfS5TZXRDb21wb25lbnRUeXBlKCB0eXBlb2YoICR7dG5hbWV9ICkgKTsKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LlNldEltcG9ydEV4cG9ydEhlbHBlcgorCQkJKCAKKwkJCQluZXcgSW1wb3J0RXhwb3J0SGVscGVyKCAKKwkJCQkJCisJCQkJCWRlbGVnYXRlKCBWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSApIAorCQkJCQl7CisJCQkJCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggJHtuLnZuYW1lKCAkaGVscGVyICl9LCB2ZiApOworCQkJCQkJJHt0bmFtZX0gdiA9ICgke3RuYW1lfSkgdmFsdWU7CisJCQkJCQlzd2l0Y2ggKHYpCisJCQkJCQl7CisjZm9yZWFjaCAoJHAgaW4gJG4uaXRlcmF0b3IoKSkKKwkJCQkJCQljYXNlICR7dG5hbWV9LiRwLm5hbWUoKTogc3YuQWRkKCAkcC52bmFtZSggJGhlbHBlciApLCB0cnVlICk7IGJyZWFrOworI2VuZAorCQkJCQkJfQorCQkJCQkJcmV0dXJuIHN2OworCQkJCQl9LCAKKwkJCQkJZGVsZWdhdGUoIFN0cnVjdFZhbHVlIHN2ICkgCisJCQkJCXsKKwkJCQkJCS8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIGtleSwgc28gdGFrZSB0aGUgZmlyc3QKKwkJCQkJCS8vIG9uZS4gaWYgdGhlcmUgaXMgbm8ga2V5LCBtZWFucyB0aGV5IHNlbnQgbnVsbCBvciB0aGUKKwkJCQkJCS8vIGtleSB0aGV5IHNlbnQgd2FzIHVua25vd24uCisJCQkJCQlGaWVsZCBrZXkgPSBudWxsOworCQkJCQkJSUVudW1lcmF0b3I8RmllbGQ+IG15RW51bSA9IHN2LktleXMuR2V0RW51bWVyYXRvcigpOworCQkJCQkJaWYgKG15RW51bS5Nb3ZlTmV4dCgpKQorCQkJCQkJCWtleSA9IG15RW51bS5DdXJyZW50OworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJCisjZm9yZWFjaCAoJHAgaW4gJG4uaXRlcmF0b3IoKSkKKwkJCQkJCWlmIChrZXkgPT0gJHAudm5hbWUoICRoZWxwZXIgKSkgcmV0dXJuICR7dG5hbWV9LiRwLm5hbWUoKTsKKyNlbmQKKwkJCQkJCQorCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0gCisJCQkJKQorCQkJKTsKKworI2VuZAorI2VuZAorCisJCS8vIGluaXRpYWxpemUgdGhlIGV4dGVybiBzZXJpYWxpemVyczoKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNFeHRlcm4oKSkKKwkJJHtuLnNuYW1lKCAkaGVscGVyICl9LkluaXQoICR7bi52bmFtZSggJGhlbHBlciApfSwgY2xhc3MydHlwZSApOworI2VuZAorI2VuZAorCisJCS8vIGRvbmUgdXBkYXRpbmcgdHlwZXMgYW5kIGZpZWxkcywgbG9jayB0aGVtLgorCQl0eXBlcy5Mb2NrKCk7CisJCWZvcmVhY2goWFR5cGUgdCBpbiB0eXBlcy5WYWx1ZXMoKSkKKwkJCXQuTG9jaygpOworCQljbGFzczJ0eXBlLkxvY2soKTsKKworCisJCisJfSAvLyBlbmQgb2Ygc3RhdGljIGNvbnN0cnVjdG9yCisKKwkKKwkKKyNmb3JlYWNoICggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRW51bXgoKSB8fCAkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXh0ZXJuKCkgfHwgJG4uaXNFeGNlcHQoKSB8fCAkbi5pc01lc3NhZ2UoKSkKKwkvLy8gVHlwZSBmb3IgJG4uZnFuYW1lKCkgCisJcHVibGljIHN0YXRpYyBYVHlwZSAkbi52bmFtZSggJGhlbHBlciApOworI2VuZAorI2VuZAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCisJCQorI3NldCggJHggPSAkcGFyYW1zLmNsZWFyKCkgKQorIyMgc3RhbmRhcmQgcGFyYW1zIGZyb20gRGVmYXVsdFZhbHVlRmFjdG9yeQorI3NldCggJHggPSAkcGFyYW1zLmFkZCggIm1zZyIgKSApCisjc2V0KCAkeCA9ICRwYXJhbXMuYWRkKCAicmVzdWx0IiApICkKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNFbnVteCgpIHx8ICRuLmlzU3RydWN0KCkgfHwgJG4uaXNFeGNlcHQoKSB8fCAkbi5pc01lc3NhZ2UoKSkKKyNmb3JlYWNoKCAkcGFyYW0gaW4gJG4uaXRlcmF0b3IoKSApCisjaWYgKCEkcGFyYW1zLmNvbnRhaW5zKCRwYXJhbS5uYW1lKCkubmFtZSgpKSkKKyNzZXQoICR4ID0gJHBhcmFtcy5hZGQoJHBhcmFtLm5hbWUoKS5uYW1lKCkpICkKKwlwdWJsaWMgc3RhdGljIEZpZWxkICRwYXJhbS52bmFtZSggJGhlbHBlciApOworI2VuZAorI2VuZAorI2VuZAorI2VuZAorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL2J1aWxkLnhtbCBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGIyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL2J1aWxkLnhtbApAQCAtMCwwICsxLDEyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLWNzaGFycC1ydW50aW1lIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIj4KKyAgICA8ZGVzY3JpcHRpb24+RXRjaC10by1Dc2hhcnAgcnVudGltZSBiaW5kaW5nIGltcGxlbWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPHRhc2tkZWYgcmVzb3VyY2U9Im9yZy9hcGFjaGUvYW50L2RvdG5ldC9hbnRsaWIueG1sIiBjbGFzc3BhdGg9IiR7RXRjaC5kZXBlbmRlbmN5LmFudC1kb3RuZXQtMS4wLmphcn0iIC8+CisKKyAgICA8IS0tIFN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBzdWItcHJvamVjdCAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvaiIgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke0V0Y2guYmFzZWRpcn0vYmluZGluZy1jc2hhcnAvcnVudGltZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke3Byb2p9L3RhcmdldCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke3Byb2p9L3NyYyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmF3TlVuaXRSZXN1bHRzIiAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vbnVuaXQtcmVzdWx0cyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdFJlc3VsdHNEaXJlY3RvcnkiIGxvY2F0aW9uPSIke3RhcmdldH0vdGVzdC1yZXN1bHRzIiAgLz4KKworICAgIDwhLS0gSU5JVCBUQVJHRVQgLS0+CisgICAgPCEtLSBNb2RpZnkgdGhpcyB0YXJnZXQgdG8gZGVmaW5lIHByb2plY3Qgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNhbiBvbmx5IGJlIHNldCBhdCBydW50aW1lIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8taW5pdCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisKKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Jhd05Vbml0UmVzdWx0c30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGVzdFJlc3VsdHNEaXJlY3Rvcnl9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBDTEVBTiBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1jbGVhbiI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvYmluIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL29iaiIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3JjfS90ZXN0L2NzaGFycC9iaW4iIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vdGVzdC9jc2hhcnAvb2JqIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBCVUlMRCBUQVJHRVQgLS0+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXNvdXJjZXMiID4KKyAgICAgICAgPCEtLSBHZW5lcmF0ZSB2ZXJzaW9uIGluZm8gLS0+CisgICAgICAgIDx1cGRhdGUtdG9rZW5zIGZpbGVuYW1lPSIke3NyY30vbWFpbi9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLW1haW4td2l0aC1tb25vIiBpZj0iVVNFLm1vbm8iID4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iVE9ETzogYnVpbGQgdy8gbW9ubyIgLz4KKyAgICAgICAgPG1kdG9vbCBkaXI9IiR7c3JjfS9tYWluL2NzaGFycCIgcHJvamVjdD0iRXRjaFByb2ouY3Nwcm9qIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluLXdpdGgtZG90bmV0IiBpZj0iVVNFLmRvdG5ldCIgPgorICAgICAgICA8IS0tIEJ1aWxkIHJ1bnRpbWUgLS0+CisgICAgICAgIDxtc2J1aWxkIGJ1aWxkZmlsZT0iJHtzcmN9L21haW4vY3NoYXJwL0V0Y2hQcm9qLmNzcHJvaiI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQ29uZmlndXJhdGlvbiIgdmFsdWU9IiR7RXRjaC5idWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8L21zYnVpbGQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLW1haW4tY3NoYXJwIiBkZXBlbmRzPSJidWlsZC1tYWluLXdpdGgtbW9ubyxidWlsZC1tYWluLXdpdGgtZG90bmV0IiAvPgorCisgICAgPHRhcmdldCBuYW1lPSJkby1idWlsZCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyxidWlsZC1tYWluLWNzaGFycCIgaWY9IkJVSUxELmNzaGFycCIgPgorCisgICAgICAgIDxta2RpciBkaXI9IiR7RXRjaC5kaXN0fS9saWIiIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7RXRjaC5jbG92ZXItZGlzdH0vbGliIiAvPgorCisgICAgICAgIDxjb3B5IHRvZGlyPSIke0V0Y2guY2xvdmVyLWRpc3R9L2xpYiIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvYmluLyR7RXRjaC5idWlsZC50YXJnZXR9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnBkYiIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmRsbCIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorCisgICAgICAgIDxjb3B5IHRvZGlyPSIke0V0Y2guZGlzdH0vbGliIiA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2NzaGFycC9iaW4vJHtFdGNoLmJ1aWxkLnRhcmdldH0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioucGRiIiAvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouZGxsIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIFRFU1QgVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdC13aXRoLW1vbm8iIGlmPSJVU0UubW9ubyIgPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJUT0RPOiBidWlsZCB3LyBtb25vIiAvPgorICAgICAgICA8bWR0b29sIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwIiBwcm9qZWN0PSJFdGNoVGVzdFByb2ouY3Nwcm9qIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC10ZXN0LXdpdGgtZG90bmV0IiBpZj0iVVNFLmRvdG5ldCIgPgorICAgICAgICA8bXNidWlsZCBidWlsZGZpbGU9IiR7c3JjfS90ZXN0L2NzaGFycC9FdGNoVGVzdFByb2ouY3Nwcm9qIiA+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQ29uZmlndXJhdGlvbiIgdmFsdWU9IiR7RXRjaC5idWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8L21zYnVpbGQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXRlc3QtY3NoYXJwIiBkZXBlbmRzPSJidWlsZC10ZXN0LXdpdGgtbW9ubyxidWlsZC10ZXN0LXdpdGgtZG90bmV0IiAvPgorCisgICAgPHRhcmdldCBuYW1lPSJkby10ZXN0IiBkZXBlbmRzPSJidWlsZC10ZXN0LWNzaGFycCIgaWY9IlVTRS5kb3RuZXQiID4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtyYXdOVW5pdFJlc3VsdHN9IiAvPgorCisgICAgICAgIDxudW5pdCB4bWxvdXQ9IiR7cmF3TlVuaXRSZXN1bHRzfS9OVW5pdFJlc3VsdHMueG1sIj4KKyAgICAgICAgICAgIDx0ZXN0YXNzZW1ibHkgbmFtZT0iJHtzcmN9L3Rlc3QvY3NoYXJwL2Jpbi8ke0V0Y2guYnVpbGQudGFyZ2V0fS9FdGNoVGVzdC5kbGwiIC8+CisgICAgICAgIDwvbnVuaXQ+CisKKyAgICAgICAgPHhzbHQgc3R5bGU9IiR7RXRjaC5idWlsZFN1cHBvcnREaXJlY3Rvcnl9L05Vbml0VG9KVW5pdC54c2wiCisgICAgICAgICAgICAgICAgaW49IiR7cmF3TlVuaXRSZXN1bHRzfS9OVW5pdFJlc3VsdHMueG1sIiBvdXQ9IiR7dGVzdFJlc3VsdHNEaXJlY3Rvcnl9L1RFU1QtTlVuaXRSZXN1bHRzLnhtbCIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gUE9TVEJVSUxEIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXBvc3RidWlsZCI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXB1Ymxpc2giIGlmPSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgPCEtLSBTZXQgZmxhZyBmaWxlIGlmIGFueSB0ZXN0cyBmYWlsZWQgLS0+CisgICAgICAgIDx0b3VjaCBmaWxlPSIke0V0Y2gucnVudGltZS50ZXN0cy5mYWlsfSIvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9FdGNoUHJvai5jc3Byb2ogYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9FdGNoUHJvai5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlZTU2YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL0V0Y2hQcm9qLmNzcHJvagpAQCAtMCwwICsxLDE5OSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkV0Y2g8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5FdGNoPC9Bc3NlbWJseU5hbWU+CisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+CisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+ZXRjaC5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcTXNnXEFzeW5jTW9kZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXE1zZ1xDb21ib1ZhbGlkYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXE1zZ1xEaXJlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxNc2dcRmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxNc2dcRmllbGRNYXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxNc2dcSWROYW1lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcTXNnXElkTmFtZU1hcC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXE1zZ1xJbXBvcnRFeHBvcnRIZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxNc2dcTWVzc2FnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXE1zZ1xTdHJ1Y3RWYWx1ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXE1zZ1xUeXBlTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcTXNnXFZhbGlkYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXE1zZ1xWYWx1ZUZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxNc2dcWFR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XEF1dGhFeGNlcHRpb25TZXJpYWxpemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxDbGFzczJUeXBlTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxEZWZhdWx0U2VydmVyRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcRGVmYXVsdFZhbHVlRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcRGVsaXZlcnlTZXJ2aWNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxEdW1teVZhbHVlRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcRnJlZVBvb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XE1haWxib3guY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XE51bGxQb29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxPYmpTZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxQb29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxRdWV1ZWRQb29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxSZW1vdGVCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxSdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcU2VydmVyRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcU3R1YkJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XFN0dWJIZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XFRyYW5zcG9ydEhlbHBlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcVHlwZVZhbGlkYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcVmFsaWRhdG9yX2Jvb2xlYW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XFZhbGlkYXRvcl9ieXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxWYWxpZGF0b3JfY3VzdG9tLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxWYWxpZGF0b3JfZG91YmxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxWYWxpZGF0b3JfZmxvYXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XFZhbGlkYXRvcl9pbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XFZhbGlkYXRvcl9sb25nLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxWYWxpZGF0b3Jfb2JqZWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxWYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFN1cHBvcnRcVmFsaWRhdG9yX3Nob3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxWYWxpZGF0b3Jfc3RyaW5nLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxWYWxpZGF0b3JfU3RydWN0VmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxTdXBwb3J0XFZhbGlkYXRvcl92b2lkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxfRXRjaF9BdXRoRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcU3VwcG9ydFxfRXRjaF9SdW50aW1lRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XEFycmF5VmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxUcmFuc3BvcnRcRGVmYXVsdERlbGl2ZXJ5U2VydmljZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxGaWx0ZXJcQWJzdHJhY3RNZXNzYWdlRmlsdGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XEZpbHRlclxLZWVwQWxpdmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxUcmFuc3BvcnRcRmlsdGVyXExvZ2dlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxGaWx0ZXJcUHdBdXRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XEZtdFxCaW5hcnlcQmluYXJ5VGFnZ2VkRGF0YS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxGbXRcQmluYXJ5XEJpbmFyeVRhZ2dlZERhdGFGb3JtYXRGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XEZtdFxCaW5hcnlcQmluYXJ5VGFnZ2VkRGF0YUlucHV0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XEZtdFxCaW5hcnlcQmluYXJ5VGFnZ2VkRGF0YU91dHB1dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxGbXRcQmluYXJ5XFZhbGlkYXRvcl9ub25lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XEZtdFxCeXRlVG9TYnl0ZUNvbnZlcnRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxGbXRcVGFnZ2VkRGF0YS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxGbXRcVHlwZUNvZGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxUcmFuc3BvcnRcRm9ybWF0RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxNYWlsYm94TWFuYWdlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxNZXNzYWdpemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XFBsYWluTWFpbGJveC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxQbGFpbk1haWxib3hNYW5hZ2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XFNlc3Npb25NZXNzYWdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XFRhZ2dlZERhdGFJbnB1dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxUYWdnZWREYXRhT3V0cHV0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVHJhbnNwb3J0XFRjcFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxUcmFuc3BvcnRcVHJhbnNwb3J0TWVzc2FnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFRyYW5zcG9ydFxVbndhbnRlZE1lc3NhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXEFic3RyYWN0U3RhcnRhYmxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxBbGFybUxpc3RlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxBbGFybU1hbmFnZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXEFycmF5SXRlcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXEFzc2VydGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcQ2hhckl0ZXJhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxDaXJjdWxhclF1ZXVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxDb25uZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxEYXRlU2VyaWFsaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcRW1wdHlJdGVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcRXF1YWxzSGVscGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxGbGV4QnVmZmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxIUFRpbWVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxJZEdlbmVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcSW5wdXRTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXEludENvdW50ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXEludGVnZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXExpc3RTZXJpYWxpemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxNYXBTZXJpYWxpemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxNb25pdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxPdXRwdXRTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFBhY2tldGl6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFBlcmZUZXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxSZXNvdXJjZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFJ1bm5lci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcUnVubmVySGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU2Vzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU2Vzc2lvbkNvbnN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU2Vzc2lvbkRhdGEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFNlc3Npb25MaXN0ZW5lci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU2Vzc2lvblBhY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU2luZ2xlSXRlcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFN0YXJ0YWJsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU3RyaW5nVG9rZW5pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxTdHJpbmdVdGlsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxTdHJJbnRIYXNoTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxTdHJJbnRIYXNoTWFwU2VyaWFsaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU3RyU3RySGFzaE1hcC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcU3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFRjcENvbm5lY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFRjcExpc3RlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxUY3BPcHRpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxUY3BUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFRpbWVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxUbHNDb25uZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxUb2RvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxUb2RvRGVsZWdhdGVJbXBsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxUb2RvTWFuYWdlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxUcmFuc3BvcnRDb25zdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFRyYW5zcG9ydERhdGEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycFxVdGlsXFRyYW5zcG9ydFBhY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwXFV0aWxcVVJMLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxVUkxTZXJpYWxpemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnBcVXRpbFxXaG8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9ImV0Y2guc25rIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9Bc3luY01vZGUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9Bc3luY01vZGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhZDQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0FzeW5jTW9kZS5jcwpAQCAtMCwwICsxLDQwIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKyAgICAvLy8KKyAgICAvLy8gVGhlIGFzeW5jaHJvbm91cyByZWNlaXZlciBtb2RlIG9mIHRoaXMgaGVscGVyLgorICAgIC8vLworICAgIHB1YmxpYyBlbnVtIEFzeW5jTW9kZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gc3luY2hyb25vdXMgbW9kZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBOT05FLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgdGhlIG9wZXJhdGlvbiBpcyBxdWV1ZWQgdG8gYSB0aHJlYWQgcG9vbCBmb3IgZXhlY3V0aW9uIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBRVUVVRUQsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICB0aGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIGJ5IGEgbmV3bHkgYWxsb2NhdGVkIHRocmVhZCAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRlJFRQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0NvbWJvVmFsaWRhdG9yLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvQ29tYm9WYWxpZGF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwNzBkYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0NvbWJvVmFsaWRhdG9yLmNzCkBAIC0wLDAgKzEsMTEzIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVmFsaWRhdGVzIHZhbHVlcyB1c2luZyBvbmUgb2YgdHdvIHZhbGlkYXRvcnMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBDb21ib1ZhbGlkYXRvciA6IFZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgY29tYm8gdmFsaWRhdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQ29tYm9WYWxpZGF0b3IoIFZhbGlkYXRvciBhLCBWYWxpZGF0b3IgYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYSA9IGE7CisgICAgICAgICAgICB0aGlzLmIgPSBiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWxpZGF0b3IgYTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWxpZGF0b3IgYjsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoICIoezB9IE9SIHsxfSkiLCBhLCBiICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVmFsaWRhdG9yIEVsZW1lbnRWYWxpZGF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0b3IgbmE7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hID0gYS5FbGVtZW50VmFsaWRhdG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmEgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYWxpZGF0b3IgbmI7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYiA9IGIuRWxlbWVudFZhbGlkYXRvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5iID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBuYSA9PSBudWxsICYmIG5iID09IG51bGwgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbiggIm5hID09IG51bGwgYW5kIG5iID09IG51bGwiICk7CisKKyAgICAgICAgICAgIGlmICggbmEgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5iOworCisgICAgICAgICAgICBpZiAoIG5iID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBuYTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21ib1ZhbGlkYXRvciggbmEsIG5iICk7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFZhbGlkYXRlKCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYS5WYWxpZGF0ZSggdmFsdWUgKSB8fCBiLlZhbGlkYXRlKCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgIAorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgVmFsaWRhdGVWYWx1ZShvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhLlZhbGlkYXRlVmFsdWUodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYi5WYWxpZGF0ZVZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWYWxpZGF0b3IgQSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZhbGlkYXRvciBCKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9EaXJlY3Rpb24uY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9EaXJlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkMTUyYgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0RpcmVjdGlvbi5jcwpAQCAtMCwwICsxLDQwIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSBkaXJlY3Rpb24gb2YgYSBtZXNzYWdlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gRGlyZWN0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNZXNzYWdlIGlzIGJvdGggdG93YXJkIGNsaWVudCBhbmQgdG93YXJkIHNlcnZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQk9USCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWVzc2FnZSBpcyB0b3dhcmQgc2VydmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTRVJWRVIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1lc3NhZ2UgaXMgdG93YXJkIGNsaWVudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQ0xJRU5UCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvRmllbGQuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9GaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGY3NWYxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvRmllbGQuY3MKQEAgLTAsMCArMSwzOCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnCit7CisKKyAgIC8vLyA8c3VtbWFyeT5GaWVsZCBpcyBhbiBJZE5hbWUgd2hpY2ggZGVub3RlcyBhIGZpZWxkIG9mIGEgc3RydWN0IG9yIG1lc3NhZ2UgKGkuZS4sIGEga2V5IGZvciBhIHZhbHVlKS48L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEZpZWxkIDogSWROYW1lCisgICAgeworICAgICAgICAvLy88c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBGaWVsZC48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJpZCI+aWQgdGhlIGlkIG9mIHRoZSBmaWVsZC48L3BhcmFtPgorICAgICAgICAvLy88cGFyYW0gbmFtZT0ibmFtZSI+bmFtZSB0aGUgbmFtZSBvZiB0aGUgZmllbGQuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEZpZWxkKGludCBpZCwgc3RyaW5nIG5hbWUpCisgICAgICAgICAgICA6IGJhc2UoaWQsIG5hbWUpCisgICAgICAgIHsgfQorCisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJuYW1lIj5uYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgRmllbGQoc3RyaW5nIG5hbWUpCisgICAgICAgICAgICA6IGJhc2UobmFtZSkKKyAgICAgICAgeyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0ZpZWxkTWFwLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvRmllbGRNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2ODc4NgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0ZpZWxkTWFwLmNzCkBAIC0wLDAgKzEsMzIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRmllbGRNYXAgaXMgYW4gSWROYW1lTWFwIGZvciBGaWVsZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEZpZWxkTWFwIDogSWROYW1lTWFwPEZpZWxkPgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEZpZWxkIE1ha2VOZXcoIHN0cmluZyBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZCggbmFtZSApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvSWROYW1lLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvSWROYW1lLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTZhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9JZE5hbWUuY3MKQEAgLTAsMCArMSwxMjIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnCit7CisgICAgLy8vIDxzdW1tYXJ5PkFuIElkTmFtZSBpcyBhIGJhc2UgY2xhc3MgZm9yIEZpZWxkIG9yIFR5cGUuIEl0IGlzIHVzZWQKKyAgICAvLy8gdG8gYmluZCB0b2dldGhlciBhIHR5cGUgb3IgZmllbGQgbmFtZSB3aXRoIHRoZSBhc3NvY2lhdGVkIGlkLiBUaGUgaWQKKyAgICAvLy8gaXMgdXNlZCBmb3IgY2VydGFpbiBvcGVyYXRpb25zLCBzdWNoIGFzIHRoZSBrZXkgaW4gYSBNYXAsIGNvbXBhcmlzb25zLAorICAgIC8vLyBhbmQgYmluYXJ5IGVuY29kaW5nIG9uIHRoZSB3aXJlLCB3aGlsZSB0aGUgbmFtZSBpcyB1c2VkIGZvciBkaXNwbGF5LgorICAgIC8vLyA8c2VlIGNyZWY9IiIvPiBGaWVsZAorICAgIC8vLyA8c2VlIGNyZWY9IiIvPiBUeXBlPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBJZE5hbWUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJZE5hbWUuCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaWQiPmlkIGZvciB0aGUgbmFtZSAobm9ybWFsbHkgY29tcHV0ZWQgdXNpbmc8L3BhcmFtPiAKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj48L3BhcmFtPgorICAgICAgICAvLy8gezxsaW5rPiNoYXNoKFN0cmluZyl9KTwvbGluaz48L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBJZE5hbWUoaW50IGlkLCBTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJZE5hbWUgYnkgY29tcHV0aW5nIHRoZSBhcHByb3ByaWF0ZSBpZCBnaXZlbiB0aGUgbmFtZS4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj4gbmFtZSB0aGUgbmFtZSBvZiB0aGUgaXRlbS48L3BhcmFtPgorICAgICAgICAvLy8gPHNlZSBjcmVmPSIiLz4gI2hhc2goU3RyaW5nKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgSWROYW1lKHN0cmluZyBuYW1lKQorICAgICAgICAgICAgOiB0aGlzKEhhc2gobmFtZSksIG5hbWUpCisgICAgICAgIHsgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGlkOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIG5hbWU7CisKKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBpZCBvZiB0aGUgaXRlbS4gPC9yZXR1cm5zPiAKKyAgICAgICAgcHVibGljIGludCBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHJldHVybnM+IHRoZSBuYW1lIG9mIHRoZSBpdGVtLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIE92ZXJyaWRlIAorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCAiezB9KHsxfSkiLCBuYW1lLCBpZCApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIE92ZXJyaWRlIAorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG9iaiA9PSB0aGlzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBpZihvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmKHRoaXMuR2V0VHlwZSgpICE9IG9iai5HZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBJZE5hbWUgb3RoZXIgPSAoSWROYW1lKSBvYmo7CisKKyAgICAgICAgICAgIHJldHVybiBpZC5FcXVhbHMoIG90aGVyLklkICkgJiYgbmFtZS5FcXVhbHMoIG90aGVyLk5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBPdmVycmlkZQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpZC5HZXRIYXNoQ29kZSgpIF4gbmFtZS5HZXRIYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PkNvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBuYW1lIHRvIGJlIHVzZWQgYXMgdGhlIGlkIHdoZW4KKyAgICAgICAgLy8vIGNvbnN0cnVjdGluZyBhbiBJZE5hbWUuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPiBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9yIGZpZWxkLiA8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YSBoYXNoIG9mIG5hbWUgaW4gdGhlIHVuaWNvZGUgY2hhcmFjdGVyIGVuY29kaW5nIHdoaWNoIGlzCisgICAgICAgIC8vLyB2ZXJ5IGxpa2VseSB0byBiZSB1bmlxdWUgb3ZlciByZWFzb25hYmxlIG5hbWUgc3BhY2VzLiBDb2xsaXNpb25zCisgICAgICAgIC8vLyBzaG91bGQgYmUgdmVyeSB1bmxpa2VseSBhcyB0aGV5IHdpbGwgZm9yY2UgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZQorICAgICAgICAvLy8gbmFtZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEhhc2goU3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9uIG9mIGRqYjIgYW5kIHNkYm0gaGFzaCBhbGdvcml0aG06CisgICAgICAgICAgICBpbnQgaGFzaCA9IDUzODE7CisgICAgICAgICAgICBpbnQgbiA9IG5hbWUuTGVuZ3RoOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBuYW1lW2ldOyAKKyAgICAgICAgICAgICAgICBpbnQgaDYgPSBoYXNoIDw8IDY7CisgICAgICAgICAgICAgICAgaGFzaCA9IChoNiA8PCAxMCkgKyBoNiAtIGhhc2ggKyBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9JZE5hbWVNYXAuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9JZE5hbWVNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjZjA5MwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0lkTmFtZU1hcC5jcwpAQCAtMCwwICsxLDE4NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworCisgICAgLy8vIDxzdW1tYXJ5Pk1hcCBieSBpZCBhbmQgbmFtZSBvZiBJZE5hbWVzIChvciBzdWJjbGFzc2VzIHRoZXJlb2YpLjwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj50aGUgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgSWROYW1lIHRoYXQgaXMgaW4gdGhlIG1hcC48L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSWROYW1lTWFwPFQ+IHdoZXJlIFQgOiBJZE5hbWUKKyAgICB7CisKKyAgICAgICAgcHVibGljIElkTmFtZU1hcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJZE5hbWVNYXAuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heEF1dG9Db3VudCI+bWF4QXV0b0NvdW50IHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdXRvbWF0aWNhbGx5IGRlY2xhcmVkIElkTmFtZXMgCisgICAgICAgIC8vLyBhbGxvd2VkLiBTZXQgdG8gMCBpZiB5b3UgZG9uJ3Qgd2FudCBhbnksIGJ1dCB0aGlzIG1heSBwcmV2ZW50IHdvcmtpbmcgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudAorICAgICAgICAvLy8gdmVyc2lvbiBvZiBhIHNlcnZpY2UuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIElkTmFtZU1hcCggaW50IG1heEF1dG9Db3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWF4QXV0b0NvdW50ID0gbWF4QXV0b0NvdW50OworICAgICAgICB9CisgICAgCQorICAgICAgICBwcml2YXRlIGludCBtYXhBdXRvQ291bnQ7CisgICAgCQorICAgICAgICAvLy8gPHN1bW1hcnk+R2V0cyB0aGUgSWROYW1lIHN1YmNsYXNzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzcGVjaWZpZWQgaWQsIG9yIGNyZWF0ZXMgaXQgaWYgaXQgaXNuJ3QgZm91bmQgCisgICAgICAgIC8vLyBhbmQgaWYgYXV0b0NvdW50IGxlc3MgdGhhbiBtYXhBdXRvQ291bnQuIElmIGNyZWF0ZWQsIHRoZSBJZE5hbWUgaXMgZ2l2ZW4gdGhlIG5hbWUgd2hpY2ggaXMgCisgICAgICAgIC8vLyBpZC50b1N0cmluZygpLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpZCI+aWQgdGhlIGlkIG9mIGFuIElkTmFtZS48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIElkTmFtZSBzdWJjbGFzcyBmb3VuZCBvciBjcmVhdGVkLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFQgR2V0KCBpbnQgaWQgKSAKKyAgICAgICAgeworICAgICAgICAgICAgVCB0OworCisgICAgICAgICAgICBpZiAoYnlJZC5UcnlHZXRWYWx1ZShpZCwgb3V0IHQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0OworCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgcHVibGljIFQgR2V0QnlJZCggaW50IGlkICkKKyAgICAgICB7CisgICAgICAgICAgIFQgdDsKKworICAgICAgICAgICBpZiAoYnlJZC5UcnlHZXRWYWx1ZShpZCwgb3V0IHQpKQorICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisKKyAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5HZXRzIHRoZSBJZE5hbWUgc3ViY2xhc3Mgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBuYW1lLCBvciBjcmVhdGVzIGl0IGlmIGl0IGlzbid0IAorICAgICAgICAvLy8gZm91bmQgYW5kIGlmIGF1dG9Db3VudCBtYXhBdXRvQ291bnQuIElmIGNyZWF0ZWQsIHRoZSBJZE5hbWUgaXMgZ2l2ZW4gdGhlIGlkIHdoaWNoIGlzIAorICAgICAgICAvLy8gSWROYW1lLmhhc2goIG5hbWUgKS48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+bmFtZSB0aGUgbmFtZSBvZiBhbiBJZE5hbWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBJZE5hbWUgc3ViY2xhc3MgZm91bmQgb3IgY3JlYXRlZC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBUIEdldCggU3RyaW5nIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBUIHQ7CisKKyAgICAgICAgICAgIGlmIChieU5hbWUuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IHQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0OworCisgICAgICAgICAgICBpZiAoIWxvY2tlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQWRkKCBNYWtlTmV3KCBuYW1lICkgKTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBHZXRCeU5hbWUoU3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFQgdDsKKworICAgICAgICAgICAgaWYgKGJ5TmFtZS5UcnlHZXRWYWx1ZShuYW1lLCBvdXQgdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisKKyAgICAgICAgICAgIGlmICghbG9ja2VkKQorICAgICAgICAgICAgICAgIHJldHVybiBBZGQoTWFrZU5ldyhuYW1lKSk7CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgCQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIHRoZSBJZE5hbWUgc3ViY2xhc3MgdG8gdGhlIG1hcC4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idCI+dGhlIElkTmFtZSBzdWJjbGFzcyB0byBhZGQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBJZE5hbWUgZnJvbSB0aGUgbWFwPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiAoc3RhdGUpIGlmIHRoZXJlIGlzIGEgY29sbGlzaW9uIHdpdGggaWQgb3IgbmFtZSwgb3IgYSBjb2xsaXNpb24gd2l0aCAKKyAgICAgICAgLy8vICAgICAgICAgICAgIGlkIGFuZCBuYW1lIHdoZXJlIHRoZXkgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgb2JqZWN0LgorICAgICAgICBwdWJsaWMgVCBBZGQoIFQgdCApIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGxvY2tlZCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggInN0YXRlIGV4Y2VwdGlvbiAtLSBsb2NrZWQiICk7CisKKyAgICAgICAgICAgIGlmICggYnlJZC5Db250YWluc0tleSggdC5JZCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICggdC5OYW1lID09ICJtc2ciICkgfHwgKCB0Lk5hbWUgPT0gInJlc3VsdCIgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAiaWQgY29sbGlzaW9uIiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGJ5TmFtZS5Db250YWluc0tleSggdC5OYW1lICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggKCB0Lk5hbWUgPT0gIm1zZyIgKSB8fCAoIHQuTmFtZSA9PSAicmVzdWx0IiApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJuYW1lIGNvbGxpc2lvbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5SWQuQWRkICggdC5JZCwgdCk7ICAKKyAgICAgICAgICAgIGJ5TmFtZS5BZGQodC5OYW1lLCB0KTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhbGwgdGhlIElkTmFtZXMgdG8gdGhpcyBJZE5hbWVNYXAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0cyI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkQWxsKCBJZE5hbWVNYXA8VD4gdHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGxvY2tlZCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggImxvY2tlZCIgKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoIFQgdCBpbiB0cy5ieUlkLlZhbHVlcyApCisgICAgICAgICAgICAgICAgQWRkKCB0ICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+PC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+YSBzbmFwc2hvdCBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgdmFsdWVzLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIExpc3Q8VD4gVmFsdWVzKCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdDxUPiggYnlJZC5WYWx1ZXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvY2tzIHRoZSBtYXAsIHByZXZlbnRpbmcgZnVydGhlciBjaGFuZ2VzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIExvY2soKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgbWFwPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IFNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnlJZC5Db3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5NYWtlcyBhIG5ldyBzdWJjbGFzcyBvZiBJZE5hbWUgdG8gcHV0IGluIHRoaXMgbWFwLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5uYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgc3ViY2xhc3Mgb2YgSWROYW1lLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIG5ld2x5IGNvbnN0cnVjdGVkIHN1YmNsYXNzIG9mIElkTmFtZSB0byBwdXQgaW4gdGhpcyBtYXAuPC9yZXR1cm5zPgorICAgICAgICBhYnN0cmFjdCBwdWJsaWMgVCBNYWtlTmV3KCBTdHJpbmcgbmFtZSApOworCisgICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxpbnQsIFQ+IGJ5SWQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFQ+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PFN0cmluZywgVD4gYnlOYW1lID0gbmV3IERpY3Rpb25hcnk8U3RyaW5nLCBUPigpOworCisgICAgICAgIHByaXZhdGUgQm9vbGVhbiBsb2NrZWQ7Cit9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9JbXBvcnRFeHBvcnRIZWxwZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9JbXBvcnRFeHBvcnRIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0NzhiOAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL0ltcG9ydEV4cG9ydEhlbHBlci5jcwpAQCAtMCwwICsxLDk0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gY2xhc3MgdXNlZCB0byBpbXBsZW1lbnQgVmFsdWVGYWN0b3J5IGJhc2VkIGltcG9ydCAvIGV4cG9ydCBjb2RlCisgICAgLy8vIGZvciBzZXJ2aWNlIGRlZmluZWQgdHlwZXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgSW1wb3J0RXhwb3J0SGVscGVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgSW1wb3J0RXhwb3J0SGVscGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgZXYgPSBkZWxlZ2F0ZShWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIm11c3Qgb3ZlcnJpZGUgRXhwb3J0VmFsdWUgbWV0aG9kIik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaXYgPSBkZWxlZ2F0ZShTdHJ1Y3RWYWx1ZSBzdikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIm11c3Qgb3ZlcnJpZGUgSW1wb3J0VmFsdWUgbWV0aG9kIik7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEltcG9ydEV4cG9ydEhlbHBlciggRXhwb3J0VmFsdWVEZWxlZ2F0ZSBldiwgSW1wb3J0VmFsdWVEZWxlZ2F0ZSBpdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChldiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImV2ID09IG51bGwiKTsKKworICAgICAgICAgICAgaWYgKGl2ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaXYgPT0gbnVsbCIpOworCisgICAgICAgICAgICB0aGlzLmV2ID0gZXY7CisgICAgICAgICAgICB0aGlzLml2ID0gaXY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4cG9ydFZhbHVlRGVsZWdhdGUgZXY7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJbXBvcnRWYWx1ZURlbGVnYXRlIGl2OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEV4cG9ydHMgYSB2YWx1ZSBieSBjcmVhdGluZyBhbiBlcXVpdmFsZW50IFN0cnVjdFZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZmIj50aGUgdmFsdWUgZmFjdG9yeSB1c2VkIHRvIGV4cG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5hIHNlcnZpY2UgZGVmaW5lZCB0eXBlIHRvIGV4cG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YSBTdHJ1Y3RWYWx1ZSByZXByZXNlbnRpbmcgdGhlIGV4cG9ydGVkIHZhbHVlLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgU3RydWN0VmFsdWUgRXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGV2KCB2ZiwgdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEltcG9ydHMgYSB2YWx1ZSBmcm9tIGFuIGVxdWl2YWxlbnQgU3RydWN0VmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3YiPmEgU3RydWN0VmFsdWUgcmVwcmVzZW50aW5nIHRoZSBleHBvcnRlZCB2YWx1ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YSBzZXJ2aWNlIGRlZmluZWQgdHlwZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIE9iamVjdCBJbXBvcnRWYWx1ZSggU3RydWN0VmFsdWUgc3YgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXYoIHN2ICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFeHBvcnRzIGEgdmFsdWUgYnkgY3JlYXRpbmcgYW4gZXF1aXZhbGVudCBTdHJ1Y3RWYWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2ZiI+dGhlIHZhbHVlIGZhY3RvcnkgdG8gdXNlIGZvciBleHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+YSBzZXJ2aWNlIGRlZmluZWQgdHlwZSB0byBleHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgU3RydWN0VmFsdWUgcmVwcmVzZW50aW5nIHRoZSBleHBvcnRlZCB2YWx1ZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSBTdHJ1Y3RWYWx1ZSBFeHBvcnRWYWx1ZURlbGVnYXRlKFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbXBvcnRzIGEgdmFsdWUgZnJvbSBhbiBlcXVpdmFsZW50IFN0cnVjdFZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN2Ij5hIFN0cnVjdFZhbHVlIHJlcHJlc2VudGluZyB0aGUgZXhwb3J0ZWQgdmFsdWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgc2VydmljZSBkZWZpbmVkIHR5cGUuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgT2JqZWN0IEltcG9ydFZhbHVlRGVsZWdhdGUoIFN0cnVjdFZhbHVlIHN2ICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvTWVzc2FnZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL01lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNWI5YQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL01lc3NhZ2UuY3MKQEAgLTAsMCArMSwxMDYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworICAgIC8vLzxzdW1tYXJ5PiBBIG1lc3NhZ2UgaXMgbW9kZWxlZCBhcyBhIGNvbW1hbmQgYW5kIHNvbWUgYXJnbWVudHMuIFRoZSBjb21tYW5kIGlzIGFuIGFyYml0cmFyeQorICAgIC8vLyBpbnRlZ2VyIHZhbHVlLCBhbmQgdGhlIGFyZ3VtZW50cyBhcmUga2V5IC8gdmFsdWUgcGFpcnMsIHdoZXJlIHRoZSBrZXkgaXMgYW4gYXJiaXRyYXJ5IGludGVnZXIgCisgICAgLy8vIHZhbHVlIGFuZCB0aGUgdmFsdWUgaXMgYW55IG9uZSBvZiB0aGUgc3RhbmRhcmQgQyMgb2JqZWN0cywgYW4gQXJyYXlWYWx1ZSwgYSBTdHJ1Y3RWYWx1ZSwgb3IgYW55IHR5cGUKKyAgICAvLy8gd2hpY2ggbWF5IGJlIHNlcmlhbGl6ZWQgYnkgdGhlIFZhbHVlRmFjdG9yeS48L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBNZXNzYWdlIDogU3RydWN0VmFsdWUKKyAgICB7CisgICAgICAgIC8vLzxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIE1lc3NhZ2UuPC9zdW1tYXJ5PgorICAgICAgICAvLy88cGFyYW0gbmFtZT0idHlwZSI+dHlwZSBvZiB0aGUgbWVzc2FnZSAoY29tbWFuZCkuPC9wYXJhbT4gCisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJ2ZiI+IHZmIHRoZSB2YWx1ZSBmYWN0b3J5LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBNZXNzYWdlKFhUeXBlIHR5cGUsIFZhbHVlRmFjdG9yeSB2ZikKKyAgICAgICAgICAgIDogdGhpcyh0eXBlLCB2ZiwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgfQorCisgICAgICAgIC8vLzxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIE1lc3NhZ2UuPC9zdW1tYXJ5PgorICAgICAgICAvLy88cGFyYW0gbmFtZT0idHlwZSI+dHlwZSBvZiB0aGUgbWVzc2FnZSAoY29tbWFuZCkuPC9wYXJhbT4gCisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJ2ZiI+dmYgdGhlIHZhbHVlIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vPHBhcmFtIG5hbWU9Imxlbmd0aCI+IHRoZSBleHBlY3RlZCBudW1iZXIgb2YgbmFtZS92YWx1ZSBwYWlyczwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBNZXNzYWdlKFhUeXBlIHR5cGUsIFZhbHVlRmFjdG9yeSB2ZiwgaW50IGxlbmd0aCkKKyAgICAgICAgICAgIDogYmFzZSh0eXBlLCB2ZiwgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnZmID0gdmY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFZhbHVlRmFjdG9yeSB2ZjsKKworICAgICAgICAvLy88cmV0dXJucz50aGUgdmFsdWUgZmFjdG9yeS48L3JldHVybnM+ICAgICAKKyAgICAgICAgcHVibGljIFZhbHVlRmFjdG9yeSBWZgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgCisgICAgICAgLy8vIDxzdW1tYXJ5PkNyZWF0ZXMgYSBtZXNzYWdlIHdoaWNoIGlzIGEgcmVwbHkgdG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4gVGhlIGN1cnJlbnQgbWVzc2FnZSdzIHZhbHVlIAorICAgICAgIC8vLyBmYWN0b3J5IGlzIGNvcGllZCB0byB0aGUgbmV3IG1lc3NhZ2UuIFRoZSBtZXNzYWdlLWlkIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UgKGlmIGFueSkgaXMgY29waWVkIGludG8gCisgICAgICAgLy8vIHRoZSBpbi1yZXBseS10byBmaWVsZCBvZiB0aGUgbmV3IG1lc3NhZ2UuPC9zdW1tYXJ5PgorICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iclR5cGUiPiByVHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVwbHkuPC9wYXJhbT4KKyAgICAgICAvLy8gPHJldHVybnM+IGEgcmVwbHkgbWVzc2FnZS48L3JldHVybnM+ICAgICAgIAorICAgICAgICBwdWJsaWMgTWVzc2FnZSBSZXBseSggWFR5cGUgclR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlIHJtc2cgPSBuZXcgTWVzc2FnZSggclR5cGUsIHZmICk7CisgICAgICAgICAgICBybXNnLkluUmVwbHlUbyA9IE1lc3NhZ2VJZDsgLy9ybXNnLkluUmVwbHlUbyhHZXRNZXNzYWdlSWQoKSk7IGNoYW5nZWQKKyAgICAgICAgICAgIHJldHVybiBybXNnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc3NhZ2UgUmVwbHkoKQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlIHJtc2cgPSBuZXcgTWVzc2FnZSggR2V0WFR5cGUuR2V0UmVzdWx0KCksIHZmICk7CisgICAgICAgICAgICBybXNnLkluUmVwbHlUbyA9IE1lc3NhZ2VJZDsKKyAgICAgICAgICAgIHJldHVybiBybXNnOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBjb25uZWN0aW9uIHNwZWNpZmljIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgbWVzc2FnZSwgb3IgbnVsbCBpZiB0aGVyZSB3YXMgbm8gCisgICAgICAgIC8vLyBzdWNoIGlkZW50aWZpZXIuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgbG9uZz8gTWVzc2FnZUlkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB2Zi5HZXRNZXNzYWdlSWQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2Zi5TZXRNZXNzYWdlSWQodGhpcywgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAvLy8gPHJldHVybnM+dGhlIG1lc3NhZ2UtaWQgb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIGlzIGEgcmVzcG9uc2UgdG8uIE51bGwgaWYgdGhpcyBpcyBhbiBvcmlnaW5hbCBtZXNzYWdlIAorICAgICAgIC8vLyBvciBpZiB0aGUgb3JpZ2luYWwgbWVzc2FnZSBkaWQgbm90IGhhdmUgYSBtZXNzYWdlLWlkLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGxvbmc/IEluUmVwbHlUbworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmYuR2V0SW5SZXBseVRvKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmYuU2V0SW5SZXBseVRvKHRoaXMsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL1N0cnVjdFZhbHVlLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvU3RydWN0VmFsdWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1M2UxMAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL1N0cnVjdFZhbHVlLmNzCkBAIC0wLDAgKzEsMjIzIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKworICAgIC8vL0EgdHlwZWQgbWFwIG9mIGtleS92YWx1ZSBwYWlycywgd2hlcmUgdGhlIHR5cGUgaXMgYSBUeXBlLCBlYWNoIGtleSBpcyBhIEZpZWxkLCAKKyAgICAvLy9hbmQgZWFjaCB2YWx1ZSBpcyBvZiBhcmJpdHJhcnkgdHlwZSBjaG9zZW4gZnJvbSB0aGUgYmFzaWMgamF2YSB0eXBlcyBib29sZWFuLCBieXRlLCAKKyAgICAvLy9zaG9ydCwgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlLCBTdHJpbmcsIGFuIGFycmF5IG9mIHRob3NlLCB0aGUgZXh0ZW5kZWQgdHlwZXMgQXJyYXlWYWx1ZSAKKyAgICAvLy9hbmQgU3RydWN0VmFsdWUsIGFuZCBzcGVjaWZpYyB0eXBlcyBzdXBwb3J0ZWQgYnkgVmFsdWVGYWN0b3J5LiAKKyAgICAvLy9TdHJ1Y3RWYWx1ZSBpcyBub3QgcHJvdGVjdGVkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MuCisgICAgcHVibGljIGNsYXNzIFN0cnVjdFZhbHVlIAorICAgIHsKKyAgICAgICAgLy8vPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgU3RydWN0VmFsdWUgd2l0aCBkZWZhdWx0IGxlbmd0aC48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj50aGUgdHlwZSBvZiB0aGUgc3RydWN0IChvciB0aGUgYWN0aW9uIG9yIGV2ZW50IGlmCisgICAgICAgIC8vL3RoaXMgaXMgYSBtZXNzYWdlKS48L3BhcmFtPgorICAgICAgICAvLy88cGFyYW0gbmFtZT0idmYiPnRoZSB2YWx1ZSBmYWN0b3J5IGZvciB0aGlzIHN0cnVjdDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBTdHJ1Y3RWYWx1ZShYVHlwZSB0eXBlLCBWYWx1ZUZhY3RvcnkgdmYpCisgICAgICAgICAgICA6IHRoaXModHlwZSwgdmYsIDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIH0KKworICAgICAgICAvLy88c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBTdHJ1Y3RWYWx1ZS48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj50aGUgdHlwZSBvZiB0aGUgc3RydWN0IChvciB0aGUgYWN0aW9uIG9yIGV2ZW50IGlmCisgICAgICAgIC8vL3RoaXMgaXMgYSBtZXNzYWdlKS48L3BhcmFtPgorICAgICAgICAvLy88cGFyYW0gbmFtZT0ibGVuZ3RoIj50aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIG5hbWUvdmFsdWUgcGFpcnMuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFN0cnVjdFZhbHVlKFhUeXBlIHR5cGUsIFZhbHVlRmFjdG9yeSB2ZiwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0eXBlID09IG51bGwiKTsKKworICAgICAgICAgICAgaWYgKHZmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidmYgPT0gbnVsbCIpOworCisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBuZXcgRGljdGlvbmFyeTxGaWVsZCwgT2JqZWN0PihsZW5ndGggPiAwID8gKGxlbmd0aCAqIDQgKyAyKSAvIDMgOiBERUZBVUxUX1NJWkUpOworICAgICAgICAgICAgdGhpcy5sZXZlbCA9IHZmLkdldExldmVsKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX1NJWkUgPSA4OworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgdHlwZTsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8RmllbGQsIE9iamVjdD4gZmllbGRzOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsaWRhdG9yLkxldmVsIGxldmVsOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBzdHJ1Y3QgdHlwZSwgb3IgbWVzc2FnZSBhY3Rpb24gb3IgZXZlbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRYVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB2YWxpZGF0aW9uIGxldmVsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVmFsaWRhdG9yLkxldmVsIExldmVsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5Db21wYXJlcyB0aGUgdHlwZSBvZiB0aGlzIHN0cnVjdCB0byBhbm90aGVyIHR5cGUuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im90aGVyVHlwZSI+b3RoZXJUeXBlIHRoZSB0eXBlIHRvIGNvbXBhcmUgdGhpcyB0eXBlIHRvLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoaXMgc3RydWN0IGlzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIElzVHlwZShYVHlwZSBvdGhlclR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLkVxdWFscyhvdGhlclR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PkNoZWNrcyBhIHN0cnVjdCBmb3IgaGF2aW5nIHRoZSBleHBlY3RlZCB0eXBlLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJleHBlY3RlZFR5cGUiPmV4cGVjdGVkVHlwZSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGlzIHN0cnVjdC48L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0eXBlIGlzIG5vdCBhcyBleHBlY3RlZC4KKyAgICAgICAgcHVibGljIHZvaWQgQ2hlY2tUeXBlKFhUeXBlIGV4cGVjdGVkVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIUlzVHlwZShleHBlY3RlZFR5cGUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERpY3Rpb25hcnk8RmllbGQsIE9iamVjdD4uRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxGaWVsZCwgT2JqZWN0Pi5LZXlDb2xsZWN0aW9uIEtleXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5LZXlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnNLZXkoRmllbGQga2V5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmllbGRzLkNvbnRhaW5zS2V5KGtleSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+RGVmaW5lZCB0byBnZXQgdGhlIE9iamVjdCByZXR1cm4gdHlwZTwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXkiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBPYmplY3QgR2V0KEZpZWxkIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5UcnlHZXRWYWx1ZShrZXksIG91dCB2YWx1ZSkgPyB2YWx1ZSA6IG51bGw7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPdmVycmlkaW5nIERpY3Rpb25hcnkncyBBZGQoa2V5LCB2YWx1ZSkgZnVuY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXkiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChGaWVsZCBrZXksIE9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRzLlJlbW92ZShrZXkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxldmVsICE9IFZhbGlkYXRvci5MZXZlbC5OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbGlkYXRvciB2ID0gdHlwZS5HZXRWYWxpZGF0b3Ioa2V5KTsKKworICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwgJiYgbGV2ZWwgPT0gVmFsaWRhdG9yLkxldmVsLkZVTEwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRvciBtaXNzaW5nIGZvciB0eXBlIHswfSBmaWVsZCB7MX0iLCB0eXBlLCBrZXkpKTsKKworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgIXYuVmFsaWRhdGUodmFsdWUpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0b3IgezB9IGZhaWxlZCBmb3IgdHlwZSB7MX0gZmllbGQgezJ9IDogdmFsdWUgezN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHYsIHR5cGUsIGtleSwgdmFsdWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmllbGRzW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgdGhpc1tGaWVsZCBrZXldCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXQoa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZShGaWVsZCBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpZWxkcy5SZW1vdmUoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyBPdmVycmlkZQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoICJ7MH06IHsxfSIsIHR5cGUsIFByaW50RWxlbWVudHNPZk1hcCgpICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IHRoZSBlbGVtZW50cyBvZiBhIAorICAgICAgICAvLy8gbWFwIGxpa2UgdGhlIHdheSBKYXZhIGRvZXMgKGZvciBoYXNobWFwKS4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFByaW50RWxlbWVudHNPZk1hcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kKCAieyIgKTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBLZXlWYWx1ZVBhaXI8RmllbGQsIE9iamVjdD4gbWUgaW4gdGhpcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoICIsICIgKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIG1lLktleSApOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCggIj0iICk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCBtZS5WYWx1ZSApOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2IuQXBwZW5kKCAifSIgKTsKKworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9UeXBlTWFwLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvVHlwZU1hcC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc3NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvVHlwZU1hcC5jcwpAQCAtMCwwICsxLDMyIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFR5cGVNYXAgaXMgYW4gSWROYW1lTWFwIGZvciBUeXBlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVHlwZU1hcCA6IElkTmFtZU1hcDxYVHlwZT4KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBYVHlwZSBNYWtlTmV3KCBzdHJpbmcgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWFR5cGUoIG5hbWUgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL1ZhbGlkYXRvci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvTXNnL1ZhbGlkYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZlOTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvVmFsaWRhdG9yLmNzCkBAIC0wLDAgKzEsODUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWYWxpZGF0ZSB2YWx1ZXMgcHV0IGludG8gbWVzc2FnZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGFic3RyYWN0IHB1YmxpYyBjbGFzcyBWYWxpZGF0b3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB2YWxpZGF0aW9uIGxldmVsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZW51bSBMZXZlbAorICAgICAgICB7CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gTm8gdmFsaWRhdGlvbiBvbiBwdXQgb3Igb3V0cHV0LgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIE5PTkUsCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gVmFsaWRhdGlvbiBvbiBwdXQgb3Igb3V0cHV0IGlmIHZhbGlkYXRvciBkZWZpbmVkLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIE1JU1NJTkdfT0ssCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gTGlrZSBNSVNTSU5HX09LLCBidXQgZmFpbCBpZiBubyB2YWxpZGF0b3IgZGVmaW5lZC4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBGVUxMCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYXJyYXlzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTUFYX05ESU1TID0gOTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdG9ycyB0byBjYWNoZSBwZXIgdHlwZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IGludCBNQVhfQ0FDSEVEID0gNDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmZvciBhbiBhcnJheSB0eXBlLCByZXR1cm4gYSB2YWxpZGF0b3IgZm9yIGFuIGVsZW1lbnQgb2YKKyAgICAgICAgLy8vIHRoZSBhcnJheSAod2hpY2ggbWlnaHQgYmUgYSBzY2FsYXIgb3IgYW5vdGhlciBhcnJheSBlbGVtZW50KS48L3JldHVybnM+CisgICAgICAgIGFic3RyYWN0IHB1YmxpYyBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENoZWNrcyB0aGUgdmFsdWUgZm9yIGJlaW5nIHZhbGlkLiBJZiB0aGUgdmFsdWUgaXMgdmFsaWQKKyAgICAgICAgLy8vIGJ5IHRoaXMgdmFsaWRhdG9yLCByZXR1cm4gdHJ1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+dGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdmFsaWQgYnkgYW55IHZhbGlkYXRvciBpbiB0aGUKKyAgICAgICAgLy8vIGNoYWluLCBvciBmYWxzZSBpZiBhbGwgcmVqZWN0IGl0LjwvcmV0dXJucz4KKyAgICAgICAgYWJzdHJhY3QgcHVibGljIGJvb2wgVmFsaWRhdGUoIE9iamVjdCB2YWx1ZSApOworCisgICAgICAgCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorCSAgICAvLy8gPHJldHVybnM+IHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZ2l2ZW4gdGhlIGlucHV0IHZhbHVlIGFuZCB0aGlzCisJICAgIC8vLyB2YWxpZGF0b3IncyBzZW5zaWJpbGl0eSBhYm91dCB3aGF0IGl0IHNob3VsZCBiZSByZWFsbHkgKGUuZy4sCisJICAgIC8vLyBpbnB1dCBCeXRlIGJ1dCBvdXRwdXQgTG9uZy4gPC9yZXR1cm5zPgorCSAKKyAgICAgICAgYWJzdHJhY3QgcHVibGljIE9iamVjdCBWYWxpZGF0ZVZhbHVlKE9iamVjdCB2YWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvVmFsdWVGYWN0b3J5LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvVmFsdWVGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MWNjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9WYWx1ZUZhY3RvcnkuY3MKQEAgLTAsMCArMSwxNzAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeyAKKyAgICAvLy8gPHN1bW1hcnk+SW50ZXJmYWNlIHdoaWNoIGRlZmluZXMgdGhlIHZhbHVlIGZhY3Rvcnkgd2hpY2ggaGVscHMKKyAgICAvLy8gIHRoZSBpZGwgY29tcGlsZXIgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBtZXNzYWdlcywgY29udmVydCB2YWx1ZXMsIGV0Yy48L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBWYWx1ZUZhY3RvcnkgCisgICAgeworICAgICAgICAvLy8vLy8vLy8vCisgICAgICAgIC8vIFhUeXBlIC8vCisgICAgICAgIC8vLy8vLy8vLy8KKworICAgICAgICAvLy8gPHN1bW1hcnk+VHJhbnNsYXRlcyBhIHR5cGUgaWQgaW50byB0aGUgYXBwcm9wcmlhdGUgWFR5cGUgb2JqZWN0LgorICAgICAgICAvLy8gSWYgdGhlIHR5cGUgZG9lcyBub3QgZXhpc3QsIGFuZCBpZiBkeW5hbWljIHR5cGluZyBpcyBlbmFibGVkLAorICAgICAgICAvLy8gYWRkcyBpdCB0byB0aGUgZHluYW1pYyB0eXBlcy48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbT4gaWQgYSB0eXBlIGlkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz4gaWQgdHJhbnNsYXRlZCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBYVHlwZS48L3JldHVybnM+ICAKKyAgICAgICAgWFR5cGUgR2V0VHlwZShpbnQgaWQpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT5UcmFuc2xhdGVzIGEgdHlwZSBuYW1lIGludG8gdGhlIGFwcHJvcHJpYXRlIFhUeXBlIG9iamVjdC4KKyAgICAgICAgLy8vIElmIHRoZSB0eXBlIGRvZXMgbm90IGV4aXN0LCBhbmQgaWYgZHluYW1pYyB0eXBpbmcgaXMgZW5hYmxlZCwKKyAgICAgICAgLy8vIGFkZHMgaXQgdG8gdGhlIGR5bmFtaWMgdHlwZXMuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtPm5hbWUgYSB0eXBlIG5hbWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPiBuYW1lIHRyYW5zbGF0ZWQgaW50byB0aGUgYXBwcm9wcmlhdGUgWFR5cGUuPC9yZXR1cm5zPgorICAgICAgICAKKyAgICAgICAgWFR5cGUgR2V0VHlwZShzdHJpbmcgbmFtZSk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyB0aGUgdHlwZSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuIFVzZSB0aGlzIHRvIGR5bmFtaWNhbGx5IGFkZAorICAgICAgICAvLy8gdHlwZXMgdG8gYSBWYWx1ZUZhY3RvcnkuIFRoZSB0eXBlIGlzIHBlciBpbnN0YW5jZSBvZiB0aGUgVmFsdWVGYWN0b3J5LAorICAgICAgICAvLy8gbm90IGdsb2JhbC4gTm90IGF2YWlsYWJsZSBpZiBkeW5hbWljIHR5cGluZyBpcyBsb2NrZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgICAgICAgdm9pZCBBZGRUeXBlKFhUeXBlIHR5cGUpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvY2tzIHRoZSBkeW5hbWljIHR5cGluZyBzbyB0aGF0IG5vIG5ldyB0eXBlcyBtYXkgYmUgY3JlYXRlZCBieSBhZGRUeXBlCisgICAgICAgIC8vLyBvciBnZXRUeXBlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIExvY2tEeW5hbWljVHlwZXMoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVbmxvY2tzIHRoZSBkeW5hbWljIHR5cGluZyBzbyB0aGF0IG5ldyB0eXBlcyBtYXkgYmUgY3JlYXRlZCBieSBhZGRUeXBlCisgICAgICAgIC8vLyBvciBnZXRUeXBlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIFVubG9ja0R5bmFtaWNUeXBlcygpOworCisgICAgICAgIC8vLyA8cmV0dXJucz4gYSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgdHlwZXMuPC9yZXR1cm5zPgorICAgICAgICBJQ29sbGVjdGlvbjxYVHlwZT4gR2V0VHlwZXMoKTsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gU1RSSU5HIEVOQ09ESU5HIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIC8vLzxyZXR1cm5zPiB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvciBzdHJpbmdzLgorICAgICAgICBFbmNvZGluZyBHZXRTdHJpbmdFbmNvZGluZygpOworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gTUVTU0FHRSBJRCAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtc2ciPm1zZyB0aGUgbWVzc2FnZSB3aG9zZSB3ZWxsLWtub3duIG1lc3NhZ2UtaWQgZmllbGQgaXMgdG8gYmUgcmV0dXJuZWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSB2YWx1ZSBvZiB0aGUgd2VsbC1rbm93biBtZXNzYWdlLWlkIGZpZWxkLiBUaGlzIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgCisgICAgICAgIC8vLyBmb3IgdGhpcyBtZXNzYWdlIG9uIGEgcGFydGljdWxhciB0cmFuc3BvcnQgZHVyaW5nIGEgcGFydGljdWxhciBzZXNzaW9uLiBJZiB0aGVyZSBpcyBubyB3ZWxsLWtub3duIAorICAgICAgICAvLy8gbWVzc2FnZS1pZCBmaWVsZCBkZWZpbmVkLCBvciBpZiB0aGUgbWVzc2FnZS1pZCBmaWVsZCBoYXMgbm90IGJlZW4gc2V0LCB0aGVuIHJldHVybiBudWxsLjwvcmV0dXJucz4KKworICAgICAgICBsb25nPyBHZXRNZXNzYWdlSWQoTWVzc2FnZSBtc2cpOworICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgd2VsbC1rbm93biBtZXNzYWdlLWlkIGZpZWxkLiBUaGlzIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgCisgICAgICAgIC8vLyBmb3IgdGhpcyBtZXNzYWdlIG9uIGEgcGFydGljdWxhciB0cmFuc3BvcnQgZHVyaW5nIGEgcGFydGljdWxhciBzZXNzaW9uLiBJZiB0aGVyZSBpcyBubyAKKyAgICAgICAgLy8vIHdlbGwta25vd24gbWVzc2FnZS1pZCBmaWVsZCBkZWZpbmVkIHRoZW4gbm90aGluZyBpcyBkb25lLiBJZiBtc2dpZCBpcyBudWxsLCB0aGVuIHRoZSBmaWVsZCBpcyBjbGVhcmVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtPm1zZyB0aGUgbWVzc2FnZSB3aG9zZSB3ZWxsLWtub3duIG1lc3NhZ2UtaWQgZmllbGQgaXMgdG8gYmUgc2V0LjwvcGFyYW0+IAorICAgICAgICAvLy8gPHBhcmFtPm1zZ2lkIHRoZSB2YWx1ZSBvZiB0aGUgd2VsbC1rbm93biBtZXNzYWdlLWlkIGZpZWxkLjwvcGFyYW0+IAorICAgICAgICAKKyAgICAgICAgdm9pZCBTZXRNZXNzYWdlSWQoTWVzc2FnZSBtc2csIGxvbmc/IG1zZ2lkKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHdlbGwta25vd24gbWVzc2FnZSBmaWVsZCBmb3IgbWVzc2FnZSBpZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPndlbGwta25vd24gbWVzc2FnZSBmaWVsZCBmb3IgbWVzc2FnZSBpZC48L3JldHVybnM+CisgICAgICAgIEZpZWxkIEdldF9tZl9fbWVzc2FnZUlkKCk7CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gSU4gUkVQTFkgVE8gLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICAvLy8gPHJldHVybnM+dGhlIHZhbHVlIG9mIHRoZSBpbi1yZXBseS10byBmaWVsZCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lIG9yIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZmllbGQgZGVmaW5lZC4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgLy8vPHBhcmFtPiBtc2cgdGhlIG1lc3NhZ2Ugd2hvc2Ugd2VsbC1rbm93biBpbi1yZXBseS10byBmaWVsZCBpcyB0byBiZSByZXR1cm5lZC48L3BhcmFtPgorCisgICAgICAgIGxvbmc/IEdldEluUmVwbHlUbyhNZXNzYWdlIG1zZyk7CisKKyAgICAgICAgLy8vIDxwYXJhbT5tc2cgdGhlIG1lc3NhZ2Ugd2hvc2Ugd2VsbC1rbm93biBpbi1yZXBseS10byBmaWVsZCBpcyB0byBiZSBzZXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbT5tc2dpZCB0aGUgdmFsdWUgb2YgdGhlIHdlbGwta25vd24gaW4tcmVwbHktdG8gZmllbGQuIElmIHRoZXJlIGlzIG5vIHdlbGwta25vd24gCisgICAgICAgIC8vLyBpbi1yZXBseS10byBmaWVsZCBkZWZpbmVkIHRoZW4gbm90aGluZyBpcyBkb25lLiBJZiBtc2dpZCBpcyBudWxsLCB0aGVuIHRoZSBmaWVsZCBpcyBjbGVhcmVkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+IAorICAgICAgICAKKyAgICAgICAgdm9pZCBTZXRJblJlcGx5VG8oTWVzc2FnZSBtc2csIGxvbmc/IG1zZ2lkKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHdlbGwta25vd24gbWVzc2FnZSBmaWVsZCBmb3IgaW4gcmVwbHkgdG8uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz53ZWxsLWtub3duIG1lc3NhZ2UgZmllbGQgZm9yIGluIHJlcGx5IHRvLjwvcmV0dXJucz4KKyAgICAgICAgRmllbGQgR2V0X21mX19pblJlcGx5VG8oKTsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIFZBTFVFIENPTlZFUlNJT04gLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIC8vLyA8c3VtbWFyeT5Db252ZXJ0cyBhIHZhbHVlIHRvIGEgc3RydWN0IHZhbHVlIHJlcHJlc2VudGF0aW9uIHRvIGJlIGV4cG9ydGVkIHRvIGEgdGFnZ2VkIGRhdGEgb3V0cHV0Ljwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbT52YWx1ZSBhIGN1c3RvbSB0eXBlIGRlZmluZWQgYnkgYSBzZXJ2aWNlLCBvciBhIHdlbGwta25vd24gc3RhbmRhcmQgdHlwZSAoZS5nLiwgZGF0ZSkuPC9wYXJhbT4gCisgICAgICAgIC8vLyA8cmV0dXJucz4gYSBzdHJ1Y3QgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZS48L3JldHVybnM+CisgICAgICAgIC8vLyA8dGhyb3dzPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBleHBvcnRlZC48L3Rocm93cz4gCisgICAgICAgIAorICAgICAgICBTdHJ1Y3RWYWx1ZSBFeHBvcnRDdXN0b21WYWx1ZShvYmplY3QgdmFsdWUpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT5Db252ZXJ0cyBhIHN0cnVjdCB2YWx1ZSBpbXBvcnRlZCBmcm9tIGEgdGFnZ2VkIGRhdGEgaW5wdXQgdG8gYSBub3JtYWwgdHlwZS48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0+c3YgYSBzdHJ1Y3QgdmFsdWUgcmVwcmVzZW50YXRpb24gb2YgYSBjdXN0b20gdHlwZSwgb3IgYSB3ZWxsIGtub3duIHN0YW5kYXJkIHR5cGUuPC9wYXJhbT4gCisgICAgICAgIC8vLyA8cmV0dXJucz4gYSBjdXN0b20gdHlwZSwgb3IgYSB3ZWxsIGtub3duIHN0YW5kYXJkIHR5cGUuPC9yZXR1cm5zPgorICAgICAgICAvLy8gPHRocm93cz4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHR5cGUgY2Fubm90IGJlIGltcG9ydGVkLjwvdGhyb3dzPgorICAgICAgICAKKyAgICAgICAgT2JqZWN0IEltcG9ydEN1c3RvbVZhbHVlKFN0cnVjdFZhbHVlIHN2KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjIj50aGUgY2xhc3Mgb2YgYSBjdXN0b20gdmFsdWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBzdHJ1Y3QgdHlwZSBvZiBhIGN1c3RvbSB2YWx1ZSBjbGFzcy48L3JldHVybnM+CisgICAgICAgIFhUeXBlIEdldEN1c3RvbVN0cnVjdFR5cGUoIFR5cGUgYyApOworCisgICAgICAgIC8vLzxzdW1tYXJ5Pjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPndlbGwta25vd24gbWVzc2FnZSB0eXBlIGZvciBleGNlcHRpb24gdGhyb3duIGJ5IG9uZS13YXkgbWVzc2FnZTwvcmV0dXJucz4JCisgICAgICAgIFhUeXBlIGdldF9tdF9fZXhjZXB0aW9uKCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgcHV0IC8gd3JpdGUgdmFsaWRhdGlvbiBsZXZlbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBwdXQgLyB3cml0ZSB2YWxpZGF0aW9uIGxldmVsPC9yZXR1cm5zPgorICAgICAgICBWYWxpZGF0b3IuTGV2ZWwgR2V0TGV2ZWwoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIHRoZSBwdXQgLyB3cml0ZSB2YWxpZGF0aW9uIGxldmVsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxldmVsIj50aGUgbmV3IHB1dCAvIHdyaXRlIHZhbGlkYXRpb24gbGV2ZWw8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG9sZCBwdXQgLyB3cml0ZSB2YWxpZGF0aW9uIGxldmVsPC9yZXR1cm5zPgorICAgICAgICBWYWxpZGF0b3IuTGV2ZWwgU2V0TGV2ZWwoVmFsaWRhdG9yLkxldmVsIGxldmVsKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvWFR5cGUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL01zZy9YVHlwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTAyNmZjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9Nc2cvWFR5cGUuY3MKQEAgLTAsMCArMSwzNDEgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFR5cGUgZGVub3RlcyB0aGUgdHlwZSBvZiBhIHN0cnVjdCBvciBtZXNzYWdlLiBXaGVuIHVzZWQgd2l0aCBhCisgICAgLy8vIG1lc3NhZ2UgaXQgdHlwaWNhbGx5IGRlbm90ZXMgYW4gYWN0aW9uIG9yIGV2ZW50LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFhUeXBlIDogSWROYW1lCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgVHlwZS48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaWQiPmlkIG9mIHRoZSB0eXBlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+bmFtZSBvZiB0aGUgdHlwZS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgWFR5cGUoIGludCBpZCwgU3RyaW5nIG5hbWUgKQorICAgICAgICAgICAgOiBiYXNlKCBpZCwgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgZWxzZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBUeXBlLCBjb21wdXRpbmcgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciB0aGUgaWQuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPm5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFhUeXBlKCBTdHJpbmcgbmFtZSApCisgICAgICAgICAgICA6IGJhc2UoIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIGVsc2UuCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmFsaWRhdG9yIEdldFZhbGlkYXRvciggRmllbGQga2V5ICkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdG9yIHY7CisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9ycy5UcnlHZXRWYWx1ZShrZXksIG91dCB2KSA/IHYgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZE1hcCBmaWVsZE1hcCA9IG5ldyBGaWVsZE1hcCgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgdGhlIHZhbGlkYXRvciB0byB0aGUgY2hhaW4gZm9yIHRoaXMga2V5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2bGR0ciI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgUHV0VmFsaWRhdG9yKCBGaWVsZCBrZXksIFZhbGlkYXRvciB2bGR0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90TG9ja2VkKCk7CisKKyAgICAgICAgICAgIGlmICggdmxkdHIgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoIGZpZWxkTWFwLkdldCgga2V5LklkICkgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgQWRkRmllbGQoIGtleSApOworCisgICAgICAgICAgICBWYWxpZGF0b3IgdjsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3JzLlRyeUdldFZhbHVlKGtleSwgb3V0IHYpKQorICAgICAgICAgICAgICAgIHZhbGlkYXRvcnNba2V5XSA9IG5ldyBDb21ib1ZhbGlkYXRvcih2LCB2bGR0cik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsaWRhdG9yc1trZXldID0gdmxkdHI7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmVzIHRoZSB2YWxpZGF0b3IgY2hhaW4gZm9yIHRoaXMga2V5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhclZhbGlkYXRvciggRmllbGQga2V5ICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3RMb2NrZWQoKTsKKyAgICAgICAgICAgIHZhbGlkYXRvcnMuUmVtb3ZlKCBrZXkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PEZpZWxkLCBWYWxpZGF0b3I+IHZhbGlkYXRvcnMgPSBuZXcgRGljdGlvbmFyeTxGaWVsZCwgVmFsaWRhdG9yPigpOworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgcmVzdWx0IHR5cGUgb2YgdGhpcyBtZXNzYWdlIHR5cGU8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gclR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRSZXN1bHQoIFhUeXBlIHJUeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3RMb2NrZWQoKTsKKyAgICAgICAgICAgIHRoaXMuclR5cGUgPSByVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgWFR5cGUgclR5cGU7CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBhc3NvY2lhdGVkIGltcG9ydCAvIGV4cG9ydCBoZWxwZXI8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBJbXBvcnRFeHBvcnRIZWxwZXIgR2V0SW1wb3J0RXhwb3J0SGVscGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhlbHBlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgdGhlIGFzc29jaWF0ZWQgaW1wb3J0IC8gZXhwb3J0IGhlbHBlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJoZWxwZXIiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNldEltcG9ydEV4cG9ydEhlbHBlciggSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90TG9ja2VkKCk7CisgICAgICAgICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlcjsKKworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBhc3NvY2lhdGVkIGNvbXBvbmVudCB0eXBlIGZvciBhbiBhcnJheSBvZiB0aGlzIHR5cGU8L3JldHVybnM+CisKKyAgICAgICAgcHVibGljIFR5cGUgR2V0Q29tcG9uZW50VHlwZSgpCisJICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUeXBlOworCSAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0cyB0aGUgYXNzb2NpYXRlZCBjb21wb25lbnQgdHlwZSBmb3IgYW4gYXJyYXkgb2YgdGhpcyB0eXBlLgorCSAgICAvLy8gVGhpcyB0eXBlIGlzIG5vdCB1c2VkIHdoZW4gZGUtc2VyaWFsaXppbmcgdGhlIGFycmF5IGNvbXBvbmVudHMsCisJICAgIC8vLyBqdXN0IHdoZW4gYWxsb2NhdGluZyB0aGUgYXJyYXkgaXRzZWxmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0Q29tcG9uZW50VHlwZShUeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90TG9ja2VkKCk7CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUeXBlIGNvbXBvbmVudFR5cGU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBvYmplY3QgdG8gaGVscCBkaXNwYXRjaCB0aGUgcmVjZWl2ZWQgbWVzc2FnZTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIE9iamVjdCBHZXRTdHViSGVscGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0dWJIZWxwZXI7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIGFuIG9iamVjdCB0byBoZWxwIHRoZSBzdHViIGRpc3BhdGNoIHRoZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3R1YkhlbHBlciI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0U3R1YkhlbHBlciggT2JqZWN0IHN0dWJIZWxwZXIgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDaGVja05vdExvY2tlZCgpOyBjYWxsZWQgZnJvbSBzdHViIGFuZCBub3QgZnJvbSB2YWx1ZSBmYWN0b3J5LgorICAgICAgICAgICAgaWYgKHRoaXMuc3R1YkhlbHBlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRoaXMuc3R1YkhlbHBlciAhPSBudWxsIik7CisgICAgICAgICAgICB0aGlzLnN0dWJIZWxwZXIgPSBzdHViSGVscGVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3Qgc3R1YkhlbHBlcjsKKworCisgICAgICAgIC8vLzxzdW1tYXJ5PkxvY2tzIHRoZSBmaWVsZHMgZm9yIHRoaXMgdHlwZS48L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIExvY2soKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgZmllbGRNYXAuTG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90TG9ja2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJsb2NrZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBsb2NrZWQ7CisKKyAgICAgICAgCisgICAgICAgIC8vLzxzdW1tYXJ5PkFkZHMgYSBmaWVsZCB0byB0aGUgc2V0IG9mIGZpZWxkcy48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJmaWVsZCI+IEEgZmllbGQgdG8gYWxsIDwvcGFyYW0+CisgICAgICAgIC8vLzxyZXR1cm5zPlJldHVybnMgdGhlIGFyZ3VtZW50LiBJZiB0aGVyZSBpcyBhIGNvbGxpc2lvbiB3aXRoCisgICAgICAgIC8vLyBhbiBpZCBhbmQgbmFtZSwgYm90aCBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgZmllbGQsCisgICAgICAgIC8vLyB0aGVuIHRoYXQgZmllbGQgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgYXJndW1lbnQgPC9yZXR1cm5zPgorICAgICAgICAvLy8gPEV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEKKyAgICAgICAgLy8vIGNvbGxpc2lvbiBpbiB0aGUgaWQgb3IgbmFtZSwgb3IgYm90aCBpZCBhbmQgbmFtZSB3aGVuIG5vdCBhc3NvY2lhdGVkIAorICAgICAgICAvLy8gd2l0aCB0aGUgc2FtZSBmaWVsZC48L0V4Y2VwdGlvbj4KKyAgICAgICAgcHVibGljIEZpZWxkIEFkZEZpZWxkKCBGaWVsZCBmaWVsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZE1hcC5BZGQoIGZpZWxkICk7CisgICAgICAgIH0KKworICAgICAgICAvLy88c3VtbWFyeT5UcmFuc2xhdGVzIGEgZmllbGQgaWQgaW50byB0aGUgYXBwcm9wcmlhdGUgRmllbGQgb2JqZWN0Ljwvc3VtbWFyeT4KKyAgICAgICAgLy8vPHBhcmFtIG5hbWU9ImlkIj5maWVsZCBpZDwvcGFyYW0+CisgICAgICAgIC8vLzxyZXR1cm5zPmlkIHRyYW5zbGF0ZWQgaW50byB0aGUgYXBwcm9wcmlhdGUgRmllbGQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRmllbGQgR2V0RmllbGQoIGludCBpZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZE1hcC5HZXQoIGlkICk7CisgICAgICAgIH0KKworICAgICAgIAorICAgICAgICAvLy88c3VtbWFyeT5UcmFuc2xhdGVzIGEgZmllbGQgbmFtZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBGaWVsZC48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJuYW1lIj5BIGZpZWxkIG5hbWU8L3BhcmFtPgorICAgICAgICAvLy88cmV0dXJucz5uYW1lIHRyYW5zbGF0ZWQgaW50byB0aGUgYXBwcm9wcmlhdGUgRmllbGQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRmllbGQgR2V0RmllbGQoIHN0cmluZyBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkTWFwLkdldCggbmFtZSApOworICAgICAgICB9CisKKyAgICAgICAgLy8vPHJldHVybnM+YSBzZXQgb2YgYWxsIHRoZSBmaWVsZHMuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgTGlzdDxGaWVsZD4gR2V0RmllbGRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkTWFwLlZhbHVlcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRXZlcnkgdHlwZSAoID0+IG1lc3NhZ2UpIGNhcnJpZXMgYSB0aW1lb3V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IHRpbWVvdXQ7CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aW1lb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3RMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaWVsZCBjb250YWluaW5nIHJlc3VsdCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIEZpZWxkIHJlc3BvbnNlRmllbGQ7CisKKyAgICAgICAgcHVibGljIEZpZWxkIFJlc3BvbnNlRmllbGQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlRmllbGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja05vdExvY2tlZCgpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlRmllbGQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLzxzdW1tYXJ5PkNoZWNrcyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCBvdGhlci4gVGhpcworICAgICAgICAvLy9tZWFucyB0aGF0IG90aGVyIGlzIGEgc3ViY2xhc3Mgb2YgdGhpcy48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJvdGhlciI+PC9wYXJhbT4KKyAgICAgICAgLy8vPHJldHVybnM+dHJ1ZSBpZiB0aGlzIHR5cGUgaXMgYXNzaWduYWJsZSBmcm9tIG90aGVyPC9yZXR1cm5zPgorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2wgSXNBc3NpZ25hYmxlRnJvbSggWFR5cGUgb3RoZXIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiAoIHRoaXMuRXF1YWxzKCBvdGhlciApIHx8IElzQXNzaWduYWJsZUZyb20oIG90aGVyLlN1cGVyVHlwZSgpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENoZWNrSXNBc3NpZ25hYmxlRnJvbSggWFR5cGUgb3RoZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICFJc0Fzc2lnbmFibGVGcm9tKCBvdGhlciApICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWFR5cGUgU3VwZXJUeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLzxzdW1tYXJ5PlNldHMgdGhlIHN1cGVyIHR5cGUgb2YgdGhpcyB0eXBlLiBJZiBzdHJ1Y3QgQSBleHRlbmRzIEIsIHRoZW4KKyAgICAgICAgLy8vQiBpcyB0aGUgc3VwZXIgdHlwZSBvZiBBLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vPHBhcmFtIG5hbWU9InN1cGVyVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0U3VwZXJUeXBlKCBYVHlwZSBzdXBlclR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdExvY2tlZCgpOworICAgICAgICAgICAgdGhpcy5zdXBlclR5cGUgPSBzdXBlclR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFhUeXBlIHN1cGVyVHlwZTsKKworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gR2V0cyBBc3luY01vZGUgZm9yIHRoaXMgVHlwZQorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgLy8vIDxyZXR1cm5zPkFzeW5jTW9kZTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEFzeW5jTW9kZSBHZXRBc3luY01vZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXN5bmNNb2RlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0cyB0aGUgQXlzbmNNb2RlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0QXN5bmNNb2RlKEFzeW5jTW9kZSBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdExvY2tlZCgpOworICAgICAgICAgICAgYXN5bmNNb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQXN5bmNNb2RlIGFzeW5jTW9kZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBtZXNzYWdlIGRpcmVjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBtZXNzYWdlIGRpcmVjdGlvbjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIERpcmVjdGlvbiBHZXREaXJlY3Rpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGlyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0cyB0aGUgbWVzc2FnZSBkaXJlY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0aW9uIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXREaXJlY3Rpb24oRGlyZWN0aW9uIGRpcmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3RMb2NrZWQoKTsKKyAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBEaXJlY3Rpb24gZGlyZWN0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9BdXRoRXhjZXB0aW9uU2VyaWFsaXplci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9BdXRoRXhjZXB0aW9uU2VyaWFsaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjI5Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L0F1dGhFeGNlcHRpb25TZXJpYWxpemVyLmNzCkBAIC0wLDAgKzEsNjIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIEF1dGhFeGNlcHRpb25TZXJpYWxpemVyIDogSW1wb3J0RXhwb3J0SGVscGVyCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IFN0cmluZyBGSUVMRF9OQU1FID0gIm1zZyI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEluaXQoWFR5cGUgdHlwZSwgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHR5cGUuR2V0RmllbGQoRklFTERfTkFNRSk7CisgICAgICAgICAgICBjbGFzczJ0eXBlLkFkZCh0eXBlb2YoX0V0Y2hfQXV0aEV4Y2VwdGlvbiksIHR5cGUpOworICAgICAgICAgICAgdHlwZS5TZXRDb21wb25lbnRUeXBlKHR5cGVvZihfRXRjaF9BdXRoRXhjZXB0aW9uKSk7CisgICAgICAgICAgICB0eXBlLlNldEltcG9ydEV4cG9ydEhlbHBlcihuZXcgQXV0aEV4Y2VwdGlvblNlcmlhbGl6ZXIodHlwZSwgZmllbGQpKTsKKyAgICAgICAgICAgIHR5cGUuUHV0VmFsaWRhdG9yKGZpZWxkLCBWYWxpZGF0b3Jfc3RyaW5nLkdldCgwKSk7CisgICAgICAgICAgICB0eXBlLkxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBdXRoRXhjZXB0aW9uU2VyaWFsaXplcihYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgdHlwZTsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkIGZpZWxkOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJ1Y3RWYWx1ZSBFeHBvcnRWYWx1ZShWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUodHlwZSwgdmYpOworICAgICAgICAgICAgc3YuQWRkKGZpZWxkLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBzdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBPYmplY3QgSW1wb3J0VmFsdWUoU3RydWN0VmFsdWUgc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN2LkNoZWNrVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgX0V0Y2hfQXV0aEV4Y2VwdGlvbigoU3RyaW5nKXN2LkdldChmaWVsZCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L0NsYXNzMlR5cGVNYXAuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvQ2xhc3MyVHlwZU1hcC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjE0MmIwCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L0NsYXNzMlR5cGVNYXAuY3MKQEAgLTAsMCArMSwxMDEgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ2xhc3MyVHlwZU1hcAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBUeXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBvciBudWxsPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgWFR5cGUgR2V0KCBUeXBlIGMgKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJ0WyBjIF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEtleU5vdEZvdW5kRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYSBtYXAgZW50cnkgZnJvbSBjIHRvIHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InQiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZCggVHlwZSBjLCBYVHlwZSB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBsb2NrZWQgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJsb2NrZWQiICk7CisKKyAgICAgICAgICAgIFhUeXBlIHg7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4ID0gYzJ0WyBjIF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEtleU5vdEZvdW5kRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB4ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggIXguRXF1YWxzKCB0ICkgKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIFN0cmluZy5Gb3JtYXQoICJ0eXBlIHswfSA6IGNsYXNzIHsxfSBpcyBhbHJlYWR5IG1hcHBlZCB0byB0eXBlIHsyfSIsIHQsIGMsIHggKSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMydC5BZGQoIGMsIHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYWxsIHRoZSBtYXBwaW5ncyBmcm9tIG90aGVyIHRvIHRoaXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdGhlciI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkQWxsKCBDbGFzczJUeXBlTWFwIG90aGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBsb2NrZWQgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJsb2NrZWQiICk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKCBLZXlWYWx1ZVBhaXI8VHlwZSwgWFR5cGU+IG1lIGluIG90aGVyLmMydCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkKCBtZS5LZXksIG1lLlZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb2NrcyB0aGUgbWFwLCBkaXNhbGxvd2luZyBhbnkgbW9yZSBjaGFuZ2VzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIExvY2soKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PFR5cGUsIFhUeXBlPiBjMnQgPSBuZXcgRGljdGlvbmFyeTxUeXBlLCBYVHlwZT4oKTsKKworICAgICAgICBwcml2YXRlIEJvb2xlYW4gbG9ja2VkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9EZWZhdWx0U2VydmVyRmFjdG9yeS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9EZWZhdWx0U2VydmVyRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmZkYmRhCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L0RlZmF1bHRTZXJ2ZXJGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMTAzIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgYWJzdHJhY3QgcHVibGljIGNsYXNzIERlZmF1bHRTZXJ2ZXJGYWN0b3J5IDogU2VydmVyRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIERlZmF1bHRTZXJ2ZXJGYWN0b3J5KFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBsaXN0ZW5lciwgb2JqZWN0IGltcGxGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoaW1wbEZhY3RvcnkgaXMgU2Vzc2lvbikKKyAgICAgICAgICAgICAgICBTZXRTZXNzaW9uKChTZXNzaW9uKWltcGxGYWN0b3J5KTsKKyAgICAgICAgICAgIGxpc3RlbmVyLlNldFNlc3Npb24odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBsaXN0ZW5lcjsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IFNlc3Npb25RdWVyeShPYmplY3QgcXVlcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24uU2Vzc2lvblF1ZXJ5KHF1ZXJ5KTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigidW5rbm93biBxdWVyeSAiICsgcXVlcnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2woT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25Db250cm9sKGNvbnRyb2wsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oInVua25vd24gY29udHJvbCAiICsgY29udHJvbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uTm90aWZ5KE9iamVjdCBldm50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlc3Npb24uU2Vzc2lvbk5vdGlmeShldm50KTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gVHJhbnNwb3J0IE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgU2Vzc2lvbiBHZXRTZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOworCisgICAgICAgIHB1YmxpYyBvYmplY3QgVHJhbnNwb3J0UXVlcnkob2JqZWN0IHF1ZXJ5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXIuVHJhbnNwb3J0UXVlcnkocXVlcnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Q29udHJvbChvYmplY3QgY29udHJvbCwgb2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKGNvbnRyb2wsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeShvYmplY3QgZXZlbnRPYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLlRyYW5zcG9ydE5vdGlmeShldmVudE9iaik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBTZXJ2ZXJGYWN0b3J5IE1lbWJlcnMKKworICAgICAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBOZXdTZXJ2ZXIoVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIHN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpOworCisgICAgICAgIGFic3RyYWN0IHB1YmxpYyBWYWx1ZUZhY3RvcnkgTmV3VmFsdWVGYWN0b3J5KHN0cmluZyB1cmkpOworCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvRGVmYXVsdFZhbHVlRmFjdG9yeS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9EZWZhdWx0VmFsdWVGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDhlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvRGVmYXVsdFZhbHVlRmFjdG9yeS5jcwpAQCAtMCwwICsxLDM5NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisKKyAgICAvLy8gPHN1bW1hcnk+RGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBWYWx1ZUZhY3Rvcnkgd2hpY2ggcHJvdmlkZXMgc29tZSBkeW5hbWljIHR5cGUgYW5kIGZpZWxkIHN1cHBvcnQsIGFzIHdlbGwgCisgICAgLy8vIGFzIHN0YW5kYXJkIHZhbHVlIGNvbnZlcnNpb25zIGFuZCBpbXBvcnQgYW5kIGV4cG9ydC48L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZUZhY3RvcnkgOiBWYWx1ZUZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgU3RyaW5nIEVUQ0hfUlVOVElNRV9FWENFUFRJT05fVFlQRV9OQU1FID0gIl9FdGNoX1J1bnRpbWVFeGNlcHRpb24iOworCisgICAgICAgIHByaXZhdGUgY29uc3QgU3RyaW5nIEVUQ0hfTElTVF9UWVBFX05BTUUgPSAiX0V0Y2hfTGlzdCI7CisKKwkgICAgcHJpdmF0ZSBjb25zdCBTdHJpbmcgRVRDSF9NQVBfVFlQRV9OQU1FID0gIl9FdGNoX01hcCI7CisKKwkgICAgcHJpdmF0ZSBjb25zdCBTdHJpbmcgRVRDSF9TRVRfVFlQRV9OQU1FID0gIl9FdGNoX1NldCI7CisKKwkgICAgcHJpdmF0ZSBjb25zdCBTdHJpbmcgRVRDSF9EQVRFVElNRV9UWVBFX05BTUUgPSAiX0V0Y2hfRGF0ZXRpbWUiOworCisJICAgIHByaXZhdGUgY29uc3QgU3RyaW5nIEVUQ0hfQVVUSF9FWENFUFRJT05fVFlQRV9OQU1FID0gIl9FdGNoX0F1dGhFeGNlcHRpb24iOworCisJICAgIHByaXZhdGUgY29uc3QgU3RyaW5nIEVUQ0hfRVhDRVBUSU9OX01FU1NBR0VfTkFNRSA9ICJfZXhjZXB0aW9uIjsKKworCSAgICBwcml2YXRlIGNvbnN0IFN0cmluZyBNU0dfRklFTERfTkFNRSA9ICJtc2ciOworCisJICAgIHByaXZhdGUgY29uc3QgU3RyaW5nIE1FU1NBR0VfSURfRklFTERfTkFNRSA9ICJfbWVzc2FnZUlkIjsKKworCSAgICBwcml2YXRlIGNvbnN0IFN0cmluZyBJTl9SRVBMWV9UT19GSUVMRF9OQU1FID0gIl9pblJlcGx5VG8iOworCisgICAgICAgIHByaXZhdGUgY29uc3QgU3RyaW5nIFJFU1VMVF9GSUVMRF9OQU1FID0gInJlc3VsdCI7CisgICAgIAorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbml0KCBUeXBlTWFwIHR5cGVzLCBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBSdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5Jbml0KAorICAgICAgICAgICAgIHR5cGVzLkdldChFVENIX1JVTlRJTUVfRVhDRVBUSU9OX1RZUEVfTkFNRSksIGNsYXNzMnR5cGUpOworCisgICAgICAgICAgICBMaXN0U2VyaWFsaXplci5Jbml0KAorICAgICAgICAgICAgICAgIHR5cGVzLkdldChFVENIX0xJU1RfVFlQRV9OQU1FKSwgY2xhc3MydHlwZSk7CisKKyAgICAgICAgICAgIE1hcFNlcmlhbGl6ZXIuSW5pdCgKKyAgICAgICAgICAgICAgICB0eXBlcy5HZXQoRVRDSF9NQVBfVFlQRV9OQU1FKSwgY2xhc3MydHlwZSk7CisKKyAgICAgICAgLyogICAgU2V0U2VyaWFsaXplci5Jbml0KAorICAgICAgICAgICAgICAgIHR5cGVzLkdldChFVENIX1NFVF9UWVBFX05BTUUpLCBjbGFzczJ0eXBlKTsgKi8KKworICAgICAgICAgICAgRGF0ZVNlcmlhbGl6ZXIuSW5pdCgKKyAgICAgICAgICAgICAgICB0eXBlcy5HZXQoRVRDSF9EQVRFVElNRV9UWVBFX05BTUUpLCBjbGFzczJ0eXBlKTsKKworICAgICAgICAgICAgQXV0aEV4Y2VwdGlvblNlcmlhbGl6ZXIuSW5pdCgKKyAgICAgICAgICAgICAgICB0eXBlcy5HZXQoRVRDSF9BVVRIX0VYQ0VQVElPTl9UWVBFX05BTUUpLCBjbGFzczJ0eXBlKTsKKyAgICAgICAgIAorICAgICAgICAgICAgWFR5cGUgdDMgPSB0eXBlcy5HZXQoRVRDSF9FWENFUFRJT05fTUVTU0FHRV9OQU1FKTsKKyAgICAgICAgICAgIHQzLlB1dFZhbGlkYXRvcihfbWZfcmVzdWx0LCBWYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbi5HZXQoKSk7CisgICAgICAgICAgICB0My5QdXRWYWxpZGF0b3IoX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCgwKSk7CisgICAgICAgICAgICB0My5QdXRWYWxpZGF0b3IoX21mX19pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLkdldCgwKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+VGhlIG1zZyBmaWVsZCBvZiB0aGUgc3RhbmRhcmQgdW5jaGVja2VkIGV4Y2VwdGlvbi48L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgRmllbGQgX21mX21zZyA9IG5ldyBGaWVsZChNU0dfRklFTERfTkFNRSk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PlRoZSB3ZWxsLWtub3duIF9tZXNzYWdlSWQgZmllbGQuPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGljIEZpZWxkIF9tZl9fbWVzc2FnZUlkID0gbmV3IEZpZWxkKE1FU1NBR0VfSURfRklFTERfTkFNRSk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PlRoZSB3ZWxsLWtub3duIF9pblJlcGx5VG8gZmllbGQuIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBfbWZfX2luUmVwbHlUbyA9IG5ldyBGaWVsZChJTl9SRVBMWV9UT19GSUVMRF9OQU1FKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+IFRoZSB3ZWxsLWtub3duIHJlc3VsdCBmaWVsZCA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgRmllbGQgX21mX3Jlc3VsdCA9IG5ldyBGaWVsZChSRVNVTFRfRklFTERfTkFNRSk7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUeXBlTWFwIHR5cGVzOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVHlwZU1hcCBkeW5hbWljVHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCisJICAgIHByaXZhdGUgcmVhZG9ubHkgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlOworCQorCSAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIF9tdF9fRXRjaF9SdW50aW1lRXhjZXB0aW9uOworCQorCSAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIF9tdF9fRXRjaF9BdXRoRXhjZXB0aW9uOworCQorCSAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIF9tdF9fZXhjZXB0aW9uOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgX210X19FdGNoX0xpc3Q7CisJCisJICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgX210X19FdGNoX01hcDsKKwkKKwkgICAgcHJpdmF0ZSByZWFkb25seSBYVHlwZSBfbXRfX0V0Y2hfU2V0OworCQorCSAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIF9tdF9fRXRjaF9EYXRldGltZTsKKwkKKworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIERlZmF1bHRWYWx1ZUZhY3RvcnkuCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+PC9wYXJhbT4KKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGVzIj48L3BhcmFtPgorICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xhc3MydHlwZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIERlZmF1bHRWYWx1ZUZhY3RvcnkoU3RyaW5nIHVyaSwgVHlwZU1hcCB0eXBlcywgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBVUkwgdSA9IG5ldyBVUkwodXJpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHMgPSB1LkdldFRlcm0oIkRlZmF1bHRWYWx1ZUZhY3RvcnkubGV2ZWwiLCAiRlVMTCIpOworICAgICAgICAgICAgbGV2ZWwgPSAoVmFsaWRhdG9yLkxldmVsKSBFbnVtLlBhcnNlKHR5cGVvZihWYWxpZGF0b3IuTGV2ZWwpLCBzKTsKKworICAgICAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzOworICAgICAgICAgICAgdGhpcy5jbGFzczJ0eXBlID0gY2xhc3MydHlwZTsKKworICAgICAgICAgICAgX210X19FdGNoX1J1bnRpbWVFeGNlcHRpb24gPSB0eXBlcy5HZXQoRVRDSF9SVU5USU1FX0VYQ0VQVElPTl9UWVBFX05BTUUpOworICAgICAgICAgICAgX210X19FdGNoX0F1dGhFeGNlcHRpb24gPSB0eXBlcy5HZXQoRVRDSF9BVVRIX0VYQ0VQVElPTl9UWVBFX05BTUUpOworICAgICAgICAgICAgX210X19leGNlcHRpb24gPSB0eXBlcy5HZXQoRVRDSF9FWENFUFRJT05fTUVTU0FHRV9OQU1FKTsKKyAgICAgICAgICAgIF9tdF9fRXRjaF9MaXN0ID0gdHlwZXMuR2V0KEVUQ0hfTElTVF9UWVBFX05BTUUpOworICAgICAgICAgICAgX210X19FdGNoX01hcCA9IHR5cGVzLkdldChFVENIX01BUF9UWVBFX05BTUUpOworICAgICAgICAgICAgX210X19FdGNoX1NldCA9IHR5cGVzLkdldChFVENIX1NFVF9UWVBFX05BTUUpOworICAgICAgICAgICAgX210X19FdGNoX0RhdGV0aW1lID0gdHlwZXMuR2V0KEVUQ0hfREFURVRJTUVfVFlQRV9OQU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYVHlwZSBnZXRfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbigpCisJICAgIHsKKwkJICAgIHJldHVybiBfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbjsKKwkgICAgfQorCQorCSAgICBwdWJsaWMgWFR5cGUgZ2V0X210X19FdGNoX0F1dGhFeGNlcHRpb24oKQorCSAgICB7CisJCSAgICByZXR1cm4gX210X19FdGNoX0F1dGhFeGNlcHRpb247CisJICAgIH0KKwkKKwkgICAgcHVibGljICBYVHlwZSBnZXRfbXRfX2V4Y2VwdGlvbigpCisJICAgIHsKKwkJICAgIHJldHVybiBfbXRfX2V4Y2VwdGlvbjsKKwkgICAgfQorCisgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRfbXRfX0V0Y2hfTGlzdCgpCisJICAgIHsKKwkJICAgIHJldHVybiBfbXRfX0V0Y2hfTGlzdDsKKwkgICAgfQorCQorCSAgICBwdWJsaWMgWFR5cGUgR2V0X210X19FdGNoX01hcCgpCisJICAgIHsKKwkJICAgIHJldHVybiBfbXRfX0V0Y2hfTWFwOworCSAgICB9CisJCisJICAgIHB1YmxpYyBYVHlwZSBHZXRfbXRfX0V0Y2hfU2V0KCkKKwkgICAgeworCQkgICAgcmV0dXJuIF9tdF9fRXRjaF9TZXQ7CisJICAgIH0KKwkKKwkgICAgcHVibGljIFhUeXBlIEdldF9tdF9fRXRjaF9EYXRldGltZSgpCisJICAgIHsKKwkgICAgCXJldHVybiBfbXRfX0V0Y2hfRGF0ZXRpbWU7CisJICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRNaXhpbihWYWx1ZUZhY3RvcnkgdmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVtdIG5ld01peGlucyA9IG5ldyBWYWx1ZUZhY3RvcnlbbWl4aW5zLkxlbmd0aCArIDFdOworICAgICAgICAgICAgU3lzdGVtLkFycmF5LkNvcHkobWl4aW5zLG5ld01peGlucyxtaXhpbnMuTGVuZ3RoKTsKKyAgICAgICAgICAgIG5ld01peGluc1ttaXhpbnMuTGVuZ3RoXSA9IHZmOworICAgICAgICAgICAgbWl4aW5zID0gbmV3TWl4aW5zOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBWYWx1ZUZhY3RvcnlbXSBtaXhpbnMgPSB7IH07CisKKyAgICAgCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIFNUUklORyBFTkNPRElORyAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBwdWJsaWMgRW5jb2RpbmcgR2V0U3RyaW5nRW5jb2RpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGODsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gTUVTU0FHRSBJRCAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHVibGljIGxvbmc/IEdldE1lc3NhZ2VJZChNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nPykobXNnLkdldChfbWZfX21lc3NhZ2VJZCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0TWVzc2FnZUlkKE1lc3NhZ2UgbXNnLCBsb25nPyBtc2dpZCkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnW19tZl9fbWVzc2FnZUlkXSA9IG1zZ2lkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpZWxkIEdldF9tZl9fbWVzc2FnZUlkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9tZl9fbWVzc2FnZUlkOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gSU4gUkVQTFkgVE8gLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBwdWJsaWMgbG9uZz8gR2V0SW5SZXBseVRvKE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGxvbmc/KShtc2cuR2V0KF9tZl9faW5SZXBseVRvKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRJblJlcGx5VG8oTWVzc2FnZSBtc2csIGxvbmc/IG1zZ2lkKQorICAgICAgICB7CisgICAgICAgICAgICBtc2dbX21mX19pblJlcGx5VG9dID0gbXNnaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmllbGQgR2V0X21mX19pblJlcGx5VG8oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX21mX19pblJlcGx5VG87CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIFZBTFVFIENPTlZFUlNJT04gLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgCisKKyAgICAgICAgcHVibGljIE9iamVjdCBJbXBvcnRDdXN0b21WYWx1ZSggU3RydWN0VmFsdWUgc3YgKQorICAgICAgICB7CisgICAgICAgICAgICBJbXBvcnRFeHBvcnRIZWxwZXIgaGVscGVyID0gc3YuR2V0WFR5cGUuR2V0SW1wb3J0RXhwb3J0SGVscGVyKCk7CisKKyAgICAgICAgICAgIGlmICggaGVscGVyID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gaGVscGVyLkltcG9ydFZhbHVlKCBzdiApOworICAgICAgICB9CisKKyAgICAgICAKKworICAgICAgICAjcmVnaW9uIFZhbHVlRmFjdG9yeSBtZW1iZXJzCisKKyAgICAgICAgcHVibGljIFN0cnVjdFZhbHVlIEV4cG9ydEN1c3RvbVZhbHVlKCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlIGNsc3MgPSB2YWx1ZS5HZXRUeXBlKCk7CisgICAgICAgICAgICBYVHlwZSB0eXBlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9IEdldEN1c3RvbVN0cnVjdFR5cGUodmFsdWUuR2V0VHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChLZXlOb3RGb3VuZEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCAmJiBjbHNzID09IHR5cGVvZihTdHJ1Y3RWYWx1ZSkgKQorCQkgICAgeworCQkJICAgIFN0cnVjdFZhbHVlIHN0cnVjdDEgPSAoU3RydWN0VmFsdWUpIHZhbHVlOworCQkgICAgICAgIHR5cGUgPSBzdHJ1Y3QxLkdldFhUeXBlOworCQkgICAgfQorCisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIC8vICAgICAgIGlmICh2YWx1ZSBpcyBFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihFeGNlcHRpb24pLklzQXNzaWduYWJsZUZyb20oY2xzcykpCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YoSUxpc3QpLklzQXNzaWduYWJsZUZyb20oY2xzcykpCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBfbXRfX0V0Y2hfTGlzdDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YoSURpY3Rpb25hcnkpLklzQXNzaWduYWJsZUZyb20oY2xzcykpCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBfbXRfX0V0Y2hfTWFwOworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gYWRkIHNldCwgYnV0IGluIDIuMCB0aGVyZSBpcyBubyBzZXQgc28ganVzdCB1c2Uga2V5cyBvZiBJRGljdGlvbmFyeSwgCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKwkJCisJCSAgICBJbXBvcnRFeHBvcnRIZWxwZXIgaGVscGVyID0gdHlwZS5HZXRJbXBvcnRFeHBvcnRIZWxwZXIoKTsKKwkJCisJCSAgICBpZiAoaGVscGVyID09IG51bGwpCisJCQkgICAgcmV0dXJuIG51bGw7CisJCQorCQkgICAgcmV0dXJuIGhlbHBlci5FeHBvcnRWYWx1ZSggdGhpcywgdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRDdXN0b21TdHJ1Y3RUeXBlKCBUeXBlIHQgKQorICAgICAgICB7CisgICAgICAgICAgICBYVHlwZSB0eXBlID0gY2xhc3MydHlwZS5HZXQoIHQgKTsKKwkJICAgIGlmICh0eXBlICE9IG51bGwpCisJCQkgICAgcmV0dXJuIHR5cGU7CisJCQorCQkgICAgZm9yZWFjaCAoVmFsdWVGYWN0b3J5IHZmIGluIG1peGlucykKKwkJCSAgICBpZiAoKHR5cGUgPSB2Zi5HZXRDdXN0b21TdHJ1Y3RUeXBlKCB0ICkpICE9IG51bGwpCisJCQkJICAgIHJldHVybiB0eXBlOworCQkKKwkJICAgIHJldHVybiBudWxsOworICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRUeXBlKCBpbnQgaWQgKQorICAgICAgICB7CisgICAgICAgICAgICBYVHlwZSB0eXBlID0gdHlwZXMuR2V0KGlkKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFZhbHVlRmFjdG9yeSB2ZiBpbiBtaXhpbnMpCisgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0gdmYuR2V0VHlwZShpZCkpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworCisgICAgICAgICAgICBsb2NrIChkeW5hbWljVHlwZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNUeXBlcy5HZXQoaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhUeXBlIEdldFR5cGUoIHN0cmluZyBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgWFR5cGUgdHlwZSA9IHR5cGVzLkdldChuYW1lKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFZhbHVlRmFjdG9yeSB2ZiBpbiBtaXhpbnMpCisgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0gdmYuR2V0VHlwZShuYW1lKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisKKyAgICAgICAgICAgIGxvY2sgKGR5bmFtaWNUeXBlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY1R5cGVzLkdldChuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZFR5cGUoWFR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAoZHluYW1pY1R5cGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGR5bmFtaWNUeXBlcy5BZGQodHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgIElDb2xsZWN0aW9uPFhUeXBlPiBHZXRUeXBlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIElDb2xsZWN0aW9uPFhUeXBlPiB2YWx1ZXMgPSB0eXBlcy5WYWx1ZXMoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoVmFsdWVGYWN0b3J5IHZmIGluIG1peGlucykKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYVHlwZSB4IGluIHZmLkdldFR5cGVzKCkpCisgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVzLkNvbnRhaW5zKHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLkFkZCh4KTsKKworICAgICAgICAgICAgbG9jayAoZHluYW1pY1R5cGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhUeXBlIHggaW4gZHluYW1pY1R5cGVzLlZhbHVlcygpKQorICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlcy5Db250YWlucyh4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5BZGQoeCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICBwdWJsaWMgdm9pZCBMb2NrRHluYW1pY1R5cGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgZHluYW1pY1R5cGVzLkxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFVubG9ja0R5bmFtaWNUeXBlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gZHluYW1pY1R5cGVzLlVubG9jaygpOworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZhbGlkYXRvci5MZXZlbCBHZXRMZXZlbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWYWxpZGF0b3IuTGV2ZWwgU2V0TGV2ZWwoVmFsaWRhdG9yLkxldmVsIGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0b3IuTGV2ZWwgb2xkTGV2ZWwgPSB0aGlzLmxldmVsOworICAgICAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsOworICAgICAgICAgICAgcmV0dXJuIG9sZExldmVsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3IuTGV2ZWwgbGV2ZWwgPSBWYWxpZGF0b3IuTGV2ZWwuRlVMTDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L0RlbGl2ZXJ5U2VydmljZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9EZWxpdmVyeVNlcnZpY2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4M2U4ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9EZWxpdmVyeVNlcnZpY2UuY3MKQEAgLTAsMCArMSw1MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydHsKKworICAgIC8vLzxzdW1tYXJ5PkFkYXB0ZXIgYmV0d2VlbiByZW1vdGUgYW5kIG1lc3NhZ2Ugc291cmNlLjwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJ5U2VydmljZSA6IFRyYW5zcG9ydE1lc3NhZ2UsU2Vzc2lvbk1lc3NhZ2UKKyAgICB7CisJCisgICAgICAgIAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNlbmRzIHRoZSBtZXNzYWdlIHdoaWNoIGJlZ2lucyBhIGNhbGwgc2VxdWVuY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj50aGUgbWVzc2FnZSB0byBzZW5kLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIG1haWxib3ggd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVhZCByZXNwb25zZTwvcmV0dXJucz4KKyAgICAgICAgTWFpbGJveCBCZWdpbkNhbGwoIE1lc3NhZ2UgbXNnICk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PkZpbmlzaGVzIGEgY2FsbCBzZXF1ZW5jZSBieSB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UgbWVzc2FnZS48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWIiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzcG9uc2VUeXBlIj5yZXNwb25zZVR5cGUgdGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHJlc3BvbnNlLjwvcGFyYW0+CisgICAgICAgIC8vLyB3aGljaCB3b3VsZCBjb250YWluIGFueSByZXN1bHQgdmFsdWUgb3IgdGhyb3duIGV4Y2VwdGlvbi48L3BhcmFtPgorCSAgICAvLy8gPHJldHVybnM+dGhlIHZhbHVlIG9mIHRoZSByZXNwb25zZSBmaWVsZCBpZiBpdCBpc24ndCBhbiBleGNlcHRpb24uPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2VuZGluZyBvciBhIHRpbWVvdXQgd2FpdGluZyBvciBpZiB0aGUgcmVzdWx0IAorICAgICAgICAvLy8gICAgICAgICAgICAgdmFsdWUgd2FzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgT2JqZWN0IEVuZENhbGwoTWFpbGJveCBtYiwgWFR5cGUgcmVzcG9uc2VUeXBlICk7CisKKyAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvRHVtbXlWYWx1ZUZhY3RvcnkuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvRHVtbXlWYWx1ZUZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiYTIzYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9EdW1teVZhbHVlRmFjdG9yeS5jcwpAQCAtMCwwICsxLDEyOCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIER1bW15VmFsdWVGYWN0b3J5IDogVmFsdWVGYWN0b3J5CisgICAgeworICAgICAgICAjcmVnaW9uIFZhbHVlRmFjdG9yeSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIFhUeXBlIEdldFR5cGUoaW50IGlkKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWFR5cGUgR2V0VHlwZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQWRkVHlwZShYVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBMb2NrRHluYW1pY1R5cGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVW5sb2NrRHluYW1pY1R5cGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElDb2xsZWN0aW9uPFhUeXBlPiBHZXRUeXBlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbmNvZGluZyBHZXRTdHJpbmdFbmNvZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nPyBHZXRNZXNzYWdlSWQoTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNldE1lc3NhZ2VJZChNZXNzYWdlIG1zZywgbG9uZz8gbXNnaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWVsZCBHZXRfbWZfX21lc3NhZ2VJZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nPyBHZXRJblJlcGx5VG8oTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEluUmVwbHlUbyhNZXNzYWdlIG1zZywgbG9uZz8gbXNnaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWVsZCBHZXRfbWZfX2luUmVwbHlUbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJ1Y3RWYWx1ZSBFeHBvcnRDdXN0b21WYWx1ZShvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgSW1wb3J0Q3VzdG9tVmFsdWUoU3RydWN0VmFsdWUgc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRDdXN0b21TdHJ1Y3RUeXBlKFR5cGUgYykKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhUeXBlIGdldF9tdF9fZXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZhbGlkYXRvci5MZXZlbCBHZXRMZXZlbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3IuTGV2ZWwuRlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWYWxpZGF0b3IuTGV2ZWwgU2V0TGV2ZWwoVmFsaWRhdG9yLkxldmVsIGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L0ZyZWVQb29sLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L0ZyZWVQb29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTllMDkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvRnJlZVBvb2wuY3MKQEAgLTAsMCArMSwxMzcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgZnJlZSBpbXBsZW1lbnRhdGlvbiBvZiBwb29sCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRnJlZVBvb2wgOiBQb29sCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgRnJlZVBvb2wgd2l0aCBzcGVjaWZpZWQgbWF4U2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXhTaXplIj5tYXhpbXVtIG51bWJlciBvZiBmcmVlIHRocmVhZHMgYXQgb25lIHRpbWUKKyAgICAgICAgLy8vIGFmdGVyIHdoaWNoIHJlamVjdCByZXF1ZXN0cy4gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEZyZWVQb29sKCBpbnQgbWF4U2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgRnJlZVBvb2wgd2l0aCBtYXhTaXplIDUwCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBGcmVlUG9vbCgpCisgICAgICAgICAgICA6IHRoaXMoIDUwICkKKyAgICAgICAgeyB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbWF4U2l6ZTsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8VGhyZWFkLCBUaHJlYWQ+IGdyb3VwID0gbmV3IERpY3Rpb25hcnk8VGhyZWFkLCBUaHJlYWQ+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBCb29sZWFuIG9wZW4gPSB0cnVlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENsb3NlcyB0aGUgcG9vbC4gVGhpcyBqdXN0IG1hcmtzIHRoZSBwb29sIGFzIGJlaW5nIGNsb3NlZCwgaXQgZG9lc24ndAorICAgICAgICAvLy8gYWN0dWFsbHkgZG8gYW55dGhpbmcgdG8gdGhlIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZC4gQnV0IG5vIG1vcmUKKyAgICAgICAgLy8vIHRocmVhZHMgYXJlIGFsbG93ZWQgdG8gc3RhcnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgb3BlbiA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSm9pbnMgZWFjaCBvZiB0aGUgdGhyZWFkcyBpbiB0aGlzIHBvb2wgdW50aWwgdGhlcmUKKyAgICAgICAgLy8vIGFyZSBub25lIGxlZnQuIFRoZSBwb29sIHdpbGwgYmUgY2xvc2VkIGZpcnN0LgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBKb2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRocmVhZCB4OworICAgICAgICAgICAgICAgIGxvY2sgKGdyb3VwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxUaHJlYWQsIFRocmVhZD4uRW51bWVyYXRvciBlID0gZ3JvdXAuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWUuTW92ZU5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgeCA9IGUuQ3VycmVudC5LZXk7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwLlJlbW92ZSh4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeC5Kb2luKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaW5kcyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzIGluIHRoaXMgcG9vbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkczwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBBY3RpdmVDb3VudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cC5Db3VudDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUG9vbCBNZW1iZXJzCisKKyAgICAgICAgW01ldGhvZEltcGwoIE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCApXQorICAgICAgICBwdWJsaWMgdm9pZCBSdW4oIFJ1bkRlbGVnYXRlIGQxLCBFeGNlcHRpb25EZWxlZ2F0ZSBkMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghb3BlbiB8fCBBY3RpdmVDb3VudCgpID49IG1heFNpemUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiZnJlZSBwb29sIHRocmVhZCBjb3VudCBleGNlZWRlZCBvciBwb29sIGNsb3NlZCIpOworCisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICAgICAgZGVsZWdhdGUoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQxKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMihlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sgKGdyb3VwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLlJlbW92ZShUaHJlYWQuQ3VycmVudFRocmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbG9jayAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ3JvdXAuQWRkKHQsIHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0LlN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L01haWxib3guY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvTWFpbGJveC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjI2YWRjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L01haWxib3guY3MKQEAgLTAsMCArMSwxMTMgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PkFuIGludGVyZmFjZSB1c2VkIHRvIGRlbGl2ZXIgcmVzcG9uc2VzIHRvIGEgbWVzc2FnZS4gU3VwcG9ydCBmb3IgdGhlIG1lY2hhbmlzbSBpcyBzb21ld2hhdCAKKyAgICAvLy8gZGVwZW5kZW50IHVwb24gcHJvcGVydGllcyBvZiB0aGUgdHJhbnNwb3J0IGFuZCBtZXNzYWdlIGZvcm1hdC48L3N1bW1hcnk+CisgICAgLy8vIAorICAgIHB1YmxpYyBpbnRlcmZhY2UgTWFpbGJveCAKKyAgICB7CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbWVzc2FnZSBpZCBvZiB0aGlzIG1haWxib3guPC9yZXR1cm5zPgorICAgICAgICBsb25nIEdldE1lc3NhZ2VJZCgpOworCisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbmV4dCBtZXNzYWdlIHRvIGJlIHJlYWQgZnJvbSB0aGUgbWFpbGJveCwgb3IgbnVsbCBpZiB0aGUgbWFpbGJveCBpcyBlbXB0eSBhbmQgY2xvc2VkLiAKKyAgICAgICAgLy8vIFdhaXQgZm9yZXZlciBmb3Igc3VjaCBhIG1lc3NhZ2UgdG8gYmUgZGVsaXZlcmVkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjogCisgICAgICAgIC8vLyAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gdGhyZWFkIGludGVycnVwdC4KKyAgICAgICAgRWxlbWVudCBSZWFkKCk7CisKKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heERlbGF5Ij5tYXhEZWxheSB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCB0byByZWFkIGEgbWVzc2FnZSAKKyAgICAgICAvLy8gZnJvbSBhbiBlbXB0eSBtYWlsYm94LiAwIG1lYW5zIHdhaXQgZm9yZXZlciwgLTEgbWVhbnMgZG9uJ3Qgd2FpdCBhdCBhbGwuPC9wYXJhbT4KKyAgICAgICAvLy8gPHJldHVybnM+dGhlIG1lc3NhZ2UgcmVhZCBmcm9tIHRoZSBtYWlsYm94LCBvciBudWxsIGlmIHRoZSBtYWlsYm94IGlzIGVtcHR5IGFuZCBjbG9zZWQsIG9yIGlmIHRoZSB0aW1lIAorICAgICAgIC8vLyBsaW1pdCB3YXMgZXhjZWVlZGVkLjwvcmV0dXJucz4KKyAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgIC8vLyAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocmVhZCBpbnRlcnJ1cHQuCisgICAgICAgRWxlbWVudCBSZWFkKGludCBtYXhEZWxheSk7CisKKyAgICAgICAvLy8gPHN1bW1hcnk+Q2xvc2VzIHRoZSBtYWlsYm94IHNvIHRoYXQgbm8gbW9yZSBtZXNzYWdlcyBjYW4gYmUgZGVsaXZlcmVkLiBRdWV1ZWQgbWVzc2FnZXMgcmVtYWluIHRvIGJlIHJlYWQuIAorICAgICAgIC8vLyBSZWFkaW5nIGFuIGVtcHR5IGNsb3NlZCBtYWlsYm94IHJldHVybnMgbnVsbC48L3N1bW1hcnk+CisgICAgICAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgY2FsbCBjbG9zZWQgdGhlIG1haWxib3ggKHRoYXQgaXMsIGlmIGFjdGlvbiB3YXMgdGFrZW4pLCBmYWxzZSBpZiB0aGUgbWFpbGJveCB3YXMgYWxyZWFkeSBjbG9zZWQuIDwvcmV0dXJucz4KKyAgICAgICBib29sIENsb3NlRGVsaXZlcnkoKTsKKworICAgICAgIC8vLyA8c3VtbWFyeT5DbG9zZXMgdGhlIG1haWxib3ggc28gdGhhdCBubyBtb3JlIG1lc3NhZ2VzIHdpbGwgYmUgZGVsaXZlcmVkIG9yIHJlYWQuIEFueSByZW1haW5pbmcgcXVldWVkIAorICAgICAgIC8vLyBtZXNzYWdlcyBhcmUgZGVsaXZlcmVkIHRvIGEgZGVmYXVsdCBoYW5kbGVyLjwvc3VtbWFyeT4KKyAgICAgICAvLy8gdGhyb3dzIEV4Y2VwdGlvbiAKKyAgICAgICBib29sIENsb3NlUmVhZCgpOworCisgICAgICAgLy8vPHN1bW1hcnk+UmVnaXN0ZXJzIGEgTm90aWZ5IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiB0byByZWNlaXZlIGEgY2FsbGJhY2sKKwkgICAvLy93aGVuIGEgbWFpbGJveCdzIHN0YXR1cyBpcyBjaGFuZ2VkLjwvc3VtbWFyeT4KKwkgICAvLy88cGFyYW0+IG5ld05vdGlmeSBhIE5vdGlmeSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gdG8gcmVwb3J0IHRoZQorCSAgIC8vL2RlbGl2ZXJ5IHN0YXR1cyB0by4gPC9wYXJhbT4KKwkgICAvLy88cGFyYW0+IHN0YXRlIGEgc3RhdGUgdmFsdWUgdG8gcGFzcyB0aHJ1IHRvIHRoZSBOb3RpZnkgaW50ZXJmYWNlCisJICAgLy8vIGltcGxlbWVudGF0aW9uLiA8L3BhcmFtPgorCSAgIC8vLzxwYXJhbT4gbWF4RGVsYXkgdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvCisJICAgLy8vd2FpdCBmb3IgZGVsaXZlcnkgb2YgYSBtZXNzYWdlIHRvIHRoZSBtYWlsYm94LiAwIG1lYW5zIHdhaXQKKwkgICAvLy9mb3JldmVyLiBUaGUgbWFpbGJveCBpcyBjbG9zZWQgdXBvbiB0aW1lb3V0LjxwYXJhbT4KKyAgICAJCisJICAgdm9pZCBSZWdpc3Rlck5vdGlmeSggTm90aWZ5IG5ld05vdGlmeSwgT2JqZWN0IHN0YXRlLCBpbnQgbWF4RGVsYXkgKTsKKwkKKwkKKwkgICAvLy8gPHN1bW1hcnk+VW5yZWdpc3RlcnMgYSBOb3RpZnkgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZyb20gcmVjZWl2aW5nIGEgY2FsbGJhY2sKKwkgICAvLy8gd2hlbiBhIG1haWxib3gncyBzdGF0dXMgaXMgY2hhbmdlZC4gQ2FuY2VscyBhbnkgdGltZW91dC4gPC9zdW1tYXJ5PgorICAgICAgIC8vLzxwYXJhbT4gb2xkTm90aWZ5IGEgTm90aWZ5IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiB3aGljaCB3YXMgcHJldmlvdXNseQorCSAgIC8vL3JlZ2lzdGVyZWQuIDwvcGFyYW0+ICAgIAkKKwkgICB2b2lkIFVucmVnaXN0ZXJOb3RpZnkoIE5vdGlmeSBvbGROb3RpZnkgKTsKKworCisgICAgICAgIGJvb2wgTWVzc2FnZShXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyk7CisgICAgfQorICAgIAorICAgICAgICAvLy88c3VtbWFyeT5UaGUgbWVzc2FnZSBhcyBxdWV1ZWQsIGluY2x1ZGluZyBzcmMgYW5kIHNlbmRlci48L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjbGFzcyBFbGVtZW50IDogV2hvCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VuZGVyIj5zZW5kZXIgdGhlIG1lc3NhZ2Ugc2VuZGVyLjwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1zZyI+bXNnIHRoZSBtZXNzYWdlLjwvcGFyYW0+CisgICAgICAgICAgICBwdWJsaWMgRWxlbWVudChXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKKyAgICAgICAgICAgICAgICB0aGlzLm1zZyA9IG1zZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PlRoZSBtZXNzYWdlIHNlbmRlci48L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgV2hvIHNlbmRlcjsKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PnRoZSBtZXNzYWdlLjwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBNZXNzYWdlIG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgTm90aWZ5CisgICAgICAgIHsKKworCQkgICAgLy8vIDxzdW1tYXJ5Pk5vdGlmaWVzIG9mIG1haWxib3ggc3RhdHVzIGNoYW5nZS48L3N1bW1hcnk+CisJCSAgICAvLy88cGFyYW0+IG1iIHRoZSBtYWlsYm94IHdob3NlIHN0YXR1cyBoYXMgY2hhbmdlZC48L3BhcmFtPgorCQkgICAgLy8vPHBhcmFtPiBzdGF0ZSB0aGUgc3RhdGUgb2JqZWN0IHBhc3NlZCBpbiB0aGUgcmVnaXN0ZXIKKwkJICAgIC8vLyBtZXRob2QuPC9wYXJhbT4KKwkJICAgIC8vLyA8cGFyYW0+IGNsb3NlZCB0cnVlIGlmIHRoZSBtYWlsYm94IHRpbWVvdXQgaGFzIGV4cGlyZWQgYW5kCisJCSAgICAvLy90aGUgbWFpbGJveCBpcyBub3cgY2xvc2VkIHRvIGRlbGl2ZXJ5LCBmYWxzZSBpZiBhIG1lc3NhZ2UKKwkJICAgIC8vLyBoYXMgYXJyaXZlZC48L3BhcmFtPgorCQkgCisgICAgICAgICAgICB2b2lkIG1haWxib3hTdGF0dXMoTWFpbGJveCBtYiwgT2JqZWN0IHN0YXRlLCBib29sIGNsb3NlZCk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9OdWxsUG9vbC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9OdWxsUG9vbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ5NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L051bGxQb29sLmNzCkBAIC0wLDAgKzEsNTAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcG9vbCB3aGljaCBydW5zIHJ1bm5hYmxlIGRpcmVjdGx5CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgTnVsbFBvb2wgOiBQb29sCisgICAgeworICAgICAgICAjcmVnaW9uIFBvb2wgTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIFJ1biggUnVuRGVsZWdhdGUgZDEsIEV4Y2VwdGlvbkRlbGVnYXRlIGQyICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IFRocmVhZCgKKyAgICAgICAgICAgICAgICBuZXcgVGhyZWFkU3RhcnQoIGRlbGVnYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyKCBlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKSApLlN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L09ialNlc3Npb24uY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvT2JqU2Vzc2lvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZjNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L09ialNlc3Npb24uY3MKQEAgLTAsMCArMSw4MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBPdXQtb2YtYmFuZCBxdWVyeSwgY29udHJvbCwgYW5kIG5vdGlmaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHNlc3Npb25zLgorICAgIC8vLyBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uIGV4Y2VwdAorICAgIC8vLyB0aGUgbmFtZXMgYXJlIGNoYW5nZWQgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggc2VydmljZSBkZWZpbmVkIG5hbWVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBPYmpTZXNzaW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIGEgY29uZmlndXJhdGlvbiBvciBvcGVyYXRpb25hbCB2YWx1ZSBmcm9tIHRoZSBoYW5kbGVyLiBUaGUKKyAgICAgICAgLy8vIHJlcXVlc3QgaXMgcGFzc2VkIHVwIHRoZSBjaGFpbiBvZiBzZXNzaW9ucyB1bnRpbCBzb21lIHNlc3Npb24KKyAgICAgICAgLy8vIHJlY29nbmlzZXMgdGhlIHF1ZXJ5LCB3aGVyZXVwb24gaXQgcmV0dXJucyB0aGUgcmVxdWVzdGVkIHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InF1ZXJ5Ij5hbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgcXVlcnksIHdoaWNoIGNvdWxkIGJlIGFzCisgICAgICAgIC8vLyBzaW1wbGUgYXMgYSBzdHJpbmcsIGludGVnZXIsIG9yIGVudW0sIG9yIG1vcmUgY29tcGxleCBzdWNoIGFzCisgICAgICAgIC8vLyBhIGNsYXNzIHdpdGggaW5zdGFuY2UgdmFyaWFibGVzIGZvciBxdWVyeSB0ZXJtcy48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIHJlcXVlc3RlZCB2YWx1ZSwgb3IgbnVsbCBpZiBub3QgZGVmaW5lZC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246IAorICAgICAgICAvLy8gICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBpcyBub3QgcmVjb2duaXNlZAorICAgICAgICAvLy8gICAgIGJ5IGFueSBzZXNzaW9uICh3aGljaCBpcyB0byBzYXksIGlmIHRoZSBsYXN0IHNlc3Npb24gaW4gdGhlIHNlc3Npb24KKyAgICAgICAgLy8vICAgICBjaGFpbiBkb2VzIG5vdCByZWNvZ25pc2UgaXQsIGl0IHNob3VsZCB0aHJvdyB0aGlzIGV4Y2VwdGlvbikuIFR5cGljYWxseQorICAgICAgICAvLy8gICAgIHRoaXMgd291bGQgYmUgYSBzZXJ2aWNlJ3MgY2xpZW50IG9yIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgLy8vICAgICAKKyAgICAgICAgT2JqZWN0IF9TZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgYSBjb25maWd1cmF0aW9uIG9yIG9wZXJhdGlvbmFsIHZhbHVlIGluIHRoZSBzZXNzaW9uLiBUaGUKKyAgICAgICAgLy8vIHJlcXVlc3QgaXMgcGFzc2VkIHVwIHRoZSBjaGFpbiBvZiBzZXNzaW9ucyB1bnRpbCBzb21lIHNlc3Npb24KKyAgICAgICAgLy8vIHJlY29nbmlzZXMgdGhlIGNvbnRyb2wsIHdoZXJldXBvbiBpdCBzdG9yZXMgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgICAgICAvLy8gYW5kIHJldHVybnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udHJvbCI+YW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbnRyb2wsIHdoaWNoIGNvdWxkIGJlIGFzCisgICAgICAgIC8vLyBzaW1wbGUgYXMgYSBzdHJpbmcsIGludGVnZXIsIG9yIGVudW0sIG9yIG1vcmUgY29tcGxleCBzdWNoIGFzCisgICAgICAgIC8vLyBhIGNsYXNzIHdpdGggaW5zdGFuY2UgdmFyaWFibGVzIGZvciBjb250cm9sIHRlcm1zLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPnRoZSB2YWx1ZSB0byBzZXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICBBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodAorICAgICAgICAvLy8gICAgIHR5cGUgb3IgaWYgdGhlIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUuCisgICAgICAgIC8vLyAgICAgCisgICAgICAgIC8vLyAgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIGNvbnRyb2wgaXMgbm90IHJlY29nbmlzZWQKKyAgICAgICAgLy8vICAgICBieSBhbnkgc2Vzc2lvbiAod2hpY2ggaXMgdG8gc2F5LCBpZiB0aGUgbGFzdCBzZXNzaW9uIGluIHRoZSBzZXNzaW9uCisgICAgICAgIC8vLyAgICAgY2hhaW4gZG9lcyBub3QgcmVjb2duaXNlIGl0LCBpdCBzaG91bGQgdGhyb3cgdGhpcyBleGNlcHRpb24pLiBUeXBpY2FsbHkKKyAgICAgICAgLy8vICAgICB0aGlzIHdvdWxkIGJlIGEgc2VydmljZSdzIGNsaWVudCBvciBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgICAgICAgIC8vLworICAgICAgICB2b2lkIF9TZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vdGlmaWVzIHRoZSBjaGFpbiBvZiBzZXNzaW9ucyBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LiBVbmxpa2UgcXVlcnkKKyAgICAgICAgLy8vIGFuZCBjb250cm9sIG9wZXJhdGlvbnMgYWJvdmUsIGV2ZW50cyBhcmUgYWx3YXlzIHBhc3NlZCB1cCB0byB0aGUKKyAgICAgICAgLy8vIHRvcCB0byBhbGxvdyBhbGwgc2Vzc2lvbnMgdG8gbm90aWNlIHRoZW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXZlbnRPYmoiPmV2ZW50IGEgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQsIHBvc3NpYmx5IHdpdGgKKyAgICAgICAgLy8vIHBhcmFtZXRlcnMuIFRoZSBzaW1wbGVzdCBldmVudCBjb3VsZCBiZSBhIHN0cmluZywgaW50ZWdlciwKKyAgICAgICAgLy8vIG9yIGVudW0sIGJ1dCBhbnkgY2xhc3MgaW5zdGFuY2Ugd2lsbCBkbyAoYXMgbG9uZyBhcyBzb21lIHNlc3Npb24KKyAgICAgICAgLy8vIGluIHRoZSBjaGFpbiBleHBlY3RzIGl0KS48L3BhcmFtPgorICAgICAgICB2b2lkIF9TZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnRPYmogKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9Qb29sLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1Bvb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjYzMxNwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9Qb29sLmNzCkBAIC0wLDAgKzEsNDIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIHRvIGEgcXVldWVkIG9yIGZyZWUgdGhyZWFkIHBvb2wuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFBvb2wKKyAgICB7CisgICAgICAgIHZvaWQgUnVuKCBSdW5EZWxlZ2F0ZSBkMSwgRXhjZXB0aW9uRGVsZWdhdGUgZDIgKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERlbGVnYXRlIGZvciB3aGF0IHRvIHJ1bgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgUnVuRGVsZWdhdGUoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRGVsZWdhdGUgdGhhdCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImUiPjwvcGFyYW0+CisgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgRXhjZXB0aW9uRGVsZWdhdGUoIEV4Y2VwdGlvbiBlICk7Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvUXVldWVkUG9vbC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9RdWV1ZWRQb29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDNkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvUXVldWVkUG9vbC5jcwpAQCAtMCwwICsxLDgxIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcXVldWVkIGltcGxlbWVudGF0aW9uIG9mIHBvb2wKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBRdWV1ZWRQb29sIDogUG9vbAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgcXVldWVkIHBvb2wgd2l0aCBhIHNwZWNpZmllZCB0b2RvIG1hbmFnZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWdyIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgUXVldWVkUG9vbCggVG9kb01hbmFnZXIgbWdyICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tZ3IgPSBtZ3I7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBxdWV1ZWQgcG9vbCB3aXRoIGEgZGVmYXVsdCB0b2RvIG1hbmFnZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyBFeGNlcHRpb246IAorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgLy8vICAgICAKKyAgICAgICAgcHVibGljIFF1ZXVlZFBvb2woKSA6IHRoaXMoIFRvZG9NYW5hZ2VyLkdldFRvZG9NYW5hZ2VyKCkgKQorICAgICAgICB7fQorCisgICAgICAgIHByaXZhdGUgVG9kb01hbmFnZXIgbWdyOworCisgICAgICAgIHB1YmxpYyB2b2lkIFJ1biggUnVuRGVsZWdhdGUgZDEsIEV4Y2VwdGlvbkRlbGVnYXRlIGQyICkKKyAgICAgICAgeworICAgICAgICAgICAgTXlUb2RvIGluc3QgPSBuZXcgTXlUb2RvICggZDEsIGQyICk7CisgICAgICAgICAgICBtZ3IuQWRkKCBpbnN0ICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBUb2RvCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjbGFzcyBNeVRvZG8gOiBUb2RvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBNeVRvZG8gKCBSdW5EZWxlZ2F0ZSBkMSwgRXhjZXB0aW9uRGVsZWdhdGUgZDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuZDEgPSBkMTsKKyAgICAgICAgICAgICAgICB0aGlzLmQyID0gZDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIERvaXQoIFRvZG9NYW5hZ2VyIG1nciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZDEoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgRXhjZXB0aW9uKCBUb2RvTWFuYWdlciBtZ3IsIEV4Y2VwdGlvbiBlICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZDIoIGUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBSdW5EZWxlZ2F0ZSBkMTsKKyAgICAgICAgICAgIHByaXZhdGUgRXhjZXB0aW9uRGVsZWdhdGUgZDI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvUmVtb3RlQmFzZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9SZW1vdGVCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODNmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvUmVtb3RlQmFzZS5jcwpAQCAtMCwwICsxLDIwNiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUmVtb3RlQmFzZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIFJlbW90ZUJhc2UuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN2YyI+c3ZjPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2ZiI+dmYgPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFJlbW90ZUJhc2UoRGVsaXZlcnlTZXJ2aWNlIHN2YywgVmFsdWVGYWN0b3J5IHZmKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9zdmMgPSBzdmM7CisgICAgICAgICAgICB0aGlzLl92ZiA9IHZmOworICAgICAgICB9CisKKyAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBEZWxpdmVyeVNlcnZpY2UgX3N2YzsKKworICAgICAgICAvLy8gPHN1bW1hcnk+VGhlIHZhbHVlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgbWVzc2FnZXMgYW5kIGVuY29kZS9kZWNvZGUgdHlwZXMuPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVmFsdWVGYWN0b3J5IF92ZjsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoInswfS97MX0iLCBHZXRUeXBlKCksIF9zdmMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PiBDb25zdHJ1Y3RzIGEgbmV3IG1lc3NhZ2UgdG8gc2VuZCB1c2luZyBfc2VuZChNZXNzYWdlKSBvciBfYmVnaW5DYWxsKE1lc3NhZ2UpPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPnR5cGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YSBuZXcgbWVzc2FnZTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIE1lc3NhZ2UgX05ld01lc3NhZ2UoWFR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKHR5cGUsIF92Zik7CisgICAgICAgIH0KKworICAgICAgICAJCisJICAgIC8vLzxzdW1tYXJ5PlNlbmRzIHRoZSBtZXNzYWdlIHRvIHRoZSByZWNpcGllbnQsIGJ1dCBkb2VzIG5vdCB3YWl0IGZvciBhbnkgcmVzcG9uc2UuPC9zdW1tYXJ5PgorCSAgICAvLy88cGFyYW0gbmFtZSA9IG1zZz4gdGhlIG1lc3NhZ2UgdG8gc2VuZCA8L3BhcmFtPgorCSAgICAvLy88dGhyb3dzPiBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNlbmRpbmcgPC90aHJvd3M+CisJICAgIHB1YmxpYyB2b2lkIF9TZW5kKCBNZXNzYWdlIG1zZyApCisJICAgIHsKKwkJICAgIF9zdmMuVHJhbnNwb3J0TWVzc2FnZShudWxsLG1zZyk7CisJICAgIH0KKwkKKwkKKyAgICAgICAgLy8vPHN1bW1hcnk+U2VuZHMgdGhlIG1lc3NhZ2Ugd2hpY2ggYmVnaW5zIGEgY2FsbCBzZXF1ZW5jZS48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lID0gbXNnPiB0aGUgbWVzc2FnZSB0byBzZW5kIDwvcGFyYW0+CisgICAgICAgIC8vLzxyZXR1cm5zPkEgbWFpbGJveCB3aGljaCBjYW4gYmUgdXNlZCB0byByZWFkIHRoZSByZXNwb25zZSwgdXNpbmcgX0VuZENhbGw8L3JldHVybnM+CisJICAgIHB1YmxpYyBNYWlsYm94IF9CZWdpbkNhbGwoIE1lc3NhZ2UgbXNnICkKKwkgICAgeworCQkgICAgcmV0dXJuIF9zdmMuQmVnaW5DYWxsKCBtc2cgKTsKKwkgICAgfQorCisgICAgICAgCisJICAgIC8vLzxzdW1tYXJ5PkZpbmlzaGVzIGEgY2FsbCBzZXF1ZW5jZSBieSB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UgbWVzc2FnZS48L3N1bW1hcnk+CisJICAgIC8vLzxwYXJhbSBuYW1lID0gbWI+YSBtYWlsYm94IHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZWFkIHRoZSByZXNwb25zZSwgcmV0dXJuZWQgYnkKKwkgICAgLy8vIF9CZWdpbkNhbGwoTWVzc2FnZSkgPC9wYXJhbT4KKwkgICAgLy8vPHBhcmFtIG5hbWUgPSByZXNwb25zZVR5cGU+IHRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCByZXNwb25zZSA8L3BhcmFtPgorCSAgICAvLy88cmV0dXJucz50aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIGZpZWxkIGlmIGl0IGlzbid0IGFuIGV4Y2VwdGlvbi48L3JldHVybnM+CisJICAgIC8vLzx0aHJvd3M+IEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2VuZGluZyBvciBhIHRpbWVvdXQgd2FpdGluZyBvcgorCSAgICAvLy8gaWYgdGhlIHJlc3VsdCB2YWx1ZSB3YXMgYW4gZXhjZXB0aW9uLjwvdGhyb3dzPgorCSAgICBwdWJsaWMgT2JqZWN0IF9FbmRDYWxsKCBNYWlsYm94IG1iLCBYVHlwZSByZXNwb25zZVR5cGUgKSAKKwkgICAgeworCQkgICAgcmV0dXJuIF9zdmMuRW5kQ2FsbCggbWIsIHJlc3BvbnNlVHlwZSApOworCSAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIGEgY29uZmlndXJhdGlvbiBvciBvcGVyYXRpb25hbCB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UuIFRoZQorICAgICAgICAvLy8gcmVxdWVzdCBpcyBwYXNzZWQgZG93biB0aGUgY2hhaW4gb2Ygc291cmNlcyB1bnRpbCBzb21lIHNvdXJjZQorICAgICAgICAvLy8gcmVjb2duaXNlcyB0aGUgcXVlcnksIHdoZXJldXBvbiBpdCByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJxdWVyeSI+YW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHF1ZXJ5LCB3aGljaCBjb3VsZCBiZSBhcworICAgICAgICAvLy8gc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworICAgICAgICAvLy8gYSBjbGFzcyB3aXRoIGluc3RhbmNlIHZhcmlhYmxlcyBmb3IgcXVlcnkgdGVybXMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSByZXF1ZXN0ZWQgdmFsdWUsIG9yIG51bGwgaWYgbm90IGRlZmluZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgaXMgbm90IHJlY29nbmlzZWQKKyAgICAgICAgLy8vICAgICBieSBhbnkgc291cmNlICh3aGljaCBpcyB0byBzYXksIGlmIHRoZSBsYXN0IHNvdXJjZSBpbiB0aGUgc291cmNlCisgICAgICAgIC8vLyAgICAgY2hhaW4gZG9lcyBub3QgcmVjb2duaXNlIGl0LCBpdCBzaG91bGQgdGhyb3cgdGhpcyBleGNlcHRpb24pLgorICAgICAgICAvLy8gICAgIAorICAgICAgICBwdWJsaWMgb2JqZWN0IF9UcmFuc3BvcnRRdWVyeSggb2JqZWN0IHF1ZXJ5ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zdmMuVHJhbnNwb3J0UXVlcnkoIHF1ZXJ5ICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIGEgY29uZmlndXJhdGlvbiBvciBvcGVyYXRpb25hbCB2YWx1ZSBpbiB0aGUgc291cmNlLiBUaGUKKyAgICAgICAgLy8vIHJlcXVlc3QgaXMgcGFzc2VkIGRvd24gdGhlIGNoYWluIG9mIHNvdXJjZXMgdW50aWwgc29tZSBzb3VyY2UKKyAgICAgICAgLy8vIHJlY29nbmlzZXMgdGhlIGNvbnRyb2wsIHdoZXJldXBvbiBpdCBzdG9yZXMgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgICAgICAvLy8gYW5kIHJldHVybnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250cm9sIj5hbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29udHJvbCwgd2hpY2ggY291bGQgYmUgYXMKKyAgICAgICAgLy8vIHNpbXBsZSBhcyBhIHN0cmluZywgaW50ZWdlciwgb3IgZW51bSwgb3IgbW9yZSBjb21wbGV4IHN1Y2ggYXMKKyAgICAgICAgLy8vIGEgY2xhc3Mgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMgZm9yIGNvbnRyb2wgdGVybXMuPC9wYXJhbT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj50aGUgdmFsdWUgdG8gc2V0LjwvcGFyYW0+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIEV4Y2VwdGlvbjogCisgICAgICAgIC8vLyAgICAgdGhyb3dzIEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0CisgICAgICAgIC8vLyAgICAgdHlwZSBvciBpZiB0aGUgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZS4KKyAgICAgICAgLy8vICAgICAKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBjb250cm9sIGlzIG5vdCByZWNvZ25pc2VkCisgICAgICAgIC8vLyAgICAgYnkgYW55IHNvdXJjZSAod2hpY2ggaXMgdG8gc2F5LCBpZiB0aGUgbGFzdCBzb3VyY2UgaW4gdGhlIHNvdXJjZQorICAgICAgICAvLy8gICAgIGNoYWluIGRvZXMgbm90IHJlY29nbmlzZSBpdCwgaXQgc2hvdWxkIHRocm93IHRoaXMgZXhjZXB0aW9uKS4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgdm9pZCBfVHJhbnNwb3J0Q29udHJvbCggb2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdmMuVHJhbnNwb3J0Q29udHJvbCggY29udHJvbCwgdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vdGlmaWVzIHRoZSBjaGFpbiBvZiBzb3VyY2VzIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuIFVubGlrZSBxdWVyeQorICAgICAgICAvLy8gYW5kIGNvbnRyb2wgb3BlcmF0aW9ucyBhYm92ZSwgZXZlbnRzIGFyZSBhbHdheXMgcGFzc2VkIGRvd24gdG8gdGhlCisgICAgICAgIC8vLyBib3R0b20gdG8gYWxsb3cgYWxsIHNvdXJjZXMgdG8gbm90aWNlIHRoZW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJldmVudE9iaiI+YSBjbGFzcyB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudCwgcG9zc2libHkgd2l0aAorICAgICAgICAvLy8gcGFyYW1ldGVycy4gVGhlIHNpbXBsZXN0IGV2ZW50IGNvdWxkIGJlIGEgc3RyaW5nLCBpbnRlZ2VyLAorICAgICAgICAvLy8gb3IgZW51bSwgYnV0IGFueSBjbGFzcyBpbnN0YW5jZSB3aWxsIGRvIChhcyBsb25nIGFzIHNvbWUgc291cmNlCisgICAgICAgIC8vLyBpbiB0aGUgY2hhaW4gZXhwZWN0cyBpdCkuPC9wYXJhbT4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgdm9pZCBfVHJhbnNwb3J0Tm90aWZ5KCBvYmplY3QgZXZlbnRPYmogKQorICAgICAgICB7CisgICAgICAgICAgICBfc3ZjLlRyYW5zcG9ydE5vdGlmeSggZXZlbnRPYmogKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0YXJ0IHRoZSB0cmFuc3BvcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgX1N0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3N2Yy5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlQsIG51bGwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdhaXRzIGZvciB0aGUgdHJhbnNwb3J0IHRvIGNvbWUgdXAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIF9XYWl0VXAoIGludCBtYXhEZWxheSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdmMuVHJhbnNwb3J0UXVlcnkoIG5ldyBUcmFuc3BvcnRDb25zdHMuV2FpdFVwKCBtYXhEZWxheSApICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdGFydHMgdGhlIHRyYW5zcG9ydCBhbmQgd2FpdHMgZm9yIGl0IHRvIGNvbWUgdXAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIF9TdGFydEFuZFdhaXRVcCggaW50IG1heERlbGF5ICkKKyAgICAgICAgeworICAgICAgICAgICBfU3RhcnQoKTsKKyAgICAgICAgICAgIF9XYWl0VXAobWF4RGVsYXkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RvcHMgdGhlIHRyYW5zcG9ydC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgX1N0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBfc3ZjLlRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydENvbnN0cy5TVE9QLCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXYWl0cyBmb3IgdGhlIHRyYW5zcG9ydCB0byBnbyBkb3duLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heERlbGF5Ij48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBfV2FpdERvd24oIGludCBtYXhEZWxheSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdmMuVHJhbnNwb3J0UXVlcnkoIG5ldyBUcmFuc3BvcnRDb25zdHMuV2FpdERvd24oIG1heERlbGF5ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0b3BzIHRoZSB0cmFuc3BvcnQgYW5kIHdhaXRzIGZvciBpdCB0byBnbyBkb3duLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heERlbGF5Ij5tYXhkZWxheSBpbiBtaWxsaXNlY29uZHM8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBfU3RvcEFuZFdhaXREb3duKCBpbnQgbWF4RGVsYXkgKQorICAgICAgICB7CisgICAgICAgICAgICBfU3RvcCgpOworICAgICAgICAgICAgX1dhaXREb3duKG1heERlbGF5KTsKKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9SdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9SdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q4YmFjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1J1bnRpbWVFeGNlcHRpb25TZXJpYWxpemVyLmNzCkBAIC0wLDAgKzEsNjIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFJ1bnRpbWVFeGNlcHRpb25TZXJpYWxpemVyIDogSW1wb3J0RXhwb3J0SGVscGVyCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IFN0cmluZyBGSUVMRF9OQU1FID0gIm1zZyI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEluaXQoWFR5cGUgdHlwZSwgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHR5cGUuR2V0RmllbGQoRklFTERfTkFNRSk7CisgICAgICAgICAgICBjbGFzczJ0eXBlLkFkZCh0eXBlb2YoX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiksIHR5cGUpOworICAgICAgICAgICAgdHlwZS5TZXRDb21wb25lbnRUeXBlKHR5cGVvZihfRXRjaF9SdW50aW1lRXhjZXB0aW9uKSk7CisgICAgICAgICAgICB0eXBlLlNldEltcG9ydEV4cG9ydEhlbHBlcihuZXcgUnVudGltZUV4Y2VwdGlvblNlcmlhbGl6ZXIodHlwZSwgZmllbGQpKTsKKyAgICAgICAgICAgIHR5cGUuUHV0VmFsaWRhdG9yKGZpZWxkLCBWYWxpZGF0b3Jfc3RyaW5nLkdldCgwKSk7CisgICAgICAgICAgICB0eXBlLkxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplcihYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgdHlwZTsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkIGZpZWxkOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJ1Y3RWYWx1ZSBFeHBvcnRWYWx1ZShWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUodHlwZSwgdmYpOworICAgICAgICAgICAgc3YuQWRkKGZpZWxkLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBzdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBPYmplY3QgSW1wb3J0VmFsdWUoU3RydWN0VmFsdWUgc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN2LkNoZWNrVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgX0V0Y2hfUnVudGltZUV4Y2VwdGlvbigoU3RyaW5nKXN2LkdldChmaWVsZCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1NlcnZlckZhY3RvcnkuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvU2VydmVyRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2QyNTg3Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1NlcnZlckZhY3RvcnkuY3MKQEAgLTAsMCArMSw0NyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIHRvIHVzZSBmb3IgY29uc3RydWN0aW5nIG5ldyBzZXJ2ZXIgaW5zdGFuY2VzIGJ5IAorICAgIC8vLyBUcmFuc3BvcnRIZWxwZXIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgU2VydmVyRmFjdG9yeSA6IFNlc3Npb24sIFRyYW5zcG9ydDxTZXNzaW9uPgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBzZXJ2ZXIgc2Vzc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0cmFuc3BvcnQiPnRoZSBUcmFuc3BvcnRNZXNzYWdlIHRvIHVzZSB3aXRoIHRoZSBuZXcgc2VydmVyIGluc3RhbmNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpIj50aGUgdXJpIHRvIHVzZSB0byBjb25maWd1cmUgdGhlIG5ldyBzZXJ2ZXIgaW5zdGFuY2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZXNvdXJjZXMiPnRoZSByZXNvdXJjZXMgdG8gdXNlIGZvciB0aGUgbmV3IHNlcnZlciBpbnN0YW5jZS48L3BhcmFtPgorICAgICAgICB2b2lkIE5ld1NlcnZlcihUcmFuc3BvcnRNZXNzYWdlIHRyYW5zcG9ydCwgc3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB2YWx1ZSBmYWN0b3J5IGZvciB0aGlzIHNlc3Npb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpIj50aGUgdXJpIHRvIHVzZSB0byBjb25maWd1cmUgdGhlIG5ldyB2YWx1ZSBmYWN0b3J5LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIG5ldyBpbnN0YW5jZSBvZiB2YWx1ZSBmYWN0b3J5IGZvciB0aGlzIHNlc3Npb24uPC9yZXR1cm5zPgorICAgICAgICBWYWx1ZUZhY3RvcnkgTmV3VmFsdWVGYWN0b3J5KHN0cmluZyB1cmkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9TdHViQmFzZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9TdHViQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdhNzVjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1N0dWJCYXNlLmNzCkBAIC0wLDAgKzEsMTYyIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJhc2UgY2xhc3Mgb2Ygc3R1YiBpbXBsZW1lbnRhdGlvbnMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBTdHViQmFzZSA6IFNlc3Npb25NZXNzYWdlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgU3R1YkJhc2UuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNyYyI+dGhlIG1lc3NhZ2Ugc291cmNlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvYmoiPnRoZSB0YXJnZXQgb2YgZGVjb2RlZCBtZXNzYWdlczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icXVldWVkIj50aHJlYWQgcG9vbCB1c2VkIHRvIHJ1biBBc3luY1JlY2VpdmVyTW9kZS5RVUVVRUQgbWV0aG9kcy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZyZWUiPnRocmVhZCBwb29sIHVzZWQgdG8gcnVuIEFzeW5jUmVjZWl2ZXJNb2RlLkZSRUUgbWV0aG9kcy48L3BhcmFtPgorICAgICAgICBwdWJsaWMgU3R1YkJhc2UoRGVsaXZlcnlTZXJ2aWNlIHNyYywgb2JqZWN0IG9iaiwgUG9vbCBxdWV1ZWQsIFBvb2wgZnJlZSkKKyAgICAgICAgeworICAgICAgICAgICAgX3NyYyA9IHNyYzsKKyAgICAgICAgICAgIF9vYmogPSBvYmo7CisgICAgICAgICAgICBfcXVldWVkID0gcXVldWVkOworICAgICAgICAgICAgX2ZyZWUgPSBmcmVlOworICAgICAgICAgICAgc3JjLlNldFNlc3Npb24odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbWVzc2FnZSBzb3VyY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBEZWxpdmVyeVNlcnZpY2UgX3NyYzsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdGFyZ2V0IG9mIGRlY29kZWQgbWVzc2FnZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBvYmplY3QgX29iajsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaHJlYWQgcG9vbCB1c2VkIHRvIHJ1biBBc3luY1JlY2VpdmVyTW9kZS5RVUVVRUQgbWV0aG9kcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IFBvb2wgX3F1ZXVlZDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaHJlYWQgcG9vbCB1c2VkIHRvIHJ1biBBc3luY1JlY2VpdmVyTW9kZS5GUkVFIG1ldGhvZHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBQb29sIF9mcmVlOworCisgICAgICAgIAorCisgICAgICAgIHB1YmxpYyBPYmplY3QgU2Vzc2lvblF1ZXJ5KE9iamVjdCBxdWVyeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9vYmogaXMgT2JqU2Vzc2lvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gKChPYmpTZXNzaW9uKV9vYmopLl9TZXNzaW9uUXVlcnkocXVlcnkpOworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigidW5rbm93biBxdWVyeTogIiArIHF1ZXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Db250cm9sKE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfb2JqIGlzIE9ialNlc3Npb24pCisgICAgICAgICAgICAgICAgKChPYmpTZXNzaW9uKV9vYmopLl9TZXNzaW9uQ29udHJvbChjb250cm9sLCB2YWx1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigidW5rbm93biBjb250cm9sOiAiICsgY29udHJvbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uTm90aWZ5KE9iamVjdCBldmVudE9iaikKKyAgICAgICAgeworICAgICAgICAgICAgU2Vzc2lvbk5vdGlmeShfb2JqLCBldmVudE9iaik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2Vzc2lvbk5vdGlmeSggb2JqZWN0IG9iaiwgb2JqZWN0IGV2ZW50T2JqICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9iaiBpcyBPYmpTZXNzaW9uKQorICAgICAgICAgICAgICAgICgoT2JqU2Vzc2lvbilvYmopLl9TZXNzaW9uTm90aWZ5KGV2ZW50T2JqKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50T2JqIGlzIEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShldmVudE9iaik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWxlZ2F0ZSB0aGF0IGhlbHBzIHRoZSBzdHViIGRpc3BhdGNoIHRoZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iX3NyYyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJfb2JqIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbmRlciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtc2ciPjwvcGFyYW0+IAorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBTdHViSGVscGVyUnVuKERlbGl2ZXJ5U2VydmljZSBfc3JjLCBPYmplY3QgX29iaiwgV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpOworCisKKyAgICAgICAgI3JlZ2lvbiBTZXNzaW9uTWVzc2FnZSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIGJvb2wgU2Vzc2lvbk1lc3NhZ2UoV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhUeXBlIHR5cGUgPSBtc2cuR2V0WFR5cGU7CisKKyAgICAgICAgICAgIFN0dWJIZWxwZXJSdW4gaGVscGVyID0gKFN0dWJIZWxwZXJSdW4pIHR5cGUuR2V0U3R1YkhlbHBlcigpOworICAgICAgICAgICAgaWYgKGhlbHBlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoICh0eXBlLkdldEFzeW5jTW9kZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQXN5bmNNb2RlLlFVRVVFRDoKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9xdWV1ZWQuUnVuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlIHsgaGVscGVyKF9zcmMsIF9vYmosIHNlbmRlciwgbXNnKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZShFeGNlcHRpb24gZSkgeyBTZXNzaW9uTm90aWZ5KF9vYmosIGUpOyB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Ob3RpZnkoX29iaiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBc3luY01vZGUuRlJFRToKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9mcmVlLlJ1bigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZSB7IGhlbHBlcihfc3JjLCBfb2JqLCBzZW5kZXIsIG1zZyk7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUoRXhjZXB0aW9uIGUpIHsgU2Vzc2lvbk5vdGlmeShfb2JqLCBlKTsgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTm90aWZ5KF9vYmosIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQXN5bmNNb2RlLk5PTkU6CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIoX3NyYywgX29iaiwgc2VuZGVyLCBtc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk5vdGlmeShfb2JqLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYXN5bmMgbW9kZSAiK3R5cGUuR2V0QXN5bmNNb2RlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1N0dWJIZWxwZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvU3R1YkhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGM5MTQzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1N0dWJIZWxwZXIuY3MKQEAgLTAsMCArMSw2OCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgU3R1YkhlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIFN0dWJIZWxwZXIoRGVsZWdhdGUgZGVsLCBBc3luY01vZGUgbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICAgICAgICAgIHRoaXMuZGVsID0gZGVsOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgYSBTdHViSGVscGVyIHdoaWNoIHVzZXMgc3luY2hyb25vdXMgbW9kZSB0byBkaXNwYXRjaAorICAgICAgICAvLy8gbWV0aG9kIGZyb20gbWVzc2FnZS48L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBTdHViSGVscGVyKCkgOiB0aGlzKEFzeW5jTW9kZS5OT05FKQorICAgICAgICB7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLzxzdW1tYXJ5PkNvbnN0cnVjdHMgYSBTdHViSGVscGVyIHdoaWNoIHVzZXMgc3BlY2lmaWVkIG1vZGUgdG8KKyAgICAgICAgLy8vZGlzcGF0Y2ggbWV0aG9kIGZyb20gbWVzc2FnZS48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJtb2RlIj5wYXJhbSBtb2RlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFN0dWJIZWxwZXIoQXN5bmNNb2RlIG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubW9kZSA9IG1vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEFzeW5jTW9kZSBtb2RlOworICAgICAgICBwcml2YXRlIERlbGVnYXRlIGRlbDsKKworICAgICAgICAvLy88cmV0dXJucz50cnVlIGlmIHRoZSBtb2RlIGlzIEFzeW5jTW9kZS5RVUVVRUQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBJc1F1ZXVlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtb2RlID09IEFzeW5jTW9kZS5RVUVVRUQ7CisgICAgICAgIH0KKworICAgICAgICAvLy88cmV0dXJucz50cnVlIGlmIHRoZSBtb2RlIGlzIEFzeW5jTW9kZS5GUkVFLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgSXNGcmVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT0gQXN5bmNNb2RlLkZSRUU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVsZWdhdGUgR2V0RGVsZWdhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1RyYW5zcG9ydEZhY3RvcnkuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVHJhbnNwb3J0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTIzNTgzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1RyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTAsMCArMSwyMzUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIHRvIHRyYW5zcG9ydCBmYWN0b3J5CisgICAgLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNwb3J0RmFjdG9yeQorCXsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBUcmFuc3BvcnQgc3RhY2sgdG9wcGVkIGJ5IGEgVHJhbnNwb3J0TWVzc2FnZQorICAgICAgICAvLy8gd2hpY2ggaXMgdXNlZCBieSB0aGUgcmVtb3RlIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zIHRvIHNlbmQKKyAgICAgICAgLy8vIG1lc3NhZ2VzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+dHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc291cmNlcyI+YWRkaXRpb25hbCByZXNvdXJjZXMgbmVlZGVkIGJ5IHRoZSBzdGFjay48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIFRyYW5zcG9ydE1lc3NhZ2UgdG9wcGluZyB0aGUgdHJhbnNwb3J0IHN0YWNrLjwvcmV0dXJucz4KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRyYW5zcG9ydE1lc3NhZ2UgTmV3VHJhbnNwb3J0KHN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcgVHJhbnNwb3J0IHN0YWNrIHRvcHBlZCBieSBhIFRyYW5zcG9ydE1lc3NhZ2UKKyAgICAgICAgLy8vIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlbW90ZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucyB0byBzZW5kCisgICAgICAgIC8vLyBtZXNzYWdlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPnRyYW5zcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZXNvdXJjZXMiPmFkZGl0aW9uYWwgcmVzb3VyY2VzIG5lZWRlZCBieSB0aGUgc3RhY2suPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBUcmFuc3BvcnRNZXNzYWdlIHRvcHBpbmcgdGhlIHRyYW5zcG9ydCBzdGFjay48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0TWVzc2FnZSBHZXRUcmFuc3BvcnQoc3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykgCisJICAgIHsKKyAgICAgICAgICAgIFVSTCB1ID0gbmV3IFVSTCh1cmkpOworICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSBmID0gR2V0VHJhbnNwb3J0RmFjdG9yeSh1LlNjaGVtZSk7CisgICAgICAgICAgICByZXR1cm4gZi5OZXdUcmFuc3BvcnQodXJpLCByZXNvdXJjZXMpOworCSAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBUcmFuc3BvcnQgTGlzdGVuZXIgd2hpY2ggaXMgdXNlZCB0byBjb25zdHJ1Y3QKKyAgICAgICAgLy8vIHNlcnZlciBzZXNzaW9ucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPmxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc291cmNlcyI+YWRkaXRpb25hbCByZXNvdXJjZXMgbmVlZGVkIGJ5IHRoZSBsaXN0ZW5lci48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YW4gb3V0LW9mLWJhbmQgc291cmNlIHdoaWNoIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGxpc3RlbmVyLjwvcmV0dXJucz4KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBOZXdMaXN0ZW5lcihzdHJpbmcgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IFRyYW5zcG9ydCBMaXN0ZW5lciB3aGljaCBpcyB1c2VkIHRvIGNvbnN0cnVjdAorICAgICAgICAvLy8gc2VydmVyIHNlc3Npb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+bGlzdGVuZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzb3VyY2VzIj5hZGRpdGlvbmFsIHJlc291cmNlcyBuZWVkZWQgYnkgdGhlIGxpc3RlbmVyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBvdXQtb2YtYmFuZCBzb3VyY2Ugd2hpY2ggbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgbGlzdGVuZXIuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBHZXRMaXN0ZW5lcihzdHJpbmcgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzKSAKKwkgICAgeworICAgICAgICAgICAgVVJMIHUgPSBuZXcgVVJMKHVyaSk7CisgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5IGYgPSBHZXRUcmFuc3BvcnRGYWN0b3J5KHUuU2NoZW1lKTsKKyAgICAgICAgICAgIHJldHVybiBmLk5ld0xpc3RlbmVyKHVyaSwgcmVzb3VyY2VzKTsKKwkgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYW55IG1lc3NhZ2UgZmlsdGVycyBzcGVjaWZpZWQgb24gdGhlIHVyaS4gVGhleSBhcmUgYWRkZWQgaW4gb3JkZXIKKyAgICAgICAgLy8vIGZyb20gdHJhbnNwb3J0IHRvIHNlc3Npb24uIFRoZSBmaXJzdCBmaWx0ZXIgaXMgdGhlIHNlc3Npb24gZm9yIE1lc3NhZ2l6ZXIsCisgICAgICAgIC8vLyB0aGUgc2Vjb25kIGlzIHRoZSBzZXNzaW9uIGZvciB0aGUgZmlyc3QsIGV0Yy4gVGhlIGxhc3QgZmlsdGVyIGFkZGVkIGlzCisgICAgICAgIC8vLyByZXR1cm5lZCwgYW5kIGJlY29tZXMgdGhlIFRyYW5zcG9ydE1lc3NhZ2UgZm9yIHdoYXQgZm9sbG93cy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0cmFuc3BvcnQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc291cmNlcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGZpbHRlcjwvcmV0dXJucz4KKyAgICAgICAgcHJvdGVjdGVkIFRyYW5zcG9ydE1lc3NhZ2UgQWRkRmlsdGVycyhUcmFuc3BvcnRNZXNzYWdlIHRyYW5zcG9ydCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHMgPSB1cmkuR2V0VGVybShGSUxURVIpOworICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCB8fCBzLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIiw6O3wgXHRcclxuIik7CisgICAgICAgICAgICB3aGlsZSAoc3QuSGFzTW9yZVRva2VucygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB0ID0gc3QuTmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gQWRkRmlsdGVyKHRyYW5zcG9ydCwgdCwgdXJpLCByZXNvdXJjZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUXVlcnkgdGVybSBvbiB0aGUgdHJhbnNwb3J0IHVyaSB3aGljaCBkZWZpbmVzIGEgc2V0IG9mIGZpbHRlcnMgd2hpY2gKKyAgICAgICAgLy8vIHByb2Nlc3MgbWVzc2FnZXMgYXMgdGhleSBtb3ZlIHVwIGFuZCBkb3duIHRoZSB0cmFuc3BvcnQgc3RhY2suIEZpbHRlcgorICAgICAgICAvLy8gbmFtZXMgYXJlIHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjaGFyYWN0ZXJzOiAiLDo7fCBcdFxyXG4iLgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBVc2FnZSBleGFtcGxlOiB0Y3A6Ly9ob3N0OnBvcnQ/ZmlsdGVyPUtlZXBBbGl2ZSxQd0F1dGgKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBGSUxURVIgPSAiZmlsdGVyIjsKKworICAgICAgICBwcml2YXRlIFRyYW5zcG9ydE1lc3NhZ2UgQWRkRmlsdGVyKFRyYW5zcG9ydE1lc3NhZ2UgdHJhbnNwb3J0LCBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0eXBlTmFtZSA9IEdldEZpbHRlcihuYW1lKTsKKworICAgICAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KCAiQ2xhc3MgJ3swfScgZm9yIGZpbHRlciBuYW1lICd7MX0nIG5vdCBkZWZpbmVkIiwgdHlwZU5hbWUsIG5hbWUgKSApOworCisgICAgICAgICAgICBUeXBlIHR5cGUgPSBUeXBlLkdldFR5cGUodHlwZU5hbWUpOworCisgICAgICAgICAgICBDb25zdHJ1Y3RvckluZm8gYyA9IHR5cGUuR2V0Q29uc3RydWN0b3IoRklMVEVSX1BBUkFNUyk7CisKKyAgICAgICAgICAgIHJldHVybiAoVHJhbnNwb3J0TWVzc2FnZSkgYy5JbnZva2UobmV3IG9iamVjdFtdIHsgdHJhbnNwb3J0LCB1cmksIHJlc291cmNlcyB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIFR5cGVbXSBGSUxURVJfUEFSQU1TID0geyB0eXBlb2YoVHJhbnNwb3J0TWVzc2FnZSksIHR5cGVvZihVUkwpLCB0eXBlb2YoUmVzb3VyY2VzKSB9OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgb2YgdGhlIGZpbHRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgb2YgdGhlIGZpbHRlci48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEZpbHRlcihzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAoZmlsdGVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcnMuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IHZhbHVlKSA/IHZhbHVlIDogbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgb2YgdGhlIGZpbHRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGVOYW1lIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRGVmaW5lRmlsdGVyKHN0cmluZyBuYW1lLCBzdHJpbmcgdHlwZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKGZpbHRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsdGVycy5BZGQobmFtZSwgdHlwZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gZmlsdGVycyA9CisgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBuYW1lZCB0cmFuc3BvcnQgZmFjdG9yeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj50aGUgbmFtZSBvZiBhIGNvbmZpZ3VyZWQgdHJhbnNwb3J0IGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBuYW1lZCB0cmFuc3BvcnQgZmFjdG9yeS48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgc3RhdGljIFRyYW5zcG9ydEZhY3RvcnkgR2V0VHJhbnNwb3J0RmFjdG9yeSggc3RyaW5nIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgdGZzcGVjID0gR2V0KG5hbWUpOworCisgICAgICAgICAgICBpZiAodGZzcGVjID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0cmFuc3BvcnQgZmFjdG9yeSBzY2hlbWUgJyIgKyBuYW1lICsgIicgdW5rbm93biIpOworCisgICAgICAgICAgICBpZiAodGZzcGVjIGlzIHN0cmluZykKKyAgICAgICAgICAgICAgICB0ZnNwZWMgPSBUeXBlLkdldFR5cGUoKHN0cmluZyl0ZnNwZWMpOworCisgICAgICAgICAgICBpZiAodGZzcGVjIGlzIFR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc3RydWN0b3JJbmZvIGMgPSAoKFR5cGUpdGZzcGVjKS5HZXRDb25zdHJ1Y3RvcihGQUNUT1JZX1BBUkFNUyk7CisgICAgICAgICAgICAgICAgdGZzcGVjID0gYy5JbnZva2UoRkFDVE9SWV9BUkdTKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRmc3BlYyBpcyBUcmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgICAgICAgIHJldHVybiAoVHJhbnNwb3J0RmFjdG9yeSl0ZnNwZWM7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRyYW5zcG9ydEZhY3RvcnkgZnJvbSB0cmFuc3BvcnQgZmFjdG9yeSBuYW1lICd7MH0nIiwgbmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdGF0aWMgVHlwZVtdIEZBQ1RPUllfUEFSQU1TID0geyB9OworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIG9iamVjdFtdIEZBQ1RPUllfQVJHUyA9IHsgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIG9iamVjdCBHZXQoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKHRyYW5zcG9ydEZhY3RvcmllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgdmFsdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydEZhY3Rvcmllcy5UcnlHZXRWYWx1ZShuYW1lLCBvdXQgdmFsdWUpID8gdmFsdWUgOiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQdXRzIGEgbmFtZWQgdHJhbnNwb3J0IGZhY3RvcnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+dGhlIHVyaSBzY2hlbWUgb2YgdGhpcyB0cmFuc3BvcnQgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRmc3BlYyI+dGhlIHRyYW5zcG9ydCBmYWN0b3J5IHNwZWMgdG8gYXNzb2NpYXRlIHdpdGggdGhlCisgICAgICAgIC8vLyBuYW1lLiBUaGlzIGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBUcmFuc3BvcnRGYWN0b3J5IG9yIHRoZSBuYW1lIG9mIGEgc3ViY2xhc3MKKyAgICAgICAgLy8vIG9mIFRyYW5zcG9ydEZhY3RvcnkgdG8gaW5zdGFudGlhdGUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIERlZmluZSggc3RyaW5nIG5hbWUsIG9iamVjdCB0ZnNwZWMgKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrICh0cmFuc3BvcnRGYWN0b3JpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yaWVzLkFkZChuYW1lLCB0ZnNwZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdGF0aWMgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gdHJhbnNwb3J0RmFjdG9yaWVzID0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOworCisgICAgICAgIHN0YXRpYyBUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgRGVmaW5lKCJ0Y3AiLCBuZXcgVGNwVHJhbnNwb3J0RmFjdG9yeShmYWxzZSkpOworICAgICAgICAgICAgRGVmaW5lKCJ0bHMiLCBuZXcgVGNwVHJhbnNwb3J0RmFjdG9yeSh0cnVlKSk7CisKKyAgICAgICAgICAgIERlZmluZUZpbHRlcigiS2VlcEFsaXZlIiwgIk9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0LkZpbHRlci5LZWVwQWxpdmUiKTsKKyAgICAgICAgICAgIERlZmluZUZpbHRlcigiUHdBdXRoIiwgIk9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0LkZpbHRlci5Qd0F1dGgiKTsKKyAgICAgICAgICAgIERlZmluZUZpbHRlcigiTG9nZ2VyIiwgIk9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0LkZpbHRlci5Mb2dnZXIiKTsKKyAgICAgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9UcmFuc3BvcnRIZWxwZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVHJhbnNwb3J0SGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODI0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVHJhbnNwb3J0SGVscGVyLmNzCkBAIC0wLDAgKzEsODAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ2xhc3MgdG8gaGVscCBjb25zdHJ1Y3QgdHJhbnNwb3J0IHN0YWNrcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUcmFuc3BvcnRIZWxwZXIKKyAgICB7CisgICAgICAgICNyZWdpb24gUkVTT1VSQ0VTCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFBvb2wgdG8gdXNlIHRvIGV4ZWN1dGUgcXVldWVkIGFzeW5jIHJlY2VpdmVyIG1lc3NhZ2VzLiAqLworCSAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIFFVRVVFRF9QT09MID0gIlFVRVVFRF9QT09MIjsKKyAgICAJCisJICAgIC8vLyA8c3VtbWFyeT4KKwkgICAgLy8vIFRoZSBQb29sIHRvIHVzZSB0byBleGVjdXRlIGZyZWUgYXN5bmMgcmVjZWl2ZXIgbWVzc2FnZXMuCisJICAgIC8vLyA8L3N1bW1hcnk+CisgCSAgICBwdWJsaWMgY29uc3QgU3RyaW5nIEZSRUVfUE9PTCA9ICJGUkVFX1BPT0wiOworICAgIAkKKwkgICAgLy8vIDxzdW1tYXJ5PgorCSAgICAvLy8gQmluYXJ5IHRyYW5zcG9ydCBmb3JtYXQKKwkgICAgLy8vIDwvc3VtbWFyeT4KKwkgICAgcHVibGljIGNvbnN0IFN0cmluZyBCSU5BUlkgPSAiYmluYXJ5IjsKKyAgICAJCisJICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFhtbCB0cmFuc3BvcnQgZm9ybWF0CisJICAgIC8vLyA8L3N1bW1hcnk+CisJICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgWE1MID0gInhtbCI7CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVVRJTElUSUVTCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgc3RhbmRhcmQgcmVzb3VyY2VzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc291cmNlcyI+c29tZSBpbml0aWFsIHZhbHVlcyBmb3IgcmVzb3VyY2VzLiBNYXkgYmUgbnVsbCB0byBhY2NlcHQKKyAgICAgICAgLy8vIGFsbCB0aGUgZGVmYXVsdHMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmNvcHkgb2YgcmVzb3VyY2VzIGluaXRpYWxpemVkIHdpdGggZGVmYXVsdCB2YWx1ZXMgZm9yIHN0YW5kYXJkIGl0ZW1zPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlcyBJbml0UmVzb3VyY2VzKCBSZXNvdXJjZXMgcmVzb3VyY2VzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCByZXNvdXJjZXMgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMocmVzb3VyY2VzKTsKKworICAgICAgICAgICAgaWYgKCAhcmVzb3VyY2VzLkNvbnRhaW5zS2V5KCBRVUVVRURfUE9PTCApICkKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuQWRkKCBRVUVVRURfUE9PTCwgbmV3IFF1ZXVlZFBvb2woKSApOworCisgICAgICAgICAgICBpZiAoICFyZXNvdXJjZXMuQ29udGFpbnNLZXkoIEZSRUVfUE9PTCApICkKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuQWRkKCBGUkVFX1BPT0wsIG5ldyBGcmVlUG9vbCgpICk7CisKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZXM7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1R5cGVWYWxpZGF0b3IuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVHlwZVZhbGlkYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYwOWNiCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1R5cGVWYWxpZGF0b3IuY3MKQEAgLTAsMCArMSwxNDIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCYXNlIGNsYXNzIG9mIHZhbGlkYXRvcnMgd2hpY2ggdmFsaWRhdGUgYmFzZWQgb24gZXhhY3QgdHlwZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGFic3RyYWN0IHB1YmxpYyBjbGFzcyBUeXBlVmFsaWRhdG9yIDogVmFsaWRhdG9yCisgICAgeworICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgVHlwZVZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzY2FsYXJDbGFzcyI+Y2xhc3MgdG8gdXNlIGlmIG5EaW1zID09IDA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFycmF5Q2xhc3MiPmNsYXNzIHRvIHVzZSBpZiBuRGltcyA+IDA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj50aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzY3IiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUeXBlVmFsaWRhdG9yKCBUeXBlIHNjYWxhckNsYXNzLCBUeXBlIGFycmF5Q2xhc3MsIGludCBuRGltcywKKyAgICAgICAgICAgIFN0cmluZyBkZXNjcikKKyAgICAgICAgICAgIDogdGhpcyhzY2FsYXJDbGFzcywgYXJyYXlDbGFzcywgbkRpbXMsIGRlc2NyLCBmYWxzZSkKKyAgICAgICAgeworICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgVHlwZVZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzY2FsYXJDbGFzcyI+Y2xhc3MgdG8gdXNlIGlmIG5EaW1zID09IDA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFycmF5Q2xhc3MiPmNsYXNzIHRvIHVzZSBpZiBuRGltcyA+IDA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj50aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzY3IiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3ViY2xhc3NPayI+dHJ1ZSBvZiBhIHN1YmNsYXNzIG9mIHRoZSBleHBlY3RlZCBjbGFzcyBpcyBvazwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUeXBlVmFsaWRhdG9yKFR5cGUgc2NhbGFyQ2xhc3MsIFR5cGUgYXJyYXlDbGFzcywgaW50IG5EaW1zLAorICAgICAgICAgICAgU3RyaW5nIGRlc2NyLCBib29sIHN1YmNsYXNzT2spCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrRGltcyhuRGltcyk7CisKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRDbGFzcyA9IE1rRXhwZWN0ZWRDbGFzcyhzY2FsYXJDbGFzcywgYXJyYXlDbGFzcywgbkRpbXMpOworICAgICAgICAgICAgdGhpcy5uRGltcyA9IG5EaW1zOworICAgICAgICAgICAgdGhpcy5kZXNjciA9IGRlc2NyOworICAgICAgICAgICAgdGhpcy5zdWJjbGFzc09rID0gc3ViY2xhc3NPazsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENoZWNrcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIHN0YW5kYXJkIHZhbGlkYXRvcnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibkRpbXMiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDaGVja0RpbXMoIGludCBuRGltcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggbkRpbXMgPCAwIHx8IG5EaW1zID4gTUFYX05ESU1TICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCAibkRpbXMgPCAwIHx8IG5EaW1zID4gTUFYX05ESU1TIiApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUeXBlIGV4cGVjdGVkQ2xhc3M7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gbnVtYmVyIG9mIGRpbWVuc2lvbnMgaWYgdGhpcyBpcyBhbiBhcnJheQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgaW50IG5EaW1zOworCisgICAgICAgIHByb3RlY3RlZCBib29sIHN1YmNsYXNzT2s7CisKKyAgICAgICAgcHVibGljIGludCBHZXRORGltcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuRGltczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyOworCisgICAgICAgIHB1YmxpYyBUeXBlIEdldEV4cGVjdGVkQ2xhc3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRDbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBWYWxpZGF0ZSggb2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgVHlwZSBjbHNzID0gdmFsdWUuR2V0VHlwZSgpOworICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNsc3MgPT0gZXhwZWN0ZWRDbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgCisgICAgICAgICAgICByZXR1cm4gc3ViY2xhc3NPayAmJiBleHBlY3RlZENsYXNzLklzQXNzaWduYWJsZUZyb20oY2xzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFZhbGlkYXRlVmFsdWUob2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVmFsaWRhdGUodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidmFsdWUgbm90IGFwcHJvcHJpYXRlIGZvciAiICsgZGVzY3IgKyAiOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2NhbGFyQ2xhc3MiPmNsYXNzIHRvIHVzZSBpZiBuRGltcyA9PSAwPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcnJheUNsYXNzIj5jbGFzcyB0byB1c2UgaWYgbkRpbXMgPiAwPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+bnVtYmVyIG9mIGRpbWVuc2lvbnMsIDAgZm9yIHNjYWxhcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBhcHByb3ByaWF0ZSBjbGFzcyBnaXZlbiBuRGltcy48L3JldHVybnM+CisgICAgICAgIC8vLyAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHlwZSBNa0V4cGVjdGVkQ2xhc3MoIFR5cGUgc2NhbGFyQ2xhc3MsIFR5cGUgYXJyYXlDbGFzcywgaW50IG5EaW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBuRGltcyA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGFyQ2xhc3M7CisKKyAgICAgICAgICAgIEFycmF5IHRlbXBBcnJheSA9IEFycmF5LkNyZWF0ZUluc3RhbmNlKCBhcnJheUNsYXNzLCAxICk7CisgICAgICAgICAgICAvLyBOb3RlOiBBYm91dCBDIyBqYWdnZWQgYXJyYXlzCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8ICggbkRpbXMgLSAxICk7IGkrKyApCisgICAgICAgICAgICAgICAgdGVtcEFycmF5ID0gIEFycmF5LkNyZWF0ZUluc3RhbmNlKCB0ZW1wQXJyYXkuR2V0VHlwZSgpLCAxICk7CisKKyAgICAgICAgICAgIHJldHVybiB0ZW1wQXJyYXkuR2V0VHlwZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YjAxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw2NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRvciBmb3IgUnVudGltZSBFeGNlcHRpb25zCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24gOiBWYWxpZGF0b3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uIEdldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdmFsaWRhdG9yID09IG51bGwgKQorICAgICAgICAgICAgICAgIHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24gdmFsaWRhdG9yOworCisgICAgICAgIHB1YmxpYyBWYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJub3QgYW4gYXJyYXkiICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBWYWxpZGF0ZSggb2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICggdmFsdWUgaXMgRXhjZXB0aW9uICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFZhbGlkYXRlVmFsdWUob2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVmFsaWRhdGUodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidmFsdWUgbm90IGFwcHJvcHJpYXRlIGZvciBSdW50aW1lRXhjZXB0aW9uOiAiICsgdmFsdWUpOworICAgICAgICB9ICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3JfU3RydWN0VmFsdWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlZjRhMAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3JfU3RydWN0VmFsdWUuY3MKQEAgLTAsMCArMSw2MyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRvciBmb3Igc3RydWN0dmFsdWUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3JfU3RydWN0VmFsdWUgOiBUeXBlVmFsaWRhdG9yCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSBHZXQoWFR5cGUgdHlwZSwgaW50IG5EaW1zKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja0RpbXMobkRpbXMpOyAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yX1N0cnVjdFZhbHVlKHR5cGUsbkRpbXMpOworICAgICAgICB9CisKKyAgICAgICAKKworICAgICAgICBwcml2YXRlIFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZShYVHlwZSB0eXBlLCBpbnQgbkRpbXMpCisgICAgICAgICAgICA6IGJhc2UoIHR5cGVvZiggU3RydWN0VmFsdWUgKSwgdHlwZW9mKCBTdHJ1Y3RWYWx1ZSApLCBuRGltcywgc3RyaW5nLkZvcm1hdCgiU3RydWN0VmFsdWVbezB9LHsxfV0iLHR5cGUsbkRpbXMpICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgWFR5cGUgdHlwZTsKKworICAgICAgICBwdWJsaWMgWFR5cGUgR2V0WFR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXQodHlwZSwgbkRpbXMgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFZhbGlkYXRlKCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBiYXNlLlZhbGlkYXRlKHZhbHVlKSAmJgorICAgICAgICAgICAgICAgICh2YWx1ZS5HZXRUeXBlKCkgIT0gdHlwZW9mIChTdHJ1Y3RWYWx1ZSkgfHwgdHlwZS5Jc0Fzc2lnbmFibGVGcm9tKCgoU3RydWN0VmFsdWUpIHZhbHVlKS5HZXRYVHlwZSkpOworIAorICAgICAgICB9ICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX2Jvb2xlYW4uY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX2Jvb2xlYW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwYjU0MQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3JfYm9vbGVhbi5jcwpAQCAtMCwwICsxLDY4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVmFsaWRhdG9yIGZvciBCb29sZWFuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX2Jvb2xlYW4gOiBUeXBlVmFsaWRhdG9yCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+bnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9ib29sZWFuIEdldCggaW50IG5EaW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tEaW1zKCBuRGltcyApOworCisgICAgICAgICAgICBpZiAoIG5EaW1zID49IHZhbGlkYXRvcnMuTGVuZ3RoICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcl9ib29sZWFuKCBuRGltcyApOworCisgICAgICAgICAgICBWYWxpZGF0b3JfYm9vbGVhbiB2ID0gdmFsaWRhdG9yc1sgbkRpbXMgXTsKKworICAgICAgICAgICAgaWYgKCB2ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHYgPSB2YWxpZGF0b3JzWyBuRGltcyBdID0gbmV3IFZhbGlkYXRvcl9ib29sZWFuKCBuRGltcyApOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9ib29sZWFuW10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JfYm9vbGVhblsgTUFYX0NBQ0hFRCBdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIHZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3JfYm9vbGVhbiggaW50IG5EaW1zICkKKyAgICAgICAgICAgIDogYmFzZSggdHlwZW9mKCBib29sICksIHR5cGVvZiggYm9vbCApLCBuRGltcywgImJvb2xlYW5bIituRGltcysiXSIgKQorICAgICAgICB7IAorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVmFsaWRhdG9yIEVsZW1lbnRWYWxpZGF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0KCBuRGltcyAtIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9ieXRlLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9ieXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMmIzODYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX2J5dGUuY3MKQEAgLTAsMCArMSwxMDkgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWYWxpZGF0b3IgZm9yIGJ5dGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3JfYnl0ZSA6IFR5cGVWYWxpZGF0b3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj5udW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3Igc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9ieXRlIEdldCggaW50IG5EaW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tEaW1zKCBuRGltcyApOworCisgICAgICAgICAgICBpZiAoIG5EaW1zID49IHZhbGlkYXRvcnMuTGVuZ3RoICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcl9ieXRlKCBuRGltcyApOworCisgICAgICAgICAgICBWYWxpZGF0b3JfYnl0ZSB2ID0gdmFsaWRhdG9yc1sgbkRpbXMgXTsKKworICAgICAgICAgICAgaWYgKCB2ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHYgPSB2YWxpZGF0b3JzWyBuRGltcyBdID0gbmV3IFZhbGlkYXRvcl9ieXRlKCBuRGltcyApOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9ieXRlW10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JfYnl0ZVsgTUFYX0NBQ0hFRCBdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIHZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3JfYnl0ZSggaW50IG5EaW1zICkKKyAgICAgICAgICAgIDogYmFzZSggdHlwZW9mKCBzYnl0ZSApLCB0eXBlb2YoIHNieXRlICksIG5EaW1zLCAiYnl0ZVsiK25EaW1zKyJdIiApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXQoIG5EaW1zIC0gMSApOworICAgICAgICB9CisgICAgICAJICAgIAorCSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBWYWxpZGF0ZSggb2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgaWYgKG5EaW1zID4gMCkKKwkJCSAgIHJldHVybiBiYXNlLlZhbGlkYXRlKHZhbHVlKTsKKwkJCisJCSAgICBpZiAodmFsdWUgPT0gbnVsbCkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZS5HZXRUeXBlKCkgPT0gdHlwZW9mKHNieXRlKSkKKwkJCSAgICByZXR1cm4gdHJ1ZTsKKwkJCisJCSAgICBpZiAodmFsdWUuR2V0VHlwZSgpID09IHR5cGVvZihzaG9ydCkpCisJCSAgICB7CisJCQkgICAgc2hvcnQgdiA9IChzaG9ydCkgdmFsdWU7CisJCQkgICAgcmV0dXJuIHYgPj0gU0J5dGUuTWluVmFsdWUgJiYgdiA8PSBTQnl0ZS5NYXhWYWx1ZTsKKyAgICAgICAgICAgICAgIAorCQkgICAgfQorCQkKKwkJICAgaWYgKHZhbHVlLkdldFR5cGUoKSA9PSB0eXBlb2YoSW50MzIpKQorCQkgICAgeworCQkJICAgIGludCB2ID0gKEludDMyKSB2YWx1ZTsKKwkJCSAgICByZXR1cm4gdiA+PSBTQnl0ZS5NaW5WYWx1ZSAmJiB2IDw9IFNCeXRlLk1heFZhbHVlOworCQkgICAgfQorCQkKKwkJICAgaWYgKHZhbHVlLkdldFR5cGUoKSA9PSB0eXBlb2YobG9uZykpCisJCSAgIHsKKwkJCSAgICBsb25nIHYgPSAobG9uZykgdmFsdWU7CisJCQkgICAgcmV0dXJuIHYgPj0gU0J5dGUuTWluVmFsdWUgJiYgdiA8PSBTQnl0ZS5NYXhWYWx1ZTsKKwkJICAgIH0KKwkJCisJCSAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkJCisJICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgVmFsaWRhdGVWYWx1ZSggb2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgdmFsdWUgPSBiYXNlLlZhbGlkYXRlVmFsdWUodmFsdWUpOworCQkKKwkJICAgIGlmICgodmFsdWUuR2V0VHlwZSgpID09IHR5cGVvZihzYnl0ZSkpIHx8IG5EaW1zID4gMCkKKwkJCSAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvU0J5dGUodmFsdWUpOworCSAgICB9ICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9jdXN0b20uY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX2N1c3RvbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdhOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9jdXN0b20uY3MKQEAgLTAsMCArMSwxMjkgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRvciBmb3IgY3VzdG9tIHR5cGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3JfY3VzdG9tIDogVHlwZVZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbHNzIj5DbGFzcyBvZiB0aGUgY3VzdG9tIHR5cGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj5udW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3Igc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvciBHZXQoIFR5cGUgY2xzcywgaW50IG5EaW1zLCBib29sIHN1YmNsYXNzT2sgKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja0RpbXMoIG5EaW1zICk7CisKKyAgICAgICAgICAgIGlmICggbkRpbXMgPiBNQVhfQ0FDSEVEICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcl9jdXN0b20oIGNsc3MsIG5EaW1zLCBzdWJjbGFzc09rICk7CisKKyAgICAgICAgICAgIEtleSBrZXkgPSBuZXcgS2V5KGNsc3MsIG5EaW1zLCBzdWJjbGFzc09rKTsKKyAgICAgICAgICAgIFZhbGlkYXRvciB2ID0gbnVsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHYgPSB2YWxpZGF0b3JzW2tleV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdiA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdiA9IG5ldyBWYWxpZGF0b3JfY3VzdG9tKGNsc3MsIG5EaW1zLCBzdWJjbGFzc09rKTsKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLkFkZChrZXksIHYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdjsKKworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlICBjbGFzcyBLZXkKKwkgICAgeworCQkgICAgcHVibGljIEtleSggVHlwZSBjbHNzLCBpbnQgZGltcywgYm9vbCBzdWJjbGFzc09rICkKKwkJICAgIHsKKwkJCSAgICB0aGlzLmNsc3MgPSBjbHNzOworCQkJICAgIHRoaXMuZGltcyA9IGRpbXM7CisJCQkgICAgdGhpcy5zdWJjbGFzc09rID0gc3ViY2xhc3NPazsKKwkJICAgIH0KKwkJCisJCSAgICBwcml2YXRlIFR5cGUgY2xzczsKKwkJCisJCSAgICBwcml2YXRlIGludCBkaW1zOworCQkKKwkJICAgIHByaXZhdGUgYm9vbCBzdWJjbGFzc09rOworCQkKKwkJCisJCSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKwkJICAgIHsKKwkJCSAgICByZXR1cm4gY2xzcy5HZXRIYXNoQ29kZSgpIF4gKGRpbXMgKiA5MTMxKSBeIChzdWJjbGFzc09rID8gMjEzNTcgOiA4NTQ3KTsKKwkJICAgIH0KKwkJCisJCisJCSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMoIE9iamVjdCBvYmogKQorCQkgICAgeworCQkJICAgIGlmIChvYmogPT0gdGhpcykKKwkJCQkgICAgcmV0dXJuIHRydWU7CisJCQkKKwkJCSAgICBpZiAob2JqID09IG51bGwpCisJCQkJICAgIHJldHVybiBmYWxzZTsKKwkJCQorCQkJICAgIGlmIChvYmouR2V0VHlwZSgpICE9IEdldFR5cGUoKSkKKwkJCQkgICAgcmV0dXJuIGZhbHNlOworCQkJCisJCQkgICAgS2V5IG90aGVyID0gKEtleSkgb2JqOworCQkJCisJCQkgICAgcmV0dXJuIG90aGVyLmNsc3MuRXF1YWxzKCBjbHNzKQorCQkJCSAgICAmJiBvdGhlci5kaW1zID09IGRpbXMKKwkJCQkgICAgJiYgb3RoZXIuc3ViY2xhc3NPayA9PSBzdWJjbGFzc09rOworCQkgICAgfQorCSAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxLZXksIFZhbGlkYXRvcj4gdmFsaWRhdG9ycyA9IAorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8S2V5LCBWYWxpZGF0b3I+KCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgdmFsaWRhdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xzcyI+dGhlIGNsYXNzIG9mIHRoZSBjdXN0b20gdHlwZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibkRpbXMiPnRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3Igc2NhbGFyLiA8L3BhcmFtPgorICAgICAgICBwcml2YXRlIFZhbGlkYXRvcl9jdXN0b20oIFR5cGUgY2xzcywgaW50IG5EaW1zLCBib29sIHN1YmNsYXNzT2sgKQorICAgICAgICAgICAgOiBiYXNlKGNsc3MsIGNsc3MsIG5EaW1zLCBzdWJjbGFzc09rID8gY2xzcy5Ub1N0cmluZygpICsgIlsiICsgbkRpbXMgKyAiXSoiIDogY2xzcy5Ub1N0cmluZygpICsgIlsiICsgbkRpbXMgKyAiXSIsIHN1YmNsYXNzT2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2xzcyA9IGNsc3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFR5cGUgY2xzczsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVmFsaWRhdG9yIEVsZW1lbnRWYWxpZGF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0KCBjbHNzLCBuRGltcyAtIDEsIHN1YmNsYXNzT2sgKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3JfZG91YmxlLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9kb3VibGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2MzVlNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3JfZG91YmxlLmNzCkBAIC0wLDAgKzEsNjUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWYWxpZGF0b3IgZm9yIGRvdWJsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFZhbGlkYXRvcl9kb3VibGUgOiBUeXBlVmFsaWRhdG9yCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+PC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj5udW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3I8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yX2RvdWJsZSBHZXQoIGludCBuRGltcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrRGltcyggbkRpbXMgKTsKKworICAgICAgICAgICAgaWYgKCBuRGltcyA+PSB2YWxpZGF0b3JzLkxlbmd0aCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JfZG91YmxlKCBuRGltcyApOworCisgICAgICAgICAgICBWYWxpZGF0b3JfZG91YmxlIHYgPSB2YWxpZGF0b3JzWyBuRGltcyBdOworCisgICAgICAgICAgICBpZiAoIHYgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdiA9IHZhbGlkYXRvcnNbIG5EaW1zIF0gPSBuZXcgVmFsaWRhdG9yX2RvdWJsZSggbkRpbXMgKTsKKworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JfZG91YmxlW10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JfZG91YmxlWyBNQVhfQ0FDSEVEIF07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgdmFsaWRhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj48L3BhcmFtPgorICAgICAgICBwcml2YXRlIFZhbGlkYXRvcl9kb3VibGUoIGludCBuRGltcyApCisgICAgICAgICAgICA6IGJhc2UoIHR5cGVvZiggRG91YmxlICksIHR5cGVvZiggZG91YmxlICksIG5EaW1zLCAiZG91YmxlWyIrbkRpbXMrIl0iICkKKyAgICAgICAgeyAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXQoIG5EaW1zIC0gMSApOworICAgICAgICB9CisgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9mbG9hdC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3JfZmxvYXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3JfZmxvYXQuY3MKQEAgLTAsMCArMSw2MiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX2Zsb2F0IDogVHlwZVZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+bnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9mbG9hdCBHZXQoIGludCBuRGltcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrRGltcyggbkRpbXMgKTsKKworICAgICAgICAgICAgaWYgKCBuRGltcyA+PSB2YWxpZGF0b3JzLkxlbmd0aCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JfZmxvYXQoIG5EaW1zICk7CisKKyAgICAgICAgICAgIFZhbGlkYXRvcl9mbG9hdCB2ID0gdmFsaWRhdG9yc1sgbkRpbXMgXTsKKworICAgICAgICAgICAgaWYgKCB2ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHYgPSB2YWxpZGF0b3JzWyBuRGltcyBdID0gbmV3IFZhbGlkYXRvcl9mbG9hdCggbkRpbXMgKTsKKworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JfZmxvYXRbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvcl9mbG9hdFsgTUFYX0NBQ0hFRCBdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIHZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3JfZmxvYXQoIGludCBuRGltcyApCisgICAgICAgICAgICA6IGJhc2UoIHR5cGVvZiggZmxvYXQgKSwgdHlwZW9mKCBmbG9hdCApLCBuRGltcywgImZsb2F0WyIrbkRpbXMrIl0iICkKKyAgICAgICAgeyAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXQoIG5EaW1zIC0gMSApOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9pbnQuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX2ludC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjViMDVjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9pbnQuY3MKQEAgLTAsMCArMSw5OSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRvciBmb3IgaW50CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX2ludCA6IFR5cGVWYWxpZGF0b3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibkRpbXMiPm51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YW4gaW5zdGFuY2Ugb2YgdGhlIHZhbGlkYXRvcjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3JfaW50IEdldCggaW50IG5EaW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tEaW1zKCBuRGltcyApOworCisgICAgICAgICAgICBpZiAoIG5EaW1zID49IHZhbGlkYXRvcnMuTGVuZ3RoICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcl9pbnQoIG5EaW1zICk7CisKKyAgICAgICAgICAgIFZhbGlkYXRvcl9pbnQgdiA9IHZhbGlkYXRvcnNbIG5EaW1zIF07CisKKyAgICAgICAgICAgIGlmICggdiA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB2ID0gdmFsaWRhdG9yc1sgbkRpbXMgXSA9IG5ldyBWYWxpZGF0b3JfaW50KCBuRGltcyApOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9pbnRbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvcl9pbnRbIE1BWF9DQUNIRUQgXTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSB2YWxpZGF0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibkRpbXMiPjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgVmFsaWRhdG9yX2ludCggaW50IG5EaW1zICkKKyAgICAgICAgICAgIDogYmFzZSggdHlwZW9mKCBpbnQgKSwgdHlwZW9mKCBpbnQgKSwgbkRpbXMsICJpbnRbIituRGltcysiXSIgKQorICAgICAgICB7IAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFZhbGlkYXRvciBFbGVtZW50VmFsaWRhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldCggbkRpbXMgLSAxICk7CisgICAgICAgIH0KKworICAgICAgIAorCSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBWYWxpZGF0ZSggb2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgaWYgKG5EaW1zID4gMCkKKwkJCXJldHVybiBiYXNlLlZhbGlkYXRlKCB2YWx1ZSApOworCQkKKwkJICAgIGlmICh2YWx1ZSA9PSBudWxsKQorCQkJICAgIHJldHVybiBmYWxzZTsKKwkJCisJCSAgICBUeXBlIHR5cGUgPSB2YWx1ZS5HZXRUeXBlKCk7CisJCQorCQkgICAgaWYgKCB0eXBlID09IHR5cGVvZihJbnQzMikgfHwgdHlwZSA9PSB0eXBlb2YoSW50MTYpIHx8IHR5cGUgPT0gdHlwZW9mKHNieXRlKSApCisJCQkgICAgcmV0dXJuIHRydWU7CisJCQorCQkgICAgaWYgKHR5cGUgPT0gdHlwZW9mKGxvbmcpKQorCQkgICAgeworCQkJICAgIGxvbmcgdiA9IChsb25nKSB2YWx1ZTsKKwkJCSAgICByZXR1cm4gdiA+PSBJbnQzMi5NaW5WYWx1ZSAmJiB2IDw9IEludDMyLk1heFZhbHVlOworCQkgICAgfQorCQkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCQorCQorCSAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0ICBWYWxpZGF0ZVZhbHVlKCBvYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICB2YWx1ZSA9IGJhc2UuVmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCisJCSAgICBpZiAoIHZhbHVlLkdldFR5cGUoKSA9PSB0eXBlb2YoSW50MzIpIHx8IG5EaW1zID4gMCkKKwkJCSByZXR1cm4gdmFsdWU7CisJCQkgICAKKyAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvSW50MzIodmFsdWUpOworICAgIAl9CisgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9sb25nLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9sb25nLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDU2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX2xvbmcuY3MKQEAgLTAsMCArMSw5MiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRvciBmb3IgbG9uZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFZhbGlkYXRvcl9sb25nIDogVHlwZVZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+bnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9sb25nIEdldCggaW50IG5EaW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tEaW1zKCBuRGltcyApOworCisgICAgICAgICAgICBpZiAoIG5EaW1zID49IHZhbGlkYXRvcnMuTGVuZ3RoICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcl9sb25nKCBuRGltcyApOworCisgICAgICAgICAgICBWYWxpZGF0b3JfbG9uZyB2ID0gdmFsaWRhdG9yc1sgbkRpbXMgXTsKKworICAgICAgICAgICAgaWYgKCB2ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHYgPSB2YWxpZGF0b3JzWyBuRGltcyBdID0gbmV3IFZhbGlkYXRvcl9sb25nKCBuRGltcyApOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9sb25nW10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JfbG9uZ1sgTUFYX0NBQ0hFRCBdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIHZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3JfbG9uZyggaW50IG5EaW1zICkKKyAgICAgICAgICAgIDogYmFzZSggdHlwZW9mKCBsb25nICksIHR5cGVvZiggbG9uZyApLCBuRGltcywgImxvbmdbIituRGltcysiXSIgKQorICAgICAgICB7IAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFZhbGlkYXRvciBFbGVtZW50VmFsaWRhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldCggbkRpbXMgLSAxICk7CisgICAgICAgIH0KKworICAgICAgICAKKwkgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgVmFsaWRhdGUoIG9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIGlmIChuRGltcyA+IDApCisJCQkgICAgcmV0dXJuIGJhc2UuVmFsaWRhdGUoIHZhbHVlICk7CisJCQorCQkgICAgaWYgKHZhbHVlID09IG51bGwpCisJCQkgICAgcmV0dXJuIGZhbHNlOworCQkKKwkJICAgIFR5cGUgdHlwZSA9IHZhbHVlLkdldFR5cGUoKTsKKwkJCisJCSAgICByZXR1cm4gdHlwZSA9PSB0eXBlb2YobG9uZykgfHwgdHlwZSA9PSB0eXBlb2YoSW50MzIpIHx8CisJCQl0eXBlID09IHR5cGVvZihzaG9ydCkgfHwgdHlwZSA9PSB0eXBlb2Yoc2J5dGUpOworCSAgICB9CisJCisJICAgCisJICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgVmFsaWRhdGVWYWx1ZSggb2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgdmFsdWUgPSBiYXNlLlZhbGlkYXRlVmFsdWUoIHZhbHVlICk7CisJCQorCQkgICAgaWYgKHZhbHVlLkdldFR5cGUoKSA9PSB0eXBlb2YobG9uZykgfHwgbkRpbXMgPiAwKQorCQkJICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgcmV0dXJuIENvbnZlcnQuVG9JbnQ2NCh2YWx1ZSk7CisJICAgIH0KKworICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9vYmplY3QuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX29iamVjdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE5ZThkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9vYmplY3QuY3MKQEAgLTAsMCArMSw1NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX29iamVjdCA6IFR5cGVWYWxpZGF0b3IKKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yX29iamVjdFtdIHZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdG9yX29iamVjdFtNQVhfQ0FDSEVEXTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVmFsaWRhdG9yIEVsZW1lbnRWYWxpZGF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbkRpbXMgPiAwID8gR2V0KG5EaW1zIC0gMSkgOiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3Jfb2JqZWN0KGludCBuRGltcykKKyAgICAgICAgICAgIDogYmFzZSh0eXBlb2YgKG9iamVjdCksIHR5cGVvZiAob2JqZWN0KSwgbkRpbXMsIHN0cmluZy5Gb3JtYXQoIm9iamVjdFt7MH1dIiwgbkRpbXMpLCB0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yX29iamVjdCBHZXQoIGludCBuRGltcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrRGltcyhuRGltcyk7CisKKyAgICAgICAgICAgIGlmIChuRGltcyA+PSB2YWxpZGF0b3JzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcl9vYmplY3QobkRpbXMpOworCisgICAgICAgICAgICBWYWxpZGF0b3Jfb2JqZWN0IHYgPSB2YWxpZGF0b3JzW25EaW1zXTsKKworICAgICAgICAgICAgaWYgKCB2ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHY9dmFsaWRhdG9yc1tuRGltc109IG5ldyBWYWxpZGF0b3Jfb2JqZWN0KG5EaW1zKTsKKworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0gICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvVmFsaWRhdG9yX3Nob3J0LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9zaG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWYwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9zaG9ydC5jcwpAQCAtMCwwICsxLDEwNiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRvciBmb3Igc2hvcnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3Jfc2hvcnQgOiBUeXBlVmFsaWRhdG9yCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+PC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj5udW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3I8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yX3Nob3J0IEdldCggaW50IG5EaW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tEaW1zKCBuRGltcyApOworCisgICAgICAgICAgICBpZiAoIG5EaW1zID49IHZhbGlkYXRvcnMuTGVuZ3RoICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcl9zaG9ydCggbkRpbXMgKTsKKworICAgICAgICAgICAgVmFsaWRhdG9yX3Nob3J0IHYgPSB2YWxpZGF0b3JzWyBuRGltcyBdOworCisgICAgICAgICAgICBpZiAoIHYgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdiA9IHZhbGlkYXRvcnNbIG5EaW1zIF0gPSBuZXcgVmFsaWRhdG9yX3Nob3J0KCBuRGltcyApOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9zaG9ydFtdIHZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdG9yX3Nob3J0WyBNQVhfQ0FDSEVEIF07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgdmFsaWRhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5EaW1zIj48L3BhcmFtPgorICAgICAgICBwcml2YXRlIFZhbGlkYXRvcl9zaG9ydCggaW50IG5EaW1zICkKKyAgICAgICAgICAgIDogYmFzZSggdHlwZW9mKCBzaG9ydCApLCB0eXBlb2YoIHNob3J0ICksIG5EaW1zLCAic2hvcnRbIituRGltcysiXSIgKQorICAgICAgICB7IAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFZhbGlkYXRvciBFbGVtZW50VmFsaWRhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldCggbkRpbXMgLSAxICk7CisgICAgICAgIH0KKworICAgICAgIAorCSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBWYWxpZGF0ZSggb2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgaWYgKG5EaW1zID4gMCkKKwkJCSAgICByZXR1cm4gYmFzZS5WYWxpZGF0ZSggdmFsdWUgKTsKKyAgICAJCQorCQkgICAgaWYgKHZhbHVlID09IG51bGwpCisJCQkgICAgcmV0dXJuIGZhbHNlOworICAgIAkJCisJCSAgICBUeXBlIHR5cGUgPSB2YWx1ZS5HZXRUeXBlKCk7CisgICAgCQkKKwkJICAgIGlmICggdHlwZSA9PSB0eXBlb2Yoc2hvcnQpIHx8IHR5cGUgPT0gdHlwZW9mKHNieXRlKSkKKwkJCSAgICByZXR1cm4gdHJ1ZTsKKyAgICAJCQorCQkgICAgaWYgKHR5cGUgPT0gdHlwZW9mKEludDMyKSkKKwkJICAgIHsKKwkJCSAgICBpbnQgdiA9IChJbnQzMikgdmFsdWU7CisJCQkgICAgcmV0dXJuIHYgPj0gc2hvcnQuTWluVmFsdWUmJiB2IDw9IHNob3J0Lk1heFZhbHVlOworCQkgICAgfQorICAgIAkJCisJCSAgICBpZiAodHlwZSA9PSB0eXBlb2YobG9uZykpCisJCSAgICB7CisJCQkgICAgbG9uZyB2ID0gKGxvbmcpIHZhbHVlOworCQkJICAgIHJldHVybiB2ID49IHNob3J0Lk1pblZhbHVlICYmIHYgPD0gc2hvcnQuTWF4VmFsdWU7CisJCSAgICB9CisgICAgCQkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCQorCQorCSAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFZhbGlkYXRlVmFsdWUoIG9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIHZhbHVlID0gYmFzZS5WYWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworICAgIAkJCisJCSAgICBpZiAodmFsdWUuR2V0VHlwZSgpID09IHR5cGVvZihzaG9ydCkgfHwgbkRpbXMgPiAwKQorCQkJICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgcmV0dXJuIENvbnZlcnQuVG9JbnQxNih2YWx1ZSk7CisJICAgIH0KKworICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3Jfc3RyaW5nLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl9zdHJpbmcuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkYWRjMwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3Jfc3RyaW5nLmNzCkBAIC0wLDAgKzEsNjUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWYWxpZGF0b3IgZm9yIHN0cmluZ3MKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3Jfc3RyaW5nIDogVHlwZVZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+bnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9zdHJpbmcgR2V0KCBpbnQgbkRpbXMgKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja0RpbXMoIG5EaW1zICk7CisKKyAgICAgICAgICAgIGlmICggbkRpbXMgPj0gdmFsaWRhdG9ycy5MZW5ndGggKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yX3N0cmluZyggbkRpbXMgKTsKKworICAgICAgICAgICAgVmFsaWRhdG9yX3N0cmluZyB2ID0gdmFsaWRhdG9yc1sgbkRpbXMgXTsKKworICAgICAgICAgICAgaWYgKCB2ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHYgPSB2YWxpZGF0b3JzWyBuRGltcyBdID0gbmV3IFZhbGlkYXRvcl9zdHJpbmcoIG5EaW1zICk7CisKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yX3N0cmluZ1tdIHZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdG9yX3N0cmluZ1sgTUFYX0NBQ0hFRCBdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIHZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3Jfc3RyaW5nKCBpbnQgbkRpbXMgKQorICAgICAgICAgICAgOiBiYXNlKCB0eXBlb2YoIHN0cmluZyApLCB0eXBlb2YoIHN0cmluZyApLCBuRGltcywgInN0cmluZ1siK25EaW1zKyJdIiApCisgICAgICAgIHsgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVmFsaWRhdG9yIEVsZW1lbnRWYWxpZGF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0KCBuRGltcyAtIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3Jfdm9pZC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9WYWxpZGF0b3Jfdm9pZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM0NjgyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L1ZhbGlkYXRvcl92b2lkLmNzCkBAIC0wLDAgKzEsNjkgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWYWxpZGF0b3IgZm9yIHZvaWQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3Jfdm9pZCA6IFZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuRGltcyI+dGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBzY2FsYXI8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YW4gaW5zdGFuY2Ugb2YgdGhlIHZhbGlkYXRvcjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3Jfdm9pZCBHZXQoIGludCBuRGltcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggbkRpbXMgIT0gMCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAibkRpbXMgIT0gMCIgKTsKKworICAgICAgICAgICAgaWYgKCB2YWxpZGF0b3IgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcl92b2lkKCk7CisKKyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3I7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3Jfdm9pZCB2YWxpZGF0b3I7CisKKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3Jfdm9pZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgVmFsaWRhdGUoIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBWYWxpZGF0ZVZhbHVlKG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFZhbGlkYXRlKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInZhbHVlIG5vdCBhcHByb3ByaWF0ZSBmb3Igdm9pZDogIiArIHZhbHVlKTsKKyAgICAgICAgfSAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9fRXRjaF9BdXRoRXhjZXB0aW9uLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9TdXBwb3J0L19FdGNoX0F1dGhFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwOTQxOQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9fRXRjaF9BdXRoRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMzUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBfRXRjaF9BdXRoRXhjZXB0aW9uIDogX0V0Y2hfUnVudGltZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIF9FdGNoX0F1dGhFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkb250IGluaXRpYWxpemUgYW55dGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBfRXRjaF9BdXRoRXhjZXB0aW9uKCBTdHJpbmcgbXNnICkgOiBiYXNlKCBtc2cgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvX0V0Y2hfUnVudGltZUV4Y2VwdGlvbi5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvU3VwcG9ydC9fRXRjaF9SdW50aW1lRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOGEwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1N1cHBvcnQvX0V0Y2hfUnVudGltZUV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDc0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ29uc3RydWN0cyB0aGUgRXRjaFJ1bnRpbWVFeGNlcHRpb24uIERvbid0IGluaXQgYW55dGhpbmcuCisgICAgLy8vIAorICAgIC8vLyBTb21lIGNvbW1vbiBydW50aW1lIGV4Y2VwdGlvbnMgYXJlOgorICAgIC8vLyAKKyAgICAvLy8gQXJndW1lbnRFeGNlcHRpb24KKyAgICAvLy8gQXJndW1lbnROdWxsRXhjZXB0aW9uCisgICAgLy8vIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbgorICAgIC8vLyBBcml0aG1ldGljRXhjZXB0aW9uCisgICAgLy8vIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbgorICAgIC8vLyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24KKyAgICAvLy8gSW52YWxpZENhc3RFeGNlcHRpb24KKyAgICAvLy8gTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAvLy8gTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgICAgLy8vIE51bGxSZWZlcmVuY2VFeGNlcHRpb24KKyAgICAvLy8gT3ZlcmZsb3dFeGNlcHRpb24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBfRXRjaF9SdW50aW1lRXhjZXB0aW9uCisgICAgICAgIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBFdGNoUnVudGltZUV4Y2VwdGlvbi4gRG9uJ3QgaW5pdCBhbnl0aGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIF9FdGNoX1J1bnRpbWVFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkb24ndCBpbml0IGFueXRoaW5nLgorICAgICAgICB9CisKKyAgICAgICAvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgRXRjaFJ1bnRpbWVFeGNlcHRpb248L3N1bW1hcnk+CisgICAgICAgLy8vIDxwYXJhbSBuYW1lID0gIm1zZyI+bXNnIGRlc2NyaXB0aW9uIG9mIHRoZSBleGNlcHRpb24gdGhhdCB3YXMgY2F1Z2h0IGJ5IHRoZSBzdHViIG9uIHRoZSByZW1vdGUgc2lkZS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgX0V0Y2hfUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1zZyA9IG1zZzsKKyAgICAgICAgfQorCisgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgR2V0TWVzc2FnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+RGVzY3JpcHRpb24gb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQgYnkgdGhlIHN0dWIgb24gdGhlIHJlbW90ZSBzaWRlLiA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbXNnOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIlJlbW90ZSBzaWRlIHRocmV3IHRoaXMgcnVudGltZSBleGNlcHRpb246ICIgKyBHZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvQXJyYXlWYWx1ZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0FycmF5VmFsdWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhYThiMwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0FycmF5VmFsdWUuY3MKQEAgLTAsMCArMSwxODggQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCisvLy8gPHN1bW1hcnk+QW4gYXJyYXkgb2YgdmFsdWVzLCB3aGVyZSBlYWNoIHZhbHVlIGlzIG9mIGFyYml0cmFyeSB0eXBlCisvLy8gY2hvc2VuIGZyb20gdGhlIGJhc2ljIGphdmEgdHlwZXMgYm9vbGVhbiwgYnl0ZSwgc2hvcnQsIGludCwKKy8vLyBsb25nLCBmbG9hdCwgZG91YmxlLCBTdHJpbmcsIGFuIGFycmF5IG9mIHRob3NlLCB0aGUgZXh0ZW5kZWQKKy8vLyB0eXBlcyBBcnJheVZhbHVlIGFuZCBTdHJ1Y3RWYWx1ZSwgYW5kIHNwZWNpZmljIHR5cGVzIHN1cHBvcnRlZAorLy8vIGJ5IFZhbHVlRmFjdG9yeS4gCisvLy8gCisvLy8gQXJyYXlWYWx1ZSBpcyBub3QgcHJvdGVjdGVkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MuIDwvc3VtbWFyeT4KKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisKKyAgICBwdWJsaWMgY2xhc3MgQXJyYXlWYWx1ZSA6IElFbnVtZXJhYmxlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgQXJyYXlWYWx1ZS48L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBBcnJheVZhbHVlKCBPYmplY3QgYXJyYXksIHNieXRlIHR5cGVjb2RlLCBYVHlwZSBjdXN0b21TdHJ1Y3RUeXBlLCBpbnQgZGltICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhcnJheSA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiggImFycmF5ID09IG51bGwiICk7CisKKyAgICAgICAgICAgIGlmICggISggKCBhcnJheS5HZXRUeXBlKCkgKS5Jc0FycmF5ICkgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbiggIm9iamVjdCBpcyBub3Qgb2YgdHlwZSBhcnJheSIgKTsKKworICAgICAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OworICAgICAgICAgICAgdGhpcy50eXBlY29kZSA9IHR5cGVjb2RlOworCQkgICAgdGhpcy5DdXN0b21TdHJ1Y3RUeXBlID0gY3VzdG9tU3RydWN0VHlwZTsKKwkJICAgIHRoaXMuRGltID0gZGltOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgYXJyYXl2YWx1ZSB3aXRob3V0IGFueSB0eXBlIGluZm9ybWF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBBcnJheVZhbHVlKCBPYmplY3QgYXJyYXkgKSA6IHRoaXMoIGFycmF5LCAoIHNieXRlICkgMCwgbnVsbCwgMCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgT2JqZWN0IGFycmF5OworICAgICAgICBwcml2YXRlIHNieXRlIHR5cGVjb2RlOworICAgICAgICBwcml2YXRlIFhUeXBlIGN1c3RvbVN0cnVjdFR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IGRpbTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBUeXBlQ29kZSBmb3IgdGhpcyBhcnJheSB2YWx1ZS4KKyAgICAgICAgLy8vIEZvciBleGFtcGxlLCBpZiB0aGUgYXJyYXkgaXMgaW50W11bXSwgdGhlbgorICAgICAgICAvLy8gdGhlIHR5cGUgd291bGQgYmUgVHlwZUNvZGUuSU5UNC4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHNieXRlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZWNvZGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgc3RydWN0IHR5cGUgaWYgYSBjdXN0b20gdHlwZSBjb2RlLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFhUeXBlIEN1c3RvbVN0cnVjdFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbVN0cnVjdFR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1c3RvbVN0cnVjdFR5cGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGRpbXNpb25hbGl0eSBvZiB0aGUgYXJyYXkuCisgICAgICAgIC8vLyBGb3IgZXhhbXBsZSwgaWYgdGhlIGFycmF5IGlzIGludFtdW10sIHRoZQorICAgICAgICAvLy8gZGltZW5zaW9uYWxpdHkgd291bGQgYmUgMi48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgRGltCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkaW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpbSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICggKCBBcnJheSApIGFycmF5ICkuTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgT2JqZWN0IEdldCggaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICggKCBBcnJheSApIGFycmF5ICkuR2V0VmFsdWUoIGluZGV4ICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFsbG9jYXRlcyB0aGUgYXJyYXkgc28gdGhhdCBpdCBpcyBvbmx5IGFzIGxvbmcgYXMgbmVlZGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBDb21wYWN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhZGRJbmRleCA9PSBTaXplKCkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgT2JqZWN0IG5hcnJheSA9IEFycmF5LkNyZWF0ZUluc3RhbmNlKCBhcnJheS5HZXRUeXBlKCkuR2V0RWxlbWVudFR5cGUoKSwgYWRkSW5kZXggKTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoIChBcnJheSlhcnJheSwgKEFycmF5KW5hcnJheSwgYWRkSW5kZXggKTsKKyAgICAgICAgICAgIGFycmF5ID0gbmFycmF5OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyB0aGUgdmFsdWUgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXksIG1ha2luZyBtb3JlIHNwYWNlCisgICAgICAgIC8vLyBpZiBuZWVkZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkKCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IFNpemUoKTsKKworICAgICAgICAgICAgaWYgKCBhZGRJbmRleCA+PSBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIG4gPT0gMCApCisgICAgICAgICAgICAgICAgICAgIG4gPSA4OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbiAqPSAyOworCisgICAgICAgICAgICAgICAgT2JqZWN0IG5hcnJheSA9IEFycmF5LkNyZWF0ZUluc3RhbmNlKCBhcnJheS5HZXRUeXBlKCkuR2V0RWxlbWVudFR5cGUoKSwgbiApOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoIChBcnJheSlhcnJheSwgKEFycmF5KW5hcnJheSwgKCAoIEFycmF5ICkgYXJyYXkgKS5MZW5ndGggKTsKKyAgICAgICAgICAgICAgICBhcnJheSA9IG5hcnJheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICggKCBBcnJheSApIGFycmF5ICkuU2V0VmFsdWUoIHZhbHVlLCBhZGRJbmRleCsrICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBhZGRJbmRleDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBhcnJheTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIE9iamVjdCBHZXRBcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhcnJheTsKKyAgICAgICAgfQorCisKKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCAoIEFycmF5ICkgYXJyYXkgKS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0RlZmF1bHREZWxpdmVyeVNlcnZpY2UuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9EZWZhdWx0RGVsaXZlcnlTZXJ2aWNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDBjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9EZWZhdWx0RGVsaXZlcnlTZXJ2aWNlLmNzCkBAIC0wLDAgKzEsMjQ5IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIERlZmF1bHREZWxpdmVyeVNlcnZpY2UgOiBEZWxpdmVyeVNlcnZpY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlKE1haWxib3hNYW5hZ2VyIHRyYW5zcG9ydCwgc3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgICAgIDogdGhpcyh0cmFuc3BvcnQsIG5ldyBVUkwodXJpKSwgcmVzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlKE1haWxib3hNYW5hZ2VyIHRyYW5zcG9ydCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICAgICAgICB0cmFuc3BvcnQuU2V0U2Vzc2lvbih0aGlzKTsKKyAgICAgICAgICAgIGRpc2FibGVUaW1lb3V0ID0gdXJpLkdldEJvb2xlYW5UZXJtKERJU0FCTEVfVElNRU9VVCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBhcmFtZXRlciB0byBHbG9iYWxseSBEaXNhYmxlIFRpbWVvdXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIAorICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIERJU0FCTEVfVElNRU9VVCA9ICJEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlLmRpc2FibGVUaW1lb3V0IjsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBwcml2YXRlIGJvb2wgZGlzYWJsZVRpbWVvdXQgPSBmYWxzZTsKKworCisgICAgICAgIHByaXZhdGUgU2Vzc2lvbk1lc3NhZ2UgX3N0dWI7CisKKyAgICAgICAgcHJpdmF0ZSBNYWlsYm94TWFuYWdlciB0cmFuc3BvcnQ7CisKKyAgICAgICAgCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyBhbGwgdGhlIHN0dWJzIGluIHRoZSBzZXQgb2Ygc3R1YnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlU3R1YigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdHViID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgU2Vzc2lvblF1ZXJ5KG9iamVjdCBxdWVyeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHViICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHViLlNlc3Npb25RdWVyeShxdWVyeSk7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oInVua25vd24gcXVlcnk6ICIgKyBxdWVyeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uQ29udHJvbChPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3N0dWIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfc3R1Yi5TZXNzaW9uQ29udHJvbChjb250cm9sLCB2YWx1ZSk7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oInVua25vd24gY29udHJvbDogIiArIGNvbnRyb2wpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeShPYmplY3QgZXZlbnRPYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChldmVudE9iaiBpcyBzdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHN0cmluZ09iaiA9IChzdHJpbmcpIGV2ZW50T2JqOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdPYmogPT0gU2Vzc2lvbkNvbnN0cy5VUCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5TZXQoU2Vzc2lvbkNvbnN0cy5VUCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmluZ09iaiA9PSBTZXNzaW9uQ29uc3RzLkRPV04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMuU2V0KFNlc3Npb25Db25zdHMuRE9XTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBfc3R1Yi5TZXNzaW9uTm90aWZ5KGV2ZW50T2JqKTsKKyAgICAgICAgICAgICAgICAKKyAgCisgICAgICAgICAgICAKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNb25pdG9yPHN0cmluZz4gc3RhdHVzID0gbmV3IE1vbml0b3I8c3RyaW5nPigic2Vzc2lvbiBzdGF0dXMiKTsKKworICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IFRyYW5zcG9ydFF1ZXJ5KE9iamVjdCBxdWVyeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocXVlcnkuR2V0VHlwZSgpID09IHR5cGVvZihUcmFuc3BvcnRDb25zdHMuV2FpdFVwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3YWl0VXAoKChUcmFuc3BvcnRDb25zdHMuV2FpdFVwKSBxdWVyeSkuX21heERlbGF5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXJ5LkdldFR5cGUoKSA9PSB0eXBlb2YoVHJhbnNwb3J0Q29uc3RzLldhaXREb3duKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3YWl0RG93bigoKFRyYW5zcG9ydENvbnN0cy5XYWl0RG93bilxdWVyeSkuX21heERlbGF5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LlRyYW5zcG9ydFF1ZXJ5KHF1ZXJ5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdhaXRVcChpbnQgbWF4RGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cy5XYWl0VW50aWxFcShTZXNzaW9uQ29uc3RzLlVQLG1heERlbGF5KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB3YWl0RG93bihpbnQgbWF4RGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cy5XYWl0VW50aWxFcShTZXNzaW9uQ29uc3RzLkRPV04sIG1heERlbGF5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydENvbnRyb2woT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbnRyb2wgaXMgc3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBzdHJpbmdPYmogPSAoc3RyaW5nKSBjb250cm9sOworCisgICAgICAgICAgICAgICAgaWYgKHN0cmluZ09iaiA9PSBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuVHJhbnNwb3J0Q29udHJvbChUcmFuc3BvcnRDb25zdHMuU1RBUlQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB3YWl0VXAoKGludCkgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJpbmdPYmogPT0gVHJhbnNwb3J0Q29uc3RzLlNUT1BfQU5EX1dBSVRfRE9XTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QLG51bGwpOworICAgICAgICAgICAgICAgICAgICB3YWl0RG93bigoaW50KXZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydENvbnRyb2woY29udHJvbCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydENvbnRyb2woY29udHJvbCwgdmFsdWUpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkoT2JqZWN0IGV2ZW50T2JqKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuVHJhbnNwb3J0Tm90aWZ5KGV2ZW50T2JqKTsKKyAgICAgICAgfQorCisgICAgICAgCisKKyAgICAgICAgcHVibGljIE1haWxib3ggQmVnaW5DYWxsKE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LlRyYW5zcG9ydENhbGwobnVsbCwgbXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgRW5kQ2FsbChNYWlsYm94IG1iLCBYVHlwZSByZXNwb25zZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0aW1lb3V0ID0gZGlzYWJsZVRpbWVvdXQgPyAwIDogcmVzcG9uc2VUeXBlLlRpbWVvdXQ7CisgICAgICAgICAgICAgICAgRWxlbWVudCBtYmUgPSBtYi5SZWFkKHRpbWVvdXQpOworICAgICAgICAgICAgICAgIGlmIChtYmUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oInRpbWVvdXQgd2FpdGluZyBmb3IgIiArIHJlc3BvbnNlVHlwZSk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBybXNnID0gbWJlLm1zZzsKKyAgICAgICAgICAgICAgICBybXNnLkNoZWNrVHlwZShyZXNwb25zZVR5cGUpOworICAgICAgICAgICAgICAgIE9iamVjdCByID0gcm1zZy5HZXQocmVzcG9uc2VUeXBlLlJlc3BvbnNlRmllbGQpOworICAgICAgICAgICAgICAgIGlmIChyIGlzIEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbilyOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYi5DbG9zZVJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIAorCisgICAgIAorICAgICAgICAjcmVnaW9uIFNlc3Npb25NZXNzYWdlIE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgYm9vbCBTZXNzaW9uTWVzc2FnZShXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICByZXR1cm4gIF9zdHViLlNlc3Npb25NZXNzYWdlKHNlbmRlciwgbXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYSBzdHViIHRvIGEgbGlzdCBvZiBzdHViCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RiIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25NZXNzYWdlIHN0YikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHViICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgLS0gb25seSBvbmUgc3R1YiBmb3Igbm93Iik7CisgICAgICAgICAgICBfc3R1YiA9IHN0YjsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydE1lc3NhZ2UgTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE1lc3NhZ2UoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnRNZXNzYWdlKHJlY2lwaWVudCxtc2cpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25NZXNzYWdlPiBNZW1iZXJzCisKKworICAgICAgICBwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgR2V0U2Vzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc3R1YjsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GaWx0ZXIvQWJzdHJhY3RNZXNzYWdlRmlsdGVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRmlsdGVyL0Fic3RyYWN0TWVzc2FnZUZpbHRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzJjNjJjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRmlsdGVyL0Fic3RyYWN0TWVzc2FnZUZpbHRlci5jcwpAQCAtMCwwICsxLDEzMSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydC5GaWx0ZXIKK3sKKyAgICBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RNZXNzYWdlRmlsdGVyIDogVHJhbnNwb3J0TWVzc2FnZSwgU2Vzc2lvbk1lc3NhZ2UKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdE1lc3NhZ2VGaWx0ZXIoVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICAgICAgdHJhbnNwb3J0LlNldFNlc3Npb24odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPdXIgdHJhbnNwb3J0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyBhIHN0cmluZyBzdWNoIGFzICJGaWx0ZXIvIit0cmFuc3BvcnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIHN0cmluZyBzdWNoIGFzICJGaWx0ZXIvIit0cmFuc3BvcnQuPC9yZXR1cm5zPgorICAgICAgICBhYnN0cmFjdCBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCk7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFuc3BvcnRNZXNzYWdlKFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZShyZWNpcGllbnQsIG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgR2V0U2Vzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0U2Vzc2lvbihTZXNzaW9uTWVzc2FnZSBzZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gT3VyIHNlc3Npb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBTZXNzaW9uTWVzc2FnZSBzZXNzaW9uOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBUcmFuc3BvcnRRdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuVHJhbnNwb3J0UXVlcnkocXVlcnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFuc3BvcnRDb250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnRDb250cm9sKGNvbnRyb2wsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeShvYmplY3QgZXZudCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydE5vdGlmeShldm50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgU2Vzc2lvbk1lc3NhZ2UoV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLlNlc3Npb25NZXNzYWdlKHNlbmRlciwgbXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgU2Vzc2lvblF1ZXJ5KG9iamVjdCBxdWVyeSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24uU2Vzc2lvblF1ZXJ5KHF1ZXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Db250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlc3Npb24uU2Vzc2lvbkNvbnRyb2woY29udHJvbCwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeShvYmplY3QgZXZudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGV2bnQgPT0gKG9iamVjdCkgU2Vzc2lvbkNvbnN0cy5VUCkKKyAgICAgICAgICAgICAgICBpZiAoIVNlc3Npb25VcCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChldm50ID09IChvYmplY3QpIFNlc3Npb25Db25zdHMuRE9XTikKKyAgICAgICAgICAgICAgICBpZiAoIVNlc3Npb25Eb3duKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTm90aWZ5KGV2bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlbGxzIHRoZSBmaWx0ZXIgdGhhdCB0aGUgc2Vzc2lvbiBpcyB1cC4KKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIG91ciBzZXNzaW9uLCBmYWxzZQorICAgICAgICAgKiBpZiBpdCBzaG91bGQgYmUgc3dhbGxvd2VkLgorICAgICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGJvb2wgU2Vzc2lvblVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlbGxzIHRoZSBmaWx0ZXIgdGhhdCB0aGUgc2Vzc2lvbiBpcyBkb3duLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHNob3VsZCBiZSBwYXNzZWQgb24gdG8gb3VyIHNlc3Npb24sIGZhbHNlCisgICAgICAgICAqIGlmIGl0IHNob3VsZCBiZSBzd2FsbG93ZWQuCisgICAgICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgYm9vbCBTZXNzaW9uRG93bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZpbHRlci9LZWVwQWxpdmUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GaWx0ZXIvS2VlcEFsaXZlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjYxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GaWx0ZXIvS2VlcEFsaXZlLmNzCkBAIC0wLDAgKzEsMzA4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0LkZpbHRlcgoreworICAgIHB1YmxpYyBjbGFzcyBLZWVwQWxpdmUgOiBBYnN0cmFjdE1lc3NhZ2VGaWx0ZXIsIEFsYXJtTGlzdGVuZXIKKyAgICB7CisKKworICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIERFTEFZID0gIktlZXBBbGl2ZS5kZWxheSI7CisKKworICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIENPVU5UID0gIktlZXBBbGl2ZS5jb3VudCI7CisKKyAgICAgICAgcHVibGljIEtlZXBBbGl2ZShUcmFuc3BvcnRNZXNzYWdlIHRyYW5zcG9ydCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgICAgIDogYmFzZSh0cmFuc3BvcnQsIHVyaSwgcmVzb3VyY2VzKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGRlbGF5ID0gdXJpLkdldEludGVnZXJUZXJtKERFTEFZLCAxNSk7CisgICAgICAgICAgICBpZiAoZGVsYXkgPD0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oImRlbGF5IDw9IDAiKTsKKworICAgICAgICAgICAgY291bnQgPSB1cmkuR2V0SW50ZWdlclRlcm0oQ09VTlQsIDQpOworICAgICAgICAgICAgaWYgKGNvdW50IDw9IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VudCA8PSAwIik7CisKKyAgICAgICAgICAgIHNlcnZlciA9IChCb29sZWFuKSB0cmFuc3BvcnQuVHJhbnNwb3J0UXVlcnkoVHJhbnNwb3J0Q29uc3RzLklTX1NFUlZFUik7CisKKyAgICAgICAgICAgIC8vCQlMb2cucmVwb3J0KCAiS2VlcEFsaXZlSW5zdGFsbGVkIiwKKyAgICAgICAgICAgIC8vCQkJImRlbGF5IiwgZGVsYXksICJjb3VudCIsIGNvdW50LCAic2VydmVyIiwgc2VydmVyICk7CisKKyAgICAgICAgICAgIHZmID0gKFZhbHVlRmFjdG9yeSlyZXNvdXJjZXMuR2V0KFRyYW5zcG9ydENvbnN0cy5WQUxVRV9GQUNUT1JZKTsKKworICAgICAgICAgICAgbWZfZGVsYXkgPSBuZXcgRmllbGQoImRlbGF5Iik7CisgICAgICAgICAgICBtZl9jb3VudCA9IG5ldyBGaWVsZCgiY291bnQiKTsKKworICAgICAgICAgICAgbXRfcmVxdWVzdCA9IG5ldyBYVHlwZSgiX0V0Y2hfS2VlcEFsaXZlUmVxIik7CisgICAgICAgICAgICBtdF9yZXF1ZXN0LlB1dFZhbGlkYXRvcihtZl9kZWxheSwgVmFsaWRhdG9yX2ludC5HZXQoMCkpOworICAgICAgICAgICAgbXRfcmVxdWVzdC5QdXRWYWxpZGF0b3IobWZfY291bnQsIFZhbGlkYXRvcl9pbnQuR2V0KDApKTsKKyAgICAgICAgICAgIHZmLkFkZFR5cGUobXRfcmVxdWVzdCk7CisKKyAgICAgICAgICAgIG10X3Jlc3BvbnNlID0gbmV3IFhUeXBlKCJfRXRjaF9LZWVwQWxpdmVSZXNwIik7CisgICAgICAgICAgICB2Zi5BZGRUeXBlKG10X3Jlc3BvbnNlKTsKKworICAgICAgICAgICAgbXRfcmVxdWVzdC5TZXRSZXN1bHQobXRfcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZGVsYXk7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIHNlcnZlcjsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFZhbHVlRmFjdG9yeSB2ZjsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkIG1mX2RlbGF5OworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgbWZfY291bnQ7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYVHlwZSBtdF9yZXF1ZXN0OworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgbXRfcmVzcG9uc2U7CisKKyAgICAgICAgcHVibGljIGludCBHZXREZWxheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxheTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgR2V0Q291bnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKworICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbCBHZXRTZXJ2ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2VydmVyOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBTZXNzaW9uTWVzc2FnZShXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1zZy5Jc1R5cGUobXRfcmVxdWVzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtc2cpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXNnLklzVHlwZShtdF9yZXNwb25zZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJhc2UuU2Vzc2lvbk1lc3NhZ2Uoc2VuZGVyLCBtc2cpOworICAgICAgICB9CisKKworCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFNlc3Npb25VcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vCQlMb2cucmVwb3J0KCAiS2VlcEFsaXZlU2Vzc2lvblVwIiwgInNlcnZlciIsIHNlcnZlciApOworICAgICAgICAgICAgdXAgPSB0cnVlOworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyLnN0YXRpY0FkZCh0aGlzLCBudWxsLCBkZWxheSAqIDEwMDApOworICAgICAgICAgICAgdGlja2xlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFNlc3Npb25Eb3duKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8JCUxvZy5yZXBvcnQoICJLZWVwQWxpdmVTZXNzaW9uRG93biIsICJzZXJ2ZXIiLCBzZXJ2ZXIgKTsKKyAgICAgICAgICAgIHVwID0gZmFsc2U7CisgICAgICAgICAgICBBbGFybU1hbmFnZXIuc3RhdGljUmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgdXA7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlcXVlc3QoTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc2VydmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGEgY2xpZW50IHRoYXQgZ290IGEgcmVxdWVzdCwgbGlrZWx5IHdlJ3JlIHRhbGtpbmcgdG8gYQorICAgICAgICAgICAgICAgIC8vIHNlcnZlciB0aGF0IGlzIGNvbmZ1c2VkLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9Mb2cucmVwb3J0KCAiR290S2VlcEFsaXZlUmVxIiwgIm1zZyIsIG1zZyApOworICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiR290S2VlcEFsaXZlUmVxOk1zZyAiICsgbXNnKTsKKworICAgICAgICAgICAgaW50PyBkID0gKGludD8pbXNnLkdldChtZl9kZWxheSk7CisgICAgICAgICAgICBpZiAoZCAhPSBudWxsICYmIGQuVmFsdWUgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSgiS2VlcEFsaXZlUmVzZXREZWxheSBkZWxheSAiICsgIGQgKTsKKyAgICAgICAgICAgICAgICBkZWxheSA9IGQuVmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludD8gYyA9IChpbnQ/KW1zZy5HZXQobWZfY291bnQpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLlZhbHVlID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vIENvbnNvbGUuV3JpdGVMaW5lKCAiS2VlcEFsaXZlUmVzZXRDb3VudCBjb3VudCAiICsgYyApOworICAgICAgICAgICAgICAgIGNvdW50ID0gYy5WYWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGlja2xlKCk7CisKKyAgICAgICAgICAgIHNlbmRLZWVwQWxpdmVSZXNwKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzcG9uc2UoTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgYSBzZXJ2ZXIgdGhhdCBnb3QgYSByZXNwb25zZSwgd2hpY2ggbWVhbnMgZWl0aGVyIHdlIHNlbnQKKyAgICAgICAgICAgICAgICAvLyBhIHJlcXVlc3QgKGJ1dCB3ZSBzaG91bGRuJ3QgZG8gdGhhdCBpZiB3ZSdyZSBhIHNlcnZlcikgb3IgdGhlCisgICAgICAgICAgICAgICAgLy8gY2xpZW50IGlzIGNvbmZ1c2VkLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9Mb2cucmVwb3J0KCAiR290S2VlcEFsaXZlUmVzcCIsICJtc2ciLCBtc2cgKTsKKyAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIiBHb3RLZWVwQWxpdmVSZXNwOiBtc2cgIiArIG1zZyk7CisKKyAgICAgICAgICAgIHRpY2tsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRpY2tsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vCWxhc3RUaWNrbGUgPSBUaW1lci5HZXROYW5vcygpOworICAgICAgLy8gICAgICBsYXN0VGlja2xlID0gSFBUaW1lci5Ob3coKTsKKyAgICAgICAgICAgIGxhc3RUaWNrbGUgPSBIUFRpbWVyLk5vdygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBsb25nIGxhc3RUaWNrbGU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVGlja2xlKCkKKyAgICAgICAgeworICAgICAgICAgICAKKworICAgICAgICAgICAgbG9uZyBtcyA9IEhQVGltZXIuTWlsbGlzU2luY2UobGFzdFRpY2tsZSk7CisgICAgICAgICAgICAvLwkJTG9nLnJlcG9ydCggIktlZXBBbGl2ZUlkbGUiLCAibXMiLCBtcywgInNlcnZlciIsIHNlcnZlciApOworICAgICAgICAgICAgaWYgKG1zID49IGNvdW50ICogZGVsYXkgKiAxMDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8JCQkJTG9nLnJlcG9ydCggIktlZXBBbGl2ZVJlc2V0IiwgInNlcnZlciIsIHNlcnZlciApOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25Ob3RpZnkoIktlZXBBbGl2ZSByZXNldHRpbmcgZGVhZCBjb25uZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5SRVNFVCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZW5kS2VlcEFsaXZlUmVxKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZShtdF9yZXF1ZXN0LCB2Zik7CisgICAgICAgICAgICBtc2cuQWRkKG1mX2RlbGF5LCBkZWxheSk7CisgICAgICAgICAgICBtc2cuQWRkKG1mX2NvdW50LCBjb3VudCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLwkJTG9nLnJlcG9ydCggIlNlbmRLZWVwQWxpdmVSZXEiLCAibXNnIiwgbXNnICk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydE1lc3NhZ2UobnVsbCwgbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZW5kS2VlcEFsaXZlUmVzcChNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBybXNnID0gbXNnLlJlcGx5KCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0xvZy5yZXBvcnQoICJTZW5kS2VlcEFsaXZlUmVzcCIsICJybXNnIiwgcm1zZyApOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnRNZXNzYWdlKG51bGwsIHJtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBXYWtldXAoQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIE9iamVjdCBzdGF0ZSwgbG9uZyBkdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vCQlMb2cucmVwb3J0KCAiS2VlcEFsaXZlV2FrZXVwIiwgInNlcnZlciIsIHNlcnZlciApOworCisgICAgICAgICAgICBpZiAoIXVwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBpZiAoIXNlcnZlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUb2RvTWFuYWdlci5BZGRUb2RvKG5ldyBNeVRvZG8oc2VuZEtlZXBBbGl2ZVJlcSwgcmVwb3J0RXJyb3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hlY2tUaWNrbGUoKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlbGF5ICogMTAwMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZXBvcnRFcnJvcihFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTm90aWZ5KGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJLZWVwQWxpdmUvIiArIHRyYW5zcG9ydDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeVRvZG8gOiBUb2RvCisgICAgeworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBkb2l0KCk7CisKKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgcmVwb3J0KEV4Y2VwdGlvbiBlKTsKKworICAgICAgICBwdWJsaWMgTXlUb2RvKGRvaXQgZCwgcmVwb3J0IHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZCA9IGQ7CisgICAgICAgICAgICB0aGlzLnIgPSByOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkb2l0IGQ7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZXBvcnQgcjsKKworICAgICAgICBwdWJsaWMgdm9pZCBEb2l0KFRvZG9NYW5hZ2VyIG1ncikKKyAgICAgICAgeworICAgICAgICAgICAgZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRXhjZXB0aW9uKFRvZG9NYW5hZ2VyIG1nciwgRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIoZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GaWx0ZXIvTG9nZ2VyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRmlsdGVyL0xvZ2dlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmY5ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRmlsdGVyL0xvZ2dlci5jcwpAQCAtMCwwICsxLDE2NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0LkZpbHRlcgoreworICAgIHB1YmxpYyBjbGFzcyBMb2dnZXIgOiBBYnN0cmFjdE1lc3NhZ2VGaWx0ZXIKKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBTdHJpbmcgRklMRV9QQVRIID0gIkxvZ2dlci5maWxlUGF0aCI7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgVGV4dFdyaXRlciB3cml0ZXIgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCB0ZXN0RmxhZyA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgc3RyaW5nIHRlc3RSZW5hbWVkRmlsZU5hbWUgPSBudWxsOworCisgICAgICAgIGVudW0gRGlyZWN0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFVQLCBET1dOCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTG9nZ2VyKFRyYW5zcG9ydE1lc3NhZ2UgdHJhbnNwb3J0LCBVUkwgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zcG9ydCwgdXJpLCByZXNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXRpYWxpemVMb2dnZXIodXJpKTsKKyAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZUxvZ2dlcihVUkwgdXJpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbmV3RnVsbEZpbGVOYW1lOworICAgICAgICAgICAgZmlsZU5hbWUgPSB1cmkuR2V0VGVybShGSUxFX1BBVEgpOworICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSAiTG9nLnR4dCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghdGVzdEZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGZpbGVOYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgc3RyaW5nIG5ld0ZpbGVOYW1lID0gUGF0aC5HZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oZmlsZU5hbWUpICsgRGF0ZVRpbWUuTm93LlRvU3RyaW5nKCJ5eXl5Lk1NLmRkLkhILm1tLnNzIiwgQ3VsdHVyZUluZm8uQ3JlYXRlU3BlY2lmaWNDdWx0dXJlKCJlbi1VUyIpKSArIFBhdGguR2V0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbmV3RnVsbEZpbGVOYW1lID0gUGF0aC5Db21iaW5lKG5ldyBGaWxlSW5mbyhmaWxlTmFtZSkuRGlyZWN0b3J5TmFtZSwgbmV3RmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBuZXdGdWxsRmlsZU5hbWUgPSBHZW5lcmF0ZU5ld0ZpbGVOYW1lKGZpbGVOYW1lLCBuZXcgRmlsZUluZm8oZmlsZU5hbWUpLkRpcmVjdG9yeU5hbWUpOworICAgICAgICAgICAgICAgICAgICBGaWxlLk1vdmUoZmlsZU5hbWUsIG5ld0Z1bGxGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUuRGVsZXRlKGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyID0gVGV4dFdyaXRlci5TeW5jaHJvbml6ZWQobmV3IFN0cmVhbVdyaXRlcihmaWxlTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RSZW5hbWVkRmlsZU5hbWUgPSBHZW5lcmF0ZU5ld0ZpbGVOYW1lKGZpbGVOYW1lLG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2VuZXJhdGVOZXdGaWxlTmFtZShzdHJpbmcgZmlsZU5hbWUsIHN0cmluZyBwYXRoTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXRoTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHBhdGhOYW1lID0gIiI7CisgICAgICAgICAgICBzdHJpbmcgbmV3RmlsZU5hbWUgPSBQYXRoLkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbihmaWxlTmFtZSkgKyBEYXRlVGltZS5Ob3cuVG9TdHJpbmcoInl5eXkuTU0uZGQuSEgubW0uc3MiLCBDdWx0dXJlSW5mby5DcmVhdGVTcGVjaWZpY0N1bHR1cmUoImVuLVVTIikpICsgUGF0aC5HZXRFeHRlbnNpb24oZmlsZU5hbWUpOworICAgICAgICAgICAgc3RyaW5nIG5ld0Z1bGxGaWxlTmFtZSA9IFBhdGguQ29tYmluZShwYXRoTmFtZSwgbmV3RmlsZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5ld0Z1bGxGaWxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIkxvZ2dlci8iICsgdHJhbnNwb3J0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRGaWxlTmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0VGVzdFJlbmFtZWRGaWxlTmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0UmVuYW1lZEZpbGVOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgU2Vzc2lvbk1lc3NhZ2UoV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVG9GaWxlKERpcmVjdGlvbi5VUCwgc2VuZGVyLCBtc2cuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gYmFzZS5TZXNzaW9uTWVzc2FnZShzZW5kZXIsIG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBUcmFuc3BvcnRNZXNzYWdlKFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZVRvRmlsZShEaXJlY3Rpb24uRE9XTiwgcmVjaXBpZW50LCBtc2cuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBiYXNlLlRyYW5zcG9ydE1lc3NhZ2UocmVjaXBpZW50LCBtc2cpOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFNlc3Npb25VcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVG9GaWxlKERpcmVjdGlvbi5VUCwgbnVsbCwgdHJhbnNwb3J0LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBTZXNzaW9uRG93bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVG9GaWxlKERpcmVjdGlvbi5ET1dOLCBudWxsLCB0cmFuc3BvcnQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVRvRmlsZShEaXJlY3Rpb24gZGlyZWN0aW9uLCBXaG8gbXNnT3JpZ2luLCBTdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod3JpdGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayAod3JpdGVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKERhdGVUaW1lLk5vdy5Ub1N0cmluZygiSEg6bW06c3MuZmZmIiwgQ3VsdHVyZUluZm8uQ3JlYXRlU3BlY2lmaWNDdWx0dXJlKCJlbi1VUyIpKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKENvbnZlcnREaXJUb1N0cmluZyhkaXJlY3Rpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCI6ICIpOworICAgICAgICAgICAgICAgICAgICBpZiAobXNnT3JpZ2luICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShtc2dPcmlnaW4uVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoIjogIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKG1zZyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLkZsdXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5DbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIENvbnZlcnREaXJUb1N0cmluZyhEaXJlY3Rpb24gZGlyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRGlyZWN0aW9uLkRPV04gPT0gZGlyKQorICAgICAgICAgICAgICAgIHJldHVybiAiT3V0Z29pbmciOworICAgICAgICAgICAgcmV0dXJuICJJbmNvbWluZyI7CisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRmlsdGVyL1B3QXV0aC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZpbHRlci9Qd0F1dGguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0ZWEyNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZpbHRlci9Qd0F1dGguY3MKQEAgLTAsMCArMSwzNjUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQuRmlsdGVyCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQd0F1dGggaXMgYSBtZXNzYWdlIGZpbHRlciB3aGljaCB3YXRjaGVzIGZvciBTZXNzaW9uLlVQIGFuZCBhdHRlbXB0cyB0bworICAgIC8vLyBhdXRoZW50aWNhdGUgdGhlIHVzZXIgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB3aXRoIHRoZSBuYW1lIGFuZAorICAgIC8vLyBwYXNzd29yZCBpbiBpdC4gSWYgdGhlIHNlcnZlciByZXNwb25kcywgdGhlIHNlc3Npb24gaXMgbm90aWZpZWQgd2l0aCB0aGUKKyAgICAvLy8gdXNlciBuYW1lLiBJZiB0aGUgc2VydmVyIHJlc3BvbmRzIG5lZ2F0aXZlbHksIHRoZSBzZXNzaW9uIGlzIG5vdGlmaWVkIG9mIHRoZQorICAgIC8vLyBmYWlsdXJlICh1c2luZyBhIFB3QXV0aEZhaWwgZXZlbnQpLiBBIHRyYW5zcG9ydCBjb250cm9sIG1heSBhbHNvIGJlIHNlbnQgdG8KKyAgICAvLy8gZm9yY2UgYSBsb2dpbiBvciBsb2dvdXQgb3IgdG8gc2V0IHRoZSBuYW1lIG9yIHBhc3N3b3JkLiBUaGUgbmFtZSBhbmQgcGFzc3dvcmQKKyAgICAvLy8gYXJlIGluaXRpYWxpemVkIGZyb20gdGhlIHVyaSwgb3IgcHJvbXB0ZWQgZm9yIGlmIG5vdCBzcGVjaWZpZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgUHdBdXRoIDogQWJzdHJhY3RNZXNzYWdlRmlsdGVyCisgICAgeworCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBjbGllbnQgc2Vzc2lvblF1ZXJ5OiByZXR1cm4gdXNlciBuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICAgIC8vLyB0cmFuc3BvcnRRdWVyeTogcmV0dXJuIHRoZSBjdXJyZW50IHVzZXIgbmFtZSAob24gc2VydmVyIGl0IGhhcyBiZWVuIHZhbGlkYXRlZCkuCisgICAgICAgIC8vLyBjbGllbnQgdHJhbnNwb3J0Q29udHJvbDogc2V0IHVzZXIgbmFtZSB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorCisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgVVNFUiA9ICJQd0F1dGgudXNlciI7CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIGNsaWVudCBzZXNzaW9uUXVlcnk6IHJldHVybiBwYXNzd29yZCB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAvLy8gdHJhbnNwb3J0UXVlcnk6IHJldHVybiB0aGUgY3VycmVudCBwYXNzd29yZCAob24gc2VydmVyIGl0IGhhcyBiZWVuIHZhbGlkYXRlZCkuCisgICAgICAgIC8vLyBjbGllbnQgdHJhbnNwb3J0Q29udHJvbDogc2V0IHBhc3N3b3JkIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgcHVibGljIGNvbnN0IFN0cmluZyBQQVNTV09SRCA9ICJQd0F1dGgucGFzc3dvcmQiOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIGNsaWVudCB0cmFuc3BvcnRDb250cm9sOiBzZW5kIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBTdHJpbmcgQVVUSEVOVElDQVRFID0gIlB3QXV0aC5hdXRoZW50aWNhdGUiOworCisgICAgICAgIHB1YmxpYyBQd0F1dGgoVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnNwb3J0LCB1cmksIHJlc291cmNlcykKKyAgICAgICAgeworCisgICAgICAgICAgICBzZXJ2ZXIgPSAoQm9vbGVhbil0cmFuc3BvcnQuVHJhbnNwb3J0UXVlcnkoVHJhbnNwb3J0Q29uc3RzLklTX1NFUlZFUik7CisKKyAgICAgICAgICAgIGlmICghc2VydmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzZXIgPSB1cmkuVXNlcjsKKyAgICAgICAgICAgICAgICBwYXNzd29yZCA9IHVyaS5QYXNzd29yZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8JCUxvZy5yZXBvcnQoICJLZWVwQWxpdmVJbnN0YWxsZWQiLAorICAgICAgICAgICAgLy8JCQkiZGVsYXkiLCBkZWxheSwgImNvdW50IiwgY291bnQsICJzZXJ2ZXIiLCBzZXJ2ZXIgKTsKKworICAgICAgICAgICAgdmYgPSAoVmFsdWVGYWN0b3J5KXJlc291cmNlcy5HZXQoVHJhbnNwb3J0Q29uc3RzLlZBTFVFX0ZBQ1RPUlkpOworCisgICAgICAgICAgICBtdF9yZXF1ZXN0ID0gbmV3IFhUeXBlKCJfRXRjaF9Qd0F1dGhSZXEiKTsKKyAgICAgICAgICAgIG10X3Jlc3BvbnNlID0gbmV3IFhUeXBlKCJfRXRjaF9Qd0F1dGhSZXNwIik7CisKKyAgICAgICAgICAgIHZmLkFkZFR5cGUobXRfcmVxdWVzdCk7CisgICAgICAgICAgICB2Zi5BZGRUeXBlKG10X3Jlc3BvbnNlKTsKKworICAgICAgICAgICAgbWZfdXNlciA9IG5ldyBGaWVsZCgidXNlciIpOworICAgICAgICAgICAgbWZfcGFzc3dvcmQgPSBuZXcgRmllbGQoInBhc3N3b3JkIik7CisgICAgICAgICAgICBtZl9vayA9IG5ldyBGaWVsZCgib2siKTsKKyAgICAgICAgICAgIG1mX3N0YXR1cyA9IG5ldyBGaWVsZCgic3RhdHVzIik7CisKKyAgICAgICAgICAgIG10X3JlcXVlc3QuUHV0VmFsaWRhdG9yKG1mX3VzZXIsIFZhbGlkYXRvcl9zdHJpbmcuR2V0KDApKTsKKyAgICAgICAgICAgIG10X3JlcXVlc3QuUHV0VmFsaWRhdG9yKG1mX3Bhc3N3b3JkLCBWYWxpZGF0b3Jfc3RyaW5nLkdldCgwKSk7CisgICAgICAgICAgICBtdF9yZXF1ZXN0LlNldFJlc3VsdChtdF9yZXNwb25zZSk7CisgICAgICAgICAgICBtdF9yZXF1ZXN0LkxvY2soKTsKKworICAgICAgICAgICAgbXRfcmVzcG9uc2UuUHV0VmFsaWRhdG9yKG1mX29rLCBWYWxpZGF0b3JfYm9vbGVhbi5HZXQoMCkpOworICAgICAgICAgICAgbXRfcmVzcG9uc2UuUHV0VmFsaWRhdG9yKG1mX3N0YXR1cywgVmFsaWRhdG9yX3N0cmluZy5HZXQoMCkpOworICAgICAgICAgICAgbXRfcmVzcG9uc2UuTG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcjsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgc2VydmVyOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgbWZfdXNlcjsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkIG1mX3Bhc3N3b3JkOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgbWZfb2s7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZCBtZl9zdGF0dXM7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYVHlwZSBtdF9yZXF1ZXN0OworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgbXRfcmVzcG9uc2U7CisKKyAgICAgICAgcHVibGljIGJvb2wgR2V0U2VydmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFNlc3Npb25NZXNzYWdlKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobXNnLklzVHlwZShtdF9yZXF1ZXN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIYW5kbGVQd0F1dGhSZXEoc2VuZGVyLCBtc2cpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXNnLklzVHlwZShtdF9yZXNwb25zZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSGFuZGxlUHdBdXRoUmVzcChzZW5kZXIsIG1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBiYXNlLlNlc3Npb25NZXNzYWdlKHNlbmRlciwgbXNnKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgU2Vzc2lvblVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzZXJ2ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY2xpZW50OiBzZW5kIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgU2VuZFB3QXV0aFJlcSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIFNlc3Npb25Eb3duKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNlcnZlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBzZXJ2ZXIgc2Vzc2lvbidzIGlkZWEgb2YgdXNlciBpcyBjbGVhcmVkLgorICAgICAgICAgICAgICAgIFNlc3Npb25Ob3RpZnlVc2VyKG51bGwsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZW5kUHdBdXRoUmVxKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2VyID0gKFN0cmluZylzZXNzaW9uLlNlc3Npb25RdWVyeShVU0VSKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQd0F1dGg6IHVzZXIgPT0gbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXNzd29yZCA9IChTdHJpbmcpc2Vzc2lvbi5TZXNzaW9uUXVlcnkoUEFTU1dPUkQpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQd0F1dGg6IHBhc3N3b3JkID09IG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZShtdF9yZXF1ZXN0LCB2Zik7CisgICAgICAgICAgICBtc2cuQWRkKG1mX3VzZXIsIHVzZXIpOworICAgICAgICAgICAgbXNnLkFkZChtZl9wYXNzd29yZCwgcGFzc3dvcmQpOworICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydE1lc3NhZ2UobnVsbCwgbXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBIYW5kbGVQd0F1dGhSZXEoV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc2VydmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGEgY2xpZW50IHRoYXQgZ290IGEgcmVxdWVzdCwgbGlrZWx5IHdlJ3JlIHRhbGtpbmcgdG8gYQorICAgICAgICAgICAgICAgIC8vIHNlcnZlciB0aGF0IGlzIGNvbmZ1c2VkLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiBTZW5kZXI6ICIgKyBzZW5kZXIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiBNZXNzYWdlOiAiICsgbXNnKTsKKworICAgICAgICAgICAgU3RyaW5nIHUgPSAoU3RyaW5nKW1zZy5HZXQobWZfdXNlcik7CisgICAgICAgICAgICBTdHJpbmcgcCA9IChTdHJpbmcpbXNnLkdldChtZl9wYXNzd29yZCk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9rU3RhdHVzIGFzMSA9IChPa1N0YXR1cylTZXNzaW9uUXVlcnkobmV3IFVzZXJQYXNzd29yZCh1LCBwKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXMxLm9rKQorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTm90aWZ5VXNlcih1LCBwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Ob3RpZnlVc2VyKG51bGwsIG51bGwpOworCisgICAgICAgICAgICAgICAgc2VuZFB3QXV0aFJlc3Aoc2VuZGVyLCBtc2csIGFzMS5vaywgYXMxLnN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbk5vdGlmeVVzZXIobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgc2VuZFB3QXV0aFJlc3Aoc2VuZGVyLCBtc2csIGZhbHNlLCBlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2VuZFB3QXV0aFJlc3AoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2csIGJvb2wgcmVzdWx0LCBTdHJpbmcgc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlIHJtc2cgPSBtc2cuUmVwbHkoKTsKKyAgICAgICAgICAgIHJtc2cuQWRkKG1mX29rLCByZXN1bHQpOworICAgICAgICAgICAgcm1zZy5BZGQobWZfc3RhdHVzLCBzdGF0dXMpOworICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydE1lc3NhZ2UocmVjaXBpZW50LCBybXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBIYW5kbGVQd0F1dGhSZXNwKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VydmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGEgc2VydmVyIHRoYXQgZ290IGEgcmVzcG9uc2UsIGxpa2VseSB3ZSdyZSB0YWxraW5nIHRvIGEKKyAgICAgICAgICAgICAgICAvLyBjbGllbnQgdGhhdCBpcyBjb25mdXNlZC4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExvZy5yZXBvcnQoICJHb3RQd0F1dGhSZXNwIiwgInNlbmRlciIsIHNlbmRlciwgIm1zZyIsIG1zZyApOworCisgICAgICAgICAgICBib29sIHJlc3VsdCA9IChCb29sZWFuKW1zZy5HZXQobWZfb2spOworICAgICAgICAgICAgU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpbXNnLkdldChtZl9zdGF0dXMpOworCisgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25Ob3RpZnkobmV3IE9rU3RhdHVzKHJlc3VsdCwgc3RhdHVzKSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJhbnNwb3J0UXVlcnkoT2JqZWN0IHF1ZXJ5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHN0cmluZylxdWVyeSA9PSBVU0VSKQorICAgICAgICAgICAgICAgIHJldHVybiB1c2VyOworCisgICAgICAgICAgICBpZiAoKHN0cmluZylxdWVyeSA9PSBQQVNTV09SRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFzc3dvcmQ7CisKKyAgICAgICAgICAgIHJldHVybiBiYXNlLlRyYW5zcG9ydFF1ZXJ5KHF1ZXJ5KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgVHJhbnNwb3J0Q29udHJvbChPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHN0cmluZyljb250cm9sID09IFVTRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3RTZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICB1c2VyID0gKFN0cmluZyl2YWx1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoc3RyaW5nKWNvbnRyb2wgPT0gUEFTU1dPUkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3RTZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICBwYXNzd29yZCA9IChTdHJpbmcpdmFsdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHN0cmluZyljb250cm9sID09IEFVVEhFTlRJQ0FURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja05vdFNlcnZlcigpOworICAgICAgICAgICAgICAgIFNlbmRQd0F1dGhSZXEoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJhc2UuVHJhbnNwb3J0Q29udHJvbChjb250cm9sLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ2hlY2tOb3RTZXJ2ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VydmVyKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImNvbnRyb2wgbm90IHBlcm1pdHRlZCBieSBzZXJ2ZXIiKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNlc3Npb25Ob3RpZnlVc2VyKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25Ob3RpZnkobmV3IFVzZXJQYXNzd29yZCh1c2VyLCBwYXNzd29yZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2VydmVyIHNlc3Npb24gcXVlcnkgcmVzcG9uc2UgdG8gQXV0aFVzZXJQYXNzd29yZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIE9rU3RhdHVzCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBBdXRoT2tTdGF0dXMuPC9zdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvayI+dHJ1ZSBpZiB1c2VyIC8gcGFzc3dvcmQgdmFsaWQuPC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhdHVzIj5tZXNzYWdlIHJlbGF0ZWQgdG8gb2suPC9wYXJhbT4KKyAgICAgICAgICAgIHB1YmxpYyBPa1N0YXR1cyhib29sIG9rLCBTdHJpbmcgc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMub2sgPSBvazsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZvcm1hdCgiQXV0aE9rU3RhdHVzKCAlcywgJXMgKSIsIG9rLCBzdGF0dXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0cnVlIGlmIHRoZSB1c2VyIC8gcGFzc3dvcmQgbWF0Y2hlZCAKKyAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBib29sIG9rOworCisgICAgICAgICAgICAvLyBtZXNzYWdlIHJlbGF0ZWQgdG8gb2sKKyAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBTdHJpbmcgc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2VydmVyIHNlc3Npb24gcXVlcnkgdG8gZ2V0IEF1dGhPa1N0YXR1cywgYWxzbyBzZXJ2ZXIgc2Vzc2lvbiBldmVudAorICAgICAgICAvLy8gdG8gcmVwb3J0IGNoYW5nZXMgaW4gYXV0aGVudGljYXRpb24gc3RhdHVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgVXNlclBhc3N3b3JkCisgICAgICAgIHsKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIENoZWNrQXV0aC48L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVzZXIiPm5hbWUgdG8gY2hlY2s8L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+cGFzc3dvcmQgb2YgdGhlIHVzZXI8L3BhcmFtPgorICAgICAgICAgICAgcHVibGljIFVzZXJQYXNzd29yZChTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJBdXRoVXNlclBhc3N3b3JkKCAlcyApIiwgdXNlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSB1c2VyIG5hbWUgdG8gY2hlY2sKKyAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBTdHJpbmcgdXNlcjsKKworICAgICAgICAgICAgLy8gVGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyCisgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgU3RyaW5nIHBhc3N3b3JkOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJQd0F1dGgvIiArIHRyYW5zcG9ydDsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvQmluYXJ5L0JpbmFyeVRhZ2dlZERhdGEuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvQmluYXJ5L0JpbmFyeVRhZ2dlZERhdGEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlZmJmYwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvQmluYXJ5VGFnZ2VkRGF0YS5jcwpAQCAtMCwwICsxLDI0NyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydC5GbXQuQmluYXJ5Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDb21tb24gZWxlbWVudHMgZm9yIGJpbmFyeSB0YWdnZWQgZGF0YSBpbnB1dCBhbmQgb3V0cHV0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEJpbmFyeVRhZ2dlZERhdGEgOiBUYWdnZWREYXRhCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZW50aW5lbCB3aGljaCBtYXJrcyB0aGUgZW5kIG9mIGEgc3RydWN0IG9yIGFycmF5IGl0ZW0gbGlzdAorICAgICAgICAvLy8gaW4gYSBiaW5hcnkgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKworICAgICAgICBwdWJsaWMgY2xhc3MgU2VudGluZWxPYmplY3QKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJOT05FIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNlbnRpbmVsT2JqZWN0IE5PTkUgPSBuZXcgU2VudGluZWxPYmplY3QoKTsKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBWRVJTSU9OID0gMzsKKworICAgICAgICBwdWJsaWMgQmluYXJ5VGFnZ2VkRGF0YSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIEJpbmFyeVRhZ2dlZERhdGEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmYiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBCaW5hcnlUYWdnZWREYXRhKFZhbHVlRmFjdG9yeSB2ZikKKyAgICAgICAgICAgIDogYmFzZSh2ZikKKyAgICAgICAgeworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgQ2hlY2tWYWx1ZShvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5OVUxMOworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuTk9ORTsKKworICAgICAgICAgICAgVHlwZSB0eXBlID0gdmFsdWUuR2V0VHlwZSgpOworCisgICAgICAgICAgICBpZiAodmFsdWUgaXMgbG9uZykKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tMb25nKChsb25nKXZhbHVlKTsKKworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgSW50MzIpCisgICAgICAgICAgICAgICAgcmV0dXJuIENoZWNrSW50ZWdlcigoSW50MzIpdmFsdWUpOworCisgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBzaG9ydCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tTaG9ydCgoc2hvcnQpdmFsdWUpOworCisgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBTQnl0ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tCeXRlKChzYnl0ZSl2YWx1ZSk7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIERvdWJsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNieXRlKVR5cGVDb2RlLkRPVUJMRTsKKworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgZmxvYXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSlUeXBlQ29kZS5GTE9BVDsKKworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgU3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZyl2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVDb2RlLkVNUFRZX1NUUklORzsKKworICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5TVFJJTkc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIEJvb2xlYW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChCb29sZWFuKXZhbHVlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuQk9PTEVBTl9UUlVFOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVDb2RlLkJPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIFN0cnVjdFZhbHVlKQorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5DVVNUT007CisKKworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgQXJyYXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJyYXkgYSA9IChBcnJheSl2YWx1ZTsKKyAgICAgICAgICAgICAgICAvL2lmIChhLkdldFR5cGUoKSA9PSB0eXBlb2YoSW50MzJbXSkpCisgICAgICAgICAgICAgICAgLy8gICAgcmV0dXJuIFR5cGVDb2RlLklOVFM7CisgICAgICAgICAgICAgICAgLy9pZiAoYS5HZXRUeXBlKCkgPT0gdHlwZW9mKEludDE2W10pKQorICAgICAgICAgICAgICAgIC8vICAgIHJldHVybiBUeXBlQ29kZS5TSE9SVFM7CisgICAgICAgICAgICAgICAgLy9pZiAoYS5HZXRUeXBlKCkgPT0gdHlwZW9mKEJvb2xlYW5bXSkpCisgICAgICAgICAgICAgICAgLy8gICAgcmV0dXJuIFR5cGVDb2RlLkJPT0xTOworICAgICAgICAgICAgICAgIGlmIChhLkdldFR5cGUoKSA9PSB0eXBlb2YoU0J5dGVbXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5CWVRFUzsKKyAgICAgICAgICAgICAgICAvL2lmIChhLkdldFR5cGUoKSA9PSB0eXBlb2YoSW50NjRbXSkpCisgICAgICAgICAgICAgICAgLy8gICAgcmV0dXJuIFR5cGVDb2RlLkxPTkdTOworICAgICAgICAgICAgICAgIC8vaWYgKGEuR2V0VHlwZSgpID09IHR5cGVvZihTaW5nbGVbXSkpCisgICAgICAgICAgICAgICAgLy8gICAgcmV0dXJuIFR5cGVDb2RlLkZMT0FUUzsKKyAgICAgICAgICAgICAgICAvL2lmIChhLkdldFR5cGUoKSA9PSB0eXBlb2YoRG91YmxlW10pKQorICAgICAgICAgICAgICAgIC8vICAgIHJldHVybiBUeXBlQ29kZS5ET1VCTEVTOworICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5BUlJBWTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuQ1VTVE9NOworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgR2V0TmF0aXZlVHlwZUNvZGUoVHlwZSBjKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYyA9PSB0eXBlb2YoQm9vbGVhbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVDb2RlLkJPT0xFQU5fVFJVRTsKKworICAgICAgICAgICAgaWYgKGMgPT0gdHlwZW9mKFNCeXRlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuQllURTsKKworICAgICAgICAgICAgaWYgKGMgPT0gdHlwZW9mKHNob3J0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuU0hPUlQ7CisKKyAgICAgICAgICAgIGlmIChjID09IHR5cGVvZihpbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5JTlQ7CisKKyAgICAgICAgICAgIGlmIChjID09IHR5cGVvZihsb25nKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuTE9ORzsKKworICAgICAgICAgICAgaWYgKGMgPT0gdHlwZW9mKGZsb2F0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuRkxPQVQ7CisKKyAgICAgICAgICAgIGlmIChjID09IHR5cGVvZihkb3VibGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5ET1VCTEU7CisKKyAgICAgICAgICAgIGlmIChjID09IHR5cGVvZihzdHJpbmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5TVFJJTkc7CisKKyAgICAgICAgICAgIGlmIChjID09IHR5cGVvZihPYmplY3QpKQorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5BTlk7CisKKyAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5DVVNUT007CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgWFR5cGUgR2V0Q3VzdG9tU3RydWN0VHlwZShUeXBlIGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2Zi5HZXRDdXN0b21TdHJ1Y3RUeXBlKGMpOworICAgICAgICB9CisKKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUeXBlIEdldE5hdGl2ZVR5cGUoc2J5dGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuQk9PTEVBTl9UUlVFOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuQk9PTEVBTl9GQUxTRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihCb29sZWFuKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuQllURToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihzYnl0ZSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLlNIT1JUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mKHNob3J0KTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuSU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mKGludCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkxPTkc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YobG9uZyk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkZMT0FUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mKGZsb2F0KTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mKGRvdWJsZSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkVNUFRZX1NUUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihzdHJpbmcpOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5BTlk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YoT2JqZWN0KTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuc3VwcG9ydGVkIG5hdGl2ZSB0eXBlICIgKyB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHNieXRlIENoZWNrQnl0ZShzYnl0ZSB2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodiA+PSBUeXBlQ29kZS5NSU5fVElOWV9JTlQgJiYgdiA8PSBUeXBlQ29kZS5NQVhfVElOWV9JTlQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICByZXR1cm4gVHlwZUNvZGUuQllURTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHNieXRlIENoZWNrU2hvcnQoc2hvcnQgdikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHYgPj0gU0J5dGUuTWluVmFsdWUgJiYgdiA8PSBTQnl0ZS5NYXhWYWx1ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tCeXRlKChzYnl0ZSl2KTsKKworICAgICAgICAgICAgcmV0dXJuIFR5cGVDb2RlLlNIT1JUOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc2J5dGUgQ2hlY2tJbnRlZ2VyKGludCB2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodiA+PSBzaG9ydC5NaW5WYWx1ZSAmJiB2IDw9IHNob3J0Lk1heFZhbHVlKQorICAgICAgICAgICAgICAgIHJldHVybiBDaGVja1Nob3J0KChzaG9ydCl2KTsKKworICAgICAgICAgICAgcmV0dXJuIFR5cGVDb2RlLklOVDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHNieXRlIENoZWNrTG9uZyhsb25nIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ID49IGludC5NaW5WYWx1ZSAmJiB2IDw9IGludC5NYXhWYWx1ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tJbnRlZ2VyKChpbnQpdik7CisKKyAgICAgICAgICAgIHJldHVybiBUeXBlQ29kZS5MT05HOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvQmluYXJ5L0JpbmFyeVRhZ2dlZERhdGFGb3JtYXRGYWN0b3J5LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L0JpbmFyeS9CaW5hcnlUYWdnZWREYXRhRm9ybWF0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2UxZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L0JpbmFyeS9CaW5hcnlUYWdnZWREYXRhRm9ybWF0RmFjdG9yeS5jcwpAQCAtMCwwICsxLDM4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQuRm10LkJpbmFyeQorIAoreworICAgIHB1YmxpYyBjbGFzcyBCaW5hcnlUYWdnZWREYXRhRm9ybWF0RmFjdG9yeSA6IEZvcm1hdEZhY3RvcnkKKyAgICB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQmluYXJ5VGFnZ2VkRGF0YUZvcm1hdEZhY3RvcnkoKSB7fQorICAgICAgICAKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRhZ2dlZERhdGFJbnB1dCBOZXdUYWdnZWREYXRhSW5wdXQoIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnLlZhbHVlRmFjdG9yeSB2Ziwgc3RyaW5nIHVyaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5VGFnZ2VkRGF0YUlucHV0KCB2ZiwgdXJpICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVGFnZ2VkRGF0YU91dHB1dCBOZXdUYWdnZWREYXRhT3V0cHV0KCBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZy5WYWx1ZUZhY3RvcnkgdmYsIHN0cmluZyB1cmkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeVRhZ2dlZERhdGFPdXRwdXQoIHZmLCB1cmkgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvQmluYXJ5VGFnZ2VkRGF0YUlucHV0LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L0JpbmFyeS9CaW5hcnlUYWdnZWREYXRhSW5wdXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmOWIzYwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvQmluYXJ5VGFnZ2VkRGF0YUlucHV0LmNzCkBAIC0wLDAgKzEsMzk4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQuRm10LkJpbmFyeQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGFnZ2VkRGF0YUlucHV0U3RyZWFtIGhhcyBtZXRob2RzIHRvIHN1cHBvcnQgcmVhZGluZyBsaXR0bGUtZW5kaWFuIGludGVnZXIKKyAgICAvLy8gYW5kIGZsb2F0aW5nIHBvaW50IGRhdGEgdHlwZXMgYXMgd2VsbCBhcyB0YWdnZWQgdmFsdWVzIGZyb20gYW4gaW5wdXQKKyAgICAvLy8gc3RyZWFtLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEJpbmFyeVRhZ2dlZERhdGFJbnB1dCA6IEJpbmFyeVRhZ2dlZERhdGEsIFRhZ2dlZERhdGFJbnB1dAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgQmluYXJ5VGFnZ2VkRGF0YUlucHV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZmIj50aGUgdmFsdWUgZmFjdG9yeSBmb3IgdGhlIHNlcnZpY2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPnRoZSB1cmkgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHRyYW5zcG9ydCBzdGFjay48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQmluYXJ5VGFnZ2VkRGF0YUlucHV0KCBWYWx1ZUZhY3RvcnkgdmYsIHN0cmluZyB1cmkgKQorICAgICAgICAgICAgOiBiYXNlKCB2ZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuCisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBUYWdnZWREYXRhSW5wdXQgbWV0aG9kcyAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKyAgICAgICAgcHVibGljIE1lc3NhZ2UgUmVhZE1lc3NhZ2UoRmxleEJ1ZmZlciBidWYxKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBidWYxOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBsZW5ndGhCdWRnZXQgaXMgaG93IG1hbnkgYXJyYXkgZWxlbWVudHMgdG90YWwgYXJlIHJlYXNvbmFibGUgdG8KKyAgICAgICAgICAgIC8vIGFsbG9jYXRlIHdoaWxlIHBhcnNpbmcgdGhpcyBtZXNzYWdlLiB0aGUgbGFyZ2VzdCB2YWx1ZSBjb21lcyBhcyBlYWNoCisgICAgICAgICAgICAvLyBieXRlIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlIHR1cm5lZCBpbnRvIGFuIGFycmF5IGVsZW1lbnQuIHRoZSB0b3RhbAorICAgICAgICAgICAgLy8gd2lsbCBhbHdheXMgYmUgbG93ZXIgdGhhbiB0aGlzIGFzIG9mdGVuIGl0IHRha2VzIG11bHRpcGxlIGJ5dGVzIHRvCisgICAgICAgICAgICAvLyBtYWtlIGEgc2luZ2xlIGFycmF5IGVsZW1lbnQuIHNvLCBlYWNoIHRpbWUgd2UgbWFrZSBhbiBhcnJheSwgd2UKKyAgICAgICAgICAgIC8vIGRlZHVjdCB0aGUgc3BlY2lmaWVkIGxlbmd0aCBmcm9tIGxlbmd0aEJ1ZGdldC4gaWYgdGhlIHJlc3VsdCBpcworICAgICAgICAgICAgLy8gbmVnYXRpdmUsIHRoZW4gZWl0aGVyIHRoZSBpbmNvbWluZyBtZXNzYWdlIGlzIG1pc2Zvcm1lZCBvciBzb21lb25lIGlzCisgICAgICAgICAgICAvLyB0cnlpbmcgdG8gc3Bvb2YgdXMuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxlbmd0aEJ1ZGdldCA9IGJ1Zi5BdmFpbCgpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IFN0YXJ0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIFJlYWRLZXlzQW5kVmFsdWVzKG1zZyk7CisgICAgICAgICAgICAgICAgRW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmID0gbnVsbDsKKyAgICAgICAgICAgICAgICBsZW5ndGhCdWRnZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBGbGV4QnVmZmVyIGJ1ZjsKKworICAgICAgICBwcml2YXRlIGludCBsZW5ndGhCdWRnZXQ7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJ1Y3RWYWx1ZSBSZWFkU3RydWN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBTdGFydFN0cnVjdCgpOworICAgICAgICAgICAgUmVhZEtleXNBbmRWYWx1ZXMoIHN2ICk7CisgICAgICAgICAgICBFbmRTdHJ1Y3QoIHN2ICk7CisgICAgICAgICAgICByZXR1cm4gc3Y7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQXJyYXlWYWx1ZSBSZWFkQXJyYXkoIFZhbGlkYXRvciB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgQXJyYXlWYWx1ZSBhdiA9IFN0YXJ0QXJyYXkoKTsKKyAgICAgICAgICAgIFJlYWRWYWx1ZXMoIGF2LCB2ICk7CisgICAgICAgICAgICBFbmRBcnJheSggYXYgKTsKKyAgICAgICAgICAgIHJldHVybiBhdjsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRLZXlzQW5kVmFsdWVzKCBTdHJ1Y3RWYWx1ZSBzdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFhUeXBlIHQgPSBzdi5HZXRYVHlwZTsKKworICAgICAgICAgICAgd2hpbGUgKCB0cnVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWVsZCBrZXkgPSBSZWFkRmllbGQoIHQgKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy9PYmplY3Qgb2JqID0gUmVhZFZhbHVlKCBpbnRWYWxpZGF0b3IsIHRydWUgKTsKKyAgICAgICAgICAgICAgICAvL2lmICggb2JqID09IE5PTkUgKQorICAgICAgICAgICAgICAgIC8vICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy9pbnQgaWQgPSAoIGludCApIG9iajsKKyAgICAgICAgICAgICAgICAvL0ZpZWxkIGtleSA9IHQuR2V0RmllbGQoIGlkICk7CisgICAgICAgICAgICAgICAgLy9pZiAoa2V5ID09IG51bGwpCisgICAgICAgICAgICAgICAgLy8gICAga2V5ID0gbmV3IEZpZWxkKGlkLCBpZC5Ub1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgIFZhbGlkYXRvciB2ID0gdC5HZXRWYWxpZGF0b3IoIGtleSApOworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdi5BZGQoa2V5LCBSZWFkVmFsdWUodikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSB2YWx1ZSBidXQgaWdub3JlIGl0LgorICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gUmVhZFZhbHVlKFZhbGlkYXRvcl9vYmplY3QuR2V0KDApKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgc3YuQWRkKCBrZXksIG9iaiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkVmFsdWVzKCBBcnJheVZhbHVlIGF2LCBWYWxpZGF0b3IgdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRvciBldiA9IHYuRWxlbWVudFZhbGlkYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKCB0cnVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBSZWFkVmFsdWUoIGV2LCB0cnVlICk7CisgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PSBOT05FICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBhdi5BZGQoIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gTWFpbiBpbnB1dCBtZXRob2RzIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIHByaXZhdGUgTWVzc2FnZSBTdGFydE1lc3NhZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBzYnl0ZSB2ZXJzaW9uID0gYnVmLkdldEJ5dGUoKTsKKwkJCQorCQkJaWYgKHZlcnNpb24gIT0gVkVSU0lPTikKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisJCQkJCSJiaW5hcnkgdGFnZ2VkIGRhdGEgdmVyc2lvbiBtaXNtYXRjaDogZ290ICIrdmVyc2lvbisiIGV4cGVjdGVkICIrVkVSU0lPTiApOworCisgICAgICAgICAgICBYVHlwZSB0ID0gUmVhZFR5cGUoKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBSZWFkTGVuZ3RoKCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZSh0LCB2ZiwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBFbmRNZXNzYWdlKCBNZXNzYWdlIG1zZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uLCByZWFkS2V5c0FuZFZhbHVlcyBzd2FsbG93ZWQgdGhlIE5PTkUuCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cnVjdFZhbHVlIFN0YXJ0U3RydWN0KCkgCisJICAgIHsKKyAgICAgICAgICAgIFhUeXBlIHQgPSBSZWFkVHlwZSgpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IFJlYWRMZW5ndGgoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RWYWx1ZSh0LCB2ZiwgbGVuZ3RoKTsKKwkgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBFbmRTdHJ1Y3QoIFN0cnVjdFZhbHVlIHN2ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgcmVhZEtleXNBbmRWYWx1ZXMgc3dhbGxvd2VkIHRoZSBOT05FLgorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheVZhbHVlIFN0YXJ0QXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICBzYnl0ZSB0eXBlID0gYnVmLkdldEJ5dGUoKTsKKworICAgICAgICAgICAgWFR5cGUgY3VzdG9tU3RydWN0VHlwZTsKKyAgICAgICAgICAgIGlmKHR5cGUgPT0gVHlwZUNvZGUuQ1VTVE9NIHx8IHR5cGUgPT0gVHlwZUNvZGUuU1RSVUNUKQorICAgICAgICAgICAgICAgIGN1c3RvbVN0cnVjdFR5cGUgPSBSZWFkVHlwZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN1c3RvbVN0cnVjdFR5cGUgPSBudWxsOworCisgICAgICAgICAgICBpbnQgZGltID0gUmVhZEludGVnZXJWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGRpbSA8PSAwIHx8IGRpbSA+IFZhbGlkYXRvci5NQVhfTkRJTVMpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJkaW0gPD0gMCB8fCBkaW0gPiBWYWxpZGF0b3IuTUFYX05ESU1TIik7CisKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBSZWFkTGVuZ3RoKCk7CisKKyAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IEFsbG9jYXRlQXJyYXlWYWx1ZSggdHlwZSwgY3VzdG9tU3RydWN0VHlwZSwgZGltLCBsZW5ndGggKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheVZhbHVlKCBhcnJheSwgdHlwZSwgY3VzdG9tU3RydWN0VHlwZSwgZGltICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRW5kQXJyYXkoQXJyYXlWYWx1ZSBhcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXkuQ29tcGFjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBYVHlwZSBSZWFkVHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBSZWFkVmFsdWUoaW50T3JTdHJWYWxpZGF0b3IsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChvYmogaXMgaW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZCA9IChpbnQpb2JqOworICAgICAgICAgICAgICAgIFhUeXBlIHR5cGUgPSB2Zi5HZXRUeXBlKGlkKTsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBuZXcgWFR5cGUoaWQsIGlkLlRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylvYmo7CisgICAgICAgICAgICBYVHlwZSBudHlwZSA9IHZmLkdldFR5cGUobmFtZSk7CisKKyAgICAgICAgICAgIGlmIChudHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIG50eXBlID0gbmV3IFhUeXBlKG5hbWUpOworCisgICAgICAgICAgICByZXR1cm4gbnR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZpZWxkIFJlYWRGaWVsZCggWFR5cGUgdHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBSZWFkVmFsdWUoaW50T3JTdHJWYWxpZGF0b3IsIHRydWUpOworCisgICAgICAgICAgICBpZiAob2JqID09IE5PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChvYmogaXMgaW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZCA9IChpbnQpb2JqOworICAgICAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gdHlwZS5HZXRGaWVsZChpZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBuZXcgRmllbGQoaWQsIGlkLlRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpb2JqOworICAgICAgICAgICAgRmllbGQgbmZpZWxkID0gdHlwZS5HZXRGaWVsZChuYW1lKTsKKworICAgICAgICAgICAgaWYgKG5maWVsZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIG5maWVsZCA9IG5ldyBGaWVsZChuYW1lKTsKKworICAgICAgICAgICAgcmV0dXJuIG5maWVsZDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWxpZGF0b3IgaW50T3JTdHJWYWxpZGF0b3IgPQorCQkgICAgbmV3IENvbWJvVmFsaWRhdG9yKCBWYWxpZGF0b3JfaW50LkdldCggMCApLCBWYWxpZGF0b3Jfc3RyaW5nLkdldCggMCApICk7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgUmVhZExlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBSZWFkSW50ZWdlclZhbHVlKCk7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+IGxlbmd0aEJ1ZGdldCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJsZW5ndGggPCAwIHx8IGxlbmd0aCA+IGxlbmd0aEJ1ZGdldCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBsZW5ndGhCdWRnZXQgLT0gbGVuZ3RoOworCisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgUmVhZEludGVnZXJWYWx1ZSgpIAorCSAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludClSZWFkVmFsdWUoaW50VmFsaWRhdG9yKTsKKwkgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsaWRhdG9yIGludFZhbGlkYXRvciA9IFZhbGlkYXRvcl9pbnQuR2V0KCAwICk7CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIExPQ0FMIFVUSUxJVFkgTUVUSE9EUyAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBwcml2YXRlIE9iamVjdCBWYWxpZGF0ZVZhbHVlKFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHYgPT0gbnVsbCBtb3JlIG9yIGxlc3MgaW1wbGllcyB0aGF0IGEgZmllbGQgaXMgbm90IGtub3duCisgICAgICAgICAgICAvLyBmb3IgYSB0eXBlLiB0aHVzIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGZpZWxkIHZhbHVlIGFzCisgICAgICAgICAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gaWdub3JlIGl0LiB0aGVyZWZvcmUsIHJldHVybiBudWxsLgorCisgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIHYuVmFsaWRhdGVWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE9iamVjdCBWYWxpZGF0ZVZhbHVlKCBWYWxpZGF0b3IgdiwgQm9vbGVhbiBub25lT2ssIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChub25lT2sgJiYgdmFsdWUgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgIHJldHVybiBWYWxpZGF0ZVZhbHVlKHYsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgT2JqZWN0IFJlYWRWYWx1ZSggVmFsaWRhdG9yIHYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVhZFZhbHVlKCB2LCBmYWxzZSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgUmVhZFZhbHVlKCBWYWxpZGF0b3IgdiwgQm9vbGVhbiBub25lT2sgKQorICAgICAgICB7CisgICAgICAgICAgICBzYnl0ZSB0eXBlID0gYnVmLkdldEJ5dGUoKTsKKworICAgICAgICAgICAgc3dpdGNoICggdHlwZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5OVUxMOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVWYWx1ZSggdiwgbnVsbCApOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5OT05FOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVWYWx1ZSh2LCBub25lT2ssIE5PTkUpOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5CT09MRUFOX0ZBTFNFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVWYWx1ZSggdiwgZmFsc2UgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuQk9PTEVBTl9UUlVFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVWYWx1ZSggdiwgdHJ1ZSApOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5CWVRFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIFZhbGlkYXRlVmFsdWUoIHYsIGJ1Zi5HZXRCeXRlKCkgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgVmFsaWRhdGVWYWx1ZSggdiwgYnVmLkdldFNob3J0KCkgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuSU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIFZhbGlkYXRlVmFsdWUoIHYsIGJ1Zi5HZXRJbnQoKSApOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5MT05HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVWYWx1ZSggdiwgYnVmLkdldExvbmcoKSApOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlVmFsdWUoIHYsIGJ1Zi5HZXRGbG9hdCgpICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlVmFsdWUoIHYsIGJ1Zi5HZXREb3VibGUoKSApOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5CWVRFUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlVmFsdWUoIHYsIFJlYWRTYnl0ZXMoKSApOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5FTVBUWV9TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0ZVZhbHVlKCB2LCAiIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0ZVZhbHVlKCB2LCBFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEJ5dGVzKCkgKSApOworCisgICAgICAgICAgICAgICAgLy9jYXNlIFR5cGVDb2RlLkJPT0xTOgorICAgICAgICAgICAgICAgIC8vY2FzZSBUeXBlQ29kZS5TSE9SVFM6CisgICAgICAgICAgICAgICAgLy9jYXNlIFR5cGVDb2RlLklOVFM6CisgICAgICAgICAgICAgICAgLy9jYXNlIFR5cGVDb2RlLkxPTkdTOgorICAgICAgICAgICAgICAgIC8vY2FzZSBUeXBlQ29kZS5GTE9BVFM6CisgICAgICAgICAgICAgICAgLy9jYXNlIFR5cGVDb2RlLkRPVUJMRVM6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5BUlJBWToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlVmFsdWUoIHYsIEZyb21BcnJheVZhbHVlKCBSZWFkQXJyYXkoIHYgKSApICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkNVU1RPTToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlVmFsdWUoIHYsIHZmLkltcG9ydEN1c3RvbVZhbHVlKCBSZWFkU3RydWN0KCkgKSApOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPj0gVHlwZUNvZGUuTUlOX1RJTllfSU5UICYmIHR5cGUgPD0gVHlwZUNvZGUuTUFYX1RJTllfSU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRlVmFsdWUodiwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJ1bnN1cHBvcnRlZCB0eXBlIGNvZGUgIit0eXBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkQnl0ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gUmVhZExlbmd0aCgpOworICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsgbGVuZ3RoIF07CisgICAgICAgICAgICBidWYuR2V0RnVsbHkoIGIgKTsKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzYnl0ZVtdIFJlYWRTYnl0ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gUmVhZExlbmd0aCgpOworICAgICAgICAgICAgc2J5dGVbXSBiID0gbmV3IHNieXRlW2xlbmd0aF07CisgICAgICAgICAgICBidWYuR2V0RnVsbHkoKGJ5dGVbXSkoQXJyYXkpYik7CisgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvQmluYXJ5VGFnZ2VkRGF0YU91dHB1dC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvQmluYXJ5VGFnZ2VkRGF0YU91dHB1dC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTUwOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L0JpbmFyeS9CaW5hcnlUYWdnZWREYXRhT3V0cHV0LmNzCkBAIC0wLDAgKzEsMzY0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydC5GbXQuQmluYXJ5Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBUYWdnZWREYXRhT3V0cHV0IHdoaWNoIHVzZXMgYSBiaW5hcnkgZW5jb2RpbmcuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEJpbmFyeVRhZ2dlZERhdGFPdXRwdXQgOiBCaW5hcnlUYWdnZWREYXRhLCBUYWdnZWREYXRhT3V0cHV0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOYW1lIG9mIHVyaSBwYXJhbWV0ZXIgd2hpY2ggY29udHJvbHMgd2hldGhlciB3ZSB3cml0ZSBpbnRzIG9yIHN0cmluZ3MKKyAgICAgICAgLy8vIGZvciB0eXBlcyBhbmQgZmllbGRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIFNUUklOR19UWVBFX0FORF9GSUVMRCA9CisJCSAgICAiQmluYXJ5VGFnZ2VkRGF0YU91dHB1dC5zdHJpbmdUeXBlQW5kRmllbGQiOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIEJpbmFyeVRhZ2dlZERhdGFPdXRwdXQgd2l0aCBhIG51bGwgYnVmZmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZmIj50aGUgdmFsdWUgZmFjdG9yeSBmb3IgdGhlIHNlcnZpY2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPnRoZSB1cmkgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHRyYW5zcG9ydCBzdGFjay48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dChWYWx1ZUZhY3RvcnkgdmYsIHN0cmluZyB1cmkpCisgICAgICAgICAgICA6IGJhc2UodmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGV2ZWwgPSB2Zi5HZXRMZXZlbCgpOworICAgICAgICAgICAgVVJMIHUgPSBuZXcgVVJMKHVyaSk7CisgICAgICAgICAgICBzdHJpbmdUeXBlQW5kRmllbGQgPSB1LkdldEJvb2xlYW5UZXJtKFNUUklOR19UWVBFX0FORF9GSUVMRCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWxpZGF0b3IuTGV2ZWwgbGV2ZWw7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIHN0cmluZ1R5cGVBbmRGaWVsZDsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gVGFnZ2VkRGF0YU91dHB1dCBtZXRob2RzIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgICNyZWdpb24gVGFnZ2VkRGF0YU91dHB1dCBtZXRob2RzCisKKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVNZXNzYWdlKE1lc3NhZ2UgbXNnLCBGbGV4QnVmZmVyIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5idWYgPSBidWY7CisgICAgICAgICAgICAgICAgU3RhcnRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICAgICAgV3JpdGVLZXlzQW5kVmFsdWVzKG1zZyk7CisgICAgICAgICAgICAgICAgRW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuYnVmID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRmxleEJ1ZmZlciBidWY7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlU3RydWN0KFN0cnVjdFZhbHVlIHN2KQorICAgICAgICB7CisgICAgICAgICAgICBTdGFydFN0cnVjdChzdik7CisgICAgICAgICAgICBXcml0ZUtleXNBbmRWYWx1ZXMoc3YpOworICAgICAgICAgICAgRW5kU3RydWN0KHN2KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUFycmF5KEFycmF5VmFsdWUgYXYsIFZhbGlkYXRvciB2KQorICAgICAgICB7CisgICAgICAgICAgICBTdGFydEFycmF5KGF2KTsKKyAgICAgICAgICAgIFdyaXRlVmFsdWVzKGF2LCB2KTsKKyAgICAgICAgICAgIEVuZEFycmF5KGF2KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUtleXNBbmRWYWx1ZXMoU3RydWN0VmFsdWUgc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhUeXBlIHQgPSBzdi5HZXRYVHlwZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxGaWVsZCwgT2JqZWN0PiBtZSBpbiBzdikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWVsZCBmID0gbWUuS2V5OworICAgICAgICAgICAgICAgIFdyaXRlRmllbGQoZik7CisgICAgICAgICAgICAgICAgV3JpdGVWYWx1ZSh0LkdldFZhbGlkYXRvcihmKSwgbWUuVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFsdWVzKEFycmF5VmFsdWUgYXYsIFZhbGlkYXRvciB2KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0b3IgZXYgPSB2LkVsZW1lbnRWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKE9iamVjdCB2YWx1ZSBpbiBhdikKKyAgICAgICAgICAgICAgICBXcml0ZVZhbHVlKGV2LCB2YWx1ZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gTWFpbiBvdXRwdXQgbWV0aG9kcyAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj48L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFN0YXJ0TWVzc2FnZShNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2luY2UgbWVzc2FnZSBpcyB0b3AtbGV2ZWwsIG5vIHR5cGUgY29kZSBpcyB3cml0dGVuIHRvCisgICAgICAgICAgICAvLyBpbmRpY2F0ZSBhIG1lc3NhZ2UgaXMgc3RhcnRpbmcuIHdlIGRvIHdyaXRlIGEgdmVyc2lvbiBudW1iZXIKKyAgICAgICAgICAgIC8vIHRvIGluZGljYXRlIHRoaXMgdmVyc2lvbiBvZiB0aGUgYmluYXJ5IHRhZ2dlZCBkYXRhIG91dHB1dAorICAgICAgICAgICAgYnVmLlB1dEJ5dGUoVkVSU0lPTik7CisgICAgICAgICAgICBTdGFydFN0cnVjdChtc2cpOworICAgICAgICAgICAgLy8gICAgICAgV3JpdGVUeXBlKCBtc2cuR2V0WFR5cGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1zZyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHByaXZhdGUgdm9pZCBFbmRNZXNzYWdlKE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBFbmRTdHJ1Y3QobXNnKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3YiPjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBwcml2YXRlIHZvaWQgU3RhcnRTdHJ1Y3QoU3RydWN0VmFsdWUgc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgd3JpdHRlbiBhIHR5cGUgY29kZSB0byBpbmRpY2F0ZSBhCisgICAgICAgICAgICAvLyBzdHJ1Y3QgaXMgc3RhcnRpbmcuCisgICAgICAgICAgICBXcml0ZVR5cGUoc3YuR2V0WFR5cGUpOworICAgICAgICAgICAgV3JpdGVJbnRWYWx1ZShzdi5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdiI+PC9wYXJhbT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHByaXZhdGUgdm9pZCBFbmRTdHJ1Y3QoU3RydWN0VmFsdWUgc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlTm9uZVZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElMaXN0PFN0cnVjdFZhbHVlPiBzdHJ1Y3RzID0gbmV3IExpc3Q8U3RydWN0VmFsdWU+KCk7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFN0YXJ0QXJyYXkoQXJyYXlWYWx1ZSBhcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhlIGNhbGxlciBoYXMgYWxyZWFkeSB3cml0dGVuIGEgdHlwZSBjb2RlIHRvIGluZGljYXRlIGFuCisgICAgICAgICAgICAvLyBhcnJheSBpcyBzdGFydGluZy4KKyAgICAgICAgICAgIHNieXRlIHR5cGUgPSBhcnJheS5UeXBlOworICAgICAgICAgICAgYnVmLlB1dEJ5dGUodHlwZSk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBUeXBlQ29kZS5DVVNUT00pCisgICAgICAgICAgICAgICAgV3JpdGVUeXBlKGFycmF5LkN1c3RvbVN0cnVjdFR5cGUpOworICAgICAgICAgICAgV3JpdGVJbnRWYWx1ZShhcnJheS5EaW0pOworICAgICAgICAgICAgV3JpdGVJbnRWYWx1ZShhcnJheS5TaXplKCkpOworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVUeXBlKFhUeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmdUeXBlQW5kRmllbGQpCisgICAgICAgICAgICAgICAgV3JpdGVTdHJpbmdWYWx1ZSh0eXBlLk5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFdyaXRlSW50VmFsdWUodHlwZS5JZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVGaWVsZChGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZ1R5cGVBbmRGaWVsZCkKKyAgICAgICAgICAgICAgICBXcml0ZVN0cmluZ1ZhbHVlKGZpZWxkLk5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFdyaXRlSW50VmFsdWUoZmllbGQuSWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJyYXkiPjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBwcml2YXRlIHZvaWQgRW5kQXJyYXkoQXJyYXlWYWx1ZSBhcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVOb25lVmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUludFZhbHVlKGludCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYWx1ZShpbnRWYWxpZGF0b3IsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsaWRhdG9yIGludFZhbGlkYXRvciA9IFZhbGlkYXRvcl9pbnQuR2V0KDApOworCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVN0cmluZ1ZhbHVlKFN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYWx1ZShzdHJpbmdWYWxpZGF0b3IsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsaWRhdG9yIHN0cmluZ1ZhbGlkYXRvciA9IFZhbGlkYXRvcl9zdHJpbmcuR2V0KDApOworCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZU5vbmVWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFsdWUobm9uZVZhbGlkYXRvciwgTk9ORSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFZhbGlkYXRvciBub25lVmFsaWRhdG9yID0gVmFsaWRhdG9yX25vbmUuR2V0KCk7CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBMT0NBTCBVVElMSVRZIE1FVEhPRFMgLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgI3JlZ2lvbiBMb2NhbCBVdGlsaXR5IE1ldGhvZHMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2Ij50aGUgdmFsaWRhdG9yIGZvciB0aGlzIHZhbHVlLCBvciBub25lIGlmIHRoZXJlCisgICAgICAgIC8vLyBpc24ndCBvbmU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFsdWUoVmFsaWRhdG9yIHYsIE9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc2J5dGUgdHlwZUNvZGUgPSBDaGVja1ZhbHVlKHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKGxldmVsICE9IFZhbGlkYXRvci5MZXZlbC5OT05FICYmIHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IFZhbGlkYXRvci5MZXZlbC5GVUxMICYmIHYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWxpZGF0b3IgbWlzc2luZyIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgIXYuVmFsaWRhdGUodmFsdWUpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIFN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAidmFsaWRhdG9yIHswfSBmYWlsZWQgZm9yIHZhbHVlIHsxfSIsIHYsIHZhbHVlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1Zi5QdXRCeXRlKHR5cGVDb2RlKTsKKworICAgICAgICAgICAgc3dpdGNoICh0eXBlQ29kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLk5VTEw6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5CT09MRUFOX0ZBTFNFOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuQk9PTEVBTl9UUlVFOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuRU1QVFlfU1RSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuTk9ORToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5CWVRFOgorICAgICAgICAgICAgICAgICAgICBidWYuUHV0Qnl0ZSgoQ29udmVydC5Ub1NCeXRlKHZhbHVlKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgYnVmLlB1dFNob3J0KENvbnZlcnQuVG9JbnQxNih2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLklOVDoKKyAgICAgICAgICAgICAgICAgICAgYnVmLlB1dEludChDb252ZXJ0LlRvSW50MzIodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5MT05HOgorICAgICAgICAgICAgICAgICAgICBidWYuUHV0TG9uZyhDb252ZXJ0LlRvSW50NjQodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgYnVmLlB1dEZsb2F0KENvbnZlcnQuVG9TaW5nbGUodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5QdXREb3VibGUoQ29udmVydC5Ub0RvdWJsZSh2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkJZVEVTOgorICAgICAgICAgICAgICAgICAgICBXcml0ZUJ5dGVzKChzYnl0ZVtdKXZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgICAgICAvL2Nhc2UgVHlwZUNvZGUuQk9PTFM6CisgICAgICAgICAgICAgICAgLy9jYXNlIFR5cGVDb2RlLlNIT1JUUzoKKyAgICAgICAgICAgICAgICAvL2Nhc2UgVHlwZUNvZGUuSU5UUzoKKyAgICAgICAgICAgICAgICAvL2Nhc2UgVHlwZUNvZGUuTE9OR1M6CisgICAgICAgICAgICAgICAgLy9jYXNlIFR5cGVDb2RlLkZMT0FUUzoKKyAgICAgICAgICAgICAgICAvL2Nhc2UgVHlwZUNvZGUuRE9VQkxFUzoKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICBXcml0ZUFycmF5KFRvQXJyYXlWYWx1ZSh2YWx1ZSwgdiksIHYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVDb2RlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVCeXRlcyhFbmNvZGluZy5VVEY4LkdldEJ5dGVzKChTdHJpbmcpdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5DVVNUT006CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gdmYuRXhwb3J0Q3VzdG9tVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN2ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgdHlwZSAiICsgdmFsdWUuR2V0VHlwZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJ1Y3Qoc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGlzIGVpdGhlciAidGlueSIgaW50ZWdlciBvciB1bnVzZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVDb2RlID49IFR5cGVDb2RlLk1JTl9USU5ZX0lOVCAmJiB0eXBlQ29kZSA8PSBUeXBlQ29kZS5NQVhfVElOWV9JTlQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgdHlwZWNvZGUgIiArIHR5cGVDb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyBhIHZhbHVlIChzaWduZWQgb3IgdW5zaWduZWQpIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj50aGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCBzdHJlYW0uPC9wYXJhbT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZXMoc2J5dGVbXSB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSB2YWx1ZS5MZW5ndGg7CisgICAgICAgICAgICBXcml0ZUludFZhbHVlKG4pOworICAgICAgICAgICAgYnVmLlB1dCgoYnl0ZVtdKShBcnJheSl2YWx1ZSwgMCwgbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSB2YWx1ZSAoc2lnbmVkIG9yIHVuc2lnbmVkKSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+dGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGEgcHJvYmxlbSB3aXRoIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUJ5dGVzKGJ5dGVbXSB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSB2YWx1ZS5MZW5ndGg7CisgICAgICAgICAgICBXcml0ZUludFZhbHVlKG4pOworICAgICAgICAgICAgYnVmLlB1dCh2YWx1ZSwgMCwgbik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uIExvY2FsIHV0aWxpdHkgbWV0aG9kcworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvVmFsaWRhdG9yX25vbmUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvQmluYXJ5L1ZhbGlkYXRvcl9ub25lLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDVkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvQmluYXJ5L1ZhbGlkYXRvcl9ub25lLmNzCkBAIC0wLDAgKzEsNjggQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQuRm10LkJpbmFyeQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSB2YWxpZGF0b3IgZm9yIHRoZSBzcGVjaWFsIGVuZCBvZiBsaXN0IG1hcmtlciwKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3Jfbm9uZSA6IFZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3Jfbm9uZSBHZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHZhbGlkYXRvciA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yX25vbmUoKTsKKyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3I7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3Jfbm9uZSB2YWxpZGF0b3I7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gY29uc3RydWN0cyB0aGUgdmFsaWRhdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBWYWxpZGF0b3Jfbm9uZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vbm90aGluZyB0byBkbworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFZhbGlkYXRvciBFbGVtZW50VmFsaWRhdG9yKCkKKyAgICAgICAgeworICAgICAgICAKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigibm90IGFuIGFycmF5Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBWYWxpZGF0ZSggT2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IEJpbmFyeVRhZ2dlZERhdGEuTk9ORTsKKyAgICAgICAgfQorCisgICAgICAKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFZhbGlkYXRlVmFsdWUob2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVmFsaWRhdGUodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidmFsdWUgbm90IGFwcHJvcHJpYXRlIGZvciBub25lOiAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L0J5dGVUb1NieXRlQ29udmVydGVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L0J5dGVUb1NieXRlQ29udmVydGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGI2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvQnl0ZVRvU2J5dGVDb252ZXJ0ZXIuY3MKQEAgLTAsMCArMSw1NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0LkZtdAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ2xhc3MgdGhhdCBwcm92aWRlcyBtZXRob2RzIGZvciA6IAorICAgIC8vLyAxKSBDb252ZXJ0aW5nIGEgc2luZ2xlIHZhbHVlIGZyb20gYnl0ZSB0byBzYnl0ZS4KKyAgICAvLy8gMikgQ29udmVydGluZyBhIHNpbmdsZSB2YWx1ZSBmb3Igc2J5dGUgdG8gYnl0ZS4KKyAgICAvLy8gMykgQ29udmVydGluZyBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgdGhlIDIgYWJvdmUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ5dGVDb252ZXJ0ZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnRzIGEgYnl0ZSB2YWx1ZSB0byBhbiBzYnl0ZSB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzYnl0ZSBCeXRlVG9TYnl0ZSggYnl0ZSB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNieXRlIGNvbnZlcnRlZFZhbHVlID0gMDsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZSA+IDEyNyApCisgICAgICAgICAgICAgICAgY29udmVydGVkVmFsdWUgPSAoIHNieXRlICkgKCAxMjcgLSB2YWx1ZSApOworCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgU2J5dGVUb0J5dGUoIHNieXRlIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSBjb252ZXJ0ZWRWYWx1ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICggdmFsdWUgPCAwICkKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZSA9ICggYnl0ZSApICggMTI3IC0gdmFsdWUgKTsKKworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L1RhZ2dlZERhdGEuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvVGFnZ2VkRGF0YS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE5NWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L1RhZ2dlZERhdGEuY3MKQEAgLTAsMCArMSwyMDMgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQuRm10Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDb21tb24gaW50ZXJmYWNlIGZvciB2YXJpb3VzIHR5cGVzIG9mIHRhZ2dlZCBkYXRhIGlucHV0IGFuZCBvdXRwdXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgVGFnZ2VkRGF0YQorICAgIHsKKyAgICAgICAgcHVibGljIFRhZ2dlZERhdGEoKQorICAgICAgICB7IAorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgVGFnZ2VkRGF0YS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2ZiI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRhZ2dlZERhdGEoIFZhbHVlRmFjdG9yeSB2ZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudmYgPSB2ZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB2YWx1ZSBmYWN0b3J5IHRvIHVzZSBmb3IgdGFnZ2VkIGlucHV0IGFuZCBvdXRwdXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmY7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgdmFsdWUgZmFjdG9yeSB0byB1c2UgZm9yIHRhZ2dlZCBpbnB1dCBhbmQgb3V0cHV0LjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFZhbHVlRmFjdG9yeSBHZXRWYWx1ZUZhY3RvcnkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdmY7CisgICAgICAgIH0KKworCisgICAgICAgIHByb3RlY3RlZCBBcnJheVZhbHVlIFRvQXJyYXlWYWx1ZSggT2JqZWN0IHZhbHVlLCBWYWxpZGF0b3IgdiApCisgICAgICAgIHsKKworICAgICAgICAgICAgVHlwZSBjID0gdmFsdWUuR2V0VHlwZSgpOworICAgICAgICAgICAgaW50IGRpbSA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICggYy5Jc0FycmF5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaW0rKzsKKyAgICAgICAgICAgICAgICBjID0gYy5HZXRFbGVtZW50VHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBub3cgd2Ugd2FudCB0aGUgdHlwZSBjb2RlIGZvciBjLCBhbmQgaWYgdGhlIHR5cGUgY29kZSBpcyBjdXN0b20sCisgICAgICAgICAgICAvLyB3ZSdsbCBhbHNvIHdhbnQgdGhlIHN0cnVjdCB0eXBlIGNvZGUuCisKKyAgICAgICAgICAgIHNieXRlIHR5cGVDb2RlID0gR2V0TmF0aXZlVHlwZUNvZGUoIGMgKTsKKworICAgICAgICAgICAgWFR5cGUgY3VzdG9tU3RydWN0VHlwZTsKKyAgICAgICAgICAgIGlmICh0eXBlQ29kZSA9PSBUeXBlQ29kZS5DVVNUT00gfHwgdHlwZUNvZGUgPT0gVHlwZUNvZGUuU1RSVUNUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1c3RvbVN0cnVjdFR5cGUgPSBHZXRDdXN0b21TdHJ1Y3RUeXBlKGMpOworCisgICAgICAgICAgICAgICAgaWYgKGN1c3RvbVN0cnVjdFR5cGUgPT0gbnVsbCAmJiBjID09IHR5cGVvZihTdHJ1Y3RWYWx1ZSkpCisJCQkgICAgeworCQkJCSAgICBWYWxpZGF0b3JfU3RydWN0VmFsdWUgeCA9IEZpbmRTdHJ1Y3RWYWx1ZVZhbGlkYXRvciggdiApOworICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU3RydWN0VHlwZSA9IHguR2V0WFR5cGUoKTsKKwkJCSAgICB9CisJCQkKKwkJCWlmIChjdXN0b21TdHJ1Y3RUeXBlID09IG51bGwgKQorCQkJCXRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiIEluIHRhZ2dlZCBEYXRhIiApOworICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjdXN0b21TdHJ1Y3RUeXBlID0gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheVZhbHVlKCB2YWx1ZSwgdHlwZUNvZGUsIGN1c3RvbVN0cnVjdFR5cGUsIGRpbSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3JfU3RydWN0VmFsdWUgRmluZFN0cnVjdFZhbHVlVmFsaWRhdG9yKCBWYWxpZGF0b3IgdiApCisJICAgIHsKKwkJICAgIGlmICh2IGlzIFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSkKKwkJCXJldHVybiAoVmFsaWRhdG9yX1N0cnVjdFZhbHVlKSB2OworCQkKKwkJICAgIGlmICh2IGlzIENvbWJvVmFsaWRhdG9yKQorCQkgICAgeworCQkJICAgIENvbWJvVmFsaWRhdG9yIHggPSAoQ29tYm9WYWxpZGF0b3IpIHY7CisJCQkgICAgVmFsaWRhdG9yX1N0cnVjdFZhbHVlIHkgPSBGaW5kU3RydWN0VmFsdWVWYWxpZGF0b3IoIHguQSgpICk7CisJCQkKKwkJCSAgICBpZiAoeSAhPSBudWxsKQorCQkJCSAgICByZXR1cm4geTsKKwkJCQorCQkgICAgCSByZXR1cm4gRmluZFN0cnVjdFZhbHVlVmFsaWRhdG9yKCB4LkIoKSApOworCQkgICAgfQorCQkKKwkJICAgIHJldHVybiBudWxsOworCSAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBGcm9tQXJyYXlWYWx1ZSggQXJyYXlWYWx1ZSBhdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhdi5HZXRBcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBBbGxvY2F0ZUFycmF5VmFsdWUoIHNieXRlIHR5cGVDb2RlLCBYVHlwZSBjdXN0b21TdHJ1Y3RUeXBlLAorICAgICAgICAgICAgaW50IGRpbSwgaW50IGxlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGUgY2xzcyA9IEdldENvbXBvbmVudFR5cGUoIHR5cGVDb2RlLCBjdXN0b21TdHJ1Y3RUeXBlLCBkaW0gKTsKKyAgICAgICAgICAgIGlmICggY2xzcyA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBnZXQgYXJyYXkgZm9yIHswfSwgezF9LCB7Mn0iLAorICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwgY3VzdG9tU3RydWN0VHlwZSwgZGltKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBBcnJheS5DcmVhdGVJbnN0YW5jZSggY2xzcywgbGVuZ3RoICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFR5cGUgR2V0Q29tcG9uZW50VHlwZSggc2J5dGUgdHlwZUNvZGUsIFhUeXBlIGN1c3RvbVN0cnVjdFR5cGUsIGludCBkaW0gKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlIGM7CisgICAgICAgICAgICBpZiAodHlwZUNvZGUgPT0gVHlwZUNvZGUuQ1VTVE9NIHx8IHR5cGVDb2RlID09IFR5cGVDb2RlLlNUUlVDVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBjID0gR2V0Q3VzdG9tVHlwZSggY3VzdG9tU3RydWN0VHlwZSApOworICAgICAgICAgICAgICAgIGMgPSBjdXN0b21TdHJ1Y3RUeXBlLkdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjID0gdHlwZW9mIChTdHJ1Y3RWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYyA9IEdldE5hdGl2ZVR5cGUodHlwZUNvZGUpOworICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSggImMgPSAiICsgYyApOworICAgICAgICAgICAgaWYgKCBjID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpZiAoIGRpbSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKworICAgICAgICAgICAgaW50W10gZGltczsKKworICAgICAgICAgICAgd2hpbGUgKCBkaW0gPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaW1zID0gbmV3IGludFsgZGltIF07CisgICAgICAgICAgICAgICAgaWYgKCBkaW0gPiAxICkKKyAgICAgICAgICAgICAgICAgICAgYyA9IGMuTWFrZUFycmF5VHlwZSgpOworICAgICAgICAgICAgICAgIGRpbS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL09iamVjdCBvID0gQXJyYXkuQ3JlYXRlSW5zdGFuY2UoIGMsIDEgKTsKKworICAgICAgICAgICAgLy9jID0gKCAoIEFycmF5ICkgbyApLkdldFR5cGUoKTsKKyAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoICJ0eXBlPSAiK2MgKTsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgdHlwZSBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLiBUaGlzCisJICAgIC8vLyBpcyBuZWVkZWQgd2hlbiB3ZSBoYXZlIGFuIGFycmF5IGFuZCB3ZSBoYXZlIGRldGVybWluZQorCSAgICAvLy8gdGhlIGJhc2UgdHlwZSBhbmQgbm93IHdlJ3JlIGZpeGluZyB0byBzZXJpYWxpemUgaXQuCisJICAgIC8vLyBXZSB1c2UgdGhlIGJhc2UgdHlwZSBjb2RlIHRvIHJlY29uc3RpdHV0ZSBpdCBvbiB0aGUKKwkgICAgLy8vIG90aGVyIHNpZGUuIFNvIHdlIGRvbid0IHJldHVybiBhIHBlcmZlY3QgY29kZSB0aGUgd2F5CisJICAgIC8vLyBjaGVja1ZhbHVlIGRvZXMsIGJ1dCByYXRoZXIganVzdCBzb21ldGhpbmcgdGhhdCBsZXQncworCSAgICAvLy8gdXMgcmVjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGFycmF5IHR5cGUgb24gaW1wb3J0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImMiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIHR5cGUgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy48L3JldHVybnM+CisgICAgICAgIGFic3RyYWN0IHB1YmxpYyBzYnl0ZSBHZXROYXRpdmVUeXBlQ29kZSggVHlwZSBjICk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgc3RydWN0IHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY3VzdG9tIGNsYXNzLjwvcmV0dXJucz4KKyAgICAgICAgYWJzdHJhY3QgcHVibGljIFhUeXBlIEdldEN1c3RvbVN0cnVjdFR5cGUoIFR5cGUgYyApOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgY2xhc3MgZm9yIGEgc3BlY2lmaWVkIChuYXRpdmUpIHR5cGUgY29kZS48L3JldHVybnM+CisgICAgICAgIGFic3RyYWN0IHB1YmxpYyBUeXBlIEdldE5hdGl2ZVR5cGUoIHNieXRlIHR5cGUgKTsKKworICAgICAgICAKKworICAgICAgICBhYnN0cmFjdCBwdWJsaWMgc2J5dGUgQ2hlY2tWYWx1ZSggT2JqZWN0IHZhbHVlICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L1R5cGVDb2RlLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm10L1R5cGVDb2RlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWZmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9GbXQvVHlwZUNvZGUuY3MKQEAgLTAsMCArMSwxODUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydC5GbXQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbHVlcyBkZW5vdGluZyB0eXBlcyBvZiBlbmNvZGVkIHZhbHVlcy4gVGhlcmUgYXJlIHR3byB2YWx1ZSByYW5nZXM6CisgICAgLy8vIAorICAgIC8vLyAgLTEyOCB0byAtNjU6IGNvZGVzIGZvciBkZWZpbmVkIHR5cGVzLgorICAgIC8vLyAtNjQgdG8gMTI3OiB0aW55IGludGVnZXIgdmFsdWVzLgorICAgIC8vLyAgICAgICAgICAgIAorICAgIC8vLyBUaW55IGludGVnZXJzIGFyZSBjb21wbGV0ZWx5IGVuY29kZWQgd2l0aGluIHRoZSB0eXBlIGJ5dGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVHlwZUNvZGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhIG51bGwgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBOVUxMID0gLTEyODsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3Rpbmcgbm8gdmFsdWUuIAorICAgICAgICAvLy8gRm9yIGV4YW1wbGUsIGFuIGFycmF5IGlzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIChzb21lIG9mIHdoaWNoIG1heQorCSAgICAvLy8gYmUgTlVMTCksIHRlcm1pbmF0ZWQgYnkgYSBOT05FLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgTk9ORSA9IC0xMjc7CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3RpbmcgYSBmYWxzZSBib29sZWFuIHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgQk9PTEVBTl9GQUxTRSA9IC0xMjY7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBjb2RlIGRlbm90aW5nIGEgdHJ1ZSBib29sZWFuIHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgQk9PTEVBTl9UUlVFID0gLTEyNTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3RpbmcgYSBzaWduZWQgY29uc3Qgc2J5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBCWVRFID0gLTEyNDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3RpbmcgYSBzaW5nbGUgY29uc3Qgc2J5dGUgc2lnbmVkIHNob3J0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgU0hPUlQgPSAtMTIzOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhIGZvdXIgc2J5dGUgc2lnbmVkIGludGVnZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBJTlQgPSAtMTIyOworICAgICAgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3RpbmcgYW4gZWlnaHQgY29uc3Qgc2J5dGUgc2lnbmVkIGxvbmcsIGxzYiBmaXJzdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IHNieXRlIExPTkcgPSAtMTIxOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhIGZvdXIgY29uc3Qgc2J5dGUgaWVlZSBmbG9hdGluZyBmb3JtYXQgbnVtYmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgRkxPQVQgPSAtMTIwOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhbiBlaWdodCBjb25zdCBzYnl0ZSBpZWVlIGZsb2F0aW5nIGZvcm1hdCBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBET1VCTEUgPSAtMTE5OworCisgICAgICAgIC8vLy8gQXJyYXlzIC8vLy8vCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBjb2RlIGRlbm90aW5nIGFuIGFycmF5IG9mIGJvb2xlYW5zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvL3B1YmxpYyBjb25zdCBzYnl0ZSBCT09MUyA9IC0xMTg7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBjb2RlIGRlbm90aW5nIGFuIGFycmF5IG9mIGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgQllURVMgPSAtMTE3OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhbiBhcnJheSBvZiBzaG9ydHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vcHVibGljIGNvbnN0IHNieXRlIFNIT1JUUyA9IC0xMTY7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBjb2RlIGRlbm90aW5nIGFuIGFycmF5IG9mIGludHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vcHVibGljIGNvbnN0IHNieXRlIElOVFMgPSAtMTE1OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhbiBhcnJheSBvZiBsb25ncy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy9wdWJsaWMgY29uc3Qgc2J5dGUgTE9OR1MgPSAtMTE0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhbiBhcnJheSBvZiBzaW5nbGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvL3B1YmxpYyBjb25zdCBzYnl0ZSBGTE9BVFMgPSAtMTEzOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhbiBhcnJheSBvZiBkb3VibGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvL3B1YmxpYyBjb25zdCBzYnl0ZSBET1VCTEVTID0gLTExMjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3RpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBBUlJBWSA9IC0xMTE7CisKKworICAgICAgICAvLy8vIHN0cmluZ3MgLy8vLy8KKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBFTVBUWV9TVFJJTkcgPSAtMTEwOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29kZSBkZW5vdGluZyBhIHV0Zi04IGVuY29kZWQgc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgU1RSSU5HID0gLTEwOTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3RpbmcgYSBjdXN0b20gdmFsdWUgKHN0cnVjdCwgZXhjZXB0aW9uLCBlbnVtLCBleHRlcm4pCisJICAgIC8vLyBmcm9tIGEgdmFsdWUgZmFjdG9yeS4gQW4gYXNzb2NpYXRlZCB2YWx1ZSBpZGVudGlmaWVzIHRoZSBzcGVjaWZpYworCSAgICAvLy8gdHlwZS4gVGhlIGZvcm1hdCBvbiB0aGUgd2lyZSBvZiBTVFJVQ1QgYW5kIENVU1RPTSBhcmUgdGhlIHNhbWUuCisJICAgIC8vLyBFbWl0IENVU1RPTSBpbnN0ZWFkIG9mIFNUUlVDVCwgYW5kIGFjY2VwdCBTVFJVQ1QgYXMgaWYgaXQgd2VyZQorCSAgICAvLy8gQ1VTVE9NLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgU1RSVUNUID0gLTEwODsKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBjb2RlIGRlbm90aW5nIGEgY3VzdG9tIHZhbHVlIChzdHJ1Y3QsIGV4Y2VwdGlvbiwgZW51bSwgZXh0ZXJuKQorICAgICAgICAvLy8gZnJvbSBhIHZhbHVlIGZhY3RvcnkuIEFuIGFzc29jaWF0ZWQgdmFsdWUgaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMKKyAgICAgICAgLy8vIHR5cGUuIFRoZSBmb3JtYXQgb24gdGhlIHdpcmUgb2YgU1RSVUNUIGFuZCBDVVNUT00gYXJlIHRoZSBzYW1lLgorICAgICAgICAvLy8gRW1pdCBDVVNUT00gaW5zdGVhZCBvZiBTVFJVQ1QsIGFuZCBhY2NlcHQgU1RSVUNUIGFzIGlmIGl0IHdlcmUKKyAgICAgICAgLy8vIENVU1RPTS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IHNieXRlIENVU1RPTSA9IC0xMDc7CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGNvZGUgZGVub3RpbmcgdGhhdCBhbnkgdmFsdWUgaXMgb2sgKGFzIGxvbmcgYXMgd2Uga25vdyBob3cKKyAgICAgICAgLy8vIHRvIHNlcmlhbGl6ZSBpdCkuIER5bmFtaWMgbWV0aG9kcyBzaG91bGQgYmUgYXBwbGllZCB0byBkZXRlcm1pbmUKKyAgICAgICAgLy8vIHRoZSB0eXBlLiBUaGlzIHR5cGUgbmV2ZXIgYXBwZWFycyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IHNieXRlIEFOWSA9IC0xMDY7CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gdGlueSBpbnRlZ2VycyAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1pbmltdW0gInNtYWxsIiBpbnRlZ2VyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc2J5dGUgTUlOX1RJTllfSU5UID0gLTY0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1heGltdW0gInNtYWxsIiBpbnRlZ2VyLiBTbWFsbCBpbnRlZ2VycyBhcmUgZW5jb2RlZCBhc2lzCisgICAgICAgIC8vLyAod2l0aCBlbWJlZGRlZCB0eXBlIGNvZGUpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBNQVhfVElOWV9JTlQgPSAxMjc7CisKKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvRm9ybWF0RmFjdG9yeS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0Zvcm1hdEZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4ZmVkNgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L0Zvcm1hdEZhY3RvcnkuY3MKQEAgLTAsMCArMSwxMDEgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtYXRGYWN0b3J5CisgICAgeworCSAgICBwdWJsaWMgY29uc3QgU3RyaW5nIEJJTkFSWSA9ICJiaW5hcnkiOworICAgIAkKKwkgICAgcHVibGljIGNvbnN0IFN0cmluZyBYTUwgPSAieG1sIjsKKwkKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmYiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIHRhZ2dlZCBkYXRhIGlucHV0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBmYWN0b3J5IGFuZAorICAgICAgICAvLy8gaW5pdGlhbGl6ZWQgYnkgdGVybXMgZnJvbSB0aGUgdXJpLjwvcmV0dXJucz4KKyAgICAgICAgYWJzdHJhY3QgcHVibGljIFRhZ2dlZERhdGFJbnB1dCBOZXdUYWdnZWREYXRhSW5wdXQoIFZhbHVlRmFjdG9yeSB2Ziwgc3RyaW5nIHVyaSApOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZmIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSB0YWdnZWQgZGF0YSBvdXRwdXQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGZhY3RvcnkgYW5kCisgICAgICAgIC8vLyBpbml0aWFsaXplZCBieSB0ZXJtcyBmcm9tIHRoZSB1cmkuPC9yZXR1cm5zPgorICAgICAgICBhYnN0cmFjdCBwdWJsaWMgVGFnZ2VkRGF0YU91dHB1dCBOZXdUYWdnZWREYXRhT3V0cHV0KCBWYWx1ZUZhY3RvcnkgdmYsIHN0cmluZyB1cmkgKTsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBEaWN0aW9uYXJ5PFN0cmluZywgT2JqZWN0PiBmb3JtYXRGYWN0b3JpZXMgPSBuZXcgRGljdGlvbmFyeTxTdHJpbmcsIE9iamVjdD4oKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBuYW1lZCBmb3JtYXQgZmFjdG9yeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj50aGUgbmFtZSBvZiBhIGNvbmZpZ3VyZWQgZm9ybWF0IGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBuYW1lZCBmb3JtYXQgZmFjdG9yeSwgb3IgbnVsbCBpZiBpdCBpc24ndCBkZWZpbmVkLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBGb3JtYXRGYWN0b3J5IEdldCggU3RyaW5nIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3QgZmFjdG9yeSA9IGZvcm1hdEZhY3Rvcmllc1tuYW1lXTsKKworICAgICAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5IGlzIHN0cmluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFR5cGUgYyA9IFR5cGUuR2V0VHlwZSgoc3RyaW5nKSBmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IEFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZShjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmFjdG9yeSBpcyBGb3JtYXRGYWN0b3J5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuRm9ybWF0KCIgSW5zdGFuY2UgZm9yIGZvcm1hdCBuYW1lIHswfSBkb2VzIG5vdCBpbXBsZW1lbnQgRm9ybWF0RmFjdG9yeSB7MX0iLCBuYW1lLCBmYWN0b3J5KSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAvLyAgIGZvcm1hdEZhY3Rvcmllcy5BZGQobmFtZSxmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIiBDb3VsZCBub3QgY3JlYXRlIGluc3RhbmNlIG9mIGZvcm1hdCBuYW1lICIgKyBuYW1lLGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgcmV0dXJuIChGb3JtYXRGYWN0b3J5KSBmYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHV0cyBhIG5hbWVkIGZvcm1hdCBmYWN0b3J5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPnRoZSB1cmkgc2NoZW1lIG9mIHRoaXMgZm9ybWF0IGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmYWN0b3J5Ij50aGVmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciBpbnN0YW5jZQorICAgICAgICAvLy8gb2YgdGhlIEZvcm1hdEZhY3RvcnkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5hbWU8L3BhcmFtPgorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUHV0KCBTdHJpbmcgbmFtZSwgT2JqZWN0IGZhY3RvcnkgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JtYXRGYWN0b3JpZXMuQWRkKCBuYW1lLCBmYWN0b3J5ICk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgRm9ybWF0RmFjdG9yeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB1dChCSU5BUlksICJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydC5GbXQuQmluYXJ5LkJpbmFyeVRhZ2dlZERhdGFGb3JtYXRGYWN0b3J5Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9NYWlsYm94TWFuYWdlci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L01haWxib3hNYW5hZ2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDkyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9NYWlsYm94TWFuYWdlci5jcwpAQCAtMCwwICsxLDUzIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBNYWlsYm94TWFuYWdlciA6IFRyYW5zcG9ydE1lc3NhZ2UsIFNlc3Npb25NZXNzYWdlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmVzIHRoZSBtYWlsYm94IGZyb20gdGhlIHNldCBvZiBtYWlsYm94IHJlY2VpdmluZyByZXNwb25zZXMKKyAgICAgICAgLy8vIHRvIG1lc3NhZ2VzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWIiPjwvcGFyYW0+CisgICAgICAgIAorICAgICAgICB2b2lkIFVucmVnaXN0ZXIoTWFpbGJveCBtYik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVkZWxpdmVycyBkZWZ1bmN0IG1lc3NhZ2VzIGZyb20gYSBjbG9zZWQgbWFpbGJveC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj48L3BhcmFtPgorCisgICAgICAgIHZvaWQgUmVkZWxpdmVyKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCZWdpbiBhIGNhbGwgc2VxdWVuY2UgYW5kIHJldHVybiB0aGUgbWFpbGJveCB3aGljaCB3aWxsIHJlY2VpdmUgdGhlCisgICAgICAgIC8vLyByZXNwb25zZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZWNpcGllbnQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBNYWlsYm94IFRyYW5zcG9ydENhbGwoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L01lc3NhZ2l6ZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9NZXNzYWdpemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOWY5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9NZXNzYWdpemVyLmNzCkBAIC0wLDAgKzEsMTk3IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNZXNzYWdpemVyIGlzIGEgUGFja2V0SGFuZGxlciB3aGljaCBhY2NlcHRzIHBhY2tldHMgZnJvbQorICAgIC8vLyBhIFBhY2tldFNvdXJjZSBhbmQgdHVybnMgdGhlbSBpbnRvIG1lc3NhZ2VzIGZvciBkZWxpdmVyeQorICAgIC8vLyB0byBhIE1lc3NhZ2VIYW5kbGVyLiBNZXNzYWdpemVyIGlzIGFsc28gYSBNZXNzYWdlU291cmNlLAorICAgIC8vLyBhY2NlcHRpbmcgbWVzc2FnZXMgYW5kIHR1cm5pbmcgdGhlbSBpbnRvIHBhY2tldHMgZm9yIGRlbGl2ZXJ5CisgICAgLy8vIHRvIGEgUGFja2V0U291cmNlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIE1lc3NhZ2l6ZXIgOiBUcmFuc3BvcnRNZXNzYWdlLCBTZXNzaW9uUGFja2V0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOYW1lIG9mIGZvcm1hdCBuYW1lIGluIHVyaSBvciByZXNvdXJjZXMuIFRoZSB2YWx1ZSBpcyAiTWVzc2FnaXplci5mb3JtYXQiLgorICAgICAgICAvLy8gVGhlIHJlc3VsdCBvZiBsb29raW5nIHVwIHRoaXMgbmFtZSBzaG91bGQgYmUgYSBTdHJpbmcuCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJNZXNzYWdpemVyKFRyYW5zcG9ydFBhY2tldCwgVVJMLCBSZXNvdXJjZXMpIi8+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgRk9STUFUID0gIk1lc3NhZ2l6ZXIuZm9ybWF0IjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBNZXNzYWdpemVyIGFzIGEgc2Vzc2lvbiBvZiB0cmFuc3BvcnQgdXNpbmcgdXJpIGFuZCByZXNvdXJjZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHJhbnNwb3J0Ij51c2VkIHRvIGRlbGl2ZXIgcGFja2V0cyB0byB0aGUgcGVlci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+dGhlIHVyaSBiZWluZyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IHN0YWNrLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzb3VyY2VzIj50aGUgYXNzb2NpYXRlZCBzZXQgb2YgcmVzb3VyY2VzIGZvciB0aGlzIHNlcnZpY2UuPC9wYXJhbT4gICAgICAKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNZXNzYWdpemVyKFRyYW5zcG9ydFBhY2tldCB0cmFuc3BvcnQsIHN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgIAk6IHRoaXModHJhbnNwb3J0LCBuZXcgVVJMKHVyaSksIHJlc291cmNlcykKKyAgICAgICAgeworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBNZXNzYWdpemVyIGFzIGEgc2Vzc2lvbiBvZiB0cmFuc3BvcnQgdXNpbmcgdXJpIGFuZCByZXNvdXJjZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHJhbnNwb3J0Ij51c2VkIHRvIGRlbGl2ZXIgcGFja2V0cyB0byB0aGUgcGVlci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+dGhlIHVyaSBiZWluZyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IHN0YWNrLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzb3VyY2VzIj50aGUgYXNzb2NpYXRlZCBzZXQgb2YgcmVzb3VyY2VzIGZvciB0aGlzIHNlcnZpY2UuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIE1lc3NhZ2l6ZXIoVHJhbnNwb3J0UGFja2V0IHRyYW5zcG9ydCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZmluZCB0aGUgZm9ybWF0LgorCisgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKworICAgICAgICAgICAgU3RyaW5nIGZvcm1hdCA9IHVyaS5HZXRUZXJtKEZPUk1BVCwgRm9ybWF0RmFjdG9yeS5CSU5BUlkpOworCisgICAgICAgICAgICAvLyBmaW5kIHRoZSBmb3JtYXQgZmFjdG9yeS4KKworICAgICAgICAgICAgRm9ybWF0RmFjdG9yeSBmZiA9IEZvcm1hdEZhY3RvcnkuR2V0KCBmb3JtYXQgKTsKKyAgICAgICAgICAgIGlmICggZmYgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoICJmb3JtYXQgZmFjdG9yeSBpcyBub3QgZGVmaW5lZCBhcyAnezB9JyBpbiBmb3JtYXQgZmFjdG9yaWVzIiwgZm9ybWF0ICkgKTsKKworICAgICAgICAgICAgLy8gZmluZCB0aGUgdmFsdWUgZmFjdG9yeS4KKworICAgICAgICAgICAgVmFsdWVGYWN0b3J5IHZmID0gKCBWYWx1ZUZhY3RvcnkgKSByZXNvdXJjZXMuR2V0KCBUcmFuc3BvcnRDb25zdHMuVkFMVUVfRkFDVE9SWSApOworICAgICAgICAgICAgaWYgKCB2ZiA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlIGZhY3RvcnkgaXMgbm90IGRlZmluZWQgYXMgJ3swfScgaW4gcmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0Q29uc3RzLlZBTFVFX0ZBQ1RPUlkpKTsKKworICAgICAgICAgICAgdGRpID0gZmYuTmV3VGFnZ2VkRGF0YUlucHV0KCB2ZiwgdXJpLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIHRkbyA9IGZmLk5ld1RhZ2dlZERhdGFPdXRwdXQoIHZmLCB1cmkuVG9TdHJpbmcoKSApOworCisgICAgICAgICAgICB0cmFuc3BvcnQuU2V0U2Vzc2lvbih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAKKyAgICAgICAgLy8gcHJpdmF0ZSByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmY7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGFnZ2VkRGF0YUlucHV0IHRkaTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUYWdnZWREYXRhT3V0cHV0IHRkbzsKKyAgICAgICAgcHJpdmF0ZSBUcmFuc3BvcnRQYWNrZXQgdHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIFNlc3Npb25NZXNzYWdlIHNlc3Npb247CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJNZXNzYWdpemVyIDogezB9IiwgdHJhbnNwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUcmFuc3BvcnRQYWNrZXQgR2V0VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgICAgICAgfQorCisgICAgICAgCisKKyAgICAgICAgCisKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZsZXhCdWZmZXIgbXNnQnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKworICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBTZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLlNlc3Npb25RdWVyeSggcXVlcnkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Db250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uQ29udHJvbCggY29udHJvbCwgdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudE9iaiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlc3Npb24uU2Vzc2lvbk5vdGlmeSggZXZlbnRPYmogKTsKKyAgICAgICAgfQorCisgICAgICAgIAorCisgICAgICAgIHB1YmxpYyBPYmplY3QgVHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuVHJhbnNwb3J0UXVlcnkoIHF1ZXJ5ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydENvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudE9iaiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnROb3RpZnkoIGV2ZW50T2JqICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydE1lc3NhZ2UgTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIFNldFNlc3Npb24oU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZSBHZXRTZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE1lc3NhZ2UoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKworICAgICAgICAgICAgLy8gcGFja2V0aXplIHRoZSBtZXNzYWdlLgorCisgICAgICAgICAgICBsb2NrIChtc2dCdWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnQgdGhhdCBtc2dCdWYgaXMgcmVzZXQuCisgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIHNwYWNlIGZvciB0aGUgcGFja2V0IGhlYWRlcgorICAgICAgICAgICAgICAgICAgICBtc2dCdWYuU2tpcCh0cmFuc3BvcnQuSGVhZGVyU2l6ZSgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdGRvLldyaXRlTWVzc2FnZShtc2csIG1zZ0J1Zik7CisgICAgICAgICAgICAgICAgICAgIG1zZ0J1Zi5TZXRJbmRleCgwKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydFBhY2tldChyZWNpcGllbnQsbXNnQnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnQnVmLlJlc2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFNlc3Npb25QYWNrZXQgTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25QYWNrZXQoV2hvIHNlbmRlciwgRmxleEJ1ZmZlciBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gdGRpLlJlYWRNZXNzYWdlKGJ1Zik7CisgICAgICAgICAgICBib29sIGhhbmRsZWQgPSBzZXNzaW9uLlNlc3Npb25NZXNzYWdlKHNlbmRlcixtc2cpOworICAgICAgICAgICAgaWYgKCFoYW5kbGVkKQorICAgICAgICAgICAgICAgIHNlc3Npb24uU2Vzc2lvbk5vdGlmeShuZXcgVW53YW50ZWRNZXNzYWdlKHNlbmRlcixtc2cpKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9QbGFpbk1haWxib3guY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9QbGFpbk1haWxib3guY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3MDg2MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L1BsYWluTWFpbGJveC5jcwpAQCAtMCwwICsxLDI3NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBwbGFpbiBpbXBsZW1lbnRhdGlvbiBvZiBhIG1haWxib3ggdXNpbmcgYSBmaXhlZCBzaXplIGNpcmN1bGFyIHF1ZXVlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIAorICAgIHB1YmxpYyBjbGFzcyBQbGFpbk1haWxib3ggOiBNYWlsYm94LCBBbGFybUxpc3RlbmVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBQbGFpbk1haWxib3gKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYWlsYm94TWFuYWdlciI+VGhlIG1haWxib3ggbWFuYWdlciB0byB1c2UgdG8gdW5yZWdpc3RlciB0aGlzIG1haWxib3gKKyAgICAgICAgLy8vIGFuZCB0byBkZWxpdmVyIHVuZGVsaXZlcmVkIG1lc3NhZ2VzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZUlkIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgUGxhaW5NYWlsYm94KE1haWxib3hNYW5hZ2VyIG1haWxib3hNYW5hZ2VyLCBsb25nIG1lc3NhZ2VJZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1haWxib3hNYW5hZ2VyID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxSZWZlcmVuY2VFeGNlcHRpb24oIm1haWxib3hNYW5hZ2VyID09IG51bGwiKTsKKworICAgICAgICAgICAgdGhpcy5tYWlsYm94TWFuYWdlciA9IG1haWxib3hNYW5hZ2VyOworICAgICAgICAgICAgdGhpcy5tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7CisKKyAgICAgICAgICAgIHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8RWxlbWVudD4oMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1haWxib3hNYW5hZ2VyIG1haWxib3hNYW5hZ2VyOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9uZyBtZXNzYWdlSWQ7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBDaXJjdWxhclF1ZXVlPEVsZW1lbnQ+IHF1ZXVlOworCisgICAgICAgIHByaXZhdGUgYm9vbCBhbGFybVNldDsKKworICAgICAgICBwcml2YXRlIE5vdGlmeSBub3RpZnk7CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3Qgc3RhdGU7CisKKyAgICAgICAgcHVibGljIE1haWxib3hNYW5hZ2VyIEdldE1haWxib3hNYW5hZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1haWxib3hNYW5hZ2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgR2V0TWVzc2FnZUlkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VJZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbmRlciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtc2ciPjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgYm9vbCBNZXNzYWdlKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIG9rID0gcXVldWUuUHV0KG5ldyBFbGVtZW50KHNlbmRlciwgbXNnKSwgLTEpOworICAgICAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgICAgIGZpcmVOb3RpZnkoKTsKKyAgICAgICAgICAgIHJldHVybiBvazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmaXJlTm90aWZ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgTm90aWZ5IG47CisgICAgICAgICAgICBPYmplY3QgczsKKyAgICAgICAgICAgIGJvb2wgYzsKKworICAgICAgICAgICAgbG9jayAocXVldWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbiA9IG5vdGlmeTsKKyAgICAgICAgICAgICAgICBzID0gc3RhdGU7CisgICAgICAgICAgICAgICAgYyA9IHF1ZXVlLklzQ2xvc2VkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuICE9IG51bGwpCisgICAgICAgICAgICAgICAgbi5tYWlsYm94U3RhdHVzKHRoaXMsIHMsIGMpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgICAgcHVibGljIEVsZW1lbnQgUmVhZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnQgZWxlbSA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbGVtID0gcXVldWUuR2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlbGVtOworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heERlbGF5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93IFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBFbGVtZW50IFJlYWQoaW50IG1heERlbGF5KQorICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50IGVsZW0gPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWxlbSA9IHF1ZXVlLkdldChtYXhEZWxheSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlbGVtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ2xvc2VEZWxpdmVyeSgpCisgICAgICAgIHsKKworCisgICAgICAgICAgICBsb2NrIChxdWV1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWUuSXNDbG9zZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisKKyAgICAgICAgICAgICAgICBpZiAoYWxhcm1TZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbGFybVNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBBbGFybU1hbmFnZXIuc3RhdGljUmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYWlsYm94TWFuYWdlci5VbnJlZ2lzdGVyKHRoaXMpOworICAgICAgICAgICAgICAgIHF1ZXVlLkNsb3NlKCk7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBmaXJlTm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgYm9vbCBDbG9zZVJlYWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ2xvc2VEZWxpdmVyeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgbWJlOworICAgICAgICAgICAgICAgIHdoaWxlICgobWJlID0gUmVhZCgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBtYWlsYm94TWFuYWdlci5SZWRlbGl2ZXIobWJlLnNlbmRlciwgbWJlLm1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB9CisKKworCisgICAgICAgIHB1YmxpYyBpbnQgV2FrZXVwKEFsYXJtTWFuYWdlciBtYW5hZ2VyLCBPYmplY3Qgc3RhdGUsIGxvbmcgZHVlKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCIgSW4gd2FrZXVwIik7CisgICAgICAgICAgICBDbG9zZURlbGl2ZXJ5KCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyTm90aWZ5KE5vdGlmeSBuZXdOb3RpZnksIE9iamVjdCBzdGF0ZSwgaW50IG1heERlbGF5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmV3Tm90aWZ5ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigibmV3Tm90aWZ5ID09IG51bGwiKTsKKworICAgICAgICAgICAgaWYgKG1heERlbGF5IDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIm1heERlbGF5IDwgMCIpOworCisgICAgICAgICAgICBib29sIGlzTm90RW1wdHlPcklzQ2xvc2VkOworCisgICAgICAgICAgICBsb2NrIChxdWV1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5ub3RpZnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGhpcy5ub3RpZnkgIT0gbnVsbCIpOworCisgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnkgPSBuZXdOb3RpZnk7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworCisgICAgICAgICAgICAgICAgaWYgKG1heERlbGF5ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsYXJtU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgQWxhcm1NYW5hZ2VyLnN0YXRpY0FkZCh0aGlzLCBudWxsLCBtYXhEZWxheSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaXNOb3RFbXB0eU9ySXNDbG9zZWQgPSAhcXVldWUuSXNFbXB0eSgpIHx8IHF1ZXVlLklzQ2xvc2VkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc05vdEVtcHR5T3JJc0Nsb3NlZCkKKyAgICAgICAgICAgICAgICBmaXJlTm90aWZ5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBVbnJlZ2lzdGVyTm90aWZ5KE5vdGlmeSBvbGROb3RpZnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvbGROb3RpZnkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJvbGROb3RpZnkgPT0gbnVsbCIpOworCisgICAgICAgICAgICBpZiAodGhpcy5ub3RpZnkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGxvY2sgKHF1ZXVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChvbGROb3RpZnkgIT0gdGhpcy5ub3RpZnkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigib2xkTm90aWZ5ICE9IHRoaXMubm90aWZ5Iik7CisKKyAgICAgICAgICAgICAgICBpZiAoYWxhcm1TZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbGFybVNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBBbGFybU1hbmFnZXIuc3RhdGljUmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzRW1wdHkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcXVldWUuSXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNDbG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcXVldWUuSXNDbG9zZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzRnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBxdWV1ZS5Jc0Z1bGwoKTsKKyAgICAgICAgfQorCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9QbGFpbk1haWxib3hNYW5hZ2VyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvUGxhaW5NYWlsYm94TWFuYWdlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjExYzVkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvUGxhaW5NYWlsYm94TWFuYWdlci5jcwpAQCAtMCwwICsxLDI2OSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNYWlsYm94TWFuYWdlciBpcyBhIE1lc3NhZ2VIYW5kbGVyIHdoaWNoIGFjY2VwdHMgcGFja2V0cyBmb3IKKyAgICAvLy8gcG9zc2libGUgZGVsaXZlcnkgdG8gYSBtYWlsYm94LCBvciB0byBhbm90aGVyIG1lc3NhZ2UgaGFuZGxlcgorICAgIC8vLyBpZiBhbiBhcHByb3ByaWF0ZSBtYWlsYm94IGNhbm5vdCBiZSBmb3VuZC4gTWFpbGJveE1hbmFnZXIgaXMKKyAgICAvLy8gZm9yd2FyZGluZyB0aGVtIHRvIGFub3RoZXIgTWVzc2FnZVNvdXJjZS4gSWYgcmVxdWVzdGVkLCBhCisgICAgLy8vIG1haWxib3ggaXMgY3JlYXRlZCB3aXRoIGEgbWVzc2FnZSdzIG1zZ2lkIGFuZCBhZGRlZCB0byB0aGUKKyAgICAvLy8gc2V0IG9mIG1haWxib3hlcyB3YWl0aW5nIGZvciBtZXNzYWdlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBQbGFpbk1haWxib3hNYW5hZ2VyIDogTWFpbGJveE1hbmFnZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIFBsYWluTWFpbGJveE1hbmFnZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHJhbnNwb3J0Ij5hIHRyYW5zcG9ydCB0byBzZW5kIG1lc3NhZ2VzIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpIj50aGUgdXJpIG9mIHRoaXMgdHJhbnNwb3J0IHN0YWNrPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZXNvdXJjZXMiPnRoZSByZXNvdXJjZXMgb2YgdGhpcyB0cmFuc3BvcnQgc3RhY2s8L3BhcmFtPgorICAgICAgICBwdWJsaWMgUGxhaW5NYWlsYm94TWFuYWdlcihUcmFuc3BvcnRNZXNzYWdlIHRyYW5zcG9ydCwgc3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgICAgIDogdGhpcyh0cmFuc3BvcnQsIG5ldyBVUkwodXJpKSwgcmVzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIGVsc2UuCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBQbGFpbk1haWxib3hNYW5hZ2VyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRyYW5zcG9ydCI+YSB0cmFuc3BvcnQgdG8gc2VuZCBtZXNzYWdlcyA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+dGhlIHVyaSBvZiB0aGlzIHRyYW5zcG9ydCBzdGFjazwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzb3VyY2VzIj50aGUgcmVzb3VyY2VzIG9mIHRoaXMgdHJhbnNwb3J0IHN0YWNrPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFBsYWluTWFpbGJveE1hbmFnZXIoVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICAgICAgdHJhbnNwb3J0LlNldFNlc3Npb24odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRyYW5zcG9ydE1lc3NhZ2UgdHJhbnNwb3J0OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZvcm1hdCggIlBsYWluTWFpbGJveE1hbmFnZXIvezB9ICIsIHRyYW5zcG9ydCApOworICAgICAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHJlYWRvbmx5IElkR2VuZXJhdG9yIGlkR2VuID0gbmV3IElkR2VuZXJhdG9yKCBEYXRlVGltZS5Ob3cuVGlja3MsIDM3ICk7CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIE1haWxib3ggbWV0aG9kcyAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8bG9uZywgTWFpbGJveD4gbWFpbGJveGVzID0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGxvbmcsIE1haWxib3g+KCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIG1haWxib3ggdG8gdGhlIHNldCBvZiBtYWlsYm94IHJlY2VpdmluZyByZXNwb25zZXMKKyAgICAgICAgLy8vIHRvIG1lc3NhZ2VzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1iIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlciggTWFpbGJveCBtYiApCisJICAgIHsKKyAgICAgICAgICAgIGxvbmcgbXNnaWQgPSBtYi5HZXRNZXNzYWdlSWQoKTsKKwkJICAgIGxvY2sgKG1haWxib3hlcykKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXVwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiY29ubmVjdGlvbiBkb3duIik7CisKKwkJCSAgICBpZiAobWFpbGJveGVzLkNvbnRhaW5zS2V5KCBtc2dpZCApKQorCQkJCSAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJkdXAgbXNnaWQgaW4gbWFpbGJveGVzIiApOworICAgIAkJCQorCQkJICAgIG1haWxib3hlcy5BZGQoIG1zZ2lkLCBtYiApOworCQkgICAgfQorCSAgICB9CisgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIFVucmVnaXN0ZXIoIE1haWxib3ggbWIgKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrICggbWFpbGJveGVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYWlsYm94ZXMuUmVtb3ZlKCBtYi5HZXRNZXNzYWdlSWQoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNYWlsYm94IEdldE1haWxib3goIGxvbmcgbXNnaWQgKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrICggbWFpbGJveGVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFpbGJveGVzW21zZ2lkXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIFJlZGVsaXZlciggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSAKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTWVzc2FnZShzZW5kZXIsIG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IFNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24uU2Vzc2lvblF1ZXJ5KCBxdWVyeSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25Db250cm9sKCBjb250cm9sLCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50T2JqICkKKyAgICAgICAgeworICAgICAgICAgICBpZihldmVudE9iai5FcXVhbHMoU2Vzc2lvbkNvbnN0cy5VUCkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHVwID0gdHJ1ZTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlIGlmIChldmVudE9iai5FcXVhbHMoU2Vzc2lvbkNvbnN0cy5ET1dOKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgdXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgIFVuUmVnaXN0ZXJBbGwoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTm90aWZ5KGV2ZW50T2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCB1cDsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IFRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LlRyYW5zcG9ydFF1ZXJ5KCBxdWVyeSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnRDb250cm9sKCBjb250cm9sLCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Tm90aWZ5KCBPYmplY3QgZXZlbnRPYmogKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuVHJhbnNwb3J0Tm90aWZ5KCBldmVudE9iaiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVW5SZWdpc3RlckFsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1haWxib3hbXSBtYnM7CisgICAgICAgICAgICBsb2NrIChtYWlsYm94ZXMpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1icyA9IG5ldyBNYWlsYm94W21haWxib3hlcy5WYWx1ZXMuQ291bnRdOworICAgICAgICAgICAgICAgIG1haWxib3hlcy5WYWx1ZXMuQ29weVRvKG1icywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoIChNYWlsYm94IG1iIGluIG1icykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYi5DbG9zZURlbGl2ZXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgICNyZWdpb24gU2Vzc2lvbk1lc3NhZ2UgTWVtYmVycworCisgICAgICAgIHB1YmxpYyBib29sIFNlc3Npb25NZXNzYWdlKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nPyBtc2dpZCA9IG1zZy5JblJlcGx5VG87CisgICAgICAgICAgICBpZiAobXNnaWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYWlsYm94IG1iOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWIgPSBHZXRNYWlsYm94KG1zZ2lkLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1iID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1iICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1iLk1lc3NhZ2Uoc2VuZGVyLCBtc2cpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dCBvciBtYWlsYm94IGNsb3NlZCAtIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIG5vIHN1Y2ggbWFpbGJveCAtIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vIHN1Y2ggbWFpbGJveCBvciBubyBtc2dpZCAtIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24uU2Vzc2lvbk1lc3NhZ2Uoc2VuZGVyLCBtc2cpOworCisgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBNYWlsYm94TWFuYWdlciBNZW1iZXJzCisKKworICAgICAgICBwdWJsaWMgTWFpbGJveCBUcmFuc3BvcnRDYWxsKFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobXNnLk1lc3NhZ2VJZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIiBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gc2VudCIpOworICAgICAgICAgICAgaWYgKG1zZy5JblJlcGx5VG8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCIgbWVzc2FnZSBpcyBtYXJrZWQgYXMgYSByZXBseSIpOworCisgICAgICAgICAgICBsb25nIG1pZCA9IGlkR2VuLk5leHQoKTsKKworICAgICAgICAgICAgbXNnLk1lc3NhZ2VJZCA9IG1pZDsKKyAgICAgICAgICAgIE1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIG1pZCk7CisgICAgICAgICAgICBSZWdpc3RlcihtYik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZShyZWNpcGllbnQsIG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVbnJlZ2lzdGVyKG1iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1iOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVHJhbnNwb3J0TWVzc2FnZSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0TWVzc2FnZShXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydE1lc3NhZ2UocmVjaXBpZW50LG1zZyk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnQ8U2Vzc2lvbk1lc3NhZ2U+IE1lbWJlcnMKKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNldFNlc3Npb24oU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZSBHZXRTZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvU2Vzc2lvbk1lc3NhZ2UuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9TZXNzaW9uTWVzc2FnZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGYzMjkzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvU2Vzc2lvbk1lc3NhZ2UuY3MKQEAgLTAsMCArMSwyOSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbk1lc3NhZ2UgOiBTZXNzaW9uCisgICAgeworICAgICAgICBib29sIFNlc3Npb25NZXNzYWdlKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9UYWdnZWREYXRhSW5wdXQuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9UYWdnZWREYXRhSW5wdXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjOTQwZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L1RhZ2dlZERhdGFJbnB1dC5jcwpAQCAtMCwwICsxLDM4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PkEgVGFnZ2VkRGF0YUlucHV0U3RyZWFtIHJlYWRzIHR5cGUgdGFnZ2VkIHZhbHVlcyBmcm9tIGFuIGlucHV0IHN0cmVhbS48L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUYWdnZWREYXRhSW5wdXQKKyAgICB7CisgICAgICAgCisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyBhIG1lc3NhZ2UgZnJvbSB0aGUgYnVmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+YSBtZXNzYWdlIHJlYWQgZnJvbSB0aGUgYnVmLjwvcmV0dXJucz4KKyAgICAgICAgTWVzc2FnZSBSZWFkTWVzc2FnZShGbGV4QnVmZmVyIGJ1Zik7CisKKyAgICAgIAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9UYWdnZWREYXRhT3V0cHV0LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvVGFnZ2VkRGF0YU91dHB1dC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODZmOGM0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvVGFnZ2VkRGF0YU91dHB1dC5jcwpAQCAtMCwwICsxLDM5IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIFRhZ2dlZERhdGFPdXRwdXRTdHJlYW0gd3JpdGVzIHR5cGUgdGFnZ2VkIGRhdGEgdmFsdWVzIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRhZ2dlZERhdGFPdXRwdXQKKyAgICB7CisgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyB0aGUgbWVzc2FnZSB0byB0aGUgYnVmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1zZyI+dGhlIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbjwvcGFyYW0+CisgICAgICAgIHZvaWQgV3JpdGVNZXNzYWdlKE1lc3NhZ2UgbXNnLCBGbGV4QnVmZmVyIG1zZ0J1Zik7CisKKyAgICAgICAgCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L1RjcFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9UY3BUcmFuc3BvcnRGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MjFhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9UY3BUcmFuc3BvcnRGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMTcwIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIFRjcExpc3RlbmVyPU9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbC5UY3BMaXN0ZW5lcjsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUcmFuc3BvcnRGYWN0b3J5IGZvciB0Y3AgY29ubmVjdGlvbnMgYW5kIGxpc3RlbmVycy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUY3BUcmFuc3BvcnRGYWN0b3J5IDogVHJhbnNwb3J0RmFjdG9yeQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIFRjcFRyYW5zcG9ydEZhY3Rvcnkgd2hpY2ggZGVsaXZlcnMgVGNwQ29ubmVjdGlvbiBvciBhCisgICAgICAgIC8vLyBUbHNDb25uZWN0aW9uIGRlcGVuZGluZyB1cG9uIHRoZSBpc1NlY3VyZSBwYXJhbWV0ZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNTZWN1cmUiPnRydWUgaWYgVGxzQ29ubmVjdGlvbiBpcyBkZXNpcmVkLCBmYWxzZSBvdGhlcndpc2U8L3BhcmFtPgorICAgICAgICBwdWJsaWMgVGNwVHJhbnNwb3J0RmFjdG9yeShib29sIGlzU2VjdXJlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlzU2VjdXJlID0gaXNTZWN1cmU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgaXNTZWN1cmU7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIGNvbnN0IFN0cmluZyBTT0NLRVQgPSAiVGNwVHJhbnNwb3J0RmFjdG9yeS5zb2NrZXQiOworCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUcmFuc3BvcnRNZXNzYWdlIE5ld1RyYW5zcG9ydChzdHJpbmcgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICBVUkwgdSA9IG5ldyBVUkwodXJpKTsKKworICAgICAgICAgICAgT2JqZWN0IHNvY2tldCA9IHJlc291cmNlcy5HZXQoU09DS0VUKTsKKworICAgICAgICAgICAgVHJhbnNwb3J0RGF0YSBjOworCisgICAgICAgICAgICBpZiAoaXNTZWN1cmUpCisgICAgICAgICAgICAgICAgYyA9IG5ldyBUbHNDb25uZWN0aW9uKChTb2NrZXQpc29ja2V0LCB1LCByZXNvdXJjZXMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGMgPSBuZXcgVGNwQ29ubmVjdGlvbigoU29ja2V0KXNvY2tldCwgdSwgcmVzb3VyY2VzKTsKKworICAgICAgICAgICAgVHJhbnNwb3J0UGFja2V0IHAgPSBuZXcgUGFja2V0aXplcihjLCB1LCByZXNvdXJjZXMpOworCisgICAgICAgICAgICBUcmFuc3BvcnRNZXNzYWdlIG0gPSBuZXcgTWVzc2FnaXplcihwLCB1LCByZXNvdXJjZXMpOworCisgICAgICAgICAgICBtID0gQWRkRmlsdGVycyhtLCB1LCByZXNvdXJjZXMpOworCisgICAgICAgICAgICAvL01haWxib3hNYW5hZ2VyIHIgPSBuZXcgUGxhaW5NYWlsYm94TWFuYWdlcihtLCB1LCByZXNvdXJjZXMpOworCisgICAgICAgICAgICAvL0RlbGl2ZXJ5U2VydmljZSBkID0gbmV3IERlZmF1bHREZWxpdmVyeVNlcnZpY2UociwgdSwgcmVzb3VyY2VzKTsKKworICAgICAgICAgICAgVmFsdWVGYWN0b3J5IHZmID0gKFZhbHVlRmFjdG9yeSkgcmVzb3VyY2VzLkdldChUcmFuc3BvcnRDb25zdHMuVkFMVUVfRkFDVE9SWSk7CisgICAgICAgICAgICB2Zi5Mb2NrRHluYW1pY1R5cGVzKCk7CisKKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBOZXdMaXN0ZW5lciggc3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zcG9ydDxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Pj4gbCA9IG5ldyBUY3BMaXN0ZW5lcih1cmksIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15U2Vzc2lvbkxpc3RlbmVyKHRoaXMsIGwsIHVyaSwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeVNlc3Npb25MaXN0ZW5lciA6IFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiwgU2Vzc2lvbkxpc3RlbmVyPFNvY2tldD4KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIE15U2Vzc2lvbkxpc3RlbmVyKFRjcFRyYW5zcG9ydEZhY3RvcnkgdHRmLCBUcmFuc3BvcnQ8U2Vzc2lvbkxpc3RlbmVyPFNvY2tldD4+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnR0ZiA9IHR0ZjsKKyAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKKworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5TZXRTZXNzaW9uKHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRjcFRyYW5zcG9ydEZhY3RvcnkgdHRmOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUcmFuc3BvcnQ8U2Vzc2lvbkxpc3RlbmVyPFNvY2tldD4+IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHVyaTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVzb3VyY2VzIHJlc291cmNlczsKKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJUY3BUcmFuc3BvcnRGYWN0b3J5Lk15U2Vzc2lvbkxpc3RlbmVyLyIgKyB0cmFuc3BvcnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25BY2NlcHRlZChTb2NrZXQgc29ja2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlc291cmNlcyByID0gbmV3IFJlc291cmNlcyhyZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIHIuQWRkKFNPQ0tFVCwgc29ja2V0KTsKKworICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeSB2ZiA9IHNlc3Npb24uTmV3VmFsdWVGYWN0b3J5KHVyaSk7CisgICAgICAgICAgICAgICAgci5BZGQoVHJhbnNwb3J0Q29uc3RzLlZBTFVFX0ZBQ1RPUlksIHZmKTsKKworICAgICAgICAgICAgICAgIFRyYW5zcG9ydE1lc3NhZ2UgdCA9IHR0Zi5OZXdUcmFuc3BvcnQodXJpLCByKTsKKworICAgICAgICAgICAgICAgIHNlc3Npb24uTmV3U2VydmVyKHQsIHVyaSwgcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+IE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBUcmFuc3BvcnRRdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5UcmFuc3BvcnRRdWVyeShxdWVyeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydENvbnRyb2wob2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuVHJhbnNwb3J0Q29udHJvbChjb250cm9sLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeShvYmplY3QgZXZlbnRPYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydE5vdGlmeShldmVudE9iaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXJ2ZXJGYWN0b3J5IEdldFNlc3Npb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlcnZlckZhY3Rvcnkgc2Vzc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIFNlcnZlckZhY3Rvcnkgc2Vzc2lvbjsKKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb24gTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFNlc3Npb25RdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24uU2Vzc2lvblF1ZXJ5KHF1ZXJ5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2wob2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25Db250cm9sKGNvbnRyb2wsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeShvYmplY3QgZXZlbnRPYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTm90aWZ5KGV2ZW50T2JqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvVHJhbnNwb3J0TWVzc2FnZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L1RyYW5zcG9ydE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiYTIyZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVHJhbnNwb3J0L1RyYW5zcG9ydE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwyOSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0TWVzc2FnZSA6IFRyYW5zcG9ydDxTZXNzaW9uTWVzc2FnZT4KKyAgICB7CisgICAgICAgIHZvaWQgVHJhbnNwb3J0TWVzc2FnZShXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvVW53YW50ZWRNZXNzYWdlLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9UcmFuc3BvcnQvVW53YW50ZWRNZXNzYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGIzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1RyYW5zcG9ydC9VbndhbnRlZE1lc3NhZ2UuY3MKQEAgLTAsMCArMSw0NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRXZlbnQgY2xhc3MgdXNlZCB3aXRoIFNlc3Npb25Ob3RpZnkgdG8gcmVwb3J0IHVud2FudGVkIG1lc3NhZ2VzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFVud2FudGVkTWVzc2FnZQorICAgIHsKKyAgICAgICAgcHVibGljIFVud2FudGVkTWVzc2FnZShXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisgICAgICAgICAgICB0aGlzLm1zZyA9IG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyByZWFkb25seSBXaG8gc2VuZGVyOworCisgICAgICAgIHB1YmxpYyByZWFkb25seSBNZXNzYWdlIG1zZzsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoIlVud2FudGVkIG1lc3NhZ2UgZnJvbSB7MH06IHsxfSIsIHNlbmRlciwgbXNnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9BYnN0cmFjdFN0YXJ0YWJsZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9BYnN0cmFjdFN0YXJ0YWJsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjZkOTRjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0Fic3RyYWN0U3RhcnRhYmxlLmNzCkBAIC0wLDAgKzEsMTA0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgU3RhcnRhYmxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RTdGFydGFibGUgOiBTdGFydGFibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAodGhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoSXNTdGFydGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImlzIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICAgICAgICAgIFNldFN0YXJ0ZWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhcnQwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0b3AoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrICh0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrSXNTdGFydGVkKCk7CisgICAgICAgICAgICAgICAgU2V0U3RvcHBlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdG9wMCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIHN0YXJ0ZWQ7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFN0YXJ0ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIFNldFN0b3BwZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFydGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc1N0YXJ0ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENoZWNrIHRoYXQgdGhlIHN0YXJ0YWJsZSBpcyBzdGFydGVkCisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgbm90IHN0YXJ0ZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgdm9pZCBDaGVja0lzU3RhcnRlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghSXNTdGFydGVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiaXMgbm90IHN0YXJ0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgU3RhcnQwKCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBTdG9wMCgpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0FsYXJtTGlzdGVuZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvQWxhcm1MaXN0ZW5lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2IzMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0FsYXJtTGlzdGVuZXIuY3MKQEAgLTAsMCArMSw2NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDbGFzc2VzIHdhbnRpbmcgYWxhcm1zIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIHJlY2VpdmUgdGhlCisgICAgLy8vIGFsYXJtLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBBbGFybUxpc3RlbmVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXBvcnRzIHRoYXQgdGhlIGxpc3RlbmVyJ3MgYWxhcm0gd2VudCBvZmYuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYW5hZ2VyIj50aGUgbWFuYWdlciBvZiB0aGUgYWxhcm0uPC9wYXJhbT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0YXRlIj5hIGJpdCBvZiBzdGF0ZSBmb3IgdGhlIGxpc3RlbmVyLjwvcGFyYW0+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkdWUiPmR1ZSB0aGUgdGltZSB0aGUgYWxhcm0gd2FzIHNldCB0byBnbyBvZmYuIFRoaXMgaXMgaW4gdGhlCisgICAgICAgIC8vLyB0aW1lIGNvb3JkaW5hdGVzIGFzIHJldHVybmVkIGJ5IFRpbWVyLkdldE5hbm9zKCkuPC9wYXJhbT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPHJldHVybnM+CisgICAgICAgIC8vLyB0aGUgcG9zaXRpdmUgb3IgbmVnYXRpdmUgc25vb3plIHRpbWUgaW4gbXMgZm9yIHRoaXMgYWxhcm0sCisgICAgICAgIC8vLyBvciAwIHRvIHNodXRvZmYgdGhlIGFsYXJtLiBJZiBhIHBvc2l0aXZlIG51bWJlciBpcyByZXR1cm5lZCwgaXQgaXMKKyAgICAgICAgLy8vIGFkZGVkIHRvIHRoZSBjdXJyZW50IGR1ZSB0aW1lIG9mIHRoZSBhbGFybSB0byBjYWxjdWxhdGUgdGhlIG5ldworICAgICAgICAvLy8gZHVlIHRpbWUgZm9yIHRoZSBhbGFybS4gVGh1cyB0aGVyZSBzaG91bGQgYmUgdmVyeSBsaXR0bGUgZHJpZnQKKyAgICAgICAgLy8vIGluIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGFsYXJtcyAoYWx0aG91Z2ggdGhlcmUgaXMgc29tZSBiZWNhdXNlCisgICAgICAgIC8vLyBvZiBzeXN0ZW0gY2xvY2sgaml0dGVyKS4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gSWYgdGhlIHN5c3RlbSBpcyB2ZXJ5IGJ1c3ksIG9yIGlmIHRoZSBsaXN0ZW5lcnMgYXJlIHRyeWluZyB0bworICAgICAgICAvLy8gZG8gdG9vIG11Y2gsIGFsYXJtcyBtYXkgbm90IGJlIHByb2Nlc3NlZCBxdWlja2x5IGVub3VnaCBhbmQKKyAgICAgICAgLy8vIGNhbGN1bGF0ZWQgbmV3IGR1ZSB0aW1lcyB3aWxsIGFscmVhZHkgYmUgaW4gdGhlIHBhc3QuIFRoaXMgaXMgYQorICAgICAgICAvLy8gcGF0aG9sb2dpY2FsIGNvbmRpdGlvbiB3aGljaCB3aWxsIHNwaXJhbCBvdXQgb2YgY29udHJvbCBpZiBub3QKKyAgICAgICAgLy8vIGRldGVjdGVkLgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBJZiBhIG5lZ2F0aXZlIG51bWJlciBpcyByZXR1cm5lZCwgaXQgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBjdXJyZW50CisgICAgICAgIC8vLyB2YWx1ZSBvZiBUaW1lci5HZXROYW5vcygpIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IGR1ZSB0aW1lIGZvciB0aGUKKyAgICAgICAgLy8vIGFsYXJtLiAoSW4gdGhpcyBjYXNlLCBzdWJ0cmFjdGluZyB0aGUgbmVnYXRpdmUgbnVtYmVyIGlzIHRoZSBzYW1lCisgICAgICAgIC8vLyBhcyBhZGRpbmcgdGhlIGFic29sdXRlIHZhbHVlLi4uKQorICAgICAgICAvLy8gPC9yZXR1cm5zPgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8c2VlIGNyZWY9IlRpbWVyLkdldE5hbm9zKCkiLz4KKworCisgICAgICAgIGludCBXYWtldXAoIEFsYXJtTWFuYWdlciBtYW5hZ2VyLCBPYmplY3Qgc3RhdGUsIGxvbmcgZHVlICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0FsYXJtTWFuYWdlci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9BbGFybU1hbmFnZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmOGZjOAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9BbGFybU1hbmFnZXIuY3MKQEAgLTAsMCArMSw1NTcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSBhbGFybSBtYW5hZ2VyIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFsYXJtcy4KKyAgICAvLy8gQSBsaXN0ZW5lciBkZXNpcmluZyBhIHdha2V1cCBjYWxsIHNob3VsZCBhZGQgaXRzZWxmIHRvIHRoZSBtYW5hZ2VyCisgICAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCBkZWxheSBpbiBtaWxsaXNlY29uZHMuIFRoZSBsaXN0ZW5lciBtYXkgYmUgcmVtb3ZlZAorICAgIC8vLyBhdCBhbnkgdGltZS4gV2hlbiB0aGUgYWxhcm0gZ29lcyBvZmYsIHRoZSBsaXN0ZW5lciBtYXkgcmVzZXQgb3IgcmVtb3ZlCisgICAgLy8vIHRoZSBhbGFybS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBBbGFybU1hbmFnZXIgOiBBYnN0cmFjdFN0YXJ0YWJsZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiB0aG9zZSBnZXR0aW5nIHdha2V1cCBjYWxscy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsaXN0ZW5lciI+dGhlIHRhcmdldCBvZiB0aGUgd2FrZXVwIGNhbGwuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGF0ZSI+YSBiaXQgb2Ygc3RhdGUgZm9yIHRoZSBsaXN0ZW5lci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRlbGF5Ij50aGUgcG9zaXRpdmUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgd2FrZXVwIGNhbGwuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY0FkZChBbGFybUxpc3RlbmVyIGxpc3RlbmVyLCBPYmplY3Qgc3RhdGUsIGludCBkZWxheSkKKyAgICAgICAgeworICAgICAgICAgICAgR2V0QWxhcm1NYW5hZ2VyKHRydWUpLkFkZChsaXN0ZW5lciwgc3RhdGUsIGRlbGF5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIHNldCBvZiB0aG9zZSBnZXR0aW5nIHdha2V1cCBjYWxscy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsaXN0ZW5lciI+dGhlIHRhcmdldCBvZiB0aGUgd2FrZXVwIGNhbGwuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY1JlbW92ZShBbGFybUxpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICB7CisgICAgICAgICAgICBBbGFybU1hbmFnZXIgYW0gPSBHZXRBbGFybU1hbmFnZXIoZmFsc2UpOworICAgICAgICAgICAgaWYgKGFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgYW0uUmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHN0YXRpY2FsbHkgY29uZmlndXJlZCBhbGFybSBtYW5hZ2VyLCBjcmVhdGluZyBvbmUgaWYKKyAgICAgICAgLy8vIHNwZWNpZmllZCBhbmQgbm9uZSBleGlzdHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhcnRJdCI+aWYgdHJ1ZSwgd2UgcmVhbGx5IG5lZWQgb25lIGFuZCBpZiB0aGVyZSBpc24ndAorICAgICAgICAvLy8gb25lIHRoZW4gb25lIHNob3VsZCBiZSBzdGFydGVkLCBvdGhlcndpc2Ugb25lIHNob3VsZCBub3QgYmUgc3RhcnRlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5oZSBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQgYWxhcm0gbWFuYWdlciwgb3IgYSBuZXdseQorICAgICAgICAvLy8gY3JlYXRlZCBvbmUgaWYgdGhlcmUgaXMgbm9uZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWxhcm1NYW5hZ2VyIEdldEFsYXJtTWFuYWdlcihib29sIHN0YXJ0SXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbGFybU1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NrIChhbGFybU1hbmFnZXJTeW5jKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsYXJtTWFuYWdlciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0SXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFtLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGFybU1hbmFnZXIgPSBhbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGFsYXJtTWFuYWdlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgdGhlIHN0YXRpY2FsbHkgY29uZmlndXJlZCBhbGFybSBtYW5hZ2VyLCByZXR1cm5pbmcgdGhlIG9sZCBvbmUKKyAgICAgICAgLy8vIGlmIGFueS4gRG9uJ3QgZm9yZ2V0IHRvIHN0b3AgdGhlIG9sZCBvbmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3QWxhcm1NYW5hZ2VyIj5hIG5ldyBBbGFybU1hbmFnZXIgdG8gYmUgc3RhdGljYWxseSBhdmFpbGFibGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG9sZCBzdGF0aWNhbGx5IGF2YWlsYWJsZSBBbGFybU1hbmFnZXIuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIEFsYXJtTWFuYWdlciBTZXRBbGFybU1hbmFnZXIoQWxhcm1NYW5hZ2VyIG5ld0FsYXJtTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAoYWxhcm1NYW5hZ2VyU3luYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBbGFybU1hbmFnZXIgb2xkQWxhcm1NYW5hZ2VyID0gYWxhcm1NYW5hZ2VyOworICAgICAgICAgICAgICAgIGFsYXJtTWFuYWdlciA9IG5ld0FsYXJtTWFuYWdlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2xkQWxhcm1NYW5hZ2VyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlcjsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBPYmplY3QgYWxhcm1NYW5hZ2VyU3luYyA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBBbGFybU1hbmFnZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibldvcmtlcnMiPnRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdG8gY3JlYXRlIHRvIHByb2Nlc3MKKyAgICAgICAgLy8vIHdha2V1cHMuIE11c3QgYmUgPiAwIGFuZCA8IDEwMC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQWxhcm1NYW5hZ2VyKGludCBuV29ya2VycykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5Xb3JrZXJzIDw9IDAgfHwgbldvcmtlcnMgPj0gMTAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigibldvcmtlcnMgPD0gMCB8fCBuV29ya2VycyA+PSAxMDAiKTsKKworICAgICAgICAgICAgdGhpcy5uV29ya2VycyA9IG5Xb3JrZXJzOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gb25zdHJ1Y3RzIHRoZSBBbGFybU1hbmFnZXIgd2l0aCB0aGUgZGVmYXVsdCBudW1iZXIgb2Ygd29ya2Vycy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEFsYXJtTWFuYWdlcigpCisgICAgICAgICAgICA6IHRoaXMoREVGQVVMVF9OV09SS0VSUykKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBuV29ya2VyczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZGVmYXVsdCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgKDEpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgaW50IERFRkFVTFRfTldPUktFUlMgPSAxOworCisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgU3RhcnQwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xlYXJBbGFybXMoKTsKKyAgICAgICAgICAgIENsZWFyUXVldWUoKTsKKworICAgICAgICAgICAgd29ya2VyID0gbmV3IFRocmVhZFtuV29ya2Vyc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Xb3JrZXJzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29ya2VyW2ldID0gbmV3IFRocmVhZChydW4pOworICAgICAgICAgICAgICAgIHdvcmtlcltpXS5Jc0JhY2tncm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmtlcltpXS5TdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgVGhyZWFkW10gd29ya2VyOworCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFN0b3AwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xlYXJBbGFybXMoKTsKKyAgICAgICAgICAgIENsZWFyUXVldWUoKTsKKworICAgICAgICAgICAgbG9jayAodGhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlQWxsKHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Xb3JrZXJzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtlcltpXSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd29ya2VyW2ldLkpvaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgd29ya2VyW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIHRob3NlIGdldHRpbmcgd2FrZXVwIGNhbGxzLiBJZiB0aGUKKyAgICAgICAgLy8vIGxpc3RlbmVyIGlzIGFscmVhZHkgc2NoZWR1bGVkIGZvciBhIHdha2V1cCBjYWxsLCB0aGUgc2NoZWR1bGUgaXMKKyAgICAgICAgLy8vIGFkanVzdGVkLiBUaGVyZSBjYW4gb25seSBiZSBvbmUgb3V0c3RhbmRpbmcgd2FrZXVwIGNhbGwgcGVyIGxpc3RlbmVyLgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkIHNhZmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGlzdGVuZXIiPnRoZSB0YXJnZXQgb2YgdGhlIHdha2V1cCBjYWxsLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhdGUiPmEgYml0IG9mIHN0YXRlIGZvciB0aGUgbGlzdGVuZXIuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWxheSI+dGhlIHBvc2l0aXZlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHdha2V1cCBjYWxsLjwvcGFyYW0+CisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj50aHJvd3MgQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGRlbGF5IGlzIGxlc3MKKyAgICAgICAgLy8vIHRoYW4gb3IgZXF1YWwgdG8gMDwvZXhjZXB0aW9uPgorICAgICAgICBbTWV0aG9kSW1wbChNZXRob2RJbXBsT3B0aW9ucy5TeW5jaHJvbml6ZWQpXQorICAgICAgICBwdWJsaWMgdm9pZCBBZGQoQWxhcm1MaXN0ZW5lciBsaXN0ZW5lciwgT2JqZWN0IHN0YXRlLCBpbnQgZGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImxpc3RlbmVyIik7CisKKyAgICAgICAgICAgIGlmIChkZWxheSA8PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiZGVsYXkgPD0gMCIpOworCisgICAgICAgICAgICBDaGVja0lzU3RhcnRlZCgpOworCisgICAgICAgICAgICBsb25nIGR1ZSA9IEhQVGltZXIuTm93KCkgKyBkZWxheSAqIEhQVGltZXIuTlNfUEVSX01JTExJU0VDT05EOworCisgICAgICAgICAgICBBbGFybSBhbGFybSA9IEdldEFsYXJtKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmIChhbGFybSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGlzIGJlaW5nIGFkanVzdGVkCisgICAgICAgICAgICAgICAgRGVxdWV1ZShhbGFybSk7CisgICAgICAgICAgICAgICAgYWxhcm0uc2V0RHVlKGR1ZSk7CisgICAgICAgICAgICAgICAgYWxhcm0uc2V0U3RhdGUoc3RhdGUpOworICAgICAgICAgICAgICAgIEVucXVldWUoYWxhcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsYXJtID0gbmV3IEFsYXJtKGxpc3RlbmVyLCBzdGF0ZSwgZHVlKTsKKyAgICAgICAgICAgICAgICBBZGRBbGFybShsaXN0ZW5lciwgYWxhcm0pOworICAgICAgICAgICAgICAgIEVucXVldWUoYWxhcm0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOb3RpZnlXb3JrZXIoImFkZCIpOworICAgICAgICB9CisKKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFVwZGF0ZShBbGFybSBhbGFybSwgaW50IGRlbGF5KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGR1ZSA9IGRlbGF5ID4gMAorICAgICAgICAgICAgICAgID8gYWxhcm0uZ2V0RHVlKCkgKyBkZWxheSAqIEhQVGltZXIuTlNfUEVSX01JTExJU0VDT05ECisgICAgICAgICAgICAgICAgOiBIUFRpbWVyLk5vdygpIC0gZGVsYXkgKiBIUFRpbWVyLk5TX1BFUl9NSUxMSVNFQ09ORDsKKworICAgICAgICAgICAgYWxhcm0uc2V0RHVlKGR1ZSk7CisgICAgICAgICAgICBFbnF1ZXVlKGFsYXJtKTsKKyAgICAgICAgICAgIE5vdGlmeVdvcmtlcigidXBkYXRlIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmVzIGFueSBzY2hlZHVsZWQgd2FrZXVwIGNhbGwgZm9yIHRoaXMgbGlzdGVuZXIuCisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWQgc2FmZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsaXN0ZW5lciI+dGhlIHRhcmdldCBvZiB0aGUgd2FrZXVwIGNhbGwuPC9wYXJhbT4KKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKEFsYXJtTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrSXNTdGFydGVkKCk7CisKKyAgICAgICAgICAgIEFsYXJtIGFsYXJtID0gUmVtb3ZlQWxhcm0obGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKGFsYXJtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGVxdWV1ZShhbGFybSk7CisgICAgICAgICAgICAgICAgTm90aWZ5V29ya2VyKCJyZW1vdmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtNZXRob2RJbXBsKE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCldCisgICAgICAgIHByaXZhdGUgdm9pZCBSZW1vdmUoQWxhcm0gYWxhcm0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlbW92ZUFsYXJtKGFsYXJtLmxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXYWtldXAoQWxhcm0gYWxhcm0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBkZWxheSA9IGFsYXJtLmxpc3RlbmVyLldha2V1cCh0aGlzLCBhbGFybS5nZXRTdGF0ZSgpLCBhbGFybS5nZXREdWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRlbGF5ICE9IDApCisgICAgICAgICAgICAgICAgICAgIFVwZGF0ZShhbGFybSwgZGVsYXkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUmVtb3ZlKGFsYXJtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZW1vdmUoYWxhcm0pOworICAgICAgICAgICAgICAgIFJlcG9ydChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQWxhcm0gZ2V0TmV4dER1ZUFsYXJtKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gb2ssIHRoZSB3b3JrZXIgbmVlZHMgdG8gZ2V0IHRoZSBuZXh0IGR1ZSBhbGFybSBhbmQKKyAgICAgICAgICAgIC8vIHRoZW4gd2FpdCB1bnRpbCBpdHMgZHVlIHRpbWUsIHRoZW4gcmV0dXJuIGl0LiBpZiBhbGVydGVkCisgICAgICAgICAgICAvLyBieSBub3RpZnlXb3JrZXIsIGl0IHNob3VsZCByZWZyZXNoIHRoZSBuZXh0IGR1ZSBhbGFybS4KKyAgICAgICAgICAgIC8vIG9uZSB0cmljayB3aWxsIGJlIGluIGV4Y2x1ZGluZyBtdWx0aXBsZSB3b3JrZXJzIGZyb20KKyAgICAgICAgICAgIC8vIGNvbWluZyBpbiBoZXJlIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgICAgICBsb2NrIChnZXROZXh0RHVlQWxhcm1TeW5jKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2sgKHRoaXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8JCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1N0YXJ0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgQWxhcm0gYWxhcm0gPSBnZXRGaXJzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxhcm0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIiBXYWl0aW5nIGluIGdldE5leHREdWVBbGFybSAiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLldhaXQodGhpcywgSW50MzIuTWF4VmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIiBEb25lIFdhaXRpbmcgaW4gZ2V0TmV4dER1ZUFsYXJtICIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRlbGF5TnMgPSBhbGFybS5nZXREdWUoKSAtIEhQVGltZXIuTm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsYXlOcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRlbGF5ID0gZGVsYXlOcyAvIEhQVGltZXIuTlNfUEVSX01JTExJU0VDT05EOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsYXkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IChpbnQpZGVsYXk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLldhaXQodGhpcywgZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhbGFybSBiZWluZyByZXR1cm5lZCBoYXMgbm90IGJlZW4gcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhbGFybXNCeUxpc3RlbmVyLiBpdCBpcyBwcmVzdW1lZCB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxhcm0gd2lsbCBiZSBzZXQgYWdhaW4uIGlmIG5vdCwgaXQgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkLgorCisgICAgICAgICAgICAgICAgICAgICAgICBEZXF1ZXVlKGFsYXJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGFybTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT2JqZWN0IGdldE5leHREdWVBbGFybVN5bmMgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIE5vdGlmeVdvcmtlcihTdHJpbmcgcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICAvLwkJTG9nLnJlcG9ydCggIm5vdGlmeSIsICJ3aG8iLCB0aGlzLCAicmVhc29uIiwgcmVhc29uLCAid2hlcmUiLCBuZXcgVGhyb3dhYmxlKCkgKTsKKyAgICAgICAgICAgIC8vIHRoZSBzZXQgb2YgYWxhcm1zIGhhcyBjaGFuZ2VkLgorICAgICAgICAgICAgTW9uaXRvci5QdWxzZSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFsYXJtIGFsYXJtOworICAgICAgICAgICAgICAgIHdoaWxlICgoYWxhcm0gPSBnZXROZXh0RHVlQWxhcm0oKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdha2V1cChhbGFybSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlcG9ydChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBSZXBvcnQoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBbGFybSBHZXRBbGFybShBbGFybUxpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICB7CisgICAgICAgICAgICBBbGFybSBhbGFybTsKKyAgICAgICAgICAgIHJldHVybiBhbGFybXNCeUxpc3RlbmVyLlRyeUdldFZhbHVlKGxpc3RlbmVyLCBvdXQgYWxhcm0pID8gYWxhcm0gOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZEFsYXJtKEFsYXJtTGlzdGVuZXIgbGlzdGVuZXIsIEFsYXJtIGFsYXJtKQorICAgICAgICB7CisgICAgICAgICAgICBhbGFybXNCeUxpc3RlbmVyLkFkZChsaXN0ZW5lciwgYWxhcm0pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBbGFybSBSZW1vdmVBbGFybShBbGFybUxpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICB7CisgICAgICAgICAgICBBbGFybSBhbGFybSA9IEdldEFsYXJtKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmIChhbGFybSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFsYXJtc0J5TGlzdGVuZXIuUmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHJldHVybiBhbGFybTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDbGVhckFsYXJtcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsYXJtc0J5TGlzdGVuZXIuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxBbGFybUxpc3RlbmVyLCBBbGFybT4gYWxhcm1zQnlMaXN0ZW5lciA9IG5ldyBEaWN0aW9uYXJ5PEFsYXJtTGlzdGVuZXIsIEFsYXJtPigpOworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBBTEFSTVMgQlkgRFVFIFRJTUUgLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHJpdmF0ZSBBbGFybSBnZXRGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbGFybXMuQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIGFsYXJtc1swXTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBFbnF1ZXVlKEFsYXJtIGFsYXJtKQorICAgICAgICB7CisgICAgICAgICAgICBhbGFybXMuQWRkKGFsYXJtKTsKKyAgICAgICAgICAgIGFsYXJtcy5Tb3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVxdWV1ZShBbGFybSBhbGFybSkKKyAgICAgICAgeworICAgICAgICAgICAgYWxhcm1zLlJlbW92ZShhbGFybSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDbGVhclF1ZXVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYWxhcm1zLkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8QWxhcm0+IGFsYXJtcyA9IG5ldyBMaXN0PEFsYXJtPigpOworCisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBBbGFybSA6IElDb21wYXJhYmxlPEFsYXJtPgorICAgICAgICB7CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsaXN0ZW5lciI+dGhlIHRhcmdldCBvZiB0aGUgd2FrZXVwIGNhbGwuPC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhdGUiPmEgYml0IG9mIHN0YXRlIGZvciB0aGUgbGlzdGVuZXIuPC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZHVlIj5oZSBhYnNvbHV0ZSBkdWUgdGltZSBmb3IgdGhlIGFsYXJtLjwvcGFyYW0+CisgICAgICAgICAgICBwdWJsaWMgQWxhcm0oQWxhcm1MaXN0ZW5lciBsaXN0ZW5lciwgT2JqZWN0IHN0YXRlLCBsb25nIGR1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHRoaXMuZHVlID0gZHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBzdGF0ZSBmb3IgdGhlIGxpc3RlbmVyLjwvcmV0dXJucz4KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RhdGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhdGUiPmEgbmV3IGJpdCBvZiBzdGF0ZSBmb3IgdGhlIGxpc3RlbmVyLi9wYXJhbT4KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKE9iamVjdCBzdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyAKKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHJldHVybnM+dGhlIHRpbWUgdGhlIGFsYXJtIGlzIGR1ZS48L3JldHVybnM+CisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXREdWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyAKKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImR1ZSI+PC9wYXJhbT4KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldER1ZShsb25nIGR1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmR1ZSA9IGR1ZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludCkoKGR1ZSBeIChkdWUgPj4gMzIpKSBeIChzZXEgXiAoc2VxID4+IDMyKSkpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhPYmplY3Qgb2JqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gdGhpcykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChvYmouR2V0VHlwZSgpICE9IHR5cGVvZihBbGFybSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIEFsYXJtIG90aGVyID0gKEFsYXJtKW9iajsKKworICAgICAgICAgICAgICAgIHJldHVybiBkdWUgPT0gb3RoZXIuZHVlICYmIHNlcSA9PSBvdGhlci5zZXE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ29tcGFyZVRvKEFsYXJtIG90aGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkdWUgPCBvdGhlci5kdWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIGlmIChkdWUgPiBvdGhlci5kdWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICAgICAgLy8gZHVlIHRpbWUgaXMgdGhlIHNhbWUgZm9yIGJvdGgsIG5vdyB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgc2VxLgorCisgICAgICAgICAgICAgICAgaWYgKHNlcSA8IG90aGVyLnNlcSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgaWYgKHNlcSA+IG90aGVyLnNlcSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFRoZSBsaXN0ZW5lciBmb3Igd2FrZXVwIGV2ZW50cy4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgQWxhcm1MaXN0ZW5lciBsaXN0ZW5lcjsKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIEp1c3QgYSBiaXQgb2Ygc3RhdGUgZm9yIHRoZSBsaXN0ZW5lci4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwcml2YXRlIE9iamVjdCBzdGF0ZTsKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFRoZSB0aW1lIHRoZSBhbGFybSBpcyBkdWUuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHJpdmF0ZSBsb25nIGR1ZTsKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIEEgdW5pcXVlIGZvciBhbGwgcmVhc29uYWJsZSB0aW1lIHNlcXVlbmNlIG51bWJlci4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGxvbmcgc2VxID0gaWRHZW4uTmV4dCgpOworCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBJZEdlbmVyYXRvciBpZEdlbiA9IG5ldyBJZEdlbmVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2h1dHMgZG93biB0aGUgZGVmYXVsdCBhbGFybSBtYW5hZ2VyIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNodXRkb3duKCkKKyAgICAgICAgeworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gU2V0QWxhcm1NYW5hZ2VyKG51bGwpOworICAgICAgICAgICAgaWYgKGFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgYW0uU3RvcCgpOworICAgICAgICB9CisKKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0FycmF5SXRlcmF0b3IuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvQXJyYXlJdGVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWRiZTkyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0FycmF5SXRlcmF0b3IuY3MKQEAgLTAsMCArMSw3MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvcjxUPiA6IElFbnVtZXJhdG9yPFQ+IAorICAgIHsKKworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlcyI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIEFycmF5SXRlcmF0b3IoIFRbXSB2YWx1ZXMgKSAKKyAgICAgICB7CisgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsKKyAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUW10gdmFsdWVzOworCisgICAgICAgIHByaXZhdGUgaW50IGluZGV4ID0gLTE7CisKKyAgICAgICAgLy8vIDxyZXR1cm5zPiBpbmRleCB2YWx1ZSBpZiBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiB2YWx1ZXM8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaW5kZXggPCB2YWx1ZXMuTGVuZ3RoKQorICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICByZXR1cm4gaW5kZXggPCB2YWx1ZXMuTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PlJlc2V0cyBpbmRleCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXk8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXggPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5yZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGUgaW5kZXggb2YgdGhlICd2YWx1ZXMnPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVCBDdXJyZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PnJldHVybnMgdGhlIHZhbHVlIGF0IHRoZSBpbmRleCBvZiB0aGUgJ3ZhbHVlcyc8L3N1bW1hcnk+CisgICAgICAgIG9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IuQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzW2luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKXt9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0Fzc2VydGlvbi5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9Bc3NlcnRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzYmE2MgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9Bc3NlcnRpb24uY3MKQEAgLTAsMCArMSwzMiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgcHVibGljIGNsYXNzIEFzc2VydGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENoZWNrKGJvb2wgb2ssIHN0cmluZyBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiYXNzZXJ0aW9uIGZhaWxlZDogIiArIG1zZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvQ2hhckl0ZXJhdG9yLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0NoYXJJdGVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjBiNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0NoYXJJdGVyYXRvci5jcwpAQCAtMCwwICsxLDU4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ2hhckl0ZXJhdG9yIAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTdHJpbmcgX3M7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9uOworICAgICAgICBwcml2YXRlIGludCBfaSA9IC0xOworCisgICAgICAgIHB1YmxpYyBDaGFySXRlcmF0b3IoIFN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzID09IG51bGwgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oICJTdHJpbmcgdG8gaXRlcmF0ZSBvdmVyIHNob3VsZG4ndCBiZSBudWxsIiApOworCisgICAgICAgICAgICBfcyA9IHM7CisgICAgICAgICAgICBfbiA9IHMuTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJvb2xlYW4gTW92ZU5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIF9pIDwgKF9uLTEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaSsrOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDaGFyIEN1cnJlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zWyBfaSBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0NpcmN1bGFyUXVldWUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvQ2lyY3VsYXJRdWV1ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U2N2M4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0NpcmN1bGFyUXVldWUuY3MKQEAgLTAsMCArMSw0MDQgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBjaXJjdWxhciBxdWV1ZSBvZiBhIGZpeGVkIHNpemUuIEVsZW1lbnRzIGFyZSBhZGRlZCB0byBvbmUKKyAgICAvLy8gZW5kIGFuZCByZW1vdmVkIGZyb20gdGhlIG90aGVyLCB3aXRoIHRoZSBxdWV1ZSBzaXplIHJhbmdpbmcKKyAgICAvLy8gZnJvbSBlbXB0eSB0byBmdWxsLiBPcGVyYXRpb25zIGNhbiBvcHRpb25hbGx5IHdhaXQgdW50aWwKKyAgICAvLy8gZmluaXNoZWQgb3IgcmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAgICAvLy8gRm9yIGluc3RhbmNlLCBhZGRpbmcgdG8gYSBmdWxsIHF1ZXVlIGNhbiB3YWl0IHVudGlsIGFuIGl0ZW0KKyAgICAvLy8gaXMgcmVtb3ZlZCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgaXRlbSBvciBpdCBjYW4gd2FpdCBvbmx5CisgICAgLy8vIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGJlZm9yZSBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseQorICAgIC8vLyBvciBnaXZpbmcgdXAuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj50aGUgdHlwZSBvZiBpdGVtcyBpbiB0aGUgcXVldWUuPC90eXBlcGFyYW0+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBDaXJjdWxhclF1ZXVlPFQ+CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBDaXJjdWxhciBRdWV1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNpemUiPnRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBhbGxvd2VkIGluIHRoZSBxdWV1ZS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQ2lyY3VsYXJRdWV1ZSggaW50IHNpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHNpemUgPCAxKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInNpemUgPCAxIik7CisgICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgIC8vICAgICBpdGVtcyA9IG5ldyBUWyBzaXplIF07CisgICAgICAgICAgICBpdGVtcyA9IG5ldyBPYmplY3Rbc2l6ZV07CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBDaXJjdWxhclF1ZXVlIHdpdGggdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zCisgICAgICAgIC8vLyBkZWZhdWx0ZWQgdG8gMTAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBDaXJjdWxhclF1ZXVlKCkgOiB0aGlzICgxMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgc2l6ZTsKKworLy8gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFtdIGl0ZW1zOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdFtdIGl0ZW1zOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgbWF5IGJlIHB1dCBpbiB0aGUgcXVldWUuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IFNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGN1cnJlbnQgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBxdWV1ZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgSXNFbXB0eSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSBxdWV1ZSBpcyBmdWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgSXNGdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50ID09IHNpemU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBoZWFkOworCisgICAgICAgIHByaXZhdGUgT2JqZWN0IEdldDAoKQorICAgICAgICB7CisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoY291bnQ+MCwiY291bnQgPiAwIik7CisKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdGVtc1toZWFkXTsKKworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG9iaiAhPSBudWxsLCJvYmogIT0gbnVsbCIpOworCisgICAgICAgICAgICBpdGVtc1toZWFkXSA9IG51bGw7CisKKyAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICBoZWFkKys7CisKKyAgICAgICAgICAgIGlmIChoZWFkID09IHNpemUpCisgICAgICAgICAgICAgICAgaGVhZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgLyogcHJpdmF0ZSBUIEludEdldCgpCisJICAgIHsKKwkJICAgIERlYnVnLkFzc2VydCggIUlzRW1wdHkoKSApOworICAgIAkJCisJCSAgICBEZWJ1Zy5Bc3NlcnQoIGl0ZW1zW2hlYWRdICE9IG51bGwgKTsKKwkJICAgIFQgdCA9IGl0ZW1zW2hlYWRdOworICAgICAgICAgICAgaXRlbXNbIGhlYWQgXSA9IGRlZmF1bHQoIFQgKTsgLy9udWxsOworICAgIAkJCisJCSAgICAvLyB3YWtlIHVwIHNvbWVvbmUgd2FpdGluZyBmb3Igc3BhY2UuCisgICAgICAgICAgICBpZiAoIElzRnVsbCgpICkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuUHVsc2UoIHRoaXMgKTsKKyAgICAJCQorCQkgICAgY291bnQtLTsKKyAgICAJCQorCQkgICAgaGVhZCsrOworCQkgICAgaWYgKGhlYWQgPT0gc2l6ZSkKKwkJCSAgICBoZWFkID0gMDsKKyAgICAJCQorCQkgICAgcmV0dXJuIHQ7CisJICAgIH0gKi8KKworICAgICAgICBwcml2YXRlIGludCB0YWlsOworCisgICAgICAgIHByaXZhdGUgdm9pZCBQdXQwKE9iamVjdCBvYmopCisgICAgICAgIHsKKworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG9iaiAhPSBudWxsLCAib2JqICE9IG51bGwiKTsKKyAgICAgICAgICAgIERlYnVnLkFzc2VydChjb3VudCA8IHNpemUsICJjb3VudCA8IHNpemUiKTsKKyAgICAgICAgICAgIERlYnVnLkFzc2VydChpdGVtc1t0YWlsXSA9PSBudWxsLCAiaXRlbXNbdGFpbF0gPT0gbnVsbCIpOworCisgICAgICAgICAgICBpdGVtc1t0YWlsXSA9IG9iajsKKworICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICAgICAgdGFpbCsrOworCisgICAgICAgICAgICBpZiAodGFpbCA9PSBzaXplKQorICAgICAgICAgICAgICAgIHRhaWwgPSAwOworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgLyogICAgIHByaXZhdGUgdm9pZCBJbnRQdXQoIFQgdCApCisJICAgIHsKKwkJICAgIERlYnVnLkFzc2VydCggdCAhPSBudWxsICk7CisJCSAgICBEZWJ1Zy5Bc3NlcnQoICFJc0Z1bGwoKSApOworICAgIAkJCisJCSAgICBEZWJ1Zy5Bc3NlcnQoIGl0ZW1zW3RhaWxdID09IG51bGwgKTsKKwkJICAgIGl0ZW1zW3RhaWxdID0gdDsKKyAgICAJCQorCQkgICAgLy8gd2FrZSB1cCBzb21lb25lIHdhaXRpbmcgZm9yIGFuIGl0ZW0uCisgICAgICAgICAgICBpZiAoIElzRW1wdHkoKSApCisgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5Nb25pdG9yLlB1bHNlKHRoaXMpOworICAgIAkJCisJCSAgICBjb3VudCsrOworICAgIAkJCisJCSAgICB0YWlsKys7CisJCSAgICBpZiAodGFpbCA9PSBzaXplKQorCQkJICAgIHRhaWwgPSAwOworCSAgICB9ICovCisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIG5leHQgYXZhaWxhYmxlIGl0ZW0gZnJvbSB0aGUgcXVldWUsIHdhaXRpbmcKKyAgICAgICAgLy8vIHVudGlsIGFuIGl0ZW0gaXMgYXZhaWxhYmxlIG9yIHRoZSBxdWV1ZSBpcyBjbG9zZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgaXRlbSBmcm9tIHRoZSBxdWV1ZSwgb3IgbnVsbCBpZiB0aGUgcXVldWUKKyAgICAgICAgLy8vIGlzIGNsb3NlZC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRocmVhZCBpcyBpbnRlcnJ1cHRlZAorICAgICAgICBwdWJsaWMgVCBHZXQoKSAKKwkgICAgeworICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBHZXQoIDAgKTsKKwkgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIG5leHQgYXZhaWxhYmxlIGl0ZW0gZnJvbSB0aGUgcXVldWUsIHdhaXRpbmcKKyAgICAgICAgLy8vIHVudGlsIGFuIGl0ZW0gaXMgYXZhaWxhYmxlIG9yIHRoZSBxdWV1ZSBpcyBjbG9zZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPnRoZSBtYXhpbXVtIHRpbWUgaW4gbXMgdG8gd2FpdCBmb3IKKyAgICAgICAgLy8vIHNvbWV0aGluZyB0byBiZSBwdXQgaW4gdGhlIHF1ZXVlOyAwIG1lYW5zIHdhaXQgZm9yZXZlciwKKyAgICAgICAgLy8vIGxlc3MgdGhhbiAwIG1lYW5zIGRvbid0IHdhaXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBpdGVtIGZyb20gdGhlIHF1ZXVlLCBvciBudWxsIGlmIG1heERlbGF5CisgICAgICAgIC8vLyBoYXMgYmVlbiBleGNlZWRlZCBvciB0aGUgcXVldWUgaXMgY2xvc2VkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24KKworICAgICAgICBbTWV0aG9kSW1wbChNZXRob2RJbXBsT3B0aW9ucy5TeW5jaHJvbml6ZWQpXQorICAgICAgICBwdWJsaWMgVCBHZXQoIGludCBtYXhEZWxheSApIAorCSAgICB7CisJCSAgICBpZiAoIUlzRW1wdHkoKSkKKwkJCSAgICByZXR1cm4gR2V0QW5kTm90aWZ5KCk7CisKKyAgICAgICAgICAgIGlmIChJc0Nsb3NlZCgpIHx8IG1heERlbGF5IDwgMCkKKyAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KCBUICk7IC8vbnVsbDsKKyAgICAJCQorCQkgICAgLy8gdGhlIHF1ZXVlIGlzIGVtcHR5LCBub3QgY2xvc2VkLCBhbmQgY2FsbGVyIGhhcyByZXF1ZXN0ZWQgYSBkZWxheQorCisgICAgICAgICAgICBsb25nIG5vdyA9IEhQVGltZXIuTm93KCk7CisgICAgICAgICAgICBsb25nIGVuZCA9IEVuZFRpbWUobm93LCBtYXhEZWxheSk7CisKKyAgICAgICAgICAgIERlYnVnLkFzc2VydChlbmQgPiBub3csICJlbmQgPiBub3ciKTsKKworICAgICAgICAgICAgaW50IGQ7CisgICAgICAgICAgICB3aGlsZSAoKGQgPSBSZW1UaW1lKGVuZCwgbm93KSkgPiAwKQorCQkgICAgeworCQkJICAgIC8vIHRoZSBxdWV1ZSBpcyBlbXB0eSwgbm90IGNsb3NlZCwgYW5kIGRlbGF5IGhhcyBub3QgcnVuIG91dC4uLgorICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChJc0VtcHR5KCksICJJc0VtcHR5KCkiKTsKKyAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoIUlzQ2xvc2VkKCksIiFJc0Nsb3NlZCgpIik7CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuV2FpdCh0aGlzLCBkKTsKKworCQkJICAgIGlmICghSXNFbXB0eSgpKQorCQkJCSAgICByZXR1cm4gR2V0QW5kTm90aWZ5KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIElzQ2xvc2VkKCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdCggVCApOyAvL251bGw7CisKKyAgICAgICAgICAgICAgICBub3cgPSBIUFRpbWVyLk5vdygpOworCQkgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdCggVCApOyAvLyBudWxsOworCSAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHV0cyBhbiBpdGVtIGluIHRoZSBxdWV1ZSwgd2FpdGluZyB1bnRpbCBzcGFjZSBpcyBhdmFpbGFibGUKKyAgICAgICAgLy8vIG9yIHRoZSBxdWV1ZSBpcyBjbG9zZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idCI+YSBub24tbnVsbCBpdGVtIHRvIHB1dCBpbiB0aGUgcXVldWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIGl0ZW0gd2FzIHBsYWNlZCBpbiB0aGUgcXVldWUsCisgICAgICAgIC8vLyBvciBmYWxzZSBpZiB0aGUgcXVldWUgaXMgY2xvc2VkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZAorCisgICAgICAgIHB1YmxpYyBib29sIFB1dCggVCB0ICkgCisJICAgIHsKKwkJICAgIHJldHVybiBQdXQoIHQsIDAgKTsKKwkgICAgfQorCisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQdXRzIGFuIGl0ZW0gaW4gdGhlIHF1ZXVlLCB3YWl0aW5nIHVudGlsIHNwYWNlIGlzIGF2YWlsYWJsZQorICAgICAgICAvLy8gb3IgdGhlIHF1ZXVlIGlzIGNsb3NlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvYmoiPmEgbm9uLW51bGwgaXRlbSB0byBwdXQgaW4gdGhlIHF1ZXVlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPnRoZSBtYXhpbXVtIHRpbWUgaW4gbXMgdG8gd2FpdCBmb3IKKyAgICAgICAgLy8vIGF2YWlsYWJsZSBzcGFjZSB0aGUgcXVldWU7IDAgbWVhbnMgd2FpdCBmb3JldmVyLAorICAgICAgICAvLy8gbGVzcyB0aGFuIDAgbWVhbnMgZG9uJ3Qgd2FpdC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgaXRlbSB3YXMgcGxhY2VkIGluIHRoZSBxdWV1ZSwKKyAgICAgICAgLy8vIG9yIGZhbHNlIGlmIG1heERlbGF5IGhhcyBiZWVuIGV4Y2VlZGVkIG9yIHRoZSBxdWV1ZSBpcyBjbG9zZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkCisKKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHVibGljIGJvb2wgUHV0KCBUIG9iaiwgaW50IG1heERlbGF5ICkgCisJICAgIHsKKwkJICAgIGlmIChvYmogPT0gbnVsbCkKKwkJCSAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCAidCA9PSBudWxsIiApOworICAgIAkJCisJCSAgICBpZiAoSXNDbG9zZWQoKSkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisgICAgCQkKKwkJICAgIC8vIHRoZSBxdWV1ZSBpcyBub3QgY2xvc2VkLgorICAgIAkJCisJCSAgICBpZiAoIUlzRnVsbCgpKQorCQkgICAgeworCQkJICAgIFB1dEFuZE5vdGlmeSggb2JqICk7CisJCQkgICAgcmV0dXJuIHRydWU7CisJCSAgICB9CisgICAgCQkKKwkJICAgIC8vIHRoZSBxdWV1ZSBpcyBub3QgY2xvc2VkLCB0aGUgcXVldWUgaXMgZnVsbC4KKyAgICAJCQorCQkgICAgaWYgKG1heERlbGF5IDwgMCkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisJCQkKKyAgICAgICAgICAgIGxvbmcgbm93ID0gSFBUaW1lci5Ob3coKTsKKyAgICAgICAgICAgIGxvbmcgZW5kID0gRW5kVGltZShub3csIG1heERlbGF5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGQ7CisgICAgICAgICAgICB3aGlsZSAoKGQgPSBSZW1UaW1lKGVuZCwgbm93KSkgPiAwKSAgICAKKwkJICAgIHsKKwkJCSAgICAvLyB0aGUgcXVldWUgaXMgbm90IGNsb3NlZCwgdGhlIHF1ZXVlIGlzIGZ1bGwsIGFuZCBkZWxheSBoYXMgbm90IHJ1biBvdXQuLi4KKwkJCSAgICBEZWJ1Zy5Bc3NlcnQoICFJc0Nsb3NlZCgpICk7CisgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KCBJc0Z1bGwoKSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuTW9uaXRvci5XYWl0KHRoaXMsIGQpOworICAgICAgICAgICAgICAgIAorCQkJICAgIGlmIChJc0Nsb3NlZCgpKQorCQkJCSAgICByZXR1cm4gZmFsc2U7CisgICAgCQkJCisJCQkgICAgLy8gdGhlIHF1ZXVlIGlzIG5vdCBjbG9zZWQuCisgICAgCQkJCisJCQkgICAgaWYgKCFJc0Z1bGwoKSkKKwkJCSAgICB7CisJCQkgICAgICAgIFB1dEFuZE5vdGlmeShvYmopOworCQkJCSAgICByZXR1cm4gdHJ1ZTsKKwkJCSAgICB9CisKKyAgICAgICAgICAgICAgICBub3cgPSBIUFRpbWVyLk5vdygpOworCQkgICAgfQorICAgIAkJCisJCSAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDbG9zZXMgdGhlIHF1ZXVlIHNvIHRoYXQgbm8gbW9yZSBpdGVtcyBtYXkgYmUgcHV0IGludG8gaXQuCisgICAgICAgIC8vLyBHZXQgd2lsbCByZXR1cm4gbnVsbCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zIHRvIHJldHVybi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xvc2UoKQorCSAgICB7CisJCSAgICBpZiAoIWNsb3NlZCkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuTW9uaXRvci5QdWxzZUFsbCh0aGlzKTsKKwkJICAgIH0KKyAgICAgICAgICAgIAorCSAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSBxdWV1ZSBpcyBjbG9zZWQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBJc0Nsb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjbG9zZWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgY2xvc2VkOworCisgICAgICAgIHByaXZhdGUgVCBHZXRBbmROb3RpZnkoKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIG5vdGlmeSA9IElzRnVsbCgpOworCisgICAgICAgICAgICBPYmplY3Qgb2JqID0gR2V0MCgpOworCisgICAgICAgICAgICBub3RpZnkgPSBub3RpZnkgfHwgIUlzRW1wdHkoKTsKKworICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuUHVsc2UodGhpcyk7CisKKyAgICAgICAgICAgIHJldHVybiAoVCkgb2JqOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFB1dEFuZE5vdGlmeShUIG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBub3RpZnkgPSBJc0VtcHR5KCk7CisKKyAgICAgICAgICAgIFB1dDAob2JqKTsKKworICAgICAgICAgICAgbm90aWZ5ID0gbm90aWZ5IHx8ICFJc0Z1bGwoKTsKKworICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuUHVsc2UodGhpcyk7CisgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBsb25nIEVuZFRpbWUobG9uZyBub3csIGludCBtYXhEZWxheSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1heERlbGF5ID09IDAgfHwgbWF4RGVsYXkgPT0gaW50Lk1heFZhbHVlKQorICAgICAgICAgICAgICAgIHJldHVybiBsb25nLk1heFZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gbm93ICsgbWF4RGVsYXkgKiBIUFRpbWVyLk5TX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IFJlbVRpbWUobG9uZyBlbmQsIGxvbmcgbm93KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW5kID09IGxvbmcuTWF4VmFsdWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGludC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgbG9uZyBtcyA9IChlbmQgLSBub3cpIC8gSFBUaW1lci5OU19QRVJfTUlMTElTRUNPTkQ7CisgICAgICAgICAgICBpZiAobXMgPiBpbnQuTWF4VmFsdWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGludC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgcmV0dXJuIChpbnQpbXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvQ29ubmVjdGlvbi5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9Db25uZWN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDA0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvQ29ubmVjdGlvbi5jcwpAQCAtMCwwICsxLDMzMSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW1wbGVtZW50YXRpb24gb2YgcnVubmVyIHdoaWNoIGhhbmRsZXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbjxIPiA6IFJ1bm5lciwgCisgICAgICAgIFRyYW5zcG9ydDxIPiwgUnVubmVySGFuZGxlciB3aGVyZSBIIDogU2Vzc2lvbgorICAgIHsKKworICAgICAgICAjcmVnaW9uIFFVRVJJRVMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTb3VyY2UgcXVlcnkgdG8gZ2V0IHRoZSBsb2NhbCBhZGRyZXNzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgTE9DQUxfQUREUkVTUyA9ICJMT0NBTF9BRERSRVNTIjsKKworCSAgICAvLy8gPHN1bW1hcnk+CisJICAgIC8vLyBTb3VyY2UgcXVlcnkgdG8gZ2V0IHRoZSByZW1vdGUgYWRkcmVzcy4KKwkgICAgLy8vIDwvc3VtbWFyeT4KKwkgICAgcHVibGljIGNvbnN0IFN0cmluZyBSRU1PVEVfQUREUkVTUyA9ICJSRU1PVEVfQUREUkVTUyI7CisKKyAgICAgICAgI2VuZHJlZ2lvbiAgCisKKyAgICAgICAgI3JlZ2lvbiBFVkVOVFMKKyAgICAgICAgCisgICAgICAgIAorCSAgICAvLy8gPHN1bW1hcnk+CisJICAgIC8vLyBIb3N0IG5hbWUgdG8gc3BlY2lmeSB0byBzZWxlY3QgbGlzdGVuaW5nIG9uIGFsbCBpbnRlcmZhY2VzLgorICAgICAgICAvLy8gVGhlIHZhbHVlIGlzICIwLjAuMC4wIi4KKwkgICAgLy8vIDwvc3VtbWFyeT4KKwkgICAgcHVibGljIGNvbnN0IFN0cmluZyBBTExfSU5URlMgPSAiMC4wLjAuMCI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNsYXRlcyBob3N0IG5hbWUgcGVyIHdlbGwga25vdyBuYW1lcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj5pbnB1dCBob3N0IG5hbWU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBUcmFuc2xhdGVIb3N0KCBTdHJpbmcgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcyAhPSBudWxsICYmIHMuRXF1YWxzKCBBTExfSU5URlMgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIENvbm5lY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBDb25uZWN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0SGFuZGxlcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0ZWQoICkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTdG9wcGVkKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBFeGNlcHRpb24oIFN0cmluZyB3aGF0LCBFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyLkFkZFRvZG8obmV3IFRvZG9EZWxlZ2F0ZUltcGwoCisgICAgICAgICAgICAgICAgZGVsZWdhdGUoVG9kb01hbmFnZXIgbWdyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTm90aWZ5KGUpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZGVsZWdhdGUoVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUxICE9IGUpCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlMSk7CisgICAgICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlyc3QiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSdW4wKCBib29sIGZpcnN0ICkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBvayA9IE9wZW5Tb2NrZXQoIWZpcnN0KTsKKyAgICAgICAgICAgIGlmICggIW9rICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFVwU29ja2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaXJlRXhjZXB0aW9uKCAic2V0dXAiLCBlICk7CisgICAgICAgICAgICAgICAgQ2xvc2UoIHRydWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlyZVVwKCk7CisgICAgICAgICAgICAgICAgUmVhZFNvY2tldCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gaWdub3JlICJzb2NrZXQgY2xvc2VkIiBjb25kaXRpb24KKyAgICAgICAgICAgICAgICBGaXJlRXhjZXB0aW9uKCJydW4iLCBlKTsKKyAgICAgICAgICAgICAgICBDbG9zZSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaXJlRXhjZXB0aW9uKCJydW4iLCBlKTsKKyAgICAgICAgICAgICAgICBDbG9zZSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaXJlRG93bigpOworICAgICAgICAgICAgICAgIENsb3NlKCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVjb25uZWN0Ij5yZWNvbm5lY3QgdHJ1ZSBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHJlY29ubmVjdCwgZmFsc2UgaWYgdGhpcworICAgICAgICAvLy8gaXMgdGhlIGZpcnN0IHRpbWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgd2Ugc2hvdWxkIHJlY29ubmVjdCwgZmFsc2UgaWYgd2Ugc2hvdWxkIHN0b3AuPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2wgT3BlblNvY2tldCggYm9vbCByZWNvbm5lY3QgKTsKKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgdXAgYSBuZXdseSBvcGVuZWQgc29ja2V0LiBUaGlzIG1heSBpbnZvbHZlIHNldHRpbmcgc29ja2V0CisgICAgICAgIC8vLyBvcHRpb25zIGFuZCBvcGVuaW5nIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIFNldFVwU29ja2V0KCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGVyZm9ybXMgdGhlIHVzdWFsIGFuZCBjdXN0b21hcnkgb3BlcmF0aW9ucyBvbiBhIHNvY2tldCwgc3VjaAorICAgICAgICAvLy8gYXMgcmVhZCBvciBhY2NlcHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBSZWFkU29ja2V0KCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGVybWluYXRlcyBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzZXQiPnRydWUgaWYgdGhlIHNvY2tldCBzaG91bGQgYmUgdGVybWluYXRlZCBpbW1lZGlhdGVseS48L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgQ2xvc2UoIGJvb2wgcmVzZXQgKTsKKworICAgICAgICBwdWJsaWMgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsb3NlKCBmYWxzZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgT2JqZWN0IFRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHF1ZXJ5LkVxdWFscyggTE9DQUxfQUREUkVTUyApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9jYWxBZGRyZXNzKCk7CisKKyAgICAgICAgICAgIGlmICggcXVlcnkuRXF1YWxzKCBSRU1PVEVfQUREUkVTUyApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQWRkcmVzcygpOworCisgICAgICAgICAgICBpZiAoIHF1ZXJ5IGlzIFRyYW5zcG9ydENvbnN0cy5XYWl0VXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdhaXRVcCggKCAoIFRyYW5zcG9ydENvbnN0cy5XYWl0VXAgKSBxdWVyeSApLl9tYXhEZWxheSApOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHF1ZXJ5IGlzIFRyYW5zcG9ydENvbnN0cy5XYWl0RG93biApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV2FpdERvd24oICggKCBUcmFuc3BvcnRDb25zdHMuV2FpdERvd24gKSBxdWVyeSApLl9tYXhEZWxheSApOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJ1bmtub3duIHF1ZXJ5OiAiICsgcXVlcnkpOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgcHVibGljIEVuZFBvaW50IExvY2FsQWRkcmVzcygpOworCisgICAgICAgIGFic3RyYWN0IHB1YmxpYyBFbmRQb2ludCBSZW1vdGVBZGRyZXNzKCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggY29udHJvbC5FcXVhbHMoIFRyYW5zcG9ydENvbnN0cy5TVEFSVCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGFydCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBjb250cm9sLkVxdWFscyggVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXJ0KCk7CisgICAgICAgICAgICAgICAgV2FpdFVwKCAoIGludCApIHZhbHVlICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGNvbnRyb2wuRXF1YWxzKCBUcmFuc3BvcnRDb25zdHMuU1RPUCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdG9wKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGNvbnRyb2wuRXF1YWxzKCBUcmFuc3BvcnRDb25zdHMuU1RPUF9BTkRfV0FJVF9ET1dOICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0b3AoKTsKKyAgICAgICAgICAgICAgICBXYWl0RG93biggKCBpbnQgKSB2YWx1ZSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbnRyb2wuRXF1YWxzKCBUcmFuc3BvcnRDb25zdHMuUkVTRVQgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2w6ICIgKyBjb250cm9sICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudE9iaiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWdub3JlCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRmlyZVVwKCkKKwkgICAgeworICAgICAgICAgICAgc3RhdHVzLlNldChTZXNzaW9uQ29uc3RzLlVQKTsKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyLkFkZFRvZG8obmV3IFRvZG9EZWxlZ2F0ZUltcGwoCisgICAgICAgICAgICAgICAgZGVsZWdhdGUoVG9kb01hbmFnZXIgbWdyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTm90aWZ5KFNlc3Npb25Db25zdHMuVVApOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZGVsZWdhdGUoVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlMSk7CisgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgIAorCSAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZpcmVEb3duKCkgCisJICAgIHsKKyAgICAgICAgICAgIHN0YXR1cy5TZXQoU2Vzc2lvbkNvbnN0cy5ET1dOKTsKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyLkFkZFRvZG8obmV3IFRvZG9EZWxlZ2F0ZUltcGwoCisgICAgICAgICAgICAgICAgZGVsZWdhdGUoVG9kb01hbmFnZXIgbWdyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uTm90aWZ5KFNlc3Npb25Db25zdHMuRE9XTik7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgIGRlbGVnYXRlKFRvZG9NYW5hZ2VyIG1nciwgRXhjZXB0aW9uIGUxKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUxKTsKKyAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEggR2V0U2Vzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKEggc2Vzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBzZXNzaW9uIGZvciB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIEggc2Vzc2lvbjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXYWl0cyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyB1cC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXhEZWxheSI+dGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdC48L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgdm9pZCBXYWl0VXAoIGludCBtYXhEZWxheSApIAorCSAgICB7CisJCSAgICBzdGF0dXMuV2FpdFVudGlsRXEoIFNlc3Npb25Db25zdHMuVVAsIG1heERlbGF5ICk7CisJICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXhEZWxheSI+dGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdC48L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgdm9pZCBXYWl0RG93biggaW50IG1heERlbGF5ICkgCisJICAgIHsKKyAgICAgICAgICAgIHN0YXR1cy5XYWl0VW50aWxFcShTZXNzaW9uQ29uc3RzLkRPV04sIG1heERlbGF5KTsKKwkgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTW9uaXRvcjxTdHJpbmc+IHN0YXR1cyA9IG5ldyBNb25pdG9yPFN0cmluZz4oICJzdGF0dXMiLCBTZXNzaW9uQ29uc3RzLkRPV04gKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvRGF0ZVNlcmlhbGl6ZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvRGF0ZVNlcmlhbGl6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwNmI0MQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9EYXRlU2VyaWFsaXplci5jcwpAQCAtMCwwICsxLDc4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreyAKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNlcmlhbGl6ZSBhIERhdGVUaW1lIGludG8gb3VyIG5ldHdvcmsgc3RhbmRhcmQgZm9ybWF0LCB3aGljaAorICAgIC8vLyBpcyB0aGUgdW5peCBzdGFuZGFyZCBvZiBtaWxsaXNlY29uZHMgc2luY2UgamFuIDEsIDE5NzAgdXRjLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIERhdGVTZXJpYWxpemVyIDogSW1wb3J0RXhwb3J0SGVscGVyCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IFN0cmluZyBGSUVMRF9OQU1FID0gImRhdGVUaW1lIjsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgZmllbGQ7CisKKyAgICAgICAgcHVibGljIERhdGVTZXJpYWxpemVyKCBYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmluZXMgY3VzdG9tIGZpZWxkcyBpbiB0aGUgdmFsdWUgZmFjdG9yeSBzbyB0aGF0IHRoZSBpbXBvcnRlcgorICAgICAgICAvLy8gY2FuIGZpbmQgdGhlbQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xhc3MydHlwZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEluaXQoIFhUeXBlIHR5cGUsIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gdHlwZS5HZXRGaWVsZCggRklFTERfTkFNRSApOworICAgICAgICAgICAgY2xhc3MydHlwZS5BZGQoIHR5cGVvZiggRGF0ZVRpbWUgKSwgdHlwZSApOworICAgICAgICAgICAgdHlwZS5TZXRDb21wb25lbnRUeXBlKCB0eXBlb2YoIERhdGVUaW1lICkgKTsKKyAgICAgICAgICAgIHR5cGUuU2V0SW1wb3J0RXhwb3J0SGVscGVyKCBuZXcgRGF0ZVNlcmlhbGl6ZXIoIHR5cGUsIGZpZWxkICkgKTsKKyAgICAgICAgICAgIHR5cGUuUHV0VmFsaWRhdG9yKCBmaWVsZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKyAgICAgICAgICAgIHR5cGUuTG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE9iamVjdCBJbXBvcnRWYWx1ZSggU3RydWN0VmFsdWUgc3YgKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIG1zID0gKGxvbmcpc3YuR2V0KGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoZXBvY2ggKyBtcyAqIFRJQ0tTX1BFUl9NUywgRGF0ZVRpbWVLaW5kLlV0YykuVG9Mb2NhbFRpbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJ1Y3RWYWx1ZSBFeHBvcnRWYWx1ZSggVmFsdWVGYWN0b3J5IHZmLCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIG1zID0gKCgoRGF0ZVRpbWUpdmFsdWUpLlRvVW5pdmVyc2FsVGltZSgpLlRpY2tzIC0gZXBvY2gpIC8gVElDS1NfUEVSX01TOworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisgICAgICAgICAgICBzdi5BZGQoZmllbGQsIG1zKTsKKyAgICAgICAgICAgIHJldHVybiBzdjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY29uc3QgbG9uZyBUSUNLU19QRVJfTVMgPSAxMDAwMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb25nIGVwb2NoID0KKyAgICAgICAgICAgIG5ldyBEYXRlVGltZSgxOTcwLCAxLCAxLCAwLCAwLCAwLCBEYXRlVGltZUtpbmQuVXRjKS5UaWNrczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvRW1wdHlJdGVyYXRvci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9FbXB0eUl0ZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTk2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvRW1wdHlJdGVyYXRvci5jcwpAQCAtMCwwICsxLDY1IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIHB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yPEU+IDogSUVudW1lcmF0b3I8RT4KKyAgICB7CisKKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYXRvcjxFPiBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIEUgQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiTm8gc3VjaCBlbGVtZW50IiApOyB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBJRGlzcG9zYWJsZSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJJbnZhbGlkIG9wZXJhdGlvbiIgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIElFbnVtZXJhdG9yIE1lbWJlcnMKKworICAgICAgICBvYmplY3QgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yLkN1cnJlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIk5vIHN1Y2ggZWxlbWVudCIgKTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJJbnZhbGlkIG9wZXJhdGlvbiIgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvRXF1YWxzSGVscGVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0VxdWFsc0hlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhkMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0VxdWFsc0hlbHBlci5jcwpAQCAtMCwwICsxLDI5IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSB2YWx1ZSBvZiBhIGFuZCBiIGFyZSBlcXVhbCBldmVuIHRob3VnaCB0aGUgZm9ybWF0IGlzIG5vdCAKKyAgICAgICAgLy8vIChlLmcuLCAyMyBhcyBhIEJ5dGUgdnMuIEludGVnZXIpLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGRlbGVnYXRlIGJvb2wgRXF1YWxzKE9iamVjdCBhLCBPYmplY3QgYik7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0ZsZXhCdWZmZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvRmxleEJ1ZmZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VhMDlhCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0ZsZXhCdWZmZXIuY3MKQEAgLTAsMCArMSw3NjUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBGbGV4QnVmZmVyIHdyYXBzIGEgYnl0ZSBhcnJheSBhbmQgbWFuYWdlcyB0aGUgYWN0aXZlIHJlZ2lvbiBvZgorICAgIC8vLyBpdCAoMC4ubGVuZ3RoKS4gSXQgYWxzbyBzdXBwb3J0cyBkeW5hbWljYWxseSBleHRlbmRpbmcgdGhlIGJ1ZmZlcgorICAgIC8vLyBhcyBuZWVkZWQuCisgICAgLy8vIAorICAgIC8vLyBBIEZsZXhCdWZmZXIgYWxzbyBoYXMgYW4gaW5kZXggKHJlYWQgb3Igd3JpdGUgY3Vyc29yKS4gVGhlIHZhcmlvdXMKKyAgICAvLy8gR2V0IGFuZCBwdXQgb3BlcmF0aW9ucyBhbHdheXMgb2NjdXIgYXQgdGhlIGN1cnJlbnQgaW5kZXgsIHdpdGggdGhlCisgICAgLy8vIGluZGV4IGFkanVzdGVkIGFwcHJvcHJpYXRlbHkgYWZ0ZXJ3YXJkLiBHZXQgd2lsbCBub3QgbW92ZSBpbmRleCBwYXN0CisgICAgLy8vIGxlbmd0aC4gSWYgcHV0IG5lZWRzIHRvIG1vdmUgaW5kZXggcGFzdCBsZW5ndGgsIGxlbmd0aCBpcyBhbHNvCisgICAgLy8vIGFkanVzdGVkLiBUaGlzIG1heSBjYXVzZSB0aGUgYnl0ZSBhcnJheSB0byBiZSByZS1hbGxvY2F0ZWQgdG8gYQorICAgIC8vLyBsYXJnZXIgc2l6ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRmxleEJ1ZmZlcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIEZsZXhCdWZmZXIgd2l0aCBpbml0aWFsIGxlbmd0aCBhbmQgaW5kZXggb2YgMC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEZsZXhCdWZmZXIoKQorICAgICAgICAJOiB0aGlzKG5ldyBieXRlW0lOSVRfQlVGRkVSX0xFTl0sIDAsIDApCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgRmxleEJ1ZmZlciBvdXQgb2YgYW4gZXhpc3RpbmcgYnVmZmVyLCByZWFkeSB0bworICAgICAgICAvLy8gcmVhZCwgd2l0aCB0aGUgaW5kZXggc2V0IHRvIDAgYW5kIGxlbmd0aCBzZXQgdG8gYnVmZmVyLmxlbmd0aC4gCisgICAgICAgIC8vLyBUaGUgYnVmZmVyIGlzIGFkb3B0ZWQsIG5vdCBjb3BpZWQuIElmIHlvdSB3YW50IHRvIGNvcHksIHVzZSBvbmUgCisgICAgICAgIC8vLyBvZiB0aGUgcHV0IG1ldGhvZHMgaW5zdGVhZC4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gTm90ZTogdGhpcyBpcyB0aGUgc2FtZSBhcyBGbGV4QnVmZmVyKCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPnRoZSBidWZmZXIgdG8gYWRvcHQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxzZWUgY3JlZj0icHV0KGJ5dGVbXSkiLz4KKworICAgICAgICBwdWJsaWMgRmxleEJ1ZmZlcihieXRlW10gYnVmZmVyKQorICAgICAgICAJOiB0aGlzKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBGbGV4QnVmZmVyIG91dCBvZiBhbiBleGlzdGluZyBidWZmZXIsIHJlYWR5IHRvCisgICAgICAgIC8vLyByZWFkLCB3aXRoIHRoZSBpbmRleCBzZXQgdG8gMCBhbmQgbGVuZ3RoIHNldCB0byBidWZmZXIubGVuZ3RoLiAKKyAgICAgICAgLy8vIFRoZSBidWZmZXIgaXMgYWRvcHRlZCwgbm90IGNvcGllZC4gSWYgeW91IHdhbnQgdG8gY29weSwgdXNlIG9uZSAKKyAgICAgICAgLy8vIG9mIHRoZSBwdXQgbWV0aG9kcyBpbnN0ZWFkLgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBOb3RlOiB0aGlzIGlzIHRoZSBzYW1lIGFzIEZsZXhCdWZmZXIoIGJ1ZmZlciwgMCwgbGVuZ3RoICkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj50aGUgYnVmZmVyIHRvIGFkb3B0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVuZ3RoIj50aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBidWZmZXIgKGRhdGEgcHJlc3VtZWQKKyAgICAgICAgLy8vIHRvIHN0YXJ0IGF0IDApLjwvcGFyYW0+CisgICAgICAgIC8vLyA8c2VlIGNyZWY9InB1dChieXRlW10sIGludCwgaW50KSIvPgorCisgICAgICAgIHB1YmxpYyBGbGV4QnVmZmVyKGJ5dGVbXSBidWZmZXIsIGludCBsZW5ndGgpCisgICAgICAgIAk6IHRoaXMoYnVmZmVyLCAwLCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgRmxleEJ1ZmZlciBvdXQgb2YgYW4gZXhpc3RpbmcgYnVmZmVyLCByZWFkeSB0bworICAgICAgICAvLy8gcmVhZCwgd2l0aCB0aGUgaW5kZXggc2V0IHRvIDAgYW5kIGxlbmd0aCBzZXQgdG8gYnVmZmVyLmxlbmd0aC4gCisgICAgICAgIC8vLyBUaGUgYnVmZmVyIGlzIGFkb3B0ZWQsIG5vdCBjb3BpZWQuIElmIHlvdSB3YW50IHRvIGNvcHksIHVzZSBvbmUgCisgICAgICAgIC8vLyBvZiB0aGUgcHV0IG1ldGhvZHMgaW5zdGVhZC4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gTm90ZTogaWYgeW91IHdhbnQgdG8gc3RhcnQgb2ZmIHdyaXRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyCisgICAgICAgIC8vLyBhbmQgbm90IHJlYWRpbmcgaXQsIHNwZWNpZnkgaW5kZXggYXMgdGhlIHBsYWNlIHRvIHN0YXJ0IHdyaXRpbmcsIAorICAgICAgICAvLy8gYW5kIGxlbmd0aCBhcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB2YWxpZCBhZnRlciBpbmRleCAoIHdoaWNoIAorICAgICAgICAvLy8gbWlnaHQgcmVhc29uYWJseSBiZSAwICkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPnRoZSBidWZmZXIgdG8gYWRvcHQuPC9wYXJhbT4KKyAgICAgICAgLy8vIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPnRoZSBpbmRleCB0byBzdGFydCByZWFkaW5nIG9yIHdyaXRpbmcuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW5ndGgiPnRoZSBsZW5ndGggb2YgdGhlIHZhbGlkIGRhdGEgaW4gdGhlIGJ1ZmZlciwgCisgICAgICAgIC8vLyBzdGFydGluZyBhdCB0aGUgaW5kZXguPC9wYXJhbT4KKyAgICAgICAgLy8vIAorICAgICAgICAKKyAgICAgICAgcHVibGljIEZsZXhCdWZmZXIoYnl0ZVtdIGJ1ZmZlciwgaW50IGluZGV4LCBpbnQgbGVuZ3RoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBidWZmZXIgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxSZWZlcmVuY2VFeGNlcHRpb24oICJidWZmZXIgPT0gbnVsbCIgKTsKKyAgICAgICAgICAgIGlmICggaW5kZXggPCAwICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICIgaW5kZXggPCAwICIgKTsKKyAgICAgICAgICAgIGlmICggbGVuZ3RoIDwgMCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAibGVuZ3RoIDwgMCAiICk7CisgICAgICAgICAgICBpZiAoIGluZGV4ICsgbGVuZ3RoID4gYnVmZmVyLkxlbmd0aCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAiaW5kZXggKyBsZW5ndGggPiBidWZmZXIuTGVuZ3RoIiApOworCisgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gaW5kZXggKyBsZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBjdXJyZW50IGJ5dGUgYXJyYXkuIE1pZ2h0IGNoYW5nZSBpZiBhbnkgb3BlcmF0aW9uCisgICAgICAgIC8vLyBuZWVkcyB0byBleHRlbmQgbGVuZ3RoIHBhc3QgdGhlIGVuZCBvZiB0aGUgYXJyYXkuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEJ1ZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW4iPjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZUxlbmd0aCggaW50IGxlbiApIAorCSAgICB7CisJCSAgICBpbnQgbiA9IGJ1ZmZlci5MZW5ndGg7CisJCSAgICBpZiAobGVuIDw9IG4pCisJCQkgICAgcmV0dXJuOworICAgIAkJCisgICAgICAgICAgICAvLyB0aGUgYnVmZmVyIGlzIG5vdCBiaWcgZW5vdWdoLCBleHBhbmQgaXQKKworCQkgICAgaW50IGsgPSBuOworICAgICAgICAgICAgaWYgKCBrIDwgSU5JVF9CVUZGRVJfTEVOICkKKyAgICAgICAgICAgICAgICBrID0gSU5JVF9CVUZGRVJfTEVOOworCisgICAgICAgICAgICB3aGlsZSAoIGxlbiA+IGsgJiYgayA8IE1BWF9CVUZGRVJfTEVOICkKKyAgICAgICAgICAgICAgICBrID0gayA8PCAxOworICAgIAkJCisJCSAgICBpZiAobGVuID4gaykKKwkJCSAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJidWZmZXIgb3ZlcmZsb3ciICk7CisgICAgCQkKKwkJICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVba107CisgICAgICAgICAgICBBcnJheS5Db3B5KCBidWZmZXIsIDAsIGIsIDAsIG4gKTsKKwkJICAgIGJ1ZmZlciA9IGI7CisJICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBidWZmZXI7CisJCisJICAgIHByaXZhdGUgY29uc3QgaW50IElOSVRfQlVGRkVSX0xFTiA9IDMyOworCSAgICAKKwkgICAgcHJpdmF0ZSBjb25zdCBpbnQgVFJJTV9CVUZGRVJfTEVOID0gMTYqMTAyNDsKKwkKKwkgICAgcHJpdmF0ZSBjb25zdCBpbnQgTUFYX0JVRkZFUl9MRU4gPSA0KjEwMjQqMTAyNDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBjdXJyZW50IHZhbHVlIG9mIGxlbmd0aC4gVGhpcyBpcyB0aGUgbGFzdAorICAgICAgICAvLy8gaW5kZXggb2YgdmFsaWQgZGF0YSBpbiB0aGUgYnVmZmVyLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBMZW5ndGgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVuZ3RoIj5sZW5ndGggdGhlIG5ldyB2YWx1ZSBvZiBsZW5ndGguIExlbmd0aCBtdXN0IGJlID49IDAuCisgICAgICAgIC8vLyBJZiBsZW5ndGggaXMgbGVzcyB0aGFuIGluZGV4LCBpbmRleCBpcyBhbHNvIHNldCB0byBsZW5ndGguIElmIGxlbmd0aAorICAgICAgICAvLy8gaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGUgYnVmZmVyIGlzIGV4cGFuZGVkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGlzIGZsZXggYnVmZmVyIG9iamVjdC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICAgICAgcHVibGljIEZsZXhCdWZmZXIgU2V0TGVuZ3RoKCBpbnQgbGVuZ3RoICkgCisJICAgIHsKKwkJICAgIGlmIChsZW5ndGggPCAwKQorCQkJICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oICJsZW5ndGggPCAwIiApOworICAgIAkJCisJCSAgICBFbnN1cmVMZW5ndGgoIGxlbmd0aCApOworICAgIAkJCisJCSAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICAJCQorCQkgICAgaWYgKGluZGV4ID4gbGVuZ3RoKQorCQkJICAgIGluZGV4ID0gbGVuZ3RoOworICAgIAkJCisJCSAgICByZXR1cm4gdGhpczsKKwkgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGxlbmd0aDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBjdXJyZW50IHZhbHVlIG9mIGluZGV4LjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBJbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij5pbmRleCB0aGUgbmV3IHZhbHVlIG9mIGluZGV4LiBJbmRleCBtdXN0IGJlID49IDAuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoaXMgZmxleCBidWZmZXIgb2JqZWN0LjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uCisKKyAgICAgICAgcHVibGljIEZsZXhCdWZmZXIgU2V0SW5kZXgoIGludCBpbmRleCApIAorCSAgICB7CisJCSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbGVuZ3RoKQorCQkJICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oICJpbmRleCA8IDAgfHwgaW5kZXggPiBsZW5ndGgiICk7CisgICAgCQkKKwkJICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAJCQorCQkgICAgcmV0dXJuIHRoaXM7CisJICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBpbmRleDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmxlbmd0aCgpIC0gaW5kZXgoKS4gUmVzdWx0IGlzIGFsd2F5cyA+PSAwLiBUaGlzIGlzIHRoZSBhbW91bnQKKyAgICAgICAgLy8vIG9mIGRhdGEgdGhhdCBjb3VsZCBiZSByZWFkIHVzaW5nIHRoZSB2YXJpb3VzIGZvcm1zIG9mIEdldC4gSXQgZG9lc24ndAorICAgICAgICAvLy8gcmVhbGx5IG1lYW4gYW55dGhpbmcgaW4gcmVsYXRpb24gdG8gcHV0LjwvcmV0dXJucz4KKworICAgICAgICBwdWJsaWMgaW50IEF2YWlsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCAtIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0cyBib3RoIGxlbmd0aCBhbmQgaW5kZXggdG8gMC4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gU2hvcnRoYW5kIGZvciBTZXRMZW5ndGgoIDAgKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoaXMgZmxleCBidWZmZXIgb2JqZWN0LjwvcmV0dXJucz4KKworICAgICAgICBwdWJsaWMgRmxleEJ1ZmZlciBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgICAgIGxlbmd0aCA9IDA7CisJCQorCQkJaWYgKGJ1ZmZlci5MZW5ndGggPiBUUklNX0JVRkZFUl9MRU4pCisJCQkJYnVmZmVyID0gbmV3IGJ5dGVbVFJJTV9CVUZGRVJfTEVOXTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21wYWN0cyB0aGUgYnVmZmVyIGJ5IG1vdmluZyByZW1haW5pbmcgZGF0YSAoZnJvbSBpbmRleCB0byBsZW5ndGgpCisgICAgICAgIC8vLyB0byB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlci4gU2V0cyBpbmRleCB0byAwLCBhbmQgc2V0cyBsZW5ndGggdG8KKyAgICAgICAgLy8vIEF2YWlsIChiZWZvcmUgaW5kZXggd2FzIGNoYW5nZWQpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhpcyBmbGV4IGJ1ZmZlciBvYmplY3QuPC9yZXR1cm5zPgorCisgICAgICAgIHB1YmxpYyBGbGV4QnVmZmVyIENvbXBhY3QoKQorICAgICAgICB7CisgICAgICAgICAgICBpZihpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAgICBpbnQgbiA9IEF2YWlsKCk7CisgICAgICAgICAgICBpZihuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXJyYXkuQ29weShidWZmZXIsIGluZGV4LCBidWZmZXIsIDAsIG4pOworCisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICBsZW5ndGggPSBuOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGJ5dGUgdmFsdWUgYXQgaW5kZXgsIGFuZCBhZGp1c3RzIGluZGV4CisgICAgICAgIC8vLyBieSBhZGRpbmcgb25lLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICBFbmQgb2YgRmlsZSBleGNlcHRpb24gLyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uCisKKyAgICAgICAgcHVibGljIGludCBHZXQoKSAKKwkgICAgeworCQkgICAgQ2hlY2tBdmFpbCggMSApOworCisJCSAgICByZXR1cm4gYnVmZmVyW2luZGV4KytdICYgMjU1OworCSAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29waWVzIGRhdGEgZnJvbSB0aGUgYnl0ZSBhcnJheSB0byBidWYgYXMgaWYgYnkgcmVwZWF0ZWQKKyAgICAgICAgLy8vIGNhbGxzIHRvIEdldCgpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZiI+YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZGF0YS4gQXQgbW9zdAorICAgICAgICAvLy8gbWluKCBidWYubGVuZ3RoLCBBdmFpbCgpICkgYnl0ZXMgYXJlIHRyYW5zZmVycmVkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgYW1vdW50IG9mIGRhdGEgdHJhbnNmZXJyZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIEVuZCBvZiBGaWxlIGV4Y2VwdGlvbiAvIE51bGxSZWZlcmVuY2VFeGNlcHRpb24KKworICAgICAgICBwdWJsaWMgaW50IEdldCggYnl0ZVtdIGJ1ZiApIAorCSAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0KCBidWYsIDAsIGJ1Zi5MZW5ndGggKTsKKwkgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29waWVzIGRhdGEgZnJvbSB0aGUgYnl0ZSBhcnJheSB0byBidWYgYXMgaWYgYnkgcmVwZWF0ZWQKKyAgICAgICAgLy8vIGNhbGxzIHRvIEdldCgpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZiI+YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZGF0YS4gQXQgbW9zdAorICAgICAgICAvLy8gbWluKCBsZW4sIEF2YWlsKCkgKSBieXRlcyBhcmUgdHJhbnNmZXJyZWQsIHN0YXJ0aW5nCisgICAgICAgIC8vLyBhdCBvZmYuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmYiPnRoZSBpbmRleCBpbiBidWYgdG8gcmVjZWl2ZSB0aGUgZGF0YS4KKyAgICAgICAgLy8vIG9mZiBtdXN0IGJlID49IDAgJiYgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGJ1Zi5sZW5ndGguPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW4iPnRoZSBtYXggYW1vdW50IG9mIGRhdGEgdG8gdHJhbnNmZXIuIExlbgorICAgICAgICAvLy8gbXVzdCBiZSA+PSAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYnVmLmxlbmd0aCAtIG9mZi48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGFtb3VudCBvZiBkYXRhIHRyYW5zZmVycmVkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICBFbmQgb2YgRmlsZSBleGNlcHRpb24gLyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uCisKKyAgICAgICAgcHVibGljIGludCBHZXQoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4gKSAKKwkgICAgeworCQkgICAgQ2hlY2tCdWYoIGJ1Ziwgb2ZmLCBsZW4gKTsKKyAgICAJCQorCQkgICAgaWYgKGxlbiA9PSAwKQorCQkJICAgIHJldHVybiAwOworCisgICAgICAgICAgICBDaGVja0F2YWlsKCAxICk7CisgICAgCQkKKwkJICAgIGludCBuID0gTWF0aC5NaW4oIGxlbiwgQXZhaWwoKSApOworICAgIAkJCisJLy8JICAgIEFycmF5LkNvcHkoIGJ1ZmZlciwgaW5kZXgsIGJ1Ziwgb2ZmLCBuICk7CisgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KGJ1ZmZlciwgaW5kZXgsIGJ1Ziwgb2ZmLCBuKTsKKwkJICAgIGluZGV4ICs9IG47CisgICAgCQkKKwkJICAgIHJldHVybiBuOworCSAgICB9CisKKyAgICAgICAgcHVibGljIHNieXRlIEdldEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja0F2YWlsKCAxICk7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKWJ1ZmZlclsgaW5kZXgrKyBdOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgYm9vbCBsaXR0bGVFbmRpYW4gPSBmYWxzZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgc2hvcnQgY29tcG9zZWQgZnJvbSB0aGUgbmV4dCAyIGJ5dGVzLiBMaXR0bGUtZW5kaWFuLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uIGlmIGF2YWlsKCkgPCAyCisgICAgICAgIHB1YmxpYyBzaG9ydCBHZXRTaG9ydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrQXZhaWwoIDIgKTsKKworICAgICAgICAgICAgaWYgKCBsaXR0bGVFbmRpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxpdHRsZS1lbmRpYW4KKyAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBidWZmZXJbIGluZGV4KysgXSAmIDI1NTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBzaG9ydCApICggdmFsdWUgKyAoICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSA8PCA4ICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBiaWctZW5kaWFuCisgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gYnVmZmVyWyBpbmRleCsrIF07CisgICAgICAgICAgICAgICAgcmV0dXJuICggc2hvcnQgKSAoICggdmFsdWUgPDwgOCApICsgKCBidWZmZXJbIGluZGV4KysgXSAmIDI1NSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmFuIGludGVnZXIgY29tcG9zZWQgb2YgNCBieXRlcyBmcm9tCisgICAgICAgIC8vLyB0aGUgYnVmZmVyLCB3aXRoIHRoZSBmaXJzdCBieXRlIGJlaW5nIHRoZSBsZWFzdAorICAgICAgICAvLy8gc2lnbmlmaWNhbnQgYW5kIHRoZSBsYXN0IGJlaW5nIHRoZSBtb3N0IHNpZ25pZmljYW50LjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICBFbmQgb2YgRmlsZSBleGNlcHRpb24gLyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uCisKKyAgICAgICAgcHVibGljIGludCBHZXRJbnQoKSAKKwkgICAgeworICAgICAgICAgICAgQ2hlY2tBdmFpbCggNCApOworCisgICAgICAgICAgICBpZiAoIGxpdHRsZUVuZGlhbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbGl0dGxlLWVuZGlhbgorICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1OworICAgICAgICAgICAgICAgIHZhbHVlICs9ICggKCBidWZmZXJbIGluZGV4KysgXSAmIDI1NSApIDw8IDggKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSArPSAoICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSA8PCAxNiApOworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSArICggKCBidWZmZXJbIGluZGV4KysgXSAmIDI1NSApIDw8IDI0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYmlnLWVuZGlhbgorICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IGJ1ZmZlclsgaW5kZXgrKyBdOworICAgICAgICAgICAgICAgIHZhbHVlID0gKCB2YWx1ZSA8PCA4ICkgKyAoIGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1ICk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoIHZhbHVlIDw8IDggKSArICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCB2YWx1ZSA8PCA4ICkgKyAoIGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1ICk7CisgICAgICAgICAgICB9CisJICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgbG9uZyBjb21wcmlzZWQgb2YgdGhlIG5leHQgOCBieXRlcy4gTGl0dGxlLWVuZGlhbjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGxvbmcgR2V0TG9uZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrQXZhaWwoIDggKTsKKyAgICAgICAgICAgIGlmICggbGl0dGxlRW5kaWFuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBsaXR0bGUtZW5kaWFuCisgICAgICAgICAgICAgICAgbG9uZyB2YWx1ZSA9IGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1OworICAgICAgICAgICAgICAgIHZhbHVlICs9ICggKCAoIGxvbmcgKSAoIGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1ICkgKSA8PCA4ICk7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gKCAoICggbG9uZyApICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSApIDw8IDE2ICk7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gKCAoICggbG9uZyApICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSApIDw8IDI0ICk7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gKCAoICggbG9uZyApICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSApIDw8IDMyICk7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gKCAoICggbG9uZyApICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSApIDw8IDQwICk7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gKCAoICggbG9uZyApICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSApIDw8IDQ4ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgKCAoICggbG9uZyApICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKSApIDw8IDU2ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYmlnLWVuZGlhbgorICAgICAgICAgICAgICAgIGxvbmcgdmFsdWUgPSBidWZmZXJbIGluZGV4KysgXTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICggdmFsdWUgPDwgOCApICsgKCBidWZmZXJbIGluZGV4KysgXSAmIDI1NSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gKCB2YWx1ZSA8PCA4ICkgKyAoIGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1ICk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoIHZhbHVlIDw8IDggKSArICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICggdmFsdWUgPDwgOCApICsgKCBidWZmZXJbIGluZGV4KysgXSAmIDI1NSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gKCB2YWx1ZSA8PCA4ICkgKyAoIGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1ICk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoIHZhbHVlIDw8IDggKSArICggYnVmZmVyWyBpbmRleCsrIF0gJiAyNTUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCB2YWx1ZSA8PCA4ICkgKyAoIGJ1ZmZlclsgaW5kZXgrKyBdICYgMjU1ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgZmxvYXQgZnJvbSB0aGUgbmV4dCBhdmFpbGFibGUgYnl0ZXM8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBmbG9hdCBHZXRGbG9hdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TaW5nbGUoIEJpdENvbnZlcnRlci5HZXRCeXRlcyggR2V0SW50KCkgKSwgMCApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIGRvdWJsZSBmcm9tIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlczwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGRvdWJsZSBHZXREb3VibGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKCBHZXRMb25nKCkgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgR2V0RnVsbHkoIGJ5dGVbXSBiICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tBdmFpbCggYi5MZW5ndGggKTsKKyAgICAgICAgICAgIGludCBuID0gR2V0KCBiLCAwLCBiLkxlbmd0aCApOworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KCBuID09IGIuTGVuZ3RoICk7CisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHV0cyBhIGJ5dGUgaW50byB0aGUgYnVmZmVyIGF0IHRoZSBjdXJyZW50IGluZGV4LAorICAgICAgICAvLy8gdGhlbiBhZGp1c3RzIHRoZSBpbmRleCBieSBvbmUuIEFkanVzdHMgdGhlIGxlbmd0aAorICAgICAgICAvLy8gYXMgbmVjZXNzYXJ5LiBUaGUgYnVmZmVyIGlzIGV4cGFuZGVkIGlmIG5lZWRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiIj5ieXRlIHRvIGJlIHB1dDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGlzIGZsZXggYnVmZmVyIG9iamVjdC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246IAorICAgICAgICAvLy8gICAgIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgb3ZlcmZsb3dzIGl0cyBtYXggbGVuZ3RoLgorCisgICAgICAgIHB1YmxpYyBGbGV4QnVmZmVyIFB1dCggaW50IGIgKSAKKwkgICAgeworCQkgICAgRW5zdXJlTGVuZ3RoKCBpbmRleCsxICk7CisJCSAgICBidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgYjsKKwkJICAgIEZpeExlbmd0aCgpOworICAgIAkJCisJCSAgICByZXR1cm4gdGhpczsKKwkgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFB1dHMgc29tZSBieXRlcyBpbnRvIHRoZSBidWZmZXIgYXMgaWYgYnkgcmVwZWF0ZWQKKyAgICAgICAgLy8vIGNhbGxzIHRvIHB1dCgpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZiI+dGhlIHNvdXJjZSBvZiB0aGUgYnl0ZXMgdG8gcHV0LiBUaGUgZW50aXJlCisgICAgICAgIC8vLyBhcnJheSBvZiBieXRlcyBpcyBwdXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmZsZXggYnVmZmVyIG9iamVjdC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246IAorICAgICAgICAvLy8gICAgIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgb3ZlcmZsb3dzIGl0cyBtYXggbGVuZ3RoLgorICAgICAgICBwdWJsaWMgRmxleEJ1ZmZlciBQdXQoIGJ5dGVbXSBidWYgKSAKKwkgICAgeworICAgICAgICAgICAgcmV0dXJuIFB1dCggYnVmLCAwLCBidWYuTGVuZ3RoICk7CisJICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQdXRzIHNvbWUgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGFzIGlmIGJ5IHJlcGVhdGVkCisgICAgICAgIC8vLyBjYWxscyB0byBQdXQoKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWYiPnRoZSBzb3VyY2Ugb2YgdGhlIGJ5dGVzIHRvIHB1dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZiI+dGhlIGluZGV4IHRvIHRoZSBmaXJzdCBieXRlIHRvIHB1dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxlbiI+dGhlIG51bWJlciBvZiBieXRlcyB0byBwdXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmZsZXggYnVmZmVyIG9iamVjdC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgSU9FeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBvdmVyZmxvd3MgaXRzIG1heCBsZW5ndGguCisKKyAgICAgICAgcHVibGljIEZsZXhCdWZmZXIgUHV0KCBieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkgCisJICAgIHsKKwkJICAgIENoZWNrQnVmKCBidWYsIG9mZiwgbGVuICk7CisgICAgCQkKKwkJICAgIGlmIChsZW4gPT0gMCkKKwkJCSAgICByZXR1cm4gdGhpczsKKyAgICAJCQorCQkgICAgRW5zdXJlTGVuZ3RoKCBpbmRleCtsZW4gKTsKKwkvLwkgICAgQXJyYXkuQ29weSggYnVmLCBvZmYsIGJ1ZmZlciwgaW5kZXgsIGxlbiApOworICAgICAgICAgICAgQnVmZmVyLkJsb2NrQ29weShidWYsIG9mZiwgYnVmZmVyLCBpbmRleCwgbGVuKTsKKwkJICAgIGluZGV4ICs9IGxlbjsKKwkJICAgIEZpeExlbmd0aCgpOyAgICAKKyAgICAJCQorCQkgICAgcmV0dXJuIHRoaXM7CisJICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb3BpZXMgdGhlIEF2YWlsYWJsZSBieXRlcyBmcm9tIGJ1ZiBpbnRvIGJ1ZmZlciBhcyBpZiBieQorICAgICAgICAvLy8gcmVwZWF0ZWQgZXhlY3V0aW9uIG9mIHB1dCggYnVmLkdldCgpICkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmIj50aGUgc291cmNlIG9mIHRoZSBieXRlcyB0byBwdXQuIEFsbCBBdmFpbGFibGUKKyAgICAgICAgLy8vIGJ5dGVzIGFyZSBjb3BpZWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmZsZXggYnVmZmVyIG9iamVjdC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246IAorICAgICAgICAvLy8gICAgIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgb3ZlcmZsb3dzIGl0cyBtYXggbGVuZ3RoLgorCisgICAgICAgIHB1YmxpYyBGbGV4QnVmZmVyIFB1dCggRmxleEJ1ZmZlciBidWYgKSAKKwkgICAgeworICAgICAgICAgICAgaW50IG4gPSBidWYuQXZhaWwoKTsKKyAgICAgICAgICAgIFB1dCggYnVmLmJ1ZmZlciwgYnVmLmluZGV4LCBuICk7CisgICAgICAgICAgICBidWYuU2tpcCggbiwgZmFsc2UgKTsKKwkJICAgIHJldHVybiB0aGlzOworCSAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29waWVzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYnVmIGludG8gYnVmZmVyCisgICAgICAgIC8vLyBhcyBpZiBieSByZXBlYXRlZCBleGVjdXRpb24gb2YgUHV0KCBidWYuR2V0KCkgKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWYiPnRoZSBzb3VyY2Ugb2YgdGhlIGJ5dGVzIHRvIHB1dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxlbiI+PC9wYXJhbT5sZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBwdXQuIExlbiBtdXN0IGJlIAorICAgICAgICAvLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGJ1Zi5BdmFpbCgpLgorICAgICAgICAvLy8gPHJldHVybnM+ZmxleCBidWZmZXIgb2JqZWN0LjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICBJT0V4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIG92ZXJmbG93cyBpdHMgbWF4IGxlbmd0aC4KKworICAgICAgICBwdWJsaWMgRmxleEJ1ZmZlciBQdXQoIEZsZXhCdWZmZXIgYnVmLCBpbnQgbGVuICkgCisJICAgIHsKKwkJICAgIGlmIChsZW4gPiBidWYuQXZhaWwoKSkKKwkJCSAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCAibGVuID4gYnVmLkF2YWlsKCkiICk7CisKKyAgICAgICAgICAgIFB1dCggYnVmLmJ1ZmZlciwgYnVmLmluZGV4LCBsZW4gKTsKKyAgICAgICAgICAgIGJ1Zi5Ta2lwKCBsZW4sIGZhbHNlICk7CisJCSAgICByZXR1cm4gdGhpczsKKwkgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dEJ5dGUoIGJ5dGUgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBFbnN1cmVMZW5ndGgoIGluZGV4ICsgMSApOworICAgICAgICAgICAgYnVmZmVyWyBpbmRleCsrIF0gPSAoIGJ5dGUgKSB2YWx1ZTsKKyAgICAgICAgICAgIEZpeExlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUHV0Qnl0ZSggc2J5dGUgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBFbnN1cmVMZW5ndGgoIGluZGV4ICsgMSApOworICAgICAgICAgICAgYnVmZmVyWyBpbmRleCsrIF0gPSAoIGJ5dGUgKSB2YWx1ZTsKKyAgICAgICAgICAgIEZpeExlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHV0IHNob3J0IGFzIHRoZSBuZXh0IDIgYnl0ZXMuIExpdHRsZS1lbmRpYW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgUHV0U2hvcnQoIHNob3J0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgRW5zdXJlTGVuZ3RoKCBpbmRleCArIDIgKTsKKyAgICAgICAgICAgIGlmICggbGl0dGxlRW5kaWFuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApIHZhbHVlOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiA4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8vIEluIEMjLCBzaW5jZSB3ZSdyZSB1c2luZyB0aGUgYnl0ZSAod2hpY2ggaXMgdW5zaWduZWQpLAorICAgICAgICAgICAgICAgIC8vLyBpdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyIHlvdSBkbyBsb2dpY2FsIG9yIGFyaXRobWV0aWMgCisgICAgICAgICAgICAgICAgLy8vIHNoaWZ0LiBIZW5jZSwgYW4gZXF1aXZhbGVudCBvZiB0aGUgSmF2YSA+Pj4gb3BlcmF0b3IgaXMgCisgICAgICAgICAgICAgICAgLy8vIG5vdCByZXF1aXJlZCBoZXJlLiAKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gOCApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaXhMZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dEludCggaW50IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgRW5zdXJlTGVuZ3RoKCBsZW5ndGggKyA0ICk7CisKKyAgICAgICAgICAgIGlmICggbGl0dGxlRW5kaWFuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApIHZhbHVlOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiA4ICk7CisgICAgICAgICAgICAgICAgYnVmZmVyWyBpbmRleCsrIF0gPSAoIGJ5dGUgKSAoIHZhbHVlID4+IDE2ICk7CisgICAgICAgICAgICAgICAgYnVmZmVyWyBpbmRleCsrIF0gPSAoIGJ5dGUgKSAoIHZhbHVlID4+IDI0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gMjQgKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gMTYgKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gOCApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgdmFsdWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaXhMZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dExvbmcoIGxvbmcgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBFbnN1cmVMZW5ndGgoIGluZGV4KzggKTsKKworICAgICAgICAgICAgaWYgKCBsaXR0bGVFbmRpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgdmFsdWU7CisgICAgICAgICAgICAgICAgYnVmZmVyWyBpbmRleCsrIF0gPSAoIGJ5dGUgKSAoIHZhbHVlID4+IDggKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gMTYgKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gMjQgKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gMzIgKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gNDAgKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gNDggKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbIGluZGV4KysgXSA9ICggYnl0ZSApICggdmFsdWUgPj4gNTYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiA1NiApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiA0OCApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiA0MCApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiAzMiApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiAyNCApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiAxNiApOworICAgICAgICAgICAgICAgIGJ1ZmZlclsgaW5kZXgrKyBdID0gKCBieXRlICkgKCB2YWx1ZSA+PiA4ICk7CisgICAgICAgICAgICAgICAgYnVmZmVyWyBpbmRleCsrIF0gPSAoIGJ5dGUgKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpeExlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUHV0RmxvYXQoIGZsb2F0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgUHV0SW50KCBCaXRDb252ZXJ0ZXIuVG9JbnQzMiggQml0Q29udmVydGVyLkdldEJ5dGVzKCB2YWx1ZSApLCAwICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dERvdWJsZSggZG91YmxlIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgUHV0TG9uZyggQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKCB2YWx1ZSApICk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkanVzdHMgaW5kZXggYXMgaWYgYnkgYSBHZXQgb3IgcHV0IGJ1dCB3aXRob3V0IHRyYW5zZmVycmluZworICAgICAgICAvLy8gYW55IGRhdGEuIFRoaXMgY291bGQgYmUgdXNlZCB0byBza2lwIG92ZXIgYSBkYXRhIGl0ZW0gaW4gYW4KKyAgICAgICAgLy8vIGlucHV0IG9yIG91dHB1dCBidWZmZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVuIj5sZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwIG92ZXIuIExlbiBtdXN0IGJlCisgICAgICAgIC8vLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gSWYgcHV0IGlzIGZhbHNlLCBpdCBpcyBhbiBlcnJvciBpZiBsZW4gPkF2YWlsKCkuIAorICAgICAgICAvLy8gSWYgcHV0IGlzIHRydWUsIHRoZSBidWZmZXIgCisgICAgICAgIC8vLyBtYXkgYmUgZXh0ZW5kZWQgKGFuZCB0aGUgYnVmZmVyIGxlbmd0aCBhZGp1c3RlZCkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwdXQiPnB1dCBpZiB0cnVlIGl0IGlzIG9rIHRvIGV4dGVuZCB0aGUgbGVuZ3RoIG9mIHRoZQorICAgICAgICAvLy8gYnVmZmVyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGlzIEZsZXhidWZmZXIgb2JqZWN0LjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICBJT0V4Y2VwdGlvbiAKKyAgICAgICAgcHVibGljIEZsZXhCdWZmZXIgU2tpcCggaW50IGxlbiwgYm9vbCBwdXQgKSAKKwkgICAgeworCQkgICAgaWYgKGxlbiA8IDApCisJCQkgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAiY291bnQgPCAwIiApOworICAgIAkJCisJCSAgICBpZiAobGVuID09IDApCisJCQkgICAgcmV0dXJuIHRoaXM7CisgICAgCQkKKwkJICAgIGlmIChwdXQpCisJCSAgICB7CisJCQkgICAgRW5zdXJlTGVuZ3RoKCBpbmRleCtsZW4gKTsKKyAgICAJCQkKKwkJCSAgICBpbmRleCArPSBsZW47CisJCQkgICAgRml4TGVuZ3RoKCk7CisgICAgCQkJCisJCQkgICAgcmV0dXJuIHRoaXM7CisJCSAgICB9CisKKyAgICAgICAgICAgIENoZWNrQXZhaWwoIGxlbiApOworICAgIAkJCisJCSAgICBpbmRleCArPSBsZW47CisgICAgCQkKKwkJICAgIHJldHVybiB0aGlzOworCSAgICB9CisKKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIGluZGV4IGhhcyBtb3ZlZCBwYXN0IGxlbmd0aCBkdXJpbmcgYSBwdXQsIHRoZW4gYWRqdXN0IGxlbmd0aAorICAgICAgICAvLy8gdG8gdHJhY2sgaW5kZXguCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBGaXhMZW5ndGgoKQorICAgICAgICB7CisgICAgICAgICAgICBpZihpbmRleCA+IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBpbmRleDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrQnVmKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGJ1ZiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uKCJidWYgPT0gbnVsbCIpOworCisgICAgICAgICAgICBpZihvZmYgPCAwIHx8IG9mZiA+IGJ1Zi5MZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigib2ZmIDwgMCB8fCBvZmYgPiBidWYubGVuZ3RoIik7CisKKyAgICAgICAgICAgIGlmKGxlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigibGVuIDwgMCIpOworCisgICAgICAgICAgICBpZihvZmYrbGVuID4gYnVmLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJvZmYrbGVuID4gYnVmLmxlbmd0aCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50bHkgQXZhaWxhYmxlIGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGN1cnJlbnRseSBBdmFpbGFibGUgYnl0ZXMuPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOiAKKyAgICAgICAgLy8vICAgICB0aHJvd3MgYW4gSU8gRXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QXZhaWxCeXRlcygpIAorCSAgICB7CisJCSAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbQXZhaWwoKV07CisJCSAgICBHZXQoIGJ1ZiApOworCQkgICAgcmV0dXJuIGJ1ZjsKKwkgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENoZWNrcyB0aGF0IHRoZXJlIGFyZSBlbm91Z2ggYnl0ZXMgdG8gZm9yIGEgcmVhZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW4iPnRoZSBsZW5ndGggcmVxdWlyZWQgYnkgYSByZWFkIG9wZXJhdGlvbi48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHZvaWQgQ2hlY2tBdmFpbCggaW50IGxlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggbGVuID4gQXZhaWwoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuZE9mU3RyZWFtRXhjZXB0aW9uKCAiIGxlbiA+IEF2YWlsKCkgIiApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0hQVGltZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvSFBUaW1lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNkYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0hQVGltZXIuY3MKQEAgLTAsMCArMSwxMTUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIUFRpbWVyCisJeworCQlbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiKV0KKwkJcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGJvb2wgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIob3V0IGxvbmcgeCk7CisKKwkJW0RsbEltcG9ydCgia2VybmVsMzIuZGxsIildCisJCXByaXZhdGUgc3RhdGljIGV4dGVybiBib29sIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3kob3V0IGxvbmcgeCk7CisKKwkJc3RhdGljIEhQVGltZXIoKQorCQl7CisJCQlsb25nIGZyZXEgPSAwOworCisJCQlpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3kob3V0IGZyZXEpKQorCQkJCXRocm93IG5ldyBFeGNlcHRpb24oICJRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5IG5vdCBzdXBwb3J0ZWQiICk7CisJCQkKKwkJCS8vIGZyZXEgaXMgdGlja3MgLyBzZWNvbmQuCisJCQkvLyB3ZSB3YW5uYSBjb21wdXRlIHNlY29uZHMgZnJvbSB0aWNrcy4KKwkJCS8vIHRoZSBlYXN5IGNvbXB1dGF0aW9uIGlzIHNlY29uZHMgPSB0aWNrcyAvIGZyZXEKKwkJCS8vIHRvIEdldCBucywgd2UgY29tcHV0ZSBucyA9IHRpY2tzICogMSwwMDAsMDAwLDAwMCAvIGZyZXEKKwkJCS8vIHRoZSBwcm9ibGVtIGlzIHRpY2tzICogMSwwMDAsMDAwLDAwMCB3aWxsIGxpa2VseSBvdmVyZmxvdy4KKwkJCS8vIHdoYXQgd2Ugd2FudCB0byBkbyBpcyBwcmVjb21wdXRlIG5zUGVyVGljayA9IDEsMDAwLDAwMCwwMDAgLyBmcmVxCisJCQkvLyBhbmQgdGhlbiBjb21wdXRlIG5zID0gdGlja3MgKiBuc1BlclRpY2suCisKKwkJCS8vQ29uc29sZS5Xcml0ZUxpbmUoICJIUFRpbWVyOiBmcmVxID0gIitmcmVxICk7CisJCQluc1BlclRpY2sgPSAoKGRvdWJsZSkgTlNfUEVSX1NFQ09ORCkvZnJlcTsKKwkJCS8vQ29uc29sZS5Xcml0ZUxpbmUoICJIUFRpbWVyOiBuc1BlclRpY2sgPSAiK25zUGVyVGljayApOworCQl9CisKKyAgICAgICAgcHVibGljIGNvbnN0IGxvbmcgTlNfUEVSX01JQ1JPU0VDT05EID0gMTAwMDsKKyAgICAgICAgcHVibGljIGNvbnN0IGxvbmcgTlNfUEVSX01JTExJU0VDT05EID0gMTAwMCAqIE5TX1BFUl9NSUNST1NFQ09ORDsKKyAgICAgICAgcHVibGljIGNvbnN0IGRvdWJsZSBOU19QRVJfU0VDT05EID0gMTAwMC4wICogTlNfUEVSX01JTExJU0VDT05EOworCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaCBwcmVjaXNpb24gdGltZXIgdmFsdWUgaW4gbmFub3MuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXB1YmxpYyBzdGF0aWMgbG9uZyBOb3coKQorCQl7CisJCQlsb25nIHggPSAwOworCQkJCisJCQlpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKG91dCB4KSkKKwkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAiUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIgbm90IHN1cHBvcnRlZCIgKTsKKworCQkJcmV0dXJuIChsb25nKSAoeCAqIG5zUGVyVGljayk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGluIG5hbm9zIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZXIgdmFsdWUgYW5kCisJCS8vLyBhIHRpbWVyIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgTm93LgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InkiPjwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXB1YmxpYyBzdGF0aWMgbG9uZyBOc1NpbmNlKCBsb25nIHkgKQorCQl7CisJCQlyZXR1cm4gTm93KCkgLSB5OworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBpbiBtaWxsaXMgYmV0d2VlbiB0aGUgY3VycmVudCB0aW1lciB2YWx1ZSBhbmQKKwkJLy8vIGEgdGltZXIgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBieSBOb3cuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ieSI+PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHVibGljIHN0YXRpYyBsb25nIE1pbGxpc1NpbmNlKCBsb25nIHkgKQorCQl7CisgICAgICAgICAgICByZXR1cm4gTnNTaW5jZSh5KSAvIE5TX1BFUl9NSUxMSVNFQ09ORDsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWVyIHZhbHVlIGFuZAorCQkvLy8gYSB0aW1lciB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGJ5IE5vdy4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ5Ij48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwdWJsaWMgc3RhdGljIGRvdWJsZSBTZWNvbmRzU2luY2UoIGxvbmcgeSApCisJCXsKKyAgICAgICAgICAgIHJldHVybiBOc1NpbmNlKHkpIC8gTlNfUEVSX1NFQ09ORDsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBoaWdoIHByZWNpc2lvbiBjbG9jayB0aWNrcyBwZXIgbmFuby4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHVibGljIHN0YXRpYyBkb3VibGUgTnNQZXJUaWNrKCkKKwkJeworCQkJcmV0dXJuIG5zUGVyVGljazsKKwkJfQorCisJCXByaXZhdGUgc3RhdGljIGRvdWJsZSBuc1BlclRpY2s7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0lkR2VuZXJhdG9yLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0lkR2VuZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MWEyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvSWRHZW5lcmF0b3IuY3MKQEAgLTAsMCArMSw4MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU3luY2hyb25vdXNseSBnZW5lcmF0ZXMgbG9uZyBpZCBudW1iZXJzLiAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgSWRHZW5lcmF0b3IgCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBJZEdlbmVyYXRvciB3aXRoIHRoZSBkZWZhdWx0IHN0YXJ0aW5nIHBvaW50IG9mIDEKKyAgICAgICAgLy8vIGFuZCB0aGUgZGVmYXVsdCBzdHJpZGUgb2YgMS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIElkR2VuZXJhdG9yKCkgOiB0aGlzKCAxLCAxICkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBJZEdlbmVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgcG9pbnQKKyAgICAgICAgLy8vIGFuZCB0aGUgZGVmYXVsdCBzdHJpZGUgb2YgMS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuZXh0SWQiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBJZEdlbmVyYXRvciggbG9uZyBuZXh0SWQgKSA6IHRoaXMoIG5leHRJZCwgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgSWRHZW5lcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0aW5nIHBvaW50CisgICAgICAgIC8vLyBhbmQgdGhlIHNwZWNpZmllZCBzdHJpZGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV4dElkIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmlkZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIElkR2VuZXJhdG9yKCBsb25nIG5leHRJZCwgaW50IHN0cmlkZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RyaWRlIDw9IDAgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbiggInN0cmlkZSA8PSAwIiApOworCisgICAgICAgICAgICB0aGlzLm5leHRJZCA9IG5leHRJZDsKKyAgICAgICAgICAgIHRoaXMuc3RyaWRlID0gc3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBsb25nIG5leHRJZDsKKwkKKwkgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgc3RyaWRlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5leHQgSWQgaW4gc2VxdWVuY2U8L3JldHVybnM+CisgICAgICAgIFtNZXRob2RJbXBsKE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCldCisgICAgICAgIHB1YmxpYyBsb25nIE5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGlkID0gbmV4dElkOworICAgICAgICAgICAgbmV4dElkICs9IHN0cmlkZTsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0lucHV0U3RyZWFtLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0lucHV0U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDA3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvSW5wdXRTdHJlYW0uY3MKQEAgLTAsMCArMSw2NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgSW5wdXRTdHJlYW0KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIChvciBza2lwcGVkIG92ZXIpIAorICAgICAgICAvLy8gZnJvbSB0aGlzIGlucHV0IHN0cmVhbSB3aXRob3V0IGJsb2NraW5nIGJ5IHRoZSBuZXh0IGNhbGxlciBvZiBhIAorICAgICAgICAvLy8gbWV0aG9kIGZvciB0aGlzIGlucHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgIGludCBBdmFpbGFibGUoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDbG9zZXMgdGhpcyBpbnB1dCBzdHJlYW0gYW5kIHJlbGVhc2VzIGFueSBzeXN0ZW0gcmVzb3VyY2VzIAorICAgICAgICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICB2b2lkIENsb3NlKCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgdGhlIG5leHQgYnl0ZSBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBuZXh0IGJ5dGUgb2YgZGF0YSwgb3IgLTEgaWYgdGhlIGVuZCBvZiAKKyAgICAgICAgLy8vIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC48L3JldHVybnM+CisgICAgICAgICBpbnQgUmVhZCgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICBSZWFkcyBzb21lIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHN0b3JlcyB0aGVtIAorICAgICAgICAvLy8gaW50byB0aGUgYnVmZmVyIGFycmF5IGIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmIj50aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgaXMgcmVhZC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGludG8gdGhlIGJ1ZmZlciwgb3IgLTEgaXMgCisgICAgICAgIC8vLyB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYmVjYXVzZSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC48L3JldHVybnM+CisgICAgICAgICBpbnQgUmVhZChieXRlW10gYnVmKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaW50byBhbiBhcnJheSBvZiBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiIj50aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgaXMgcmVhZC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZiI+dGhlIHN0YXJ0IG9mZnNldCBpbiBhcnJheSBiICBhdCB3aGljaCB0aGUgZGF0YSBpcyB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVuIj50aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGludG8gdGhlIGJ1ZmZlciwgb3IgLTEgaWYgdGhlcmUgaXMgbm8gbW9yZQorICAgICAgICAvLy8gZGF0YSBiZWNhdXNlIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLjwvcmV0dXJucz4KKyAgICAgICAgIGludCBSZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvSW50Q291bnRlci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9JbnRDb3VudGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDYzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvSW50Q291bnRlci5jcwpAQCAtMCwwICsxLDUzIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgQSBzYWZlIGludGVnZXIgY291bnRlcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEludENvdW50ZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkanVzdHMgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIGJ5IGsKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrIj50aGUgYWRqdXN0bWVudCB0byB0aGUgY291bnRlci48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgY291bnRlci48L3JldHVybnM+CisgICAgICAgIC8vLyAKKyAgICAgICAgW01ldGhvZEltcGwoIE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCApXQorICAgICAgICBwdWJsaWMgaW50IEFkanVzdCggaW50IGsgKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSArPSBrOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXI8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgR2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0ludGVnZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvSW50ZWdlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGFlOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0ludGVnZXIuY3MKQEAgLTAsMCArMSwxOTAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIHB1YmxpYyBjbGFzcyBJbnRlZ2VyIDogSUNvbXBhcmFibGUsIElDb21wYXJhYmxlPEludGVnZXI+LCBJRXF1YXRhYmxlPEludGVnZXI+LCBJQ29udmVydGlibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyBJbnRlZ2VyKEludGVnZXIgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvdGhlci52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyKGludCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgdmFsdWU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBJbnRlZ2VyKGludCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgaW50KEludGVnZXIgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob2JqID09IHRoaXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmouR2V0VHlwZSgpICE9IEdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIEludGVnZXIgb3RoZXIgPSAoSW50ZWdlcilvYmo7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBJQ29tcGFyYWJsZSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIGludCBDb21wYXJlVG8ob2JqZWN0IG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9iaiBpcyBJbnRlZ2VyKQorICAgICAgICAgICAgICAgIHJldHVybiBDb21wYXJlVG8oKEludGVnZXIpb2JqKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigib2JqIGlzIG5vdCBJbnRlZ2VyIik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBJQ29tcGFyYWJsZTxJbnRlZ2VyPiBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIGludCBDb21wYXJlVG8oSW50ZWdlciBvdGhlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlIDwgb3RoZXIudmFsdWUpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IG90aGVyLnZhbHVlKSByZXR1cm4gMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUVxdWF0YWJsZTxJbnRlZ2VyPiBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKEludGVnZXIgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvdGhlciAhPSBudWxsICYmIHZhbHVlID09IG90aGVyLnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUNvbnZlcnRpYmxlIE1lbWJlcnMKKworICAgICAgICBUeXBlQ29kZSBJQ29udmVydGlibGUuR2V0VHlwZUNvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBib29sIElDb252ZXJ0aWJsZS5Ub0Jvb2xlYW4oSUZvcm1hdFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBieXRlIElDb252ZXJ0aWJsZS5Ub0J5dGUoSUZvcm1hdFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIElDb252ZXJ0aWJsZS5Ub0NoYXIoSUZvcm1hdFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBEYXRlVGltZSBJQ29udmVydGlibGUuVG9EYXRlVGltZShJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlY2ltYWwgSUNvbnZlcnRpYmxlLlRvRGVjaW1hbChJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvdWJsZSBJQ29udmVydGlibGUuVG9Eb3VibGUoSUZvcm1hdFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBzaG9ydCBJQ29udmVydGlibGUuVG9JbnQxNihJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBJQ29udmVydGlibGUuVG9JbnQzMihJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgSUNvbnZlcnRpYmxlLlRvSW50NjQoSUZvcm1hdFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBzYnl0ZSBJQ29udmVydGlibGUuVG9TQnl0ZShJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IElDb252ZXJ0aWJsZS5Ub1NpbmdsZShJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBJQ29udmVydGlibGUuVG9TdHJpbmcoSUZvcm1hdFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBvYmplY3QgSUNvbnZlcnRpYmxlLlRvVHlwZShUeXBlIGNvbnZlcnNpb25UeXBlLCBJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHVzaG9ydCBJQ29udmVydGlibGUuVG9VSW50MTYoSUZvcm1hdFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICB1aW50IElDb252ZXJ0aWJsZS5Ub1VJbnQzMihJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHVsb25nIElDb252ZXJ0aWJsZS5Ub1VJbnQ2NChJRm9ybWF0UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0xpc3RTZXJpYWxpemVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL0xpc3RTZXJpYWxpemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjdjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvTGlzdFNlcmlhbGl6ZXIuY3MKQEAgLTAsMCArMSw5NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgTGlzdFNlcmlhbGl6ZXIgOiBJbXBvcnRFeHBvcnRIZWxwZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBGSUVMRF9OQU1FID0gInZhbHVlcyI7CisKKyAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmluZXMgY3VzdG9tIGZpZWxkcyBpbiB0aGUgdmFsdWUgZmFjdG9yeSBzbyB0aGF0IHRoZSBpbXBvcnRlcgorICAgICAgICAvLy8gY2FuIGZpbmQgdGhlbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsYXNzMnR5cGUiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbml0KCBYVHlwZSB0eXBlLCBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHR5cGUuR2V0RmllbGQoIEZJRUxEX05BTUUgKTsKKyAgICAgLyogICAgICAgY2xhc3MydHlwZS5BZGQoIHR5cGVvZiggTGlzdDxvYmplY3Q+ICksIHR5cGUgKTsKKyAgICAgICAgICAgIHR5cGUuU2V0Q2xhc3ModHlwZW9mKExpc3Q8b2JqZWN0PikpOyAqLworICAgICAgICAgICAgY2xhc3MydHlwZS5BZGQodHlwZW9mKEFycmF5TGlzdCksIHR5cGUpOworICAgICAgICAgICAgdHlwZS5TZXRDb21wb25lbnRUeXBlKHR5cGVvZihBcnJheUxpc3QpKTsKKyAgICAgICAgICAgIHR5cGUuU2V0SW1wb3J0RXhwb3J0SGVscGVyKCBuZXcgTGlzdFNlcmlhbGl6ZXIoIHR5cGUsIGZpZWxkICkgKTsKKyAgICAgICAgICAgIHR5cGUuUHV0VmFsaWRhdG9yKCBmaWVsZCwgVmFsaWRhdG9yX29iamVjdC5HZXQoIDEgKSApOworICAgICAgICAgICAgdHlwZS5Mb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdFNlcmlhbGl6ZXIoIFhUeXBlIHR5cGUsIEZpZWxkIGZpZWxkICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWFR5cGUgdHlwZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZCBmaWVsZDsKKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBPYmplY3QgSW1wb3J0VmFsdWUoIFN0cnVjdFZhbHVlIHN2ICkKKyAgICAgICAgeworICAgICAgIC8vICAgIExpc3Q8b2JqZWN0PiBsaXN0ID0gbmV3IExpc3Q8b2JqZWN0PigpOworICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSAoIE9iamVjdFtdICkgc3YuR2V0KCBmaWVsZCApOworICAgICAgICAgICAgaW50IG4gPSB2YWx1ZXMuTGVuZ3RoOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICggaW5kZXggPCBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9ICggb2JqZWN0ICkgdmFsdWVzWyBpbmRleCsrIF07CisgICAgICAgICAgICAgICAgbGlzdC5BZGQoIHZhbHVlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cnVjdFZhbHVlIEV4cG9ydFZhbHVlKFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgIC8vICAgICAgIExpc3Q8b2JqZWN0PiBsaXN0ID0gKExpc3Q8b2JqZWN0Pil2YWx1ZTsKKyAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCl2YWx1ZTsKKyAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbIGxpc3QuQ291bnRdOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgZm9yZWFjaCAoIG9iamVjdCBtZSBpbiBsaXN0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbIGluZGV4KysgXSA9IG1lOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUodHlwZSwgdmYpOworICAgICAgICAgICAgc3YuQWRkKCBmaWVsZCwgdmFsdWVzICk7CisgICAgICAgICAgICByZXR1cm4gc3Y7CisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL01hcFNlcmlhbGl6ZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvTWFwU2VyaWFsaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJmZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL01hcFNlcmlhbGl6ZXIuY3MKQEAgLTAsMCArMSw5OCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgTWFwU2VyaWFsaXplciA6IEltcG9ydEV4cG9ydEhlbHBlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAia2V5c0FuZFZhbHVlcyI7CisKKyAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmluZXMgY3VzdG9tIGZpZWxkcyBpbiB0aGUgdmFsdWUgZmFjdG9yeSBzbyB0aGF0IHRoZSBpbXBvcnRlcgorICAgICAgICAvLy8gY2FuIGZpbmQgdGhlbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsYXNzMnR5cGUiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbml0KCBYVHlwZSB0eXBlLCBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHR5cGUuR2V0RmllbGQoIEZJRUxEX05BTUUgKTsKKyAgICAgIC8qICAgICAgY2xhc3MydHlwZS5BZGQoIHR5cGVvZiggRGljdGlvbmFyeTxvYmplY3Qsb2JqZWN0PiApLCB0eXBlICk7CisgICAgICAgICAgICB0eXBlLlNldENsYXNzKHR5cGVvZihEaWN0aW9uYXJ5PG9iamVjdCwgb2JqZWN0PikpOyAqLworICAgICAgICAgICAgY2xhc3MydHlwZS5BZGQodHlwZW9mKEhhc2h0YWJsZSksIHR5cGUpOworICAgICAgICAgICAgdHlwZS5TZXRDb21wb25lbnRUeXBlKHR5cGVvZihIYXNodGFibGUpKTsKKyAgICAgICAgICAgIHR5cGUuU2V0SW1wb3J0RXhwb3J0SGVscGVyKCBuZXcgTWFwU2VyaWFsaXplciggdHlwZSwgZmllbGQgKSApOworICAgICAgICAgICAgdHlwZS5QdXRWYWxpZGF0b3IoIGZpZWxkLCBWYWxpZGF0b3Jfb2JqZWN0LkdldCggMSApICk7CisgICAgICAgICAgICB0eXBlLkxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXBTZXJpYWxpemVyKCBYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgZmllbGQ7CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgT2JqZWN0IEltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdiApCisgICAgICAgIHsKKyAgICAgLy8gICAgICBEaWN0aW9uYXJ5PG9iamVjdCxvYmplY3Q+IG1hcCA9IG5ldyBEaWN0aW9uYXJ5PG9iamVjdCxvYmplY3Q+KCk7CisgICAgICAgICAgIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICBPYmplY3RbXSBrZXlzQW5kVmFsdWVzID0gKCBPYmplY3RbXSApIHN2LkdldCggZmllbGQgKTsKKyAgICAgICAgICAgIGludCBuID0ga2V5c0FuZFZhbHVlcy5MZW5ndGg7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgd2hpbGUgKCBpbmRleCA8IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCBrZXkgPSAoIG9iamVjdCApIGtleXNBbmRWYWx1ZXNbIGluZGV4KysgXTsKKyAgICAgICAgICAgICAgICBvYmplY3QgdmFsdWUgPSAoIG9iamVjdCApIGtleXNBbmRWYWx1ZXNbIGluZGV4KysgXTsKKyAgICAgICAgICAgICAgICBtYXAuQWRkKCBrZXksIHZhbHVlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RydWN0VmFsdWUgRXhwb3J0VmFsdWUoVmFsdWVGYWN0b3J5IHZmLCBPYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAvLyAgICAgRGljdGlvbmFyeTxvYmplY3QsIG9iamVjdD4gbWFwID0gKERpY3Rpb25hcnk8b2JqZWN0LCBvYmplY3Q+KXZhbHVlOworCisgICAgICAgICAgICBIYXNodGFibGUgbWFwID0gKEhhc2h0YWJsZSl2YWx1ZTsKKworICAgICAgICAgICAgT2JqZWN0W10ga2V5c0FuZFZhbHVlcyA9IG5ldyBPYmplY3RbIG1hcC5Db3VudCAqIDJdOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgZm9yZWFjaCAoIERpY3Rpb25hcnlFbnRyeSBtZSBpbiBtYXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleXNBbmRWYWx1ZXNbIGluZGV4KysgXSA9IG1lLktleTsKKyAgICAgICAgICAgICAgICBrZXlzQW5kVmFsdWVzWyBpbmRleCsrIF0gPSBtZS5WYWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisgICAgICAgICAgICBzdi5BZGQoIGZpZWxkLCBrZXlzQW5kVmFsdWVzICk7CisgICAgICAgICAgICByZXR1cm4gc3Y7CisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL01vbml0b3IuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvTW9uaXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTMzMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL01vbml0b3IuY3MKQEAgLTAsMCArMSwzMDEgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGNsYXNzIHdoaWNoIHdlIGNhbiB1c2UgdG8gbW9uaXRvciBjb25kaXRpb25zLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VHlwZSBvZiBvYmplY3QgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZSBtb25pdG9yPC90eXBlcGFyYW0+CisgICAgcHVibGljIGNsYXNzIE1vbml0b3I8VD4KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIE1vbml0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iPmEgZGVzY3JpcHRpb24gb2YgdGhpcyBtb25pdG9yPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbml0aWFsVmFsdWUiPnRoZSBpbml0aWFsIHZhbHVlIG9mIHRoaXMgbW9uaXRvcjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBNb25pdG9yKCBTdHJpbmcgZGVzY3JpcHRpb24sIFQgaW5pdGlhbFZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGluaXRpYWxWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBNb25pdG9yIHdpdGggbnVsbCBpbml0aWFsIHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iPmEgZGVzY3JpcHRpb24gb2YgdGhpcyBtb25pdG9yPC9wYXJhbT4KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBNb25pdG9yKCBTdHJpbmcgZGVzY3JpcHRpb24gKSA6IHRoaXMoIGRlc2NyaXB0aW9uLCBkZWZhdWx0KCBUICkgKQorICAgICAgICB7ICAgCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBNb25pdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz4gcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1vbml0b3I8L3JldHVybnM+CisKKyAgICAgICAgcHVibGljIFN0cmluZyBHZXREZXNjcmlwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCSAgICBwcml2YXRlIFQgdmFsdWU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiTW9uaXRvciAiK2Rlc2NyaXB0aW9uKyI6ICIrdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBtb25pdG9yPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgVCBHZXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5ld1ZhbHVlIj4gdGhlIHZhbHVlIHRvIGJlIHNldDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgb2xkIHZhbHVlLjwvcmV0dXJucz4KKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHVibGljIFQgU2V0KCBUIG5ld1ZhbHVlICkKKwkgICAgeworCQkgICAgVCBvbGRWYWx1ZSA9IHZhbHVlOworCQkgICAgdmFsdWUgPSBuZXdWYWx1ZTsKKwkJICAgIFN5c3RlbS5UaHJlYWRpbmcuTW9uaXRvci5QdWxzZUFsbCh0aGlzKTsKKwkJICAgIHJldHVybiBvbGRWYWx1ZTsKKwkgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdhaXRzIHVudGlsIG1vbml0b3IgdmFsdWUgaXMgc2V0CisgICAgICAgIC8vLyAgdGhlIHZhbHVlLiBXaWxsIHdhaXQgZm9yZXZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heERlbGF5Ij50aGUgbWF4IGFtb3VudCBvZiB0aW1lIGluIG1zIHRvIHdhaXQuCisgICAgICAgIC8vLyBJZiAwIGlzIHNwZWNpZmllZCwgd2Ugd2lsbCB3YWl0IGZvcmV2ZXIuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBtb25pdG9yLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgd2Ugd2FpdGVkIHRvbyBsb25nLgorICAgICAgICBbTWV0aG9kSW1wbCggTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkICldCisgICAgICAgIHByaXZhdGUgVCBXYWl0VW50aWxTZXQoIGxvbmcgbWF4RGVsYXkgKQorCQl7CisgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuV2FpdCggdGhpcywgKGludCkgbWF4RGVsYXkgKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKwkgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2FpdHMgdW50aWwgdmFsdWUgZXF1YWxzIHRoZSBkZXNpcmVkIHZhbHVlIGFuZAorICAgICAgICAvLy8gdGhlbiBzZXRzIHRoZSB2YWx1ZS4gV2lsbCB3YWl0IGZvcmV2ZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzaXJlZFZhbHVlIj50aGUgdmFsdWUgd2Ugd2FudDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3VmFsdWUiPnRoZSB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG9sZCB2YWx1ZTwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjogCisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgVCBXYWl0VW50aWxFcUFuZFNldCggVCBkZXNpcmVkVmFsdWUsIFQgbmV3VmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV2FpdFVudGlsRXFBbmRTZXQoIGRlc2lyZWRWYWx1ZSwgMCwgbmV3VmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdhaXRzIHVudGlsIHZhbHVlIGVxdWFscyB0aGUgZGVzaXJlZCB2YWx1ZSBhbmQKKyAgICAgICAgLy8vIHRoZW4gc2V0cyB0aGUgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZXNpcmVkVmFsdWUiPnRoZSB2YWx1ZSB3ZSB3YW50LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPnRoZSBtYXggYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gd2FpdAorICAgICAgICAvLy8gIElmIDAgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIHdhaXQgZm9yZXZlci4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3VmFsdWUiPnRoZSB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+T2xkIFZhbHVlPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOiAgCisgICAgICAgIC8vLyAgICAgdGhyb3dzIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICAgIFtNZXRob2RJbXBsKCBNZXRob2RJbXBsT3B0aW9ucy5TeW5jaHJvbml6ZWQgKV0KKyAgICAgICAgcHVibGljIFQgV2FpdFVudGlsRXFBbmRTZXQoIFQgZGVzaXJlZFZhbHVlLCBpbnQgbWF4RGVsYXksIFQgbmV3VmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBXYWl0VW50aWxFcShkZXNpcmVkVmFsdWUsIG1heERlbGF5KTsKKyAgICAgICAgICAgIHJldHVybiBTZXQobmV3VmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgdmFsdWUgaXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzaXJlZFZhbHVlIj5UaGUgdmFsdWUgd2UgYXJlIHdhaXRpbmcgZm9yLjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246ICAKKyAgICAgICAgLy8vICAgICB0aHJvd3MgVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgICAgcHVibGljIHZvaWQgV2FpdFVudGlsRXEoIFQgZGVzaXJlZFZhbHVlICkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIFdhaXRVbnRpbEVxKCBkZXNpcmVkVmFsdWUsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdhaXRzIHVudGlsIHRoZSB2YWx1ZSBlcXVhbHMgdGhlIGRlc2lyZWQgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZXNpcmVkVmFsdWUiPlRoZSB2YWx1ZSB3ZSB3YW50PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXhEZWxheSI+dGhlIG1heCBhbW91bnQgb2YgdGltZSBpbiBtcyB0byB3YWl0LgorICAgICAgICAvLy8gSWYgMCBpcyBzcGVjaWZpZWQsIHdlIHdpbGwgd2FpdCBmb3JldmVyLjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHdlIHdhaXRlZCB0b28gbG9uZy4KKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHVibGljIHZvaWQgV2FpdFVudGlsRXEoVCBkZXNpcmVkVmFsdWUsIGludCBtYXhEZWxheSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tEZWxheShtYXhEZWxheSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvbmcgbm93ID0gSFBUaW1lci5Ob3coKTsgCisgICAgICAgICAgICBsb25nIGVuZCA9IEVuZFRpbWUobm93LCBtYXhEZWxheSk7CisgCisgICAgICAgICAgICBpbnQgZDsKKyAgICAgICAgICAgIHdoaWxlICghRXEodmFsdWUsIGRlc2lyZWRWYWx1ZSkgJiYgKGQgPSBSZW1UaW1lKGVuZCwgbm93KSkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuTW9uaXRvci5XYWl0KHRoaXMsIGQpOworICAgICAgICAgICAgICAgIG5vdyA9IEhQVGltZXIuTm93KCk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIUVxKHZhbHVlLCBkZXNpcmVkVmFsdWUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbigidGltZW91dCIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2FpdHMgdW50aWwgdmFsdWUgZG9lcyBub3QgZXF1YWwgdGhlIHVuZGVzaXJlZCB2YWx1ZSBhbmQgdGhlbgorICAgICAgICAvLy8gc2V0cyB0aGUgdmFsdWUuIFdpbGwgd2FpdCBmb3JldmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idW5kZXNpcmVkVmFsdWUiPnRoZSB2YWx1ZSB3ZSBkbyBub3Qgd2FudDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3VmFsdWUiPnRoZSB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+T2xkIHZhbHVlPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgVCBXYWl0VW50aWxOb3RFcUFuZFNldCggVCB1bmRlc2lyZWRWYWx1ZSwgVCBuZXdWYWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXYWl0VW50aWxOb3RFcUFuZFNldCggdW5kZXNpcmVkVmFsdWUsIDAsIG5ld1ZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXYWl0cyB1bnRpbCB2YWx1ZSBkb2VzIG5vdCBlcXVhbCB0aGUgdW5kZXNpcmVkIHZhbHVlIGFuZCB0aGVuCisgICAgICAgIC8vLyBzZXRzIHRoZSB2YWx1ZS4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idW5kZXNpcmVkVmFsdWUiPnRoZSB2YWx1ZSB3ZSBkbyBub3Qgd2FudDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPnRoZSBtYXggYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gd2FpdC4KKyAgICAgICAgLy8vIElmIDAgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIHdhaXQgZm9yZXZlci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5ld1ZhbHVlIj5OZXcgdmFsdWU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG9sZCB2YWx1ZTwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgVGhyZWFkSW50ZXJydXBlZEV4Y2VwdGlvbgorICAgICAgICBbTWV0aG9kSW1wbCggTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkICldCisgICAgICAgIHB1YmxpYyBUIFdhaXRVbnRpbE5vdEVxQW5kU2V0KCBUIHVuZGVzaXJlZFZhbHVlLAorICAgICAgICAgICAgaW50IG1heERlbGF5LCBUIG5ld1ZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgV2FpdFVudGlsTm90RXEoIHVuZGVzaXJlZFZhbHVlLCBtYXhEZWxheSApOworICAgICAgICAgICAgcmV0dXJuIFNldCggbmV3VmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdhaXRzIHVudGlsIHZhbHVlIGRvZXMgbm90IGVxdWFsIHRoZSB1bmRlc2lyZWQgdmFsdWUuIFdpbGwKKyAgICAgICAgLy8vIHdhaXQgZm9yZXZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVuZGVzaXJlZFZhbHVlIj5UaGUgdmFsdWUgd2UgZG8gbm90IHdhbnQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+Q3VycmV0biB2YWx1ZSBvZiB0aGUgbW9uaXRvcjwvcmV0dXJucz4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgd2Ugd2FpdGVkIHRvbyBsb25nLgorICAgICAgICBwdWJsaWMgVCBXYWl0VW50aWxOb3RFcSggVCB1bmRlc2lyZWRWYWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXYWl0VW50aWxOb3RFcSggdW5kZXNpcmVkVmFsdWUsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdhaXRzIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1bmRlc2lyZWRWYWx1ZSI+dGhlIHZhbHVlIHdlIGRvIG5vdCB3YW50LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPnRoZSBtYXggYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gd2FpdC4KKyAgICAgICAgLy8vIElmIDAgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIHdhaXQgZm9yZXZlci48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG1vbml0b3I8L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHdlIHdhaXRlZCB0b28gbG9uZy4KKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHVibGljIFQgV2FpdFVudGlsTm90RXEoVCB1bmRlc2lyZWRWYWx1ZSwgaW50IG1heERlbGF5KQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja0RlbGF5KG1heERlbGF5KTsKKworICAgICAgICAgICAgbG9uZyBub3cgPSBIUFRpbWVyLk5vdygpOworICAgICAgICAgICAgbG9uZyBlbmQgPSBFbmRUaW1lKG5vdywgbWF4RGVsYXkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgZDsKKyAgICAgICAgICAgIHdoaWxlIChFcSh2YWx1ZSwgdW5kZXNpcmVkVmFsdWUpICYmIChkID0gUmVtVGltZShlbmQsIG5vdykpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuV2FpdCh0aGlzLCBkKTsKKyAgICAgICAgICAgICAgICBub3cgPSBIUFRpbWVyLk5vdygpOyAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChFcSh2YWx1ZSwgdW5kZXNpcmVkVmFsdWUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbigidGltZW91dCIpOworCisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ2hlY2tEZWxheShpbnQgbWF4RGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtYXhEZWxheSA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJtYXhEZWxheSA8IDAiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgbG9uZyBFbmRUaW1lKGxvbmcgbm93LCBpbnQgbWF4RGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgCWlmIChtYXhEZWxheSA9PSAwIHx8IG1heERlbGF5ID09IGludC5NYXhWYWx1ZSkKKyAgICAgICAgCQlyZXR1cm4gbG9uZy5NYXhWYWx1ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5vdyArIG1heERlbGF5ICogSFBUaW1lci5OU19QRVJfTUlMTElTRUNPTkQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBSZW1UaW1lKGxvbmcgZW5kLCBsb25nIG5vdykKKyAgICAgICAgeworICAgICAgICAJaWYgKGVuZCA9PSBsb25nLk1heFZhbHVlKQorICAgICAgICAJCXJldHVybiBpbnQuTWF4VmFsdWU7CisgICAgICAgIAkKKyAgICAgICAgCWxvbmcgbXMgPSAoZW5kIC0gbm93KSAvIEhQVGltZXIuTlNfUEVSX01JTExJU0VDT05EOworICAgICAgICAJaWYgKG1zID4gaW50Lk1heFZhbHVlKQorICAgICAgICAJCXJldHVybiBpbnQuTWF4VmFsdWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBtczsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InYxIj5hIHZhbHVlIHRvIGNvbXBhcmUsIHdoaWNoIG1heSBiZSBudWxsLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idjIiPmFub3RoZXIgdmFsdWUgdG8gY29tcGFyZSwgd2hpY2ggbWF5IGJlIG51bGwuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4gSWYgYm90aAorICAgICAgICAvLy8gdmFsdWVzIGFyZSBudWxsLCB0aGV5IGFyZSBjb25zaWRlcmVkIGVxdWFsLjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBib29sIEVxKCBUIHYxLCBUIHYyICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB2MSAhPSBudWxsICYmIHYyICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiB2MS5FcXVhbHModjIpOworCisgICAgICAgICAgICBpZiAoIHYxID09IG51bGwgJiYgdjIgPT0gbnVsbCApIAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvT3V0cHV0U3RyZWFtLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL091dHB1dFN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTk0ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL091dHB1dFN0cmVhbS5jcwpAQCAtMCwwICsxLDU2IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgcHVibGljIGludGVyZmFjZSBPdXRwdXRTdHJlYW0KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENsb3NlcyB0aGlzIG91dHB1dCBzdHJlYW0gYW5kIHJlbGVhc2VzIGFueSBzeXN0ZW0gcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBDbG9zZSgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyBiLmxlbmd0aCBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheSB0byB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYiI+dGhlIGRhdGE8L3BhcmFtPgorICAgICAgICB2b2lkIFdyaXRlKGJ5dGVbXSBiKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgbGVuIGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5IHN0YXJ0aW5nIGF0IG9mZnNldCBvZmYgdG8gdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIiPnRoZSBkYXRhPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmYiPnRoZSBzdGFydCBvZmZzZXQgaW4gdGhlIGRhdGEuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW4iPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGU8L3BhcmFtPgorICAgICAgICB2b2lkIFdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgdGhlIHNwZWNpZmllZCBieXRlIHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiIj50aGUgYnl0ZTwvcGFyYW0+CisgICAgICAgIHZvaWQgV3JpdGUoaW50IGIpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCBieXRlcyBmcm9tIHRoaXMgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgYnl0ZVtdIEdldEJ5dGVzKCk7CisgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1BhY2tldGl6ZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvUGFja2V0aXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjE1N2JmCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1BhY2tldGl6ZXIuY3MKQEAgLTAsMCArMSwyOTcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUGFja2V0aXplcyBhIHN0cmVhbSBkYXRhIHNvdXJjZS4gUmVhZHMgYSBwYWNrZXQgaGVhZGVyLAorICAgIC8vLyBhIDMyLWJpdCBmbGFnIGFuZCBhIDMyLWJpdCBsZW5ndGgsIGxpdHRsZS1lbmRpYW4sIHZlcmlmaWVzCisgICAgLy8vIHRoZSBmbGFnLCBhbmQgdGhlbiwgdXNpbmcgdGhlIGxlbmd0aCBmcm9tIHRoZSBoZWFkZXIsCisgICAgLy8vIHJlYWRzIHRoZSBwYWNrZXQgZGF0YSBhbmQgcGFzc2VzIGl0IHRvIHRoZSBwYWNrZXQgaGFuZGxlci4KKyAgICAvLy8gQXMgYSBwYWNrZXQgc291cmNlLCBhY2NlcHRzIGEgcGFja2V0IGFuZCBwcmVwZW5kcyBhIHBhY2tldAorICAgIC8vLyBoZWFkZXIgdG8gaXQgYmVmb3JlIGRlbGl2ZXJpbmcgaXQgdG8gYSBkYXRhIHNvdXJjZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBQYWNrZXRpemVyIDogU2Vzc2lvbkRhdGEsIFRyYW5zcG9ydFBhY2tldAorICAgIHsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVUkkgdGVybSB0byBzcGVjaWZ5IG1heCBwYWNrZXQgc2l6ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIE1BWF9QS1RfU0laRV9URVJNID0gIlBhY2tldGl6ZXIubWF4UGt0U2l6ZSI7CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgU0lHID0gdW5jaGVja2VkKCAoaW50KSAweGRlYWRiZWVmICk7CisKKwkgICAgcHJpdmF0ZSBjb25zdCBpbnQgSEVBREVSX1NJWkUgPSA4OworICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGRlZmF1bHQgbWF4aW11bSBwYWNrZXQgc2l6ZSB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQsIDE2Mzc2IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgaW50IERFRkFVTFRfTUFYX1BLVF9TSVpFID0gMTYzODQgLSBIRUFERVJfU0laRTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBQYWNrZXRpemVyIHdpdGggdGhlIHNwZWNpZmllZCB0cmFuc3BvcnQKKyAgICAgICAgLy8vIGFuZCB0aGUgcGFja2V0IHNpemUuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRyYW5zcG9ydCI+VHJhbnNwb3J0IHRvIHNlbmQgZGF0YTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4UGt0U2l6ZSI+dGhlIG1heGltdW0gcGFja2V0IHNpemUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkLgorICAgICAgICAvLy8gTXVzdCBiZSA+PSAwLiBJZiBtYXhQa3RTaXplID09IDAsIHRoZSBkZWZhdWx0IHdpbGwgYmUgdXNlZC48L3BhcmFtPgorICAgICAgICBwcml2YXRlIFBhY2tldGl6ZXIoIFRyYW5zcG9ydERhdGEgdHJhbnNwb3J0LCBpbnQgbWF4UGt0U2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggbWF4UGt0U2l6ZSA8IDAgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oICJtYXhQa3RTaXplIDwgMCIgKTsKKworICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLm1heFBrdFNpemUgPSBtYXhQa3RTaXplOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cmFuc3BvcnQuU2V0U2Vzc2lvbih0aGlzKTsKKyAgICAgICAgfQorCisgICAKKworICAgICAgICBwdWJsaWMgUGFja2V0aXplciggVHJhbnNwb3J0RGF0YSB0cmFuc3BvcnQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorICAgICAgICAgICAgOiB0aGlzKCB0cmFuc3BvcnQsIChpbnQpdXJpLkdldEludGVnZXJUZXJtKCBNQVhfUEtUX1NJWkVfVEVSTSwgREVGQVVMVF9NQVhfUEtUX1NJWkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFja2V0aXplcihUcmFuc3BvcnREYXRhIHRyYW5zcG9ydCwgU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgCTogdGhpcyh0cmFuc3BvcnQsIG5ldyBVUkwodXJpKSwgcmVzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRyYW5zcG9ydERhdGEgdHJhbnNwb3J0OworCisgICAgICAgIHByaXZhdGUgU2Vzc2lvblBhY2tldCBzZXNzaW9uOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG1heFBrdFNpemU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJQYWNrZXRpemVyIC8gezB9IiwgdHJhbnNwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCB3YW50SGVhZGVyID0gdHJ1ZTsKKworICAgICAgICBwcml2YXRlIGludCBib2R5TGVuOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmxleEJ1ZmZlciBzYXZlZEJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgUHJvY2Vzc0hlYWRlciggRmxleEJ1ZmZlciBidWYsIGJvb2wgcmVzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2lnID0gYnVmLkdldEludCgpOworICAgICAgICAgICAgaWYgKCBzaWcgIT0gU0lHICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiYmFkIFNJRyIgKTsKKworICAgICAgICAgICAgaW50IHBrdFNpemUgPSBidWYuR2V0SW50KCk7CisKKyAgICAgICAgICAgIGlmICggcmVzZXQgKQorICAgICAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworCisgICAgICAgICAgICBpZiAoIHBrdFNpemUgPCAwIHx8IChtYXhQa3RTaXplID4gMCAmJiBwa3RTaXplID4gbWF4UGt0U2l6ZSkgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJwa3RTaXplIDwgMCB8fCAobWF4UGt0U2l6ZSA+IDAgJiYgcGt0U2l6ZSA+IG1heFBrdFNpemUpIiApOworCisgICAgICAgICAgICByZXR1cm4gcGt0U2l6ZTsKKworICAgICAgICB9CisKKyAgCisKKyAgICAgICAgcHVibGljIGludCBIZWFkZXJTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhFQURFUl9TSVpFOworICAgICAgICB9CisKKyAgICAgICAKKworCisgICAgICAgIHB1YmxpYyBPYmplY3QgU2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5TZXNzaW9uUXVlcnkoIHF1ZXJ5ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlc3Npb24uU2Vzc2lvbkNvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnRPYmogKQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25Ob3RpZnkoIGV2ZW50T2JqICk7CisgICAgICAgIH0KKworCisgICAgICAKKyAgICAgICAKKworICAgICAgIAorCisgICAgICAgIHB1YmxpYyBPYmplY3QgVHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuVHJhbnNwb3J0UXVlcnkoIHF1ZXJ5ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LlRyYW5zcG9ydENvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudE9iaiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5UcmFuc3BvcnROb3RpZnkoIGV2ZW50T2JqICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydFBhY2tldCBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0U2Vzc2lvbihTZXNzaW9uUGFja2V0IHNlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2Vzc2lvblBhY2tldCBHZXRTZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydFBhY2tldChXaG8gcmVjaXBpZW50LCBGbGV4QnVmZmVyIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRGF0YS1pemUgdGhlIHBhY2tldAorCisgICAgICAgICAgICAvLyBhc3NlcnQgaW5kZXggaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXIuCisgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSBidWYuQXZhaWwoKTsKKyAgICAgICAgICAgIGlmIChkYXRhU2l6ZSA8IEhFQURFUl9TSVpFKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiZGF0YVNpemUgPCBIRUFERVJfU0laRSIpOworCisJCQlpbnQgcGt0U2l6ZSA9IGRhdGFTaXplIC0gSEVBREVSX1NJWkU7CisJCQlpZiAobWF4UGt0U2l6ZSA+IDAgJiYgcGt0U2l6ZSA+IG1heFBrdFNpemUpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAibWF4UGt0U2l6ZSA+IDAgJiYgcGt0U2l6ZSA+IG1heFBrdFNpemUiICk7CisJCQkKKyAgICAgICAgICAgIGludCBpbmRleCA9IGJ1Zi5JbmRleCgpOworICAgICAgICAgICAgYnVmLlB1dEludChTSUcpOworICAgICAgICAgICAgYnVmLlB1dEludChwa3RTaXplKTsKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleChpbmRleCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuVHJhbnNwb3J0RGF0YShyZWNpcGllbnQsIGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBTZXNzaW9uRGF0YSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkRhdGEoV2hvIHNlbmRlciwgRmxleEJ1ZmZlciBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChidWYuQXZhaWwoKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdhbnRIZWFkZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyB3ZSBoYXZlIGVub3VnaCB0byBtYWtlIGEgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgIGlmICgoc2F2ZWRCdWYuTGVuZ3RoKCkgKyBidWYuQXZhaWwoKSkgPj0gSEVBREVSX1NJWkUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwa3RTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkQnVmLkxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZWRCdWYgaXMgZW1wdHksIGVudGlyZSBoZWFkZXIgaW4gYnVmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdFNpemUgPSBQcm9jZXNzSGVhZGVyKGJ1ZiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgIC8vIGhlYWRlciBzcGxpdCBhY3Jvc3Mgc2F2ZWRCdWYgYW5kIGJ1ZgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUganVzdCBlbm91Z2ggZGF0YSBmcm9tIGJ1ZiB0byBzYXZlZEJ1ZiB0byBoYXZlIGEgaGVhZGVyLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5lZWRGcm9tQnVmID0gSEVBREVSX1NJWkUgLSBzYXZlZEJ1Zi5MZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZEJ1Zi5QdXQoYnVmLCBuZWVkRnJvbUJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRCdWYuU2V0SW5kZXgoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RTaXplID0gUHJvY2Vzc0hlYWRlcihzYXZlZEJ1ZiwgdHJ1ZSk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrdFNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUxlbiA9IHBrdFNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB3YW50SGVhZGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgLy8gd2FudCBoZWFkZXIgYnV0IG5vdCBlbm91Z2ggc3BhY2UgdG8gbWFrZSBpdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGJ1ZiBpbiBzYXZlZEJ1Zi4KKworICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRCdWYuU2V0SW5kZXgoc2F2ZWRCdWYuTGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRCdWYuUHV0KGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHNhdmVkQnVmLkxlbmd0aCgpICsgYnVmLkF2YWlsKCkpID49IGJvZHlMZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB3YW50IGJvZHksIGFuZCB0aGVyZSdzIGVub3VnaCB0byBtYWtlIGl0LgorCisgICAgICAgICAgICAgICAgICAgIC8vIHRocmVlIHBvc3NpYmxlIGNhc2VzOiB0aGUgYm9keSBpcyBlbnRpcmVseSBpbiBzYXZlZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvZHkgaXMgc3BsaXQsIG9yIHRoZSBib2R5IGlzIGVudGlyZWx5IGluIGJ1Zi4gYXNzZXJ0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGJvZHkgY2Fubm90IGVudGlyZWx5IGJlIGluIHNhdmVkQnVmLCBvciBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIHdlJ2QgaGF2ZSBwcm9jZXNzZWQgaXQgbGFzdCB0aW1lLgorCisgICAgICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChzYXZlZEJ1Zi5MZW5ndGgoKSA8IGJvZHlMZW4pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZEJ1Zi5MZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlZEJ1ZiBpcyBlbXB0eSwgZW50aXJlIGJvZHkgaW4gYnVmLgorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYnVmLkxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gYnVmLkluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKGluZGV4ICsgYm9keUxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAvLyAgaGFuZGxlci5QYWNrZXQoc2VuZGVyLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uUGFja2V0KHNlbmRlcixidWYpOworCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuU2V0SW5kZXgoaW5kZXggKyBib2R5TGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2FudEhlYWRlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbHNlICAgIC8vIGJvZHkgc3BsaXQgYWNyb3NzIHNhdmVkQnVmIGFuZCBidWYKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBqdXN0IGVub3VnaCBkYXRhIGZyb20gYnVmIHRvIHNhdmVkQnVmIHRvIGhhdmUgYSBib2R5LgorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmVlZEZyb21CdWYgPSBib2R5TGVuIC0gc2F2ZWRCdWYuTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZEJ1Zi5QdXQoYnVmLCBuZWVkRnJvbUJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZEJ1Zi5TZXRJbmRleCgwKTsKKworICAgICAgICAgICAgICAgLy8gICAgICAgICBoYW5kbGVyLlBhY2tldChzZW5kZXIsIHNhdmVkQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uU2Vzc2lvblBhY2tldChzZW5kZXIsc2F2ZWRCdWYpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZEJ1Zi5SZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgd2FudEhlYWRlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbHNlICAgICAvLyB3YW50IGJvZHksIGJ1dCB0aGVyZSdzIG5vdCBlbm91Z2ggdG8gbWFrZSBpdC4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgYnVmIGluIHNhdmVkQnVmLgorCisgICAgICAgICAgICAgICAgICAgIHNhdmVkQnVmLlB1dChidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGJ1ZiBpcyBub3cgZW1wdHksIGFuZCB0aGVyZSdzIG5vdGhpbmcgZWxzZSB0byBkby4KKyAgICAgICAgICAgIERlYnVnLkFzc2VydChidWYuQXZhaWwoKSA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvUGVyZlRlc3QuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvUGVyZlRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2MzZmNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9QZXJmVGVzdC5jcwpAQCAtMCwwICsxLDExNyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEZyYW1ld29yayBmb3IgcnVubmluZyBwZXJmb3JtYW5jZSB0ZXN0cy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBQZXJmVGVzdAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTdHJpbmcgX2Rlc2NyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcnVudGltZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NvdW50OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJ1blRpbWVzIF9yOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdCB0aGUgcGVyZnRlc3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZXNjciI+ZGVzY3JpcHRpb24gb2YgdGhlIHRlc3Q8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJ1bnRpbWUiPnRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBydW4gZWFjaCB0ZXN0IGN5Y2xlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+dGhlIG51bWJlciBvZiB0ZXN0IGN5Y2xlcyB0byBydW48L3BhcmFtPgorICAgICAgICBwdWJsaWMgUGVyZlRlc3QoIFN0cmluZyBkZXNjciwgaW50IHJ1bnRpbWUsIGludCBjb3VudCwgUnVuVGltZXMgcnQgKQorICAgICAgICB7CisgICAgICAgICAgICBfZGVzY3IgPSBkZXNjcjsKKyAgICAgICAgICAgIF9ydW50aW1lID0gcnVudGltZTsKKyAgICAgICAgICAgIF9jb3VudCA9IGNvdW50OworICAgICAgICAgICAgX3IgPSBydDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJ1bnMgdGhlIFBlcmZUZXN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIFJ1biggKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvbmcgb2xkbiA9IDA7CisgICAgICAgICAgICBsb25nIG4gPSAxOworICAgICAgICAgICAgZG91YmxlIHQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAodCA8IDEpCisJCSAgICB7CisJCQkgICAgaWYgKHQgPiAwLjEpCisJCQkJICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiezB9OiB7MX0gdG9vayB7Mn0sIHRyeWluZyB7M30gdG8gZ2V0ID49IDEgc2Vjb25kXG4iLCBfZGVzY3IsIG9sZG4sIHQsIG4gKTsKKwkJCSAgICBvbGRuID0gbjsKKwkJCSAgICB0ID0gUnVuT25lKCBuICk7CisJCQkgICAgbiAqPSAyOworCQkgICAgfQorCQkgICAgbiA9IG9sZG47CisKKyAgICAgICAgICAgIGludCBrID0gMjsKKwkJICAgIG4gPSAobG9uZykgKGsgKiBuIC8gdCk7CisJCSAgICBDb25zb2xlLldyaXRlTGluZSggInswfTogezF9IHRvb2sgezJ9LCB0cnlpbmcgezN9IGZvciB7NH0gc2Vjb25kc1xuIiwgX2Rlc2NyLCBvbGRuLCB0LCBuLCBrICk7CisJCSAgICBvbGRuID0gbjsKKwkJICAgIHQgPSBSdW5PbmUoIG4gKTsKKworICAgICAgICAgICAgayA9IDQ7CisJCSAgICBuID0gKGxvbmcpIChrICogbiAvIHQpOworCQkgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJ7MH06IHsxfSB0b29rIHsyfSwgdHJ5aW5nIHszfSBmb3IgezR9IHNlY29uZHNcbiIsIF9kZXNjciwgb2xkbiwgdCwgbiwgayApOworCQkgICAgb2xkbiA9IG47CisJCSAgICB0ID0gUnVuT25lKCBuICk7CisgICAgCQkKKwkJICAgIG4gPSAobG9uZykgKF9ydW50aW1lICogbiAvIHQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJ7MH06IHsxfSB0b29rIHsyfSwgdXNpbmcgezN9IGZvciB7NH0gc2Vjb25kc1xuIiwKKwkJCSAgICBfZGVzY3IsIG9sZG4sIHQsIG4sIF9ydW50aW1lICk7CisKKyAgICAgICAgICAgIExpc3Q8ZG91YmxlPiBsaXN0ID0gbmV3IExpc3Q8ZG91YmxlPiggX2NvdW50ICk7CisgICAgICAgICAgICBkb3VibGUgc3VtID0gMDsKKwkJICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IF9jb3VudDsgaSsrKQorCQkgICAgeworCQkJICAgIHQgPSBSdW5PbmUoIG4gKTsKKwkJCSAgICBkb3VibGUgciA9IG4vdDsKKwkJCSAgICBsaXN0LkFkZCggciApOworCQkJICAgIHN1bSArPSByOworCQkJICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiezB9IHsxfS97Mn1cdHszfVx0ezR9XHR7NX1cbiIsCisJCQkJICAgIF9kZXNjciwgaSwgX2NvdW50LCBuLCB0LCByICk7CisJCSAgICB9CisKKyAgICAgICAgICAgIGxpc3QuU29ydCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJ7MH0gbWluXHR7MX1cbiIsIF9kZXNjciwgbGlzdFsgMCBdICk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggInswfSBtZWRpYW5cdHsxfVxuIiwgX2Rlc2NyLCBsaXN0WyBfY291bnQvMiBdICk7CisJCSAgICBDb25zb2xlLldyaXRlTGluZSggInswfSBhdmdcdHsxfVxuIiwgX2Rlc2NyLCBzdW0vX2NvdW50ICk7CisJCSAgICBDb25zb2xlLldyaXRlTGluZSggInswfSBtYXhcdHsxfVxuIiwgX2Rlc2NyLCBsaXN0WyBfY291bnQtMSBdICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRvdWJsZSBSdW5PbmUoIGxvbmcgbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgdDAgPSBIUFRpbWVyLk5vdygpOworICAgICAgICAgICAgX3IoIG4gKTsKKyAgICAgICAgICAgIHJldHVybiBIUFRpbWVyLlNlY29uZHNTaW5jZSh0MCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSdW5zIHRoZSB0ZXN0IHdpdGggdGhlIHNwZWNpZmljIG51bWJlciBvZiB0aW1lcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBSdW5UaW1lcyggbG9uZyBuICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1Jlc291cmNlcy5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9SZXNvdXJjZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3NGVlMwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9SZXNvdXJjZXMuY3MKQEAgLTAsMCArMSw0OCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgUmVzb3VyY2VzIDogRGljdGlvbmFyeTxTdHJpbmcsIE9iamVjdD4KKyAgICB7CisgICAgICAgIHB1YmxpYyBSZXNvdXJjZXMoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZXMoIFJlc291cmNlcyByICkKKyAgICAgICAgICAgIDogYmFzZSggciApCisgICAgICAgIHsgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgR2V0KCBTdHJpbmcga2V5ICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbIGtleSBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBLZXlOb3RGb3VuZEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvUnVubmVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1J1bm5lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRmOTUxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1J1bm5lci5jcwpAQCAtMCwwICsxLDEzNCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW1wbGVtZW50YXRpb24gb2Ygc3RhcnRhYmxlIHdoaWNoIGNyZWF0ZXMgYSB0aHJlYWQgYW5kIHJ1bnMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgUnVubmVyIDogQWJzdHJhY3RTdGFydGFibGUgCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBSdW5uZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBSdW5uZXIoKQorICAgICAgICB7IAorICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBoYW5kbGVyIGlzIHVzZWQgdG8gcmVwb3J0IHN0YXJ0ZWQgYW5kIHN0b3BwZWQgZXZlbnRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFJ1bm5lckhhbmRsZXIgaGFuZGxlcjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJoYW5kbGVyIj5oYW5kbGVyIHRoZSBoYW5kbGVyIHRvIG5vdGlmeSBvZiBzdGFydGVkIGFuZCBzdG9wcGVkIGV2ZW50cy48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRIYW5kbGVyKFJ1bm5lckhhbmRsZXIgaGFuZGxlcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFN0YXJ0MCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChSdW4pKTsKKyAgICAgICAgICAgIHRoaXNUaHJlYWQuU3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRocmVhZCB0aGlzVGhyZWFkOworCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFN0b3AwKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGhyZWFkIHQgPSB0aGlzVGhyZWFkOworICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzVGhyZWFkID0gbnVsbDsKKyAgICAgIC8vICAgICAgICAgIHQuSm9pbiggMzAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJ1bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpcmVTdGFydGVkKCk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIHdoaWxlIChJc1N0YXJ0ZWQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghUnVuMChmaXJzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlyZUV4Y2VwdGlvbigicnVuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0U3RvcHBlZCgpOworICAgICAgICAgICAgICAgIEZpcmVTdG9wcGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRmlyZVN0YXJ0ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGVyLlN0YXJ0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlcG9ydHMgYW4gZXhjZXB0aW9uIGNhdWdodCBieSB0aGUgdGhyZWFkIG1hbmFnaW5nIHRoZSBydW5uYWJsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3aGF0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImUiPjwvcGFyYW0+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIEZpcmVFeGNlcHRpb24oU3RyaW5nIHdoYXQsIEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCBlICk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLkV4Y2VwdGlvbih3aGF0LCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBGaXJlU3RvcHBlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZXIuU3RvcHBlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlyc3QiPnRydWUgdGhlIGZpcnN0IHRpbWUgd2UgYXJlIGNhbGxlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHdlIHNob3VsZCBrZWVwIHJ1bm5pbmcuPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2wgUnVuMChib29sIGZpcnN0KTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9SdW5uZXJIYW5kbGVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1J1bm5lckhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MGNmZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9SdW5uZXJIYW5kbGVyLmNzCkBAIC0wLDAgKzEsNDggQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUnVubmVySGFuZGxlciByZWNlaXZlcyBub3RpZmljYXRpb24gb2YgcnVubmVyIGV2ZW50cy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgUnVubmVySGFuZGxlcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVwb3J0cyB0aGF0IHRoZSB0aHJlYWQgY29udHJvbGxpbmcgdGhlIHJ1bm5lciBoYXMgc3RhcnRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBTdGFydGVkKCApOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlcG9ydHMgdGhhdCB0aGUgdGhyZWFkIGNvbnRyb2xsaW5nIHRoZSBydW5uZXIgaGFzIHN0b3BwZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgU3RvcHBlZCgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlcG9ydHMgdGhhdCB0aGUgdGhyZWFkIGNvbnRyb2xsaW5nIHRoZSBydW5uZXIgaGFzIGNhdWdodCBhbgorICAgICAgICAvLy8gZXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndoYXQiPkEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIG9yaWdpbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZSI+RXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodDwvcGFyYW0+CisgICAgICAgIHZvaWQgRXhjZXB0aW9uKCBTdHJpbmcgd2hhdCwgRXhjZXB0aW9uIGUgKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TZXNzaW9uLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1Nlc3Npb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiYzU3OQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TZXNzaW9uLmNzCkBAIC0wLDAgKzEsODEgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gT3V0LW9mLWJhbmQgcXVlcnksIGNvbnRyb2wsIGFuZCBub3RpZmljYXRpb24gaW50ZXJmYWNlIGZvciBzZXNzaW9ucy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyBhIGNvbmZpZ3VyYXRpb24gb3Igb3BlcmF0aW9uYWwgdmFsdWUgZnJvbSB0aGUgaGFuZGxlci4gVGhlCisgICAgICAgIC8vLyByZXF1ZXN0IGlzIHBhc3NlZCB1cCB0aGUgY2hhaW4gb2Ygc2Vzc2lvbnMgdW50aWwgc29tZSBzZXNzaW9uCisgICAgICAgIC8vLyByZWNvZ25pc2VzIHRoZSBxdWVyeSwgd2hlcmV1cG9uIGl0IHJldHVybnMgdGhlIHJlcXVlc3RlZCB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJxdWVyeSI+YW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHF1ZXJ5LCB3aGljaCBjb3VsZCBiZSBhcworICAgICAgICAvLy8gc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworICAgICAgICAvLy8gYSBjbGFzcyB3aXRoIGluc3RhbmNlIHZhcmlhYmxlcyBmb3IgcXVlcnkgdGVybXMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSByZXF1ZXN0ZWQgdmFsdWUsIG9yIG51bGwgaWYgbm90IGRlZmluZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGlzIG5vdCByZWNvZ25pc2VkCisgICAgICAgIC8vLyAgICAgYnkgYW55IHNlc3Npb24gKHdoaWNoIGlzIHRvIHNheSwgaWYgdGhlIGxhc3Qgc2Vzc2lvbiBpbiB0aGUgc2Vzc2lvbgorICAgICAgICAvLy8gICAgIGNoYWluIGRvZXMgbm90IHJlY29nbmlzZSBpdCwgaXQgc2hvdWxkIHRocm93IHRoaXMgZXhjZXB0aW9uKS4gVHlwaWNhbGx5CisgICAgICAgIC8vLyAgICAgdGhpcyB3b3VsZCBiZSBhIHNlcnZpY2UncyBjbGllbnQgb3Igc2VydmVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICAvLy8gICAgIAorICAgICAgICBPYmplY3QgU2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIGEgY29uZmlndXJhdGlvbiBvciBvcGVyYXRpb25hbCB2YWx1ZSBpbiB0aGUgc2Vzc2lvbi4gVGhlCisgICAgICAgIC8vLyByZXF1ZXN0IGlzIHBhc3NlZCB1cCB0aGUgY2hhaW4gb2Ygc2Vzc2lvbnMgdW50aWwgc29tZSBzZXNzaW9uCisgICAgICAgIC8vLyByZWNvZ25pc2VzIHRoZSBjb250cm9sLCB3aGVyZXVwb24gaXQgc3RvcmVzIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgLy8vIGFuZCByZXR1cm5zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRyb2wiPmFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjb250cm9sLCB3aGljaCBjb3VsZCBiZSBhcworICAgICAgICAvLy8gc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworICAgICAgICAvLy8gYSBjbGFzcyB3aXRoIGluc3RhbmNlIHZhcmlhYmxlcyBmb3IgY29udHJvbCB0ZXJtcy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj50aGUgdmFsdWUgdG8gc2V0PC9wYXJhbT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgIHRocm93cyBBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodAorICAgICAgICAvLy8gICAgIHR5cGUgb3IgaWYgdGhlIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUuCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBpcyBub3QgcmVjb2duaXNlZAorICAgICAgICAvLy8gICAgIGJ5IGFueSBzZXNzaW9uICh3aGljaCBpcyB0byBzYXksIGlmIHRoZSBsYXN0IHNlc3Npb24gaW4gdGhlIHNlc3Npb24KKyAgICAgICAgLy8vICAgICBjaGFpbiBkb2VzIG5vdCByZWNvZ25pc2UgaXQsIGl0IHNob3VsZCB0aHJvdyB0aGlzIGV4Y2VwdGlvbikuIFR5cGljYWxseQorICAgICAgICAvLy8gICAgIHRoaXMgd291bGQgYmUgYSBzZXJ2aWNlJ3MgY2xpZW50IG9yIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgLy8vICAgICAKKyAgICAgICAgdm9pZCBTZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vdGlmaWVzIHRoZSBjaGFpbiBvZiBzZXNzaW9ucyBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LiBVbmxpa2UgcXVlcnkKKyAgICAgICAgLy8vIGFuZCBjb250cm9sIG9wZXJhdGlvbnMgYWJvdmUsIGV2ZW50cyBhcmUgYWx3YXlzIHBhc3NlZCB1cCB0byB0aGUKKyAgICAgICAgLy8vIHRvcCB0byBhbGxvdyBhbGwgc2Vzc2lvbnMgdG8gbm90aWNlIHRoZW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXZlbnRPYmoiPmEgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQsIHBvc3NpYmx5IHdpdGgKKyAgICAgICAgLy8vIHBhcmFtZXRlcnMuIFRoZSBzaW1wbGVzdCBldmVudCBjb3VsZCBiZSBhIHN0cmluZywgaW50ZWdlciwKKyAgICAgICAgLy8vIG9yIGVudW0sIGJ1dCBhbnkgY2xhc3MgaW5zdGFuY2Ugd2lsbCBkbyAoYXMgbG9uZyBhcyBzb21lIHNlc3Npb24KKyAgICAgICAgLy8vIGluIHRoZSBjaGFpbiBleHBlY3RzIGl0KS48L3BhcmFtPgorICAgICAgICAvLy8gCisgICAgICAgIHZvaWQgU2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50T2JqICk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU2Vzc2lvbkNvbnN0cy5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TZXNzaW9uQ29uc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjFiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU2Vzc2lvbkNvbnN0cy5jcwpAQCAtMCwwICsxLDQxIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgU2Vzc2lvbkNvbnN0cworICAgIHsKKworICAgICAgICAjcmVnaW9uIFdFTEwgS05PV04gRVZFTlRTCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2Vzc2lvbiBldmVudCByZXBvcnRpbmcgdGhlIHRyYW5zcG9ydCBpcyB1cC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IFN0cmluZyBVUCA9ICJVUCI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2Vzc2lvbiBldmVudCByZXBvcnRpbmcgdGhlIHRyYW5zcG9ydCBpcyBkb3duLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIERPV04gPSAiRE9XTiI7CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TZXNzaW9uRGF0YS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TZXNzaW9uRGF0YS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2RkMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1Nlc3Npb25EYXRhLmNzCkBAIC0wLDAgKzEsMjYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFNlc3Npb25EYXRhIDogU2Vzc2lvbgorICAgIHsKKyAgICAgICAgdm9pZCBTZXNzaW9uRGF0YShXaG8gc2VuZGVyLCBGbGV4QnVmZmVyIGJ1Zik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1Nlc3Npb25MaXN0ZW5lci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TZXNzaW9uTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5YzQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TZXNzaW9uTGlzdGVuZXIuY3MKQEAgLTAsMCArMSwzMCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIHVzZWQgdG8gZGVsaXZlciBuZXcgY29ubmVjdGlvbnMgdG8gdGhlIHNlc3Npb24gZnJvbSB0aGUgbGlzdGVuZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj50aGUgdHlwZSBvZiB0aGUgY29ubmVjdGlvbiBmb3IgdGhlIHNlc3Npb24uPC90eXBlcGFyYW0+CisgICAgcHVibGljIGludGVyZmFjZSBTZXNzaW9uTGlzdGVuZXI8VD4gOiBTZXNzaW9uCisgICAgeworICAgICAgICB2b2lkIFNlc3Npb25BY2NlcHRlZChUIHNvY2tldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1Nlc3Npb25QYWNrZXQuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU2Vzc2lvblBhY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjBhZThlCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1Nlc3Npb25QYWNrZXQuY3MKQEAgLTAsMCArMSwyNiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvblBhY2tldCA6IFNlc3Npb24KKyAgICB7CisgICAgICAgIHZvaWQgU2Vzc2lvblBhY2tldChXaG8gc2VuZGVyLCBGbGV4QnVmZmVyIGJ1Zik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1NpbmdsZUl0ZXJhdG9yLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1NpbmdsZUl0ZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTdjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU2luZ2xlSXRlcmF0b3IuY3MKQEAgLTAsMCArMSw5MCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGl0ZXJhdG9yIG92ZXIgYSBzaW5nbGUgb2JqZWN0CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgU2luZ2xlSXRlcmF0b3I8RT4gOiBJRW51bWVyYXRvcjxFPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFIF9vYmo7CisKKyAgICAgICAgcHVibGljIFNpbmdsZUl0ZXJhdG9yKCBPYmplY3Qgb2JqICkKKyAgICAgICAgeworICAgICAgICAgICAgX29iaiA9ICggRSApIG9iajsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gSUVudW1lcmF0b3I8RT4gTWVtYmVycworCisgICAgICAgIHB1YmxpYyBFIEN1cnJlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggX29iaiA9PSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIk5vIFN1Y2ggZWxlbWVudCIgKTsKKworICAgICAgICAgICAgICAgIEUgbyA9IF9vYmo7CisgICAgICAgICAgICAgICAgX29iaiA9IGRlZmF1bHQoRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBJRGlzcG9zYWJsZSBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIiApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUVudW1lcmF0b3IgTWVtYmVycworCisgICAgICAgIG9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IuQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9vYmogPT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJObyBTdWNoIGVsZW1lbnQiICk7CisKKyAgICAgICAgICAgICAgICBFIG8gPSBfb2JqOworICAgICAgICAgICAgICAgIF9vYmogPSBkZWZhdWx0KCBFICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBNb3ZlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfb2JqICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIiApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TdGFydGFibGUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU3RhcnRhYmxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjA3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU3RhcnRhYmxlLmNzCkBAIC0wLDAgKzEsNTAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERlc2NyaXB0aW9uIG9mIFN0YXJ0YWJsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBTdGFydGFibGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgdm9pZCBTdGFydCgpOworCisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB2b2lkIFN0b3AoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgc3RhcnRlZDwvcmV0dXJucz4KKyAgICAgICAgYm9vbCBJc1N0YXJ0ZWQoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDaGVjayB0aGUgc3RhcnRhYmxlIGlzIHN0YXJ0ZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBDaGVja0lzU3RhcnRlZCgpOworICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TdHJJbnRIYXNoTWFwLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0ckludEhhc2hNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwM2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TdHJJbnRIYXNoTWFwLmNzCkBAIC0wLDAgKzEsNDMgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGhhc2htYXAgd2hpY2ggaXMgZnJvbSBzdHJpbmcgdG8gaW50ZWdlcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFN0ckludEhhc2hNYXAgOiBEaWN0aW9uYXJ5PHN0cmluZywgaW50Pz4KKyAgICB7CisgICAgICAgIHB1YmxpYyBTdHJJbnRIYXNoTWFwKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyAuCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgU3RySW50SGFzaE1hcCBpbml0aWFsaXplZCBmcm9tIGFub3RoZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdGhlciI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIFN0ckludEhhc2hNYXAoIFN0ckludEhhc2hNYXAgb3RoZXIgKQorICAgICAgICAgICAgOiBiYXNlKCBvdGhlciApCisgICAgICAgIHsgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0ckludEhhc2hNYXBTZXJpYWxpemVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0ckludEhhc2hNYXBTZXJpYWxpemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODljZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIuY3MKQEAgLTAsMCArMSw5NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gZXRjaCBzZXJpYWxpemVyIGZvciBTdHJJbnRIYXNoTWFwLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFN0ckludEhhc2hNYXBTZXJpYWxpemVyIDogSW1wb3J0RXhwb3J0SGVscGVyCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRklFTERfTkFNRSA9ICJrZXlzQW5kVmFsdWVzIjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZpbmVzIGN1c3RvbSBmaWVsZHMgaW4gdGhlIHZhbHVlIGZhY3Rvcnkgc28gdGhhdCB0aGUgaW1wb3J0ZXIKKyAgICAgICAgLy8vIGNhbiBmaW5kIHRoZW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vICA8cGFyYW0gbmFtZT0iY2xhc3MydHlwZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEluaXQoIFhUeXBlIHR5cGUsIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gdHlwZS5HZXRGaWVsZCggRklFTERfTkFNRSApOworICAgICAgICAgICAgY2xhc3MydHlwZS5BZGQoIHR5cGVvZiggU3RySW50SGFzaE1hcCApLCB0eXBlICk7CisgICAgICAgICAgICB0eXBlLlNldENvbXBvbmVudFR5cGUoIHR5cGVvZiggU3RySW50SGFzaE1hcCApICk7CisgICAgICAgICAgICB0eXBlLlNldEltcG9ydEV4cG9ydEhlbHBlciggbmV3IFN0ckludEhhc2hNYXBTZXJpYWxpemVyKCB0eXBlLCBmaWVsZCApICk7CisgICAgICAgICAgICB0eXBlLlB1dFZhbGlkYXRvciggZmllbGQsIFZhbGlkYXRvcl9vYmplY3QuR2V0KCAxICkgKTsKKyAgICAgICAgICAgIHR5cGUuTG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0ckludEhhc2hNYXBTZXJpYWxpemVyKCBYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgZmllbGQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE9iamVjdCBJbXBvcnRWYWx1ZSggU3RydWN0VmFsdWUgc3YgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJJbnRIYXNoTWFwIG1hcCA9IG5ldyBTdHJJbnRIYXNoTWFwKCk7CisKKyAgICAgICAgICAgIE9iamVjdFtdIGtleXNBbmRWYWx1ZXMgPSAoIE9iamVjdFtdICkgc3YuR2V0KCBmaWVsZCApOworICAgICAgICAgICAgaW50IG4gPSBrZXlzQW5kVmFsdWVzLkxlbmd0aDsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoIGluZGV4IDwgbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGtleSA9ICggU3RyaW5nICkga2V5c0FuZFZhbHVlc1sgaW5kZXgrKyBdOworICAgICAgICAgICAgICAgIGludD8gdmFsdWUgPSAoIGludD8gKSBrZXlzQW5kVmFsdWVzWyBpbmRleCsrIF07CisgICAgICAgICAgICAgICAgbWFwLkFkZCgga2V5LCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cnVjdFZhbHVlIEV4cG9ydFZhbHVlKFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJJbnRIYXNoTWFwIG1hcCA9ICggU3RySW50SGFzaE1hcCApIHZhbHVlOworCisgICAgICAgICAgICBPYmplY3RbXSBrZXlzQW5kVmFsdWVzID0gbmV3IE9iamVjdFsgbWFwLkNvdW50ICogMiBdOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgZm9yZWFjaCggS2V5VmFsdWVQYWlyPFN0cmluZywgaW50Pz4gbWUgaW4gbWFwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlzQW5kVmFsdWVzWyBpbmRleCsrIF0gPSBtZS5LZXk7CisgICAgICAgICAgICAgICAga2V5c0FuZFZhbHVlc1sgaW5kZXgrKyBdID0gbWUuVmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKHR5cGUsIHZmKTsKKyAgICAgICAgICAgIHN2LkFkZCggZmllbGQsIGtleXNBbmRWYWx1ZXMgKTsKKyAgICAgICAgICAgIHJldHVybiBzdjsKKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0clN0ckhhc2hNYXAuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU3RyU3RySGFzaE1hcC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA0NmZiCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0clN0ckhhc2hNYXAuY3MKQEAgLTAsMCArMSw0MyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgaGFzaG1hcCB3aGljaCBpcyBmcm9tIHN0cmluZyB0byBpbnRlZ2VyCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgU3RyU3RySGFzaE1hcCA6IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+CisgICAgeworICAgICAgICBwdWJsaWMgU3RyU3RySGFzaE1hcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gLgorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIFN0clN0ckhhc2hNYXAgaW5pdGlhbGl6ZWQgZnJvbSBhbm90aGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXIiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBTdHJTdHJIYXNoTWFwKCBTdHJTdHJIYXNoTWFwIG90aGVyICkKKyAgICAgICAgICAgIDogYmFzZSggb3RoZXIgKQorICAgICAgICB7IH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TdHJTdHJIYXNoTWFwU2VyaWFsaXplci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9TdHJTdHJIYXNoTWFwU2VyaWFsaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWM1NzQxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0clN0ckhhc2hNYXBTZXJpYWxpemVyLmNzCkBAIC0wLDAgKzEsOTcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGV0Y2ggc2VyaWFsaXplciBmb3IgU3RyU3RySGFzaE1hcC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBTdHJTdHJIYXNoTWFwU2VyaWFsaXplciA6IEltcG9ydEV4cG9ydEhlbHBlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAia2V5c0FuZFZhbHVlcyI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmaW5lcyBjdXN0b20gZmllbGRzIGluIHRoZSB2YWx1ZSBmYWN0b3J5IHNvIHRoYXQgdGhlIGltcG9ydGVyCisgICAgICAgIC8vLyBjYW4gZmluZCB0aGVtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xhc3MydHlwZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEluaXQoIFhUeXBlIHR5cGUsIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gdHlwZS5HZXRGaWVsZCggRklFTERfTkFNRSApOworICAgICAgICAgICAgY2xhc3MydHlwZS5BZGQoIHR5cGVvZiggU3RyU3RySGFzaE1hcCApLCB0eXBlICk7CisgICAgICAgICAgICB0eXBlLlNldENvbXBvbmVudFR5cGUoIHR5cGVvZiggU3RyU3RySGFzaE1hcCApICk7CisgICAgICAgICAgICB0eXBlLlNldEltcG9ydEV4cG9ydEhlbHBlciggbmV3IFN0clN0ckhhc2hNYXBTZXJpYWxpemVyKCB0eXBlLCBmaWVsZCApICk7CisgICAgICAgICAgICB0eXBlLlB1dFZhbGlkYXRvciggZmllbGQsIFZhbGlkYXRvcl9vYmplY3QuR2V0KCAxICkgKTsKKyAgICAgICAgICAgIHR5cGUuTG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0clN0ckhhc2hNYXBTZXJpYWxpemVyKCBYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgZmllbGQ7CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgT2JqZWN0IEltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0clN0ckhhc2hNYXAgbWFwID0gbmV3IFN0clN0ckhhc2hNYXAoKTsKKworICAgICAgICAgICAgT2JqZWN0W10ga2V5c0FuZFZhbHVlcyA9ICggT2JqZWN0W10gKSBzdi5HZXQoIGZpZWxkICk7CisgICAgICAgICAgICBpbnQgbiA9IGtleXNBbmRWYWx1ZXMuTGVuZ3RoOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICggaW5kZXggPCBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKCBTdHJpbmcgKSBrZXlzQW5kVmFsdWVzWyBpbmRleCsrIF07CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKCBTdHJpbmcgKSBrZXlzQW5kVmFsdWVzWyBpbmRleCsrIF07CisgICAgICAgICAgICAgICAgbWFwLkFkZCgga2V5LCB2YWx1ZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cnVjdFZhbHVlIEV4cG9ydFZhbHVlKFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJTdHJIYXNoTWFwIG1hcCA9ICggU3RyU3RySGFzaE1hcCApIHZhbHVlOworCisgICAgICAgICAgICBPYmplY3RbXSBrZXlzQW5kVmFsdWVzID0gbmV3IE9iamVjdFsgbWFwLkNvdW50ICogMiBdOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgZm9yZWFjaCAoIEtleVZhbHVlUGFpcjxTdHJpbmcsIFN0cmluZz4gbWUgaW4gbWFwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlzQW5kVmFsdWVzWyBpbmRleCsrIF0gPSBtZS5LZXk7CisgICAgICAgICAgICAgICAga2V5c0FuZFZhbHVlc1sgaW5kZXgrKyBdID0gbWUuVmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKHR5cGUsIHZmKTsKKyAgICAgICAgICAgIHN2LkFkZCggZmllbGQsIGtleXNBbmRWYWx1ZXMgKTsKKyAgICAgICAgICAgIHJldHVybiBzdjsKKworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU3RyaW5nVG9rZW5pemVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0cmluZ1Rva2VuaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzlkMWRjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0cmluZ1Rva2VuaXplci5jcwpAQCAtMCwwICsxLDg3IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgU3RyaW5nVG9rZW5pemVyCisgICAgeworICAgICAgICBwdWJsaWMgU3RyaW5nVG9rZW5pemVyKHN0cmluZyBzLCBzdHJpbmcgc2VwcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zID0gczsKKyAgICAgICAgICAgIHRoaXMuc2VwcyA9IHNlcHM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBzOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHNlcHM7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAwOworCisgICAgICAgIHB1YmxpYyBib29sIEhhc01vcmVUb2tlbnMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IEdldE5leHRUb2tlbigpOworCisgICAgICAgICAgICByZXR1cm4gdG9rZW4gIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmV4dFRva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rZW4gPSBHZXROZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbigibm8gbW9yZSB0b2tlbnMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nIHQgPSB0b2tlbjsKKyAgICAgICAgICAgIHRva2VuID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0TmV4dFRva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgU2tpcFNlcHMoKTsKKworICAgICAgICAgICAgaW50IGkgPSBpbmRleDsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IHMuTGVuZ3RoICAmJiAgIUlzU2VwKHNbaW5kZXhdKSkKKyAgICAgICAgICAgICAgICBpbmRleCsrOworCisgICAgICAgICAgICBpZiAoaW5kZXggPiBpKQorICAgICAgICAgICAgICAgIHJldHVybiBzLlN1YnN0cmluZyhpLCBpbmRleCAtIGkpOworCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTa2lwU2VwcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IHMuTGVuZ3RoICYmIElzU2VwKHNbaW5kZXhdKSkKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIElzU2VwKGNoYXIgYykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlcHMuSW5kZXhPZihjKSA+PSAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgdG9rZW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0cmluZ1V0aWwuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvU3RyaW5nVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTk1NjQzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1N0cmluZ1V0aWwuY3MKQEAgLTAsMCArMSwxMjEgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTWlzY2VsbGFuZW91cyBzdHJpbmcgdXRpbGl0eSBmdW5jdGlvbnMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAKKyAgICBwdWJsaWMgY2xhc3MgU3RyaW5nVXRpbAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YW4gYXJyYXkgeCBvZiB0d28gZWxlbWVudHMgY29udGFpbmluZyBzIHNwbGl0IGluIHR3byBieSB0aGUKKyAgICAgICAgLy8vIGxlZnRtb3N0IGMuIHhbMF0gaXMgdGhlIGNoYXJzIGJlZm9yZSBjLCB4WzFdIGlzIHRoZSBjaGFycyBhZnRlciBjLgorICAgICAgICAvLy8gSWYgYyBpcyBub3QgaW4gcywgcmV0dXJucyBudWxsLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIExlZnRTcGxpdCggU3RyaW5nIHMsIGNoYXIgYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcyA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCAiUGFzc2VkIHN0cmluZyBpcyBudWxsIiApOworCisgICAgICAgICAgICBpbnQgaSA9IHMuSW5kZXhPZiggYyApOworICAgICAgICAgICAgaWYgKCBpIDwgMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBzLlN1YnN0cmluZyggMCwgaSApLCBzLlN1YnN0cmluZyggaSsxICkgfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InMiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmFuIGFycmF5IHggb2YgdHdvIGVsZW1lbnRzIGNvbnRhaW5pbmcgcyBzcGxpdCBpbiB0d28gYnkgdGhlCisgICAgICAgIC8vLyByaWdodG1vc3QgYy4geFswXSBpcyB0aGUgY2hhcnMgYmVmb3JlIGMsIHhbMV0gaXMgdGhlIGNoYXJzIGFmdGVyIGMuCisgICAgICAgIC8vLyBJZiBjIGlzIG5vdCBpbiBzLCByZXR1cm5zIG51bGwuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIFJpZ2h0U3BsaXQoIFN0cmluZyBzLCBDaGFyIGMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHMgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiggIlBhc3NlZCBzdHJpbmcgaXMgbnVsbCIgKTsKKworICAgICAgICAgICAgaW50IGkgPSBzLkxhc3RJbmRleE9mKCBjICk7CisgICAgICAgICAgICBpZiAoIGkgPCAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IHMuU3Vic3RyaW5nKCAwLCBpICksIHMuU3Vic3RyaW5nKCBpKzEgKSB9OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNsYXRlcyBhbiBpbnQgaW50byBhIGhleCBjaGFyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImkiPmkgYW4gaW50ICgwLTE1KTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIGhleCBjaGFyICgwLTksIGEtZikuPC9yZXR1cm5zPgorICAgICAgICAvLy8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2hhciBUb0hleCggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGkgPj0gMCAmJiBpIDw9IDkgKQorICAgICAgICAgICAgICAgIHJldHVybiAoIGNoYXIgKSAoICcwJyArIGkgKTsKKyAgICAgICAgICAgIGlmICggaSA+PSAxMCAmJiBpIDw9IDE1ICkKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBjaGFyICkgKCAnYScgKyBpIC0gMTAgKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbiggImJhZCBoZXggZGlnaXQgc2VsZWN0b3IgIitpICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFuc2xhdGVzIGEgaGV4IGNoYXIgaW50byBhbiBpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYyI+YSBoZXggY2hhciAoMC05LCBBLUYsIGEtZikuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmFuIGludCAoMC0xNSkuPC9yZXR1cm5zPgorICAgICAgICAvLy8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEZyb21IZXgoIGNoYXIgYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYyA+PSAnMCcgJiYgYyA8PSAnOScgKQorICAgICAgICAgICAgICAgIHJldHVybiBjIC0gJzAnOworICAgICAgICAgICAgaWYgKCBjID49ICdBJyAmJiBjIDw9ICdGJyApCisgICAgICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKKyAgICAgICAgICAgIGlmICggYyA+PSAnYScgJiYgYyA8PSAnZicgKQorICAgICAgICAgICAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJiYWQgaGV4IGNoYXIgIitjICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXEoc3RyaW5nIGEsIHN0cmluZyBiKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKGEsIGIpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGEuRXF1YWxzKGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEVxSWdub3JlQ2FzZShzdHJpbmcgYSwgc3RyaW5nIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMoYSwgYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gYS5FcXVhbHMoYiwgU3RyaW5nQ29tcGFyaXNvbi5DdXJyZW50Q3VsdHVyZUlnbm9yZUNhc2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RjcENvbm5lY3Rpb24uY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVGNwQ29ubmVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJlZjg5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RjcENvbm5lY3Rpb24uY3MKQEAgLTAsMCArMSwxMDcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3Rpb24gd2hpY2ggaGFuZGxlcyBhIHRjcCBjb25uZWN0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRjcENvbm5lY3Rpb24gOiBUY3BUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBUY3BDb25uZWN0aW9uKFNvY2tldCBzb2NrZXQsIHN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgICAgICA6IHRoaXMoc29ja2V0LCBuZXcgVVJMKHVyaSksIHJlc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUY3BDb25uZWN0aW9uKFNvY2tldCBzb2NrZXQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgICAgICA6IGJhc2UodXJpLCByZXNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJpLkhvc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaG9zdCIpOworICAgICAgICAgICAgICAgIGhvc3QgPSB1cmkuSG9zdDsKKworICAgICAgICAgICAgICAgIGlmICh1cmkuUG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJwb3J0Iik7CisgICAgICAgICAgICAgICAgcG9ydCA9IChpbnQpdXJpLlBvcnQ7CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydCA8PSAwIHx8IHBvcnQgPj0gNjU1MzYpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigicG9ydCA8PSAwIHx8IHBvcnQgPj0gNjU1MzYiKTsKKworICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvL3RoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICAgICAgLy90aGlzLnBvcnQgPSAoaW50KXBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisgICAgICAgICAgICAgICAgaG9zdCA9IG51bGw7CisgICAgICAgICAgICAgICAgcG9ydCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmluZyBob3N0OworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IHBvcnQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNvY2tldCBzID0gc29ja2V0OworCisgICAgICAgICAgICBpZiAocyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJUY3BDb25uZWN0aW9uKHVwLCB7MH0sIHsxfSkiLAorICAgICAgICAgICAgICAgICAgICBzLkxvY2FsRW5kUG9pbnQsIHMuUmVtb3RlRW5kUG9pbnQpOworCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZvcm1hdCgiVGNwQ29ubmVjdGlvbihkb3duLCB7MH0sIHsxfSkiLCBob3N0LCBwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIElzU2VydmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhvc3QgPT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBTb2NrZXQgTmV3U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgSVBBZGRyZXNzIGFkZHI7CisKKyAgICAgICAgICAgIGlmIChob3N0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVBBZGRyZXNzW10gYWRkcnMgPSBEbnMuR2V0SG9zdEFkZHJlc3Nlcyhob3N0KTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcnMgPT0gbnVsbCB8fCBhZGRycy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJob3N0IGlzIGludmFsaWQiKTsKKyAgICAgICAgICAgICAgICBhZGRyID0gYWRkcnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkciA9IElQQWRkcmVzcy5Bbnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElQRW5kUG9pbnQgaXBlID0gbmV3IElQRW5kUG9pbnQoYWRkciwgcG9ydCk7CisgICAgICAgICAgICBTb2NrZXQgc29ja2V0ID0gbmV3IFNvY2tldChpcGUuQWRkcmVzc0ZhbWlseSwgU29ja2V0VHlwZS5TdHJlYW0sIFByb3RvY29sVHlwZS5UY3ApOworICAgICAgICAgICAgc29ja2V0LkNvbm5lY3QoaXBlKTsKKyAgICAgICAgICAgIHJldHVybiBzb2NrZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVGNwTGlzdGVuZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVGNwTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiYjAyMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9UY3BMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDI3MiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIGEgY29ubmVjdGlvbiB3aGljaCBoYW5kbGVzIGEgc29ja2V0IGxpc3RlbmVyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRjcExpc3RlbmVyIDogQ29ubmVjdGlvbjxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Pj4KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIFRjcExpc3RlbmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJhY2tsb2ciPm1heCBudW1iZXIgb2YgcGVuZGluZyBjb25uZWN0aW9uIHJlcXVlc3RzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaG9zdCI+YWRkcmVzcyB0byBsaXN0ZW4gdG8uIE51bGwgbWVhbnMgYW55IGxvY2FsIGFkZHJlc3MuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5wb3J0IHRvIGxpc3RlbiBvbi4gUG9ydCBtdXN0IGJlID49IDAuIFBvcnQgb2YgMAorICAgICAgICAvLy8gbWVhbnMgYWxsb2NhdGUgYW4gYXZhaWxhYmxlIHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWxheSI+aG93IGxvbmcgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGEKKyAgICAgICAgLy8vIGZhaWx1cmUuIERlbGF5IG11c3QgYmUgPj0gMC4gRGVsYXkgb2YgMCBtZWFucyBkbyBub3QgcmV0cnkuPC9wYXJhbT4KKworICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyKCBpbnQgYmFja2xvZywgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgZGVsYXkgKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBiYWNrbG9nIDwgMCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAiYmFja2xvZyA8IDAiICk7CisKKyAgICAgICAgICAgIGlmICggcG9ydCA8IDAgfHwgcG9ydCA+IDY1NTM1ICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzUiICk7CisKKyAgICAgICAgICAgIGlmICggZGVsYXkgPCAwICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJkZWxheSA8IDAiICk7CisKKyAgICAgICAgICAgIHRoaXMuYmFja2xvZyA9IGJhY2tsb2c7CisgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFF1ZXJ5IHRlcm0gZnJvbSBVUkkgdG8gc3BlY2lmeSBiYWNrbG9nIHZhbHVlIHRvIFNlcnZlclNvY2tldC4gVGhlCisgICAgICAgIC8vLyB2YWx1ZSBpcyAiVGNwTGlzdGVuZXIuYmFja2xvZyIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgQkFDS0xPRyA9ICJUY3BMaXN0ZW5lci5iYWNrbG9nIjsKKworCisgICAgICAgIHB1YmxpYyBUY3BMaXN0ZW5lcihVUkwgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzKQorICAgICAgICAgICAgOiB0aGlzKChpbnQpdXJpLkdldEludGVnZXJUZXJtKEJBQ0tMT0csIDApLCBUcmFuc2xhdGVIb3N0KHVyaS5Ib3N0KSwgdXJpLlBvcnQgIT0gbnVsbCA/IHVyaS5Qb3J0LlZhbHVlIDogMCwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyBlbHNlLgorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyBhIFRjcExpc3RlbmVyLCBpbml0aWFsaXplZCBmcm9tIHRoZSBVUkkuIExpc3RlbnMgb24gdGhlIGhvc3QKKyAgICAgICAgLy8vIGFuZCBwb3J0IHNwZWNpZmllZCBpbiB0aGUgVVJJLiBUbyBsaXN0ZW4gb24gYWxsIGludGVyZmFjZXMsIHNwZWNpZnkKKyAgICAgICAgLy8vIGhvc3QgYXMgQUxMX0lOVEZTICgiMC4wLjAuMCIpLiBJZiBwb3J0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgdG8gMCwKKyAgICAgICAgLy8vIGFuIHVudXNlZCBwb3J0IHdpbGwgYmUgc2VsZWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpIj48L3BhcmFtPgorCisgICAgICAgIHB1YmxpYyBUY3BMaXN0ZW5lcihzdHJpbmcgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBVUkwodXJpKSwgcmVzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIGVsc2UuCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBiYWNrbG9nOworCQorCSAgICBwcml2YXRlIFN0cmluZyBob3N0OworICAgIAkKKwkgICAgcHJpdmF0ZSBpbnQgcG9ydDsKKyAgICAJCisJICAgIHByaXZhdGUgaW50IGRlbGF5OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFN0b3AwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xvc2UoIHRydWUgKTsKKyAgICAgICAgICAgIGJhc2UuU3RvcDAoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIFNvY2tldCBDaGVja1NvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNvY2tldCBzcyA9IHNlcnZlclNvY2tldDsKKyAgICAgICAgICAgIGlmICggc3MgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSggIi0tLS1zb2NrZXQgd2FzIG51bGwtLS0tIiApOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic2VydmVyIHNvY2tldCBpcyBjbG9zZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU29ja2V0IHNlcnZlclNvY2tldDsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU29ja2V0IHNzID0gc2VydmVyU29ja2V0OworCisgICAgICAgICAgICBpZiAoIHNzID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJUY3BMaXN0ZW5lciAoZG93biwgezB9OnsxfSkiLCBob3N0LCBwb3J0KTsKKworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoIlRjcExpc3RlbmVyICh1cCwgezB9KSIsIHNzLkxvY2FsRW5kUG9pbnQpOworICAgICAgICB9CisKKyAgICAgICAgW01ldGhvZEltcGwgKE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCldCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBib29sIE9wZW5Tb2NrZXQoIGJvb2wgcmVjb25uZWN0ICkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAoIElzU3RhcnRlZCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJlY29ubmVjdCB8fCAhZmlyc3QgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWxheSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuV2FpdCh0aGlzLCBkZWxheSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNTdGFydGVkKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0lQSG9zdEVudHJ5IGlwRW50cnkgPSBEbnMuR2V0SG9zdEVudHJ5KCBob3N0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzIGFkZHI7CisgICAgICAgICAgICAgICAgICAgIGlmICggaG9zdCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSVBBZGRyZXNzW10gYWRkcnMgPSBEbnMuR2V0SG9zdEFkZHJlc3NlcyggaG9zdCApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhZGRycyA9PSBudWxsIHx8IGFkZHJzLkxlbmd0aCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJob3N0IGlzIGludmFsaWQiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyID0gYWRkcnNbIDAgXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyID0gSVBBZGRyZXNzLkFueTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy9JUEFkZHJlc3NbXSBhZGRyID0gaXBFbnRyeS5BZGRyZXNzTGlzdDsKKyAgICAgICAgICAgICAgICAgICAgLy9zdHJpbmcgc0lQQWRkcmVzcyA9IGFkZHJbIDAgXS5Ub1N0cmluZygpOworCisgICAgICAgICAgICAgICAgICAgIElQRW5kUG9pbnQgaXBlID0gbmV3IElQRW5kUG9pbnQoIGFkZHIsIHBvcnQgKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTb2NrZXQoIGlwZS5BZGRyZXNzRmFtaWx5LCBTb2NrZXRUeXBlLlN0cmVhbSwgUHJvdG9jb2xUeXBlLlRjcCApOworCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuQmluZChpcGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgYmluZCBhZGRyZXNzICIraG9zdCsiOiIrcG9ydCwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuTGlzdGVuKCBiYWNrbG9nICk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggZmlyc3QgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgRmlyZUV4Y2VwdGlvbiggIm9wZW4iLCBlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjoKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFNldFVwU29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgUmVhZFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNvY2tldCBzcyA9IENoZWNrU29ja2V0KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKElzU3RhcnRlZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU29ja2V0IHMgPSBzcy5BY2NlcHQoKTsKKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5TZXNzaW9uQWNjZXB0ZWQocyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGaXJlRXhjZXB0aW9uKCJhY2NlcHRlZCIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlLk1lc3NhZ2UgIT0gbnVsbCAmJiBlLk1lc3NhZ2UuQ29udGFpbnMoImludGVycnVwdGVkIikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc2V0Ij48L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoIGJvb2wgcmVzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBTb2NrZXQgc3MgPSBzZXJ2ZXJTb2NrZXQ7CisgICAgICAgICAgICBpZiAoIHNzICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG51bGw7CisgICAgICAgICAgICAgICAgc3MuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBFbmRQb2ludCBMb2NhbEFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ2hlY2tTb2NrZXQoKS5Mb2NhbEVuZFBvaW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEVuZFBvaW50IFJlbW90ZUFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RjcE9wdGlvbnMuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVGNwT3B0aW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA0YmYxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RjcE9wdGlvbnMuY3MKQEAgLTAsMCArMSwxNjggQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVENQIGNvbm5lY3Rpb24gb3B0aW9ucy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUY3BPcHRpb25zCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIFRjcE9wdGlvbnMgZnJvbSB1cmkgYW5kIHJlc291cmNlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzb3VyY2VzIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVGNwT3B0aW9ucyggVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG9GbHVzaCA9IHVyaS5HZXRCb29sZWFuVGVybShBVVRPX0ZMVVNILCBmYWxzZSk7CisgICAgICAgICAgICBidWZmZXJTaXplID0gQ2hlY2tCdWZmZXJTaXplKHVyaS5HZXRJbnRlZ2VyVGVybShCVUZGRVJfU0laRSwgMCkpOworICAgICAgICAgICAga2VlcEFsaXZlID0gdXJpLkdldEJvb2xlYW5UZXJtKEtFRVBfQUxJVkUsIGZhbHNlKTsKKyAgICAgICAgICAgIGxpbmdlclRpbWUgPSBDaGVja0xpbmdlclRpbWUodXJpLkdldEludGVnZXJUZXJtKExJTkdFUl9USU1FLCAzMCkpOworICAgICAgICAgICAgbm9EZWxheSA9IHVyaS5HZXRCb29sZWFuVGVybShOT19ERUxBWSwgdHJ1ZSk7CisgICAgICAgICAgICByZWNvbm5lY3REZWxheSA9IENoZWNrUmVjb25uZWN0RGVsYXkodXJpLkdldEludGVnZXJUZXJtKFJFQ09OTkVDVF9ERUxBWSwgMCkpOworICAgICAgICAgICAgdHJhZmZpY0NsYXNzID0gQ2hlY2tUcmFmZmljQ2xhc3ModXJpLkdldEludGVnZXJUZXJtKFRSQUZGSUNfQ0xBU1MsIDApKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDaGVja0J1ZmZlclNpemUoaW50IGJ1ZmZlclNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJTaXplIDwgMCB8fCBidWZmZXJTaXplID4gNjU1MzYpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiYnVmZmVyU2l6ZSA8IDAgfHwgYnVmZmVyU2l6ZSA+IDY1NTM2Iik7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDaGVja0xpbmdlclRpbWUoaW50IGxpbmdlclRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsaW5nZXJUaW1lIDwgLTEgfHwgbGluZ2VyVGltZSA+IDI0MCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJsaW5nZXJUaW1lIDwgLTEgfHwgbGluZ2VyVGltZSA+IDI0MCIpOworICAgICAgICAgICAgcmV0dXJuIGxpbmdlclRpbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ2hlY2tSZWNvbm5lY3REZWxheShpbnQgcmVjb25uZWN0RGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWNvbm5lY3REZWxheSA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAicmVjb25uZWN0RGVsYXkgPCAwIik7CisgICAgICAgICAgICByZXR1cm4gcmVjb25uZWN0RGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ2hlY2tUcmFmZmljQ2xhc3MoaW50IHRyYWZmaWNDbGFzcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyYWZmaWNDbGFzcyA8IDAgfHwgdHJhZmZpY0NsYXNzID4gMjU1KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInRyYWZmaWNDbGFzcyA8IDAgfHwgdHJhZmZpY0NsYXNzID4gMjU1Iik7CisgICAgICAgICAgICByZXR1cm4gdHJhZmZpY0NsYXNzOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGF1dG8gZmx1c2ggc2V0dGluZyBmb3IgdGhpcyBjb25uZWN0aW9uLiBJZiB0cnVlLCBlYWNoIGNhbGwgdG8gc2VuZAorICAgICAgICAvLy8gbXVzdCBhdXRvbWF0aWNhbGx5IGNhbGwgZmx1c2guCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIGF1dG9GbHVzaDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgb3V0cHV0IGJ1ZmZlciBzaXplIHRvIHVzZSBmb3IgdGhpcyBjb25uZWN0aW9uLiBCeXRlcywgMCBtZWFucworICAgICAgICAvLy8gdW5idWZmZXJlZCBvdXRwdXQuIElmIHVzaW5nIGJ1ZmZlcmVkIG91dHB1dCwgeW91J2xsIHdhbnQgdG8gZGlzYWJsZQorICAgICAgICAvLy8gYXV0byBmbHVzaCBhbmQgY2FsbCBmbHVzaCBtYW51YWxseSBvbmx5IHdoZW4gbmVlZGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IGJ1ZmZlclNpemU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRjcCBrZWVwIGFsaXZlIHNldHRpbmcgZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wga2VlcEFsaXZlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0Y3AgbGluZ2VyIHRpbWUgc2V0dGluZyBmb3IgdGhpcyBjb25uZWN0aW9uLiBUaW1lIGluIHNlY29uZHMsIC0xCisgICAgICAgIC8vLyBtZWFucyBkaXNhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IGxpbmdlclRpbWU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRjcCBubyBkZWxheSBzZXR0aW5nIGZvciB0aGlzIGNvbm5lY3Rpb24uIFRydWUgZGlzYWJsZXMgbmFnbGUncworICAgICAgICAvLy8gYWxnb3JpdGhtIGFuZCBjYXVzZXMgYWxsIHNlbmRzIHRvIGJlIG1hZGUgYXNhcC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgbm9EZWxheTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcmVjb25uZWN0IGRlbGF5IGZvciB0aGlzIGNvbm5lY3Rpb24uIFRpbWUgaW4gbWlsbGlzZWNvbmRzLCAwIG1lYW5zCisgICAgICAgIC8vLyBkbyBub3QgcmVjb25uZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IHJlY29ubmVjdERlbGF5OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0cmFmZmljIGNsYXNzIGZvciB0aGlzIGNvbm5lY3Rpb24uIDAtMjU1LCAwIG1lYW5zIG5vcm1hbCBoYW5kbGluZy4KKyAgICAgICAgLy8vIEFsc28gY2FsbGVkIHR5cGUgb2Ygc2VydmljZSBvciBkc2NwLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IHRyYWZmaWNDbGFzczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXJtIG9uIHRoZSB1cmkgd2hpY2ggc3BlY2lmaWVzIHRoZSBhdXRvIGZsdXNoIGZsYWcuIFRoZSB0ZXJtIHN0cmluZyBpcworICAgICAgICAvLy8gIlRjcFRyYW5zcG9ydC5hdXRvRmx1c2giLiBUaGUgdmFsdWUgaXMgInRydWUiIG9yICJmYWxzZSIuIFRoZSBkZWZhdWx0CisgICAgICAgIC8vLyBpcyAiZmFsc2UiLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIEFVVE9fRkxVU0ggPSAiVGNwVHJhbnNwb3J0LmF1dG9GbHVzaCI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFRoZSB0ZXJtCisgICAgICAgIC8vLyBzdHJpbmcgaXMgIlRjcFRyYW5zcG9ydC5idWZmZXJTaXplIi4gVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgYmV0d2VlbgorICAgICAgICAvLy8gMCBhbmQgNjU1MzYuIFRoZSBkZWZhdWx0IGlzIDAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgQlVGRkVSX1NJWkUgPSAiVGNwVHJhbnNwb3J0LmJ1ZmZlclNpemUiOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRlcm0gb24gdGhlIHVyaSB3aGljaCBzcGVjaWZpZXMgdGhlIGtlZXAgYWxpdmUgZmxhZy4gVGhlIHRlcm0gc3RyaW5nIGlzCisgICAgICAgIC8vLyAiVGNwVHJhbnNwb3J0LmtlZXBBbGl2ZSIuIFRoZSB2YWx1ZSBpcyAidHJ1ZSIgb3IgImZhbHNlIi4gVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgLy8vICJmYWxzZSIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgS0VFUF9BTElWRSA9ICJUY3BUcmFuc3BvcnQua2VlcEFsaXZlIjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXJtIG9uIHRoZSB1cmkgd2hpY2ggc3BlY2lmaWVzIHRoZSBsaW5nZXIgdGltZSBpbiBzZWNvbmRzLiBUaGUgdGVybQorICAgICAgICAvLy8gc3RyaW5nIGlzICJUY3BUcmFuc3BvcnQubGluZ2VyVGltZSIuIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gLTEKKyAgICAgICAgLy8vIGFuZCAyNDAuIFRoZSBkZWZhdWx0IGlzIDMwLiAtMSBtZWFucyBkaXNhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIExJTkdFUl9USU1FID0gIlRjcFRyYW5zcG9ydC5saW5nZXJUaW1lIjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXJtIG9uIHRoZSB1cmkgd2hpY2ggc3BlY2lmaWVzIHRoZSBubyBkZWxheSBmbGFnLiBUaGUgdGVybSBzdHJpbmcgaXMKKyAgICAgICAgLy8vICJUY3BUcmFuc3BvcnQubm9EZWxheSIuIFRoZSB2YWx1ZSBpcyAidHJ1ZSIgb3IgImZhbHNlIi4gVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgLy8vICJ0cnVlIi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IFN0cmluZyBOT19ERUxBWSA9ICJUY3BUcmFuc3BvcnQubm9EZWxheSI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUgcmVjb25uZWN0IGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gVGhlCisgICAgICAgIC8vLyB0ZXJtIHN0cmluZyBpcyAiVGNwVHJhbnNwb3J0LnJlY29ubmVjdERlbGF5Ii4gVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgPj0KKyAgICAgICAgLy8vIDAuIFRoZSBkZWZhdWx0IGlzIDAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgUkVDT05ORUNUX0RFTEFZID0gIlRjcFRyYW5zcG9ydC5yZWNvbm5lY3REZWxheSI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUgdHJhZmZpYyBjbGFzcy4gVGhlIHRlcm0gc3RyaW5nIGlzCisgICAgICAgIC8vLyAiVGNwVHJhbnNwb3J0LnRyYWZmaWNDbGFzcyIuIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LgorICAgICAgICAvLy8gVGhlIGRlZmF1bHQgaXMgMC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IFN0cmluZyBUUkFGRklDX0NMQVNTID0gIlRjcFRyYW5zcG9ydC50cmFmZmljQ2xhc3MiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9UY3BUcmFuc3BvcnQuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVGNwVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNGM0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVGNwVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMzIyIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ29uc3RhbnRzIGFuZCBtZXRob2RzIHJlbGF0ZWQgdG8gdGNwIHRyYW5zcG9ydC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGFic3RyYWN0IHB1YmxpYyBjbGFzcyBUY3BUcmFuc3BvcnQgOiBDb25uZWN0aW9uPFNlc3Npb25EYXRhPiwgVHJhbnNwb3J0RGF0YQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgVGNwVHJhbnNwb3J0LiBQdWxscyBjb21tb24gcGFyYW1ldGVycyBvZmYgdGhlIHVyaS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzb3VyY2VzIj48L3BhcmFtPgorICAgICAgICBwcm90ZWN0ZWQgVGNwVHJhbnNwb3J0KFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgVGNwT3B0aW9ucyh1cmksIHJlc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRjcE9wdGlvbnMgb3B0aW9uczsKKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBTdG9wMCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYXNlLlN0b3AwKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU29ja2V0IHNvY2tldDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDaGVja3MgdGhlIGNvbm5lY3Rpb24gc29ja2V0IGZvciBiZWluZyBvcGVuLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGNvbm5lY3Rpb24gc29ja2V0PC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgU29ja2V0IENoZWNrU29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgU29ja2V0IHMgPSBzb2NrZXQ7CisKKyAgICAgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CisKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoYm9vbCByZXNldCkKKyAgICAgICAgeworICAgICAgICAgICAgU29ja2V0IHMgPSBzb2NrZXQ7CisgICAgICAgICAgICBpZiAocyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLkxpbmdlclN0YXRlID0gbmV3IExpbmdlck9wdGlvbihmYWxzZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaHV0ZG93bk91dHB1dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcy5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2VuZHMgc29tZSBkYXRhIHRvIHRoZSByZW1vdGUgZW5kLiBUaGUgb3V0cHV0IGRhdGEgaXMgYnVmZmVyZWQKKyAgICAgICAgLy8vIHVudGlsIHRoZSBidWZmZXIgaXMgZnVsbCBvciB0aGUgYnVmZmVyIGlzIGZsdXNoZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmIj50aGUgYnl0ZXMgdG8gYmUgc2VudDwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gdHJhbnNtaXR0aW5nIHRoZQorICAgICAgICAvLy8gICAgIGRhdGEuIFN1Y2ggYSBwcm9ibGVtIGNhdXNlcyB0aGUgY3VycmVudCBjb25uZWN0aW9uIHRvIGJlCisgICAgICAgIC8vLyAgICAgcmVzZXQuCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJGbHVzaCgpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJUY3BPcHRpb25zLmF1dG9GbHVzaCIvPgorICAgICAgICBwdWJsaWMgdm9pZCBTZW5kKGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlbmQoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNlbmRzIHNvbWUgZGF0YSB0byB0aGUgcmVtb3RlIGVuZC4gVGhlIG91dHB1dCBkYXRhIGlzIGJ1ZmZlcmVkCisgICAgICAgIC8vLyB1bnRpbCB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgdGhlIGJ1ZmZlciBpcyBmbHVzaGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZiI+dGhlIGJ5dGVzIHRvIGJlIHNlbnQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZiI+dGhlIG9mZnNldCBpbnRvIGJ1ZiBvZiB0aGUgZmlyc3QgYnl0ZSB0byBzZW5kPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW4iPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNlbmQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyZWFtIHMgPSBjaGVja1N0cmVhbSgpOworICAgICAgICAgICAgICAgIHMuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYXV0b0ZsdXNoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcy5GbHVzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoZWNrU3RyZWFtKCkuRmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIGNoZWNrU3RyZWFtKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyZWFtIG5zID0gc3RyZWFtOworICAgICAgICAgICAgaWYgKG5zID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJuZXQgc3RyZWFtIGNsb3NlZCIpOworICAgICAgICAgICAgcmV0dXJuIG5zOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZpcmVEYXRhKEZsZXhCdWZmZXIgYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLlNlc3Npb25EYXRhKG51bGwsIGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIHN0cmVhbTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRW5kUG9pbnQgTG9jYWxBZGRyZXNzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENoZWNrU29ja2V0KCkuTG9jYWxFbmRQb2ludDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBFbmRQb2ludCBSZW1vdGVBZGRyZXNzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENoZWNrU29ja2V0KCkuUmVtb3RlRW5kUG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnREYXRhKFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBTZW5kKGJ1Zi5HZXRCdWYoKSwgYnVmLkluZGV4KCksIGJ1Zi5BdmFpbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFNldFVwU29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgU29ja2V0IHMgPSBDaGVja1NvY2tldCgpOworCisgICAgICAgICAgICBzLlNldFNvY2tldE9wdGlvbihTb2NrZXRPcHRpb25MZXZlbC5UY3AsIFNvY2tldE9wdGlvbk5hbWUuS2VlcEFsaXZlLCBvcHRpb25zLmtlZXBBbGl2ZSk7CisgICAgICAgICAgICBzLkxpbmdlclN0YXRlID0gbmV3IExpbmdlck9wdGlvbihvcHRpb25zLmxpbmdlclRpbWUgPj0gMCwgb3B0aW9ucy5saW5nZXJUaW1lID49IDAgPyBvcHRpb25zLmxpbmdlclRpbWUgOiAwKTsKKyAgICAgICAgICAgIHMuTm9EZWxheSA9IG9wdGlvbnMubm9EZWxheTsKKyAgICAgICAgICAgIC8vcy5TZXRTb2NrZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuVGNwLCBTb2NrZXRPcHRpb25OYW1lLlR5cGVPZlNlcnZpY2UsIHRyYWZmaWNDbGFzcyk7CisKKyAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOZXR3b3JrU3RyZWFtKHNvY2tldCk7CisgICAgICAgICAgICAvLyBUT0RPIGRvIHNvbWV0aGluZyBhYm91dCBidWZmZXJpbmcgdGhpcyBzdHJlYW0uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTaHV0ZG93bklucHV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tTb2NrZXQoKS5TaHV0ZG93bihTb2NrZXRTaHV0ZG93bi5SZWNlaXZlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNodXRkb3duT3V0cHV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tTb2NrZXQoKS5TaHV0ZG93bihTb2NrZXRTaHV0ZG93bi5TZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IHByb3RlY3RlZCBTb2NrZXQgTmV3U29ja2V0KCk7CisKKyAgICAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2wgSXNTZXJ2ZXIoKTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFRyYW5zcG9ydFF1ZXJ5KG9iamVjdCBxdWVyeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHF1ZXJ5LkVxdWFscyhUcmFuc3BvcnRDb25zdHMuSVNfU0VSVkVSKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gSXNTZXJ2ZXIoKTsKKworICAgICAgICAgICAgcmV0dXJuIGJhc2UuVHJhbnNwb3J0UXVlcnkocXVlcnkpOworICAgICAgICB9CisKKyAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkKV0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgT3BlblNvY2tldChib29sIHJlY29ubmVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWYgYSBvbmUgdGltZSBjb25uZWN0aW9uIGZyb20gYSBzZXJ2ZXIgc29ja2V0IGxpc3RlbmVyLCBqdXN0CisgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGV4aXN0aW5nIHNvY2tldC4KKyAgICAgICAgICAgIGlmICghcmVjb25uZWN0ICYmIHNvY2tldCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBpZiBhIG9uZSB0aW1lIGNvbm5lY3Rpb24gZnJvbSBhIHNlcnZlciBzb2NrZXQgbGlzdGVuZXIsIGFuZAorICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHJlY29ubmVjdCwgdGhlbiBiYWlsLgorICAgICAgICAgICAgaWYgKHJlY29ubmVjdCAmJiBJc1NlcnZlcigpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgLy8gaWYgYSByZWNvbm5lY3QgYnV0IG5vIHJldHJpZXMgYWxsb3dlZCwgdGhlbiBiYWlsLgorICAgICAgICAgICAgaWYgKHJlY29ubmVjdCAmJiBvcHRpb25zLnJlY29ubmVjdERlbGF5ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAvLyBvaywgd2UgZG9uJ3QgaGF2ZSBhbiBleGlzdGluZyBzb2NrZXQsIGFuZCB0aGlzIGlzIGVpdGhlciB0aGUgZmlyc3QKKyAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gYXR0ZW1wdCBvciBhIHJlY29ubmVjdCB3aXRoIGRlbGF5ID4gMC4KKworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICAgICAgICAgIHdoaWxlIChJc1N0YXJ0ZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZiByZWNvbm5lY3QgaXMgZmFsc2UgYW5kIGZpcnN0IGlzIHRydWUsIHRoaXMgaXMgb3VyCisgICAgICAgICAgICAgICAgLy8gdmVyeSBmaXJzdCBhdHRlbXB0IHRvIGNvbm5lY3QuIG90aGVyd2lzZSwgd2UgYXJlIHRyeWluZworICAgICAgICAgICAgICAgIC8vIHRvIHJlY29ubmVjdCBhIGJyb2tlbiBsaW5rIG9yIGVzdGFibGlzaCBhIGxpbmsgd2hlcmUgd2UKKyAgICAgICAgICAgICAgICAvLyBoYXZlIGFscmVhZHkgZmFpbGVkIGF0IGxlYXN0IG9uY2UuCisKKyAgICAgICAgICAgICAgICBpZiAocmVjb25uZWN0IHx8ICFmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY29ubmVjdERlbGF5ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5Nb25pdG9yLldhaXQodGhpcywgb3B0aW9ucy5yZWNvbm5lY3REZWxheSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1N0YXJ0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRyeSB0byBvcGVuIGEgc29ja2V0LgorCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzb2NrZXQgPSBOZXdTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpcmVFeGNlcHRpb24oIm9wZW4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgUmVhZFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmVhbSBucyA9IGNoZWNrU3RyZWFtKCk7CisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKG5ldyBieXRlWzgxOTJdKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKElzU3RhcnRlZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBucy5SZWFkKGJ1Zi5HZXRCdWYoKSwgMCwgYnVmLkxlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgYnVmLlNldExlbmd0aChuKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLlNldEluZGV4KDApOworICAgICAgICAgICAgICAgICAgICBGaXJlRGF0YShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZS5NZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgIGlmIChlLk1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24gd2FzIGFib3J0ZWQiKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGlmIChlLk1lc3NhZ2UuQ29udGFpbnMoImJsb2NraW5nIG9wZXJhdGlvbiIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKGUuTWVzc2FnZS5Db250YWlucygic29ja2V0IGNsb3NlZCIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKGUuTWVzc2FnZS5Db250YWlucygicmVhZCBvcGVyYXRpb24gZmFpbGVkIikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9UaW1lci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9UaW1lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM2YTMwCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RpbWVyLmNzCkBAIC0wLDAgKzEsMjQwIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRpbWVyIGVuYWJsZXMgbWFraW5nIGhpZ2ggcHJlY2lzaW9uIGludGVydmFsIHRlc3RzLiBJbiB0aGUgdXN1YWwKKyAgICAvLy8gc2NlbmFyaW8sIHNvbWUgY29kZSBpcyBnb2luZyB0byBiZSBicmFja2V0ZWQgYnkgY2FsbHMgdG8KKyAgICAvLy8gaW5pdGlhbGl6ZSBhIHRpbWVyIGFuZCBsYXRlciBnZXQgdGhlIGVsYXBzZWQgdGltZSBzaW5jZSB0aGUgaW5pdC4KKyAgICAvLy8gCisgICAgLy8vIFRyeWluZyB0byB1c2UgdGhlIHN5c3RlbSBjbG9jayAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKSBpcworICAgIC8vLyBwcm9ibGVtYXRpYyBiZWNhdXNlIHBlcmlvZGljIHN5c3RlbSB0aW1lIGFkanVzdG1lbnRzIChieSBudHAsCisgICAgLy8vIHdpbmRvd3MgdGltZSwgZXRjLikgd2lsbCBpbnZhbGlkYXRlIGFueSBpbnRlcnZhbCB0ZXN0aW5nIGJhc2VkCisgICAgLy8vIG9uIHRoZSBzeXN0ZW0gY2xvY2suIEFsc28sIHRoZSBzeXN0ZW0gY2xvY2sgcmVzb2x1dGlvbiBpcyBub3QKKyAgICAvLy8gYWxsIHRoYXQgZ29vZCAoMTUgbXMgdHlwaWNhbGx5IG9uIGEgd2luZG93cyBib3gpLgorICAgIC8vLyAKKyAgICAvLy8gVGltZXIgdG1yID0gbmV3IFRpbWVyKCkuaW5pdCgpOworICAgIC8vLyBmb28oKTsKKyAgICAvLy8gbG9uZyBucyA9IHRtci5lbGFwc2VkTmFub3MoKTsKKyAgICAvLy8gU3lzdGVtLm91dC5wcmludGxuKCAiZm9vKCkgdG9vayAiK25zKyIgbmFub3MiICk7CisgICAgLy8vIAorICAgIC8vLyBUaW1lciBrZWVwcyBzdGF0ZSwgaW5pdGlhbGl6ZWQgYnkgaW5pdCgpLCBhbmQgdXNlZCBieSBlbGFwc2VkQmxhaCgpCisgICAgLy8vIGFuZCB0aHVzIGlzIHRocmVhZCBzYWZlIGFzIGxvbmcgYXMgY2FsbHMgdG8gaW5pdCgpIGFyZSBzZXJpYWxpemVkLgorICAgIC8vLyAKKyAgICAvLy8gRm9yIGxvd2VyIGNvc3QgdGltaW5nIG5lZWRzLCBUaW1lciBzdXBwb3J0cyBhIHNldCBvZiBzdGF0aWMgaW50ZXJmYWNlcy4KKyAgICAvLy8gCisgICAgLy8vIGxvbmcgdDAgPSBUaW1lci5nZXRTdGFydFRpbWUoKTsKKyAgICAvLy8gZm9vKCk7CisgICAgLy8vIGxvbmcgbnMgPSBUaW1lci5nZXROYW5vc1NpbmNlKCB0MCApOworICAgIC8vLyBTeXN0ZW0ub3V0LnByaW50bG4oICJmb28oKSB0b29rICIrbnMrIiBuYW5vcyIgKTsKKyAgICAvLy8gCisgICAgLy8vIE5vdGU6IHJlYWRpbmcgdGhlIGhpZ2ggcHJlY2lzaW9uIGNsb2NrICh3aGljaCBhbGwgdGhlc2UgbWV0aG9kcworICAgIC8vLyB1bHRpbWF0ZWx5IGRvKSB0YWtlcyBhYm91dCAxLDQ4NyBuYW5vc2Vjb25kcyBvbiBXaW5kb3dzIFhQIFBybworICAgIC8vLyBydW5uaW5nIG9uIGEgRGVsbCBQcmVjaXNpb24gMzcwIHdvcmtzdGF0aW9uIHVzaW5nIGpkayAxLjUuMF8wNC4KKyAgICAvLy8gQnkgY29tcGFyaXNvbiwgYSBtZXRob2QgY2FsbCB0YWtlcyBhYm91dCAxLjk3IG5hbm9zZWNvbmRzLiBBbHNvLAorICAgIC8vLyBvbiB0aGUgYWJvdmUgcGxhdGZvcm0sIHRoZSByZXNvbHV0aW9uIG9mIHRoZSB0aW1lciBpcyAxLDM5NiBucy4KKyAgICAvLy8gQ291bGQgYmUgdGhhdCB0aGUgcmVzb2x1dGlvbiBpcyBzbWFsbGVyLCBidXQgd2UnbGwgbmV2ZXIga25vdyBpdAorICAgIC8vLyBiZWNhdXNlIGp1c3QgZ2V0dGluZyB0aGUgdmFsdWUgZnJvbSB0aGUgT1MgaXMgdGhlIGRvbWluYW50IGZhY3Rvci4KKyAgICAvLy8gPC9zdW1tYXJ5PgorCisgICAgcHVibGljIGNsYXNzIFRpbWVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBUaW1lci4gVGhlIHRpbWVyIGlzIG5vdCBzdGFydGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVGltZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgdGhlIHN0YXJ0VGltZSBvZiB0aGlzIHRpbWVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+cmV0dXJucyB0aGlzIHRpbWVyLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFRpbWVyIEluaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFydFRpbWUgPSBOYW5vczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgZWxhcHNlZCB0aW1lIGluIG5hbm9zIHNpbmNlIHRoZSBsYXN0IGluaXQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgbG9uZyBFbGFwc2VkTmFub3MoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXJ0VGltZSA9PSBsb25nLk1pblZhbHVlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJUaW1lciBub3Qgc3RhcnRlZCIgKTsKKyAgICAgICAgICAgIHJldHVybiBHZXROYW5vc1NpbmNlKCBzdGFydFRpbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGVsYXBzZWQgdGltZSBpbiBtaWNyb3Mgc2luY2UgdGhlIGxhc3QgaW5pdC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBsb25nIEVsYXBzZWRNaWNyb3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRWxhcHNlZE5hbm9zKCkgLyBOQU5PU19QRVJfTUlDUk87CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzIHNpbmNlIHRoZSBsYXN0IGluaXQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgbG9uZyBFbGFwc2VkTWlsbGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVsYXBzZWROYW5vcygpIC8gTkFOT1NfUEVSX01JTExJOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMgc2luY2UgdGhlIGxhc3QgaW5pdC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBkb3VibGUgRWxhcHNlZFNlY29uZHMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRWxhcHNlZE5hbm9zKCkgLyBOQU5PU19QRVJfU0VDT05EOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBsb25nIHN0YXJ0VGltZSA9IGxvbmcuTWluVmFsdWU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBtaWNyb3NlY29uZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGxvbmcgTkFOT1NfUEVSX01JQ1JPID0gMTAwMDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOdW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGxvbmcgTkFOT1NfUEVSX01JTExJID0gMTAwMDAwMDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBjb25zdCBsb25nIFRJQ0tTX1BFUl9NSUxMSSA9IDEwMDAwOyAvLyAxMDAgbnMgcGVyIHRpY2sKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBjb25zdCBsb25nIE5BTk9TX1BFUl9USUNLID0gMTAwOyAvLyAxMDAgbnMgcGVyIHRpY2sKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOdW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIHNlY29uZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGRvdWJsZSBOQU5PU19QRVJfU0VDT05EID0gMTAwMDAwMDAwMC4wOworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gU1RBVElDIElOVEVSRkFDRSAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIE5hbm9zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5Ob3cuVGlja3MgKiBOQU5PU19QRVJfVElDSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIHN0YXJ0aW5nIHBvaW50IG9mIGEgdGltaW5nIHRlc3QgaW4gbWlsbGlzLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIGN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLk5vdy5UaWNrcyAvIFRJQ0tTX1BFUl9NSUxMSTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhcnRUaW1lIj5hIHZhbHVlIHJldHVybmVkIGJ5IGdldFN0YXJ0VGltZS48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG51bWJlciBvZiBuYW5vcyB3aGljaCBoYXZlIHBhc3NlZCBzaW5jZSBzdGFydFRpbWUuPC9yZXR1cm5zPgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJOYW5vcyIvPgorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgR2V0TmFub3NTaW5jZSggbG9uZyBzdGFydFRpbWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTmFub3MgLSBzdGFydFRpbWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydFRpbWUiPmEgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0U3RhcnRUaW1lLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIG1pY3JvcyB3aGljaCBoYXZlIHBhc3NlZCBzaW5jZSBzdGFydFRpbWUuPC9yZXR1cm5zPgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJOYW5vcyIvPgorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgR2V0TWljcm9zU2luY2UoIGxvbmcgc3RhcnRUaW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldE5hbm9zU2luY2UoIHN0YXJ0VGltZSApIC8gTkFOT1NfUEVSX01JQ1JPOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhcnRUaW1lIj5hIHZhbHVlIHJldHVybmVkIGJ5IGdldFN0YXJ0VGltZS48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG51bWJlciBvZiBtaWxsaXMgd2hpY2ggaGF2ZSBwYXNzZWQgc2luY2Ugc3RhcnRUaW1lLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iTmFub3MiLz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIEdldE1pbGxpc1NpbmNlKCBsb25nIHN0YXJ0VGltZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXROYW5vc1NpbmNlKCBzdGFydFRpbWUgKSAvIE5BTk9TX1BFUl9NSUxMSTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0YXJ0VGltZSI+YSB2YWx1ZSByZXR1cm5lZCBieSBnZXRTdGFydFRpbWUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBudW1iZXIgb2Ygc2Vjb25kcyB3aGljaCBoYXZlIHBhc3NlZCBzaW5jZSBzdGFydFRpbWUuPC9yZXR1cm5zPgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJOYW5vcyIvPgorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBHZXRTZWNvbmRzU2luY2UoIGxvbmcgc3RhcnRUaW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldE5hbm9zU2luY2UoIHN0YXJ0VGltZSApIC8gTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+cmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZSBvZiBtYW55IGludm9jYXRpb25zIG9mCisgICAgICAgIC8vLyBnZXROYW5vc1NpbmNlKCBnZXRTdGFydFRpbWUoKSApLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIEdldFJlc29sdXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgMTAwMDAwOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIgPSBNYXRoLk1pbiggciwgR2V0TmFub3NTaW5jZSggTmFub3MgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj50aGUgbnVtYmVyIG9mIHNlY29uZHM8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YSBuaWNlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGFtb3VudCBvZiB0aW1lPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIb3dMb25nKCBpbnQgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcyA8IDYwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gcy5Ub1N0cmluZygpICsgInMiOworCisgICAgICAgICAgICBpbnQgbSA9IHMgLyA2MDsKKyAgICAgICAgICAgIGlmICggbSA8IDYwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbS5Ub1N0cmluZygpICsgIm0iICsgKCBzJTYwICkgKyAicyI7CisKKyAgICAgICAgICAgIGludCBoID0gbSAvIDYwOworCQkgICAgaWYgKGggPCAyNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaC5Ub1N0cmluZygpICsgImggIiArICggbSU2MCApICsgIm0iOworCisgICAgICAgICAgICBpbnQgaF8gPSBoIC8gMjQ7CisgICAgICAgICAgICByZXR1cm4gaF8uVG9TdHJpbmcoKSArICJkICIgKyAoIGglMjQgKSArICJoIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9UbHNDb25uZWN0aW9uLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1Rsc0Nvbm5lY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2ZTcyNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9UbHNDb25uZWN0aW9uLmNzCkBAIC0wLDAgKzEsMjAxIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIHB1YmxpYyBjbGFzcyBUbHNDb25uZWN0aW9uIDogVGNwVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXJtIG9uIHVyaSB3aGljaCBzcGVjaWZpZXMgd2hldGhlciBzZXJ2ZXIgY2VydGlmaWNhdGUgc2hvdWxkIGJlIGF1dGhlbnRpY2F0ZWQuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEFVVEhfUkVRRCA9ICJUbHNDb25uZWN0aW9uLmF1dGhSZXFkIjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXJtIG9uIHVyaSB3aGljaCBzcGVjaWZpZXMgdGhlIGNlcnRpZmljYXRlIG5hbWUgb2YgdGhlIHNlcnZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBDRVJUX05BTUUgPSAiVGxzQ29ubmVjdGlvbi5jZXJ0TmFtZSI7CisKKyAgICAgICAgcHVibGljIFRsc0Nvbm5lY3Rpb24oU29ja2V0IHNvY2tldCwgc3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgICAgIDogdGhpcyhzb2NrZXQsIG5ldyBVUkwodXJpKSwgcmVzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRsc0Nvbm5lY3Rpb24oU29ja2V0IHNvY2tldCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcykKKyAgICAgICAgICAgIDogYmFzZSh1cmksIHJlc291cmNlcykKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Q2VydGlmaWNhdGVOYW1lKHVyaS5HZXRUZXJtKENFUlRfTkFNRSwgImRlZmF1bHQiKSk7CisgICAgICAgICAgICBTZXRBdXRoUmVxZCh1cmkuR2V0Qm9vbGVhblRlcm0oQVVUSF9SRVFELCB0cnVlKSk7CisKKyAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHVyaS5Ib3N0OworICAgICAgICAgICAgICAgIGlmIChob3N0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImhvc3QgPT0gbnVsbCIpOworCisgICAgICAgICAgICAgICAgaW50PyBwb3J0ID0gdXJpLlBvcnQ7CisgICAgICAgICAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigicG9ydCA9PSBudWxsIik7CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydCA8PSAwIHx8IHBvcnQgPj0gNjU1MzYpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInBvcnQgPD0gMCB8fCBwb3J0ID49IDY1NTM2Iik7CisKKyAgICAgICAgICAgICAgICB0aGlzLnNvY2tldCA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgICAgICB0aGlzLnBvcnQgPSAoaW50KXBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisgICAgICAgICAgICAgICAgdGhpcy5ob3N0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aGlzLnBvcnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTdHJpbmcgaG9zdDsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBwb3J0OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTb2NrZXQgcyA9IHNvY2tldDsKKworICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZvcm1hdCgiVGxzQ29ubmVjdGlvbih1cCwgezB9LCB7MX0pIiwKKyAgICAgICAgICAgICAgICAgICAgcy5Mb2NhbEVuZFBvaW50LCBzLlJlbW90ZUVuZFBvaW50KTsKKworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoIlRsc0Nvbm5lY3Rpb24oZG93biwgezB9LCB7MX0pIiwgaG9zdCwgcG9ydCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBJc1NlcnZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBob3N0ID09IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgU29ja2V0IE5ld1NvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIElQQWRkcmVzcyBhZGRyOworCisgICAgICAgICAgICBpZiAoaG9zdCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElQQWRkcmVzc1tdIGFkZHJzID0gRG5zLkdldEhvc3RBZGRyZXNzZXMoaG9zdCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJzID09IG51bGwgfHwgYWRkcnMuTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiaG9zdCBpcyBpbnZhbGlkIik7CisgICAgICAgICAgICAgICAgYWRkciA9IGFkZHJzWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZHIgPSBJUEFkZHJlc3MuQW55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJUEVuZFBvaW50IGlwZSA9IG5ldyBJUEVuZFBvaW50KGFkZHIsIHBvcnQpOworICAgICAgICAgICAgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoaXBlLkFkZHJlc3NGYW1pbHksIFNvY2tldFR5cGUuU3RyZWFtLCBQcm90b2NvbFR5cGUuVGNwKTsKKyAgICAgICAgICAgIHNvY2tldC5Db25uZWN0KGlwZSk7CisgICAgICAgICAgICByZXR1cm4gc29ja2V0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgU2V0VXBTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLlNldFVwU29ja2V0KCk7CisKKyAgICAgICAgICAgIGlmIChJc1NlcnZlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oc3RyZWFtLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKFNzbFN0cmVhbSlzdHJlYW0pLkF1dGhlbnRpY2F0ZUFzU2VydmVyKEdldFNlcnZlckNlcnQoY2VydE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCIgRXhjZXB0aW9uIGluIGF1dGhlbnRpY2F0aW5nIGNlcnRpZmljYXRlICIpOworICAgICAgICAgICAgICAgICAgICBGaXJlRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBBdXRoZW50aWNhdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgU3NsU3RyZWFtKHN0cmVhbSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBuZXcgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2soVmFsaWRhdGVTZXJ2ZXJDZXJ0aWZpY2F0ZSksCisgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgbmFtZSBtdXN0IG1hdGNoIHRoZSBuYW1lIG9uIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuCisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICgoU3NsU3RyZWFtKXN0cmVhbSkuQXV0aGVudGljYXRlQXNDbGllbnQoY2VydE5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoQXV0aGVudGljYXRpb25FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGUxID0gbmV3IEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlJlbW90ZSBDZXJ0aWZpY2F0ZSBNaXNtYXRjaCBFcnJvci4gUHJvYmxlbSBpbiBzZXR0aW5nIHVwIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFNTTCBDb25uZWN0aW9uLiBFaXRoZXIgZGlzYWJsZSBzZXJ2ZXIgYXV0aGVudGljYXRpb24gYnkgdXNpbmciCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdGVybSBUbHNDb25uZWN0aW9uLmF1dGhSZXFkPWZhbHNlIG9uIHVyaSBvciBwcm92aWRlIGEgdmFsaWQiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgY2VydGlmaWNhdGUgbmFtZSB1c2luZyB0ZXJtIFRsc0Nvbm5lY3Rpb24uY2VydE5hbWU9bmFtZSBvbiB1cmkuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGUxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRDZXJ0aWZpY2F0ZU5hbWUoc3RyaW5nIGNlcnROYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNlcnROYW1lID0gY2VydE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cmluZyBjZXJ0TmFtZTsKKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0QXV0aFJlcWQoYm9vbCBhdXRoUmVxZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5hdXRoUmVxZCA9IGF1dGhSZXFkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIGF1dGhSZXFkOworCisgICAgICAgIHB1YmxpYyAgYm9vbCBWYWxpZGF0ZVNlcnZlckNlcnRpZmljYXRlKAorICAgICAgICAgICBvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgIFg1MDlDaGFpbiBjaGFpbiwKKyAgICAgICAgICAgU3NsUG9saWN5RXJyb3JzIHNzbFBvbGljeUVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFhdXRoUmVxZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHNzbFBvbGljeUVycm9ycyA9PSBTc2xQb2xpY3lFcnJvcnMuTm9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSgiQ2VydGlmaWNhdGUgZXJyb3I6IHswfSIsIHNzbFBvbGljeUVycm9ycyk7CisKKyAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyB0aGlzIGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIHVuYXV0aGVudGljYXRlZCBzZXJ2ZXJzLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSAgWDUwOUNlcnRpZmljYXRlIEdldFNlcnZlckNlcnQoc3RyaW5nIGNlcnROYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBYNTA5U3RvcmUgc3RvcmUgPSBuZXcgWDUwOVN0b3JlKFN0b3JlTmFtZS5NeSwgU3RvcmVMb2NhdGlvbi5Mb2NhbE1hY2hpbmUpOworICAgICAgICAgICAgc3RvcmUuT3BlbihPcGVuRmxhZ3MuUmVhZE9ubHkpOworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBjb2xsID0gc3RvcmUuQ2VydGlmaWNhdGVzLkZpbmQoWDUwOUZpbmRUeXBlLkZpbmRCeVN1YmplY3ROYW1lLCBjZXJ0TmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gY29sbFswXTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9Ub2RvLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RvZG8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmN2QzMgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9Ub2RvLmNzCkBAIC0wLDAgKzEsNDUgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBUT0RPIGlzIHVzZWQgdG8gcGVyZm9ybSBhIGxpZ2h0d2VpZ2h0IGFjdGlvbgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUb2RvCisgICAgeworICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIFBlcmZvcm1zIHRoZSBhY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZ3IiPnRoZSB0b2RvIG1hbmFnZXIgd2hlcmUgdGhpcyB0b2RvIHdhcyBxdWV1ZWQ8L3BhcmFtPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgLy8vICAgICAKKyAgICAgICAgdm9pZCBEb2l0KFRvZG9NYW5hZ2VyIG1ncik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVwb3J0cyBhbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIHRoZSB0b2RvLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1nciI+dGhlIHRvZG8gbWFuYWdlciB3aGVyZSB0aGlzIHRvZG8gd2FzIHF1ZXVlZC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImUiPnRoZSBleGNlcHRpb24gdGhhdCB0aGUgdG9kbyB0aHJldy48L3BhcmFtPgorICAgICAgICB2b2lkIEV4Y2VwdGlvbihUb2RvTWFuYWdlciBtZ3IsIEV4Y2VwdGlvbiBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVG9kb0RlbGVnYXRlSW1wbC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9Ub2RvRGVsZWdhdGVJbXBsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTQ3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVG9kb0RlbGVnYXRlSW1wbC5jcwpAQCAtMCwwICsxLDc1IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY2xhc3MgZGVmaW5lcyBkZWxlZ2F0ZSBmb3IgdGhlIG1ldGhvZHMKKyAgICAvLy8gZGVmaW5lZCBpbiBUb2RvIEludGVyZmFjZS4gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVG9kb0RlbGVnYXRlSW1wbCA6IFRvZG8KKyAgICB7CisgICAgICAgIHByaXZhdGUgRG9pdERlbGVnYXRlIGRvSXQgPSBudWxsOworICAgICAgICBwcml2YXRlIEV4Y2VwdGlvblRvRG9EZWxlZ2F0ZSBleGMgPSBudWxsOworCisKKworICAgICAgICBwdWJsaWMgVG9kb0RlbGVnYXRlSW1wbChEb2l0RGVsZWdhdGUgZCwgRXhjZXB0aW9uVG9Eb0RlbGVnYXRlIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZG9JdCA9IGQ7CisgICAgICAgICAgICB0aGlzLmV4YyA9IGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERvaXQoVG9kb01hbmFnZXIgbWdyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZG9JdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkRvaXQgbWV0aG9kIG5vdCBkZWZpbmVkIik7CisKKyAgICAgICAgICAgIGRvSXQobWdyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhjZXB0aW9uKFRvZG9NYW5hZ2VyIG1nciwgRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleGMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFeGNlcHRpb24gbWV0aG9kIG5vdCBkZWZpbmVkIik7CisKKyAgICAgICAgICAgIGV4YyhtZ3IsIGUpOworCisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBlcmZvcm1zIHRoZSBhY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZ3IiPnRoZSB0b2RvIG1hbmFnZXIgd2hlcmUgdGhpcyB0b2RvIHdhcyBxdWV1ZWQ8L3BhcmFtPgorCisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIERvaXREZWxlZ2F0ZShUb2RvTWFuYWdlciBtZ3IpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlcG9ydHMgYW4gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgdG9kby4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZ3IiPnRoZSB0b2RvIG1hbmFnZXIgd2hlcmUgdGhpcyB0b2RvIHdhcyBxdWV1ZWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlIj50aGUgZXhjZXB0aW9uIHRoYXQgdGhlIHRvZG8gdGhyZXcuPC9wYXJhbT4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBFeGNlcHRpb25Ub0RvRGVsZWdhdGUoVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVG9kb01hbmFnZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVG9kb01hbmFnZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhYzNjMgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9Ub2RvTWFuYWdlci5jcwpAQCAtMCwwICsxLDM3NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgc3RhbmRhbG9uZSB2ZXJzaW9uIG9mIGEgcHJvY2Vzc29yIGZvciB0b2RvIGl0ZW1zCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVG9kb01hbmFnZXIgOiBBYnN0cmFjdFN0YXJ0YWJsZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0cyB0aGUgVG9kb01hbmFnZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXhFbnRyaWVzIj50aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVldWU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5RGVsYXkiPm1pbGxpc2Vjb25kcyB0byBkZWxheSBhIGNhbGxlciB3aG8gdHJpZXMgdG8KKyAgICAgICAgLy8vIGFkZCBhIGVudHJ5IG92ZXIgdGhlIGxpbWl0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWluV29ya2VycyI+dGhlIG1pbmltdW0gbnVtYmVyIG9mIHdvcmtlcnMgdG8ga2VlcCB3YWl0aW5nPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXhXb3JrZXJzIj50aGUgbWF4aW11bSBudW1iZXIgb2Ygd29ya2VycyB0byBhbGxvdy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtlckxpbmdlciI+bWlsbGlzZWNvbmRzIGEgd29ya2VyIHdpbGwgd2FpdCBmb3IgYSBUb2RvCisgICAgICAgIC8vLyBiZWZvcmUgY29uc2lkZXJpbmcgcXVpdHRpbmcuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aHJlc2hvbGQiPnRoZSBwZXIgd29ya2VyIHRocmVzaG9sZCBmb3IgcXVldWUgbGVuZ3RoLiBpZgorICAgICAgICAvLy8gcXVldWUgbGVuZ3RoIGV4Y2VlZHMgdGhpcyBhbW91bnQsIGEgbmV3IHdvcmtlciBpcyBhZGRlZCBpZiBhbGxvd2VkLjwvcGFyYW0+CisgICAgICAgIC8vLyAKKyAgICAgICAgcHVibGljIFRvZG9NYW5hZ2VyKCBpbnQgbWF4RW50cmllcywgaW50IGVudHJ5RGVsYXksIGludCBtaW5Xb3JrZXJzLAorICAgICAgICAgICAgaW50IG1heFdvcmtlcnMsIGludCB3b3JrZXJMaW5nZXIsIGludCB0aHJlc2hvbGQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIG1heEVudHJpZXMgPCAxICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJtYXhFbnRyaWVzIDwgMSIgKTsKKworICAgICAgICAgICAgaWYgKCBtaW5Xb3JrZXJzIDwgMCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAibWluV29ya2VycyA8IDAiICk7CisKKyAgICAgICAgICAgIGlmICggbWF4V29ya2VycyA8IG1pbldvcmtlcnMgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbiggIm1heFdvcmtlcnMgPCBtaW5Xb3JrZXJzIiApOworCisgICAgICAgICAgICBpZiAoIG1heFdvcmtlcnMgPCAxICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJtYXhXb3JrZXJzIDwgMSIgKTsKKworICAgICAgICAgICAgaWYgKCB3b3JrZXJMaW5nZXIgPCAxICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJ3b3JrZXJMaW5nZXIgPCAxIiApOworCisgICAgICAgICAgICB0aGlzLm1heEVudHJpZXMgPSBtYXhFbnRyaWVzOworICAgICAgICAgICAgdGhpcy5lbnRyeURlbGF5ID0gZW50cnlEZWxheTsKKyAgICAgICAgICAgIHRoaXMubWluV29ya2VycyA9IG1pbldvcmtlcnM7CisgICAgICAgICAgICB0aGlzLm1heFdvcmtlcnMgPSBtYXhXb3JrZXJzOworICAgICAgICAgICAgdGhpcy53b3JrZXJMaW5nZXIgPSB3b3JrZXJMaW5nZXI7CisgICAgICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IG1heEVudHJpZXM7CisgICAgCQorCSAgICBwcml2YXRlIGludCBlbnRyeURlbGF5OworICAgIAkKKwkgICAgcHJpdmF0ZSBpbnQgbWluV29ya2VyczsKKyAgICAJCisJICAgIHByaXZhdGUgaW50IG1heFdvcmtlcnM7CisgICAgCQorCSAgICBwcml2YXRlIGludCB3b3JrZXJMaW5nZXI7CisgICAgCQorCSAgICBwcml2YXRlIGludCB0aHJlc2hvbGQ7CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgU3RhcnQwKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICB9CisgICAgIAorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBTdG9wMCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKHRoaXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTW9uaXRvci5QdWxzZUFsbCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvZG8iPjwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICAgIFsgTWV0aG9kSW1wbCAoIE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCApIF0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkKCBUb2RvIHRvZG8gKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja0lzU3RhcnRlZCgpOworCisgICAgICAgICAgICBpbnQgbiA9IEFkZEVudHJ5KCB0b2RvICk7CisgICAgICAgICAgICBNb25pdG9yLlB1bHNlKCB0aGlzICk7CisKKyAgICAgICAgICAgIENvbnNpZGVyU3RhcnRpbmdBV29ya2VyKCBuICkgOworCisgICAgICAgICAgICBpZiAoIG4gPiBtYXhFbnRyaWVzICkKKyAgICAgICAgICAgICAgICBUaHJlYWQuU2xlZXAoIGVudHJ5RGVsYXkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJ1bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZEFkanVzdCA9IHRydWU7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUb2RvIHRvZG87CisgICAgICAgICAgICAgICAgd2hpbGUgKCAoIHRvZG8gPSBHZXROZXh0VG9kbygpICkgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9kby5Eb2l0KCB0aGlzICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8uRXhjZXB0aW9uKCB0aGlzLCBlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmVlZEFkanVzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggbmVlZEFkanVzdCApCisgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMuQWRqdXN0KCAtMSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyByZWdpb24gV29ya2VycworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+bnVtYmVyIG9mIHdvcmtlcnM8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgTnVtV29ya2VycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3b3JrZXJzLkdldCgpOworICAgICAgICB9CisKKyAgICAgICAgW01ldGhvZEltcGwoIE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCApXQorICAgICAgICBwcml2YXRlIHZvaWQgQ29uc2lkZXJTdGFydGluZ0FXb3JrZXIoIGludCBxbGVuICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBOdW1Xb3JrZXJzKCk7CisKKyAgICAgICAgICAgIGlmICggbiA+PSBtYXhXb3JrZXJzICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IHdvcmtlciBpZiB0aGVyZSBhcmUgbm9uZSBvciBpZiB0aGUgCisgICAgICAgICAgICAvLyBxdWV1ZSBsZW5ndGggcGVyIHdvcmtlciBoYXMgZXhjZWVkZWQgdGhlIHRocmVzaG9sZAorICAgICAgICAgICAgaWYgKCBuID09IDAgfHwgKCAocWxlbiArIG4tMSkgLyBuICkgPiB0aHJlc2hvbGQgKQorICAgICAgICAgICAgICAgIFN0YXJ0QVdvcmtlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFN0YXJ0QVdvcmtlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmtlcnMuQWRqdXN0KCAxICk7CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoUnVuKTsKKyAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSW50Q291bnRlciB3b3JrZXJzID0gbmV3IEludENvdW50ZXIoKTsKKworICAgICAgICAjIGVuZHJlZ2lvbiBXb3JrZXJzCisKKyAgICAgICAgIyByZWdpb24gUXVldWUKKworICAgICAgICBwcml2YXRlIEVudHJ5IGhlYWQ7CisgICAgICAgIHByaXZhdGUgRW50cnkgdGFpbDsKKyAgICAgICAgcHJpdmF0ZSBJbnRDb3VudGVyIGVudHJpZXMgPSBuZXcgSW50Q291bnRlcigpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgdGhlIHRvZG8gdG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvZG8iPnRoZSB0b2RvIHRvIGFkZC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIGN1cnJlbnQgcXVldWUgbGVuZ3RoLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIAorICAgICAgICBbTWV0aG9kSW1wbCggTWV0aG9kSW1wbE9wdGlvbnMuU3luY2hyb25pemVkICldCisgICAgICAgIHByaXZhdGUgaW50IEFkZEVudHJ5KCBUb2RvIHRvZG8gKQorICAgICAgICB7CisgICAgICAgICAgICBFbnRyeSBlID0gbmV3IEVudHJ5KCk7CisKKyAgICAgICAgICAgIGUudG9kbyA9IHRvZG87CisKKyAgICAgICAgICAgIGlmICggdGFpbCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB0YWlsLm5leHQgPSBlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGhlYWQgPSBlOyAgIC8vIGZpcnN0IGluc3RhbmNlCisKKyAgICAgICAgICAgIHRhaWwgPSBlOworCisgICAgICAgICAgICByZXR1cm4gZW50cmllcy5BZGp1c3QoIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZSBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgdG9kbyBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSwgb3IgCisgICAgICAgIC8vLyBudWxsIGlmIGVtcHR5PC9yZXR1cm5zPgorICAgICAgICAvLy8gCisgICAgICAgIFtNZXRob2RJbXBsKCBNZXRob2RJbXBsT3B0aW9ucy5TeW5jaHJvbml6ZWQgKV0KKyAgICAgICAgcHJpdmF0ZSBUb2RvIFJlbW92ZUVudHJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBoZWFkID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBFbnRyeSBlID0gaGVhZDsKKyAgICAgICAgICAgIGhlYWQgPSBlLm5leHQ7CisKKyAgICAgICAgICAgIGlmICggaGVhZCA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0YWlsID0gbnVsbDsKKworICAgICAgICAgICAgZW50cmllcy5BZGp1c3QoIC0xICk7CisKKyAgICAgICAgICAgIHJldHVybiBlLnRvZG87CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPm51bWJlciBvZiBUT0RPczwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBOdW1FbnRyaWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVudHJpZXMuR2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbiBlbnRyeSBpbiB0aGUgdG9kbyBxdWV1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgRW50cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFRoZSB0b2RvIHRvIGJlIHBlcmZvcm1lZAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBUb2RvIHRvZG87CisKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBUaGUgbmV4dCB0b2RvIGluIHRoZSBxdWV1ZQorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBFbnRyeSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgIyBlbmRyZWdpb24gUXVldWUKKworICAgICAgICAjIHJlZ2lvbiBCTEFICisKKyAgICAgICAgW01ldGhvZEltcGwoIE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCApXQorICAgICAgICBwcml2YXRlIFRvZG8gR2V0TmV4dFRvZG8oKQorICAgICAgICB7CisgICAgICAgICAgICBUb2RvIHRvZG8gPSBudWxsOworICAgICAgICAgICAgYm9vbCBsaW5nZXJlZCA9IGZhbHNlOworCisgICAgICAgICAgICB3aGlsZSAoIElzU3RhcnRlZCgpICYmICggdG9kbyA9IFJlbW92ZUVudHJ5KCkgKSA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbGluZ2VyZWQgJiYgd29ya2Vycy5HZXQoKSA+IG1pbldvcmtlcnMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLkFkanVzdCggLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KCB0aGlzLCB3b3JrZXJMaW5nZXIgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsaW5nZXJlZC4gd2UgbWlnaHQgaGF2ZSBiZWVuIHdva2VuIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgc3RvcHBpbmcsIG9yIGEgdG9kbyBtaWdodCBoYXZlIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkLgorCisgICAgICAgICAgICAgICAgICAgIGxpbmdlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLkFkanVzdCggLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRvZG87CisgICAgICAgIH0KKworICAgICAgICAjIGVuZHJlZ2lvbiBCTEFICisKKyAgICAgICAgIyByZWdpb24gU3RhdGljIFN0dWZmCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9kbyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIEV4Y2VwdGlvbjogCisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICAvLy8gICAgIAorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQWRkVG9kbyggVG9kbyB0b2RvICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0VG9kb01hbmFnZXIoKS5BZGQodG9kbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2RvLkV4Y2VwdGlvbihudWxsLGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBjb25maWd1cmVkIFRvZG9NYW5hZ2VyLiBJZiB0aGVyZSBpc24ndCBvbmUsIGl0IG1ha2VzCisgICAgICAgIC8vLyBvbmUgd2l0aCBvbmUgd29ya2VyIHRocmVhZC48L3JldHVybnM+CisgICAgICAgIC8vLyBFeGNlcHRpb246IAorICAgICAgICAvLy8gICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBjcmVhdGluZyB0aGUgVG9kb01hbmFnZXIKKyAgICAgICAgcHVibGljIHN0YXRpYyBUb2RvTWFuYWdlciBHZXRUb2RvTWFuYWdlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdG9kb21hbmFnZXIgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayAoIGxvY2tPYmplY3QgICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggdG9kb21hbmFnZXIgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvZG9tYW5hZ2VyID0gbmV3IFRvZG9NYW5hZ2VyKCA1MCwgMTAsIDAsIDUsIDUwMDAsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvZG9tYW5hZ2VyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG9kb21hbmFnZXI7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5ld1RvZG9NYW5hZ2VyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG9sZCB0b2RvIG1hbmFnZXI8L3JldHVybnM+CisgICAgICAgIC8vLyAKKyAgICAgICAgW01ldGhvZEltcGwoIE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCApXQorICAgICAgICBwdWJsaWMgc3RhdGljIFRvZG9NYW5hZ2VyIFNldFRvZG9NYW5hZ2VyKCBUb2RvTWFuYWdlciBuZXdUb2RvTWFuYWdlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyIG9sZFRvZG9NYW5hZ2VyID0gdG9kb21hbmFnZXI7CisgICAgICAgICAgICB0b2RvbWFuYWdlciA9IG5ld1RvZG9NYW5hZ2VyOworICAgICAgICAgICAgcmV0dXJuIG9sZFRvZG9NYW5hZ2VyOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2h1dHMgZG93biB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgc3RhdGljIHRvZG8gbWFuYWdlciBpZiBhbnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2h1dERvd24oKQorICAgICAgICB7CisgICAgICAgICAgICBUb2RvTWFuYWdlciBvbGRUb2RvTWFuYWdlciA9IFNldFRvZG9NYW5hZ2VyKCBudWxsICk7CisgICAgICAgICAgICBpZiAoIG9sZFRvZG9NYW5hZ2VyICE9IG51bGwgKQorICAgICAgICAgICAgICAgIG9sZFRvZG9NYW5hZ2VyLlN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRvZG9NYW5hZ2VyIHRvZG9tYW5hZ2VyOyAKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTaW5jZSBDIyBkb2Vzbid0IGFsbG93IGxvY2tpbmcgb24gYW4gZW50aXJlIGNsYXNzLCB0aGUgc3Vic3RpdHV0ZSAKKyAgICAgICAgLy8vIGhlcmUgaXMgbG9ja2luZyBhIHN0YXRpYyB2YXJpYWJsZSBvZiB0aGUgY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBsb2NrT2JqZWN0ID0gbmV3IE9iamVjdCgpIDsKKworICAgICAgICAjIGVuZHJlZ2lvbiBTdGF0aWMgU3R1ZmYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVHJhbnNwb3J0LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI2Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDg5IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE91dC1vZi1iYW5kIHF1ZXJ5LCBjb250cm9sLCBhbmQgbm90aWZpY2F0aW9uIGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0PFM+IHdoZXJlIFM6U2Vzc2lvbiAKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgYSBjb25maWd1cmF0aW9uIG9yIG9wZXJhdGlvbmFsIHZhbHVlIGZyb20gdGhlIHRyYW5zcG9ydC4gVGhlCisgICAgICAgIC8vLyByZXF1ZXN0IGlzIHBhc3NlZCBkb3duIHRoZSBjaGFpbiBvZiB0cmFuc3BvcnRzIHVudGlsIHNvbWUgdHJhbnNwb3J0CisgICAgICAgIC8vLyByZWNvZ25pc2VzIHRoZSBxdWVyeSwgd2hlcmV1cG9uIGl0IHJldHVybnMgdGhlIHJlcXVlc3RlZCB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJxdWVyeSI+YW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHF1ZXJ5LCB3aGljaCBjb3VsZCBiZSBhcworICAgICAgICAvLy8gc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworICAgICAgICAvLy8gYSBjbGFzcyB3aXRoIGluc3RhbmNlIHZhcmlhYmxlcyBmb3IgcXVlcnkgdGVybXMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSByZXF1ZXN0ZWQgdmFsdWUsIG9yIG51bGwgaWYgbm90IGRlZmluZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8gRXhjZXB0aW9uOgorICAgICAgICAvLy8gICAgIHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGlzIG5vdCByZWNvZ25pc2VkCisgICAgICAgIC8vLyAgICAgYnkgYW55IHRyYW5zcG9ydCAod2hpY2ggaXMgdG8gc2F5LCBpZiB0aGUgbGFzdCB0cmFuc3BvcnQgaW4gdGhlIHRyYW5zcG9ydAorICAgICAgICAvLy8gICAgIGNoYWluIGRvZXMgbm90IHJlY29nbmlzZSBpdCwgaXQgc2hvdWxkIHRocm93IHRoaXMgZXhjZXB0aW9uKS4gVHlwaWNhbGx5CisgICAgICAgIC8vLyAgICAgdGhpcyB3b3VsZCBiZSBzb21lIHNvcnQgb2YgdHJhbnNwb3J0IG1lY2hhbmlzbSBzdWNoIGFzIHRjcCwgdWRwLCBqbXMsXAorICAgICAgICAvLy8gICAgIGh0dHAsIHNpcCwgZXRjLgorICAgICAgICAvLy8gICAgIAorICAgICAgICBPYmplY3QgVHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgYSBjb25maWd1cmF0aW9uIG9yIG9wZXJhdGlvbmFsIHZhbHVlIGluIHRoZSB0cmFuc3BvcnQuIFRoZQorICAgICAgICAvLy8gcmVxdWVzdCBpcyBwYXNzZWQgZG93biB0aGUgY2hhaW4gb2YgdHJhbnNwb3J0cyB1bnRpbCBzb21lIHRyYW5zcG9ydAorICAgICAgICAvLy8gcmVjb2duaXNlcyB0aGUgY29udHJvbCwgd2hlcmV1cG9uIGl0IHN0b3JlcyB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgICAgIC8vLyBhbmQgcmV0dXJucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250cm9sIj5hbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29udHJvbCwgd2hpY2ggY291bGQgYmUgYXMKKyAgICAgICAgLy8vIHNpbXBsZSBhcyBhIHN0cmluZywgaW50ZWdlciwgb3IgZW51bSwgb3IgbW9yZSBjb21wbGV4IHN1Y2ggYXMKKyAgICAgICAgLy8vIGEgY2xhc3Mgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMgZm9yIGNvbnRyb2wgdGVybXMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+dGhlIHZhbHVlIHRvIGJlIHNldDwvcGFyYW0+CisgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgIC8vLyAgICAgdGhyb3dzIEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0CisgICAgICAgIC8vLyAgICAgdHlwZSBvciBpZiB0aGUgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZS4KKyAgICAgICAgLy8vICAgICAKKyAgICAgICAgLy8vICAgICB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBpcyBub3QgcmVjb2duaXNlZAorICAgICAgICAvLy8gICAgIGJ5IGFueSB0cmFuc3BvcnQgKHdoaWNoIGlzIHRvIHNheSwgaWYgdGhlIGxhc3QgdHJhbnNwb3J0IGluIHRoZSB0cmFuc3BvcnQKKyAgICAgICAgLy8vICAgICBjaGFpbiBkb2VzIG5vdCByZWNvZ25pc2UgaXQsIGl0IHNob3VsZCB0aHJvdyB0aGlzIGV4Y2VwdGlvbikuIFR5cGljYWxseQorICAgICAgICAvLy8gICAgIHRoaXMgd291bGQgYmUgc29tZSBzb3J0IG9mIHRyYW5zcG9ydCBtZWNoYW5pc20gc3VjaCBhcyB0Y3AsIHVkcCwgam1zLFwKKyAgICAgICAgLy8vICAgICBodHRwLCBzaXAsIGV0Yy4KKyAgICAgICAgLy8vICAgICAKKyAgICAgICAgdm9pZCBUcmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm90aWZpZXMgdGhlIGNoYWluIG9mIHRyYW5zcG9ydHMgb2YgdGhlIHNwZWNpZmllZCBldmVudC4gVW5saWtlIHF1ZXJ5CisgICAgICAgIC8vLyBhbmQgY29udHJvbCBvcGVyYXRpb25zIGFib3ZlLCBldmVudHMgYXJlIGFsd2F5cyBwYXNzZWQgZG93biB0byB0aGUKKyAgICAgICAgLy8vIGJvdHRvbSB0byBhbGxvdyBhbGwgdHJhbnNwb3J0cyB0byBub3RpY2UgdGhlbSAodGhvdWdoIGl0IGlzIHBvc3NpYmxlCisgICAgICAgIC8vLyB0aGF0IGFuIGV2ZW50IG1pZ2h0IGJlIGRlbGF5ZWQgZm9yIGEgYml0KS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJldmVudE9iaiI+YSBjbGFzcyB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudCwgcG9zc2libHkgd2l0aAorICAgICAgICAvLy8gcGFyYW1ldGVycy4gVGhlIHNpbXBsZXN0IGV2ZW50IGNvdWxkIGJlIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLAorICAgICAgICAvLy8gYnV0IGFueSBjbGFzcyBpbnN0YW5jZSB3aWxsIGRvIChhcyBsb25nIGFzIHNvbWUgdHJhbnNwb3J0IGluIHRoZQorICAgICAgICAvLy8gY2hhaW4gZXhwZWN0cyBpdCkuPC9wYXJhbT4KKyAgICAgICAgLy8vIAorICAgICAgICB2b2lkIFRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50T2JqICk7CisKKworICAgICAgICB2b2lkIFNldFNlc3Npb24oUyBzZXNzaW9uKTsKKworICAgICAgICBTIEdldFNlc3Npb24oKTsKKworICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVHJhbnNwb3J0Q29uc3RzLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydENvbnN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUzOWNlCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydENvbnN0cy5jcwpAQCAtMCwwICsxLDExMiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgcHVibGljIGNsYXNzIFRyYW5zcG9ydENvbnN0cworICAgIHsKKyAgICAgICAgI3JlZ2lvbiBXZWxsLWtub3duIHF1ZXJpZXMsIGNvbnRyb2xzLCBhbmQgZXZlbnRzLgorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5hbWUgb2YgdmFsdWUgZmFjdG9yeSBpbiByZXNvdXJjZXMuIFRoZSB2YWx1ZSBpcyAiVHJhbnNwb3J0LnZhbHVlRmFjdG9yeSIuCisgICAgICAgIC8vLyBUaGUgcmVzdWx0IG9mIGxvb2tpbmcgdXAgdGhpcyBuYW1lIHNob3VsZCBiZSBhIHtAbGluayBWYWx1ZUZhY3Rvcnl9IGZvcgorICAgICAgICAvLy8gdGhlIHNlcnZpY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgVkFMVUVfRkFDVE9SWSA9ICJUcmFuc3BvcnQudmFsdWVGYWN0b3J5IjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFuc3BvcnQgY29udHJvbCB3aGljaCBzdGFydHMgdGhlIHRyYW5zcG9ydCBzdGFjay4gVGhlIGFyZ3VtZW50CisgICAgICAgIC8vLyBzaG91bGQgYmUgbnVsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIFNUQVJUID0gIlNUQVJUIjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFuc3BvcnQgY29udHJvbCB3aGljaCBzdGFydHMgdGhlIHRyYW5zcG9ydCBzdGFjayBhbmQgd2FpdHMKKyAgICAgICAgLy8vIGZvciBpdCB0byBjb21lIHVwLiBUaGUgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBpbnRlZ2VyIG51bWJlciBvZgorICAgICAgICAvLy8gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IFN0cmluZyBTVEFSVF9BTkRfV0FJVF9VUCA9ICJTVEFSVF9BTkRfV0FJVF9VUCI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNwb3J0IHF1ZXJ5IHdoaWNoIHdhaXRzIGZvciB0aGUgdHJhbnNwb3J0IHN0YWNrIHRvIGNvbWUgdXAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjbGFzcyBXYWl0VXAKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IGludCBfbWF4RGVsYXk7CisKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyAKKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heERlbGF5Ij5kZWxheSBpbiBtaWxsaXNlY29uZHM8L3BhcmFtPgorICAgICAgICAgICAgcHVibGljIFdhaXRVcCggaW50IG1heERlbGF5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbWF4RGVsYXkgPSBtYXhEZWxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRyYW5zcG9ydCBjb250cm9sIHdoaWNoIHN0b3BzIHRoZSB0cmFuc3BvcnQgc3RhY2suIFRoZSBhcmd1bWVudAorICAgICAgICAvLy8gc2hvdWxkIGJlIG51bGwsIG9yIGEgQm9vbGVhbiByZXNldCAodHJ1ZSBmb3IgaW5zdGFudCBjbG9zZSwKKyAgICAgICAgLy8vIGZhbHNlIGZvciBhIG5pY2VyLCBnZW50bGVyIGNsb3NlKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IFN0cmluZyBTVE9QID0gIlNUT1AiOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRyYW5zcG9ydCBjb250cm9sIHdoaWNoIHN0b3BzIHRoZSB0cmFuc3BvcnQgc3RhY2sgYW5kIHdhaXRzCisgICAgICAgIC8vLyBmb3IgaXQgdG8gZ28gZG93bi4gVGhlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgaW50ZWdlciBudW1iZXIgb2YKKyAgICAgICAgLy8vIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgU1RPUF9BTkRfV0FJVF9ET1dOID0gIlNUT1BfQU5EX1dBSVRfRE9XTiI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNwb3J0IGNvbnRyb2wgd2hpY2ggcmVzZXRzIHRoZSB0cmFuc3BvcnQgc3RhY2sgKGUuZy4sIGNsb3NlcyB0aGUKKyAgICAgICAgLy8vIHNvY2tldCkgd2l0aG91dCBzdG9wcGluZyBpdC4gSWYgaXQgaXMgc2V0IHRvIHJlY29ubmVjdCwgdGhlbiBpdCB3aWxsIGRvCisgICAgICAgIC8vLyB0aGF0LiBPbmx5IG1lYW5pbmdmdWwgZm9yIGNvbm5lY3Rpb24gb3JpZW50ZWQgdHJhbnNwb3J0cy4gT3RoZXJzIHR5cGVzCisgICAgICAgIC8vLyB3aWxsIGlnbm9yZSB0aGlzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgU3RyaW5nIFJFU0VUID0gIlJFU0VUIjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFuc3BvcnQgcXVlcnkgd2hpY2ggYXNrcyBpcyB0aGlzIGEgbGlzdGVuZXIgaW5pdGlhdGVkIGNvbm5lY3Rpb24gb3IKKyAgICAgICAgLy8vIGlzIHRoaXMgYSBjbGllbnQgaW5pdGlhdGVkIGNvbm5lY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBTdHJpbmcgSVNfU0VSVkVSID0gIklTX1NFUlZFUiI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNwb3J0IHF1ZXJ5IHdoaWNoIHdhaXRzIGZvciB0aGUgdHJhbnNwb3J0IHN0YWNrIHRvIGdvIGRvd24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjbGFzcyBXYWl0RG93bgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaW50IF9tYXhEZWxheTsKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4RGVsYXkiPmRlbGF5IGluIG1pbGxpc2Vjb25kczwvcGFyYW0+CisgICAgICAgICAgICBwdWJsaWMgV2FpdERvd24oIGludCBtYXhEZWxheSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX21heERlbGF5ID0gbWF4RGVsYXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydERhdGEuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVHJhbnNwb3J0RGF0YS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ5NzA5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydERhdGEuY3MKQEAgLTAsMCArMSwyNyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0RGF0YSA6IFRyYW5zcG9ydDxTZXNzaW9uRGF0YT4KKyAgICB7CisKKyAgICAgICAgdm9pZCBUcmFuc3BvcnREYXRhKFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVHJhbnNwb3J0UGFja2V0LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydFBhY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBlMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1RyYW5zcG9ydFBhY2tldC5jcwpAQCAtMCwwICsxLDI4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgcHVibGljIGludGVyZmFjZSBUcmFuc3BvcnRQYWNrZXQgOiBUcmFuc3BvcnQ8U2Vzc2lvblBhY2tldD4KKyAgICB7CisKKyAgICAgICAgaW50IEhlYWRlclNpemUoKTsKKyAgICAgICAgdm9pZCBUcmFuc3BvcnRQYWNrZXQoV2hvIHJlY2lwaWVudCwgRmxleEJ1ZmZlciBidWYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9VUkwuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVVJMLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWM4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVVJMLmNzCkBAIC0wLDAgKzEsMTI4MiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTW9kZWxzIGEgdXJsIG9mIHRoZSBmb3JtIHNjaGVtZTovL3VzZXI6cGFzc3dvcmRAaG9zdDpwb3J0L3VyaTtwYXJtcz90ZXJtcyNmcmFnbWVudAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFVSTAorICAgIHsKKyAgICAgICAgI3JlZ2lvbiBNRU1CRVIgVkFSSUFCTEVTCisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgc2NoZW1lOworICAgICAgICBwcml2YXRlIHN0cmluZyB1c2VyOworICAgICAgICBwcml2YXRlIHN0cmluZyBwYXNzd29yZDsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdDsKKyAgICAgICAgcHJpdmF0ZSBpbnQ/IHBvcnQ7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIHVyaTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PHN0cmluZz4gcGFybXM7CisgICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gdGVybXM7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIGZyYWdtZW50OworCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIENPTlNUUlVDVE9SUworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYSB1cmwgZnJvbSBhIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmxTdHJpbmciPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBVUkwoIHN0cmluZyB1cmxTdHJpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJzZSggdXJsU3RyaW5nICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgVVJMIGZyb20gYW5vdGhlciBVUkwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdGhlciI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIFVSTCggVVJMIG90aGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgc2NoZW1lID0gb3RoZXIuc2NoZW1lOworICAgICAgICAgICAgdXNlciA9IG90aGVyLnVzZXI7CisgICAgICAgICAgICBwYXNzd29yZCA9IG90aGVyLnBhc3N3b3JkOworICAgICAgICAgICAgaG9zdCA9IG90aGVyLmhvc3Q7CisgICAgICAgICAgICBwb3J0ID0gb3RoZXIucG9ydDsKKyAgICAgICAgICAgIHVyaSA9IG90aGVyLnVyaTsKKyAgICAgICAgICAgIHBhcm1zID0gQ29weUxpc3QoIG90aGVyLnBhcm1zICk7CisgICAgICAgICAgICB0ZXJtcyA9IENvcHlUZXJtcyggb3RoZXIudGVybXMgKTsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gb3RoZXIuZnJhZ21lbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IFVSTAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVVJMKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwcml2YXRlIHZvaWQgUGFyc2UoIHN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcyBpcyBzY2hlbWU6Wy8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0vXXVyaVs7cGFyYW1zXVs/dGVybXNdWyNmcmFnbWVudF0KKworICAgICAgICAgICAgc3RyaW5nW10geCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnOicgKTsKKyAgICAgICAgICAgIGlmICggeCA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCAibWlzc2luZyBzY2hlbWUiICk7CisKKyAgICAgICAgICAgIFNjaGVtZSA9IFVuZXNjYXBlKCB4WyAwIF0gKTsKKyAgICAgICAgICAgIHMgPSB4WyAxIF07CisKKyAgICAgICAgICAgIC8vIHMgaXMgWy8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0vXXVyaVs7cGFyYW1zXVs/dGVybXNdWyNmcmFnbWVudF0KKworICAgICAgICAgICAgeCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnIycgKTsKKyAgICAgICAgICAgIGlmICggeCE9bnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgPSBVbmVzY2FwZSggeFsgMSBdICk7CisgICAgICAgICAgICAgICAgcyA9IHhbIDAgXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcyBpcyBbLy9bdXNlcls6cGFzc3dvcmRdQF1ob3N0Wzpwb3J0XS9ddXJpWztwYXJhbXNdWz90ZXJtc10KKworICAgICAgICAgICAgeCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnPycgKTsKKyAgICAgICAgICAgIGlmICggeCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXJzZVRlcm1zKCB4WyAxIF0gKTsKKyAgICAgICAgICAgICAgICBzID0geFsgMCBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzIGlzIFsvL1t1c2VyWzpwYXNzd29yZF1AXWhvc3RbOnBvcnRdL111cmlbO3BhcmFtc10KKworICAgICAgICAgICAgeCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnOycgKTsKKyAgICAgICAgICAgIGlmICggeCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXJzZVBhcmFtcyggeFsgMSBdICk7CisgICAgICAgICAgICAgICAgcyA9IHhbIDAgXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcyBpcyBbLy9bdXNlcls6cGFzc3dvcmRdQF1ob3N0Wzpwb3J0XS9ddXJpCisKKyAgICAgICAgICAgIGlmICggcy5TdGFydHNXaXRoKCAiLy8iICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSBzLlN1YnN0cmluZyggMiApOworICAgICAgICAgICAgICAgIC8vIHMgaXMgW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0vdXJpCisgICAgICAgICAgICAgICAgeCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnLycgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHggIT0gbnVsbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBzIGlzIFt1c2VyWzpwYXNzd29yZF1AXWhvc3RbOnBvcnRdL3VyaQorICAgICAgICAgICAgICAgICAgICBQYXJzZUhvc3QoIHhbIDAgXSApOworICAgICAgICAgICAgICAgICAgICBzID0geFsgMSBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBzIGlzIFt1c2VyWzpwYXNzd29yZF1AXWhvc3RbOnBvcnRdCisgICAgICAgICAgICAgICAgICAgIFBhcnNlSG9zdCggcyApOworICAgICAgICAgICAgICAgICAgICBzID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVXJpID0gVW5lc2NhcGUoIHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBQYXJzZUhvc3QoIHN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcyBpcyBbdXNlcls6cGFzc3dvcmRdQF1ob3N0Wzpwb3J0XQorICAgICAgICAgICAgc3RyaW5nW10geCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnQCcgKTsKKyAgICAgICAgICAgIGlmICggeCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXJzZVVzZXJQYXNzd29yZCggeFsgMCBdICk7CisgICAgICAgICAgICAgICAgUGFyc2VIb3N0UG9ydCggeFsgMSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGFyc2VIb3N0UG9ydCggcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFBhcnNlVXNlclBhc3N3b3JkKCBzdHJpbmcgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHMgaXMgdXNlcls6cGFzc3dvcmRdCisgICAgICAgICAgICBzdHJpbmdbXSB4ID0gU3RyaW5nVXRpbC5MZWZ0U3BsaXQoIHMsICc6JyApOworICAgICAgICAgICAgaWYgKCB4ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVzZXIgPSBVbmVzY2FwZSggeFsgMCBdICk7CisgICAgICAgICAgICAgICAgUGFzc3dvcmQgPSBVbmVzY2FwZSggeFsgMSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVXNlciA9IFVuZXNjYXBlKCBzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgUGFyc2VIb3N0UG9ydCggc3RyaW5nIHMgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzIGlzIGhvc3RbOnBvcnRdCisgICAgICAgICAgICBzdHJpbmdbXSB4ID0gU3RyaW5nVXRpbC5MZWZ0U3BsaXQoIHMsICc6JyApOworICAgICAgICAgICAgaWYgKCB4ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEhvc3QgPSBVbmVzY2FwZSggeFsgMCBdICk7CisgICAgICAgICAgICAgICAgc3RyaW5nIHAgPSBVbmVzY2FwZSh4WzFdKTsKKyAgICAgICAgICAgICAgICBDaGVja05vdEludGVnZXIoInBvcnQiLCBwKTsKKyAgICAgICAgICAgICAgICBQb3J0ID0gaW50LlBhcnNlKHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEhvc3QgPSBVbmVzY2FwZSggcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFBhcnNlUGFyYW1zKCBzdHJpbmcgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHMgaXMgcGFyYW1bO3BhcmFtXSoKKyAgICAgICAgICAgIGlmICggcy5MZW5ndGggPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBFbnN1cmVQYXJhbXMoKTsKKworICAgICAgICAgICAgc3RyaW5nW10geDsKKyAgICAgICAgICAgIHdoaWxlICggKCB4ID0gU3RyaW5nVXRpbC5MZWZ0U3BsaXQoIHMsICc7JyApICkgIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkUGFyYW0oIFVuZXNjYXBlKCB4WyAwIF0gKSApOworICAgICAgICAgICAgICAgIHMgPSB4WyAxIF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBZGRQYXJhbSggVW5lc2NhcGUoIHMgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFBhcnNlVGVybXMoIHN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcyBpcyB0ZXJtWyZ0ZXJtXSoKKworICAgICAgICAgICAgaWYgKCBzLkxlbmd0aCA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHN0cmluZ1tdIHg7CisgICAgICAgICAgICB3aGlsZSAoICggeCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnJicgKSApICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhcnNlVGVybSggeFsgMCBdICk7CisgICAgICAgICAgICAgICAgcyA9IHhbIDEgXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcnNlVGVybSggcyApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFBhcnNlVGVybSggc3RyaW5nIHMgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzIGlzIG5hbWVbPXZhbHVlXQorCisgICAgICAgICAgICBpZiAoIHMuTGVuZ3RoID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgRW5zdXJlVGVybXMoKTsKKworICAgICAgICAgICAgc3RyaW5nW10geCA9IFN0cmluZ1V0aWwuTGVmdFNwbGl0KCBzLCAnPScgKTsKKyAgICAgICAgICAgIGlmICggeCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICBBZGRUZXJtKCBVbmVzY2FwZSggeFsgMCBdICksIFVuZXNjYXBlKCB4WyAxIF0gKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFkZFRlcm0oIFVuZXNjYXBlKCBzICksICIiICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFNDSEVNRQorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyBhbmQgU2V0cyB0aGUgc2NoZW1lLiAKKyAgICAgICAgLy8vIFJldHVybiB0aGUgc2NoZW1lIHdoaWNoIG1heSBiZSBudWxsIGJ1dCBub3QgYmxhbmsuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgU2NoZW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NoZW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3RCbGFuayggInNjaGVtZSIsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgc2NoZW1lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXN0cyB0aGUgc2NoZW1lIGZvciBhIG1hdGNoLiBUaGUgc2NoZW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0ZXN0U2NoZW1lIj5hIHNjaGVtZSB0byB0ZXN0IGFnYWluc3QuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIHNjaGVtZXMgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIElzU2NoZW1lKCBzdHJpbmcgdGVzdFNjaGVtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0U2NoZW1lLkVxdWFscyggc2NoZW1lLCBTdHJpbmdDb21wYXJpc29uLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZSApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVVNFUgorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVXNlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrTm90QmxhbmsoICJ1c2VyIiwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB1c2VyID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBQQVNTV09SRAorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgUGFzc3dvcmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3N3b3JkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9DaGVja05vdEJsYW5rKCAicGFzc3dvcmQiLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBIT1NUCisKKyAgICAgICAgcHVibGljIHN0cmluZyBIb3N0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBob3N0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3RCbGFuayggImhvc3QiLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGhvc3QgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFBPUlQKKworICAgICAgICBwdWJsaWMgaW50PyBQb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3J0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICYmIHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDY1NTM1ICkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiggInBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSAiICk7CisgICAgICAgICAgICAgICAgcG9ydCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSGFzUG9ydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3J0ICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBVUkkKKworICAgICAgICBwdWJsaWMgc3RyaW5nIFVyaQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXJpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXJpID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBQQVJBTVMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlcmUgaXMgYXRsZWFzdCBvbmUgcGFyYW08L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIEhhc1BhcmFtcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoICggcGFybXMhPW51bGwgKSAmJiAoIHBhcm1zLkNvdW50ID4gMCApICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGZXRjaGVzIHRoZSBmaXJzdCBwYXJhbSBmb3VuZCB3aGljaCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LiBUaGUKKyAgICAgICAgLy8vIHNlYXJjaCBvcmRlciBpcyBub3Qgc3BlY2lmaWVkLCBhbmQgdGhlIHBhcmFtcyBhcmUgbm90IG1haW50YWluZWQgaW4gYW55CisgICAgICAgIC8vLyBzcGVjaWZpYyBvcmRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmVmaXgiPnRoZSBwcmVmaXggb2YgdGhlIHBhcmFtIHRvIGZldGNoIChlLmcuLCAidHJhbnNwb3J0PSIpLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgcGFyYW0gd2hpY2ggc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguPC9yZXR1cm5zPgorICAgICAgICAvLy8gCisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UGFyYW0oIHN0cmluZyBwcmVmaXggKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdE51bGwoIHByZWZpeCwgInByZWZpeCA9PSBudWxsIik7CisKKyAgICAgICAgICAgIGlmIChwYXJtcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcCBpbiBwYXJtcykKKyAgICAgICAgICAgICAgICBpZiAocC5TdGFydHNXaXRoKHByZWZpeCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOworCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+YW4gaXRlcmF0b3Igb3ZlciBhbGwgdGhlIHBhcmFtcy4gVGhlIHBhcmFtcyBhcmUgc3RyaW5ncywgZ2VuZXJhbGx5CisgICAgICAgIC8vLyBvZiB0aGUgZm9ybSAidHJhbnNwb3J0PXRjcCIuIEJ1dCB0aGV5IGNhbiBiZSBhbnl0aGluZyB5b3UgbGlrZSwgcmVhbGx5LgorICAgICAgICAvLy8gVGhlIGl0ZXJhdG9yIG1pZ2h0IGJlIGVtcHR5LjwvcmV0dXJucz4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgc3RyaW5nW10gR2V0UGFyYW1zKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwYXJtcyA9PSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHN0cmluZ1tdIHt9OworCisgICAgICAgICAgICByZXR1cm4gcGFybXMuVG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIHBhcmFtIHRvIHRoZSBzZXQgb2YgcGFyYW1zIGZvciB0aGlzIHVybC4gT25seSB0aGUgc2V0IG9mIHVuaXF1ZQorICAgICAgICAvLy8gcGFyYW1zIGlzIG1haW50YWluZWQuIER1cGxpY2F0ZSBwYXJhbSB2YWx1ZXMgYXJlIHN1cHByZXNzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFyYW0iPmEgcGFyYW0gKGUuZy4sICJ0cmFuc3BvcnQ9dGNwIiBvciAiMDE4MzE4NjQ1NzQ4OTg0NzUiKS48L3BhcmFtPgorICAgICAgICAvLy8gCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZFBhcmFtKCBzdHJpbmcgcGFyYW0gKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdE51bGwocGFyYW0sICJwYXJhbSA9PSBudWxsIik7CisgICAgICAgICAgICBFbnN1cmVQYXJhbXMoKTsKKyAgICAgICAgICAgIHBhcm1zLkFkZCggcGFyYW0gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgdGhlIGZpcnN0IHBhcmFtIGZvdW5kIHdoaWNoIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguIFRoZQorICAgICAgICAvLy8gc2VhcmNoIG9yZGVyIGlzIG5vdCBzcGVjaWZpZWQsIGFuZCB0aGUgcGFyYW1zIGFyZSBub3QgbWFpbnRhaW5lZCBpbiBhbnkKKyAgICAgICAgLy8vIHNwZWNpZmljIG9yZGVyLgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJlZml4Ij50aGUgcHJlZml4IG9mIHRoZSBwYXJhbSB0byByZW1vdmUgKGUuZy4sICJ0cmFuc3BvcnQ9IikuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBwYXJhbSByZW1vdmVkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgc3RyaW5nIFJlbW92ZVBhcmFtKCBzdHJpbmcgcHJlZml4ICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3ROdWxsKHByZWZpeCwgInByZWZpeCA9PSBudWxsIik7CisKKyAgICAgICAgICAgIGlmICggcGFybXMgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKCBzdHJpbmcgcCBpbiBHZXRQYXJhbXMoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBwLlN0YXJ0c1dpdGgoIHByZWZpeCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcm1zLlJlbW92ZSggcCApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENsZWFyIGFsbCBwYXJhbXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXJQYXJhbXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBhcm1zICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHBhcm1zLkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBFbnN1cmVQYXJhbXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBhcm1zID09IG51bGwgKQorICAgICAgICAgICAgICAgIHBhcm1zID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gUVVFUlkgVEVSTVMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHF1ZXJ5IHRlcm0uIFF1ZXJ5IHRlcm1zCisgICAgICAgIC8vLyBhcmUgb2YgdGhlIGZvcm0gbmFtZT12YWx1ZTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgSGFzVGVybXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGVybXMgIT0gbnVsbCAmJiB0ZXJtcy5Db3VudCA+IDA7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcXVlcnkgdGVybSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8vIG5hbWU8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIEhhc1Rlcm0oIHN0cmluZyBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOYW1lKG5hbWUpOworCisgICAgICAgICAgICBpZiAoIHRlcm1zID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgcmV0dXJuIHRlcm1zLkNvbnRhaW5zS2V5KCBuYW1lICk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5pZiB0aGVyZSBpcyBhIHF1ZXJ5IHRlcm0gd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgSGFzVGVybSggc3RyaW5nIG5hbWUsIHN0cmluZyB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTmFtZShuYW1lKTsKKworICAgICAgICAgICAgaWYgKCB0ZXJtcyA9PSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBIYXNUZXJtKG5hbWUpOworCisgICAgICAgICAgICBvYmplY3Qgb2JqOworICAgICAgICAgICAgaWYgKCF0ZXJtcy5UcnlHZXRWYWx1ZShuYW1lLCBvdXQgb2JqKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICggb2JqIGlzIExpc3Q8c3RyaW5nPiApCisgICAgICAgICAgICAgICAgcmV0dXJuICggKCBMaXN0PHN0cmluZz4gKSBvYmogKS5Db250YWlucyggdmFsdWUgKTsKKworICAgICAgICAgICAgcmV0dXJuIG9iai5FcXVhbHMoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+aWYgdGhlcmUgaXMgYSBxdWVyeSB0ZXJtIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIEhhc1Rlcm0oIHN0cmluZyBuYW1lLCBpbnQ/IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhhc1Rlcm0oIG5hbWUsIFRvU3RyaW5nKHZhbHVlKSApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmlmIHRoZXJlIGlzIGEgcXVlcnkgdGVybSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBIYXNUZXJtKHN0cmluZyBuYW1lLCBkb3VibGU/IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSGFzVGVybShuYW1lLCBUb1N0cmluZyh2YWx1ZSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmlmIHRoZXJlIGlzIGEgcXVlcnkgdGVybSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBIYXNUZXJtKHN0cmluZyBuYW1lLCBib29sPyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhhc1Rlcm0obmFtZSwgVG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSBxdWVyeSB0ZXJtIHNwZWNpZmllZCBieSBuYW1lIGhhcyBtdWx0aXBsZSB2YWx1ZXMuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBIYXNNdWx0aXBsZVZhbHVlcyhzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOYW1lKG5hbWUpOworCisgICAgICAgICAgICBpZiAoIHRlcm1zID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb2JqZWN0IG9iajsKKyAgICAgICAgICAgIGlmICghdGVybXMuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IG9iaikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpZiAoIG9iaiBpcyBMaXN0PHN0cmluZz4gKQorICAgICAgICAgICAgICAgIHJldHVybiAoICggTGlzdDxzdHJpbmc+ICkgb2JqICkuQ291bnQgPiAxOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHRlcm0sIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRUZXJtKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05hbWUobmFtZSk7CisKKyAgICAgICAgICAgIGlmICh0ZXJtcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBvYmplY3Qgb2JqOworICAgICAgICAgICAgaWYgKCF0ZXJtcy5UcnlHZXRWYWx1ZShuYW1lLCBvdXQgb2JqKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYgKG9iaiBpcyBMaXN0PHN0cmluZz4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSUVudW1lcmF0b3I8c3RyaW5nPiBpID0gKChMaXN0PHN0cmluZz4pb2JqKS5HZXRFbnVtZXJhdG9yKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWkuTW92ZU5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IGkuQ3VycmVudDsKKworICAgICAgICAgICAgICAgIGlmIChpLk1vdmVOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgidGVybSB7MH0gaGFzIG11bHRpcGxlIHZhbHVlcyIsIG5hbWUpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKHN0cmluZylvYmo7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRlZmF1bHRWYWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHRlcm0sIG9yIGRlZmF1bHRWYWx1ZSBpZiBub3QgZm91bmQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RyaW5nIEdldFRlcm0oIHN0cmluZyBuYW1lLCBzdHJpbmcgZGVmYXVsdFZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gR2V0VGVybSggbmFtZSApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBpbnRlZ2VyIHZhbHVlLCBvciBudWxsIGlmIG5vdCBmb3VuZC48L3JldHVybnM+CisgICAgICAgIC8vLyAKKyAgICAgICAgcHVibGljIGludD8gR2V0SW50ZWdlclRlcm0oc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzID0gR2V0VGVybShuYW1lKTsKKyAgICAgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gaW50LlBhcnNlKHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWZhdWx0VmFsdWUiPnRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHRlcm0gaXMgbm90IGZvdW5kLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgaW50ZWdlciB2YWx1ZSwgb3IgZGVmYXVsdFZhbHVlIGlmIG5vdCBmb3VuZC48L3JldHVybnM+CisgICAgICAgIC8vLyA8c2VlIGNyZWY9IkdldFRlcm0oIHN0cmluZyApIi8+CisgICAgICAgIC8vLyAKKyAgICAgICAgcHVibGljIGludCBHZXRJbnRlZ2VyVGVybShzdHJpbmcgbmFtZSwgaW50IGRlZmF1bHRWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50PyB2ID0gR2V0SW50ZWdlclRlcm0obmFtZSk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdi5WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIGRvdWJsZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBkb3VibGUgdmFsdWUsIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgZG91YmxlPyBHZXREb3VibGVUZXJtKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcyA9IEdldFRlcm0obmFtZSk7CisgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIGRvdWJsZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWZhdWx0VmFsdWUiPnRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHRlcm0gaXMgbm90IGZvdW5kLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgZG91YmxlIHZhbHVlLCBvciBkZWZhdWx0VmFsdWUgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iR2V0VGVybSggc3RyaW5nICkiLz4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgZG91YmxlIEdldERvdWJsZVRlcm0oc3RyaW5nIG5hbWUsIGRvdWJsZSBkZWZhdWx0VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZT8gdiA9IEdldERvdWJsZVRlcm0obmFtZSk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdi5WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBxdWVyeSB0ZXJtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgYm9vbGVhbiB2YWx1ZSwgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9yZXR1cm5zPgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJHZXRUZXJtKHN0cmluZykiLz4KKyAgICAgICAgcHVibGljIGJvb2w/IEdldEJvb2xlYW5UZXJtKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcyA9IEdldFRlcm0obmFtZSk7CisgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIHMuRXF1YWxzKCJ0cnVlIiwgU3RyaW5nQ29tcGFyaXNvbi5DdXJyZW50Q3VsdHVyZUlnbm9yZUNhc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgYm9vbCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWZhdWx0VmFsdWUiPnRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHRlcm0gaXMgbm90IGZvdW5kLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgYm9vbCB2YWx1ZSwgb3IgZGVmYXVsdFZhbHVlIGlmIG5vdCBmb3VuZC48L3JldHVybnM+CisgICAgICAgIC8vLyA8c2VlIGNyZWY9IkdldFRlcm0oIHN0cmluZyApIi8+CisgICAgICAgIC8vLyAKKyAgICAgICAgcHVibGljIGJvb2wgR2V0Qm9vbGVhblRlcm0oc3RyaW5nIG5hbWUsIGJvb2wgZGVmYXVsdFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBib29sPyB2ID0gR2V0Qm9vbGVhblRlcm0obmFtZSk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdi5WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmFuIGl0ZXJhdG9yIG92ZXIgdGhlIHN0cmluZyB2YWx1ZXMgb2YgdGhlIHF1ZXJ5IHRlcm0uIE1heSBiZSBlbXB0eS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdHJpbmdbXSBHZXRUZXJtcyggc3RyaW5nIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05hbWUobmFtZSk7CisKKyAgICAgICAgICAgIGlmICggdGVybXMgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmdbXSB7fTsKKworICAgICAgICAgICAgb2JqZWN0IG9iajsKKyAgICAgICAgICAgIGlmICghdGVybXMuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IG9iaikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmdbXSB7IH07CisKKyAgICAgICAgICAgIGlmICggb2JqIGlzIExpc3Q8c3RyaW5nPiApCisgICAgICAgICAgICAgICAgcmV0dXJuICggKCBMaXN0PHN0cmluZz4gKSBvYmogKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nW10geyAoc3RyaW5nKW9iaiB9OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgbmFtZXMgb2YgdGhlIHF1ZXJ5IHRlcm1zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+YW4gaXRlcmF0b3Igb3ZlciB0aGUgc3RyaW5nIG5hbWVzLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0cmluZ1tdIEdldFRlcm1OYW1lcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdGVybXMgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmdbXSB7IH07CisKKyAgICAgICAgICAgIHJldHVybiBUb0FycmF5KHRlcm1zLktleXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0gdG8gdGhlIHNldCBvZiBxdWVyeSB0ZXJtcy4gRHVwbGljYXRlCisgICAgICAgIC8vLyBuYW1lL3ZhbHVlIHBhaXJzIGFyZSBzdXBwcmVzc2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZFRlcm0oc3RyaW5nIG5hbWUsIHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOYW1lKG5hbWUpOworCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIEVuc3VyZVRlcm1zKCk7CisKKyAgICAgICAgICAgIG9iamVjdCBvYmo7CisKKyAgICAgICAgICAgIGlmICghdGVybXMuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IG9iaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVybXMuQWRkKCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBvYmogaXMgTGlzdDxzdHJpbmc+ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMaXN0PHN0cmluZz4gdmFsdWVzID0gKExpc3Q8c3RyaW5nPilvYmo7CisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMuQ29udGFpbnModmFsdWUpKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG9iaiBpcyBub3QgYSBsaXN0IGJ1dCB3ZSBuZWVkIG9uZSwgc28gcmVwbGFjZSBvYmogaW4gdGVybXMgd2l0aCBhCisgICAgICAgICAgICAvLyBsaXN0LCB0aGVuIGFkZCB2YWx1ZSB0byB0aGUgbGlzdC4KKworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IG52YWx1ZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICB0ZXJtc1tuYW1lXSA9IG52YWx1ZXM7CisgICAgICAgICAgICBudmFsdWVzLkFkZCggKCBzdHJpbmcgKSBvYmogKTsKKworICAgICAgICAgICAgbnZhbHVlcy5BZGQoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIHRoZSBzcGVjaWZpZWQgcXVlcnkgdGVybSB0byB0aGUgc2V0IG9mIHF1ZXJ5IHRlcm1zLiBEdXBsaWNhdGUKKyAgICAgICAgLy8vIG5hbWUvdmFsdWUgcGFpcnMgYXJlIHN1cHByZXNzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkVGVybSggc3RyaW5nIG5hbWUsIGludD8gdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBBZGRUZXJtKG5hbWUsIFRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIHRoZSBzcGVjaWZpZWQgcXVlcnkgdGVybSB0byB0aGUgc2V0IG9mIHF1ZXJ5IHRlcm1zLiBEdXBsaWNhdGUKKyAgICAgICAgLy8vIG5hbWUvdmFsdWUgcGFpcnMgYXJlIHN1cHByZXNzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkVGVybShzdHJpbmcgbmFtZSwgZG91YmxlPyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQWRkVGVybShuYW1lLCBUb1N0cmluZyh2YWx1ZSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0gdG8gdGhlIHNldCBvZiBxdWVyeSB0ZXJtcy4gRHVwbGljYXRlCisgICAgICAgIC8vLyBuYW1lL3ZhbHVlIHBhaXJzIGFyZSBzdXBwcmVzc2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZFRlcm0oc3RyaW5nIG5hbWUsIGJvb2w/IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBBZGRUZXJtKG5hbWUsIFRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmVzIGFsbCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgc29tZXRoaW5nIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmVUZXJtKCBzdHJpbmcgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTmFtZShuYW1lKTsKKworICAgICAgICAgICAgaWYgKHRlcm1zID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gdGVybXMuUmVtb3ZlKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG5hbWUvdmFsdWUgcGFpciBmcm9tIHRoZSBzZXQgb2YgcXVlcnkgdGVybXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIG5hbWUvdmFsdWUgcGFpciB3YXMgZm91bmQgYW5kIHJlbW92ZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8gCisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZVRlcm0oIHN0cmluZyBuYW1lLCBzdHJpbmcgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05hbWUobmFtZSk7CisKKyAgICAgICAgICAgIGlmICggdGVybXMgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3ZlVGVybShuYW1lKTsKKworICAgICAgICAgICAgb2JqZWN0IG9iajsKKyAgICAgICAgICAgIGlmICghdGVybXMuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IG9iaikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpZiAoIG9iaiBpcyBMaXN0PHN0cmluZz4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpc3Q8c3RyaW5nPiB4ID0gKCBMaXN0PHN0cmluZz4gKSBvYmo7CisgICAgICAgICAgICAgICAgYm9vbCBvayA9IHguUmVtb3ZlKCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGlmICh4LkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHRlcm1zLlJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvYmouRXF1YWxzKHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXJtcy5SZW1vdmUobmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCb29sZWFuIFJlbW92ZVRlcm0oc3RyaW5nIG5hbWUsIGludD8gdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZW1vdmVUZXJtKG5hbWUsIFRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQm9vbGVhbiBSZW1vdmVUZXJtKHN0cmluZyBuYW1lLCBkb3VibGU/IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVtb3ZlVGVybShuYW1lLCBUb1N0cmluZyh2YWx1ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJvb2xlYW4gUmVtb3ZlVGVybShzdHJpbmcgbmFtZSwgYm9vbD8gdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZW1vdmVUZXJtKG5hbWUsIFRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmVzIGFsbCBxdWVyeSB0ZXJtcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhclRlcm1zKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0ZXJtcyAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB0ZXJtcy5DbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVRlcm1zKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0ZXJtcyA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0ZXJtcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOworICAgICAgICB9CisKKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBGUkFHTUVOVAorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRnJhZ21lbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3RCbGFuayggImZyYWdtZW50IiwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVVRJTAorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgRXNjYXBlKCBzYiwgc2NoZW1lICk7CisgICAgICAgICAgICBzYi5BcHBlbmQoICc6JyApOworCisgICAgICAgICAgICBpZiAoIGhvc3QgIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCAiLy8iICk7CisgICAgICAgICAgICAgICAgaWYgKCB1c2VyICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXNjYXBlKCBzYiwgdXNlciApOworICAgICAgICAgICAgICAgICAgICBpZiAoIHBhc3N3b3JkICE9IG51bGwgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoICc6JyApOworICAgICAgICAgICAgICAgICAgICAgICAgRXNjYXBlKCBzYiwgcGFzc3dvcmQgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoICdAJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFc2NhcGUoIHNiLCBob3N0ICk7CisgICAgICAgICAgICAgICAgaWYgKCBwb3J0ICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCAnOicgKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCBwb3J0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCggJy8nICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggdXJpICE9IG51bGwgKQorICAgICAgICAgICAgICAgIEVzY2FwZSggc2IsIHVyaSApOworCisgICAgICAgICAgICBpZiAoIEhhc1BhcmFtcygpICkKKyAgICAgICAgICAgICAgICBQYXJhbXNUb1N0cmluZyggc2IgKTsKKworICAgICAgICAgICAgaWYgKCBIYXNUZXJtcygpICkKKyAgICAgICAgICAgICAgICBUZXJtc1RvU3RyaW5nKCBzYiApOworCisgICAgICAgICAgICBpZiAoIGZyYWdtZW50ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCggJyMnICk7CisgICAgICAgICAgICAgICAgRXNjYXBlKCBzYiwgZnJhZ21lbnQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvZGUgPSAyMzU0Nzg1MzsKKwkJICAgIGNvZGUgXj0gaGMoIHNjaGVtZSApOworCQkgICAgY29kZSBePSBoYyggdXNlciApOworCQkgICAgY29kZSBePSBoYyggcGFzc3dvcmQgKTsKKwkJICAgIGNvZGUgXj0gaGMoIGhvc3QgKTsKKwkJICAgIGNvZGUgXj0gaGMoIHBvcnQgKTsKKwkJICAgIGNvZGUgXj0gaGMoIHVyaSApOworCQkgICAgY29kZSBePSBoYyggcGFybXMgKTsKKwkJICAgIGNvZGUgXj0gaGMoIHRlcm1zICk7CisJCSAgICBjb2RlIF49IGhjKCBmcmFnbWVudCApOworCQkgICAgcmV0dXJuIGNvZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBoYyggRGljdGlvbmFyeTxzdHJpbmcsb2JqZWN0PiBtICkKKwkgICAgeworCQkgICAgcmV0dXJuIG0gIT0gbnVsbCA/IG0uR2V0SGFzaENvZGUoKSA6IDc5MzsKKwkgICAgfQorCisJICAgIHByaXZhdGUgaW50IGhjKCBMaXN0PHN0cmluZz4gcyApCisJICAgIHsKKwkJICAgIHJldHVybiBzICE9IG51bGwgPyBzLkdldEhhc2hDb2RlKCkgOiAxNjE7CisJICAgIH0KKworCSAgICBwcml2YXRlIGludCBoYyggaW50PyBpICkKKwkgICAgeworCQkgICAgcmV0dXJuIGkgIT0gbnVsbCA/IGkuR2V0SGFzaENvZGUoKSA6IDU5OworCSAgICB9CisKKwkgICAgcHJpdmF0ZSBpbnQgaGMoIHN0cmluZyBzICkKKwkgICAgeworCQkgICAgcmV0dXJuIHMgIT0gbnVsbCA/IHMuR2V0SGFzaENvZGUoKSA6IDkxOworCSAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMoIG9iamVjdCBvYmogKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIG9iaiA9PSB0aGlzICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKG9iai5HZXRUeXBlKCkgIT0gdHlwZW9mKFVSTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBVUkwgb3RoZXIgPSAoIFVSTCApIG9iajsKKworICAgICAgICAgICAgaWYgKCAhU3RyaW5nVXRpbC5FcUlnbm9yZUNhc2Uoc2NoZW1lLCBvdGhlci5zY2hlbWUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbC5FcSh1c2VyLCBvdGhlci51c2VyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbC5FcShwYXNzd29yZCwgb3RoZXIucGFzc3dvcmQpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKCFTdHJpbmdVdGlsLkVxKGhvc3QsIG90aGVyLmhvc3QpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKCFFcShwb3J0LCBvdGhlci5wb3J0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbC5FcSh1cmksIG90aGVyLnVyaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpZiAoICFFcSggcGFybXMsIG90aGVyLnBhcm1zICkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKCAhRXEoIHRlcm1zLCBvdGhlci50ZXJtcyApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbC5FcShmcmFnbWVudCwgb3RoZXIuZnJhZ21lbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIEVxKG9iamVjdCBhLCBvYmplY3QgYikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhhLCBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gYS5FcXVhbHMoYik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgUGFyYW1zVG9TdHJpbmcoIFN0cmluZ0J1aWxkZXIgc2IgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcGFyYW0gaW4gR2V0UGFyYW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCAnOycgKTsKKyAgICAgICAgICAgICAgICBFc2NhcGUoIHNiLCBwYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRlcm1zVG9TdHJpbmcoIFN0cmluZ0J1aWxkZXIgc2IgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIHNlcCA9ICc/JzsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBuYW1lIGluIEdldFRlcm1OYW1lcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyB2YWx1ZSBpbiBHZXRUZXJtcyhuYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChzZXApOworICAgICAgICAgICAgICAgICAgICBFc2NhcGUoc2IsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoJz0nKTsKKyAgICAgICAgICAgICAgICAgICAgRXNjYXBlKHNiLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcCA9ICcmJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEdW1wcyBVUkwgY29udGVudHMgZm9yIGVhc3kgdmlld2luZworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBEdW1wKCkKKwkgICAgeworCQkgICAgQ29uc29sZS5Xcml0ZUxpbmUoICItLS0tLS0tLS0tLS0tLS0iICk7CisJCSAgICBDb25zb2xlLldyaXRlTGluZSggInNjaGVtZSA9ICIrc2NoZW1lICk7CisJCSAgICBDb25zb2xlLldyaXRlTGluZSggInVzZXIgPSAiK3VzZXIgKTsKKwkJICAgIENvbnNvbGUuV3JpdGVMaW5lKCAicGFzc3dvcmQgPSAiK3Bhc3N3b3JkICk7CisJCSAgICBDb25zb2xlLldyaXRlTGluZSggImhvc3QgPSAiK2hvc3QgKTsKKwkJICAgIENvbnNvbGUuV3JpdGVMaW5lKCAicG9ydCA9ICIrcG9ydCApOworCQkgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJ1cmkgPSAiK3VyaSApOworCQkgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJwYXJhbXMgPSAiK3Bhcm1zICk7CisJCSAgICBDb25zb2xlLldyaXRlTGluZSggInRlcm1zID0gIit0ZXJtcyApOworCQkgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJmcmFnbWVudCA9ICIrZnJhZ21lbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRXNjYXBlKCBTdHJpbmdCdWlsZGVyIHNiLCBzdHJpbmcgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDaGFySXRlcmF0b3IgaSA9IG5ldyBDaGFySXRlcmF0b3IoIHMgKTsKKyAgICAgICAgICAgIHdoaWxlICggaS5Nb3ZlTmV4dCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBpLkN1cnJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKCBJc0VzY2FwZWQoIGMgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoICclJyApOworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIFN0cmluZ1V0aWwuVG9IZXgoICggYyA+PiA0ICkmIDE1ICkgKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCBTdHJpbmdVdGlsLlRvSGV4KCBjICYgMTUgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggYyA9PSAnICcgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCAnKycgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCBjICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0VzY2FwZWQoIGNoYXIgYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYyA+PSAnMCcgJiYgYyA8PSAnOScgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA+PSAnQScgJiYgYyA8PSAnWicgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA+PSAnYScgJiYgYyA8PSAneicgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnICcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnLCcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnLicgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnLycgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnIScgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnJCcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnXicgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnKicgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnKCcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnKScgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnXycgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnLScgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAneycgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnfScgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnWycgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnXScgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnfCcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICggYyA9PSAnXFwnICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBVbmVzY2FwZSggc3RyaW5nIHMgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIENoYXJJdGVyYXRvciBpID0gbmV3IENoYXJJdGVyYXRvciggcyApOworICAgICAgICAgICAgd2hpbGUgKCBpLk1vdmVOZXh0KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGkuQ3VycmVudDsKKyAgICAgICAgICAgICAgICBpZiAoIGMgPT0gJyUnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaS5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgICAgICBjaGFyIGMxID0gaS5DdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpLk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYzIgPSBpLkN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCggKCBjaGFyICkgKCAoIFN0cmluZ1V0aWwuRnJvbUhleCggYzEgKSA8PCA0ICkgfCBTdHJpbmdVdGlsLkZyb21IZXgoIGMyICkgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggYyA9PSAnKycgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCAnICcgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCBjICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENoZWNrTmFtZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVG9TdHJpbmcob2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLlRvU3RyaW5nKCkgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nW10gVG9BcnJheShEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0Pi5LZXlDb2xsZWN0aW9uIGtleUNvbGxlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ1tdIGEgPSBuZXcgc3RyaW5nW2tleUNvbGxlY3Rpb24uQ291bnRdOworICAgICAgICAgICAga2V5Q29sbGVjdGlvbi5Db3B5VG8oYSwgMCk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdE51bGwoc3RyaW5nIHZhbHVlLCBzdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDaGVja05vdEJsYW5rKCBzdHJpbmcgbmFtZSwgc3RyaW5nIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLkxlbmd0aCA9PSAwICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIG5hbWUgKyAiIGlzIGJsYW5rIiApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDaGVja05vdEludGVnZXIoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3RCbGFuayhuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQuUGFyc2UodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24obmFtZSArICIgaXMgbm90IGludGVnZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8c3RyaW5nPiBDb3B5TGlzdCggTGlzdDxzdHJpbmc+IHBhcm1zICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8ganVzdCBnb2VzIG9uZSBsZXZlbCBkZWVwLgorCisgICAgICAgICAgICBpZiAocGFybXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0PHN0cmluZz4ocGFybXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gQ29weVRlcm1zKCBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiB0ZXJtcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdGVybXMgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IG50ZXJtcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOworICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPHN0cmluZywgb2JqZWN0PiBtZSBpbiB0ZXJtcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IG1lLktleTsKKyAgICAgICAgICAgICAgICBvYmplY3QgdmFsdWUgPSBtZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgTGlzdDxzdHJpbmc+KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IENvcHlMaXN0KChMaXN0PHN0cmluZz4pIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBudGVybXMuQWRkKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudGVybXM7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1VSTFNlcmlhbGl6ZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9PcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwL1V0aWwvVVJMU2VyaWFsaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2QxZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1VSTFNlcmlhbGl6ZXIuY3MKQEAgLTAsMCArMSw2MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgVVJMU2VyaWFsaXplciA6IEltcG9ydEV4cG9ydEhlbHBlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBTdHJpbmcgRklFTERfTkFNRSA9ICJ1cmxTdHIiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbml0KCBYVHlwZSB0eXBlLCBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHR5cGUuR2V0RmllbGQoIEZJRUxEX05BTUUgKTsKKyAgICAgICAgICAgIGNsYXNzMnR5cGUuQWRkKCB0eXBlb2YoIFVSTCApLCB0eXBlICk7CisgICAgICAgICAgICB0eXBlLlNldENvbXBvbmVudFR5cGUoIHR5cGVvZiggVVJMICkgKTsKKyAgICAgICAgICAgIHR5cGUuU2V0SW1wb3J0RXhwb3J0SGVscGVyKCBuZXcgVVJMU2VyaWFsaXplciggdHlwZSwgZmllbGQgKSApOworICAgICAgICAgICAgdHlwZS5QdXRWYWxpZGF0b3IoIGZpZWxkLCBWYWxpZGF0b3Jfc3RyaW5nLkdldCggMCApICk7CisgICAgICAgICAgICB0eXBlLkxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVUkxTZXJpYWxpemVyKCBYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFhUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmllbGQgZmllbGQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIE9iamVjdCBJbXBvcnRWYWx1ZSggU3RydWN0VmFsdWUgc3YgKQorCSAgICB7CisJCSAgICByZXR1cm4gbmV3IFVSTCggKFN0cmluZykgc3YuR2V0KCBmaWVsZCApICk7CisJICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RydWN0VmFsdWUgRXhwb3J0VmFsdWUoVmFsdWVGYWN0b3J5IHZmLCBPYmplY3QgdmFsdWUpCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKHR5cGUsIHZmKTsKKwkJICAgIHN2LkFkZCggZmllbGQsICgoVVJMKSB2YWx1ZSkuVG9TdHJpbmcoKSApOworCQkgICAgcmV0dXJuIHN2OworCSAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC9VdGlsL1doby5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9XaG8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxYjU1NQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL09yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAvVXRpbC9XaG8uY3MKQEAgLTAsMCArMSwyNyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreyAgIAorICAgIC8vLyA8c3VtbWFyeT5BYnN0cmFjdGlvbiBvZiBzZW5kZXIgdXNlZCBieSB0aGUgdmFyaW91cyBzb3VyY2VzIG9mIGRhdGEsIHBhY2tldHMsIG9yIG1lc3NhZ2VzLjwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFdobworICAgIHsKKyAgICAgICAgLy9ub3RoaW5nIGRlZmluZWQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDAyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJFdGNoIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkFwYWNoZSBFdGNoIEMjIEJpbmRpbmcgUnVudGltZSBETEwiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkFwYWNoZSBFdGNoIChpbmN1YmF0aW5nKSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gMjAwOSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZGZiNmM5MDMtNzUxZi00NDczLTg0MDAtZDUwYzFmMDk2OGY4IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIFJldmlzaW9uIGFuZCBCdWlsZCBOdW1iZXJzIAorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjEuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjEuMCIpXQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MudG1wbCBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzLnRtcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmZWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzLnRtcGwKQEAgLTAsMCArMSw1MCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorLy8gdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRXRjaCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJBcGFjaGUgRXRjaCBDIyBCaW5kaW5nIFJ1bnRpbWUgRExMIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJBcGFjaGUgRXRjaCAoaW5jdWJhdGluZykiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCCpIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIDIwMDkiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUgCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoImRmYjZjOTAzLTc1MWYtNDQ3My04NDAwLWQ1MGMxZjA5NjhmOCIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBSZXZpc2lvbiBhbmQgQnVpbGQgTnVtYmVycyAKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiQEV0Y2hWZXJzaW9uQCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCJARXRjaFZlcnNpb25AIildCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9ldGNoLnNuayBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL2V0Y2guc25rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTI4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy9tYWluL2NzaGFycC9ldGNoLnNuawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0Q29tYm9WYWxpZGF0b3IuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0Q29tYm9WYWxpZGF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxNDllNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RDb21ib1ZhbGlkYXRvci5jcwpAQCAtMCwwICsxLDE1NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RDb21ib1ZhbGlkYXRvcgorICAgIHsKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0Q29tYm9WYWxpZGF0b3IiICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3QoMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCB0cnVlLCAxMjM0NTY3ODkwMTJMKTsKKyAgICAgICAgICAgIFRlc3QoMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCBmYWxzZSwgLTEyMzQ1Njc4OTAxMkwpOworCQkvLyAgICBUZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsIEV0Y2guVHJhbnNwb3J0LkZtdC5UeXBlQ29kZS5JTlQxLCAwLCAobG9uZykgMyApOworCQkgICAgVGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCAgMSwgKGZsb2F0KSA0ICk7CisJCSAgICBUZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsICAtMSwgKGRvdWJsZSkgNSApOworCQkgICAgVGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCAgMTI3LCAiYWJjIiApOworCQkgICAgVGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCAgLTEyOCwgbmV3IE9iamVjdCgpICk7CisJCSAgICBUZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsICAzMjc2NywgbmV3IGludFtdIHt9ICk7CisJCSAgICBUZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsICAtMzI3NjgsIG5ldyBCb29sZWFuW10ge30gKTsKKwkJICAgIFRlc3QoIDAsICIoaW50WzBdIE9SIGJvb2xlYW5bMF0pIiwgIDEwMDAwMDAwMDAsIG5ldyBEYXRlVGltZSgpICk7CisgICAgICAgICAgICBUZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsICAtMTAwMDAwMDAwMCwgdHlwZW9mKCBpbnQgKSApOworCQkgICAgVGVzdCggMSwgIihpbnRbMV0gT1IgYm9vbGVhblsxXSkiLCAgbmV3IGludFtdIHt9LCAwICk7CisJCSAgICBUZXN0KCAxLCAiKGludFsxXSBPUiBib29sZWFuWzFdKSIsIG5ldyBCb29sZWFuW10ge30sIHRydWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBUZXN0KCBpbnQgbiwgU3RyaW5nIHMsIE9iamVjdCBnb29kLCBPYmplY3QgYmFkICkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdG9yX2ludCB2MSA9IFZhbGlkYXRvcl9pbnQuR2V0KCBuICk7CisgICAgICAgICAgICBWYWxpZGF0b3JfYm9vbGVhbiB2MiA9IFZhbGlkYXRvcl9ib29sZWFuLkdldCggbiApOworICAgICAgICAgICAgQ29tYm9WYWxpZGF0b3IgdiA9IG5ldyBDb21ib1ZhbGlkYXRvciggdjEsIHYyICk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggcywgdi5Ub1N0cmluZygpICk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCBnb29kICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCB2LlZhbGlkYXRlKCBiYWQgKSApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIG4gPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2LkVsZW1lbnRWYWxpZGF0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBUZXN0MigpICAKKwkgICAgeworCQkgICAgVmFsaWRhdG9yIHYxID0gVmFsaWRhdG9yX2ludC5HZXQoIDEgKTsKKwkJICAgIFZhbGlkYXRvciB2MiA9IFZhbGlkYXRvcl9ib29sZWFuLkdldCggMCApOworCQkgICAgVmFsaWRhdG9yIHYgPSBuZXcgQ29tYm9WYWxpZGF0b3IoIHYxLCB2MiApOworCisJCSAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCBuZXcgaW50W10ge30gKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdHJ1ZSApICk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCBmYWxzZSApICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggMCApICk7CisgICAgCQkKKwkJICAgIHYgPSB2LkVsZW1lbnRWYWxpZGF0b3IoKTsKKworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIG5ldyBpbnRbXSB7fSApICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggdHJ1ZSApICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggZmFsc2UgKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggMCApICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBUZXN0MygpICAKKwkgICAgeworCQkgICAgVmFsaWRhdG9yIHYxID0gVmFsaWRhdG9yX2Jvb2xlYW4uR2V0KCAwICk7CisJCSAgICBWYWxpZGF0b3IgdjIgPSBWYWxpZGF0b3JfaW50LkdldCggMSApOworCQkgICAgVmFsaWRhdG9yIHYgPSBuZXcgQ29tYm9WYWxpZGF0b3IoIHYxLCB2MiApOworCisJCSAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCBuZXcgaW50W10ge30gKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdHJ1ZSApICk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCBmYWxzZSApICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggMCApICk7CisgICAgCQkKKwkJICAgIHYgPSB2LkVsZW1lbnRWYWxpZGF0b3IoKTsKKworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIG5ldyBpbnRbXSB7fSApICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggdHJ1ZSApICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggZmFsc2UgKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggMCApICk7CisJICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgVGVzdDQoKSAgCisJICAgIHsKKwkJICAgIFZhbGlkYXRvciB2MSA9IFZhbGlkYXRvcl9ib29sZWFuLkdldCggMCApOworCQkgICAgVmFsaWRhdG9yIHYyID0gVmFsaWRhdG9yX2ludC5HZXQoIDEgKTsKKwkJICAgIFZhbGlkYXRvciB2ID0gbmV3IENvbWJvVmFsaWRhdG9yKCB2MSwgdjIgKTsKKworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggbmV3IGludFtdIHt9ICkgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHYuVmFsaWRhdGUoIHRydWUgKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggZmFsc2UgKSApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIDAgKSApOworICAgIAkJCisJCSAgICB2ID0gdi5FbGVtZW50VmFsaWRhdG9yKCk7CisKKwkJICAgIEFzc2VydC5Jc0ZhbHNlKCB2LlZhbGlkYXRlKCBuZXcgaW50W10ge30gKSApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIHRydWUgKSApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIGZhbHNlICkgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHYuVmFsaWRhdGUoIDAgKSApOworICAgIAkJCisJCSAgICB2ID0gdi5FbGVtZW50VmFsaWRhdG9yKCk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisJICAgIHB1YmxpYyB2b2lkIFRlc3Q1KCkgIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3IgdjEgPSBWYWxpZGF0b3JfYm9vbGVhbi5HZXQoIDEgKTsKKwkJICAgIFZhbGlkYXRvciB2MiA9IFZhbGlkYXRvcl9pbnQuR2V0KCAxICk7CisJCSAgICBWYWxpZGF0b3IgdiA9IG5ldyBDb21ib1ZhbGlkYXRvciggdjEsIHYyICk7CisKKwkJICAgIEFzc2VydC5Jc1RydWUoIHYuVmFsaWRhdGUoIG5ldyBCb29sZWFuW10ge30gKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggbmV3IGludFtdIHt9ICkgKTsKKyAgICAJCQorCQkgICAgdiA9IHYuRWxlbWVudFZhbGlkYXRvcigpOworCisJCSAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCB0cnVlICkgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHYuVmFsaWRhdGUoIGZhbHNlICkgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHYuVmFsaWRhdGUoIDAgKSApOworICAgIAkJCisJCSAgICB2ID0gdi5FbGVtZW50VmFsaWRhdG9yKCk7CisJICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0RmllbGQuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0RmllbGQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmNmNkOAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RGaWVsZC5jcwpAQCAtMCwwICsxLDY2IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworCisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0RmllbGQKKyAgICB7CisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdEZpZWxkIiApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkSW50ZWdlclN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RNZigxLCAib25lIik7CisgICAgICAgICAgICBUZXN0TWYoMiwgInR3byIpOworICAgICAgICAgICAgVGVzdE1mKDMsICJ0aHJlZSIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdE1mKCJvbmUiKTsKKyAgICAgICAgICAgIFRlc3RNZigidHdvIik7CisgICAgICAgICAgICBUZXN0TWYoInRocmVlIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdE1mKGludCBpZCwgc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkIG1mID0gbmV3IEZpZWxkKGlkLCBuYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpZCwgbWYuSWQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5hbWUsIG1mLk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRlc3RNZihzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgRmllbGQgbWYgPSBuZXcgRmllbGQobmFtZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSWROYW1lLkhhc2gobmFtZSksIG1mLklkKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuYW1lLCBtZi5OYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0RmllbGRNYXAuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0RmllbGRNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjMDIyMAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RGaWVsZE1hcC5jcwpAQCAtMCwwICsxLDM0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdEZpZWxkTWFwCisgICAgeworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgTm90aGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IHVuaXQgdGVzdHMgZm9yIEZpZWxkTWFwCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0SWROYW1lLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9Nc2cvVGVzdElkTmFtZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjVkMzNkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9Nc2cvVGVzdElkTmFtZS5jcwpAQCAtMCwwICsxLDEwNyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdElkTmFtZQorICAgIHsKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0SWROYW1lIiApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIElkKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG5ldyBJZE5hbWUoMSwgImZvbyIpLklkKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBuZXcgSWROYW1lKDEsICJiYXIiKS5JZCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbmV3IElkTmFtZSgyLCAiZm9vIikuSWQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG5ldyBJZE5hbWUoMiwgImJhciIpLklkKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJmb28iLCBuZXcgSWROYW1lKDEsICJmb28iKS5OYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYmFyIiwgbmV3IElkTmFtZSgxLCAiYmFyIikuTmFtZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImZvbyIsIG5ldyBJZE5hbWUoMiwgImZvbyIpLk5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJiYXIiLCBuZXcgSWROYW1lKDIsICJiYXIiKS5OYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBYVG9TdHJpbmcoKSAKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiZm9vKDEpIiwgbmV3IElkTmFtZSggMSwgImZvbyIgKS5Ub1N0cmluZygpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJiYXIoMSkiLCBuZXcgSWROYW1lKCAxLCAiYmFyIiApLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggImZvbygyKSIsIG5ldyBJZE5hbWUoIDIsICJmb28iICkuVG9TdHJpbmcoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiYmFyKDIpIiwgbmV3IElkTmFtZSggMiwgImJhciIgKS5Ub1N0cmluZygpICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgRXF1YWxzT2JqZWN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5FcXVhbHMoIG5ldyBJZE5hbWUoIDEsICJmb28iICkgKSApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggbmV3IElkTmFtZSggMSwgImJhciIgKS5FcXVhbHMoIG5ldyBJZE5hbWUoIDEsICJiYXIiICkgKSApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggbmV3IElkTmFtZSggMiwgImZvbyIgKS5FcXVhbHMoIG5ldyBJZE5hbWUoIDIsICJmb28iICkgKSApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggbmV3IElkTmFtZSggMiwgImJhciIgKS5FcXVhbHMoIG5ldyBJZE5hbWUoIDIsICJiYXIiICkgKSApOworCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5FcXVhbHMoIG5ldyBJZE5hbWUoIDIsICJmb28iICkgKSApOyAvLyBpZCBjaGFuZ2VkCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5FcXVhbHMoIG5ldyBJZE5hbWUoIDEsICJiYXIiICkgKSApOyAvLyBuYW1lIGNoYW5nZWQKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBuZXcgSWROYW1lKCAxLCAiZm9vIiApLkVxdWFscyggbmV3IElkTmFtZSggMiwgImJhciIgKSApICk7IC8vIGlkIGFuZCBuYW1lIGNoYW5nZWQKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIG5ldyBJZE5hbWUoIDEsICJmb28iICkuRXF1YWxzKCBudWxsICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBuZXcgSWROYW1lKCAxLCAiZm9vIiApLkVxdWFscyggMSApICk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5FcXVhbHMoIHRydWUgKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEhhc2hDb2RlT2JqZWN0KCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHlvdSBjYW5ub3QgcmVhbGx5IHByZWRpY3Qgd2hlbiBIYXNoQ29kZSB3aWxsIG5vdCBiZSB0aGUgc2FtZS4gdGhlCisgICAgICAgICAgICAvLyBydWxlIGlzIHRoYXQgaXQgbXVzdCBiZSB0aGUgc2FtZSB3aGVuIHRoZSBvYmplY3RzIHdvdWxkIGNvbXBhcmUgZXF1YWwuCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG5ldyBJZE5hbWUoIDEsICJmb28iICkuR2V0SGFzaENvZGUoKSwgbmV3IElkTmFtZSggMSwgImZvbyIgKS5HZXRIYXNoQ29kZSgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG5ldyBJZE5hbWUoIDIsICJmb28iICkuR2V0SGFzaENvZGUoKSwgbmV3IElkTmFtZSggMiwgImZvbyIgKS5HZXRIYXNoQ29kZSgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG5ldyBJZE5hbWUoIDEsICJiYXIiICkuR2V0SGFzaENvZGUoKSwgbmV3IElkTmFtZSggMSwgImJhciIgKS5HZXRIYXNoQ29kZSgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG5ldyBJZE5hbWUoIDIsICJiYXIiICkuR2V0SGFzaENvZGUoKSwgbmV3IElkTmFtZSggMiwgImJhciIgKS5HZXRIYXNoQ29kZSgpICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgSGFzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MzgxLCBJZE5hbWUuSGFzaCgiIikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDM1Mjk4ODMxNiwgSWROYW1lLkhhc2goImEiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTUxMTg0ODY0NiwgSWROYW1lLkhhc2goImFiIikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDY2OTQ5NzExNywgSWROYW1lLkhhc2goImFiYyIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMTk5NDE5MDcxMywgSWROYW1lLkhhc2goImFiY2QiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTgwMjY4MDQxOCwgSWROYW1lLkhhc2goImFiY2RlIikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyNjYzMDg2ODAsIElkTmFtZS5IYXNoKCJhYmNkZWYiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTM3OTM3MjUxMywgSWROYW1lLkhhc2goImFiY2RlZmciKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTE0MTY5NjcxNTksIElkTmFtZS5IYXNoKCJhYmNkZWZnaCIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MzU1Njg5NiwgSWROYW1lLkhhc2goImFiY2RlZmdoaSIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtNDQyNzMxOCwgSWROYW1lLkhhc2goImFiY2RlZmdoaWoiKSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9Nc2cvVGVzdElkTmFtZU1hcC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RJZE5hbWVNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5MGVmMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RJZE5hbWVNYXAuY3MKQEAgLTAsMCArMSwyMDIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKworICAgIHB1YmxpYyBjbGFzcyBNeUlkTmFtZU1hcDxUPiA6IElkTmFtZU1hcDxJZE5hbWU+CisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSWROYW1lIE1ha2VOZXcoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSWROYW1lKCBuYW1lICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RJZE5hbWVNYXAKKyAgICB7CisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdElkTmFtZU1hcCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtTZXRVcF0gLy8gQmVmb3JlCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBtYXAgPSBuZXcgTXlJZE5hbWVNYXA8SWROYW1lPigpOworICAgICAgICAgICAgYSA9IG1hcC5BZGQobmV3IElkTmFtZSgxLCAiYSIpKTsKKyAgICAgICAgICAgIGIgPSBtYXAuQWRkKG5ldyBJZE5hbWUoMiwgImIiKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIElkTmFtZU1hcDxJZE5hbWU+IG1hcDsKKworICAgICAgICBwcml2YXRlIElkTmFtZSBhOworCisgICAgICAgIHByaXZhdGUgSWROYW1lIGI7CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIENoZWNrX2EoKQorCSAgICB7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIG1hcC5TaXplKCkgKTsKKwkJICAgIENoZWNrKCAiYSIsIDEsIGEgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMiwgbWFwLlNpemUoKSApOworCSAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHZvaWQgQ2hlY2soIFN0cmluZyBuYW1lLCBpbnQgaWQsIElkTmFtZSBpZE5hbWUgKQorCSAgICB7CisJCSAgICBJZE5hbWUgeCA9IG1hcC5HZXQoIGlkICk7CisJCSAgICBBc3NlcnQuSXNOb3ROdWxsKCB4ICk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggaWROYW1lLCB4ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGlkLCB4LklkICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG5hbWUsIHguTmFtZSApOworICAgIAkJCisJCSAgICB4ID0gbWFwLkdldCggbmFtZSApOworCQkgICAgQXNzZXJ0LklzTm90TnVsbCggeCApOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIGlkTmFtZSwgeCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBpZCwgeC5JZCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBuYW1lLCB4Lk5hbWUgKTsKKwkgICAgfQorICAgIAkKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBDaGVja19iKCkKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJCSAgICBDaGVjayggImIiLCAyLCBiICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIG1hcC5TaXplKCkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBHZXRfMygpCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMiwgbWFwLlNpemUoKSApOworCQkgICAgSWROYW1lIHggPSBtYXAuR2V0KCAzICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCB4ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIG1hcC5TaXplKCkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBHZXRfM19sb2NrZWQoKQorCSAgICB7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIG1hcC5TaXplKCkgKTsKKwkJICAgIG1hcC5Mb2NrKCk7CisJCSAgICBJZE5hbWUgeCA9IG1hcC5HZXQoIDMgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIHggKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMiwgbWFwLlNpemUoKSApOworCSAgICB9CisgICAgCQorCSAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIEdldF9jKCkKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJCSAgICBJZE5hbWUgYyA9IG1hcC5HZXQoICJjIiApOworCQkgICAgQ2hlY2soICJjIiwgMzUyOTg4MzE4LCBjICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIG1hcC5TaXplKCkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBHZXRfZF9sb2NrZWQoKQorCSAgICB7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIG1hcC5TaXplKCkgKTsKKwkJICAgIG1hcC5Mb2NrKCk7CisJCSAgICBJZE5hbWUgZCA9IG1hcC5HZXQoICJkIiApOworCQkgICAgQXNzZXJ0LklzTnVsbCggZCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJICAgIH0KKworCSAgICAKKwkgICAgW1Rlc3RdCisgICAgICAgIFsgRXhwZWN0ZWRFeGNlcHRpb24gKCB0eXBlb2YoIEV4Y2VwdGlvbiApICkgXQorCSAgICBwdWJsaWMgdm9pZCBBZGRfM19jX2xvY2tlZCgpCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMiwgbWFwLlNpemUoKSApOworCQkgICAgbWFwLkxvY2soKTsKKwkJICAgIG1hcC5BZGQoIG5ldyBJZE5hbWUoIDMsICJjIiApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIG1hcC5TaXplKCkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgCisJICAgIFtUZXN0XQorICAgICAgICBbIEV4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50RXhjZXB0aW9uICkgKSBdCisJICAgIHB1YmxpYyB2b2lkIEFkZF9pZF9jb2xsKCkKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJCSAgICBtYXAuQWRkKCBuZXcgSWROYW1lKCAxLCAiYyIgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJICAgIH0KKyAgICAJCisJICAgIAorCSAgICBbVGVzdF0KKyAgICAgICAgWyBFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudEV4Y2VwdGlvbiApICkgXQorCSAgICBwdWJsaWMgdm9pZCBBZGRfbmFtZV9jb2xsKCkKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJCSAgICBtYXAuQWRkKCBuZXcgSWROYW1lKCAzLCAiYSIgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJICAgIH0KKyAgICAJCisJICAgIAorCSAgICBbVGVzdF0KKyAgICAgICAgWyBFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudEV4Y2VwdGlvbiApICkgXQorCSAgICBwdWJsaWMgdm9pZCBBZGRfaWRfbmFtZV9jb2xsKCkKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJCSAgICBtYXAuQWRkKCBuZXcgSWROYW1lKCAxLCAiYSIgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBtYXAuU2l6ZSgpICk7CisJICAgIH0KKyAgICAJCisJICAgIAorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVmFsdWVzMSgpCisJICAgIHsKKwkJICAgIExpc3Q8SWROYW1lPiBhY3R1YWwgPSBtYXAuVmFsdWVzKCk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIGFjdHVhbC5Db3VudCApOworCQkgICAgTGlzdDxJZE5hbWU+IGV4cGVjdGVkID0gbmV3IExpc3Q8SWROYW1lPigpOworCQkgICAgZXhwZWN0ZWQuQWRkKCBuZXcgSWROYW1lKCAxLCAiYSIgKSApOworCQkgICAgZXhwZWN0ZWQuQWRkKCBuZXcgSWROYW1lKCAyLCAiYiIgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBleHBlY3RlZCwgYWN0dWFsICk7CisgICAgCQkKKwkJICAgIG1hcC5HZXQoICJjIiApOworICAgIAkJCisJCSAgICBhY3R1YWwgPSBtYXAuVmFsdWVzKCk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIGFjdHVhbC5Db3VudCApOworCQkgICAgZXhwZWN0ZWQgPSBuZXcgTGlzdDxJZE5hbWU+KCk7CisJCSAgICBleHBlY3RlZC5BZGQoIG5ldyBJZE5hbWUoIDEsICJhIiApICk7CisJCSAgICBleHBlY3RlZC5BZGQoIG5ldyBJZE5hbWUoIDIsICJiIiApICk7CisJCSAgICBleHBlY3RlZC5BZGQoIG5ldyBJZE5hbWUoICJjIiApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGV4cGVjdGVkLCBhY3R1YWwgKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBWYWx1ZXMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdFNhbWUobWFwLlZhbHVlcygpLG1hcC5WYWx1ZXMoKSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9Nc2cvVGVzdE1lc3NhZ2UuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0TWVzc2FnZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA3OTAyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9Nc2cvVGVzdE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwzNjYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZworeworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdE1lc3NhZ2UKKyAgICB7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0TWVzc2FnZSIgKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIE15VmFsdWVGYWN0b3J5IHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7IAorICAgICAgICBwcml2YXRlIFhUeXBlIG10MSA9IG5ldyBYVHlwZSgxLCAibXQiKTsgCisgICAgICAgIHByaXZhdGUgWFR5cGUgcm10ID0gbmV3IFhUeXBlKDIsICJybXQiKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjEgPSBuZXcgRmllbGQoMywgIngiKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjIgPSBuZXcgRmllbGQoNCwgInkiKTsKKworICAgICAgICBwdWJsaWMgVGVzdE1lc3NhZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBtdDEuUHV0VmFsaWRhdG9yKCBtZjEsIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkgKTsKKyAgICAgICAgICAgIG10MS5QdXRWYWxpZGF0b3IoIG1mMiwgVmFsaWRhdG9yX2ludC5HZXQoIDAgKSApOworICAgICAgICAgICAgbXQxLlB1dFZhbGlkYXRvciggdmYubWZfbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworCisgICAgICAgICAgICBybXQuUHV0VmFsaWRhdG9yKCB2Zi5tZl9tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisgICAgICAgICAgICBybXQuUHV0VmFsaWRhdG9yKCB2Zi5tZl9pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRWZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10MSwgdmYgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKCB2ZiwgbXNnLlZmICk7CisgICAgICAgIH0KKworICAgICAgICAvL1tUZXN0XQorICAgICAgICAvL3B1YmxpYyB2b2lkIFRlc3RBcnJheUl0ZXJhdG9yKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIEFycmF5SXRlcmF0b3I8aW50Pz4gZm9vQmFyID0gbmV3IEFycmF5SXRlcmF0b3I8aW50Pz4obmV3IGludD9bXSB7IDEsIDIsIDMsIDQsIDUgfSk7CisgICAgICAgIC8vICAgIEFzc2VydC5Jc1RydWUoZm9vQmFyLk1vdmVOZXh0KCkpOworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZm9vQmFyLkN1cnJlbnQpOworICAgICAgICAvLyAgICBBc3NlcnQuSXNUcnVlKGZvb0Jhci5Nb3ZlTmV4dCgpKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGZvb0Jhci5DdXJyZW50KTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LklzVHJ1ZShmb29CYXIuTW92ZU5leHQoKSk7CisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCgzLCBmb29CYXIuQ3VycmVudCk7CisgICAgICAgIC8vICAgIEFzc2VydC5Jc1RydWUoZm9vQmFyLk1vdmVOZXh0KCkpOworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoNCwgZm9vQmFyLkN1cnJlbnQpOworICAgICAgICAvLyAgICBBc3NlcnQuSXNUcnVlKGZvb0Jhci5Nb3ZlTmV4dCgpKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDUsIGZvb0Jhci5DdXJyZW50KTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LklzRmFsc2UoZm9vQmFyLk1vdmVOZXh0KCkpOworICAgICAgICAvL30KKworICAgICAgICAvL1tUZXN0XQorICAgICAgICAvL3B1YmxpYyB2b2lkIFdyaXRlTWVzc2FnZSgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBtdDEgLCB2ZiApOworICAgICAgICAvLyAgICBXcml0ZUhlbHBlcihtc2cpOworCisgICAgICAgIC8vICAgIG1zZ1ttZjFdID0gMTIzOworICAgICAgICAvLyAgICBXcml0ZUhlbHBlcihtc2cpOworCisgICAgICAgIC8vICAgIG1zZ1ttZjJdID0gMjM0IDsKKyAgICAgICAgLy8gICAgV3JpdGVIZWxwZXIobXNnKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgLy9wcml2YXRlIHZvaWQgV3JpdGVIZWxwZXIoTWVzc2FnZSBtc2cpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBUYWdnZWREYXRhT3V0cHV0IHRkbyA9IG5ldyBGYWtlVGRvKG1zZyk7CisgICAgICAgIC8vICAgIG1zZy5Xcml0ZU1lc3NhZ2UodGRvKTsKKyAgICAgICAgLy8gICAgLy90ZG8uQ2xvc2UoKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlcGx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZShtdDEsIHZmKTsKKyAgICAgICAgICAgIG1zZy5NZXNzYWdlSWQgPSAxMjM0NUw7CisKKyAgICAgICAgICAgIE1lc3NhZ2Ugcm1zZyA9IG1zZy5SZXBseShybXQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUocm10LCBybXNnLkdldFhUeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHZmLCBybXNnLlZmKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0NUwsIHJtc2cuSW5SZXBseVRvKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBNZXNzYWdlSWQoKQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKG10MSwgdmYpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtc2cuTWVzc2FnZUlkKTsKKyAgICAgICAgICAgIG1zZy5NZXNzYWdlSWQgPSAyMzRMOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIzNEwsIG1zZy5NZXNzYWdlSWQpOworICAgICAgICAgICAgbXNnLk1lc3NhZ2VJZCA9IDM0NUw7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzQ1TCwgbXNnLk1lc3NhZ2VJZCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgSW5SZXBseVRvKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZShybXQsIHZmKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwobXNnLkluUmVwbHlUbyk7CisgICAgICAgICAgICBtc2cuSW5SZXBseVRvID0gMjM0TDsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMzRMLCBtc2cuSW5SZXBseVRvKTsKKyAgICAgICAgICAgIG1zZy5JblJlcGx5VG8gPSAzNDVMOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDM0NUwsIG1zZy5JblJlcGx5VG8pOworICAgICAgICB9CisKKyAgICAgICAgLy9wdWJsaWMgY2xhc3MgRmFrZVRkbyA6IFRhZ2dlZERhdGFPdXRwdXQgCisgICAgICAgIC8veworICAgICAgICAvLyAgICBwdWJsaWMgRmFrZVRkbyhNZXNzYWdlIG1zZykKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgdGhpcy54bXNnID0gbXNnOworICAgICAgICAvLyAgICB9CisKKyAgICAgICAgLy8gICAgcHJpdmF0ZSBNZXNzYWdlIHhtc2c7IAorCisgICAgICAgIC8vICAgIHB1YmxpYyB2b2lkIFN0YXJ0TWVzc2FnZShNZXNzYWdlIG1zZykKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgQXNzZXJ0LkFyZVNhbWUoeG1zZywgbXNnKTsKKyAgICAgICAgLy8gICAgICAgIEFzc2VydC5Jc0ZhbHNlKHN0YXJ0ZWQpOworICAgICAgICAvLyAgICAgICAgQXNzZXJ0LklzRmFsc2UoZW5kZWQpOworCisgICAgICAgIC8vICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgLy8gICAgfQorCisgICAgICAgIC8vICAgIHByaXZhdGUgYm9vbCBzdGFydGVkOworCisgICAgICAgIC8vICAgIHByaXZhdGUgYm9vbCBlbmRlZDsKKworICAgICAgICAvLyAgICBwdWJsaWMgdm9pZCBXcml0ZVN0cnVjdEVsZW1lbnQoRmllbGQga2V5LCBPYmplY3QgdmFsdWUpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIEFzc2VydC5Jc1RydWUoc3RhcnRlZCk7CisgICAgICAgIC8vICAgICAgICBBc3NlcnQuSXNGYWxzZShlbmRlZCk7CisgICAgICAgIC8vICAgICAgICBpdGVtc1trZXldID0gdmFsdWU7CisgICAgICAgIC8vICAgIH0KKworICAgICAgICAvLyAgICBwcml2YXRlIERpY3Rpb25hcnk8RmllbGQsIE9iamVjdD4gaXRlbXMgPSBuZXcgRGljdGlvbmFyeTxGaWVsZCwgT2JqZWN0PigpOworCisgICAgICAgIC8vICAgIHB1YmxpYyB2b2lkIEVuZE1lc3NhZ2UoTWVzc2FnZSBtc2cpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIEFzc2VydC5BcmVTYW1lKHhtc2csIG1zZyk7CisgICAgICAgIC8vICAgICAgICBBc3NlcnQuSXNUcnVlKHN0YXJ0ZWQpOworICAgICAgICAvLyAgICAgICAgQXNzZXJ0LklzRmFsc2UoZW5kZWQpOworCisgICAgICAgIC8vICAgICAgICBlbmRlZCA9IHRydWU7CisgICAgICAgIC8vICAgIH0KKworICAgICAgICAvLyAgICBwdWJsaWMgdm9pZCBDbG9zZSgpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIEFzc2VydC5Jc1RydWUoc3RhcnRlZCk7CisgICAgICAgIC8vICAgICAgICBBc3NlcnQuSXNUcnVlKGVuZGVkKTsKKworICAgICAgICAvLyAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHhtc2cuQ291bnQsIGl0ZW1zLkNvdW50KTsKKyAgICAgICAgLy8gICAgICAgIEFzc2VydC5BcmVFcXVhbCh4bXNnLCBpdGVtcyk7IC8vZW50cnlTZXQoKSBkZWxldGVkCisgICAgICAgIC8vICAgIH0KKworICAgICAgICAvLyAgICBwdWJsaWMgdm9pZCBFbmRBcnJheShBcnJheVZhbHVlIGFycmF5KQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJub3QgaW1wbGVtZW50ZWQiKTsKKyAgICAgICAgLy8gICAgfQorCisgICAgICAgIC8vICAgIHB1YmxpYyB2b2lkIEVuZFN0cnVjdChTdHJ1Y3RWYWx1ZSBzdHJ1YykKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7CisgICAgICAgIC8vICAgIH0KKworICAgICAgICAvLyAgICBwdWJsaWMgdm9pZCBTdGFydEFycmF5KEFycmF5VmFsdWUgYXJyYXkpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICAvLyAgICB9CisKKyAgICAgICAgLy8gICAgcHVibGljIHZvaWQgU3RhcnRTdHJ1Y3QoU3RydWN0VmFsdWUgc3RydWMpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICAvLyAgICB9CisKKyAgICAgICAgLy8gICAgcHVibGljIHZvaWQgV3JpdGVBcnJheUVsZW1lbnQoT2JqZWN0IHZhbHVlKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJub3QgaW1wbGVtZW50ZWQiKTsKKyAgICAgICAgLy8gICAgfQorCisgICAgICAgIC8vICAgICNyZWdpb24gVGFnZ2VkRGF0YU91dHB1dCBNZW1iZXJzCisKKworICAgICAgICAvLyAgICBwdWJsaWMgdm9pZCBTZXRCdWZmZXIoIEV0Y2guVHJhbnNwb3J0LkZsZXhCdWZmZXIgbXNnQnVmICkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgLy8gaWdub3JlCisgICAgICAgIC8vICAgIH0KKworICAgICAgICAvLyAgICAjZW5kcmVnaW9uCisgICAgICAgIC8vfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeVZhbHVlRmFjdG9yeSA6IFZhbHVlRmFjdG9yeQorCSAgICB7CisJCSAgICAvLy8vLy8vLy8vLy8vLy8KKwkJICAgIC8vIE1FU1NBR0VJRCAvLworCQkgICAgLy8vLy8vLy8vLy8vLy8vCisgICAgCQkKKwkJICAgIHB1YmxpYyBsb25nPyBHZXRNZXNzYWdlSWQoIE1lc3NhZ2UgbXNnICkKKwkJICAgIHsKKwkJCSAgICByZXR1cm4gKGxvbmc/KSBtc2cuR2V0KCBtZl9tZXNzYWdlSWQgKTsKKwkJICAgIH0KKworCQkgICAgcHVibGljIHZvaWQgU2V0TWVzc2FnZUlkKCBNZXNzYWdlIG1zZywgbG9uZz8gbXNnaWQgKQorCQkgICAgeworCQkJICAgIG1zZ1ttZl9tZXNzYWdlSWRdID0gbXNnaWQ7CisJCSAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBGaWVsZCBHZXRfbWZfX21lc3NhZ2VJZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1mX21lc3NhZ2VJZDsKKyAgICAgICAgICAgIH0KKyAgICAJCQorCQkgICAgcHVibGljIHJlYWRvbmx5IEZpZWxkIG1mX21lc3NhZ2VJZCA9IG5ldyBGaWVsZCggIl9tZXNzYWdlSWQiICk7CisKKwkJICAgIC8vLy8vLy8vLy8vLy8vLworCQkgICAgLy8gSU5SRVBMWVRPIC8vCisJCSAgICAvLy8vLy8vLy8vLy8vLy8KKyAgICAJCQorCQkgICAgcHVibGljIGxvbmc/IEdldEluUmVwbHlUbyggTWVzc2FnZSBtc2cgKQorCQkgICAgeworCQkJICAgICByZXR1cm4gKGxvbmc/KSBtc2cuR2V0KCBtZl9pblJlcGx5VG8gKTsKKwkJICAgIH0KKworCQkgICAgcHVibGljIHZvaWQgU2V0SW5SZXBseVRvKCBNZXNzYWdlIG1zZywgbG9uZz8gbXNnaWQgKQorCQkgICAgeworCQkJICAgIG1zZ1ttZl9pblJlcGx5VG9dID0gbXNnaWQgOworCQkgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRmllbGQgZ2V0X21mX19pblJlcGx5VG8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtZl9pblJlcGx5VG87CisgICAgICAgICAgICB9CisgICAgCQkKKwkJICAgIHB1YmxpYyByZWFkb25seSBGaWVsZCBtZl9pblJlcGx5VG8gPSBuZXcgRmllbGQoICJfaW5SZXBseVRvIiApOworCisJCSAgICAvLy8vLy8vLy8vLy8KKwkJICAgIC8vIFVOVVNFRCAvLworCQkgICAgLy8vLy8vLy8vLy8vCisgICAgCQkKKworCQkgICAgcHVibGljIFN0cnVjdFZhbHVlIEV4cG9ydEN1c3RvbVZhbHVlKCBPYmplY3QgdmFsdWUgKQorCQkgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworCQkgICAgfQorCisJCSAKKworCQkgICAgcHVibGljIEVuY29kaW5nIEdldFN0cmluZ0VuY29kaW5nKCkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJub3QgaW1wbGVtZW50ZWQiKTsKKwkJICAgIH0KKworCQkgICAgcHVibGljIFhUeXBlIEdldFR5cGUoIGludCBpZCApCisJCSAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7CisJCSAgICB9CisKKwkJICAgIHB1YmxpYyBYVHlwZSBHZXRUeXBlKCBTdHJpbmcgbmFtZSApCisJCSAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7CisJCSAgICB9CisKKwkJICAgIHB1YmxpYyBJQ29sbGVjdGlvbjxYVHlwZT4gR2V0VHlwZXMoKQorCQkgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworCQkgICAgfQorCisJCSAgICBwdWJsaWMgT2JqZWN0IEltcG9ydEN1c3RvbVZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdiApCisJCSAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7CisJCSAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRDdXN0b21TdHJ1Y3RUeXBlKCBUeXBlIGMgKQorCQkgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworCQkgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWFR5cGUgR2V0X210X19FdGNoX0F1dGhFeGNlcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWFR5cGUgR2V0X210X19FdGNoX1J1bnRpbWVFeGNlcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWFR5cGUgZ2V0X210X19leGNlcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjcmVnaW9uIFZhbHVlRmFjdG9yeSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRUeXBlKCBpbnQ/IGlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZpZWxkIEdldEZpZWxkKCBpbnQ/IGlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEFkZFR5cGUoWFR5cGUgdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIExvY2tEeW5hbWljVHlwZXMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgVW5sb2NrRHluYW1pY1R5cGVzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBGaWVsZCBHZXRfbWZfX2luUmVwbHlUbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHB1YmxpYyBWYWxpZGF0b3IuTGV2ZWwgR2V0TGV2ZWwoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3IuTGV2ZWwuRlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFZhbGlkYXRvci5MZXZlbCBTZXRMZXZlbChWYWxpZGF0b3IuTGV2ZWwgbGV2ZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RTdHJ1Y3RWYWx1ZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RTdHJ1Y3RWYWx1ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2I4MDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9Nc2cvVGVzdFN0cnVjdFZhbHVlLmNzCkBAIC0wLDAgKzEsMzY4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0U3RydWN0VmFsdWUKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0U3RydWN0VmFsdWUiICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFhUeXBlIG10MSA9IG5ldyBYVHlwZSgib25lIik7CisgICAgICAgIHByaXZhdGUgWFR5cGUgbXQyID0gbmV3IFhUeXBlKCJ0d28iKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjEgPSBuZXcgRmllbGQoICJmMSIgKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjIgPSBuZXcgRmllbGQoICJmMiIgKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjMgPSBuZXcgRmllbGQoICJmMyIgKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjQgPSBuZXcgRmllbGQoICJmNCIgKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjUgPSBuZXcgRmllbGQoICJmNSIgKTsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZCBtZjYgPSBuZXcgRmllbGQoICJmNiIgKTsKKworICAgICAgICBwdWJsaWMgVGVzdFN0cnVjdFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgbXQxLlB1dFZhbGlkYXRvciggbWYxLCBWYWxpZGF0b3JfYm9vbGVhbi5HZXQoIDAgKSApOworICAgICAgICAgICAgbXQxLlB1dFZhbGlkYXRvciggbWYyLCBWYWxpZGF0b3JfYm9vbGVhbi5HZXQoIDEgKSApOworICAgICAgICAgICAgbXQxLlB1dFZhbGlkYXRvciggbWYzLCBWYWxpZGF0b3JfaW50LkdldCggMCApICk7CisgICAgICAgICAgICBtdDEuUHV0VmFsaWRhdG9yKCBtZjQsIFZhbGlkYXRvcl9pbnQuR2V0KCAxICkgKTsKKyAgICAgICAgICAgIG10MS5QdXRWYWxpZGF0b3IoIG1mNSwgVmFsaWRhdG9yX3N0cmluZy5HZXQoIDAgKSApOworICAgICAgICAgICAgbXQxLlB1dFZhbGlkYXRvciggbWY2LCBWYWxpZGF0b3Jfc3RyaW5nLkdldCggMSApICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdDJzdHIoKSAKKwkgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQxLCB2Zik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJvbmUoNzg1OTQ1Mzc3KToge30iLCBzdi5Ub1N0cmluZygpICk7CisKKyAgICAgICAgICAgIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MiwgdmYpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAidHdvKDgyNzg0MzMwMyk6IHt9Iiwgc3YuVG9TdHJpbmcoKSApOworCisgICAgICAgICAgICBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShtdDEsIHZmKTsKKyAgICAgICAgICAgIHN2LkFkZCggbWYxLCB0cnVlICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJvbmUoNzg1OTQ1Mzc3KToge2YxKDE1MTIxNzY1OTIpPVRydWV9Iiwgc3YuVG9TdHJpbmcoKSApOworCisgICAgICAgICAgICBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShtdDEsIHZmKTsKKyAgICAgICAgICAgIHN2LkFkZCggbWYzLCAyMyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAib25lKDc4NTk0NTM3Nyk6IHtmMygxNTEyMTc2NTk0KT0yM30iLCBzdi5Ub1N0cmluZygpICk7CisKKyAgICAgICAgICAgIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworICAgICAgICAgICAgc3YuQWRkKCBtZjEsIGZhbHNlICk7CisgICAgICAgICAgICBzdi5BZGQoIG1mMywgNzQgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggIm9uZSg3ODU5NDUzNzcpOiB7ZjEoMTUxMjE3NjU5Mik9RmFsc2UsIGYzKDE1MTIxNzY1OTQpPTc0fSIsIHN2LlRvU3RyaW5nKCkgKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRYVHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUobXQxLCBzdi5HZXRYVHlwZSk7CisKKyAgICAgICAgICAgIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MiwgdmYpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUobXQyLCBzdi5HZXRYVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNUeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQxLCB2Zik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHN2LklzVHlwZShtdDEpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHN2LklzVHlwZShtdDIpKTsKKworICAgICAgICAgICAgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQyLCB2Zik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHN2LklzVHlwZShtdDIpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHN2LklzVHlwZShtdDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDaGVja1R5cGVfKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQxLCB2Zik7CisgICAgICAgICAgICBzdi5DaGVja1R5cGUobXQxKTsKKyAgICAgICAgICAgIHRyeSB7IHN2LkNoZWNrVHlwZShtdDIpOyBBc3NlcnQuSXNUcnVlKGZhbHNlKTsgfQorICAgICAgICAgICAgY2F0Y2goQXJndW1lbnRFeGNlcHRpb24gKSB7IAorICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MiwgdmYpOworICAgICAgICAgICAgc3YuQ2hlY2tUeXBlKG10Mik7CisgICAgICAgICAgICB0cnkgeyBzdi5DaGVja1R5cGUobXQxKTsgQXNzZXJ0LklzVHJ1ZShmYWxzZSk7IH0KKyAgICAgICAgICAgIGNhdGNoKEFyZ3VtZW50RXhjZXB0aW9uICkgeyBBc3NlcnQuSXNUcnVlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEl0ZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQxLCB2Zik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggc3YuR2V0RW51bWVyYXRvcigpLk1vdmVOZXh0KCkgKTsKKworICAgICAgICAgICAgc3YuQWRkKCBtZjEsIHRydWUgKTsKKworICAgICAgICAgICAgSUVudW1lcmF0b3I8S2V5VmFsdWVQYWlyPEZpZWxkLCBPYmplY3Q+PiBpdCA9IHN2LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGl0Lk1vdmVOZXh0KCkgKTsKKyAgICAgICAgICAgIEtleVZhbHVlUGFpcjxGaWVsZCwgT2JqZWN0PiBtZSA9IGl0LkN1cnJlbnQ7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG1mMSwgbWUuS2V5ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHRydWUsIG1lLlZhbHVlICk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggaXQuTW92ZU5leHQoKSApOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PEZpZWxkLCBPYmplY3Q+IHZhbHMgPSBuZXcgRGljdGlvbmFyeTxGaWVsZCwgb2JqZWN0PigpOworICAgICAgICAgICAgdmFscy5BZGQoIG1mMSwgdHJ1ZSApOworICAgICAgICAgICAgdmFscy5BZGQoIG1mMywgMiApOworICAgICAgICAgICAgdmFscy5BZGQoIG1mNSwgImEiICk7CisKKyAgICAgICAgICAgIHN2LkFkZCggbWYzLCAyICk7CisgICAgICAgICAgICBzdi5BZGQoIG1mNSwgImEiICk7CisKKyAgICAgICAgICAgIGl0ID0gc3YuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKCBpdC5Nb3ZlTmV4dCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZSA9IGl0LkN1cnJlbnQ7CisgICAgICAgICAgICAgICAgRmllbGQga2V5ID0gbWUuS2V5OworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIHZhbHMuQ29udGFpbnNLZXkoIGtleSApICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB2YWxzW2tleV0sIG1lLlZhbHVlICk7CisgICAgICAgICAgICAgICAgdmFscy5SZW1vdmUoIGtleSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggdmFscy5Db3VudCA9PSAwICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDaGVja1R5cGUxKCkKKwkgICAgeworICAgICAgICAgICAgbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpLkNoZWNrVHlwZShtdDEpOworICAgICAgICAgICAgbmV3IFN0cnVjdFZhbHVlKG10MiwgdmYpLkNoZWNrVHlwZShtdDIpOworCSAgICB9CisKKwkgICAgIAorCSAgICBbVGVzdF1bRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisJICAgIHB1YmxpYyB2b2lkIENoZWNrVHlwZTIoKQorCSAgICB7CisgICAgICAgICAgICBuZXcgU3RydWN0VmFsdWUobXQxLCB2ZikuQ2hlY2tUeXBlKG10Mik7CisJICAgIH0KKworCSAgICAgCisJICAgIFtUZXN0XVtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KKwkgICAgcHVibGljIHZvaWQgQ2hlY2tUeXBlKCkKKwkgICAgeworICAgICAgICAgICAgbmV3IFN0cnVjdFZhbHVlKG10MiwgdmYpLkNoZWNrVHlwZShtdDEpOworCSAgICB9CisgICAgCQorCSAgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBHZXQoKSAKKwkgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQxLCB2Zik7CisJCSAgICBBc3NlcnQuSXNUcnVlKCBzdi5Db3VudCA9PSAwICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIHN2LkNvdW50ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBzdi5HZXQoIG1mMSApICk7CisgICAgCQkKKwkJICAgIHN2LkFkZCggbWYxLCB0cnVlICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggc3YuQ291bnQgPT0gMCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBzdi5Db3VudCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCB0cnVlLCBzdi5HZXQoIG1mMSApICk7CisgICAgCQkKKwkJICAgIHN2LkFkZCggbWYxLCBmYWxzZSApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHN2LkNvdW50ID09IDAgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMSwgc3YuQ291bnQgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZmFsc2UsIHN2LkdldCggbWYxICkgKTsKKyAgICAJCQorCQkgICAgc3YuQWRkKCBtZjEsIG51bGwgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHN2LkNvdW50ID09IDAgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMCwgc3YuQ291bnQgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIHN2LkdldCggbWYxICkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgIAorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgUmVtb3ZlKCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggc3YuQ291bnQgPT0gMCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBzdi5Db3VudCApOworCQkgICAgQXNzZXJ0LklzTnVsbCggc3YuR2V0KCBtZjEgKSApOworICAgIAkJCisJCSAgICBzdi5SZW1vdmUoIG1mMSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggc3YuQ291bnQgPT0gMCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBzdi5Db3VudCApOworCQkgICAgQXNzZXJ0LklzTnVsbCggc3YuR2V0KCBtZjEgKSApOworICAgIAkJCisJCSAgICBzdi5BZGQoIG1mMSwgdHJ1ZSApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHN2LkNvdW50ID09IDAgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMSwgc3YuQ291bnQgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggdHJ1ZSwgc3YuR2V0KCBtZjEgKSApOworICAgIAkJCisJCSAgICBzdi5SZW1vdmUoIG1mMSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggc3YuQ291bnQgPT0gMCApOworCQkgICAgQXNzZXJ0LklzTnVsbCggc3YuR2V0KCBtZjEgKSApOworICAgIAkJCisJCSAgICBzdi5SZW1vdmUoIG1mMSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBzdi5Db3VudCApOworCQkgICAgQXNzZXJ0LklzTnVsbCggc3YuR2V0KCBtZjEgKSApOworCSAgICB9CisgICAgCQorCSAgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBQdXQxKCkgCisJICAgIHsKKwkJICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCSAgICBzdi5BZGQoIG1mMSwgZmFsc2UgKTsKKwkJICAgIHN2LkFkZCggbWYyLCBuZXcgQm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UgfSApOworCQkgICAgc3YuQWRkKCBtZjMsIDEgKTsKKwkJICAgIHN2LkFkZCggbWY0LCBuZXcgaW50W10geyAxLCAyIH0gKTsKKwkJICAgIHN2LkFkZCggbWY1LCAiYSIgKTsKKwkJICAgIHN2LkFkZCggbWY2LCBuZXcgU3RyaW5nW10geyAiYSIsICJiIiB9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDYsIHN2LkNvdW50ICk7CisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFB1dDIoKSAKKwkgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQxLCB2Zik7CisJCSAgICBzdi5BZGQoIG1mMSwgbnVsbCApOworCQkgICAgc3YuQWRkKCBtZjIsIG51bGwgKTsKKwkJICAgIHN2LkFkZCggbWYzLCBudWxsICk7CisJCSAgICBzdi5BZGQoIG1mNCwgbnVsbCApOworCQkgICAgc3YuQWRkKCBtZjUsIG51bGwgKTsKKwkJICAgIHN2LkFkZCggbWY2LCBudWxsICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIHN2LkNvdW50ICk7CisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFB1dDMoKSAKKwkgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUobXQxLCB2Zik7CisJCSAgICBzdi5BZGQoIG1mMSwgZmFsc2UgKTsKKwkJICAgIHN2LkFkZCggbWYyLCBuZXcgQm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UgfSApOworCQkgICAgc3YuQWRkKCBtZjMsIDEgKTsKKwkJICAgIHN2LkFkZCggbWY0LCBuZXcgaW50W10geyAxLCAyIH0gKTsKKwkJICAgIHN2LkFkZCggbWY1LCAiYSIgKTsKKwkJICAgIHN2LkFkZCggbWY2LCBuZXcgU3RyaW5nW10geyAiYSIsICJiIiB9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDYsIHN2LkNvdW50ICk7CisgICAgCQkKKwkJICAgIC8vIG5vdyAicmVtb3ZlIiB0aGVtIGFsbAorICAgIAkJCisJCSAgICBzdi5BZGQoIG1mMSwgbnVsbCApOworCQkgICAgc3YuQWRkKCBtZjIsIG51bGwgKTsKKwkJICAgIHN2LkFkZCggbWYzLCBudWxsICk7CisJCSAgICBzdi5BZGQoIG1mNCwgbnVsbCApOworCQkgICAgc3YuQWRkKCBtZjUsIG51bGwgKTsKKwkJICAgIHN2LkFkZCggbWY2LCBudWxsICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIHN2LkNvdW50ICk7CisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorCSAgICBwdWJsaWMgdm9pZCBwdXQ1KCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjEsIChzYnl0ZSkgMSApOyAvLyB3cm9uZyB0eXBlCisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorCSAgICBwdWJsaWMgdm9pZCBwdXQ2KCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjEsIChzaG9ydCkgMSApOyAvLyB3cm9uZyB0eXBlCisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorCSAgICBwdWJsaWMgdm9pZCBwdXQ3KCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjEsIDEgKTsgLy8gd3JvbmcgdHlwZQorCSAgICB9CisgICAgCQorCSAgICAgCisJICAgIFtUZXN0XVtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KKwkgICAgcHVibGljIHZvaWQgcHV0OCgpIAorCSAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShtdDEsIHZmKTsKKwkJICAgIHN2LkFkZCggbWYxLCAobG9uZykgMSApOyAvLyB3cm9uZyB0eXBlCisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorCSAgICBwdWJsaWMgdm9pZCBwdXQ5KCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjEsIChmbG9hdCkgMS4yICk7IC8vIHdyb25nIHR5cGUKKwkgICAgfQorICAgIAkKKwkgICAgIAorCSAgICBbVGVzdF1bRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisJICAgIHB1YmxpYyB2b2lkIHB1dDEwKCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjEsIDEuMiApOyAvLyB3cm9uZyB0eXBlCisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorCSAgICBwdWJsaWMgdm9pZCBwdXQxMSgpIAorCSAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShtdDEsIHZmKTsKKwkJICAgIHN2LkFkZCggbWYxLCAiYSIgKTsgLy8gd3JvbmcgdHlwZQorCSAgICB9CisgICAgCQorCSAgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBwdXQxMigpIAorCSAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShtdDEsIHZmKTsKKwkJICAgIHN2LkFkZCggbWYyLCBudWxsICk7CisJICAgIH0KKyAgICAJCisJICAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHB1dDEzKCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjIsIG5ldyBCb29sZWFuW10ge30gKTsKKwkgICAgfQorICAgIAkKKwkgICAgIAorCSAgICBbVGVzdF1bRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisJICAgIHB1YmxpYyB2b2lkIHB1dDE0KCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjIsIHRydWUgKTsKKwkgICAgfQorICAgIAkKKwkgICAgIAorCSAgICBbVGVzdF1bRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisJICAgIHB1YmxpYyB2b2lkIHB1dDE1KCkgCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKG10MSwgdmYpOworCQkgICAgc3YuQWRkKCBtZjIsIG5ldyBCb29sZWFuW11bXSB7fSApOworCSAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RUeXBlTWFwLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9Nc2cvVGVzdFR5cGVNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNGJkNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RUeXBlTWFwLmNzCkBAIC0wLDAgKzEsMzQgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0VHlwZU1hcAorICAgIHsKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIE5vdGhpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIGltcGxlbWVudCB1bml0IHRlc3RzIGZvciBUeXBlTWFwCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0WFR5cGUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL01zZy9UZXN0WFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxYjQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvTXNnL1Rlc3RYVHlwZS5jcwpAQCAtMCwwICsxLDEwMyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cKK3sKKworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFhUeXBlCisgICAgeworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RYVHlwZSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUeXBlSW50ZWdlclN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RNdCgxLCAib25lIik7CisgICAgICAgICAgICBUZXN0TXQoMiwgInR3byIpOworICAgICAgICAgICAgVGVzdE10KDMsICJ0aHJlZSIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFR5cGVTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0TXQoIm9uZSIpOworICAgICAgICAgICAgVGVzdE10KCJ0d28iKTsKKyAgICAgICAgICAgIFRlc3RNdCgidGhyZWUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0R2V0VmFsaWRhdG9yKCkgCisJICAgIHsKKwkJICAgIFhUeXBlIHQgPSBuZXcgWFR5cGUoICJ0IiApOworCQkgICAgRmllbGQgZiA9IG5ldyBGaWVsZCggImYiICk7CisJCSAgICBGaWVsZCBnID0gbmV3IEZpZWxkKCAiZyIgKTsKKwkJICAgIFZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2ludC5HZXQoIDAgKTsKKyAgICAJCQorCQkgICAgdC5QdXRWYWxpZGF0b3IoIGYsIHYgKTsKKworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCB2LCB0LkdldFZhbGlkYXRvciggZiApICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCB0LkdldFZhbGlkYXRvciggZyApICk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdFB1dFZhbGlkYXRvck51bGwoKSAKKwkgICAgeworCQkgICAgWFR5cGUgdCA9IG5ldyBYVHlwZSggInQiICk7CisJCSAgICBGaWVsZCBmID0gbmV3IEZpZWxkKCAiZiIgKTsKKwkJICAgIFZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2ludC5HZXQoIDAgKTsKKworCQkgICAgQXNzZXJ0LklzTnVsbCggdC5HZXRWYWxpZGF0b3IoIGYgKSApOworICAgIAkJCisJCSAgICB0LlB1dFZhbGlkYXRvciggZiwgbnVsbCApOworCQkgICAgQXNzZXJ0LklzTnVsbCggdC5HZXRWYWxpZGF0b3IoIGYgKSApOworICAgIAkJCisJCSAgICB0LlB1dFZhbGlkYXRvciggZiwgdiApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCB2LCB0LkdldFZhbGlkYXRvciggZiApICk7CisgICAgCQkKKwkJICAgIHQuUHV0VmFsaWRhdG9yKCBmLCB2ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHR5cGVvZiggQ29tYm9WYWxpZGF0b3IgKSwgKCB0LkdldFZhbGlkYXRvciggZiApICkuR2V0VHlwZSgpICk7CisgICAgCQkKKwkJICAgIHQuQ2xlYXJWYWxpZGF0b3IoIGYgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIHQuR2V0VmFsaWRhdG9yKCBmICkgKTsKKwkgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBUZXN0TXQoaW50IGlkLCBzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgWFR5cGUgbXQgPSBuZXcgWFR5cGUoaWQsIG5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGlkLCBtdC5JZCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmFtZSwgbXQuTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdE10KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBYVHlwZSBtdCA9IG5ldyBYVHlwZShuYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJZE5hbWUuSGFzaChuYW1lKSwgbXQuSWQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5hbWUsIG10Lk5hbWUpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0RGVmYXVsdFZhbHVlRmFjdG9yeS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0RGVmYXVsdFZhbHVlRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQ3MWFhCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3REZWZhdWx0VmFsdWVGYWN0b3J5LmNzCkBAIC0wLDAgKzEsNTM2IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3REZWZhdWx0VmFsdWVGYWN0b3J5IDogTGlzdDxPYmplY3Q+CisgICAgeworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3REZWZhdWx0VmFsdWVGYWN0b3J5Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE15VmFsdWVGYWN0b3J5IHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlcygpCisJICAgIHsKKyAgICAgICAgICAgIE15VmFsdWVGYWN0b3J5IHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7CisKKwkJICAgIExpc3Q8WFR5cGU+IGVUeXBlcyA9IE1rVHlwZVNldCgKKyAgICAgICAgICAgICAgICB2Zi5HZXRUeXBlKCJfRXRjaF9SdW50aW1lRXhjZXB0aW9uIiksCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX0V0Y2hfTGlzdCIpLAorICAgICAgICAgICAgICAgIHZmLkdldFR5cGUoIl9FdGNoX01hcCIpLAorICAgICAgICAgICAgICAgIHZmLkdldFR5cGUoIl9FdGNoX0RhdGV0aW1lIiksCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX0V0Y2hfQXV0aEV4Y2VwdGlvbiIpLAorICAgICAgICAgICAgICAgIHZmLkdldFR5cGUoIl9leGNlcHRpb24iKSwKKwkJCSAgICBNeVZhbHVlRmFjdG9yeS5fbXRfeCwKKwkJCSAgICBNeVZhbHVlRmFjdG9yeS5fbXRfeQorCQkgICAgKTsKKworICAgICAgICAgICAgLy9EdW1wKCJlVHlwZXMiLCBlVHlwZXMpOworICAgICAgICAgICAgLy9EdW1wKCJ2Zi5HZXRUeXBlcygpIiwgdmYuR2V0VHlwZXMoKSk7CisKKwkJICAgIEFzc2VydC5Jc1RydWUoIENvbXBhcmVUeXBlTGlzdHMoIGVUeXBlcywgdmYuR2V0VHlwZXMoKSApICk7CisKKwkJICAgIGZvcmVhY2ggKFhUeXBlIHQgaW4gZVR5cGVzKQorCQkJICAgIFRlc3RUeXBlKCB0ICk7CisJICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRHVtcChzdHJpbmcgdGl0bGUsIElDb2xsZWN0aW9uPFhUeXBlPiBjKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKHRpdGxlKyJbIik7CisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhUeXBlIHR5cGUgaW4gYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIl0iKTsKKyAgICAgICAgfQorICAgIAkKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBjb21wYXJlIHR3byBsaXN0cyBvZiB0eXBlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imxpc3QxIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imxpc3QyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIGJvb2wgQ29tcGFyZVR5cGVMaXN0cyhMaXN0PFhUeXBlPiBsaXN0MSwgSUNvbGxlY3Rpb248WFR5cGU+IGxpc3QyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGxpc3QxLkNvdW50ID09IDApICYmIChsaXN0Mi5Db3VudCA9PSAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gZmlyc3QgY29tcGFyZSBsZW5ndGgKKyAgICAgICAgICAgIGlmIChsaXN0MS5Db3VudCAhPSBsaXN0Mi5Db3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibGlzdHMgY291bnQgZGlmZmVyczogezB9IHYuIHsxfSIsIGxpc3QxLkNvdW50LCBsaXN0Mi5Db3VudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBlYWNoIGVsZW1lbnQgaW4gbGlzdDEgaXMgCisgICAgICAgICAgICAvLyBwcmVzZW50IGluIGxpc3QyIGFuZCB2aWNlIHZlcnNhCisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhUeXBlIG1lIGluIGxpc3QxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghbGlzdDIuQ29udGFpbnMobWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiFsaXN0Mi5Db250YWlucyh7MH0pIiwgbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIChYVHlwZSBtZSBpbiBsaXN0MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWxpc3QxLkNvbnRhaW5zKG1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIhbGlzdDEuQ29udGFpbnMoezB9KSIsIG1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29tcGFyZSB0d28gbGlzdHMgb2YgZmllbGRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGlzdDEiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGlzdDIiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgYm9vbCBDb21wYXJlRmllbGRMaXN0cyggTGlzdDxGaWVsZD4gbGlzdDEsIElDb2xsZWN0aW9uPEZpZWxkPiBsaXN0MiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCBsaXN0MS5Db3VudCA9PSAwICkgJiYgKCBsaXN0Mi5Db3VudCA9PSAwICkgKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBmaXJzdCBjb21wYXJlIGxlbmd0aAorICAgICAgICAgICAgaWYgKCBsaXN0MS5Db3VudCAhPSBsaXN0Mi5Db3VudCApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBlYWNoIGVsZW1lbnQgaW4gbGlzdDEgaXMgCisgICAgICAgICAgICAvLyBwcmVzZW50IGluIGxpc3QyCisgICAgICAgICAgICBmb3JlYWNoICggRmllbGQgbWUgaW4gbGlzdDEgKQorICAgICAgICAgICAgICAgIGlmICggIWxpc3QyLkNvbnRhaW5zKCBtZSApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisJICAgIHByaXZhdGUgTGlzdDxYVHlwZT4gTWtUeXBlU2V0KCBwYXJhbXMgWFR5cGVbXSB0eXBlcyApCisJICAgIHsKKwkJICAgIExpc3Q8WFR5cGU+IHNldCA9IG5ldyBMaXN0PFhUeXBlPigpOworCisJCSAgICBmb3JlYWNoIChYVHlwZSB0IGluIHR5cGVzKQorCQkJICAgIHNldC5BZGQoIHQgKTsKKworCQkgICAgcmV0dXJuIHNldDsKKwkgICAgfQorICAgIAkKKwkgICAgcHJpdmF0ZSB2b2lkIFRlc3RUeXBlKCBYVHlwZSB0eXBlICkKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIHR5cGUsIHZmLkdldFR5cGUoIHR5cGUuSWQgKSApOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIHR5cGUsIHZmLkdldFR5cGUoIHR5cGUuTmFtZSApICk7CisJICAgIH0KKyAgICAJCisJICAgIAorICAgIAkKKwkgICAgcHJpdmF0ZSBMaXN0PEZpZWxkPiBNa0ZpZWxkU2V0KCBwYXJhbXMgRmllbGRbXSBmaWVsZHMgKQorCSAgICB7CisJCSAgICBMaXN0PEZpZWxkPiBzZXQgPSBuZXcgTGlzdDxGaWVsZD4oKTsKKworCQkgICAgZm9yZWFjaCAoRmllbGQgZiBpbiBmaWVsZHMgKQorCQkJICAgIHNldC5BZGQoIGYgKTsKKworCQkgICAgcmV0dXJuIHNldDsKKwkgICAgfQorICAgIAkKKwkgICAgCisJICAgIAorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdF9FdGNoX1J1bnRpbWVFeGNlcHRpb25fZmllbGRzKCkKKwkgICAgeworCQkgICAgVGVzdFR5cGVGaWVsZHMoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZworCQkgICAgKTsKKyAgICAJCQorCQkgICAgVGVzdFR5cGVGaWVsZCgKKyAgICAgICAgICAgICAgICB2Zi5HZXRUeXBlKCJfRXRjaF9SdW50aW1lRXhjZXB0aW9uIiksCisJCQkgICAgRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfbXNnLAorCQkJICAgICJhYmMiCisJCSAgICApOwkJCQorCSAgICB9CisgICAgCQorCSAgICAKKwkgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiAodHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisJICAgIHB1YmxpYyB2b2lkIFRlc3RfRXRjaF9SdW50aW1lRXhjZXB0aW9uX21zZ19iYWRWYWx1ZSgpCisJICAgIHsKKwkJICAgIFRlc3RUeXBlRmllbGQoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZywKKwkJCSAgICAxMjMKKwkJICAgICk7CisJICAgIH0KKyAgICAJCisJICAgIAorCSAgICBbVGVzdF0KKyAgICAgICAgWyBFeHBlY3RlZEV4Y2VwdGlvbiAoIHR5cGVvZiggQXJndW1lbnRFeGNlcHRpb24gKSApIF0KKwkgICAgcHVibGljIHZvaWQgVGVzdF9FdGNoX1J1bnRpbWVFeGNlcHRpb25fYmFkRmllbGQoKQorCSAgICB7CisJCSAgICBUZXN0VHlwZUZpZWxkKAorICAgICAgICAgICAgICAgIHZmLkdldFR5cGUoIl9FdGNoX1J1bnRpbWVFeGNlcHRpb24iKSwKKwkJCSAgICBNeVZhbHVlRmFjdG9yeS5fbWZfYSwKKwkJCSAgICAiYWJjIgorCQkgICAgKTsJCisJICAgIH0KKyAgICAJCisJICAgIHByaXZhdGUgdm9pZCBUZXN0VHlwZUZpZWxkKCBYVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCwgT2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggdHlwZSwgdmYgKTsKKwkJICAgIG1zZy5BZGQoIGZpZWxkLCB2YWx1ZSApOworCSAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHZvaWQgVGVzdFR5cGVGaWVsZHMoIFhUeXBlIHR5cGUsIHBhcmFtcyBGaWVsZFtdIGZpZWxkcyApCisJICAgIHsKKwkJICAgIExpc3Q8RmllbGQ+IGFGaWVsZHMgPSB0eXBlLkdldEZpZWxkcygpOworCQkgICAgTGlzdDxGaWVsZD4gZUZpZWxkcyA9IE1rRmllbGRTZXQoIGZpZWxkcyApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggQ29tcGFyZUZpZWxkTGlzdHMoIGVGaWVsZHMsIGFGaWVsZHMgKSApOworCSAgICB9CisgICAgCQorCSAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RfRXRjaF9BdXRoRXhjZXB0aW9uX2ZpZWxkcygpCisJICAgIHsKKwkJICAgIFRlc3RUeXBlRmllbGRzKAorICAgICAgICAgICAgICAgIHZmLkdldFR5cGUoIl9FdGNoX0F1dGhFeGNlcHRpb24iKSwKKwkJCSAgICBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9tc2cKKwkJICAgICk7CisgICAgCQkKKwkJICAgIFRlc3RUeXBlRmllbGQoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX0V0Y2hfQXV0aEV4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZywKKwkJCSAgICAiYWJjIgorCQkgICAgKTsKKwkgICAgfQorICAgIAkKKwkgICAgCisJICAgIFtUZXN0XQorICAgICAgICBbIEV4cGVjdGVkRXhjZXB0aW9uICggdHlwZW9mKCBBcmd1bWVudEV4Y2VwdGlvbiApICkgXQorCSAgICBwdWJsaWMgdm9pZCBUZXN0X0V0Y2hfQXV0aEV4Y2VwdGlvbl9tc2dfYmFkVmFsdWUoKQorCSAgICB7CisJCSAgICBUZXN0VHlwZUZpZWxkKAorICAgICAgICAgICAgICAgIHZmLkdldFR5cGUoIl9FdGNoX0F1dGhFeGNlcHRpb24iKSwKKwkJCSAgICBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9tc2csCisJCQkgICAgMTIzCisJCSAgICApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdF9leGNlcHRpb25fZmllbGRzKCkKKwkgICAgeworCQkgICAgVGVzdFR5cGVGaWVsZHMoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX2V4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX3Jlc3VsdCwKKwkJCSAgICBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19pblJlcGx5VG8KKwkJICAgICk7CisgICAgCQkKKwkJICAgIFRlc3RUeXBlRmllbGQoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX2V4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX3Jlc3VsdCwKKwkJCSAgICBuZXcgRXhjZXB0aW9uKCkKKwkJICAgICk7CisgICAgCQkKKwkJICAgIFRlc3RUeXBlRmllbGQoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX2V4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQsCisJCQkgICAgMTIzTAorCQkgICAgKTsKKyAgICAJCQorCQkgICAgVGVzdFR5cGVGaWVsZCgKKyAgICAgICAgICAgICAgICB2Zi5HZXRUeXBlKCJfZXhjZXB0aW9uIiksCisJCQkgICAgRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX2luUmVwbHlUbywKKwkJCSAgICAxMjNMCisJCSAgICApOworCSAgICB9CisgICAgCQorCSAgICAKKwkgICAgW1Rlc3RdCisgICAgICAgIFsgRXhwZWN0ZWRFeGNlcHRpb24gKCB0eXBlb2YoIEFyZ3VtZW50RXhjZXB0aW9uICkgKSBdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RfZXhjZXB0aW9uX3Jlc3VsdF9iYWRWYWx1ZSgpCisJICAgIHsKKwkJICAgIFRlc3RUeXBlRmllbGQoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX2V4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX3Jlc3VsdCwKKwkJCSAgICAxMjMKKwkJICAgICk7CisJICAgIH0KKyAgICAJCisJICAgIAorCSAgICBbVGVzdF0KKyAgICAgICAgWyBFeHBlY3RlZEV4Y2VwdGlvbiAoIHR5cGVvZiggQXJndW1lbnRFeGNlcHRpb24gKSApIF0KKwkgICAgcHVibGljIHZvaWQgVGVzdF9leGNlcHRpb25fbWVzc2FnZUlkX2JhZFZhbHVlKCkKKwkgICAgeworCQkgICAgVGVzdFR5cGVGaWVsZCgKKyAgICAgICAgICAgICAgICB2Zi5HZXRUeXBlKCJfZXhjZXB0aW9uIiksCisJCQkgICAgRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwKKwkJCSAgICB0cnVlCisJCSAgICApOworCSAgICB9CisgICAgCQorCSAgICAKKwkgICAgW1Rlc3RdCisgICAgICAgIFsgRXhwZWN0ZWRFeGNlcHRpb24gKCB0eXBlb2YoIEFyZ3VtZW50RXhjZXB0aW9uICkgKSBdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RfZXhjZXB0aW9uX2luUmVwbHlUb19iYWRWYWx1ZSgpCisJICAgIHsKKwkJICAgIFRlc3RUeXBlRmllbGQoCisgICAgICAgICAgICAgICAgdmYuR2V0VHlwZSgiX2V4Y2VwdGlvbiIpLAorCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19pblJlcGx5VG8sCisJCQkgICAgImFiYyIKKwkJICAgICk7CisJICAgIH0KKworCSAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIEdldFR5cGVfbG9ja2VkKCkKKwkgICAgeworCQkgICAgQXNzZXJ0LklzTm90TnVsbCggdmYuR2V0VHlwZSggIngiICkgKTsKKwkJICAgIEFzc2VydC5Jc05vdE51bGwoIHZmLkdldFR5cGUoICJ5IiApICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHZmLkdldFR5cGUoImEiKSk7CisgICAgICAgICAgICB2Zi5Mb2NrRHluYW1pY1R5cGVzKCk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCB2Zi5HZXRUeXBlKCAiYiIgKSApOworCSAgICB9CisKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBHZXRGaWVsZF9sb2NrZWQoKQorCSAgICB7CisJCSAgICBYVHlwZSB0eXBlID0gbmV3IFhUeXBlKCJibGFoIik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoIHR5cGUuR2V0RmllbGQoICJhIiApICk7CisJCSAgICBBc3NlcnQuSXNOb3ROdWxsKCB0eXBlLkdldEZpZWxkKCAiYiIgKSApOworICAgICAgICAgICAgdHlwZS5Mb2NrKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHR5cGUuR2V0RmllbGQoImEiKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHR5cGUuR2V0RmllbGQoImIiKSk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCB0eXBlLkdldEZpZWxkKCAieCIgKSApOworCQkgICAgQXNzZXJ0LklzTnVsbCggdHlwZS5HZXRGaWVsZCggInkiICkgKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRGaWVsZF9JZF9NZXNzYWdlSWQoKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIl9tZXNzYWdlSWQiLCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkLk5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE2NjEzODM3ODQsIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQuSWQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldEZpZWxkX0lkX0luUmVwbHlUbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiX2luUmVwbHlUbyIsIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19pblJlcGx5VG8uTmFtZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTMwNzcwNTQzNCxEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9faW5SZXBseVRvLklkKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gU1RSSU5HIEVOQ09ESU5HIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRTdHJpbmdFbmNvZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVuY29kaW5nIGVuYyA9IHZmLkdldFN0cmluZ0VuY29kaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGVuYy5HZXRTdHJpbmcoZW5jLkdldEJ5dGVzKCJhYmMiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiYyIsIHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBNRVNTQUdFIElEIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgTWVzc2FnZUlkKCkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgWFR5cGUgbXRfZm9vID0gbmV3IFhUeXBlKCAiZm9vIiApOworICAgICAgICAgICAgbXRfZm9vLlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggbXRfZm9vLCB2ZiApOworCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHZmLkdldE1lc3NhZ2VJZChtc2cpKTsKKworICAgICAgICAgICAgdmYuU2V0TWVzc2FnZUlkKG1zZywgMjM0TCk7CisKKyAgICAgICAgICAgIGxvbmcgbXNnaWQgPSAobG9uZykgdmYuR2V0TWVzc2FnZUlkKG1zZyk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKG1zZ2lkKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMzRMLCBtc2dpZCk7CisKKyAgICAgICAgICAgIHZmLlNldE1lc3NhZ2VJZChtc2csIG51bGwpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHZmLkdldE1lc3NhZ2VJZChtc2cpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIElOIFJFUExZIFRPIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEluUmVwbHlUbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhUeXBlIG10X2ZvbyA9IG5ldyBYVHlwZSggImZvbyIgKTsKKyAgICAgICAgICAgIG10X2Zvby5QdXRWYWxpZGF0b3IoIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10X2ZvbywgdmYgKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggdmYuR2V0SW5SZXBseVRvKCBtc2cgKSApOworCisgICAgICAgICAgICB2Zi5TZXRJblJlcGx5VG8oIG1zZywgMjM0TCApOworCisgICAgICAgICAgICBsb25nPyBtc2dpZCA9IHZmLkdldEluUmVwbHlUbyggbXNnICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKCBtc2dpZCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAyMzRMLCBtc2dpZCApOworCisgICAgICAgICAgICB2Zi5TZXRJblJlcGx5VG8oIG1zZywgbnVsbCApOworCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCB2Zi5HZXRJblJlcGx5VG8oIG1zZyApICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIFZBTFVFIENPTlZFUlNJT04gLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBFeHBvcnRDdXN0b21WYWx1ZV9SdW50aW1lRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZXB0aW9uIHZhbHVlID0gbmV3IE51bGxSZWZlcmVuY2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gdmYuRXhwb3J0Q3VzdG9tVmFsdWUodmFsdWUpOworICAgICAgICAgICAgc3YuQ2hlY2tUeXBlKHZmLkdldFR5cGUoIl9FdGNoX1J1bnRpbWVFeGNlcHRpb24iKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgc3YuQ291bnQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJTeXN0ZW0uTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbjogT2JqZWN0IHJlZmVyZW5jZSBub3Qgc2V0IHRvIGFuIGluc3RhbmNlIG9mIGFuIG9iamVjdC4iLAorICAgICAgICAgICAgICAgIHN2LkdldChEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9tc2cpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBFeHBvcnRDdXN0b21WYWx1ZV9SdW50aW1lRXhjZXB0aW9uX21zZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiB2YWx1ZSA9IG5ldyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uKCJmb28gIT0gbnVsbCIpOworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSB2Zi5FeHBvcnRDdXN0b21WYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICBzdi5DaGVja1R5cGUodmYuR2V0VHlwZSgiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBzdi5Db3VudCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlN5c3RlbS5OdWxsUmVmZXJlbmNlRXhjZXB0aW9uOiBmb28gIT0gbnVsbCIsCisgICAgICAgICAgICAgICAgc3YuR2V0KERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZykpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV4cG9ydEN1c3RvbVZhbHVlX09iamVjdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIHZmLkV4cG9ydEN1c3RvbVZhbHVlKCB2YWx1ZSApICk7CisgICAgICAgICAgICAvLyBjYW5ub3QgZXhwb3J0IHVuc3VwcG9ydGVkIFhUeXBlCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgSW1wb3J0Q3VzdG9tVmFsdWVfRXRjaF9SdW50aW1lRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUodmYuR2V0VHlwZSgiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIpLCB2Zik7CisgICAgICAgICAgICBfRXRjaF9SdW50aW1lRXhjZXB0aW9uIGUgPSAoX0V0Y2hfUnVudGltZUV4Y2VwdGlvbikgdmYuSW1wb3J0Q3VzdG9tVmFsdWUoc3YpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChlKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoZS5tc2cpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEltcG9ydEN1c3RvbVZhbHVlX0V0Y2hfUnVudGltZUV4Y2VwdGlvbl9tc2coKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSh2Zi5HZXRUeXBlKCJfRXRjaF9SdW50aW1lRXhjZXB0aW9uIiksIHZmKTsKKyAgICAgICAgICAgIHN2W0RlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZ10gPSAiZm9vIjsKKyAgICAgICAgICAgIF9FdGNoX1J1bnRpbWVFeGNlcHRpb24gZSA9IChfRXRjaF9SdW50aW1lRXhjZXB0aW9uKSB2Zi5JbXBvcnRDdXN0b21WYWx1ZShzdik7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJmb28iLCBlLm1zZyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgSW1wb3J0Q3VzdG9tVmFsdWVfVW5rbm93bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCB2Zi5HZXRUeXBlKCAieCIgKSwgdmYgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIHZmLkltcG9ydEN1c3RvbVZhbHVlKCBzdiApICk7CisgICAgICAgICAgICAvLyBjYW5ub3QgdXNpbmcgdW5zdXBwb3J0ZWQgWFR5cGUKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgZmFrZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWZhdWx0VmFsdWVGYWN0b3J5IGZvciB0ZXN0aW5nCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjbGFzcyBNeVZhbHVlRmFjdG9yeSA6IERlZmF1bHRWYWx1ZUZhY3RvcnkKKwkgICAgeworCQkgICAgcHJpdmF0ZSByZWFkb25seSBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisKKwkJICAgCisKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSA9IAorICAgICAgICAgICAgICAgIG5ldyBDbGFzczJUeXBlTWFwKCk7CisKKwkJICAgIAorICAgIAkJCisJCSAgICAvLyBkZWZpbmUgb3VyIHR5cGVzIGFuZCBmaWVsZHMgaGVyZToKKyAgICAJCQorCQkgICAgLyoqIHR5cGUgeCAqLworCQkgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBYVHlwZSBfbXRfeCA9IHR5cGVzLkdldCggIngiICk7CisgICAgCQkKKwkJICAgIC8qKiB0eXBlIHkgKi8KKwkJICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgWFR5cGUgX210X3kgPSB0eXBlcy5HZXQoICJ5IiApOworICAgIAkJCisJCSAgICAvKiogZmllbGQgYSAqLworCQkgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBfbWZfYSA9IG5ldyBGaWVsZCggImEiICk7CisgICAgCQkKKwkJICAgIC8qKiBmaWVsZCBiICovCisJCSAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGljIEZpZWxkIF9tZl9iID0gbmV3IEZpZWxkKCAiYiIgKTsKKworICAgICAgICAgICAgc3RhdGljIE15VmFsdWVGYWN0b3J5KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWVGYWN0b3J5LkluaXQodHlwZXMsIGNsYXNzMnR5cGUpOworICAgICAgICAgICAgICAgIHR5cGVzLkxvY2soKTsKKyAgICAgICAgICAgICAgICBjbGFzczJ0eXBlLkxvY2soKTsKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAJCQorCQkgICAgLyoqCisJCSAgICAgKiBDb25zdHJ1Y3RzIHRoZSBWYWx1ZUZhY3RvcnlGYWtlLgorCQkgICAgICovCisJCSAgICBwdWJsaWMgTXlWYWx1ZUZhY3RvcnkoKTogYmFzZSgibm9uZToiLHR5cGVzLGNsYXNzMnR5cGUpCisJCSAgICB7CisJCQkgICAgLy8gbm90aGluZyB0byBkby4KKwkJICAgIH0KKworICAgICAgICAgICAKKworCSAgICB9CisgICAgICAgIAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdEZyZWVQb29sLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RGcmVlUG9vbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZhYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RGcmVlUG9vbC5jcwpAQCAtMCwwICsxLDMwMSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdEZyZWVQb29sCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBRMSA9IDMwOyAvLyAxIHF1YW50YSBvZiByZWxpYWJsZSBjbG9jayB0aWNrCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFEyID0gNjA7IC8vIDIgcXVhbnRhIG9mIHJlbGlhYmxlIGNsb2NrIHRpY2sKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgUTMgPSA5MDsgLy8gMyBxdWFudGEgb2YgcmVsaWFibGUgY2xvY2sgdGljaworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZTEoKQorICAgICAgICB7CisgICAgICAgICAgICBGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKDIpOworICAgICAgICAgICAgcC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZyZWUgcG9vbCB0aHJlYWQgY291bnQgZXhjZWVkZWQgb3IgcG9vbCBjbG9zZWQKKyAgICAgICAgICAgIEZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woMik7CisgICAgICAgICAgICBwLkNsb3NlKCk7CisKKyAgICAgICAgICAgIE15UG9vbFJ1bm5hYmxlIHIgPSBuZXcgTXlQb29sUnVubmFibGUoMCwgZmFsc2UpOworICAgICAgICAgICAgcC5SdW4oci5ydW4sIHIuZXhjZXB0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZTMoKQorICAgICAgICB7CisgICAgICAgICAgICBGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKDIpOworICAgICAgICAgICAgcC5DbG9zZSgpOworICAgICAgICAgICAgcC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIGpvaW4xKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZnJlZSBwb29sIHRocmVhZCBjb3VudCBleGNlZWRlZCBvciBwb29sIGNsb3NlZAorICAgICAgICAgICAgRnJlZVBvb2wgcCA9IG5ldyBGcmVlUG9vbCgyKTsKKyAgICAgICAgICAgIHAuSm9pbigpOworCisgICAgICAgICAgICBNeVBvb2xSdW5uYWJsZSByID0gbmV3IE15UG9vbFJ1bm5hYmxlKDAsIGZhbHNlKTsKKyAgICAgICAgICAgIHAuUnVuKHIucnVuLCByLmV4Y2VwdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgam9pbjIoKQorICAgICAgICB7CisgICAgICAgICAgICBGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKDIpOworCisgICAgICAgICAgICBNeVBvb2xSdW5uYWJsZSByID0gbmV3IE15UG9vbFJ1bm5hYmxlKDAsIGZhbHNlKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHIuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIuZXgpOworICAgICAgICAgICAgcC5SdW4oci5ydW4sIHIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcChRMik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHIuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIuZXgpOworICAgICAgICAgICAgcC5Kb2luKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgam9pbjMoKQorICAgICAgICB7CisgICAgICAgICAgICBGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKDIpOworCisgICAgICAgICAgICBNeVBvb2xSdW5uYWJsZSByID0gbmV3IE15UG9vbFJ1bm5hYmxlKFExLCBmYWxzZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyLmV4KTsKKyAgICAgICAgICAgIHAuUnVuKHIucnVuLCByLmV4Y2VwdGlvbik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyLmV4KTsKKyAgICAgICAgICAgIHAuSm9pbigpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyLmV4KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBydW4xKCkKKyAgICAgICAgeworICAgICAgICAgICAgRnJlZVBvb2wgcCA9IG5ldyBGcmVlUG9vbCgyKTsKKworICAgICAgICAgICAgTXlQb29sUnVubmFibGUgciA9IG5ldyBNeVBvb2xSdW5uYWJsZSgwLCBmYWxzZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyLmV4KTsKKworICAgICAgICAgICAgcC5SdW4oci5ydW4sIHIuZXhjZXB0aW9uKTsKKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKFExKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoci5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoci5leCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woMik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE15UG9vbFJ1bm5hYmxlIHIgPSBuZXcgTXlQb29sUnVubmFibGUoMCwgZmFsc2UpOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHIuZG9uZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyLmV4KTsKKworICAgICAgICAgICAgICAgIHAuUnVuKHIucnVuLCByLmV4Y2VwdGlvbik7CisKKyAgICAgICAgICAgICAgICBUaHJlYWQuU2xlZXAoUTEpOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoci5kb25lKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIuZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bjMoKQorICAgICAgICB7CisgICAgICAgICAgICBGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKDIpOworCisgICAgICAgICAgICBNeVBvb2xSdW5uYWJsZSByID0gbmV3IE15UG9vbFJ1bm5hYmxlKDAsIHRydWUpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2Uoci5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoci5leCk7CisKKyAgICAgICAgICAgIHAuUnVuKHIucnVuLCByLmV4Y2VwdGlvbik7CisKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcChRMSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyLmV4KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBydW40KCkKKyAgICAgICAgeworICAgICAgICAgICAgRnJlZVBvb2wgcCA9IG5ldyBGcmVlUG9vbCgyKTsKKworICAgICAgICAgICAgTXlQb29sUnVubmFibGUgciA9IG5ldyBNeVBvb2xSdW5uYWJsZShRMiwgZmFsc2UpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2Uoci5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoci5leCk7CisKKyAgICAgICAgICAgIHAuUnVuKHIucnVuLCByLmV4Y2VwdGlvbik7CisKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcChRMSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyLmV4KTsKKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKFEzKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoci5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoci5leCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuNSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woMik7CisKKyAgICAgICAgICAgIE15UG9vbFJ1bm5hYmxlIHIxID0gbmV3IE15UG9vbFJ1bm5hYmxlKFEyLCBmYWxzZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyMS5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwocjEuZXgpOworCisgICAgICAgICAgICBNeVBvb2xSdW5uYWJsZSByMiA9IG5ldyBNeVBvb2xSdW5uYWJsZShRMiwgZmFsc2UpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocjIuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIyLmV4KTsKKworICAgICAgICAgICAgcC5SdW4ocjEucnVuLCByMS5leGNlcHRpb24pOworICAgICAgICAgICAgcC5SdW4ocjIucnVuLCByMi5leGNlcHRpb24pOworCisgICAgICAgICAgICBUaHJlYWQuU2xlZXAoUTEpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocjEuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIxLmV4KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocjIuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIyLmV4KTsKKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKFEzKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocjEuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIxLmV4KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyMi5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwocjIuZXgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bjYoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmcmVlIHBvb2wgdGhyZWFkIGNvdW50IGV4Y2VlZGVkCisgICAgICAgICAgICBGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKDIpOworCisgICAgICAgICAgICBNeVBvb2xSdW5uYWJsZSByMSA9IG5ldyBNeVBvb2xSdW5uYWJsZShRMiwgZmFsc2UpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocjEuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIxLmV4KTsKKworICAgICAgICAgICAgTXlQb29sUnVubmFibGUgcjIgPSBuZXcgTXlQb29sUnVubmFibGUoUTIsIGZhbHNlKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHIyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyMi5leCk7CisKKyAgICAgICAgICAgIE15UG9vbFJ1bm5hYmxlIHIzID0gbmV3IE15UG9vbFJ1bm5hYmxlKFEyLCBmYWxzZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyMy5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwocjMuZXgpOworCisgICAgICAgICAgICBwLlJ1bihyMS5ydW4sIHIxLmV4Y2VwdGlvbik7CisgICAgICAgICAgICBwLlJ1bihyMi5ydW4sIHIyLmV4Y2VwdGlvbik7CisgICAgICAgICAgICBwLlJ1bihyMy5ydW4sIHIzLmV4Y2VwdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuNygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woMik7CisKKyAgICAgICAgICAgIE15UG9vbFJ1bm5hYmxlIHIxID0gbmV3IE15UG9vbFJ1bm5hYmxlKFEyLCBmYWxzZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyMS5kb25lKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwocjEuZXgpOworCisgICAgICAgICAgICBNeVBvb2xSdW5uYWJsZSByMiA9IG5ldyBNeVBvb2xSdW5uYWJsZShRMiwgZmFsc2UpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocjIuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIyLmV4KTsKKworICAgICAgICAgICAgTXlQb29sUnVubmFibGUgcjMgPSBuZXcgTXlQb29sUnVubmFibGUoUTIsIGZhbHNlKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHIzLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyMy5leCk7CisKKyAgICAgICAgICAgIHAuUnVuKHIxLnJ1biwgcjEuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHAuUnVuKHIyLnJ1biwgcjIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHRyeSB7IHAuUnVuKHIzLnJ1biwgcjMuZXhjZXB0aW9uKTsgfSBjYXRjaCAoRXhjZXB0aW9uKSB7IH0KKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKFExKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHIxLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyMS5leCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHIyLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyMi5leCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHIzLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyMy5leCk7CisKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcChRMyk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHIxLmRvbmUpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyMS5leCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocjIuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIyLmV4KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocjMuZG9uZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHIzLmV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIE15UG9vbFJ1bm5hYmxlCisgICAgeworICAgICAgICBwdWJsaWMgTXlQb29sUnVubmFibGUoIGludCBkZWxheSwgYm9vbCBleGNwICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5kZWxheSA9IGRlbGF5OworICAgICAgICAgICAgdGhpcy5leGNwID0gZXhjcDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGRlbGF5OworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBleGNwOworCisgICAgICAgIHB1YmxpYyBib29sIGRvbmU7CisKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvbiBleDsKKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGVsYXkgPiAwKQorICAgICAgICAgICAgICAgIFRocmVhZC5TbGVlcChkZWxheSk7CisgICAgICAgICAgICBpZiAoZXhjcCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGV4Y2VwdGlvbiggRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBleCA9IGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFJlbW90ZUJhc2UuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFJlbW90ZUJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4ZmRjZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0UmVtb3RlQmFzZS5jcwpAQCAtMCwwICsxLDI4OSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworLy91c2luZyBFdGNoLlN1cHBvcnQ7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFJlbW90ZUJhc2UgOiBSZW1vdGVCYXNlCisgICAgeworICAgICAgICAKKyAgICAgICAgcHVibGljIFRlc3RSZW1vdGVCYXNlKCkgOiB0aGlzKG5ldyBNeURlbGl2ZXJ5U2VydmljZSgpLG5ldyBNeURlZmF1bHRWYWx1ZUZhY3RvcnkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdFJlbW90ZUJhc2UoTXlEZWxpdmVyeVNlcnZpY2Ugc3ZjLCBNeURlZmF1bHRWYWx1ZUZhY3RvcnkgdmYpIDogYmFzZShzdmMsdmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc3ZjID0gc3ZjOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RSZW1vdGVCYXNlIiApOworICAgICAgICB9CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0KCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ZjLndoYXQgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhtc2cgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhyZXNwb25zZVR5cGUgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhyZXNwb25zZUZpZWxkID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54dGltZW91dCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE15RGVsaXZlcnlTZXJ2aWNlIHN2YzsKKyAgICAgLyogICBwcml2YXRlIHN0YXRpYyBNeURlbGl2ZXJ5U2VydmljZSBzdmMgPSBuZXcgTXlEZWxpdmVyeVNlcnZpY2UoKTsgLy9kZWNsYXJlZCBzdGF0aWMKKyAgICAgICAgLy9wcml2YXRlIHN0YXRpYyBEZWZhdWx0VmFsdWVGYWN0b3J5IHZmID0gbmV3IERlZmF1bHRWYWx1ZUZhY3RvcnkoKTsvL2RlY2xhcmVkIHN0YXRpYworICAgICAgICBwcml2YXRlIHN0YXRpYyBNeURlZmF1bHRWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgTXlEZWZhdWx0VmFsdWVGYWN0b3J5KCk7IAorICAgICAgICBwcml2YXRlIFJlbW90ZUJhc2UgcmIgPSBuZXcgUmVtb3RlQmFzZShzdmMsIHZmKTsgKi8KKyAgICAJcHJpdmF0ZSBYVHlwZSBtdCA9IG5ldyBYVHlwZSggImZvbyIgKTsKKyAgICAJcHJpdmF0ZSBYVHlwZSBybXQgPSBuZXcgWFR5cGUoICJiYXIiICk7CisgICAgCXByaXZhdGUgRmllbGQgcm1mID0gbmV3IEZpZWxkKCAiYmF6IiApOworCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgTmV3TWVzc2FnZSgpCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gX05ld01lc3NhZ2UoIG10ICk7CisJCSAgICBtc2cuQ2hlY2tUeXBlKCBtdCApOworCQkgICAKKwkJICAgIEFzc2VydC5Jc051bGwoIHN2Yy53aGF0ICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBzdmMueG1zZyApOworCQkgICAgQXNzZXJ0LklzTnVsbCggc3ZjLnhyZXNwb25zZVR5cGUgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIHN2Yy54cmVzcG9uc2VGaWVsZCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBzdmMueHRpbWVvdXQgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFNlbmQoKSAKKwkgICAgeworCisJCSAgICBNZXNzYWdlIG1zZyA9IF9OZXdNZXNzYWdlKCBtdCApOworICAgIAkJCisJCSAgICBfU2VuZCggbXNnICk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCBzdmMud2hhdC5FcXVhbHMoV2hhdC5TRU5EKSk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggc3ZjLnhtc2csIG1zZyApOworCQkgICAgQXNzZXJ0LklzTnVsbCggc3ZjLnhyZXNwb25zZVR5cGUgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIHN2Yy54cmVzcG9uc2VGaWVsZCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBzdmMueHRpbWVvdXQgKTsKKwkgICAgfQorICAgIAkKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIENhbGwoKSAKKwkgICAgeworCQkgICAgTWVzc2FnZSBtc2cgPSBfTmV3TWVzc2FnZSggbXQgKTsKKworICAgICAgICAgICAgcm10LlJlc3BvbnNlRmllbGQgPSBybWY7CisgICAgICAgICAgICBybXQuVGltZW91dCA9IDk4OworCisgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gX0VuZENhbGwoIF9CZWdpbkNhbGwoIG1zZyApLCBybXQgKTsKKworCQkgICAgQXNzZXJ0LklzVHJ1ZSggc3ZjLndoYXQuRXF1YWxzKFdoYXQuQ0FMTCkpOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIHN2Yy54bXNnLCBtc2cgKTsKKwkJICAgIEFzc2VydC5BcmVTYW1lKCBzdmMueHJlc3BvbnNlVHlwZSwgcm10ICk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggc3ZjLnhyZXNwb25zZUZpZWxkLCBybWYgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggc3ZjLnh0aW1lb3V0LCA5OCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCByZXN1bHQsIDIzICk7CisJICAgIH0KKyAgICAJCisJICAgIHB1YmxpYyBlbnVtIFdoYXQgeyBTRU5ELCBDQUxMLCBTSFVURE9XTiwgQkVHSU5DQUxMIH07CisgICAgCQorCSAgICBwdWJsaWMgY2xhc3MgTXlEZWxpdmVyeVNlcnZpY2UgOiBEZWxpdmVyeVNlcnZpY2UsIE1haWxib3hNYW5hZ2VyCisJICAgIHsKKworICAgICAgICAgICAgcHVibGljIEVudW0gd2hhdDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIHZvaWQgSW5pdCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IG51bGw7CisgICAgICAgICAgICB9CisKKwkJICAgIHB1YmxpYyBNZXNzYWdlIHhtc2c7CisJCSAgICBwdWJsaWMgWFR5cGUgeHJlc3BvbnNlVHlwZTsKKwkJICAgIHB1YmxpYyBGaWVsZCB4cmVzcG9uc2VGaWVsZDsKKwkJICAgIHB1YmxpYyBpbnQgeHRpbWVvdXQ7CisgICAgICAgICAgICBwdWJsaWMgTWFpbGJveCB4bWI7CisgICAgCQkKKwkJICAgIHB1YmxpYyB2b2lkIFNlbmQoIE1lc3NhZ2UgbXNnICkgCisJCSAgICB7CisJCQkgICAgQXNzZXJ0LklzTnVsbCggd2hhdCApOworCQkJICAgIHdoYXQgPSBXaGF0LlNFTkQ7CisJCQkgICAgdGhpcy54bXNnID0gbXNnOworCQkgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTWFpbGJveCBCZWdpbkNhbGwoIE1lc3NhZ2UgbXNnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0KCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggd2hhdCApOworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0LkJFR0lOQ0FMTDsKKyAgICAgICAgICAgICAgICB0aGlzLnhtc2cgPSBtc2c7CisgICAgICAgICAgICAgICAgdGhpcy54bWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDBMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54bWI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgRW5kQ2FsbCggTWFpbGJveCBtYiwgWFR5cGUgcmVzcG9uc2VUeXBlICkgCisJCSAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBXaGF0LkJFR0lOQ0FMTCwgd2hhdCApOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggeG1iLCBtYiApOworCQkJICAgIHdoYXQgPSBXaGF0LkNBTEw7CisgICAgICAgICAgICAgICAgeG1iID0gbnVsbDsKKwkJCSAgICB0aGlzLnhyZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7CisgICAgICAgICAgICAgICAgdGhpcy54cmVzcG9uc2VGaWVsZCA9IHJlc3BvbnNlVHlwZS5SZXNwb25zZUZpZWxkOworCQkJICAgIHRoaXMueHRpbWVvdXQgPSByZXNwb25zZVR5cGUuVGltZW91dDsKKwkJCSAgICByZXR1cm4gMjM7CisJCSAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50T2JqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBUcmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFJlZGVsaXZlcihXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgVW5yZWdpc3RlcihNYWlsYm94IG1iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0TWVzc2FnZSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE1lc3NhZ2UoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCh3aGF0KTsKKyAgICAgICAgICAgICAgICB3aGF0ID0gV2hhdC5TRU5EOworICAgICAgICAgICAgICAgIHRoaXMueG1zZyA9IG1zZzsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25NZXNzYWdlPiBNZW1iZXJzCisKKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2V0U2Vzc2lvbihTZXNzaW9uTWVzc2FnZSBzZXNzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNlc3Npb25NZXNzYWdlIEdldFNlc3Npb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb25NZXNzYWdlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIGJvb2wgU2Vzc2lvbk1lc3NhZ2UoV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgU2Vzc2lvblF1ZXJ5KG9iamVjdCBxdWVyeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Db250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uTm90aWZ5KG9iamVjdCBldmVudE9iaikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworCisKKyAgICAgICAgICAgICNyZWdpb24gTWFpbGJveE1hbmFnZXIgTWVtYmVycworCisKKyAgICAgICAgICAgIHB1YmxpYyBNYWlsYm94IFRyYW5zcG9ydENhbGwoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGZha2UgaW1wbGVtZW50YXRpb24gb2YgRGVmYXVsdFZhbHVlRmFjdG9yeSBmb3IgdGVzdGluZworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gCisJICAgIHB1YmxpYyBjbGFzcyBNeURlZmF1bHRWYWx1ZUZhY3RvcnkgOiBEZWZhdWx0VmFsdWVGYWN0b3J5CisJICAgIHsKKwkJICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCisJCSAgICAKKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdGF0aWMgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlID0gCisgICAgICAgICAgICAgICAgbmV3IENsYXNzMlR5cGVNYXAoKTsKKworCQkgICAgc3RhdGljIE15RGVmYXVsdFZhbHVlRmFjdG9yeSgpCisJCSAgICB7CisgICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlRmFjdG9yeS5Jbml0KCB0eXBlcywgY2xhc3MydHlwZSApOworCQkgICAgfQorCisJCSAgICAvKioKKwkJICAgICAqIENvbnN0cnVjdHMgdGhlIFZhbHVlRmFjdG9yeUZha2UuCisJCSAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBNeURlZmF1bHRWYWx1ZUZhY3RvcnkoKSA6IGJhc2UoIm5vbmU6Iix0eXBlcywgY2xhc3MydHlwZSkKKwkJICAgIHsKKwkJICAgIAorCQkgICAgfQorCisJCSAgIAorCisgICAgICAgICAgIAorCSAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFN0dWJCYXNlLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RTdHViQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmU1NzcwCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RTdHViQmFzZS5jcwpAQCAtMCwwICsxLDE3NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFN0dWJCYXNlCisgICAgeworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RTdHViQmFzZSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBlbnVtIFdoYXQgCisgICAgICAgIHsgCisgICAgICAgICAgICAvKiogd2FudGVkIG1lc3NhZ2UgZGVsaXZlcmVkICovIFVOV0FOVEVEIAorICAgICAgICB9OworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBOb3RoaW5nKCkKKyAgICAgICAgeyB9CisKKyAgICAgICAgLy9bVGVzdF0gCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbigiU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iKV0KKyAgICAgICAgcHVibGljIHZvaWQgVW53YW50ZWQzKCkKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICAgICAgRGVsaXZlcnlTZXJ2aWNlIHNyYyA9IG5ldyBNeU1lc3NhZ2VTb3VyY2UoKTsKKyAgICAgICAgICAgIFN0dWJCYXNlIHNiID0gbmV3IFN0dWJCYXNlKCBzcmMsIG9iaiwgbnVsbCwgbnVsbCApOworCisgICAgICAgICAgICBXaG8gc2VuZGVyID0gbmV3IE15V2hvKCk7IAorICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZShudWxsLCBudWxsKTsKKworICAgICAgICAgICAgc2IuU2Vzc2lvbk1lc3NhZ2Uoc2VuZGVyLCBtc2cpOworICAgICAgICAgICBBc3NlcnQuRmFpbCgiZGVsaXZlcnkgb2YgdW53YW50ZWQgbWVzc2FnZSBzaG91bGQgZmFpbCIpOworICAgICAgICB9CisKKyAgICAgICAgLy9bVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCJTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiIpXQorICAgICAgICBwdWJsaWMgdm9pZCBVbndhbnRlZDQoKQorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gbmV3IE9iamVjdCgpOworCisgICAgICAgICAgICBEZWxpdmVyeVNlcnZpY2Ugc3JjID0gbmV3IE15TWVzc2FnZVNvdXJjZSgpOworICAgICAgICAgICAgU3R1YkJhc2Ugc2IgPSBuZXcgU3R1YkJhc2UoIHNyYywgb2JqLCBudWxsLCBudWxsICk7CisKKyAgICAgICAgICAgIFdobyBzZW5kZXIgPSBuZXcgTXlXaG8oKTsgCisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKG51bGwsIG51bGwpOworCisgICAgICAgICAgICBzYi5TZXNzaW9uTWVzc2FnZShzZW5kZXIsIG1zZyk7CisgICAgICAgICAgICBBc3NlcnQuRmFpbCgiZGVsaXZlcnkgb2YgdW53YW50ZWQgbWVzc2FnZSBzaG91bGQgZmFpbCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15TWVzc2FnZVNvdXJjZSA6IERlbGl2ZXJ5U2VydmljZQorICAgICAgICB7CisKKyAgICAgICAgICAgCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0TWVzc2FnZSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE1lc3NhZ2UoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIm5vdCBuZWVkZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydDxTZXNzaW9uTWVzc2FnZT4gTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFRyYW5zcG9ydFF1ZXJ5KG9iamVjdCBxdWVyeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydENvbnRyb2wob2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeShvYmplY3QgZXZlbnRPYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25NZXNzYWdlIHNlc3Npb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gRGVsaXZlcnlTZXJ2aWNlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIE1haWxib3ggQmVnaW5DYWxsKE1lc3NhZ2UgbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBFbmRDYWxsKE1haWxib3ggbWIsIFhUeXBlIHJlc3BvbnNlVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uTWVzc2FnZSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIFNlc3Npb25NZXNzYWdlKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb24gTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFNlc3Npb25RdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uQ29udHJvbChvYmplY3QgY29udHJvbCwgb2JqZWN0IHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeShvYmplY3QgZXZlbnRPYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25NZXNzYWdlPiBNZW1iZXJzCisKKworICAgICAgICAgICAgcHVibGljIFNlc3Npb25NZXNzYWdlIEdldFNlc3Npb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15V2hvIDogV2hvCisgICAgeworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFRvZG9NYW5hZ2VyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RUb2RvTWFuYWdlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI0ZjVkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RUb2RvTWFuYWdlci5jcwpAQCAtMCwwICsxLDIwOSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFRvZG9NYW5hZ2VyCisgICAgeworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdFRvZG9NYW5hZ2VyIiApOworICAgICAgICB9CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE15VG9kby5SZXNldEdsb2JhbElkKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE1hbmFnZXJOb3RTdGFydGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgVG9kb01hbmFnZXIgbWdyID0gbmV3IFRvZG9NYW5hZ2VyKCA1MCwgMTAsIDEsIDUsIDUwMDAsIDEgKTsKKyAgICAgICAgICAgIG1nci5BZGQoIG5ldyBNeVRvZG8oKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBFeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0U2h1dERvd24oKQorICAgICAgICB7CisgICAgICAgICAgICBUb2RvTWFuYWdlciBtZ3IgPSBUb2RvTWFuYWdlci5HZXRUb2RvTWFuYWdlcigpOworICAgICAgICAgICAgbWdyLkFkZCggbmV3IE15VG9kbygpICk7CisKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyLlNodXREb3duKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGFkZGluZyBhZnRlciBzaHV0dGluZyBkb3duIHNob3VsZCBjYXVzZSBleGNlcHRpb24KKyAgICAgICAgICAgIG1nci5BZGQoIG5ldyBNeVRvZG8oKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RXb3JrZXJzQW5kRW50cmllcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyIG1nciA9IG5ldyBUb2RvTWFuYWdlciggNTAsIDEwLCAxLCA1LCA1MDAwLCAxICk7CisgICAgICAgICAgICBtZ3IuU3RhcnQoKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBtZ3IuTnVtRW50cmllcygpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIG1nci5OdW1Xb3JrZXJzKCkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbWdyLkFkZCggbmV3IE15VG9kbygpICk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgbWdyLk51bUVudHJpZXMoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBtZ3IuTnVtV29ya2VycygpICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGV4cGVyaW1lbnQgd2l0aCBhIHRvdGFsIG9mIDUwIGVudHJpZXMuCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCA0OTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZ3IuQWRkKCBuZXcgTXlUb2RvKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA1MCwgTXlUb2RvLkxhc3RJZEdlbmVyYXRlZCgpICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFdhaXRUaWxsQ29tcGxldGUoIDQwMDAgKTsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKCA1LCBtZ3IuTnVtV29ya2VycygpICk7CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdGVzdCBpZiBhbGwgdG9kbydzIHdlcmUgZXhlY3V0ZWQuIAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBtZ3IuTnVtRW50cmllcygpICk7CisKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyLlNodXREb3duKCk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTZXBhcmF0ZVRocmVhZHMoKQorICAgICAgICB7CisgICAgICAgICAgICBUb2RvTWFuYWdlciBtZ3IgPSBUb2RvTWFuYWdlci5HZXRUb2RvTWFuYWdlcigpOworICAgICAgICAgICAgVG9kb01hbmFnZXIuR2V0VG9kb01hbmFnZXIoKS5BZGQoIG5ldyBNeVRvZG8oKSApOworCisgICAgICAgICAgICAvLyBTdGFydCBhbm90aGVyIHRocmVhZCB0byBhZGQgaXRlbXMgdG8gdGhlIHRvZG9tYW5hZ2VyLiAKKyAgICAgICAgICAgICggbmV3IFRocmVhZCggbmV3IFRocmVhZFN0YXJ0KCBBZGRVc2luZ0RpZmZlcmVudFRocmVhZCApICkgKS5TdGFydCgpOworCisgICAgICAgICAgICAvLyBzaW1wbGUgImxvY2siCisgICAgICAgICAgICB3aGlsZSAoIHNpbXBsZUxvY2sgIT0gdHJ1ZSApCisgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICBXYWl0VGlsbENvbXBsZXRlKCA0MDAwICk7CisKKyAgICAgICAgICAgIFRvZG9NYW5hZ2VyLlNodXREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaHJlYWQgdGhhdCBhZGRzIGluZGVwZW5kZW50bHkgdG8gdGhlIHF1ZXVlLiAKKyAgICAgICAgcHVibGljIHZvaWQgQWRkVXNpbmdEaWZmZXJlbnRUaHJlYWQoKQorICAgICAgICB7CisgICAgICAgICAgICBUb2RvTWFuYWdlci5HZXRUb2RvTWFuYWdlcigpLkFkZCggbmV3IE15VG9kbygpICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpbXBsZUxvY2sgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgYm9vbCBzaW1wbGVMb2NrID0gZmFsc2U7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2FpdCB1bnRpbCBhbGwgVG9kb3MgYXJlIHJ1bi4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4V2FpdCI+TWF4IHRpbWUgaW4gbWlsbGlzZWNvbmRzIAorICAgICAgICAvLy8gdG8gd2FpdDwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBXYWl0VGlsbENvbXBsZXRlKCBsb25nIG1heFdhaXQgKQorICAgICAgICB7CisgICAgICAgICAgICBEYXRlVGltZSBub3cgPSBEYXRlVGltZS5Ob3c7CisKKyAgICAgICAgICAgIGxvbmcgbm93VGltZSA9IDA7CisgICAgICAgICAgICBsb25nIGVuZFRpbWUgPSBub3dUaW1lICsgbWF4V2FpdDsKKworICAgICAgICAgICAgVGltZVNwYW4gc3BhbjsKKyAgICAgICAgICAgIGxvbmcgc3BhblRpbWUgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoIHRydWUgJiYgKCBub3dUaW1lIDwgZW5kVGltZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIE15VG9kby5Ub2Rvc1JlbWFpbmluZygpID09IDAgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBzcGFuID0gRGF0ZVRpbWUuTm93IC0gbm93OworICAgICAgICAgICAgICAgIG5vdyA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICBzcGFuVGltZSA9IChsb25nKSBzcGFuLlRvdGFsTWlsbGlzZWNvbmRzOworICAgICAgICAgICAgICAgIG5vd1RpbWUgKz0gc3BhblRpbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJUaW1lIGV4Y2VlZGVkIiApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIlRvZG8iIHRhc2tzIHB1dCBpbnNpZGUgdGhlIFRvZG9NYW5hZ2VyIHF1ZXVlLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIE15VG9kbyA6IFRvZG8KKyAgICAgICAgeworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIHVuaXF1ZSBpZCBmb3IgZXZlcnkgInRvZG8iIGNyZWF0ZWQKKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2xvYmFsSWQgPSAwOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGxhc3RSdW4gPSAwOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgdW5pcXVlSWQgPSAwOworCisgICAgICAgICAgICBwdWJsaWMgTXlUb2RvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnbG9iYWxJZCsrOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkID0gZ2xvYmFsSWQ7CisgICAgICAgICAgICAgICAgbGFzdFJ1bisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGludCBMYXN0SWRHZW5lcmF0ZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxJZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFJlc2V0IHRoZSBnbG9iYWwgaWQuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlc2V0R2xvYmFsSWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdsb2JhbElkID0gMDsKKyAgICAgICAgICAgICAgICBsYXN0UnVuID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIEhvdyBtYW55IHRvZG9zIHJlbWFpbiB0byBiZSBydW4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHJldHVybnM+bnVtYmVyIG9mIHRvZG9zIHJlbWFpbmluZzwvcmV0dXJucz4KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFRvZG9zUmVtYWluaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJ1bjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgRG9pdCggVG9kb01hbmFnZXIgbWdyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsYXN0UnVuLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VwdGlvbiggVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJleGNlcHRpb24gdGhyb3duIGJ5IHRvZG8gIiArIHVuaXF1ZUlkICk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuTWVzc2FnZSApOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFR5cGVWYWxpZGF0b3IuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFR5cGVWYWxpZGF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlNjg1NwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VHlwZVZhbGlkYXRvci5jcwpAQCAtMCwwICsxLDExNSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RUeXBlVmFsaWRhdG9yCisgICAgeworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdFR5cGVWYWxpZGF0b3IiICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RWYWxpZGF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBNeVR5cGVWYWxpZGF0b3IoIHR5cGVvZiggaW50ICksIHR5cGVvZiggaW50ICksIC0xLCAiYnp6dCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VHlwZVZhbGlkYXRvcjEoKQorICAgICAgICB7CisgICAgICAgICAgICBNeVR5cGVWYWxpZGF0b3IgdiA9IG5ldyBNeVR5cGVWYWxpZGF0b3IoIHR5cGVvZiggaW50ICksIG51bGwsIDAsICJhYmMiICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHR5cGVvZiggaW50ICksIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIHYuR2V0TkRpbXMoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiYWJjIiwgdi5Ub1N0cmluZygpICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFR5cGVWYWxpZGF0b3IyKCkKKyAgICAgICAgeworICAgICAgICAgICAgTXlUeXBlVmFsaWRhdG9yIHYgPSBuZXcgTXlUeXBlVmFsaWRhdG9yKCB0eXBlb2YoQm9vbGVhbiksIG51bGwsIDAsICJkZWYiICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHR5cGVvZiggQm9vbGVhbiApLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCB2LkdldE5EaW1zKCkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggImRlZiIsIHYuVG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RUeXBlVmFsaWRhdG9yMygpCisJICAgIHsKKwkJICAgIE15VHlwZVZhbGlkYXRvciB2ID0gbmV3IE15VHlwZVZhbGlkYXRvciggbnVsbCwgdHlwZW9mKGludCksIDEsICJnaGkiICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHR5cGVvZihpbnRbXSksIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIHYuR2V0TkRpbXMoKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAiZ2hpIiwgdi5Ub1N0cmluZygpICk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdFR5cGVWYWxpZGF0b3I0KCkKKwkgICAgeworCQkgICAgTXlUeXBlVmFsaWRhdG9yIHYgPSBuZXcgTXlUeXBlVmFsaWRhdG9yKCBudWxsLCB0eXBlb2YoQm9vbGVhbiksIDEsICJqa2wiICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHR5cGVvZihCb29sZWFuW10pLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCB2LkdldE5EaW1zKCkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggImprbCIsIHYuVG9TdHJpbmcoKSApOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RUb1N0cmluZygpCisJICAgIHsKKwkJICAgIE15VHlwZVZhbGlkYXRvciB2ID0gbmV3IE15VHlwZVZhbGlkYXRvciggdHlwZW9mKGludCksIHR5cGVvZihpbnQpLCAwLCAiYWJjIiApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAiYWJjIiwgdi5Ub1N0cmluZygpICk7CisgICAgCQkKKwkJICAgIHYgPSBuZXcgTXlUeXBlVmFsaWRhdG9yKCB0eXBlb2YoaW50KSwgdHlwZW9mKGludCksIDAsICJkZWYiICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoICJkZWYiLCB2LlRvU3RyaW5nKCkgKTsKKyAgICAJCQorCQkgICAgdiA9IG5ldyBNeVR5cGVWYWxpZGF0b3IoIHR5cGVvZihpbnQpLCB0eXBlb2YoaW50KSwgMCwgImdoaSIgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggImdoaSIsIHYuVG9TdHJpbmcoKSApOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RTaWxseSgpCisJICAgIHsKKwkJICAKKwkJICAgIG5ldyBNeVR5cGVWYWxpZGF0b3IoIHR5cGVvZihpbnQpLCB0eXBlb2YoaW50KSwgMCwgImdoaSIgKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlUeXBlVmFsaWRhdG9yIDogVHlwZVZhbGlkYXRvcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgTXlUeXBlVmFsaWRhdG9yKCBUeXBlIHNjYWxhckNsYXNzLCBUeXBlIGFycmF5Q2xhc3MsIGludCBuRGltcywKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3IgKSA6IGJhc2UgKCBzY2FsYXJDbGFzcywgYXJyYXlDbGFzcywgbkRpbXMsIGRlc2NyKQorICAgICAgICAgICAgeyB9CisKKyAgICAgICAgICAgCisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWxpZGF0b3IgRWxlbWVudFZhbGlkYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9yX1N0cnVjdFZhbHVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTlhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5jcwpAQCAtMCwwICsxLDIzMiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfU3RydWN0VmFsdWUKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3RWYWxpZGF0b3JfU3RydWN0VmFsdWUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgWFR5cGUgYWJjID0gbmV3IFhUeXBlKCAiYWJjIiApOworCQorCS8qKiBAICAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpICAKKwl7CisJCXRlc3Rjb25zdHJ1Y3RvciggMCwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDBdIiwgdHlwZW9mKFN0cnVjdFZhbHVlKSk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMSwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDFdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDJdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAzLCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksM10iLCB0eXBlb2YoU3RydWN0VmFsdWVbXVtdW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNCwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDRdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXVtdW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNSwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDVdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXVtdW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA2LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksNl0iLCB0eXBlb2YoU3RydWN0VmFsdWVbXVtdW11bXVtdW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDddIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOCwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDhdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA5LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksOV0iLCB0eXBlb2YoU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdW10pICk7CisJCUFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBUeXBlIGV4cGVjdGVkQ2xhc3MgKQorCXsKKwkJVmFsaWRhdG9yX1N0cnVjdFZhbHVlIHYgPSBWYWxpZGF0b3JfU3RydWN0VmFsdWUuR2V0KCBhYmMsIG4gKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCBuLCB2LkdldE5EaW1zKCkgKTsKKwkJQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCUFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIGFiYywgdi5HZXRYVHlwZSgpICk7CisJfQorCQorCQorCVtUZXN0XSAgCisgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IyKCkgIAorCXsKKwkJVmFsaWRhdG9yX1N0cnVjdFZhbHVlLkdldCggYWJjLCAtMSApOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0gIAorICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpICAKKwl7CisJCVZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5HZXQoIGFiYywgVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJfQorCQorCS8qKiBAICAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIGVsZW1lbnR2YWxpZGF0b3IxKCkgIAorCXsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDEsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSwwXSIsIHR5cGVvZihTdHJ1Y3RWYWx1ZSkgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDIsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSwxXSIsIHR5cGVvZihTdHJ1Y3RWYWx1ZVtdKSApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMywgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDJdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXSkgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDQsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSwzXSIsIHR5cGVvZihTdHJ1Y3RWYWx1ZVtdW11bXSkgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDUsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSw0XSIsIHR5cGVvZihTdHJ1Y3RWYWx1ZVtdW11bXVtdKSApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNiwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDVdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXVtdW11bXSkgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDcsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSw2XSIsIHR5cGVvZihTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXSkgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDgsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSw3XSIsIHR5cGVvZihTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdKSApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggOSwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLDhdIiwgdHlwZW9mKFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW11bXSkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0ZWxlbWVudHZhbGlkYXRvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwl7CisJCVZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSB2ID0gKFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSkgVmFsaWRhdG9yX1N0cnVjdFZhbHVlLkdldCggYWJjLCBuICkuRWxlbWVudFZhbGlkYXRvcigpOworCQlBc3NlcnQuQXJlRXF1YWwoIG4tMSwgdi5HZXRORGltcygpICk7CisJCUFzc2VydC5BcmVTYW1lKCBleHBlY3RlZENsYXNzLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCBhYmMsIHYuR2V0WFR5cGUoKSApOworCX0KKworCQorCVtUZXN0XSAgCisgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSAgCisJeworCQlWYWxpZGF0b3JfU3RydWN0VmFsdWUuR2V0KCBhYmMsIDAgKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIGdvb2Rfc2NhbGFyKCkgIAorCXsKKyAgICAgICAgdGVzdGdvb2R2YWx1ZSgwLCBuZXcgU3RydWN0VmFsdWUoYWJjLCB2ZikpOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBnb29kX2FycmF5KCkgIAorCXsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBTdHJ1Y3RWYWx1ZVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDIsICBuZXcgU3RydWN0VmFsdWVbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDMsICBuZXcgU3RydWN0VmFsdWVbXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNCwgIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDUsICBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDYsICBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNywgIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDgsICBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDksICBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0Z29vZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5HZXQoIGFiYywgbiApOworCQlBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCB2YWx1ZSApICk7CisJCUFzc2VydC5Jc1RydWUoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBiYWRfc2NhbGFyKCkgIAorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAoc2hvcnQpIDIyMjIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAzMzMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBYVHlwZSggImRlZiIgKSwgdmYgKSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBEYXRlVGltZSgpICk7CisKKwkJdGVzdGJhZHZhbHVlKCAxLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKGJ5dGUpIDEgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoc2hvcnQpIDIyMjIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMgKTsKKwkgICAgdGVzdGJhZHZhbHVlKDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworCS8vCXRlc3RiYWR2YWx1ZSggMSwgbmV3IFN0cnVjdFZhbHVlKCBhYmMgKSApOworCSAgICB0ZXN0YmFkdmFsdWUoMSwgbmV3IERhdGVUaW1lKCkpOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBiYWRfYXJyYXkoKSAgCisJeworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBTdHJ1Y3RWYWx1ZVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IFN0cnVjdFZhbHVlW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCUFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IFN0cnVjdFZhbHVlW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgU3RydWN0VmFsdWVbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IFN0cnVjdFZhbHVlW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IFN0cnVjdFZhbHVlW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCUFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0YmFkdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX1N0cnVjdFZhbHVlLkdldCggYWJjLCBuICk7CisJCUFzc2VydC5Jc0ZhbHNlKCB2LlZhbGlkYXRlKCB2YWx1ZSApICk7CisJCUFzc2VydC5Jc0ZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2wgdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYuVmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uICApCisJCXsKKyAgICAgICAgICAKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9ib29sZWFuLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfYm9vbGVhbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjlmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfYm9vbGVhbi5jcwpAQCAtMCwwICsxLDIyNSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfQm9vbGVhbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRHVtbXlWYWx1ZUZhY3RvcnkoKTsKKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RWYWxpZGF0b3JfQm9vbGVhbiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvcjEoKSAgCisJICAgIHsKKwkJICAgIFRlc3RDb25zdHJ1Y3RvcigwLCJib29sZWFuWzBdIix0eXBlb2YoQm9vbGVhbikpOworICAgICAgICAgICAgVGVzdENvbnN0cnVjdG9yKDEsICJib29sZWFuWzFdIiwgdHlwZW9mKEJvb2xlYW5bXSkpOworICAgICAgICAgICAgVGVzdENvbnN0cnVjdG9yKDIsICJib29sZWFuWzJdIiwgdHlwZW9mKEJvb2xlYW5bXVtdKSk7CisgICAgICAgICAgICBUZXN0Q29uc3RydWN0b3IoMywgImJvb2xlYW5bM10iLCB0eXBlb2YoQm9vbGVhbltdW11bXSkpOworICAgICAgICAgICAgVGVzdENvbnN0cnVjdG9yKDQsICJib29sZWFuWzRdIiwgdHlwZW9mKEJvb2xlYW5bXVtdW11bXSkpOworICAgICAgICAgICAgVGVzdENvbnN0cnVjdG9yKDUsICJib29sZWFuWzVdIiwgdHlwZW9mKEJvb2xlYW5bXVtdW11bXVtdKSk7CisgICAgICAgICAgICBUZXN0Q29uc3RydWN0b3IoNiwgImJvb2xlYW5bNl0iLCB0eXBlb2YoQm9vbGVhbltdW11bXVtdW11bXSkpOworICAgICAgICAgICAgVGVzdENvbnN0cnVjdG9yKDcsICJib29sZWFuWzddIiwgdHlwZW9mKEJvb2xlYW5bXVtdW11bXVtdW11bXSkpOworICAgICAgICAgICAgVGVzdENvbnN0cnVjdG9yKDgsICJib29sZWFuWzhdIiwgdHlwZW9mKEJvb2xlYW5bXVtdW11bXVtdW11bXVtdKSk7CisgICAgICAgICAgICBUZXN0Q29uc3RydWN0b3IoOSwgImJvb2xlYW5bOV0iLCB0eXBlb2YoQm9vbGVhbltdW11bXVtdW11bXVtdW11bXSkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDksVmFsaWRhdG9yLk1BWF9ORElNUyk7CisJICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdENvbnN0cnVjdG9yKGludCBuLCBzdHJpbmcgZGVzY3IsIFR5cGUgZXhwZWN0ZWRDbGFzcykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdG9yX2Jvb2xlYW4gdiA9IFZhbGlkYXRvcl9ib29sZWFuLkdldChuKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuLCB2LkdldE5EaW1zKCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoZXhwZWN0ZWRDbGFzcyx2LkdldEV4cGVjdGVkQ2xhc3MoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGVzY3IsIHYuVG9TdHJpbmcoKSk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAKKwkgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSldCisJICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yMigpCisJICAgIHsJCQorCQkgICAgVmFsaWRhdG9yX2Jvb2xlYW4uR2V0KCAtMSApOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRvcl9ib29sZWFuLkdldChWYWxpZGF0b3IuTUFYX05ESU1TICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgRWxlbWVudFZhbGlkYXRvcjEoKSAKKwkgICAgeworCQkgICAgVGVzdEVsZW1lbnRWYWxpZGF0b3IoIDEsICJib29sZWFuWzBdIiwgdHlwZW9mKEJvb2xlYW4pICApOworCQkgICAgVGVzdEVsZW1lbnRWYWxpZGF0b3IoIDIsICJib29sZWFuWzFdIiwgdHlwZW9mKEJvb2xlYW5bXSkgICk7CisJCSAgICBUZXN0RWxlbWVudFZhbGlkYXRvciggMywgImJvb2xlYW5bMl0iLCB0eXBlb2YoQm9vbGVhbltdW10pICApOworCQkgICAgVGVzdEVsZW1lbnRWYWxpZGF0b3IoIDQsICJib29sZWFuWzNdIiwgdHlwZW9mKEJvb2xlYW5bXVtdW10pICApOworCQkgICAgVGVzdEVsZW1lbnRWYWxpZGF0b3IoIDUsICJib29sZWFuWzRdIiwgdHlwZW9mKEJvb2xlYW5bXVtdW11bXSkgICk7CisJCSAgICBUZXN0RWxlbWVudFZhbGlkYXRvciggNiwgImJvb2xlYW5bNV0iLCB0eXBlb2YoQm9vbGVhbltdW11bXVtdW10pICApOworCQkgICAgVGVzdEVsZW1lbnRWYWxpZGF0b3IoIDcsICJib29sZWFuWzZdIiwgdHlwZW9mKEJvb2xlYW5bXVtdW11bXVtdW10pICApOworCQkgICAgVGVzdEVsZW1lbnRWYWxpZGF0b3IoIDgsICJib29sZWFuWzddIiwgdHlwZW9mKEJvb2xlYW5bXVtdW11bXVtdW11bXSkgICk7CisJCSAgICBUZXN0RWxlbWVudFZhbGlkYXRvciggOSwgImJvb2xlYW5bOF0iLCB0eXBlb2YoQm9vbGVhbltdW11bXVtdW11bXVtdW10pICApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdEVsZW1lbnRWYWxpZGF0b3IoIGludCBuLCBTdHJpbmcgZGVzY3IsIFR5cGUgZXhwZWN0ZWRDbGFzcyApCisJICAgIHsKKwkJICAgIFZhbGlkYXRvcl9ib29sZWFuIHYgPSAoVmFsaWRhdG9yX2Jvb2xlYW4pIFZhbGlkYXRvcl9ib29sZWFuLkdldCggbiApLkVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggbi0xLCB2LkdldE5EaW1zKCkgKTsKKwkJICAgIEFzc2VydC5BcmVTYW1lKCBleHBlY3RlZENsYXNzLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBkZXNjciwgdi5Ub1N0cmluZygpICk7CisJICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgRWxlbWVudFZhbGlkYXRvcjIgICgpCisJICAgIHsJCQorCQkgICAgVmFsaWRhdG9yX2Jvb2xlYW4uR2V0KCAwICkuRWxlbWVudFZhbGlkYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIEdvb2RfU2NhbGFyKCkgCisJICAgIHsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDAsICBmYWxzZSApOworCQkgICAgVGVzdEdvb2RWYWx1ZSggMCwgdHJ1ZSApOworCSAgICB9CisJCisJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBHb29kX0FycmF5KCkgCisJICAgIHsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDEsIG5ldyBCb29sZWFuW10ge30gKTsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDIsICBuZXcgQm9vbGVhbltdW10ge30gKTsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDMsICBuZXcgQm9vbGVhbltdW11bXSB7fSApOworCQkgICAgVGVzdEdvb2RWYWx1ZSggNCwgIG5ldyBCb29sZWFuW11bXVtdW10ge30gKTsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDUsICBuZXcgQm9vbGVhbltdW11bXVtdW10ge30gKTsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDYsICBuZXcgQm9vbGVhbltdW11bXVtdW11bXSB7fSApOworCQkgICAgVGVzdEdvb2RWYWx1ZSggNywgIG5ldyBCb29sZWFuW11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDgsICBuZXcgQm9vbGVhbltdW11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIFRlc3RHb29kVmFsdWUoIDksICBuZXcgQm9vbGVhbltdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJICAgIH0KKwkKKwkgICAgcHJpdmF0ZSB2b2lkIFRlc3RHb29kVmFsdWUoIGludCBuLCAgT2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2Jvb2xlYW4uR2V0KCBuICk7CisJCSAgIAorCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggVmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGJhZF9zY2FsYXIoKSAKKwkgICAgeworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCBudWxsICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDAsIChieXRlKSAxICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCAzMzMzMzMzMyApOworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCA1LjVmICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDAsIDYuNiApOworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCAiIiApOworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCAiYWJjIiApOworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKyAgICAgICAgICAgIFRlc3RCYWRWYWx1ZSgwLCBuZXcgU3RydWN0VmFsdWUobmV3IFhUeXBlKCJhYmMiKSwgdmYpKTsKKwkJICAgIFRlc3RCYWRWYWx1ZSggMCwgbmV3IERhdGVUaW1lKCkgKTsKKworCQkgICAgVGVzdEJhZFZhbHVlKCAxLCBudWxsICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsIGZhbHNlICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsIHRydWUgKTsKKwkJICAgIFRlc3RCYWRWYWx1ZSggMSwgKGJ5dGUpIDEgKTsKKwkJICAgIFRlc3RCYWRWYWx1ZSggMSwgKHNob3J0KSAyMjIyICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsIDMzMzMzMzMzICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsIDUuNWYgKTsKKwkJICAgIFRlc3RCYWRWYWx1ZSggMSwgNi42ICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsICIiICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsICJhYmMiICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworICAgICAgICAgICAgVGVzdEJhZFZhbHVlKDEsIG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImFiYyIpLCB2ZikpOworCQkgICAgVGVzdEJhZFZhbHVlKCAxLCBuZXcgRGF0ZVRpbWUoKSApOworCSAgICB9CisJCisJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBiYWRfYXJyYXkoKSAKKwkgICAgeworCQkgICAgVGVzdEJhZFZhbHVlKCAwLCBuZXcgQm9vbGVhbltdIHt9ICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDEsIG5ldyBCb29sZWFuW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCAyLCBuZXcgQm9vbGVhbltdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCAzLCBuZXcgQm9vbGVhbltdW11bXVtdIHt9ICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDQsIG5ldyBCb29sZWFuW11bXVtdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA1LCBuZXcgQm9vbGVhbltdW11bXVtdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA2LCBuZXcgQm9vbGVhbltdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDcsIG5ldyBCb29sZWFuW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA4LCBuZXcgQm9vbGVhbltdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA5LCBuZXcgQm9vbGVhbltdW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKworCQkgICAgVGVzdEJhZFZhbHVlKCAyLCBuZXcgQm9vbGVhbltdIHt9ICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDMsIG5ldyBCb29sZWFuW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA0LCBuZXcgQm9vbGVhbltdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA1LCBuZXcgQm9vbGVhbltdW11bXVtdIHt9ICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDYsIG5ldyBCb29sZWFuW11bXVtdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA3LCBuZXcgQm9vbGVhbltdW11bXVtdW11bXSB7fSApOworCQkgICAgVGVzdEJhZFZhbHVlKCA4LCBuZXcgQm9vbGVhbltdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBUZXN0QmFkVmFsdWUoIDksIG5ldyBCb29sZWFuW11bXVtdW11bXVtdW11bXSB7fSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDksIFZhbGlkYXRvci5NQVhfTkRJTVMpOworCSAgICB9CisKKwkgICAgcHJpdmF0ZSB2b2lkIFRlc3RCYWRWYWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIFR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9ib29sZWFuLkdldCggbiApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJICAgIEFzc2VydC5Jc0ZhbHNlKCBWYWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZVZhbHVlT2soIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBPYmplY3QgeCA9IHYuVmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCB4ICk7CisJCQkgICAgcmV0dXJuIHRydWU7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbiApCisJCSAgICB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisJCSAgICB9CisJICAgIH0KKworCisKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9yX2J5dGUuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9ieXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDU5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9ieXRlLmNzCkBAIC0wLDAgKzEsMjc1IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl9ieXRlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdFZhbGlkYXRvcl9ieXRlIiApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnRydWN0b3IxKCkKKyAgICAgICAgeworICAgICAgCisgICAgICAgICAgICB0ZXN0Y29uc3RydWN0b3IoIDAsICJieXRlWzBdIiwgdHlwZW9mKHNieXRlKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAxLCAiYnl0ZVsxXSIsIHR5cGVvZiggc2J5dGVbXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggMiwgImJ5dGVbMl0iLCB0eXBlb2YoIHNieXRlW11bXSApICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDMsICJieXRlWzNdIiwgdHlwZW9mKCBzYnl0ZVtdW11bXSApICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDQsICJieXRlWzRdIiwgdHlwZW9mKCBzYnl0ZVtdW11bXVtdICkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggNSwgImJ5dGVbNV0iLCB0eXBlb2YoIHNieXRlW11bXVtdW11bXSApICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDYsICJieXRlWzZdIiwgdHlwZW9mKCBzYnl0ZVtdW11bXVtdW11bXSApICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDcsICJieXRlWzddIiwgdHlwZW9mKCBzYnl0ZVtdW11bXVtdW11bXVtdICkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggOCwgImJ5dGVbOF0iLCB0eXBlb2YoIHNieXRlW11bXVtdW11bXVtdW11bXSApICk7CisgICAgICAgICAgICB0ZXN0Y29uc3RydWN0b3IoOSwgImJ5dGVbOV0iLCB0eXBlb2Yoc2J5dGVbXVtdW11bXVtdW11bXVtdW10pKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBUeXBlIGV4cGVjdGVkQ2xhc3MgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfYnl0ZS5HZXQoIG4gKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggbiwgdi5HZXRORGltcygpICk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggZXhwZWN0ZWRDbGFzcywgdi5HZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCSAgICB9CisKKyAgICAgICAKKwkgICAgW1Rlc3RdIAorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgY29uc3RydWN0b3IyKCkgCisJICAgIHsKKwkJICAgIFZhbGlkYXRvcl9ieXRlLkdldCggLTEgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0gCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjMoKSAKKwkgICAgeworCQkgICAgVmFsaWRhdG9yX2J5dGUuR2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSAKKwkgICAgeworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDEsICJieXRlWzBdIiwgdHlwZW9mKHNieXRlKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDIsICJieXRlWzFdIiwgdHlwZW9mKCBzYnl0ZVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJieXRlWzJdIiwgdHlwZW9mKCBzYnl0ZVtdW10gKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDQsICJieXRlWzNdIiwgdHlwZW9mKCBzYnl0ZVtdW11bXSApICk7CisJCSAgICB0ZXN0ZWxlbWVudHZhbGlkYXRvciggNSwgImJ5dGVbNF0iLCB0eXBlb2YoIHNieXRlW11bXVtdW10gKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJieXRlWzVdIiwgdHlwZW9mKCBzYnl0ZVtdW11bXVtdW10gKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDcsICJieXRlWzZdIiwgdHlwZW9mKCBzYnl0ZVtdW11bXVtdW11bXSApICk7CisJCSAgICB0ZXN0ZWxlbWVudHZhbGlkYXRvciggOCwgImJ5dGVbN10iLCB0eXBlb2YoIHNieXRlW11bXVtdW11bXVtdW10gKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJieXRlWzhdIiwgdHlwZW9mKCBzYnl0ZVtdW11bXVtdW11bXVtdW10gKSApOworICAgICAgICAgICAKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCSAgICB9CisJCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0ZWxlbWVudHZhbGlkYXRvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gKFR5cGVWYWxpZGF0b3IpIFZhbGlkYXRvcl9ieXRlLkdldCggbiApLkVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggbi0xLCB2LkdldE5EaW1zKCkgKTsKKwkJICAgIEFzc2VydC5BcmVTYW1lKCBleHBlY3RlZENsYXNzLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBkZXNjciwgdi5Ub1N0cmluZygpICk7CisJICAgIH0KKworCQorCSAgICBbVGVzdF0gCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMigpIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfYnl0ZS5HZXQoIDAgKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGdvb2Rfc2NhbGFyKCkgCisJICAgIHsKKwkJICAgIC8vIEJZVEVTCisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2J5dGUpIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBTQnl0ZS5NYXhWYWx1ZSApOworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNieXRlKSAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgLTY0ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgU0J5dGUuTWluVmFsdWUgKTsKKworCQkgICAgLy8gU0hPUlRTCisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIFNCeXRlLk1heFZhbHVlICk7CisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIC0xICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSAtNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIFNCeXRlLk1pblZhbHVlICk7CisKKwkJICAgIC8vIElOVFMKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICA2NCApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChpbnQpIFNCeXRlLk1heFZhbHVlICk7CisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIC02NCApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChpbnQpIFNCeXRlLk1pblZhbHVlICk7CisKKwkJICAgIC8vIExPTkdTCisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgMCApOworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIDEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgU0J5dGUuTWF4VmFsdWUgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgU0J5dGUuTWluVmFsdWUgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZ29vZF9hcnJheSgpIAorCSAgICB7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLG5ldyBzYnl0ZVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAyLCAgbmV3IHNieXRlW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMywgIG5ldyBzYnl0ZVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggNCwgIG5ldyBzYnl0ZVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA1LCAgbmV3IHNieXRlW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggNiwgIG5ldyBzYnl0ZVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggNywgIG5ldyBzYnl0ZVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA4LCAgbmV3IHNieXRlW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggOSwgIG5ldyBzYnl0ZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJICAgIH0KKwkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3Rnb29kdmFsdWUoIGludCBuLE9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIFR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9ieXRlLkdldCggbiApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggVmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJICAgIH0KKwkKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBiYWRfc2NhbGFyKCkgCisJICAgIHsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgbnVsbCApOworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBmYWxzZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisgICAgLy8JCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsgZ29vZCEKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDUuNWYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgNi42ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsICJhYmMiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIG5ldyBPYmplY3QoKSApOworICAgICAgICAgICAgdGVzdGJhZHZhbHVlKDAsIG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImFiYyIpLCB2ZikpOworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBuZXcgRGF0ZVRpbWUoKSApOworCisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG51bGwgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgZmFsc2UgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgdHJ1ZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAoYnl0ZSkgMSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAoc2hvcnQpIDIyMjIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgMzMzMzMzICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIDUuNWYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNi42ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsICJhYmMiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworICAgICAgICAgICAgdGVzdGJhZHZhbHVlKDEsIG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImFiYyIpLCB2ZikpOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgRGF0ZVRpbWUoKSApOworCSAgICB9CisJCisJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBiYWRfYXJyYXkoKSAKKwkgICAgeworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBuZXcgc2J5dGVbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgc2J5dGVbXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDIsIG5ldyBzYnl0ZVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAzLCBuZXcgc2J5dGVbXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA0LCBuZXcgc2J5dGVbXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDUsIG5ldyBzYnl0ZVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA2LCBuZXcgc2J5dGVbXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA3LCBuZXcgc2J5dGVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDgsIG5ldyBzYnl0ZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA5LCBuZXcgc2J5dGVbXVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMiwgbmV3IHNieXRlW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMywgbmV3IHNieXRlW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA0LCBuZXcgc2J5dGVbXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggNSwgbmV3IHNieXRlW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggNiwgbmV3IHNieXRlW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA3LCBuZXcgc2J5dGVbXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggOCwgbmV3IHNieXRlW11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggOSwgbmV3IHNieXRlW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJICAgIH0KKworCSAgICBwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwkgICAgeworCSAgICAgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2J5dGUuR2V0KG4pOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKFZhbGlkYXRlVmFsdWVPayh2LCB2YWx1ZSkpOworCSAgICB9CisKKwkgICAgcHJpdmF0ZSBib29sIFZhbGlkYXRlVmFsdWVPayggVmFsaWRhdG9yIHYsIE9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIE9iamVjdCB4ID0gdi5WYWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQkJICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHggKTsKKwkJCSAgICByZXR1cm4gdHJ1ZTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgfQorCSAgICB9CisKKyAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9yX2RvdWJsZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9yX2RvdWJsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTgxMzBjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfZG91YmxlLmNzCkBAIC0wLDAgKzEsMjI5IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl9kb3VibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0VmFsaWRhdG9yX2RvdWJsZSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSAKKwkgICAgeworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAwLCAiZG91YmxlWzBdIiwgdHlwZW9mKGRvdWJsZSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggMSwgImRvdWJsZVsxXSIsIHR5cGVvZihkb3VibGVbXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggMiwgImRvdWJsZVsyXSIsIHR5cGVvZihkb3VibGVbXVtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAzLCAiZG91YmxlWzNdIiwgdHlwZW9mKGRvdWJsZVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggNCwgImRvdWJsZVs0XSIsIHR5cGVvZihkb3VibGVbXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggNSwgImRvdWJsZVs1XSIsIHR5cGVvZihkb3VibGVbXVtdW11bXVtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCA2LCAiZG91YmxlWzZdIiwgdHlwZW9mKGRvdWJsZVtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggNywgImRvdWJsZVs3XSIsIHR5cGVvZihkb3VibGVbXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggOCwgImRvdWJsZVs4XSIsIHR5cGVvZihkb3VibGVbXVtdW11bXVtdW11bXVtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCA5LCAiZG91YmxlWzldIiwgdHlwZW9mKGRvdWJsZVtdW11bXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCSAgICB9CisJCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0Y29uc3RydWN0b3IoIGludCBuLCBTdHJpbmcgZGVzY3IsIFR5cGUgZXhwZWN0ZWRDbGFzcyApCisJICAgIHsKKwkJICAgIFR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9kb3VibGUuR2V0KCBuICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG4sIHYuR2V0TkRpbXMoKSApOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfZG91YmxlLkdldCggLTEgKTsKKwkgICAgfQorCQorCSAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfZG91YmxlLkdldCggVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIEVsZW1lbnRWYWxpZGF0b3IxKCkgCisJICAgIHsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAiZG91YmxlWzBdIiwgdHlwZW9mKGRvdWJsZSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAiZG91YmxlWzFdIiwgdHlwZW9mKGRvdWJsZVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJkb3VibGVbMl0iLCB0eXBlb2YoZG91YmxlW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAiZG91YmxlWzNdIiwgdHlwZW9mKGRvdWJsZVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAiZG91YmxlWzRdIiwgdHlwZW9mKGRvdWJsZVtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJkb3VibGVbNV0iLCB0eXBlb2YoZG91YmxlW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCAiZG91YmxlWzZdIiwgdHlwZW9mKGRvdWJsZVtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAiZG91YmxlWzddIiwgdHlwZW9mKGRvdWJsZVtdW11bXVtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJkb3VibGVbOF0iLCB0eXBlb2YoZG91YmxlW11bXVtdW11bXVtdW11bXSkgKTsKKworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJICAgIH0KKwkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3RlbGVtZW50dmFsaWRhdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBUeXBlIGV4cGVjdGVkQ2xhc3MgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSAoVHlwZVZhbGlkYXRvcikgVmFsaWRhdG9yX2RvdWJsZS5HZXQoIG4gKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG4tMSwgdi5HZXRORGltcygpICk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggZXhwZWN0ZWRDbGFzcywgdi5HZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCSAgICB9CisKKwkKKwkgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMigpIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfZG91YmxlLkdldCggMCApLkVsZW1lbnRWYWxpZGF0b3IoKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSAKKwkgICAgeworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDAuMCApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDEuMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIC0xLjEgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZ29vZF9hcnJheSgpIAorCSAgICB7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IGRvdWJsZVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAyLCAgbmV3IGRvdWJsZVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDMsICBuZXcgZG91YmxlW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA0LCAgbmV3IGRvdWJsZVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA1LCAgbmV3IGRvdWJsZVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDYsICBuZXcgZG91YmxlW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA3LCAgbmV3IGRvdWJsZVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA4LCAgbmV3IGRvdWJsZVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDksICBuZXcgZG91YmxlW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorCQorCSAgICBwcml2YXRlIHZvaWQgdGVzdGdvb2R2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIFR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9kb3VibGUuR2V0KCBuICk7CisJCSAgIAorCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggVmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGJhZF9zY2FsYXIoKSAKKwkgICAgeworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIHRydWUgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDUuNWYgKTsKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCA2LjYgKTsgZ29vZCEKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgIiIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgbmV3IE9iamVjdCgpICk7CisgICAgICAgICAgICB0ZXN0YmFkdmFsdWUoMCwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIG5ldyBEYXRlVGltZSgpICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCA2LjYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbmV3IE9iamVjdCgpICk7CisgICAgICAgICAgICB0ZXN0YmFkdmFsdWUoMSwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlVGltZSgpICk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGJhZF9hcnJheSgpIAorCSAgICB7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIG5ldyBkb3VibGVbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgZG91YmxlW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAyLCBuZXcgZG91YmxlW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDMsIG5ldyBkb3VibGVbXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA0LCBuZXcgZG91YmxlW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA1LCBuZXcgZG91YmxlW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDYsIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA3LCBuZXcgZG91YmxlW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA4LCBuZXcgZG91YmxlW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDksIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMiwgbmV3IGRvdWJsZVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDMsIG5ldyBkb3VibGVbXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDQsIG5ldyBkb3VibGVbXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggNSwgbmV3IGRvdWJsZVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDYsIG5ldyBkb3VibGVbXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDcsIG5ldyBkb3VibGVbXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggOCwgbmV3IGRvdWJsZVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDksIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0YmFkdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfZG91YmxlLkdldCggbiApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKFZhbGlkYXRlVmFsdWVPayh2LCB2YWx1ZSkpOworCSAgICB9CisKKwkgICAgcHJpdmF0ZSBib29sIFZhbGlkYXRlVmFsdWVPayggVmFsaWRhdG9yIHYsIE9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIE9iamVjdCB4ID0gdi5WYWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQkJICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHggKTsKKwkJCSAgICByZXR1cm4gdHJ1ZTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworICAgICAgICAgICAgICAgCisJCQkgICAgcmV0dXJuIGZhbHNlOworCQkgICAgfQorCSAgICB9CisKKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfZmxvYXQuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9mbG9hdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWI3OGEwCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfZmxvYXQuY3MKQEAgLTAsMCArMSwyMzAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgICAgIFtUZXN0Rml4dHVyZV0KKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfZmxvYXQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRHVtbXlWYWx1ZUZhY3RvcnkoKTsKKworICAgICAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdFZhbGlkYXRvcl9mbG9hdCIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgCisJICAgIHsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggMCwgImZsb2F0WzBdIiwgdHlwZW9mKGZsb2F0KSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAxLCAiZmxvYXRbMV0iLCB0eXBlb2YoZmxvYXRbXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggMiwgImZsb2F0WzJdIiwgdHlwZW9mKGZsb2F0W11bXSkpOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAzLCAiZmxvYXRbM10iLCB0eXBlb2YoZmxvYXRbXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDQsICJmbG9hdFs0XSIsIHR5cGVvZihmbG9hdFtdW11bXVtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCA1LCAiZmxvYXRbNV0iLCB0eXBlb2YoZmxvYXRbXVtdW11bXVtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCA2LCAiZmxvYXRbNl0iLCB0eXBlb2YoZmxvYXRbXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDcsICJmbG9hdFs3XSIsIHR5cGVvZihmbG9hdFtdW11bXVtdW11bXVtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCA4LCAiZmxvYXRbOF0iLCB0eXBlb2YoZmxvYXRbXVtdW11bXVtdW11bXVtdKSk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDksICJmbG9hdFs5XSIsIHR5cGVvZihmbG9hdFtdW11bXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCSAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBUeXBlIGV4cGVjdGVkQ2xhc3MgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfZmxvYXQuR2V0KCBuICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG4sIHYuR2V0TkRpbXMoKSApOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwkgICAgfQorICAgIAkKKyAgICAJCisJICAgIFtUZXN0XSAgCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKSAKKwkgICAgeworCQkgICAgVmFsaWRhdG9yX2Zsb2F0LkdldCggLTEgKTsKKwkgICAgfQorICAgIAkKKwkgICAgLyoqIEAgKi8KKwkgICAgW1Rlc3RdICAKKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfZmxvYXQuR2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwkgICAgfQorICAgIAkKKwkgICAgLyoqIEAgKi8KKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGVsZW1lbnR2YWxpZGF0b3IxKCkgCisJICAgIHsKKyAgICAgICAgICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAiZmxvYXRbMF0iLCB0eXBlb2YoZmxvYXQpICk7CisJCSAgICB0ZXN0ZWxlbWVudHZhbGlkYXRvciggMiwgImZsb2F0WzFdIiwgdHlwZW9mKGZsb2F0W10pICk7CisJCSAgICB0ZXN0ZWxlbWVudHZhbGlkYXRvciggMywgImZsb2F0WzJdIiwgdHlwZW9mKGZsb2F0W11bXSkpOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDQsICJmbG9hdFszXSIsIHR5cGVvZihmbG9hdFtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAiZmxvYXRbNF0iLCB0eXBlb2YoZmxvYXRbXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA2LCAiZmxvYXRbNV0iLCB0eXBlb2YoZmxvYXRbXVtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDcsICJmbG9hdFs2XSIsIHR5cGVvZihmbG9hdFtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAiZmxvYXRbN10iLCB0eXBlb2YoZmxvYXRbXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA5LCAiZmxvYXRbOF0iLCB0eXBlb2YoZmxvYXRbXVtdW11bXVtdW11bXVtdKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKyAgICAJCQorICAgIAkJCisJICAgIH0KKyAgICAJCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0ZWxlbWVudHZhbGlkYXRvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gKFR5cGVWYWxpZGF0b3IpIFZhbGlkYXRvcl9mbG9hdC5HZXQoIG4gKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG4tMSwgdi5HZXRORGltcygpICk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggZXhwZWN0ZWRDbGFzcywgdi5HZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCSAgICB9CisKKyAgICAJCisJICAgIFtUZXN0XSAgCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMigpIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfZmxvYXQuR2V0KCAwICkuRWxlbWVudFZhbGlkYXRvcigpOworCSAgICB9CisgICAgCQorCSAgICAvKiogQCAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSAKKwkgICAgeworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwwLjBmICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLDEuMWYgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsIC0xLjFmICk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICovCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBnb29kX2FycmF5KCkgCisJICAgIHsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgZmxvYXRbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMiwgIG5ldyBmbG9hdFtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDMsICBuZXcgZmxvYXRbXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDQsICBuZXcgZmxvYXRbXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggNSwgIG5ldyBmbG9hdFtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDYsICBuZXcgZmxvYXRbXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDcsICBuZXcgZmxvYXRbXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggOCwgIG5ldyBmbG9hdFtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDksICBuZXcgZmxvYXRbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCSAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHZvaWQgdGVzdGdvb2R2YWx1ZSggaW50IG4sICBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfZmxvYXQuR2V0KCBuICk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCB2YWx1ZSApICk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgLyoqIEAgKi8KKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGJhZF9zY2FsYXIoKSAKKwkgICAgeworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIHRydWUgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisgICAgLy8JCXRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOyBnb29kIQorCQkgICAgdGVzdGJhZHZhbHVlKCAwLCA2LjYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgIiIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgbmV3IE9iamVjdCgpICk7CisgICAgICAgICAgICB0ZXN0YmFkdmFsdWUoMCwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIG5ldyBEYXRlVGltZSgpICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCA2LjYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbmV3IE9iamVjdCgpICk7CisgICAgICAgICAgICB0ZXN0YmFkdmFsdWUoMSwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlVGltZSgpICk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICovCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBiYWRfYXJyYXkoKSAKKwkgICAgeworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBuZXcgZmxvYXRbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgZmxvYXRbXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDIsIG5ldyBmbG9hdFtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAzLCBuZXcgZmxvYXRbXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA0LCBuZXcgZmxvYXRbXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDUsIG5ldyBmbG9hdFtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA2LCBuZXcgZmxvYXRbXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA3LCBuZXcgZmxvYXRbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDgsIG5ldyBmbG9hdFtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA5LCBuZXcgZmxvYXRbXVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMiwgbmV3IGZsb2F0W10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMywgbmV3IGZsb2F0W11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA0LCBuZXcgZmxvYXRbXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggNSwgbmV3IGZsb2F0W11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggNiwgbmV3IGZsb2F0W11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA3LCBuZXcgZmxvYXRbXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggOCwgbmV3IGZsb2F0W11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggOSwgbmV3IGZsb2F0W11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJICAgIH0KKworCSAgICBwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2Zsb2F0LkdldCggbiApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJICAgIEFzc2VydC5Jc0ZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgYm9vbCB2YWxpZGF0ZVZhbHVlT2soIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBPYmplY3QgeCA9IHYuVmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCB4ICk7CisJCQkgICAgcmV0dXJuIHRydWU7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgIAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkgICAgfQorCisgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfaW50LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfaW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTk0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9pbnQuY3MKQEAgLTAsMCArMSwyODggQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgICAgIFtUZXN0Rml4dHVyZV0KKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfaW50CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RWYWxpZGF0b3JfaW50IiApOworICAgICAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSAgCisJICAgIHsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggMCwgImludFswXSIsIHR5cGVvZihpbnQpICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDEsICJpbnRbMV0iLCB0eXBlb2YoaW50W10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDIsICJpbnRbMl0iLCB0eXBlb2YoaW50W11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggMywgImludFszXSIsIHR5cGVvZihpbnRbXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDQsICJpbnRbNF0iLCB0eXBlb2YoaW50W11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDUsICJpbnRbNV0iLCB0eXBlb2YoaW50W11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggNiwgImludFs2XSIsIHR5cGVvZihpbnRbXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDcsICJpbnRbN10iLCB0eXBlb2YoaW50W11bXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDgsICJpbnRbOF0iLCB0eXBlb2YoaW50W11bXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggOSwgImludFs5XSIsIHR5cGVvZihpbnRbXVtdW11bXVtdW11bXVtdW10pICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorICAgIAkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3RvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2ludC5HZXQoIG4gKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggbiwgdi5HZXRORGltcygpICk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggZXhwZWN0ZWRDbGFzcywgdi5HZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCSAgICB9CisgICAgCQorICAgIAkKKwkgICAgW1Rlc3RdICAKKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpICAKKwkgICAgeworCQkgICAgVmFsaWRhdG9yX2ludC5HZXQoIC0xICk7CisJICAgIH0KKyAgICAJCisgICAgCQorCSAgICBbVGVzdF0gIAorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfaW50LkdldCggVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJICAgIH0KKyAgICAJCisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSAgCisJICAgIHsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAiaW50WzBdIiwgdHlwZW9mKGludCkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAiaW50WzFdIiwgdHlwZW9mKGludFtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJpbnRbMl0iLCB0eXBlb2YoaW50W11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAiaW50WzNdIiwgdHlwZW9mKGludFtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAiaW50WzRdIiwgdHlwZW9mKGludFtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJpbnRbNV0iLCB0eXBlb2YoaW50W11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCAiaW50WzZdIiwgdHlwZW9mKGludFtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAiaW50WzddIiwgdHlwZW9mKGludFtdW11bXVtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJpbnRbOF0iLCB0eXBlb2YoaW50W11bXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworICAgICAgCisJICAgIH0KKyAgICAJCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0ZWxlbWVudHZhbGlkYXRvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gKFR5cGVWYWxpZGF0b3IpIFZhbGlkYXRvcl9pbnQuR2V0KCBuICkuRWxlbWVudFZhbGlkYXRvcigpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBuLTEsIHYuR2V0TkRpbXMoKSApOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwkgICAgfQorCisgICAgCQorCSAgICBbVGVzdF0gIAorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSAgCisJICAgIHsKKwkJICAgIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkuRWxlbWVudFZhbGlkYXRvcigpOworCSAgICB9CisgICAgCQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGdvb2Rfc2NhbGFyKCkgIAorCSAgICB7CisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2J5dGUpIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2J5dGUpU0J5dGUuTWF4VmFsdWUgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgLTEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2J5dGUpIC02NCApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSlTQnl0ZS5NaW5WYWx1ZSk7CisKKwkJICAgIC8vIFNIT1JUUworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSAwICk7CisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIDEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIDY0ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSBTQnl0ZS5NYXhWYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCBJbnQxNi5NYXhWYWx1ZSApOworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgLTY0ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSBTQnl0ZS5NaW5WYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgLTIyMjIgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsIEludDE2Lk1pblZhbHVlICk7CisKKwkJICAgIC8vIElOVFMKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICA2NCApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChpbnQpIFNCeXRlLk1heFZhbHVlICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgMjIyMiApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChpbnQpIEludDE2Lk1heFZhbHVlICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgMzMzMzMzMzMgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBJbnQzMi5NYXhWYWx1ZSApOworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgLTEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAtNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoaW50KSBTQnl0ZS5NaW5WYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIC0yMjIyICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGludCkgSW50MTYuTWluVmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAtMzMzMzMzMzMgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBJbnQzMi5NaW5WYWx1ZSApOworCisJCSAgICAvLyBMT05HUworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAxICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIDY0ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIFNCeXRlLk1heFZhbHVlICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIDIyMjIgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgSW50MTYuTWF4VmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgMzMzMzMzMzMgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgSW50MzIuTWF4VmFsdWUgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgQnl0ZS5NaW5WYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtMjIyMiApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSBJbnQxNi5NaW5WYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtMzMzMzMzMzMgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgSW50MzIuTWluVmFsdWUgKTsKKwkgICAgfQorICAgIAkKKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBnb29kX2FycmF5KCkgIAorCSAgICB7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IGludFtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAyLCAgbmV3IGludFtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDMsICBuZXcgaW50W11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA0LCAgbmV3IGludFtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA1LCAgbmV3IGludFtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDYsICBuZXcgaW50W11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA3LCAgbmV3IGludFtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA4LCAgbmV3IGludFtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDksICBuZXcgaW50W11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorICAgIAkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3Rnb29kdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfaW50LkdldCggbiApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggdmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYmFkX3NjYWxhcigpICAKKwkgICAgeworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIHRydWUgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCA2LjYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgIiIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgbmV3IE9iamVjdCgpICk7CisgICAgICAgICAgICB0ZXN0YmFkdmFsdWUoMCwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIG5ldyBEYXRlVGltZSgpICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCA2LjYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbmV3IE9iamVjdCgpICk7CisgICAgICAgICAgICB0ZXN0YmFkdmFsdWUoMSwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlVGltZSgpICk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYmFkX2FycmF5KCkgIAorCSAgICB7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIG5ldyBpbnRbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgaW50W11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAyLCBuZXcgaW50W11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDMsIG5ldyBpbnRbXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA0LCBuZXcgaW50W11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA1LCBuZXcgaW50W11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDYsIG5ldyBpbnRbXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA3LCBuZXcgaW50W11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA4LCBuZXcgaW50W11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDksIG5ldyBpbnRbXVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMiwgbmV3IGludFtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDMsIG5ldyBpbnRbXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDQsIG5ldyBpbnRbXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggNSwgbmV3IGludFtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDYsIG5ldyBpbnRbXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDcsIG5ldyBpbnRbXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggOCwgbmV3IGludFtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDksIG5ldyBpbnRbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0YmFkdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfaW50LkdldCggbiApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJICAgIEFzc2VydC5Jc0ZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgYm9vbCB2YWxpZGF0ZVZhbHVlT2soIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBPYmplY3QgeCA9IHYuVmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCB4ICk7CisJCQkgICAgcmV0dXJuIHRydWU7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKyAgICAgICAgICAgICAgIAorCQkJICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3JfbG9uZy5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9yX2xvbmcuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhYTUxMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9yX2xvbmcuY3MKQEAgLTAsMCArMSwyOTYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgICAgIFtUZXN0Rml4dHVyZV0KKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfbG9uZworICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCisgICAgICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0VmFsaWRhdG9yX2xvbmciICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpICAKKwkgICAgeworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAwLCAibG9uZ1swXSIsIHR5cGVvZihsb25nKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAxLCAibG9uZ1sxXSIsIHR5cGVvZihsb25nW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDIsICJsb25nWzJdIiwgdHlwZW9mKGxvbmdbXVtdKSk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDMsICJsb25nWzNdIiwgdHlwZW9mKGxvbmdbXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDQsICJsb25nWzRdIiwgdHlwZW9mKGxvbmdbXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggNSwgImxvbmdbNV0iLCB0eXBlb2YobG9uZ1tdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDYsICJsb25nWzZdIiwgdHlwZW9mKGxvbmdbXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDcsICJsb25nWzddIiwgdHlwZW9mKGxvbmdbXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggOCwgImxvbmdbOF0iLCB0eXBlb2YobG9uZ1tdW11bXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDksICJsb25nWzldIiwgdHlwZW9mKGxvbmdbXVtdW11bXVtdW11bXVtdW10pICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorICAgIAkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3RvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2xvbmcuR2V0KCBuICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG4sIHYuR2V0TkRpbXMoKSApOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwkgICAgfQorICAgIAkKKyAgICAJCisJICAgIFtUZXN0XSAgCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKSAgCisJICAgIHsKKwkJICAgIFZhbGlkYXRvcl9sb25nLkdldCggLTEgKTsKKwkgICAgfQorICAgIAkKKyAgICAJCisJICAgIFtUZXN0XSAgCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjMoKSAgCisJICAgIHsKKwkJICAgIFZhbGlkYXRvcl9sb25nLkdldCggVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSAgCisJICAgIHsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAibG9uZ1swXSIsIHR5cGVvZihsb25nKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDIsICJsb25nWzFdIiwgdHlwZW9mKGxvbmdbXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAzLCAibG9uZ1syXSIsIHR5cGVvZihsb25nW11bXSkpOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDQsICJsb25nWzNdIiwgdHlwZW9mKGxvbmdbXVtdW10pICk7CisJCSAgICB0ZXN0ZWxlbWVudHZhbGlkYXRvciggNSwgImxvbmdbNF0iLCB0eXBlb2YobG9uZ1tdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJsb25nWzVdIiwgdHlwZW9mKGxvbmdbXVtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDcsICJsb25nWzZdIiwgdHlwZW9mKGxvbmdbXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0ZWxlbWVudHZhbGlkYXRvciggOCwgImxvbmdbN10iLCB0eXBlb2YobG9uZ1tdW11bXVtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJsb25nWzhdIiwgdHlwZW9mKGxvbmdbXVtdW11bXVtdW11bXVtdKSApOworCSAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisgICAgICAgICAgCisJICAgIH0KKyAgICAJCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0ZWxlbWVudHZhbGlkYXRvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gKFR5cGVWYWxpZGF0b3IpIFZhbGlkYXRvcl9sb25nLkdldCggbiApLkVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggbi0xLCB2LkdldE5EaW1zKCkgKTsKKwkJICAgIEFzc2VydC5BcmVTYW1lKCBleHBlY3RlZENsYXNzLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBkZXNjciwgdi5Ub1N0cmluZygpICk7CisJICAgIH0KKworICAgIAkKKwkgICAgW1Rlc3RdICAKKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGVsZW1lbnR2YWxpZGF0b3IyKCkgIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSAgCisJICAgIHsKKwkJICAgIC8vIEJZVEVTCisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2J5dGUpIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBTQnl0ZS5NYXhWYWx1ZSApOworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNieXRlKSAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgLTY0ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgU0J5dGUuTWluVmFsdWUgKTsKKworCQkgICAgLy8gU0hPUlRTCisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIDAgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIFNCeXRlLk1heFZhbHVlICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSAyMjIyICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgSW50MTYuTWF4VmFsdWUgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgLTEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIC02NCApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgU0J5dGUuTWluVmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIC0yMjIyICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgSW50MTYuTWluVmFsdWUgKTsKKworCQkgICAgLy8gSU5UUworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgMCApOworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDY0ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGludCkgU0J5dGUuTWF4VmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAyMjIyICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGludCkgSW50MTYuTWF4VmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAzMzMzMzMzMyApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIEludDMyLk1heFZhbHVlICk7CisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIC02NCApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChpbnQpIFNCeXRlLk1pblZhbHVlICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgLTIyMjIgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAoaW50KSBJbnQxNi5NaW5WYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIC0zMzMzMzMzMyApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIEludDMyLk1pblZhbHVlICk7CisKKwkJICAgIC8vIExPTkdTCisgICAgCQkKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgMCApOworICAgIAkJCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIDEgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgU0J5dGUuTWF4VmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgMjIyMiApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSBJbnQxNi5NYXhWYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAzMzMzMzMzMyApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSBJbnQzMi5NYXhWYWx1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgSW50NjQuTWF4VmFsdWUgKTsKKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtNjQgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgU0J5dGUuTWluVmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgLTIyMjIgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgSW50MTYuTWluVmFsdWUgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgLTMzMzMzMzMzICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIEludDMyLk1pblZhbHVlICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgLTQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgSW50NjQuTWluVmFsdWUgKTsKKwkgICAgfQorICAgIAkKKwkgICAgLyoqIEAgICovCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBnb29kX2FycmF5KCkgIAorCSAgICB7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IGxvbmdbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMiwgIG5ldyBsb25nW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMywgIG5ldyBsb25nW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA0LCAgbmV3IGxvbmdbXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggNSwgIG5ldyBsb25nW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggNiwgIG5ldyBsb25nW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCA3LCAgbmV3IGxvbmdbXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggOCwgIG5ldyBsb25nW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggOSwgIG5ldyBsb25nW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorICAgIAkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3Rnb29kdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfbG9uZy5HZXQoIG4gKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCSAgICB9CisgICAgCQorCSAgICAvKiogQCAgKi8KKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGJhZF9zY2FsYXIoKSAgCisJICAgIHsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgbnVsbCApOworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBmYWxzZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisgICAgLy8JCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsgZ29vZCEKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCAoc2hvcnQpIDIyMjIgKTsgZ29vZCEKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCAzMzMzMzMzMyApOyBnb29kIQorICAgIC8vCQl0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7IGdvb2QhCisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIDUuNWYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMCwgNi42ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsICJhYmMiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDAsIG5ldyBPYmplY3QoKSApOworICAgICAgICAgICAgdGVzdGJhZHZhbHVlKDAsIG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImFiYyIpLCB2ZikpOworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBuZXcgRGF0ZVRpbWUoKSApOworCisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG51bGwgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgZmFsc2UgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgdHJ1ZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAoYnl0ZSkgMSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAoc2hvcnQpIDIyMjIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgMzMzMzMzICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIDUuNWYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNi42ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsICJhYmMiICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworICAgICAgICAgICAgdGVzdGJhZHZhbHVlKDEsIG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImFiYyIpLCB2ZikpOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgRGF0ZVRpbWUoKSApOworCSAgICB9CisgICAgCQorCSAgICAvKiogQCAgKi8KKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGJhZF9hcnJheSgpICAKKwkgICAgeworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBuZXcgbG9uZ1tdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG5ldyBsb25nW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAyLCBuZXcgbG9uZ1tdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAzLCBuZXcgbG9uZ1tdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDQsIG5ldyBsb25nW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA1LCBuZXcgbG9uZ1tdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA2LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDcsIG5ldyBsb25nW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA4LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA5LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKworCQkgICAgdGVzdGJhZHZhbHVlKCAyLCBuZXcgbG9uZ1tdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDMsIG5ldyBsb25nW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA0LCBuZXcgbG9uZ1tdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA1LCBuZXcgbG9uZ1tdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDYsIG5ldyBsb25nW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA3LCBuZXcgbG9uZ1tdW11bXVtdW11bXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCA4LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDksIG5ldyBsb25nW11bXVtdW11bXVtdW11bXSB7fSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJICAgIH0KKworCSAgICBwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2xvbmcuR2V0KCBuICk7CisJCSAgICBBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCSAgICB9CisKKwkgICAgcHJpdmF0ZSBib29sIHZhbGlkYXRlVmFsdWVPayggVmFsaWRhdG9yIHYsIE9iamVjdCB2YWx1ZSApCisJICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIE9iamVjdCB4ID0gdi5WYWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQkJICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHggKTsKKwkJCSAgICByZXR1cm4gdHJ1ZTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uICApCisJCSAgICB7CisgICAgICAgICAgICAgIAorCQkJICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfb2JqZWN0LmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfb2JqZWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YTBjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9vYmplY3QuY3MKQEAgLTAsMCArMSwzMzIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgICAgIFtUZXN0Rml4dHVyZV0KKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3Jfb2JqZWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RWYWxpZGF0b3Jfb2JqZWN0IiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgIAorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgIAorCSAgICB7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDAsICJvYmplY3RbMF0iLCB0eXBlb2YoT2JqZWN0KSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAxLCAib2JqZWN0WzFdIiwgdHlwZW9mKE9iamVjdFtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCAyLCAib2JqZWN0WzJdIiwgdHlwZW9mKE9iamVjdFtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDMsICJvYmplY3RbM10iLCB0eXBlb2YoT2JqZWN0W11bXVtdKSApOworCQkgICAgdGVzdGNvbnN0cnVjdG9yKCA0LCAib2JqZWN0WzRdIiwgdHlwZW9mKE9iamVjdFtdW11bXVtdKSk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDUsICJvYmplY3RbNV0iLCB0eXBlb2YoT2JqZWN0W11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggNiwgIm9iamVjdFs2XSIsIHR5cGVvZihPYmplY3RbXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDcsICJvYmplY3RbN10iLCB0eXBlb2YoT2JqZWN0W11bXVtdW11bXVtdW10pICk7CisJCSAgICB0ZXN0Y29uc3RydWN0b3IoIDgsICJvYmplY3RbOF0iLCB0eXBlb2YoT2JqZWN0W11bXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3Rjb25zdHJ1Y3RvciggOSwgIm9iamVjdFs5XSIsIHR5cGVvZihPYmplY3RbXVtdW11bXVtdW11bXVtdW10pICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorICAgIAkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3RvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX29iamVjdC5HZXQoIG4gKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggbiwgdi5HZXRORGltcygpICk7CisJCSAgICBBc3NlcnQuQXJlU2FtZSggZXhwZWN0ZWRDbGFzcywgdi5HZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCSAgICB9CisgICAgCQorICAgIAkKKwkgICAgW1Rlc3RdICAKKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpICAKKwkgICAgeworCQkgICAgVmFsaWRhdG9yX29iamVjdC5HZXQoIC0xICk7CisJICAgIH0KKyAgICAJCisgICAgCQorCSAgICBbVGVzdF0gIAorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgIAorCSAgICB7CisJCSAgICBWYWxpZGF0b3Jfb2JqZWN0LkdldCggVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJICAgIH0KKyAgICAJCisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSAgCisJICAgIHsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAwLCAwLCAib2JqZWN0WzBdIiwgdHlwZW9mKE9iamVjdCkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAwLCAib2JqZWN0WzBdIiwgdHlwZW9mKE9iamVjdCkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAxLCAib2JqZWN0WzFdIiwgdHlwZW9mKE9iamVjdFtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsIDIsICJvYmplY3RbMl0iLCB0eXBlb2YoT2JqZWN0W11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAzLCAib2JqZWN0WzNdIiwgdHlwZW9mKE9iamVjdFtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCA0LCAib2JqZWN0WzRdIiwgdHlwZW9mKE9iamVjdFtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsIDUsICJvYmplY3RbNV0iLCB0eXBlb2YoT2JqZWN0W11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCA2LCAib2JqZWN0WzZdIiwgdHlwZW9mKE9iamVjdFtdW11bXVtdW11bXSkgKTsKKwkJICAgIHRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCA3LCAib2JqZWN0WzddIiwgdHlwZW9mKE9iamVjdFtdW11bXVtdW11bXVtdKSApOworCQkgICAgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksIDgsICJvYmplY3RbOF0iLCB0eXBlb2YoT2JqZWN0W11bXVtdW11bXVtdW11bXSkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCSAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHZvaWQgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIGludCBuLCBpbnQgaywgU3RyaW5nIGRlc2NyLCBUeXBlIGV4cGVjdGVkQ2xhc3MgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSAoVHlwZVZhbGlkYXRvcikgVmFsaWRhdG9yX29iamVjdC5HZXQoIG4gKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGssIHYuR2V0TkRpbXMoKSApOworCQkgICAgQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgLyoqIEAgICovCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBnb29kX3NjYWxhcigpICAKKwkgICAgeworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIGZhbHNlICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgdHJ1ZSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgMSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgMjIyMiApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIDMzMzMzMzMzICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICA1LjVmICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgNi42ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgIiIgKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICAiYWJjIiApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBPYmplY3QoKSApOworICAgICAgICAgICAgdGVzdGdvb2R2YWx1ZSgwLCBuZXcgU3RydWN0VmFsdWUobmV3IFhUeXBlKCJhYmMiKSwgdmYpKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBuZXcgRGF0ZVRpbWUoKSApOworCSAgICB9CisgICAgCQorCSAgICAvKiogQCAgKi8KKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGdvb2RfYXJyYXkoKSAgCisJICAgIHsKKwkJICAgIC8vIHByaW1pdGl2ZSBhcnJheSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG9iamVjdC4KKyAgICAJCQorCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBib29sW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBuZXcgc2J5dGVbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBzaG9ydFtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgbmV3IGludFtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgbmV3IGxvbmdbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBmbG9hdFtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgbmV3IGRvdWJsZVtdIHt9ICk7CisgICAgCQkKKwkJICAgIC8vIHJlZiBhcnJheSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG9iamVjdC4KKworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBCb29sZWFuW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBuZXcgU0J5dGVbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBJbnQxNltdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgbmV3IEludDMyW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDAsICBuZXcgSW50NjRbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBTaW5nbGVbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBEb3VibGVbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBTdHJpbmdbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBPYmplY3RbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMCwgIG5ldyBTdHJ1Y3RWYWx1ZVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAwLCAgbmV3IERhdGVUaW1lW10ge30gKTsKKyAgICAJCQorCQkgICAgLy8gcmVmIGFycmF5IHR5cGVzIGFyZSBjb21wYXRpYmxlIHdpdGggb2JqZWN0IGFycmF5IChzYW1lIHNpemUpLgorCSAgICAgICAKKwkJLyogICAgdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBCb29sZWFuW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgU0J5dGVbXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBJbnQxNltdIHt9ICk7IAorCQkgICAgdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBJbnQzMltdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IEludDY0W10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgU2luZ2xlW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgRG91YmxlW10ge30gKTsgKi8KKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgU3RyaW5nW10ge30gKTsgCisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IE9iamVjdFtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IFN0cnVjdFZhbHVlW10ge30gKTsKKy8vCQkgICAgdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBEYXRlVGltZVtdIHt9ICk7CisgICAgCQkKKwkJICAgIC8vIHJlZiBhcnJheSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG9iamVjdCBhcnJheSAobGFyZ2VyIHNpemUpLgorICAgIAkJCisvKgkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgQm9vbGVhbltdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgU0J5dGVbXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IEludDE2W11bXSB7fSApOworCQkgICAgdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBJbnQzMltdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgSW50NjRbXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IFNpbmdsZVtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgRG91YmxlW11bXSB7fSApOyAqLworCQkgICAgdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBTdHJpbmdbXVtdIHt9ICk7CisJCSAgICB0ZXN0Z29vZHZhbHVlKCAxLCAgbmV3IE9iamVjdFtdW10ge30gKTsKKwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgU3RydWN0VmFsdWVbXVtdIHt9ICk7CisvLwkJICAgIHRlc3Rnb29kdmFsdWUoIDEsICBuZXcgRGF0ZVRpbWVbXVtdIHt9ICk7CisJICAgIH0KKyAgICAJCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0Z29vZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX29iamVjdC5HZXQoIG4gKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCSAgICB9CisgICAgCQorCSAgICAvKiogQCAgKi8KKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGFzc2lnbmFibGUxKCkgIAorCSAgICB7CisJCSAgICBPYmplY3QgeDsKKyAgICAJCQorCQkgICAgeCA9IG5ldyBPYmplY3QoKTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHgxKCB0eXBlb2YoT2JqZWN0KSwgdHlwZW9mKE9iamVjdCkgKSApOworCisJCSAgICB4ID0gbmV3IE9iamVjdFtdIHt9OworCQkgICAgQXNzZXJ0LklzVHJ1ZSggeDEoIHR5cGVvZihPYmplY3QpLCB0eXBlb2YoT2JqZWN0W10pICkgKTsKKyAgICAJCQorCQkgICAgeCA9IG5ldyBPYmplY3RbXVtdIHt9OworCQkgICAgQXNzZXJ0LklzVHJ1ZSggeDEoIHR5cGVvZihPYmplY3QpLCB0eXBlb2YoT2JqZWN0W11bXSkgKSApOworCisJCSAgICB4ID0gbmV3IEludDMyKCk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCB4MSggdHlwZW9mKE9iamVjdCksIHR5cGVvZihJbnQzMikgKSApOworICAgIAkJCisJCSAgICB4ID0gbmV3IEludDMyW10ge307CisJCSAgICBBc3NlcnQuSXNUcnVlKCB4MSggdHlwZW9mKE9iamVjdCksIHR5cGVvZihJbnQzMltdKSApICk7CisKKwkJICAgIHggPSBuZXcgaW50W10ge307CisJCSAgICBBc3NlcnQuSXNUcnVlKCB4MSh0eXBlb2YoT2JqZWN0KSwgdHlwZW9mKGludCkgKSApOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNOb3ROdWxsKCB4ICk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYXNzaWduYWJsZTIoKSAgCisJICAgIHsKKwkJICAgIE9iamVjdFtdIHk7CisgICAgCQkKKyAgICAvLwkJeSA9IG5ldyBPYmplY3QoKTsKKwkJICAgIEFzc2VydC5Jc0ZhbHNlKCB4MSggdHlwZW9mKE9iamVjdFtdKSwgdHlwZW9mKE9iamVjdCkgKSApOworCisJCSAgICB5ID0gbmV3IE9iamVjdFtdIHt9OworCQkgICAgQXNzZXJ0LklzVHJ1ZSggeDEoICB0eXBlb2YoT2JqZWN0W10pLCAgdHlwZW9mKE9iamVjdFtdKSApICk7CisgICAgCQkKKwkJICAgIHkgPSBuZXcgT2JqZWN0W11bXSB7fTsKKwkJICAgIEFzc2VydC5Jc1RydWUoIHgxKCAgdHlwZW9mKE9iamVjdFtdKSwgdHlwZW9mKE9iamVjdFtdW10pICkgKTsKKworICAgIC8vCQl5ID0gbmV3IEludGVnZXIoIDAgKTsKKwkJICAgIEFzc2VydC5Jc0ZhbHNlKCB4MSggIHR5cGVvZihPYmplY3RbXSksIHR5cGVvZihJbnQzMikgKSApOworICAgIAkJCisgICAgCQkKKworICAgIC8vCQl5ID0gbmV3IGludFtdIHt9OworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHgxKCAgdHlwZW9mKE9iamVjdFtdKSwgdHlwZW9mKGludFtdKSApICk7CisJICAgIH0KKyAgICAJCisgICAgCQorICAgIAkKKwkgICAgcHJpdmF0ZSBib29sIHgxKCBUeXBlIGEsIFR5cGUgYiApCisJICAgIHsKKwkJICAgIHJldHVybiBhLklzQXNzaWduYWJsZUZyb20oIGIgKTsKKwkgICAgfQorCisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYmFkX3NjYWxhcigpICAKKwkgICAgeworCQkgICAgdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisgICAgLy8JCXRlc3RiYWR2YWx1ZSggMCwgZmFsc2UgKTsKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisgICAgLy8JCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCAoc2hvcnQpIDIyMjIgKTsKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCAzMzMzMzMzMyApOworICAgIC8vCQl0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisgICAgLy8JCXRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOworICAgIC8vCQl0ZXN0YmFkdmFsdWUoIDAsIDYuNiApOworICAgIC8vCQl0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisgICAgLy8JCXRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApICkgKTsKKyAgICAvLwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgRGF0ZSgpICk7CisKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCA2LjYgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbmV3IE9iamVjdCgpICk7CisgICAgICAgICAgICB0ZXN0YmFkdmFsdWUoMSwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlVGltZSgpICk7CisJICAgIH0KKyAgICAJCisJICAgIC8qKiBAICAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYmFkX2FycmF5KCkgIAorCSAgICB7CisJCSAgICAvLyBwcmltaXRpdmUgYXJyYXlzIGNhbm5vdCBtYXAgaW50byBvYmplY3QgYXJyYXlzLi4uCisgICAgCQkKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbmV3IGJvb2xbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgc2J5dGVbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgc2hvcnRbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgaW50W10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggMSwgbmV3IGxvbmdbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgZmxvYXRbXSB7fSApOworCQkgICAgdGVzdGJhZHZhbHVlKCAxLCBuZXcgZG91YmxlW10ge30gKTsKKworCQkgICAgLy8gdG9vIHNob3J0Li4uCisgICAgCQkKKwkJICAgIHRlc3RiYWR2YWx1ZSggMiwgbmV3IE9iamVjdFtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDMsIG5ldyBPYmplY3RbXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDQsIG5ldyBPYmplY3RbXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggNSwgbmV3IE9iamVjdFtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDYsIG5ldyBPYmplY3RbXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDcsIG5ldyBPYmplY3RbXVtdW11bXVtdW10ge30gKTsKKwkJICAgIHRlc3RiYWR2YWx1ZSggOCwgbmV3IE9iamVjdFtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICB0ZXN0YmFkdmFsdWUoIDksIG5ldyBPYmplY3RbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0YmFkdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICBUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3Jfb2JqZWN0LkdldCggbiApOworCQkgICAgQXNzZXJ0LklzRmFsc2UoIHYuVmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJICAgIEFzc2VydC5Jc0ZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgYm9vbCB2YWxpZGF0ZVZhbHVlT2soIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBPYmplY3QgeCA9IHYuVmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCB4ICk7CisJCQkgICAgcmV0dXJuIHRydWU7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKyAgICAgICAgICAgICAgIAorCQkJICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkgICAgfQorCisgICAgICAgCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9zaG9ydC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9yX3Nob3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjBhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9zaG9ydC5jcwpAQCAtMCwwICsxLDI4MyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3Jfc2hvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0VmFsaWRhdG9yX3Nob3J0IiApOworICAgICAgICB9CisKKyAgICBbVGVzdF0KKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSAgCisJeworCQl0ZXN0Y29uc3RydWN0b3IoIDAsICJzaG9ydFswXSIsIHR5cGVvZihzaG9ydCkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAxLCAic2hvcnRbMV0iLCB0eXBlb2Yoc2hvcnRbXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAyLCAic2hvcnRbMl0iLCB0eXBlb2Yoc2hvcnRbXVtdKSApOworCQl0ZXN0Y29uc3RydWN0b3IoIDMsICJzaG9ydFszXSIsIHR5cGVvZihzaG9ydFtdW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA0LCAic2hvcnRbNF0iLCB0eXBlb2Yoc2hvcnRbXVtdW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA1LCAic2hvcnRbNV0iLCB0eXBlb2Yoc2hvcnRbXVtdW11bXVtdKSApOworCQl0ZXN0Y29uc3RydWN0b3IoIDYsICJzaG9ydFs2XSIsIHR5cGVvZihzaG9ydFtdW11bXVtdW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA3LCAic2hvcnRbN10iLCB0eXBlb2Yoc2hvcnRbXVtdW11bXVtdW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA4LCAic2hvcnRbOF0iLCB0eXBlb2Yoc2hvcnRbXVtdW11bXVtdW11bXVtdKSApOworCQl0ZXN0Y29uc3RydWN0b3IoIDksICJzaG9ydFs5XSIsIHR5cGVvZihzaG9ydFtdW11bXVtdW11bXVtdW11bXSkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0Y29uc3RydWN0b3IoIGludCBuLCBTdHJpbmcgZGVzY3IsIFR5cGUgZXhwZWN0ZWRDbGFzcyApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3Jfc2hvcnQuR2V0KCBuICk7CisJCUFzc2VydC5BcmVFcXVhbCggbiwgdi5HZXRORGltcygpICk7CisJCUFzc2VydC5BcmVTYW1lKCBleHBlY3RlZENsYXNzLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwl9CisJCisJLyoqIEAgICovCisJW1Rlc3RdICAKKyAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKSAgCisJeworCQlWYWxpZGF0b3Jfc2hvcnQuR2V0KCAtMSApOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0gIAorICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpICAKKwl7CisJCVZhbGlkYXRvcl9zaG9ydC5HZXQoIFZhbGlkYXRvci5NQVhfTkRJTVMrMSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMSgpICAKKwl7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAic2hvcnRbMF0iLCB0eXBlb2Yoc2hvcnQpICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAic2hvcnRbMV0iLCB0eXBlb2Yoc2hvcnRbXSkgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJzaG9ydFsyXSIsIHR5cGVvZihzaG9ydFtdW10pICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAic2hvcnRbM10iLCB0eXBlb2Yoc2hvcnRbXVtdW10pICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAic2hvcnRbNF0iLCB0eXBlb2Yoc2hvcnRbXVtdW11bXSkgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJzaG9ydFs1XSIsIHR5cGVvZihzaG9ydFtdW11bXVtdW10pICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCAic2hvcnRbNl0iLCB0eXBlb2Yoc2hvcnRbXVtdW11bXVtdW10pICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAic2hvcnRbN10iLCB0eXBlb2Yoc2hvcnRbXVtdW11bXVtdW11bXSkpOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggOSwgInNob3J0WzhdIiwgdHlwZW9mKHNob3J0W11bXVtdW11bXVtdW11bXSkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0ZWxlbWVudHZhbGlkYXRvciggaW50IG4sIFN0cmluZyBkZXNjciwgVHlwZSBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IChUeXBlVmFsaWRhdG9yKSBWYWxpZGF0b3Jfc2hvcnQuR2V0KCBuICkuRWxlbWVudFZhbGlkYXRvcigpOworCQlBc3NlcnQuQXJlRXF1YWwoIG4tMSwgdi5HZXRORGltcygpICk7CisJCUFzc2VydC5BcmVTYW1lKCBleHBlY3RlZENsYXNzLCB2LkdldEV4cGVjdGVkQ2xhc3MoKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIGRlc2NyLCB2LlRvU3RyaW5nKCkgKTsKKwl9CisKKwkvKiogQCAgKi8KKwlbVGVzdF0gIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCXB1YmxpYyB2b2lkIGVsZW1lbnR2YWxpZGF0b3IyKCkgIAorCXsKKwkJVmFsaWRhdG9yX3Nob3J0LkdldCggMCApLkVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9CisJCisJLyoqIEAgICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSAgCisJeworCQkvLyBCWVRFUworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChzYnl0ZSkgMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgKHNieXRlKSA2NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgU0J5dGUuTWF4VmFsdWUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsICAoc2J5dGUpIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsICAoc2J5dGUpIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgU0J5dGUuTWluVmFsdWUgKTsKKworCQkvLyBTSE9SVFMKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIDAgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgU0J5dGUuTWF4VmFsdWUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChzaG9ydCkgMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgSW50MTYuTWF4VmFsdWUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsICAoc2hvcnQpIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSBTQnl0ZS5NaW5WYWx1ZSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgKHNob3J0KSAtMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgSW50MTYuTWluVmFsdWUgKTsKKworCQkvLyBJTlRTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsICAoaW50KSBTQnl0ZS5NYXhWYWx1ZSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgKGludCkgSW50MTYuTWF4VmFsdWUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsICAtMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgLTY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsICAoaW50KSBTQnl0ZS5NaW5WYWx1ZSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgLTIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChpbnQpIEludDE2Lk1pblZhbHVlICk7CisKKwkJLy8gTE9OR1MKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAxICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSBTQnl0ZS5NYXhWYWx1ZSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIDIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSBJbnQxNi5NYXhWYWx1ZSApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSAtMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgKGxvbmcpIFNCeXRlLk1pblZhbHVlICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsICAobG9uZykgLTIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgIChsb25nKSBJbnQxNi5NaW5WYWx1ZSApOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBnb29kX2FycmF5KCkgIAorCXsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgIG5ldyBzaG9ydFtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDIsICBuZXcgc2hvcnRbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDMsICBuZXcgc2hvcnRbXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNCwgIG5ldyBzaG9ydFtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDUsICBuZXcgc2hvcnRbXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDYsICBuZXcgc2hvcnRbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNywgIG5ldyBzaG9ydFtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDgsICBuZXcgc2hvcnRbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDksICBuZXcgc2hvcnRbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0Z29vZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9zaG9ydC5HZXQoIG4gKTsKKwkJQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQlBc3NlcnQuSXNUcnVlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisJCisJLyoqIEAgICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgYmFkX3NjYWxhcigpICAKKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgdHJ1ZSApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsgZ29vZCEKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOyBnb29kIQorCQl0ZXN0YmFkdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBPYmplY3QoKSApOworICAgICAgICB0ZXN0YmFkdmFsdWUoMCwgbmV3IFN0cnVjdFZhbHVlKG5ldyBYVHlwZSgiYWJjIiksIHZmKSk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IERhdGVUaW1lKCkgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDEsIG51bGwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIHRydWUgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoYnl0ZSkgMSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgT2JqZWN0KCkgKTsKKyAgICAgICAgdGVzdGJhZHZhbHVlKDEsIG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImFiYyIpLCB2ZikpOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlVGltZSgpICk7CisJfQorCQorCS8qKiBAICAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIGJhZF9hcnJheSgpICAKKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IHNob3J0W10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgc2hvcnRbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IHNob3J0W11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMywgbmV3IHNob3J0W11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgc2hvcnRbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IHNob3J0W11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNiwgbmV3IHNob3J0W11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgc2hvcnRbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IHNob3J0W11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOSwgbmV3IHNob3J0W11bXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgc2hvcnRbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBzaG9ydFtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgc2hvcnRbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgc2hvcnRbXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBzaG9ydFtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgc2hvcnRbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgc2hvcnRbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBzaG9ydFtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RiYWR2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3Jfc2hvcnQuR2V0KCBuICk7CisJCUFzc2VydC5Jc0ZhbHNlKCB2LlZhbGlkYXRlKCB2YWx1ZSApICk7CisJCUFzc2VydC5Jc0ZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2wgdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYuVmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uICkKKwkJeworICAgICAgICAgICAgCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKyAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfc3RyaW5nLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfc3RyaW5nLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2NiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl9zdHJpbmcuY3MKQEAgLTAsMCArMSwyMjcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0Cit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yX3N0cmluZworICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRHVtbXlWYWx1ZUZhY3RvcnkoKTsKKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RWYWxpZGF0b3Jfc3RyaW5nIiApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgIAorCXsKKwkJdGVzdGNvbnN0cnVjdG9yKCAwLCAic3RyaW5nWzBdIiwgdHlwZW9mKHN0cmluZykgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAxLCAic3RyaW5nWzFdIiwgdHlwZW9mKHN0cmluZ1tdKSk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgInN0cmluZ1syXSIsIHR5cGVvZihzdHJpbmdbXVtdKSApOworCQl0ZXN0Y29uc3RydWN0b3IoIDMsICJzdHJpbmdbM10iLCB0eXBlb2Yoc3RyaW5nW11bXVtdKSApOworCQl0ZXN0Y29uc3RydWN0b3IoIDQsICJzdHJpbmdbNF0iLCB0eXBlb2Yoc3RyaW5nW11bXVtdW10pKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA1LCAic3RyaW5nWzVdIiwgdHlwZW9mKHN0cmluZ1tdW11bXVtdW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNiwgInN0cmluZ1s2XSIsIHR5cGVvZihzdHJpbmdbXVtdW11bXVtdW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgInN0cmluZ1s3XSIsIHR5cGVvZihzdHJpbmdbXVtdW11bXVtdW11bXSkgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA4LCAic3RyaW5nWzhdIiwgdHlwZW9mKHN0cmluZ1tdW11bXVtdW11bXVtdW10pICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOSwgInN0cmluZ1s5XSIsIHR5cGVvZihzdHJpbmdbXVtdW11bXVtdW11bXVtdW10pICk7CisJCUFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgc3RyaW5nIGRlc2NyLCBUeXBlIGV4cGVjdGVkQ2xhc3MgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX3N0cmluZy5HZXQoIG4gKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCBuLCB2LkdldE5EaW1zKCkgKTsKKwkJQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCUFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0gIAorICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpICAKKwl7CisJCVZhbGlkYXRvcl9zdHJpbmcuR2V0KCAtMSApOworCX0KKwkKKwkvKiogQCAgKi8KKwlbVGVzdF0gIAorICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpICAKKwl7CisJCVZhbGlkYXRvcl9zdHJpbmcuR2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9CisJCisJLyoqIEAgICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSAgCisJeworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMSwgInN0cmluZ1swXSIsIHR5cGVvZihzdHJpbmcpICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAic3RyaW5nWzFdIiwgdHlwZW9mKHN0cmluZ1tdKSApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMywgInN0cmluZ1syXSIsIHR5cGVvZihzdHJpbmdbXVtdKSApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNCwgInN0cmluZ1szXSIsIHR5cGVvZihzdHJpbmdbXVtdW10pICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAic3RyaW5nWzRdIiwgdHlwZW9mKHN0cmluZ1tdW11bXVtdKSApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNiwgInN0cmluZ1s1XSIsIHR5cGVvZihzdHJpbmdbXVtdW11bXVtdKSApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNywgInN0cmluZ1s2XSIsIHR5cGVvZihzdHJpbmdbXVtdW11bXVtdW10pICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAic3RyaW5nWzddIiwgdHlwZW9mKHN0cmluZ1tdW11bXVtdW11bXVtdKSApOworICAgICAgICB0ZXN0ZWxlbWVudHZhbGlkYXRvcig5LCAgInN0cmluZ1s4XSIsIHR5cGVvZihzdHJpbmdbXVtdW11bXVtdW11bXVtdKSk7CisJCUFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIGludCBuLCBzdHJpbmcgZGVzY3IsIFR5cGUgZXhwZWN0ZWRDbGFzcyApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSAoVHlwZVZhbGlkYXRvcikgVmFsaWRhdG9yX3N0cmluZy5HZXQoIG4gKS5FbGVtZW50VmFsaWRhdG9yKCk7CisJCUFzc2VydC5BcmVFcXVhbCggbi0xLCB2LkdldE5EaW1zKCkgKTsKKwkJQXNzZXJ0LkFyZVNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuR2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCUFzc2VydC5BcmVFcXVhbCggZGVzY3IsIHYuVG9TdHJpbmcoKSApOworCX0KKworCS8qKiBAICAqLworCVtUZXN0XSAgCisgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSAgCisJeworCQlWYWxpZGF0b3Jfc3RyaW5nLkdldCggMCApLkVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9CisJCisJLyoqIEAgICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSAgCisJeworCQl0ZXN0Z29vZHZhbHVlKCAwLCAiIiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAgImFiYyIgKTsKKwl9CisJCisJLyoqIEAgICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgZ29vZF9hcnJheSgpICAKKwl7CisJCXRlc3Rnb29kdmFsdWUoIDEsICBuZXcgc3RyaW5nW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMiwgIG5ldyBzdHJpbmdbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDMsICBuZXcgc3RyaW5nW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDQsICBuZXcgc3RyaW5nW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNSwgIG5ldyBzdHJpbmdbXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDYsICBuZXcgc3RyaW5nW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDcsICBuZXcgc3RyaW5nW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOCwgIG5ldyBzdHJpbmdbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDksICBuZXcgc3RyaW5nW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCUFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGdvb2R2YWx1ZSggaW50IG4sICBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX3N0cmluZy5HZXQoIG4gKTsKKwkJQXNzZXJ0LklzVHJ1ZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQlBc3NlcnQuSXNUcnVlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisJCisJLyoqIEAgICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgYmFkX3NjYWxhcigpICAKKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgdHJ1ZSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIChieXRlKSAxICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgMzMzMzMzMzMgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDUuNWYgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA2LjYgKTsKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsICIiICk7IC8vIGdvb2QhCisvLwkJdGVzdGJhZHZhbHVlKCAwLCAiYWJjIiApOyAvLyBnb29kIQorCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFhUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IERhdGVUaW1lKCkgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDEsIG51bGwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIHRydWUgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoYnl0ZSkgMSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgT2JqZWN0KCkgKTsKKyAgICAgICAgdGVzdGJhZHZhbHVlKDEsIG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImFiYyIpLCB2ZikpOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlVGltZSgpICk7CisJfQorCQorCS8qKiBAICAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIGJhZF9hcnJheSgpICAKKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IHN0cmluZ1tdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IHN0cmluZ1tdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgc3RyaW5nW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMywgbmV3IHN0cmluZ1tdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IHN0cmluZ1tdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgc3RyaW5nW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNiwgbmV3IHN0cmluZ1tdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IHN0cmluZ1tdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgc3RyaW5nW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOSwgbmV3IHN0cmluZ1tdW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCUFzc2VydC5BcmVFcXVhbCggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IHN0cmluZ1tdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMywgbmV3IHN0cmluZ1tdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgc3RyaW5nW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IHN0cmluZ1tdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNiwgbmV3IHN0cmluZ1tdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgc3RyaW5nW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IHN0cmluZ1tdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOSwgbmV3IHN0cmluZ1tdW11bXVtdW11bXVtdW10ge30gKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RiYWR2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3Jfc3RyaW5nLkdldCggbiApOworCQlBc3NlcnQuSXNGYWxzZSggdi5WYWxpZGF0ZSggdmFsdWUgKSApOworCQlBc3NlcnQuSXNGYWxzZSggdmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJfQorCisJcHJpdmF0ZSBib29sIHZhbGlkYXRlVmFsdWVPayggVmFsaWRhdG9yIHYsIE9iamVjdCB2YWx1ZSApCisJeworCQl0cnkKKwkJeworCQkJT2JqZWN0IHggPSB2LlZhbGlkYXRlVmFsdWUoIHZhbHVlICk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCB4ICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiAgKQorCQl7CisgICAgICAgICAgIAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcl92b2lkLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfdm9pZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU4MDMzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9TdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfdm9pZC5jcwpAQCAtMCwwICsxLDc5IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl92b2lkCisgICAgeworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RWYWxpZGF0b3Jfdm9pZCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdCggMCwgInZvaWRbMF0iLCBudWxsLCAoIHNieXRlICkgMSApOworICAgICAgICAgICAgVGVzdCggMCwgInZvaWRbMF0iLCAgbnVsbCwgKCBmbG9hdCApIDEgKTsKKyAgICAgICAgICAgIFRlc3QoIDAsICJ2b2lkWzBdIiwgIG51bGwsICggaW50ICkgMSApOworICAgICAgICAgICAgVGVzdCggMCwgInZvaWRbMF0iLCAgbnVsbCwgKCBzaG9ydCApIDEgKTsKKyAgICAgICAgICAgIFRlc3QoIDAsICJ2b2lkWzBdIiwgIG51bGwsICggZG91YmxlICkgMSApOworICAgICAgICAgICAgVGVzdCggMCwgInZvaWRbMF0iLCAgbnVsbCwgKCBsb25nICkgMSApOworICAgICAgICAgICAgVGVzdCggMCwgInZvaWRbMF0iLCAgbnVsbCwgImFiYyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBUZXN0KCBpbnQgbiwgU3RyaW5nIHMsT2JqZWN0IGdvb2QsIE9iamVjdCBiYWQgKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0b3Jfdm9pZCB2ID0gVmFsaWRhdG9yX3ZvaWQuR2V0KCBuICk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCBnb29kICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCB2LlZhbGlkYXRlKCBiYWQgKSApOworICAgICAgICAgIAorICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50RXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEdldE5lZzEoKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0b3Jfdm9pZC5HZXQoIC0xICk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0R2V0TmVnMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIFZhbGlkYXRvcl92b2lkLkdldCggMCApLkVsZW1lbnRWYWxpZGF0b3IoKSApOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50RXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEdldE1heFBsdXNPbmUoKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0b3Jfdm9pZC5HZXQoIFZhbGlkYXRvci5NQVhfTkRJTVMgKyAxICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcnMuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1N1cHBvcnQvVGVzdFZhbGlkYXRvcnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwOTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvU3VwcG9ydC9UZXN0VmFsaWRhdG9ycy5jcwpAQCAtMCwwICsxLDI4NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JzCisgICAgeworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RWYWxpZGF0b3IiICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdF9ib29sZWFuKCkKKwkgICAgeworCQkgICAgVGVzdCggVmFsaWRhdG9yX2Jvb2xlYW4uR2V0KCAyICksIDIsCisJCQkgICAgbmV3IEJvb2xlYW5bXVtdIHsgbmV3IEJvb2xlYW5bXSB7IGZhbHNlLCBmYWxzZSB9LCBuZXcgQm9vbGVhbltdIHsgZmFsc2UsIGZhbHNlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfYm9vbGVhbi5HZXQoIDIgKSwgMiwKKwkJCSAgICBuZXcgQm9vbGVhbltdW10geyBuZXcgQm9vbGVhbltdIHsgdHJ1ZSwgdHJ1ZSB9LCBuZXcgQm9vbGVhbltdIHsgdHJ1ZSwgdHJ1ZSB9IH0gKTsKKwkgICAgfQorCisJICAgIAorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdF9TQnl0ZSgpCisJICAgIHsKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9ieXRlLkdldCggMiApLCAyLAorCQkJIAorCQkJICAgIG5ldyBTQnl0ZVtdW10geyBuZXcgU0J5dGVbXSB7IDAsIDAgfSwgbmV3IFNCeXRlW10geyAwLCAwIH0gfSApOworCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfYnl0ZS5HZXQoIDIgKSwgMiwKKyAgICAgICAgICAgICAgCisJCQkgICAgbmV3IFNCeXRlW11bXSB7IG5ldyBTQnl0ZVtdIHsgMSwgMSB9LCBuZXcgU0J5dGVbXSB7IDEsIDEgfSB9ICk7CisKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9ieXRlLkdldCggMiApLCAyLAorICAgICAgICAgICAgICAKKwkJCSAgICBuZXcgU0J5dGVbXVtdIHsgbmV3IFNCeXRlW10geyAtMSwgLTEgfSwgbmV3IFNCeXRlW10geyAtMSwgLTEgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9ieXRlLkdldCggMiApLCAyLAorICAgICAgICAgICAgICAgCisJCQkgICAgbmV3IFNCeXRlW11bXSB7IG5ldyBTQnl0ZVtdIHsgU0J5dGUuTWF4VmFsdWUsIFNCeXRlLk1pblZhbHVlIH0sIG5ldyBTQnl0ZVtdIHsgU0J5dGUuTWF4VmFsdWUsIFNCeXRlLk1pblZhbHVlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfYnl0ZS5HZXQoIDIgKSwgMiwKKyAgICAgICAgICAgICAgCisJCQkgICAgbmV3IFNCeXRlW11bXSB7IG5ldyBTQnl0ZVtdIHsgU0J5dGUuTWluVmFsdWUsIFNCeXRlLk1pblZhbHVlIH0sIG5ldyBTQnl0ZVtdIHsgU0J5dGUuTWluVmFsdWUsIFNCeXRlLk1pblZhbHVlIH0gfSApOworCSAgICB9CisKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBUZXN0X3Nob3J0KCkKKwkgICAgeworCQkgICAgVGVzdCggVmFsaWRhdG9yX3Nob3J0LkdldCggMiApLCAyLAorCQkJICAgIAorCQkJICAgIG5ldyBzaG9ydFtdW10geyBuZXcgc2hvcnRbXSB7IDAsIDAgfSwgbmV3IHNob3J0W10geyAwLCAwIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3Jfc2hvcnQuR2V0KCAyICksIDIsCisJCQkgIAorCQkJICAgIG5ldyBzaG9ydFtdW10geyBuZXcgc2hvcnRbXSB7IDEsIDEgfSwgbmV3IHNob3J0W10geyAxLCAxIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3Jfc2hvcnQuR2V0KCAyICksIDIsCisJCQkgICAKKwkJCSAgICBuZXcgc2hvcnRbXVtdIHsgbmV3IHNob3J0W10geyAtMSwgLTEgfSwgbmV3IHNob3J0W10geyAtMSwgLTEgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9zaG9ydC5HZXQoIDIgKSwgMiwKKwkJCSAgCisJCQkgICAgbmV3IHNob3J0W11bXSB7IG5ldyBzaG9ydFtdIHsgU0J5dGUuTWF4VmFsdWUsIFNCeXRlLk1heFZhbHVlIH0sIG5ldyBzaG9ydFtdIHsgU0J5dGUuTWF4VmFsdWUsIFNCeXRlLk1heFZhbHVlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3Jfc2hvcnQuR2V0KCAyICksIDIsCisJCQkgIAorCQkJICAgIG5ldyBzaG9ydFtdW10geyBuZXcgc2hvcnRbXSB7IFNCeXRlLk1pblZhbHVlLCBTQnl0ZS5NaW5WYWx1ZSB9LCBuZXcgc2hvcnRbXSB7IFNCeXRlLk1pblZhbHVlLCBTQnl0ZS5NaW5WYWx1ZSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX3Nob3J0LkdldCggMiApLCAyLAorCQkJICAgCisgICAgICAgICAgICAgICAgbmV3IHNob3J0W11bXSB7IG5ldyBzaG9ydFtdIHsgc2hvcnQuTWF4VmFsdWUsIHNob3J0Lk1heFZhbHVlIH0sIG5ldyBzaG9ydFtdIHsgc2hvcnQuTWF4VmFsdWUsIHNob3J0Lk1heFZhbHVlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3Jfc2hvcnQuR2V0KCAyICksIDIsCisJCQkgICAgCisgICAgICAgICAgICAgICAgbmV3IHNob3J0W11bXSB7IG5ldyBzaG9ydFtdIHsgc2hvcnQuTWluVmFsdWUsIHNob3J0Lk1pblZhbHVlIH0sIG5ldyBzaG9ydFtdIHsgc2hvcnQuTWluVmFsdWUsIHNob3J0Lk1pblZhbHVlIH0gfSApOworCSAgICB9CisKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBUZXN0X2ludCgpCisJICAgIHsKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9pbnQuR2V0KCAyICksIDIsCisJCQkgICAgCisJCQkgICAgbmV3IGludFtdW10geyBuZXcgaW50W10geyAwLCAwIH0sIG5ldyBpbnRbXSB7IDAsIDAgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9pbnQuR2V0KCAyICksIDIsCisJCQkgICAKKwkJCSAgICBuZXcgaW50W11bXSB7IG5ldyBpbnRbXSB7IDEsIDEgfSwgbmV3IGludFtdIHsgMSwgMSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2ludC5HZXQoIDIgKSwgMiwKKwkJCSAgIAorCQkJICAgIG5ldyBpbnRbXVtdIHsgbmV3IGludFtdIHsgLTEsIC0xIH0sIG5ldyBpbnRbXSB7IC0xLCAtMSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2ludC5HZXQoIDIgKSwgMiwKKwkJCSAgICAKKwkJCSAgICBuZXcgaW50W11bXSB7IG5ldyBpbnRbXSB7IFNCeXRlLk1heFZhbHVlLCBTQnl0ZS5NYXhWYWx1ZSB9LCBuZXcgaW50W10geyBTQnl0ZS5NYXhWYWx1ZSwgU0J5dGUuTWF4VmFsdWUgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9pbnQuR2V0KCAyICksIDIsCisJCQkgICAgCisJCQkgICAgbmV3IGludFtdW10geyBuZXcgaW50W10geyBTQnl0ZS5NaW5WYWx1ZSwgU0J5dGUuTWluVmFsdWUgfSwgbmV3IGludFtdIHsgU0J5dGUuTWluVmFsdWUsIFNCeXRlLk1pblZhbHVlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfaW50LkdldCggMiApLCAyLAorCQkJICAgIAorCQkJICAgIG5ldyBpbnRbXVtdIHsgbmV3IGludFtdIHsgc2hvcnQuTWF4VmFsdWUsIHNob3J0Lk1heFZhbHVlIH0sIG5ldyBpbnRbXSB7IHNob3J0Lk1heFZhbHVlLCBzaG9ydC5NYXhWYWx1ZSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2ludC5HZXQoIDIgKSwgMiwKKwkJCSAgIAorCQkJICAgIG5ldyBpbnRbXVtdIHsgbmV3IGludFtdIHsgc2hvcnQuTWluVmFsdWUsIHNob3J0Lk1pblZhbHVlIH0sIG5ldyBpbnRbXSB7IHNob3J0Lk1pblZhbHVlLCBzaG9ydC5NaW5WYWx1ZSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2ludC5HZXQoIDIgKSwgMiwKKwkJCSAgCisJCQkgICAgbmV3IGludFtdW10geyBuZXcgaW50W10geyBpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZSB9LCBuZXcgaW50W10geyBpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZX0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfaW50LkdldCggMiApLCAyLAorCQkJICAgCisJCQkgICAgbmV3IGludFtdW10geyBuZXcgaW50W10geyBpbnQuTWluVmFsdWUsIGludC5NaW5WYWx1ZSB9LCBuZXcgaW50W10geyBpbnQuTWluVmFsdWUsIGludC5NaW5WYWx1ZSB9IH0gKTsKKwkgICAgfQorCisJICAgIAorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdF9sb25nKCkKKwkgICAgeworCQkgICAgVGVzdCggVmFsaWRhdG9yX2xvbmcuR2V0KCAyICksIDIsCisJCQkgICAKKwkJCSAgICBuZXcgbG9uZ1tdW10geyBuZXcgbG9uZ1tdIHsgMCwgMCB9LCBuZXcgbG9uZ1tdIHsgMCwgMCB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2xvbmcuR2V0KCAyICksIDIsCisJCQkgICAKKwkJCSAgICBuZXcgbG9uZ1tdW10geyBuZXcgbG9uZ1tdIHsgMSwgMSB9LCBuZXcgbG9uZ1tdIHsgMSwgMSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2xvbmcuR2V0KCAyICksIDIsCisJCQkgICAKKwkJCSAgICBuZXcgbG9uZ1tdW10geyBuZXcgbG9uZ1tdIHsgLTEsIC0xIH0sIG5ldyBsb25nW10geyAtMSwgLTEgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9sb25nLkdldCggMiApLCAyLAorCQkJICAgCisJCQkgICAgbmV3IGxvbmdbXVtdIHsgbmV3IGxvbmdbXSB7IFNCeXRlLk1heFZhbHVlLCBTQnl0ZS5NYXhWYWx1ZSB9LCBuZXcgbG9uZ1tdIHsgU0J5dGUuTWF4VmFsdWUsIFNCeXRlLk1heFZhbHVlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfbG9uZy5HZXQoIDIgKSwgMiwKKwkJCSAgICAKKwkJCSAgICBuZXcgbG9uZ1tdW10geyBuZXcgbG9uZ1tdIHsgU0J5dGUuTWluVmFsdWUsIFNCeXRlLk1pblZhbHVlIH0sIG5ldyBsb25nW10geyBTQnl0ZS5NaW5WYWx1ZSwgU0J5dGUuTWluVmFsdWUgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9sb25nLkdldCggMiApLCAyLAorCQkJICAKKwkJCSAgICBuZXcgbG9uZ1tdW10geyBuZXcgbG9uZ1tdIHsgc2hvcnQuTWF4VmFsdWUsIHNob3J0Lk1heFZhbHVlIH0sIG5ldyBsb25nW10geyBzaG9ydC5NYXhWYWx1ZSwgc2hvcnQuTWF4VmFsdWUgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9sb25nLkdldCggMiApLCAyLAorCQkJICAKKwkJCSAgICBuZXcgbG9uZ1tdW10geyBuZXcgbG9uZ1tdIHsgc2hvcnQuTWluVmFsdWUsIHNob3J0Lk1pblZhbHVlIH0sIG5ldyBsb25nW10geyBzaG9ydC5NaW5WYWx1ZSwgc2hvcnQuTWluVmFsdWUgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9sb25nLkdldCggMiApLCAyLAorCQkJCisJCQkgICAgbmV3IGxvbmdbXVtdIHsgbmV3IGxvbmdbXSB7IGludC5NYXhWYWx1ZSwgaW50Lk1heFZhbHVlIH0sIG5ldyBsb25nW10geyBpbnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2xvbmcuR2V0KCAyICksIDIsCisJCQkgIAorCQkJICAgIG5ldyBsb25nW11bXSB7IG5ldyBsb25nW10geyBpbnQuTWluVmFsdWUsIGludC5NaW5WYWx1ZSB9LCBuZXcgbG9uZ1tdIHsgaW50Lk1pblZhbHVlLCBpbnQuTWluVmFsdWUgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9sb25nLkdldCggMiApLCAyLAorCQkJIAorCQkJICAgIG5ldyBsb25nW11bXSB7IG5ldyBsb25nW10geyBsb25nLk1heFZhbHVlLCBsb25nLk1heFZhbHVlIH0sIG5ldyBsb25nW10geyBsb25nLk1heFZhbHVlLCBsb25nLk1heFZhbHVlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfbG9uZy5HZXQoIDIgKSwgMiwKKwkJCisJCQkgICAgbmV3IGxvbmdbXVtdIHsgbmV3IGxvbmdbXSB7IGxvbmcuTWluVmFsdWUsIGxvbmcuTWluVmFsdWUgfSwgbmV3IGxvbmdbXSB7IGxvbmcuTWluVmFsdWUsIGxvbmcuTWluVmFsdWUgfSB9ICk7CisJICAgIH0KKworCSAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RfZmxvYXQoKQorCSAgICB7CisJCSAgICBUZXN0KCBWYWxpZGF0b3JfZmxvYXQuR2V0KCAyICksIDIsCisJCQkgICAKKwkJCSAgICBuZXcgZmxvYXRbXVtdIHsgbmV3IGZsb2F0W10geyAwLCAwIH0sIG5ldyBmbG9hdFtdIHsgMCwgMCB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2Zsb2F0LkdldCggMiApLCAyLAorCQkJICAgCisJCQkgICAgbmV3IGZsb2F0W11bXSB7IG5ldyBmbG9hdFtdIHsgMSwgMSB9LCBuZXcgZmxvYXRbXSB7IDEsIDEgfSB9ICk7CisgICAgCQkKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9mbG9hdC5HZXQoIDIgKSwgMiwKKwkJCSAgCisJCQkgICAgbmV3IGZsb2F0W11bXSB7IG5ldyBmbG9hdFtdIHsgLTEsIC0xIH0sIG5ldyBmbG9hdFtdIHsgLTEsIC0xIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfZmxvYXQuR2V0KCAyICksIDIsCisJCQkgCisJCQkgICAgbmV3IGZsb2F0W11bXSB7IG5ldyBmbG9hdFtdIHsgZmxvYXQuTWF4VmFsdWUsIGZsb2F0Lk1heFZhbHVlIH0sIG5ldyBmbG9hdFtdIHsgZmxvYXQuTWF4VmFsdWUsIGZsb2F0Lk1heFZhbHVlIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfZmxvYXQuR2V0KCAyICksIDIsCisJCQkgCisJCQkgICAgbmV3IGZsb2F0W11bXSB7IG5ldyBmbG9hdFtdIHsgZmxvYXQuTWluVmFsdWUsIGZsb2F0Lk1pblZhbHVlIH0sIG5ldyBmbG9hdFtdIHsgZmxvYXQuTWluVmFsdWUsIGZsb2F0Lk1pblZhbHVlIH0gfSApOworCSAgICB9CisKKwkgICAgCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBUZXN0X2RvdWJsZSgpCisJICAgIHsKKwkJICAgIFRlc3QoIFZhbGlkYXRvcl9kb3VibGUuR2V0KCAyICksIDIsCisJCQkgICAKKwkJCSAgICBuZXcgZG91YmxlW11bXSB7IG5ldyBkb3VibGVbXSB7IDAsIDAgfSwgbmV3IGRvdWJsZVtdIHsgMCwgMCB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2RvdWJsZS5HZXQoIDIgKSwgMiwKKwkJCSAgIAorCQkJICAgIG5ldyBkb3VibGVbXVtdIHsgbmV3IGRvdWJsZVtdIHsgMSwgMSB9LCBuZXcgZG91YmxlW10geyAxLCAxIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfZG91YmxlLkdldCggMiApLCAyLAorCQkJICAgCisJCQkgICAgbmV3IGRvdWJsZVtdW10geyBuZXcgZG91YmxlW10geyAtMSwgLTEgfSwgbmV3IGRvdWJsZVtdIHsgLTEsIC0xIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3JfZG91YmxlLkdldCggMiApLCAyLAorCQkJICAgCisJCQkgICAgbmV3IGRvdWJsZVtdW10geyBuZXcgZG91YmxlW10geyBEb3VibGUuTWF4VmFsdWUsIERvdWJsZS5NYXhWYWx1ZSB9LCBuZXcgZG91YmxlW10geyBEb3VibGUuTWF4VmFsdWUsIERvdWJsZS5NYXhWYWx1ZSB9IH0gKTsKKyAgICAJCQorCQkgICAgVGVzdCggVmFsaWRhdG9yX2RvdWJsZS5HZXQoIDIgKSwgMiwKKwkJCSAgIAorCQkJICAgIG5ldyBkb3VibGVbXVtdIHsgbmV3IGRvdWJsZVtdIHsgRG91YmxlLk1pblZhbHVlLCBEb3VibGUuTWluVmFsdWUgfSwgbmV3IGRvdWJsZVtdIHsgRG91YmxlLk1pblZhbHVlLCBEb3VibGUuTWluVmFsdWUgfSB9ICk7CisJICAgIH0KKworCSAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3Rfc3RyaW5nKCkKKwkgICAgeworCQkgICAgVGVzdCggVmFsaWRhdG9yX3N0cmluZy5HZXQoIDIgKSwgMiwKKwkJCSAgCisJCQkgICAgbmV3IFN0cmluZ1tdW10geyBuZXcgU3RyaW5nW10geyAiIiwgIiIgfSwgbmV3IFN0cmluZ1tdIHsgIiIsICIiIH0gfSApOworICAgIAkJCisJCSAgICBUZXN0KCBWYWxpZGF0b3Jfc3RyaW5nLkdldCggMiApLCAyLAorCQkJICAKKwkJCSAgICBuZXcgU3RyaW5nW11bXSB7IG5ldyBTdHJpbmdbXSB7ICJhYmMiLCAiYWJjIiB9LCBuZXcgU3RyaW5nW10geyAiYWJjIiwgImFiYyIgfSB9ICk7CisJICAgIH0KKworCSAgICAKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RfY3VzdG9tKCkKKwkgICAgeworICAgICAgICAgICAgVGVzdCggVmFsaWRhdG9yX2N1c3RvbS5HZXQoIHR5cGVvZiggRGF0ZVRpbWUgKSwgMiAsZmFsc2UpLCAyLAorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lW11bXSB7IG5ldyBEYXRlVGltZVtdIHsgbmV3IERhdGVUaW1lKCksIG5ldyBEYXRlVGltZSgpIH0sIG5ldyBEYXRlVGltZVtdIHsgbmV3IERhdGVUaW1lKCksIG5ldyBEYXRlVGltZSgpIH0gfSApOworCSAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHZvaWQgVGVzdCggVmFsaWRhdG9yIHYsIGludCBuLCBPYmplY3QgbyApCisJICAgIHsKKyAgICAvLwkJU3lzdGVtLm91dC5wcmludGYoICJUZXN0aW5nIHdpdGggJXNcbiIsIHYgKTsKKyAgICAvLwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbiwgdi5HZXREaW0oKSApOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNUcnVlKCB2LlZhbGlkYXRlKCBvICkgKTsKKwkJICAKKyAgICAJCQorCQkgICAgaWYgKG4gPiAwKQorCQkgICAgeworCisKKyAgICAgICAgICAgICAgICBpbnQgayA9ICggKCBBcnJheSApIG8gKS5MZW5ndGg7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgazsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgVGVzdCggdi5FbGVtZW50VmFsaWRhdG9yKCksIG4tMSwgKCAoIEFycmF5ICkgbyApLkdldFZhbHVlKCBpICkgKTsKKwkJICAgIH0KKwkgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L0ZpbHRlci9UZXN0S2VlcEFsaXZlLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9UcmFuc3BvcnQvRmlsdGVyL1Rlc3RLZWVwQWxpdmUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMzY5MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L0ZpbHRlci9UZXN0S2VlcEFsaXZlLmNzCkBAIC0wLDAgKzEsMzU3IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydC5GaWx0ZXIKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RLZWVwQWxpdmUKKyAgICB7CisgICAgICAgIHByaXZhdGUgTXlUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIE15U2Vzc2lvbiBzZXNzaW9uOworICAgICAgICBwcml2YXRlIE15VmFsdWVGYWN0b3J5IHZmOworICAgICAgICBwcml2YXRlIFJlc291cmNlcyByZXNvdXJjZXM7CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IE15VHJhbnNwb3J0KCk7CisgICAgICAgICAgICBzZXNzaW9uID0gbmV3IE15U2Vzc2lvbigpOworICAgICAgICAgICAgdmYgPSBuZXcgTXlWYWx1ZUZhY3RvcnkoInRjcDoiKTsKKyAgICAgICAgICAgIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5BZGQoVHJhbnNwb3J0Q29uc3RzLlZBTFVFX0ZBQ1RPUlksIHZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgS2VlcEFsaXZlIG5ld0tlZXBBbGl2ZShzdHJpbmcgdXJpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEtlZXBBbGl2ZSh0cmFuc3BvcnQsIG5ldyBVUkwodXJpKSwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvcjEoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDg/ZmlsdGVyPUtlZXBBbGl2ZSI7CisgICAgICAgICAgICBLZWVwQWxpdmUgZmlsdGVyID0gbmV3S2VlcEFsaXZlKHVyaSk7CisKKyAgICAgICAgICAgIGZpbHRlci5TZXRTZXNzaW9uKHNlc3Npb24pOworCisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZSh0cmFuc3BvcnQuR2V0U2Vzc2lvbigpLCBmaWx0ZXIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoZmlsdGVyLkdldFNlc3Npb24oKSwgc2Vzc2lvbik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmlsdGVyLkdldFNlcnZlcigpLCB0cnVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmaWx0ZXIuR2V0Q291bnQoKSwgNCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmlsdGVyLkdldERlbGF5KCksIDE1KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDg/ZmlsdGVyPUtlZXBBbGl2ZSZLZWVwQWxpdmUuZGVsYXk9MjAmS2VlcEFsaXZlLmNvdW50PTUiOworICAgICAgICAgICAgS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworICAgICAgICAgICAgZmlsdGVyLlNldFNlc3Npb24oc2Vzc2lvbik7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHRyYW5zcG9ydC5HZXRTZXNzaW9uKCksIGZpbHRlcik7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShmaWx0ZXIuR2V0U2Vzc2lvbigpLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmaWx0ZXIuR2V0U2VydmVyKCksIHRydWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZpbHRlci5HZXRDb3VudCgpLCA1KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmaWx0ZXIuR2V0RGVsYXkoKSwgMjApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDg/ZmlsdGVyPUtlZXBBbGl2ZSI7CisgICAgICAgICAgICBLZWVwQWxpdmUgZmlsdGVyID0gbmV3S2VlcEFsaXZlKHVyaSk7CisgICAgICAgICAgICBmaWx0ZXIuU2V0U2Vzc2lvbihzZXNzaW9uKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUodHJhbnNwb3J0LkdldFNlc3Npb24oKSwgZmlsdGVyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKGZpbHRlci5HZXRTZXNzaW9uKCksIHNlc3Npb24pOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZpbHRlci5HZXRTZXJ2ZXIoKSwgZmFsc2UpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZpbHRlci5HZXRDb3VudCgpLCA0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmaWx0ZXIuR2V0RGVsYXkoKSwgMTUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgc3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwOD9maWx0ZXI9S2VlcEFsaXZlJktlZXBBbGl2ZS5kZWxheT0zIjsKKyAgICAgICAgICAgIEtlZXBBbGl2ZSBmaWx0ZXIgPSBuZXdLZWVwQWxpdmUodXJpKTsKKyAgICAgICAgICAgIGZpbHRlci5TZXRTZXNzaW9uKHNlc3Npb24pOworICAgICAgICAgICAgZmlsdGVyLlNlc3Npb25Ob3RpZnkoU2Vzc2lvbkNvbnN0cy5VUCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2xlZXBpbmcgZm9yIDUgc2Vjb25kcyIpOworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKDUwMDApOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk91dCBvZiBzbGVlcCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFdoYXQuVFJBTlNQT1JUX01FU1NBR0UsIHRyYW5zcG9ydC53aGF0KTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gdHJhbnNwb3J0Lm1zZzsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiX0V0Y2hfS2VlcEFsaXZlUmVxIiwgbXNnLkdldFhUeXBlLk5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIG1zZy5HZXQobmV3IEZpZWxkKCJjb3VudCIpKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgbXNnLkdldChuZXcgRmllbGQoImRlbGF5IikpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjbGllbnR1cDEoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDA4P2ZpbHRlcj1LZWVwQWxpdmUmS2VlcEFsaXZlLmRlbGF5PTIiOworICAgICAgICAgICAgS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworICAgICAgICAgICAgZmlsdGVyLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBmaWx0ZXIuU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTbGVlcGluZyBmb3IgNCBzZWNvbmRzIik7CisgICAgICAgICAgICBUaHJlYWQuU2xlZXAoNDAwMCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiT3V0IG9mIHNsZWVwIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV2hhdC5UUkFOU1BPUlRfTUVTU0FHRSwgdHJhbnNwb3J0LndoYXQpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSB0cmFuc3BvcnQubXNnOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJfRXRjaF9LZWVwQWxpdmVSZXEiLCBtc2cuR2V0WFR5cGUuTmFtZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgbXNnLkdldChuZXcgRmllbGQoImNvdW50IikpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBtc2cuR2V0KG5ldyBGaWVsZCgiZGVsYXkiKSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGNsaWVudGRvd24oKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDA4P2ZpbHRlcj1LZWVwQWxpdmUiOworICAgICAgICAgICAgS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworICAgICAgICAgICAgZmlsdGVyLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBmaWx0ZXIuU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLkRPV04pOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2Uoc2Vzc2lvbi51cCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgc2VydmVyVXAoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDg/ZmlsdGVyPUtlZXBBbGl2ZSI7CisgICAgICAgICAgICBLZWVwQWxpdmUgZmlsdGVyID0gbmV3S2VlcEFsaXZlKHVyaSk7CisgICAgICAgICAgICBmaWx0ZXIuU2V0U2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIGZpbHRlci5TZXNzaW9uTm90aWZ5KFNlc3Npb25Db25zdHMuVVApOworICAgICAgICAgICAgTWVzc2FnZSByZXEgPSBDb25zdHJ1Y3RNZXNzYWdlKCk7CisKKyAgICAgICAgICAgIGZpbHRlci5TZXNzaW9uTWVzc2FnZShudWxsLCByZXEpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocmVxLlJlcGx5KCkuVG9TdHJpbmcoKSwgdHJhbnNwb3J0Lm1zZy5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZXJkb3duKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LmlzX3NlcnZlciA9IHRydWU7CisgICAgICAgICAgICBzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDA4P2ZpbHRlcj1LZWVwQWxpdmUiOworICAgICAgICAgICAgS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworICAgICAgICAgICAgZmlsdGVyLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBmaWx0ZXIuU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLkRPV04pOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2Uoc2Vzc2lvbi51cCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lc3NhZ2UgQ29uc3RydWN0TWVzc2FnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkZWxheSA9IDE1OworICAgICAgICAgICAgaW50IGNvdW50ID0gNDsKKworICAgICAgICAgICAgTXlWYWx1ZUZhY3RvcnkgdmYxID0gbmV3IE15VmFsdWVGYWN0b3J5KCJ0Y3A6Iik7CisKKyAgICAgICAgICAgIEZpZWxkIG1mX2RlbGF5ID0gbmV3IEZpZWxkKCJkZWxheSIpOworICAgICAgICAgICAgRmllbGQgbWZfY291bnQgPSBuZXcgRmllbGQoImNvdW50Iik7CisKKyAgICAgICAgICAgIFhUeXBlIG10X3JlcXVlc3QgPSBuZXcgWFR5cGUoIl9FdGNoX0tlZXBBbGl2ZVJlcSIpOworICAgICAgICAgICAgbXRfcmVxdWVzdC5QdXRWYWxpZGF0b3IobWZfZGVsYXksIFZhbGlkYXRvcl9pbnQuR2V0KDApKTsKKyAgICAgICAgICAgIG10X3JlcXVlc3QuUHV0VmFsaWRhdG9yKG1mX2NvdW50LCBWYWxpZGF0b3JfaW50LkdldCgwKSk7CisgICAgICAgICAgICB2ZjEuQWRkVHlwZShtdF9yZXF1ZXN0KTsKKworICAgICAgICAgICAgWFR5cGUgbXRfcmVzcG9uc2UgPSBuZXcgWFR5cGUoIl9FdGNoX0tlZXBBbGl2ZVJlc3AiKTsKKyAgICAgICAgICAgIHZmMS5BZGRUeXBlKG10X3Jlc3BvbnNlKTsKKworICAgICAgICAgICAgbXRfcmVxdWVzdC5TZXRSZXN1bHQobXRfcmVzcG9uc2UpOworCisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKG10X3JlcXVlc3QsIHZmMSk7CisgICAgICAgICAgICBtc2cuQWRkKG1mX2RlbGF5LCBkZWxheSk7CisgICAgICAgICAgICBtc2cuQWRkKG1mX2NvdW50LCBjb3VudCk7CisKKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZW51bSBXaGF0CisgICAgICAgIHsKKyAgICAgICAgICAgIFRSQU5TUE9SVF9NRVNTQUdFLAorICAgICAgICAgICAgU0VTU0lPTl9NRVNTQUdFCisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgT2JqZWN0IGNvb2soT2JqZWN0IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvIGlzIEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pbzsKKyAgICAgICAgICAgICAgICBlLkdldEJhc2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlUcmFuc3BvcnQgOiBUcmFuc3BvcnRNZXNzYWdlCisgICAgICAgIHsKKworICAgICAgICAgICAgcHVibGljIFdoYXQgd2hhdDsKKworICAgICAgICAgICAgcHVibGljIFdobyByZWNpcGllbnQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBNZXNzYWdlIG1zZzsKKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBpc19zZXJ2ZXI7CisKKyAgICAgICAgICAgIHByaXZhdGUgU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKKworCisgICAgICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydE1lc3NhZ2UgTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRNZXNzYWdlKFdobyByZWNpcGllbnQsIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnLk1lc3NhZ2UgbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMud2hhdCA9IFdoYXQuVFJBTlNQT1JUX01FU1NBR0U7CisgICAgICAgICAgICAgICAgdGhpcy5yZWNpcGllbnQgPSByZWNpcGllbnQ7CisgICAgICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnQ8U2Vzc2lvbk1lc3NhZ2U+IE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBUcmFuc3BvcnRRdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpcXVlcnkgPT0gVHJhbnNwb3J0Q29uc3RzLklTX1NFUlZFUikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvb2soaXNfc2VydmVyKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydENvbnRyb2wob2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeShvYmplY3QgZXZlbnRPYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25NZXNzYWdlIHNlc3Npb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNlc3Npb25NZXNzYWdlIEdldFNlc3Npb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlTZXNzaW9uIDogU2Vzc2lvbk1lc3NhZ2UKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIHB1YmxpYyBXaGF0IHdoYXQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBXaG8gc2VuZGVyOworCisgICAgICAgICAgICBwdWJsaWMgTWVzc2FnZSBtc2c7CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGhhbmRsZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgdXNlcjsKKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBwYXNzd29yZDsKKworICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gdXA7CisKKworCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb25NZXNzYWdlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIGJvb2wgU2Vzc2lvbk1lc3NhZ2UoV2hvIHNlbmRlciwgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cuTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy53aGF0ID0gV2hhdC5TRVNTSU9OX01FU1NBR0U7CisgICAgICAgICAgICAgICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisgICAgICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBTZXNzaW9uUXVlcnkob2JqZWN0IHF1ZXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2wob2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Ob3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChldmVudE9iai5FcXVhbHMoU2Vzc2lvbkNvbnN0cy5VUCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1cCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRPYmouRXF1YWxzKFNlc3Npb25Db25zdHMuRE9XTikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1cCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisKKworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlWYWx1ZUZhY3RvcnkgOiBEZWZhdWx0VmFsdWVGYWN0b3J5CisgICAgICAgIHsKKworICAgICAgICAgICAgcHVibGljIE15VmFsdWVGYWN0b3J5KFN0cmluZyB1cmkpCisgICAgICAgICAgICAgICAgOiBiYXNlKHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisgICAgICAgICAgICBzdGF0aWMgTXlWYWx1ZUZhY3RvcnkoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuSW5pdCh0eXBlcywgY2xhc3MydHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L0ZpbHRlci9UZXN0TG9nZ2VyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9UcmFuc3BvcnQvRmlsdGVyL1Rlc3RMb2dnZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L0ZpbHRlci9UZXN0TG9nZ2VyLmNzCkBAIC0wLDAgKzEsMjkwIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0LkZpbHRlcgoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdExvZ2dlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBNeVRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgTXlTZXNzaW9uIHNlc3Npb247CisgICAgICAgIHByaXZhdGUgTXlWYWx1ZUZhY3RvcnkgdmY7CisgICAgICAgIHByaXZhdGUgUmVzb3VyY2VzIHJlc291cmNlczsKKworICAgICAgICBbU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgTXlUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgIHNlc3Npb24gPSBuZXcgTXlTZXNzaW9uKCk7CisgICAgICAgICAgICB2ZiA9IG5ldyBNeVZhbHVlRmFjdG9yeSgidGNwOiIpOworICAgICAgICAgICAgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpOworICAgICAgICAgICAgcmVzb3VyY2VzLkFkZChUcmFuc3BvcnRDb25zdHMuVkFMVUVfRkFDVE9SWSwgdmYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBMb2dnZXIgbmV3TG9nZ2VyKHN0cmluZyB1cmkpIAorCSAgICB7CisJCSAgICByZXR1cm4gbmV3IExvZ2dlcih0cmFuc3BvcnQsbmV3IFVSTCh1cmkpLG51bGwpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpIHsKKwkJICAgIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDg/ZmlsdGVyPUxvZ2dlciI7CisJCSAgICBMb2dnZXIudGVzdEZsYWcgPSB0cnVlOworCQkgICAgTG9nZ2VyIGxvZ2dlciA9IG5ld0xvZ2dlcih1cmkpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKGxvZ2dlci5HZXRGaWxlTmFtZSgpLCJMb2cudHh0Iik7CisgICAgICAgICAgICBBc3NlcnQuQXJlTm90U2FtZShsb2dnZXIuR2V0RmlsZU5hbWUoKSxsb2dnZXIuR2V0VGVzdFJlbmFtZWRGaWxlTmFtZSgpKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDA4P2ZpbHRlcj1Mb2dnZXImTG9nZ2VyLmZpbGVQYXRoPVRlc3QudHh0IjsKKyAgICAgICAgICAgIExvZ2dlci50ZXN0RmxhZyA9IHRydWU7CisgICAgICAgICAgICBMb2dnZXIgbG9nZ2VyID0gbmV3TG9nZ2VyKHVyaSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobG9nZ2VyLkdldEZpbGVOYW1lKCksICJUZXN0LnR4dCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdFNhbWUobG9nZ2VyLkdldEZpbGVOYW1lKCksIGxvZ2dlci5HZXRUZXN0UmVuYW1lZEZpbGVOYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGxvZ2dlcigpIHsKKwkJICAgIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDg/ZmlsdGVyPUxvZ2dlciI7CisJCSAgICBMb2dnZXIudGVzdEZsYWcgPSB0cnVlOworCQkgICAgTG9nZ2VyIGxvZ2dlciA9IG5ld0xvZ2dlcih1cmkpOworCQkgICAgbG9nZ2VyLlNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJICAgIEFzc2VydC5BcmVTYW1lKHRyYW5zcG9ydC5HZXRTZXNzaW9uKCksbG9nZ2VyKTsKKwkJICAgIEFzc2VydC5BcmVTYW1lKGxvZ2dlci5HZXRTZXNzaW9uKCksc2Vzc2lvbik7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbG9nZ2VyMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDg/ZmlsdGVyPUxvZ2dlciI7CisgICAgICAgICAgICBMb2dnZXIudGVzdEZsYWcgPSB0cnVlOworICAgICAgICAgICAgTG9nZ2VyIGxvZ2dlciA9IG5ld0xvZ2dlcih1cmkpOworICAgICAgICAgICAgbG9nZ2VyLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZSh0cmFuc3BvcnQuR2V0U2Vzc2lvbigpLCBsb2dnZXIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUobG9nZ2VyLkdldFNlc3Npb24oKSwgc2Vzc2lvbik7CisgICAgICAgICAgICBNZXNzYWdlIG0gPSBjb25zdHJ1Y3RNZXNzYWdlKCk7CisgICAgICAgICAgICBsb2dnZXIuVHJhbnNwb3J0TWVzc2FnZShudWxsLG0pOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG0uVG9TdHJpbmcoKSx0cmFuc3BvcnQubXNnLlRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGxvZ2dlcjIoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDA4P2ZpbHRlcj1Mb2dnZXIiOworICAgICAgICAgICAgTG9nZ2VyLnRlc3RGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgIExvZ2dlciBsb2dnZXIgPSBuZXdMb2dnZXIodXJpKTsKKyAgICAgICAgICAgIGxvZ2dlci5TZXRTZXNzaW9uKHNlc3Npb24pOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUodHJhbnNwb3J0LkdldFNlc3Npb24oKSwgbG9nZ2VyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKGxvZ2dlci5HZXRTZXNzaW9uKCksIHNlc3Npb24pOworICAgICAgICAgICAgTWVzc2FnZSBtID0gY29uc3RydWN0TWVzc2FnZSgpOworICAgICAgICAgICAgbG9nZ2VyLlNlc3Npb25NZXNzYWdlKG51bGwsIG0pOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG0uVG9TdHJpbmcoKSwgc2Vzc2lvbi5tc2cuVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lc3NhZ2UgY29uc3RydWN0TWVzc2FnZSgpCisJICAgIHsJCisJCSAgICBYVHlwZSBtdF9yZXF1ZXN0ID0gbmV3IFhUeXBlKCAiX0V0Y2hfTG9nZ2VyX1Rlc3QiICk7CisJCQorCQkKKwkJICAgIFhUeXBlIG10X3Jlc3BvbnNlID0gbmV3IFhUeXBlKCAiX0V0Y2hfTG9nZ2VyX1Rlc3RfUmVzcCIgKTsKKwkJCQorCQkgICAgbXRfcmVxdWVzdC5TZXRSZXN1bHQoIG10X3Jlc3BvbnNlICk7CisJCQorCQkgICAgdmYuQWRkVHlwZSggbXRfcmVxdWVzdCk7CisJCQorCQkgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggbXRfcmVxdWVzdCwgdmYgKTsKKwkKKwkJICAgIHJldHVybiBtc2c7CisJfQorCisKKyAgICAgICAgcHVibGljIGVudW0gV2hhdAorICAgICAgICB7CisgICAgICAgICAgICBUUkFOU1BPUlRfTUVTU0FHRSwKKyAgICAgICAgICAgIFNFU1NJT05fTUVTU0FHRQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIE9iamVjdCBjb29rKE9iamVjdCBvKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobyBpcyBFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKW87CisgICAgICAgICAgICAgICAgZS5HZXRCYXNlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15VHJhbnNwb3J0IDogVHJhbnNwb3J0TWVzc2FnZQorICAgICAgICB7CisKKyAgICAgICAgICAgIHB1YmxpYyBXaGF0IHdoYXQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBXaG8gcmVjaXBpZW50OworCisgICAgICAgICAgICBwdWJsaWMgTWVzc2FnZSBtc2c7CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgaXNfc2VydmVyOworCisgICAgICAgICAgICBwcml2YXRlIFNlc3Npb25NZXNzYWdlIHNlc3Npb247CisKKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnRNZXNzYWdlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0TWVzc2FnZShXaG8gcmVjaXBpZW50LCBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZy5NZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLndoYXQgPSBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFOworICAgICAgICAgICAgICAgIHRoaXMucmVjaXBpZW50ID0gcmVjaXBpZW50OworICAgICAgICAgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25NZXNzYWdlPiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgVHJhbnNwb3J0UXVlcnkob2JqZWN0IHF1ZXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKXF1ZXJ5ID09IFRyYW5zcG9ydENvbnN0cy5JU19TRVJWRVIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29rKGlzX3NlcnZlcik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRDb250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2V0U2Vzc2lvbihTZXNzaW9uTWVzc2FnZSBzZXNzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZSBHZXRTZXNzaW9uKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15U2Vzc2lvbiA6IFNlc3Npb25NZXNzYWdlCisgICAgICAgIHsKKworCisgICAgICAgICAgICBwdWJsaWMgV2hhdCB3aGF0OworCisgICAgICAgICAgICBwdWJsaWMgV2hvIHNlbmRlcjsKKworICAgICAgICAgICAgcHVibGljIE1lc3NhZ2UgbXNnOworCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBoYW5kbGVkOworCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHVzZXI7CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcGFzc3dvcmQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIHVwOworCisKKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uTWVzc2FnZSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIFNlc3Npb25NZXNzYWdlKFdobyBzZW5kZXIsIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnLk1lc3NhZ2UgbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMud2hhdCA9IFdoYXQuU0VTU0lPTl9NRVNTQUdFOworICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgU2Vzc2lvblF1ZXJ5KG9iamVjdCBxdWVyeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Db250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uTm90aWZ5KG9iamVjdCBldmVudE9iaikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRPYmouRXF1YWxzKFNlc3Npb25Db25zdHMuVVApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGV2ZW50T2JqLkVxdWFscyhTZXNzaW9uQ29uc3RzLkRPV04pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeVZhbHVlRmFjdG9yeSA6IERlZmF1bHRWYWx1ZUZhY3RvcnkKKyAgICAgICAgeworCisgICAgICAgICAgICBwdWJsaWMgTXlWYWx1ZUZhY3RvcnkoU3RyaW5nIHVyaSkKKyAgICAgICAgICAgICAgICA6IGJhc2UodXJpLCB0eXBlcywgY2xhc3MydHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSA9IG5ldyBDbGFzczJUeXBlTWFwKCk7CisKKyAgICAgICAgICAgIHN0YXRpYyBNeVZhbHVlRmFjdG9yeSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlRmFjdG9yeS5Jbml0KHR5cGVzLCBjbGFzczJ0eXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKworCisKKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9UcmFuc3BvcnQvRmlsdGVyL1Rlc3RQd0F1dGguY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1RyYW5zcG9ydC9GaWx0ZXIvVGVzdFB3QXV0aC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRiMGRmCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9UcmFuc3BvcnQvRmlsdGVyL1Rlc3RQd0F1dGguY3MKQEAgLTAsMCArMSw0MzIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQuRmlsdGVyCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0UHdBdXRoCisgICAgeworICAgICAgICBwcml2YXRlIE15VHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSAgTXlTZXNzaW9uIHNlc3Npb247CisgICAgICAgIHByaXZhdGUgTXlWYWx1ZUZhY3RvcnkgdmY7CisgICAgICAgIHByaXZhdGUgIFJlc291cmNlcyByZXNvdXJjZXM7CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IE15VHJhbnNwb3J0KCk7CisgICAgICAgICAgICBzZXNzaW9uID0gbmV3IE15U2Vzc2lvbigpOworICAgICAgICAgICAgdmYgPSBuZXcgTXlWYWx1ZUZhY3RvcnkoInRjcDoiKTsKKyAgICAgICAgICAgIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5BZGQoVHJhbnNwb3J0Q29uc3RzLlZBTFVFX0ZBQ1RPUlksIHZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUHdBdXRoIG5ld1B3QXV0aCggU3RyaW5nIHVyaSApIAorCSAgICB7CisJCSAgICByZXR1cm4gbmV3IFB3QXV0aCggdHJhbnNwb3J0LCBuZXcgVVJMKCB1cmkgKSwgcmVzb3VyY2VzICk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3RydWN0b3IxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LmlzX3NlcnZlciA9IHRydWU7CisgICAgICAgICAgICBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCJ0Y3A6Ly9mcmVkOjEyMzRAaG9zdDo5OTk5Iik7CisgICAgICAgICAgICBwd0F1dGguU2V0U2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHB3QXV0aCx0cmFuc3BvcnQuR2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHNlc3Npb24sIHB3QXV0aC5HZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUscHdBdXRoLkdldFNlcnZlcigpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwocHdBdXRoLlRyYW5zcG9ydFF1ZXJ5KFB3QXV0aC5VU0VSKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHB3QXV0aC5UcmFuc3BvcnRRdWVyeShQd0F1dGguUEFTU1dPUkQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvcjIoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCJ0Y3A6Ly9mcmVkOjEyMzRAaG9zdDo5OTk5Iik7CisgICAgICAgICAgICBwd0F1dGguU2V0U2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHB3QXV0aCwgdHJhbnNwb3J0LkdldFNlc3Npb24oKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShzZXNzaW9uLCBwd0F1dGguR2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSwgcHdBdXRoLkdldFNlcnZlcigpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZnJlZCIscHdBdXRoLlRyYW5zcG9ydFF1ZXJ5KFB3QXV0aC5VU0VSKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEyMzQiLCBwd0F1dGguVHJhbnNwb3J0UXVlcnkoUHdBdXRoLlBBU1NXT1JEKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3RydWN0b3IzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCgidGNwOi8vbWFyeToyMzQ1QGhvc3Q6OTk5OSIpOworICAgICAgICAgICAgcHdBdXRoLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShwd0F1dGgsIHRyYW5zcG9ydC5HZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoc2Vzc2lvbiwgcHdBdXRoLkdldFNlc3Npb24oKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmFsc2UsIHB3QXV0aC5HZXRTZXJ2ZXIoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm1hcnkiLCBwd0F1dGguVHJhbnNwb3J0UXVlcnkoUHdBdXRoLlVTRVIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjM0NSIsIHB3QXV0aC5UcmFuc3BvcnRRdWVyeShQd0F1dGguUEFTU1dPUkQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvcjQoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCJ0Y3A6Ly9hbGljZUBob3N0Ojk5OTkiKTsKKyAgICAgICAgICAgIHB3QXV0aC5TZXRTZXNzaW9uKHNlc3Npb24pOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUocHdBdXRoLCB0cmFuc3BvcnQuR2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHNlc3Npb24sIHB3QXV0aC5HZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBwd0F1dGguR2V0U2VydmVyKCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhbGljZSIsIHB3QXV0aC5UcmFuc3BvcnRRdWVyeShQd0F1dGguVVNFUikpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChwd0F1dGguVHJhbnNwb3J0UXVlcnkoUHdBdXRoLlBBU1NXT1JEKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3RydWN0b3I1KCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCgidGNwOi8vaG9zdDo5OTk5Iik7CisgICAgICAgICAgICBwd0F1dGguU2V0U2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHB3QXV0aCwgdHJhbnNwb3J0LkdldFNlc3Npb24oKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShzZXNzaW9uLCBwd0F1dGguR2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSwgcHdBdXRoLkdldFNlcnZlcigpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwocHdBdXRoLlRyYW5zcG9ydFF1ZXJ5KFB3QXV0aC5VU0VSKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHB3QXV0aC5UcmFuc3BvcnRRdWVyeShQd0F1dGguUEFTU1dPUkQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvcjYoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gbmV3IEV4Y2VwdGlvbigiaXNfc2VydmVyIGZhaWxlZCIpOworICAgICAgICAgICAgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCgidGNwOi8vZnJlZDoxMjM0QGhvc3Q6OTk5OSIpOworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xpZW50dXAxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCgidGNwOi8vZnJlZDoxMjM0QGhvc3Q6OTk5OSIpOworICAgICAgICAgICAgcHdBdXRoLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBwd0F1dGguU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoc2Vzc2lvbi51cCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV2hhdC5UUkFOU1BPUlRfTUVTU0FHRSwgdHJhbnNwb3J0LndoYXQpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cxID0gdHJhbnNwb3J0Lm1zZzsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiX0V0Y2hfUHdBdXRoUmVxIiwgbXNnMS5HZXRYVHlwZS5OYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZnJlZCIsbXNnMS5HZXQobmV3IEZpZWxkKCJ1c2VyIikpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTIzNCIsIG1zZzEuR2V0KG5ldyBGaWVsZCgicGFzc3dvcmQiKSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENsaWVudHVwMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIHNlc3Npb24ucGFzc3dvcmQgPSAiMjM0NSI7CisgICAgICAgICAgICBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCJ0Y3A6Ly9mcmVkQGhvc3Q6OTk5OSIpOworICAgICAgICAgICAgcHdBdXRoLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBwd0F1dGguU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoc2Vzc2lvbi51cCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV2hhdC5UUkFOU1BPUlRfTUVTU0FHRSwgdHJhbnNwb3J0LndoYXQpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cxID0gdHJhbnNwb3J0Lm1zZzsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiX0V0Y2hfUHdBdXRoUmVxIiwgbXNnMS5HZXRYVHlwZS5OYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZnJlZCIsIG1zZzEuR2V0KG5ldyBGaWVsZCgidXNlciIpKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIzNDUiLCBtc2cxLkdldChuZXcgRmllbGQoInBhc3N3b3JkIikpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDbGllbnR1cDMoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBzZXNzaW9uLnVzZXIgPSAibWFyeSI7CisgICAgICAgICAgICBzZXNzaW9uLnBhc3N3b3JkID0gIjM0NTYiOworICAgICAgICAgICAgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCgidGNwOi8vaG9zdDo5OTk5Iik7CisgICAgICAgICAgICBwd0F1dGguU2V0U2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIHB3QXV0aC5TZXNzaW9uTm90aWZ5KFNlc3Npb25Db25zdHMuVVApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShzZXNzaW9uLnVwKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChXaGF0LlRSQU5TUE9SVF9NRVNTQUdFLCB0cmFuc3BvcnQud2hhdCk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZzEgPSB0cmFuc3BvcnQubXNnOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJfRXRjaF9Qd0F1dGhSZXEiLCBtc2cxLkdldFhUeXBlLk5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJtYXJ5IiwgbXNnMS5HZXQobmV3IEZpZWxkKCJ1c2VyIikpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMzQ1NiIsIG1zZzEuR2V0KG5ldyBGaWVsZCgicGFzc3dvcmQiKSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIENsaWVudHVwNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIHNlc3Npb24udXNlciA9ICJtYXJ5IjsKKyAgICAgICAgICAgIFB3QXV0aCBwd0F1dGggPSBuZXdQd0F1dGgoInRjcDovL2hvc3Q6OTk5OSIpOworICAgICAgICAgICAgcHdBdXRoLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBwd0F1dGguU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGllbnR1cDUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBzZXNzaW9uLnBhc3N3b3JkID0gIjEyMzQiOworICAgICAgICAgICAgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCgidGNwOi8vaG9zdDo5OTk5Iik7CisgICAgICAgICAgICBwd0F1dGguU2V0U2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIHB3QXV0aC5TZXNzaW9uTm90aWZ5KFNlc3Npb25Db25zdHMuVVApOyAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIENsaWVudHVwNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIHNlc3Npb24udXNlciA9ICJmcmVkIjsKKyAgICAgICAgICAgIHNlc3Npb24ucGFzc3dvcmQgPSBuZXcgRXhjZXB0aW9uKCJwYXNzd29yZCBmYWlsZWQiKTsKKyAgICAgICAgICAgIFB3QXV0aCBwd0F1dGggPSBuZXdQd0F1dGgoInRjcDovL2hvc3Q6OTk5OSIpOworICAgICAgICAgICAgcHdBdXRoLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBwd0F1dGguU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGllbnR1cDcoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBzZXNzaW9uLnVzZXIgPSBuZXcgRXhjZXB0aW9uKCJ1c2VyIGZhaWxlZCIpOworICAgICAgICAgICAgc2Vzc2lvbi5wYXNzd29yZCA9ICIxMjM0IjsKKyAgICAgICAgICAgIFB3QXV0aCBwd0F1dGggPSBuZXdQd0F1dGgoInRjcDovL2hvc3Q6OTk5OSIpOworICAgICAgICAgICAgcHdBdXRoLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBwd0F1dGguU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDbGllbnRkb3duMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCgidGNwOi8vaG9zdDo5OTk5Iik7CisgICAgICAgICAgICBwd0F1dGguU2V0U2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIHB3QXV0aC5TZXNzaW9uTm90aWZ5KFNlc3Npb25Db25zdHMuRE9XTik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHNlc3Npb24udXApOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgU2VydmVydXAxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LmlzX3NlcnZlciA9IHRydWU7CisKKyAgICAgICAgICAgIFB3QXV0aCBwd0F1dGggPSBuZXdQd0F1dGgoInRjcDovL2hvc3Q6OTk5OSIpOworICAgICAgICAgICAgcHdBdXRoLlNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICBwd0F1dGguU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShzZXNzaW9uLnVwKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTZXJ2ZXJkb3duMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5pc19zZXJ2ZXIgPSB0cnVlOworCisgICAgICAgICAgICBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCJ0Y3A6Ly9ob3N0Ojk5OTkiKTsKKyAgICAgICAgICAgIHB3QXV0aC5TZXRTZXNzaW9uKHNlc3Npb24pOworICAgICAgICAgICAgcHdBdXRoLlNlc3Npb25Ob3RpZnkoU2Vzc2lvbkNvbnN0cy5ET1dOKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2Uoc2Vzc2lvbi51cCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHNlc3Npb24udXNlclBhc3N3b3JkLnVzZXIpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChzZXNzaW9uLnVzZXJQYXNzd29yZC5wYXNzd29yZCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHVibGljIGVudW0gV2hhdAorICAgICAgICB7CisgICAgICAgICAgICBUUkFOU1BPUlRfTUVTU0FHRSwKKyAgICAgICAgICAgIFNFU1NJT05fTUVTU0FHRQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIE9iamVjdCBjb29rKCBPYmplY3QgbyApIAorCSAgICB7CisJCWlmIChvIGlzIEV4Y2VwdGlvbikKKwkJeworCQkJRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKSBvOworCQkgICAgZS5HZXRCYXNlRXhjZXB0aW9uKCk7CisJCQl0aHJvdyBlOworCQl9CisJCXJldHVybiBvOworCSAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15VHJhbnNwb3J0IDogVHJhbnNwb3J0TWVzc2FnZQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKiAqLworICAgICAgICAgICAgcHVibGljIFdoYXQgd2hhdDsKKyAgICAgICAgICAgIC8qKiAqLworICAgICAgICAgICAgcHVibGljIFdobyByZWNpcGllbnQ7CisgICAgICAgICAgICAvKiogKi8KKyAgICAgICAgICAgIHB1YmxpYyBNZXNzYWdlIG1zZzsKKyAgICAgICAgICAgIC8qKiAqLworICAgICAgICAgICAgcHVibGljIE9iamVjdCBpc19zZXJ2ZXI7CisKKyAgICAgICAgICAgIHByaXZhdGUgU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKKworCisgICAgICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydE1lc3NhZ2UgTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRNZXNzYWdlKFdobyByZWNpcGllbnQsIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnLk1lc3NhZ2UgbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMud2hhdCA9IFdoYXQuVFJBTlNQT1JUX01FU1NBR0U7CisgICAgICAgICAgICAgICAgdGhpcy5yZWNpcGllbnQgPSByZWNpcGllbnQ7CisgICAgICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnQ8U2Vzc2lvbk1lc3NhZ2U+IE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBUcmFuc3BvcnRRdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpcXVlcnkgPT0gVHJhbnNwb3J0Q29uc3RzLklTX1NFUlZFUikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvb2soaXNfc2VydmVyKTsgCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRDb250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2V0U2Vzc2lvbihTZXNzaW9uTWVzc2FnZSBzZXNzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZSBHZXRTZXNzaW9uKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15U2Vzc2lvbiA6IFNlc3Npb25NZXNzYWdlCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqICovCisgICAgICAgICAgICBwdWJsaWMgV2hhdCB3aGF0OworICAgICAgICAgICAgLyoqICovCisgICAgICAgICAgICBwdWJsaWMgV2hvIHNlbmRlcjsKKyAgICAgICAgICAgIC8qKiAqLworICAgICAgICAgICAgcHVibGljIE1lc3NhZ2UgbXNnOworICAgICAgICAgICAgLyoqICovCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBoYW5kbGVkOworICAgICAgICAgICAgLyoqICovCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHVzZXI7CisgICAgICAgICAgICAvKiogKi8KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcGFzc3dvcmQ7CisgICAgICAgICAgICAvKiogKi8KKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIHVwOworICAgICAgICAgICAgLyoqICovCisgICAgICAgICAgICBwdWJsaWMgUHdBdXRoLlVzZXJQYXNzd29yZCAKKyAgICAgICAgICAgICAgICB1c2VyUGFzc3dvcmQgPSBuZXcgUHdBdXRoLlVzZXJQYXNzd29yZChudWxsLG51bGwpOworCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb25NZXNzYWdlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIGJvb2wgU2Vzc2lvbk1lc3NhZ2UoV2hvIHNlbmRlciwgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2cuTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy53aGF0ID0gV2hhdC5TRVNTSU9OX01FU1NBR0U7CisgICAgICAgICAgICAgICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisgICAgICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBTZXNzaW9uUXVlcnkob2JqZWN0IHF1ZXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKXF1ZXJ5ID09IFB3QXV0aC5VU0VSKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29vayh1c2VyKTsKKworICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nKXF1ZXJ5ID09IFB3QXV0aC5QQVNTV09SRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvb2socGFzc3dvcmQpOworCQkJCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uQ29udHJvbChvYmplY3QgY29udHJvbCwgb2JqZWN0IHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeShvYmplY3QgZXZlbnRPYmopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50T2JqLkVxdWFscyhTZXNzaW9uQ29uc3RzLlVQKSkKKwkJCSAgICB7CisJCQkJICAgIHVwID0gdHJ1ZTsKKwkJCQkgICAgcmV0dXJuOworCQkJICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChldmVudE9iai5FcXVhbHMoU2Vzc2lvbkNvbnN0cy5ET1dOKSkKKwkJCSAgICB7CisJCQkJICAgIHVwID0gZmFsc2U7CisJCQkJICAgIHJldHVybjsKKwkJCSAgICB9CisgICAgCQkJCisJCQkgICAgaWYgKGV2ZW50T2JqIGlzIFB3QXV0aC5Vc2VyUGFzc3dvcmQpCisJCQkgICAgeworCQkJCSAgICB1c2VyUGFzc3dvcmQgPSAoUHdBdXRoLlVzZXJQYXNzd29yZCkgZXZlbnRPYmo7CisJCQkJICAgIHJldHVybjsKKwkJCSAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeVZhbHVlRmFjdG9yeSA6IERlZmF1bHRWYWx1ZUZhY3RvcnkKKyAgICAgICAgeworCisgICAgICAgICAgICBwdWJsaWMgTXlWYWx1ZUZhY3RvcnkoIFN0cmluZyB1cmkgKSA6IGJhc2UodXJpLCB0eXBlcywgY2xhc3MydHlwZSkKKwkJICAgIHsKKwkJCX0KKwkJCisJCSAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBUeXBlTWFwIHR5cGVzID0gbmV3IFR5cGVNYXAoKTsKKwkJCisJCSAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisJCSAgICBzdGF0aWMgTXlWYWx1ZUZhY3RvcnkoKQorCQkgICAgeworCQkJICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuSW5pdCggdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkJICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvVGVzdEJpbmFyeVRhZ2dlZERhdGFJbk91dC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L0ZtdC9CaW5hcnkvVGVzdEJpbmFyeVRhZ2dlZERhdGFJbk91dC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYwMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9UcmFuc3BvcnQvRm10L0JpbmFyeS9UZXN0QmluYXJ5VGFnZ2VkRGF0YUluT3V0LmNzCkBAIC0wLDAgKzEsMTAwNCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydC5GbXQuQmluYXJ5Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUZXN0IGJpbmFyeSBpbnB1dCBhbmQgb3V0cHV0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdEJpbmFyeVRhZ2dlZERhdGFJbk91dAorICAgIHsKKworICAgIC8vICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRvdWJsZSBET1VCTEVfTUlOX05PUk1BTCA9IDB4MS4wLTEwMjI7IC8vIERvdWJsZS5NSU5fTk9STUFMOworCSAvLyAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGZsb2F0IEZMT0FUX01JTl9OT1JNQUwgPSAweDEuMHAtMTI2ZjsgLy8gRmxvYXQuTUlOX05PUk1BTDsKKyAgICAgICAgIAorICAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJUZXN0QmluYXJ5VGFnZ2VkRGF0YUluT3V0IiApOworICAgICAgICB9CisKKyAgICAgICAgTXlWYWx1ZUZhY3RvcnkgdmY7CisgICAgICAgIHByaXZhdGUgWFR5cGUgbXRfZm9vOworICAgICAgICBwcml2YXRlIEZpZWxkIG1mX3g7CisKKyAgICAgICAgcHVibGljIFRlc3RCaW5hcnlUYWdnZWREYXRhSW5PdXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2ZiA9IG5ldyBNeVZhbHVlRmFjdG9yeSgpOworICAgICAgICAgICAgbXRfZm9vID0gdmYuR2V0VHlwZSggImZvbyIgKTsKKyAgICAgICAgICAgIG1mX3ggPSBuZXcgRmllbGQoICJ4IiApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdF9DaGVja19WYWx1ZSgpIAorICAgICAgICB7CisgICAgICAgICAgICBCaW5hcnlUYWdnZWREYXRhT3V0cHV0IGJ0ZG8gPSBuZXcgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCh2ZiwgIm5vbmU6Iik7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHNieXRlIGkgaW4gR2V0Qnl0ZXMoIFNCeXRlLk1pblZhbHVlLCAyNTYgKSkKKwkJCWlmIChpID49IFR5cGVDb2RlLk1JTl9USU5ZX0lOVCAmJiBpIDw9IFR5cGVDb2RlLk1BWF9USU5ZX0lOVCkKKwkJCQlBc3NlcnQuQXJlRXF1YWwoIGksIGJ0ZG8uQ2hlY2tWYWx1ZSggaSApICk7CisJCQllbHNlCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFR5cGVDb2RlLkJZVEUsIGJ0ZG8uQ2hlY2tWYWx1ZShpKSk7CisKKyAgICAgICAgICAgIC8vIHNob3J0IHZhbHVlcworCQkgICAgZm9yZWFjaCAoc2hvcnQgaSBpbiBHZXRTaG9ydHMoIHNob3J0Lk1pblZhbHVlLCA2NTUzNiApKQorCQkJaWYgKGkgPj0gVHlwZUNvZGUuTUlOX1RJTllfSU5UICYmIGkgPD0gVHlwZUNvZGUuTUFYX1RJTllfSU5UKQorCQkJCUFzc2VydC5BcmVFcXVhbCggKHNieXRlKSBpLCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZSBpZiAoaSA+PSBTQnl0ZS5NaW5WYWx1ZSAmJiBpIDw9IFNCeXRlLk1heFZhbHVlKQorCQkJCUFzc2VydC5BcmVFcXVhbCggVHlwZUNvZGUuQllURSwgYnRkby5DaGVja1ZhbHVlKCBpICkgKTsKKwkJCWVsc2UKKwkJCQlBc3NlcnQuQXJlRXF1YWwoIFR5cGVDb2RlLlNIT1JULCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCQkKKwkJLy8gaW50IHZhbHVlcworCQlmb3JlYWNoIChpbnQgaSBpbiBHZXRUZXN0SW50cygpKQorCQkJaWYgKGkgPj0gVHlwZUNvZGUuTUlOX1RJTllfSU5UICYmIGkgPD0gVHlwZUNvZGUuTUFYX1RJTllfSU5UKQorCQkJCUFzc2VydC5BcmVFcXVhbCggKHNieXRlKSBpLCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZSBpZiAoaSA+PSBTQnl0ZS5NaW5WYWx1ZSAmJiBpIDw9IFNCeXRlLk1heFZhbHVlKQorCQkJCUFzc2VydC5BcmVFcXVhbCggVHlwZUNvZGUuQllURSwgYnRkby5DaGVja1ZhbHVlKCBpICkgKTsKKwkJCWVsc2UgaWYgKGkgPj0gc2hvcnQuTWluVmFsdWUgJiYgaSA8PSBzaG9ydC5NYXhWYWx1ZSkKKwkJCQlBc3NlcnQuQXJlRXF1YWwoIFR5cGVDb2RlLlNIT1JULCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZQorCQkJCUFzc2VydC5BcmVFcXVhbCggVHlwZUNvZGUuSU5ULCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCQkKKwkJLy8gbG9uZyB2YWx1ZXMKKwkJZm9yZWFjaCAobG9uZyBpIGluIEdldFRlc3RMb25ncygpKQorCQkJaWYgKGkgPj0gVHlwZUNvZGUuTUlOX1RJTllfSU5UICYmIGkgPD0gVHlwZUNvZGUuTUFYX1RJTllfSU5UKQorCQkJCUFzc2VydC5BcmVFcXVhbCggKHNieXRlKSBpLCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZSBpZiAoaSA+PSBTQnl0ZS5NaW5WYWx1ZSAmJiBpIDw9IFNCeXRlLk1heFZhbHVlKQorCQkJCUFzc2VydC5BcmVFcXVhbCggVHlwZUNvZGUuQllURSwgYnRkby5DaGVja1ZhbHVlKCBpICkgKTsKKwkJCWVsc2UgaWYgKGkgPj0gc2hvcnQuTWluVmFsdWUgJiYgaSA8PSBzaG9ydC5NYXhWYWx1ZSkKKwkJCQlBc3NlcnQuQXJlRXF1YWwoIFR5cGVDb2RlLlNIT1JULCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZSBpZiAoaSA+PSBpbnQuTWluVmFsdWUgJiYgaSA8PSBpbnQuTWF4VmFsdWUpCisJCQkJQXNzZXJ0LkFyZUVxdWFsKCBUeXBlQ29kZS5JTlQsIGJ0ZG8uQ2hlY2tWYWx1ZSggaSApICk7CisJCQllbHNlCisJCQkJQXNzZXJ0LkFyZUVxdWFsKCBUeXBlQ29kZS5MT05HLCBidGRvLkNoZWNrVmFsdWUoIGkgKSApOworCisgICAgICAgIC8vIG51bGwgdmFsdWUKKyAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFR5cGVDb2RlLk5VTEwsIGJ0ZG8uQ2hlY2tWYWx1ZShudWxsKSk7CisKKyAgICAgICAgLy8gYm9vbGVhbiB2YWx1ZXMKKyAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFR5cGVDb2RlLkJPT0xFQU5fRkFMU0UsIGJ0ZG8uQ2hlY2tWYWx1ZShmYWxzZSkpOworICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVHlwZUNvZGUuQk9PTEVBTl9UUlVFLCBidGRvLkNoZWNrVmFsdWUodHJ1ZSkpOworCisgICAgICAgIC8vIGZsb2F0CisgICAgICAgIEFzc2VydC5BcmVFcXVhbChUeXBlQ29kZS5GTE9BVCwgYnRkby5DaGVja1ZhbHVlKDMuMTQxNTlmKSk7CisKKyAgICAgICAgLy8gZG91YmxlCisgICAgICAgIEFzc2VydC5BcmVFcXVhbChUeXBlQ29kZS5ET1VCTEUsIGJ0ZG8uQ2hlY2tWYWx1ZSgzLjE0MTU5KSk7CisKKyAgICAgICAgLy8gYnl0ZSBhcnJheQorICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVHlwZUNvZGUuQllURVMsIGJ0ZG8uQ2hlY2tWYWx1ZShuZXcgc2J5dGVbMF0pKTsKKyAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFR5cGVDb2RlLkJZVEVTLCBidGRvLkNoZWNrVmFsdWUobmV3IHNieXRlWzFdKSk7CisKKyAgICAgICAgLy8gc3RyaW5nCisgICAgICAgIEFzc2VydC5BcmVFcXVhbChUeXBlQ29kZS5FTVBUWV9TVFJJTkcsIGJ0ZG8uQ2hlY2tWYWx1ZSgiIikpOworICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVHlwZUNvZGUuU1RSSU5HLCBidGRvLkNoZWNrVmFsdWUoImFiYyIpKTsKKworICAgICAgICAvLyBzdHJ1Y3QKKyAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFR5cGVDb2RlLkNVU1RPTSwgYnRkby5DaGVja1ZhbHVlKG5ldyBTdHJ1Y3RWYWx1ZShuZXcgWFR5cGUoImZvbyIpLCB2ZikpKTsKKworICAgICAgICAvLyBjdXN0b20KKyAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFR5cGVDb2RlLkNVU1RPTSwgYnRkby5DaGVja1ZhbHVlKG5ldyBEYXRlVGltZSgpKSk7CisKKyAgICAgICAgLy8gbm9uZQorICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVHlwZUNvZGUuTk9ORSwgYnRkby5DaGVja1ZhbHVlKEJpbmFyeVRhZ2dlZERhdGEuTk9ORSkpOworCisKKyAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RfYm9vbGVhbigpIAorCSAgICB7CisgICAgICAgICAgICAvLyAyIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBib29sW11bXSBhcnJheTEgPSBuZXcgYm9vbFtdW10geyBuZXcgYm9vbFtdIHsgZmFsc2UsIHRydWUgfSwgbmV3IGJvb2xbXSB7IHRydWUsIGZhbHNlIH0gfTsKKyAgICAgICAgICAgIFRlc3RYKCBhcnJheTEgLCBWYWxpZGF0b3JfYm9vbGVhbi5HZXQoIDIgKSApOworCisgICAgICAgICAgICAvLyAzIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBUZXN0WCgKKyAgICAgICAgICAgICAgICBuZXcgYm9vbFtdW11bXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBib29sW11bXSB7IG5ldyBib29sW10geyB0cnVlLCBmYWxzZSwgZmFsc2UgfSwgbmV3IGJvb2xbXSB7IHRydWUsIGZhbHNlLCB0cnVlIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xbXVtdIHsgbmV3IGJvb2xbXSB7IGZhbHNlLCB0cnVlLCBmYWxzZSB9LCBuZXcgYm9vbFtdIHsgZmFsc2UsIHRydWUsIGZhbHNlIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xbXVtdIHsgbmV3IGJvb2xbXSB7IGZhbHNlLCBmYWxzZSwgZmFsc2UgfSwgbmV3IGJvb2xbXSB7IHRydWUsIHRydWUsIHRydWUgfSB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBWYWxpZGF0b3JfYm9vbGVhbi5HZXQoIDMgKSApOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RfYnl0ZSgpIAorCSAgICB7CisgICAgICAgICAgICAvLyAyIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBUZXN0WCggbmV3IHNieXRlW11bXSB7IG5ldyBzYnl0ZVtdIHsgU0J5dGUuTWluVmFsdWUsIC0xLCAwLCAxLCBTQnl0ZS5NYXhWYWx1ZSB9LCBuZXcgc2J5dGVbXSB7IDIzIH0gfSwKKyAgICAgICAgICAgICAgICBWYWxpZGF0b3JfYnl0ZS5HZXQoIDIgKSApOworCisgICAgICAgICAgICAvLyAzIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBUZXN0WCgKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXVtdW10gCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXVtdIHsgbmV3IHNieXRlW10geyBTQnl0ZS5NaW5WYWx1ZSwgLTEsIDAsIDEsIFNCeXRlLk1heFZhbHVlIH0sIG5ldyBzYnl0ZVtdIHsgMjMgfSB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXVtdIHsgbmV3IHNieXRlW10geyBTQnl0ZS5NaW5WYWx1ZSwgMSwgMCwgLTEsIFNCeXRlLk1heFZhbHVlIH0sIG5ldyBzYnl0ZVtdIHsgMjMgfSB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXVtdIHsgbmV3IHNieXRlW10geyBTQnl0ZS5NYXhWYWx1ZSwgLTEsIDAsIDEsIFNCeXRlLk1pblZhbHVlIH0sIG5ldyBzYnl0ZVtdIHsgMjMgfSB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBWYWxpZGF0b3JfYnl0ZS5HZXQoIDMgKSApOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3Rfc2hvcnQoKSAKKwkgICAgeworICAgICAgICAgICAgLy8gMiBkaW1lbnNpb25hbAorICAgICAgICAgICAgVGVzdFgoIG5ldyBzaG9ydFtdW10geyBuZXcgc2hvcnRbXSB7IHNob3J0Lk1pblZhbHVlLCBTQnl0ZS5NaW5WYWx1ZSwgLTEsIDAsIDEsCisJCQkgICAgU0J5dGUuTWF4VmFsdWUsIHNob3J0Lk1heFZhbHVlIH0sIG5ldyBzaG9ydFtdIHsgMjMgfSB9LAorICAgICAgICAgICAgICAgIFZhbGlkYXRvcl9zaG9ydC5HZXQoIDIgKSApOworCisgICAgICAgICAgICAvLyAzIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBUZXN0WCggCisgICAgICAgICAgICAgICAgbmV3IHNob3J0W11bXVtdIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IHNob3J0W11bXSB7IG5ldyBzaG9ydFtdIHsgc2hvcnQuTWluVmFsdWUsIFNCeXRlLk1pblZhbHVlLCAtMSwgMCwgMSwKKwkJCSAgICAgICAgU0J5dGUuTWF4VmFsdWUsIHNob3J0Lk1heFZhbHVlIH0sIG5ldyBzaG9ydFtdIHsgMjMgfSB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgc2hvcnRbXVtdIHsgbmV3IHNob3J0W10geyBzaG9ydC5NYXhWYWx1ZSwgU0J5dGUuTWluVmFsdWUsIC0xLCAwLCAxLAorCQkJICAgICAgICBTQnl0ZS5NYXhWYWx1ZSwgc2hvcnQuTWluVmFsdWUgfSwgbmV3IHNob3J0W10geyAyMyB9IH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBzaG9ydFtdW10geyBuZXcgc2hvcnRbXSB7IHNob3J0Lk1heFZhbHVlLCBTQnl0ZS5NYXhWYWx1ZSwgMSwgMCwgLTEsCisJCQkgICAgICAgIFNCeXRlLk1pblZhbHVlLCBzaG9ydC5NaW5WYWx1ZSB9LCBuZXcgc2hvcnRbXSB7IDIzIH0gfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgVmFsaWRhdG9yX3Nob3J0LkdldCggMyApICk7CisgICAKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0X2ludCgpIAorCSAgICB7CisKKyAgICAgICAgICAgIC8vIDIgRGltZW5zaW9uYWwKKyAgICAgICAgICAgIFRlc3RYKCBuZXcgaW50W11bXSB7IG5ldyBpbnRbXSB7IGludC5NaW5WYWx1ZSwgc2hvcnQuTWluVmFsdWUsIFNCeXRlLk1pblZhbHVlLAorCQkJICAgIC0xLCAwLCAxLCBzYnl0ZS5NYXhWYWx1ZSwgc2hvcnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZX0sIG5ldyBpbnRbXSB7IDIzIH0gfSwKKyAgICAgICAgICAgICAgICBWYWxpZGF0b3JfaW50LkdldCggMiApICk7CisKKyAgICAgICAgICAgIC8vIDMgZGltZW5zaW9uYWwKKyAgICAgICAgICAgIFRlc3RYKAorICAgICAgICAgICAgICAgIG5ldyBpbnRbXVtdW10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXVtdIHsgbmV3IGludFtdIHsgaW50Lk1pblZhbHVlLCBzaG9ydC5NaW5WYWx1ZSwgU0J5dGUuTWluVmFsdWUsCisJCQkgICAgICAgIC0xLCAwLCAxLCBzYnl0ZS5NYXhWYWx1ZSwgc2hvcnQuTWF4VmFsdWUsIGludC5NYXhWYWx1ZX0sIG5ldyBpbnRbXSB7IDIzIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdW10geyBuZXcgaW50W10geyBpbnQuTWF4VmFsdWUsIHNob3J0Lk1pblZhbHVlLCBTQnl0ZS5NaW5WYWx1ZSwKKwkJCSAgICAgICAgLTEsIDAsIDEsIHNieXRlLk1heFZhbHVlLCBzaG9ydC5NaW5WYWx1ZSwgaW50Lk1heFZhbHVlfSwgbmV3IGludFtdIHsgMjMgfSB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgaW50W11bXSB7IG5ldyBpbnRbXSB7IGludC5NYXhWYWx1ZSwgc2hvcnQuTWF4VmFsdWUsIFNCeXRlLk1heFZhbHVlLAorCQkJICAgICAgICAtMSwgMCwgMSwgc2J5dGUuTWluVmFsdWUsIHNob3J0Lk1pblZhbHVlLCBpbnQuTWluVmFsdWV9LCBuZXcgaW50W10geyAyMyB9IH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIFZhbGlkYXRvcl9pbnQuR2V0KCAzICkgKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0X2xvbmcoKSAKKwkgICAgeworICAgICAgICAgICAgLy8gMiBkaW1lbnNpb25hbAorICAgICAgICAgICAgVGVzdFgoIG5ldyBsb25nW11bXSB7IG5ldyBsb25nW10geyBsb25nLk1pblZhbHVlLCBpbnQuTWluVmFsdWUsIHNob3J0Lk1pblZhbHVlLAorCQkJICAgIFNCeXRlLk1pblZhbHVlLCAtMSwgMCwgMSwgc2J5dGUuTWF4VmFsdWUsIHNob3J0Lk1heFZhbHVlLAorCQkJICAgIGludC5NYXhWYWx1ZSwgbG9uZy5NYXhWYWx1ZX0sIG5ldyBsb25nW10geyAyMyB9IH0sCisgICAgICAgICAgICAgICAgVmFsaWRhdG9yX2xvbmcuR2V0KCAyICkgKTsKKworICAgICAgICAgICAgLy8gMyBkaW1lbnNpb25hbAorICAgICAgICAgICAgVGVzdFgoCisgICAgICAgICAgICAgICAgbmV3IGxvbmdbXVtdW10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBsb25nW11bXSB7IG5ldyBsb25nW10geyBsb25nLk1pblZhbHVlLCBpbnQuTWluVmFsdWUsIHNob3J0Lk1pblZhbHVlLAorCQkJICAgICAgICBTQnl0ZS5NaW5WYWx1ZSwgLTEsIDAsIDEsIHNieXRlLk1heFZhbHVlLCBzaG9ydC5NYXhWYWx1ZSwKKwkJCSAgICAgICAgaW50Lk1heFZhbHVlLCBsb25nLk1heFZhbHVlfSwgbmV3IGxvbmdbXSB7IDIzIH0gfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGxvbmdbXVtdIHsgbmV3IGxvbmdbXSB7IGxvbmcuTWluVmFsdWUsIGludC5NYXhWYWx1ZSwgc2hvcnQuTWF4VmFsdWUsCisJCQkgICAgICAgIFNCeXRlLk1pblZhbHVlLCAtMSwgMCwgMSwgc2J5dGUuTWF4VmFsdWUsIHNob3J0Lk1pblZhbHVlLAorCQkJICAgICAgICBpbnQuTWluVmFsdWUsIGxvbmcuTWF4VmFsdWV9LCBuZXcgbG9uZ1tdIHsgMjMgfSB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgbG9uZ1tdW10geyBuZXcgbG9uZ1tdIHsgbG9uZy5NYXhWYWx1ZSwgaW50Lk1heFZhbHVlLCBzaG9ydC5NYXhWYWx1ZSwKKwkJCSAgICAgICAgU0J5dGUuTWF4VmFsdWUsIC0xLCAwLCAxLCBzYnl0ZS5NaW5WYWx1ZSwgc2hvcnQuTWluVmFsdWUsCisJCQkgICAgICAgIGludC5NaW5WYWx1ZSwgbG9uZy5NaW5WYWx1ZX0sIG5ldyBsb25nW10geyAyMyB9IH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIFZhbGlkYXRvcl9sb25nLkdldCggMyApICk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdF9mbG9hdCgpIAorCSAgICB7CisgICAgICAgICAgICAvLyAyIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBUZXN0WCggbmV3IGZsb2F0W11bXSB7IG5ldyBmbG9hdFtdIHsgLTEsIDAsIDEsIGZsb2F0Lk1pblZhbHVlLCBmbG9hdC5FcHNpbG9uLAorCQkJICAgIGZsb2F0Lk1heFZhbHVlLCBmbG9hdC5OYU4sIGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHksCisJCQkgICAgZmxvYXQuUG9zaXRpdmVJbmZpbml0eSwgLTAuMGYsIDEuMWYsCisJCQkgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzlmIH0sIG5ldyBmbG9hdFtdIHsgMjMgfSB9LAorICAgICAgICAgICAgICAgIFZhbGlkYXRvcl9mbG9hdC5HZXQoIDIgKSApOworCisgICAgICAgICAgICAvLyAzIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBUZXN0WCgKKyAgICAgICAgICAgICAgICBuZXcgZmxvYXRbXVtdW10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdW10geyBuZXcgZmxvYXRbXSB7IC0xLCAwLCAxLCBmbG9hdC5NaW5WYWx1ZSwgZmxvYXQuRXBzaWxvbiwKKwkJCSAgICAgICAgZmxvYXQuTWF4VmFsdWUsIGZsb2F0Lk5hTiwgZmxvYXQuTmVnYXRpdmVJbmZpbml0eSwKKwkJCSAgICAgICAgZmxvYXQuUG9zaXRpdmVJbmZpbml0eSwgLTAuMGYsIDEuMWYsCisJCQkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5ZiB9LCBuZXcgZmxvYXRbXSB7IDIzIH0gfSwKKworICAgICAgICAgICAgICAgICAgICBuZXcgZmxvYXRbXVtdIHsgbmV3IGZsb2F0W10geyAtMSwgMCwgMSwgZmxvYXQuTWF4VmFsdWUsIGZsb2F0LkVwc2lsb24sCisJCQkgICAgICAgIGZsb2F0Lk1pblZhbHVlLCBmbG9hdC5OYU4sIGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHksCisJCQkgICAgICAgIGZsb2F0LlBvc2l0aXZlSW5maW5pdHksIDAuMGYsIC0xLjFmLAorCQkJICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OWYgfSwgbmV3IGZsb2F0W10geyAyMyB9IH0sCisKKyAgICAgICAgICAgICAgICAgICAgbmV3IGZsb2F0W11bXSB7IG5ldyBmbG9hdFtdIHsgLTEsIDAsIDEsIGZsb2F0Lk1heFZhbHVlLCBmbG9hdC5FcHNpbG9uLAorCQkJICAgICAgICBmbG9hdC5NYXhWYWx1ZSwgZmxvYXQuTmFOLCBmbG9hdC5Qb3NpdGl2ZUluZmluaXR5LAorCQkJICAgICAgICBmbG9hdC5OZWdhdGl2ZUluZmluaXR5LCAtMC4wZiwgMS4xZiwKKwkJCSAgICAgICAgLTMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5ZiB9LCBuZXcgZmxvYXRbXSB7IDIzIH0gfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgVmFsaWRhdG9yX2Zsb2F0LkdldCggMyApICk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdF9kb3VibGUoKSAKKwkgICAgeworICAgICAgICAgICAgLy8gMiBkaW1lbnNpb25hbAorICAgICAgICAgICAgVGVzdFgoIG5ldyBkb3VibGVbXVtdIHsgbmV3IGRvdWJsZVtdeyAtMSwgMCwgMSwgZG91YmxlLk1pblZhbHVlLCBkb3VibGUuRXBzaWxvbiwKKwkJCSAgICBkb3VibGUuTWF4VmFsdWUsIGRvdWJsZS5OYU4sIGRvdWJsZS5OZWdhdGl2ZUluZmluaXR5LAorCQkJICAgIGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5LCAtMC4wZiwgMS4xZiwKKwkJCSAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OSB9LCBuZXcgZG91YmxlW117IDIzIH0gfSwKKyAgICAgICAgICAgICAgICBWYWxpZGF0b3JfZG91YmxlLkdldCggMiApICk7CisKKyAgICAgICAgICAgIC8vIDMgZGltZW5zaW9uYWwKKyAgICAgICAgICAgIFRlc3RYKAorICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXVtdW10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBkb3VibGVbXVtdIHsgbmV3IGRvdWJsZVtdeyAtMSwgMCwgMSwgZG91YmxlLk1pblZhbHVlLCBkb3VibGUuRXBzaWxvbiwKKwkJCSAgICAgICAgZG91YmxlLk1heFZhbHVlLCBkb3VibGUuTmFOLCBkb3VibGUuTmVnYXRpdmVJbmZpbml0eSwKKwkJCSAgICAgICAgZG91YmxlLlBvc2l0aXZlSW5maW5pdHksIC0wLjBmLCAxLjFmLAorCQkJICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OSB9LCBuZXcgZG91YmxlW117IDIzIH0gfSwKKworICAgICAgICAgICAgICAgICAgICBuZXcgZG91YmxlW11bXSB7IG5ldyBkb3VibGVbXXsgLTEsIDAsIDEsIGRvdWJsZS5NYXhWYWx1ZSwgZG91YmxlLkVwc2lsb24sCisJCQkgICAgICAgIGRvdWJsZS5NaW5WYWx1ZSwgZG91YmxlLk5hTiwgZG91YmxlLk5lZ2F0aXZlSW5maW5pdHksCisJCQkgICAgICAgIGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5LCAwLjBmLCAtMS4xZiwKKwkJCSAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzkgfSwgbmV3IGRvdWJsZVtdeyAyMyB9IH0sCisKKyAgICAgICAgICAgICAgICAgICAgbmV3IGRvdWJsZVtdW10geyBuZXcgZG91YmxlW117IC0xLCAwLCAxLCBkb3VibGUuTWF4VmFsdWUsIGRvdWJsZS5FcHNpbG9uLAorCQkJICAgICAgICBkb3VibGUuTWluVmFsdWUsIGRvdWJsZS5OYU4sIGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5LAorCQkJICAgICAgICBkb3VibGUuTmVnYXRpdmVJbmZpbml0eSwgMC4wZiwgLTEuMWYsCisJCQkgICAgICAgIC0zLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OSB9LCBuZXcgZG91YmxlW117IDIzIH0gfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgVmFsaWRhdG9yX2RvdWJsZS5HZXQoIDMgKSApOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RfU3RyaW5nKCkgCisJICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gMiBkaW1lbnNpb25hbAorICAgICAgICAgICAgVGVzdFgoIG5ldyBTdHJpbmdbXVtdIHsgbmV3IFN0cmluZ1tdIHsgIiIsICJhIiwgImFiIiwgImFiYyIgfSwgbmV3IFN0cmluZ1tdIHsgIjIzIiB9IH0sCisgICAgICAgICAgICAgICAgVmFsaWRhdG9yX3N0cmluZy5HZXQoIDIgKSApOworCisgICAgICAgICAgICAvLyAzIGRpbWVuc2lvbmFsCisgICAgICAgICAgICBUZXN0WCgKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXVtdCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXSB7IG5ldyBTdHJpbmdbXSB7ICIiLCAiYSIsICJhYiIsICJhYmMiIH0sIG5ldyBTdHJpbmdbXSB7ICIyMyIgfSB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXSB7IG5ldyBTdHJpbmdbXSB7ICJhYmMiLCAiYWIiLCAiYSIsICIiIH0sIG5ldyBTdHJpbmdbXSB7ICIyMyIgfSB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXSB7IG5ldyBTdHJpbmdbXSB7ICJhYiIsICJhYmMiLCAiIiwgImEiIH0sIG5ldyBTdHJpbmdbXSB7ICIyMyIgfSB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBWYWxpZGF0b3Jfc3RyaW5nLkdldCggMyApICk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdF9BZGQoKQorICAgICAgICB7CisgICAgICAgICAgICBYVHlwZSBhZGQgPSB2Zi5HZXRUeXBlKCAiYWRkIiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBGaWVsZCB4ID0gbmV3IEZpZWxkKCAieCIgKTsKKyAgICAgICAgICAgIGFkZC5QdXRWYWxpZGF0b3IoIHgsIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkgKTsKKworICAgICAgICAgICAgRmllbGQgeSA9IG5ldyBGaWVsZCAoInkiICk7CisgICAgICAgICAgICBhZGQuUHV0VmFsaWRhdG9yKCB5LCBWYWxpZGF0b3JfaW50LkdldCggMCApICk7CisKKyAgICAgICAgICAgIEZpZWxkIF9tZl9fbWVzc2FnZUlkID0gRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZDsKKyAgICAgICAgICAgIGFkZC5QdXRWYWxpZGF0b3IoIF9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworCisgICAgICAgICAgICBsb25nIG1zZ2lkID0gMHgwMTAyMDMwNDA1MDYwNzA4TDsKKworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggYWRkLCB2ZiApOworICAgICAgICAgICAgbXNnLkFkZCggeCwgMSApOworICAgICAgICAgICAgbXNnLkFkZCggeSwgMiApOworICAgICAgICAgICAgbXNnLkFkZCggX21mX19tZXNzYWdlSWQsIG1zZ2lkICk7CisgICAgICAgICAgICB0ZXN0bXNnMmJ5dGVzKG1zZywgbnVsbCwgbmV3IHNieXRlW10geyAzLCAtMTIyLCAzOSwgLTIzLCAtNzMsIC0xMDAsIDMsIC0xMjIsIDIxLCAxMCwgNDQsIC03NywgMSwgLTEyMiwgOTksIDYsIC03NiwgMTA0LCAtMTIxLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAtMTIyLCAyMSwgMTAsIDQ0LCAtNzYsIDIsIC0xMjcgfSk7CisgICAgICAgICAgICB0ZXN0bXNnMmJ5dGVzKG1zZywgZmFsc2UsIG5ldyBzYnl0ZVtdIHsgMywgLTEyMiwgMzksIC0yMywgLTczLCAtMTAwLCAzLCAtMTIyLCAyMSwgMTAsIDQ0LCAtNzcsIDEsIC0xMjIsIDk5LCA2LCAtNzYsIDEwNCwgLTEyMSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgLTEyMiwgMjEsIDEwLCA0NCwgLTc2LCAyLCAtMTI3IH0pOworICAgICAgICAgICAgdGVzdG1zZzJieXRlcyhtc2csIHRydWUsIG5ldyBzYnl0ZVtdIHsgMywgLTEwOSwgMywgOTcsIDEwMCwgMTAwLCAzLCAtMTA5LCAxLCAxMjAsIDEsIC0xMDksIDEwLCA5NSwgMTA5LCAxMDEsIDExNSwgMTE1LCA5NywgMTAzLCAxMDEsIDczLCAxMDAsIC0xMjEsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIC0xMDksIDEsIDEyMSwgMiwgLTEyNyB9KTsKKworICAgICAgICAgICAgbXNnID0gbmV3IE1lc3NhZ2UoIGFkZCwgdmYgKTsKKyAgICAgICAgICAgIG1zZy5BZGQoIHgsIDEwMDAwMDAwMDAgKTsKKyAgICAgICAgICAgIG1zZy5BZGQoIHksIDIwMDAwMDAwMDAgKTsKKyAgICAgICAgICAgIG1zZy5BZGQoIF9tZl9fbWVzc2FnZUlkLCBtc2dpZCApOworICAgICAgICAgICAgdGVzdG1zZzJieXRlcyhtc2csIG51bGwsIG5ldyBzYnl0ZVtdIHsgMywgLTEyMiwgMzksIC0yMywgLTczLCAtMTAwLCAzLCAtMTIyLCAyMSwgMTAsIDQ0LCAtNzcsIC0xMjIsIDU5LCAtMTAyLCAtNTQsIDAsIC0xMjIsIDk5LCA2LCAtNzYsIDEwNCwgLTEyMSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgLTEyMiwgMjEsIDEwLCA0NCwgLTc2LCAtMTIyLCAxMTksIDUzLCAtMTA4LCAwLCAtMTI3IH0pOworICAgICAgICAgICAgdGVzdG1zZzJieXRlcyhtc2csIGZhbHNlLCBuZXcgc2J5dGVbXSB7IDMsIC0xMjIsIDM5LCAtMjMsIC03MywgLTEwMCwgMywgLTEyMiwgMjEsIDEwLCA0NCwgLTc3LCAtMTIyLCA1OSwgLTEwMiwgLTU0LCAwLCAtMTIyLCA5OSwgNiwgLTc2LCAxMDQsIC0xMjEsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIC0xMjIsIDIxLCAxMCwgNDQsIC03NiwgLTEyMiwgMTE5LCA1MywgLTEwOCwgMCwgLTEyNyB9KTsKKyAgICAgICAgICAgIHRlc3Rtc2cyYnl0ZXMobXNnLCB0cnVlLCBuZXcgc2J5dGVbXSB7IDMsIC0xMDksIDMsIDk3LCAxMDAsIDEwMCwgMywgLTEwOSwgMSwgMTIwLCAtMTIyLCA1OSwgLTEwMiwgLTU0LCAwLCAtMTA5LCAxMCwgOTUsIDEwOSwgMTAxLCAxMTUsIDExNSwgOTcsIDEwMywgMTAxLCA3MywgMTAwLCAtMTIxLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAtMTA5LCAxLCAxMjEsIC0xMjIsIDExOSwgNTMsIC0xMDgsIDAsIC0xMjcgfSk7CisgICAgICAgIH0KKwkKKwkgICAgcHJpdmF0ZSB2b2lkIHRlc3Rtc2cyYnl0ZXMoIE1lc3NhZ2UgbXNnLCBib29sPyBzdHJpbmdUeXBlQW5kRmllbGQsCisJCSAgICBzYnl0ZVtdIHNleHBlY3RlZCApCisJICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBleHBlY3RlZCA9IFRvU0J5dGVBcnJheShzZXhwZWN0ZWQpOworCQkgICAgYnl0ZVtdIGFjdHVhbCA9IE1zZzJieXRlcyggbXNnLCBzdHJpbmdUeXBlQW5kRmllbGQgKTsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIEFzc2VydEFycmF5RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24gKQorCQkgICAgeworCQkJICAgIER1bXAoIGV4cGVjdGVkICk7CisJCQkgICAgRHVtcCggYWN0dWFsICk7CisJCQkgICAgdGhyb3c7CisJCSAgICB9CisJICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBUb1NCeXRlQXJyYXkoc2J5dGVbXSBhKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGJ5dGVbXSkoQXJyYXkpYTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZF9pbigpIAorCSAgICB7CisgICAgICAgICAgICBYVHlwZSBhZGQgPSB2Zi5HZXRUeXBlKCAiYWRkIiApOworICAgIAkJCisJCSAgICBGaWVsZCB4ID0gbmV3IEZpZWxkKCAieCIgKTsKKwkJICAgIGFkZC5QdXRWYWxpZGF0b3IoIHgsIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkgKTsKKyAgICAJCQorCQkgICAgRmllbGQgeSA9IG5ldyBGaWVsZCggInkiICk7CisJCSAgICBhZGQuUHV0VmFsaWRhdG9yKCB5LCBWYWxpZGF0b3JfaW50LkdldCggMCApICk7CisgICAgCQkKKwkJICAgIEZpZWxkIF9tZl9fbWVzc2FnZUlkID0gRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZDsKKwkJICAgIGFkZC5QdXRWYWxpZGF0b3IoIF9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworICAgIAkJCisJCSAgICBsb25nIG1zZ2lkID0gMHgwMTIzNDU2Nzg5YWJjZGVmTDsKKyAgICAJCQorCQkgICAgLy9zYnl0ZVtdIF9idWYgPSB7IDEsIC05LCAtMTAwLCAtNzMsIC0yMywgMzksIC05LCAxMDQsIC03NiwgNiwgOTksIC0xMywgLTE3LCAtNTEsIC04NSwgLTExOSwgMTAzLCA2OSwgMzUsIDEsIC05LCAtNzYsIDQ0LCAxMCwgMjEsIDY2LCAtOSwgLTc3LCA0NCwgMTAsIDIxLCA2NSwgLTIyIH0gOworICAgICAgICAgICAgc2J5dGVbXSBfYnVmID0geyAzLCAvLyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjIsIC8vIElOVCAoVHlwZSkKKwkJCSAgICAgICAgICAgICAgICAzOSwgLTIzLCAtNzMsIC0xMDAsIC8vIGFkZAorCQkJICAgICAgICAgICAgICAgIDMsIC8vIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjIsCisJCQkgICAgICAgICAgICAgICAgOTksIDYsIC03NiwgMTA0LAorCQkJICAgICAgICAgICAgICAgIC0xMjEsIC8vIExPTkcgKHZhbHVlKQorCQkJICAgICAgICAgICAgICAgIDEsIDM1LCA2OSwgMTAzLCAtMTE5LCAtODUsIC01MSwgLTE3LAorCQkJICAgICAgICAgICAgICAgIC0xMjIsIC8vIElOVCAoa2V5KQorCQkJICAgICAgICAgICAgICAgIDIxLCAxMCwgNDQsIC03NiwgLy8geQorCQkJICAgICAgICAgICAgICAgIDIsIC8vIHRpbnkgaW50ID0gMiAodmFsdWUpCisJCQkgICAgICAgICAgICAgICAgLTEyMiwgLy8gSU5UIChrZXkpCisJCQkgICAgICAgICAgICAgICAgMjEsIDEwLCA0NCwgLTc3LCAvLyB4CisJCQkgICAgICAgICAgICAgICAgMSwgLy8gdGlueSBpbnQgPTEgCisJCQkgICAgICAgICAgICAgICAgLTEyNyAvLyBOT05FIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbX2J1Zi5MZW5ndGhdOworICAgICAgICAgICAgQnVmZmVyLkJsb2NrQ29weShfYnVmLDAsYnVmLDAsX2J1Zi5MZW5ndGgpOworCisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IEJ5dGVzMm1zZyggYnVmICk7CisJCSAgICBtc2cuQ2hlY2tUeXBlKCBhZGQgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMywgbXNnLkNvdW50ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIG1zZ1sgeCBdICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIG1zZ1sgeSBdICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG1zZ2lkLCBtc2dbIF9tZl9fbWVzc2FnZUlkIF0gKTsKKyAgICAJCQorCQkgICAgLy9fYnVmID0gbmV3IHNieXRlW10geyAxLCAtOSwgLTEwMCwgLTczLCAtMjMsIDM5LCAtOSwgMTA0LCAtNzYsIDYsIDk5LCAtMTMsIC0xNywgLTUxLCAtODUsIC0xMTksIDEwMywgNjksIDM1LCAxLCAtOSwgLTc2LCA0NCwgMTAsIDIxLCAtOSwgMCwgLTEwOCwgNTMsIDExOSwgLTksIC03NywgNDQsIDEwLCAyMSwgLTksIDAsIC01NCwgLTEwMiwgNTksIC0yMiB9OworICAgICAgICAgICAvLyBfYnVmID0gbmV3IHNieXRlW10geyAzLCAtOSwgMzksIC0yMywgLTczLCAtMTAwLCAtOSwgOTksIDYsIC03NiwgMTA0LCAtMTMsIDEsIDM1LCA2OSwgMTAzLCAtMTE5LCAtODUsIC01MSwgLTE3LCAtOSwgMjEsIDEwLCA0NCwgLTc2LCAtOSwgMTE5LCA1MywgLTEwOCwgMCwgLTksIDIxLCAxMCwgNDQsIC03NywgLTksIDU5LCAtMTAyLCAtNTQsIDAsIC0yMiB9OworICAgICAgICAgICAgX2J1ZiA9IG5ldyBzYnl0ZVtdCisJCSAgICB7CisJCQkgICAgMywgLy8gdmVyc2lvbgorCQkJICAgIC0xMjIsIC8vIElOVCAodHlwZSkKKwkJCSAgICAzOSwgLTIzLCAtNzMsIC0xMDAsIC8vIGFkZAorCQkJICAgIDMsIC8vIGxlbmd0aAorCQkJICAgIC0xMjIsIC8vIElOVCAoa2V5KQorCQkJICAgIDk5LCA2LCAtNzYsIDEwNCwKKwkJCSAgICAtMTIxLCAvLyBMT05HICh2YWx1ZSkKKwkJCSAgICAxLCAzNSwgNjksIDEwMywgLTExOSwgLTg1LCAtNTEsIC0xNywKKwkJCSAgICAtMTIyLCAvLyBJTlQgKGtleSkKKwkJCSAgICAyMSwgMTAsIDQ0LCAtNzYsIC8vIHkKKwkJCSAgICAtMTIyLCAvLyBJTlQgKHZhbHVlKQorCQkJICAgIDExOSwgNTMsIC0xMDgsIDAsCisJCQkgICAgLTEyMiwgLy8gSU5UIChrZXkpCisJCQkgICAgMjEsIDEwLCA0NCwgLTc3LCAvLyB4CisJCQkgICAgLTEyMiwgLy8gSU5UICh2YWx1ZSkKKwkJCSAgICA1OSwgLTEwMiwgLTU0LCAwLAorCQkJICAgIC0xMjcgLy8gTk9ORQorCQkgICAgfTsKKworICAgICAgICAgIGJ1ZiA9IG5ldyBieXRlW19idWYuTGVuZ3RoXTsKKyAgICAgICAgICAgIEJ1ZmZlci5CbG9ja0NvcHkoX2J1ZiwgMCwgYnVmLCAwLCBfYnVmLkxlbmd0aCk7CisKKyAgICAgICAgICAgIG1zZyA9IEJ5dGVzMm1zZyggYnVmICk7IAorCQkgICAgbXNnLkNoZWNrVHlwZSggYWRkICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIG1zZy5Db3VudCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMDAwMDAwMDAwLCBtc2dbeCBdICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIwMDAwMDAwMDAsIG1zZ1sgeSBdICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG1zZ2lkLCBtc2dbIF9tZl9fbWVzc2FnZUlkIF0gKTsKKwkgICAgfQorCisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdF9hZGRfcGVyZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIFhUeXBlIGFkZCA9IHZmLkdldFR5cGUoICJhZGQiICk7CisKKyAgICAgICAgICAgIEZpZWxkIHggPSBuZXcgRmllbGQoICJ4IiApOworICAgICAgICAgICAgYWRkLlB1dFZhbGlkYXRvciggeCwgVmFsaWRhdG9yX2ludC5HZXQoIDAgKSApOworCisgICAgICAgICAgICBGaWVsZCB5ID0gbmV3IEZpZWxkKCAieSIgKTsKKyAgICAgICAgICAgIGFkZC5QdXRWYWxpZGF0b3IoIHksIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkgKTsKKworICAgICAgICAgICAgRmllbGQgX21mX19tZXNzYWdlSWQgPSBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkOworICAgICAgICAgICAgYWRkLlB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisKKyAgICAgICAgICAgIGxvbmcgbXNnaWQgPSAweDAxMjM0NTY3ODlhYmNkZWZMOworCisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBhZGQsIHZmICk7CisgICAgICAgICAgICBtc2cuQWRkKCB4LCAxMjM0NTY3ODkgKTsKKyAgICAgICAgICAgIG1zZy5BZGQoIHksIDg3NjU0MzIxMCApOworICAgICAgICAgICAgbXNnLkFkZCggX21mX19tZXNzYWdlSWQsIG1zZ2lkICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFJlc291cmNlcyByZXMgPSBuZXcgUmVzb3VyY2VzKCk7CisgICAgICAgICAgICByZXMuQWRkKFRyYW5zcG9ydENvbnN0cy5WQUxVRV9GQUNUT1JZLCB2Zik7CisgICAgICAgICAgICAgTXlQYWNrZXRTb3VyY2UgcHMgPSBuZXcgTXlQYWNrZXRTb3VyY2UoKTsKKyAgICAgICAgICAgIE1lc3NhZ2l6ZXIgbSA9IG5ldyBNZXNzYWdpemVyKHBzLCJmb286P01lc3NhZ2l6ZXIuZm9ybWF0PWJpbmFyeSIsIHJlcyk7CisgICAgICAgICAgICBtLlRyYW5zcG9ydE1lc3NhZ2UobnVsbCxtc2cpOworICAgICAgICAgIAorCisgICAgICAgICAgICBpbnQgbiA9IDkwMDk3MzsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdFBlcmYoICJ0ZXN0X2FkZF9wZXJmIiwgaSwgbSwgbXNnLCBuICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdF9zdW1fcGVyZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhUeXBlIHN1bSA9IHZmLkdldFR5cGUoICJzdW0iICk7CisKKyAgICAgICAgICAgIEZpZWxkIHZhbHVlcyA9IG5ldyBGaWVsZCggInZhbHVlcyIgKTsKKyAgICAgICAgICAgIHN1bS5QdXRWYWxpZGF0b3IoIHZhbHVlcywgVmFsaWRhdG9yX2ludC5HZXQoIDEgKSApOworCisgICAgICAgICAgICBGaWVsZCBfbWZfX21lc3NhZ2VJZCA9IERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQ7CisgICAgICAgICAgICBzdW0uUHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKworICAgICAgICAgICAgbG9uZyBtc2dpZCA9IDB4MDEyMzQ1Njc4OWFiY2RlZkw7CisKKyAgICAgICAgICAgIGludFtdIGFycmF5ID0gbmV3IGludFsgMiBdOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYXJyYXkuTGVuZ3RoOyBpKysgKQorICAgICAgICAgICAgICAgIGFycmF5WyBpIF0gPSAxMjM0NTY3ODk7CisKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIHN1bSwgdmYgKTsKKyAgICAgICAgICAgIG1zZy5BZGQoIHZhbHVlcywgYXJyYXkgKTsKKyAgICAgICAgICAgIG1zZy5BZGQoIF9tZl9fbWVzc2FnZUlkLCBtc2dpZCApOworCisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gbmV3IFJlc291cmNlcygpOworICAgICAgICAgICAgcmVzLkFkZChUcmFuc3BvcnRDb25zdHMuVkFMVUVfRkFDVE9SWSwgdmYpOworICAgICAgICAgICAgTXlQYWNrZXRTb3VyY2UgcHMgPSBuZXcgTXlQYWNrZXRTb3VyY2UoKTsKKyAgICAgICAgICAgIE1lc3NhZ2l6ZXIgbSA9IG5ldyBNZXNzYWdpemVyKHBzLCJmb286P01lc3NhZ2l6ZXIuZm9ybWF0PWJpbmFyeSIsIHJlcyk7CisgICAgICAgICAgIAorICAgICAgICAgICAgbS5UcmFuc3BvcnRNZXNzYWdlKCBudWxsLCBtc2cgKTsKKworICAgICAgICAgICAgaW50IG4gPSA1MDk1MjA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykKKyAgICAgICAgICAgICAgICBUZXN0UGVyZiggInRlc3Rfc3VtX3BlcmYiLCBpLCBtLCBtc2csIG4gKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVUb0J5dGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKG51bGwsCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAwLCAtMTI3IH0pOworCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMobmV3IG9iamVjdFtdIHsgbnVsbCB9LAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExMSwgLTEwNiwgMSwgMSwgLTEyOCwgLTEyNywgLTEyNyB9KTsKKworICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKGZhbHNlLAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEyNiwgLTEyNyB9KTsKKworICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTI1LCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyB0aW55IGludDoKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKDAsCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAwLCAtMTI3IH0pOworICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMoMSwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIDEsIC0xMjcgfSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFZhbHVlVG9CeXRlcygtMSwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIC0xLCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyBieXRlOgorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMoLTEwMCwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMjQsIC0xMDAsIC0xMjcgfSk7CisKKyAgICAgICAgICAgIC8vIHNob3J0OgorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMoMTAwMDAsCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTIzLCAzOSwgMTYsIC0xMjcgfSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFZhbHVlVG9CeXRlcygtMTAwMDAsCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTIzLCAtNDAsIC0xNiwgLTEyNyB9KTsKKworICAgICAgICAgICAgLy8gaW50OgorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMoMTAwMDAwMDAwMCwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMjIsIDU5LCAtMTAyLCAtNTQsIDAsIC0xMjcgfSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFZhbHVlVG9CeXRlcygtMTAwMDAwMDAwMCwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMjIsIC02MCwgMTAxLCA1NCwgMCwgLTEyNyB9KTsKKworICAgICAgICAgICAgLy8gbG9uZzoKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKDEwMDAwMDAwMDAwMDAwMDAwMDBMLAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEyMSwgMTMsIC0zMiwgLTc0LCAtNzcsIC04OSwgMTAwLCAwLCAwLCAtMTI3IH0pOworICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMoLTEwMDAwMDAwMDAwMDAwMDAwMDBMLAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEyMSwgLTE0LCAzMSwgNzMsIDc2LCA4OCwgLTEwMCwgMCwgMCwgLTEyNyB9KTsKKworICAgICAgICAgICAgLy8gZmxvYXQ6CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFZhbHVlVG9CeXRlcygxMjM0NWYsCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTIwLCA3MCwgNjQsIC0yOCwgMCwgLTEyNyB9KTsKKworICAgICAgICAgICAgLy8gZG91YmxlOgorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMoMjM0NTZkLAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExOSwgNjQsIC00MiwgLTI0LCAwLCAwLCAwLCAwLCAwLCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyBib29sZWFuW106CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFZhbHVlVG9CeXRlcyhuZXcgQm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UgfSwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMTEsIC0xMjUsIDEsIDIsIC0xMjUsIC0xMjYsIC0xMjcsIC0xMjcgfSk7CisKKyAgICAgICAgICAgIC8vIGJ5dGVbXToKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKG5ldyBzYnl0ZVtdIHsgMSwgMiwgMyB9LAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExNywgMywgMSwgMiwgMywgLTEyNyB9KTsKKworICAgICAgICAgICAgLy8gYnl0ZVtdW106CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFZhbHVlVG9CeXRlcyhuZXcgc2J5dGVbXVtdIHsgbmV3IHNieXRlW10geyAxLCAyLCAzIH0sIG5ldyBzYnl0ZVtdIHsgMiwgMywgNCB9IH0sCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTI0LCAyLCAyLCAtMTE3LCAzLCAxLCAyLCAzLCAtMTE3LCAzLCAyLCAzLCA0LCAtMTI3LCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyBzaG9ydFtdOgorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMobmV3IHNob3J0W10geyAxLCAyLCAzIH0sCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTIzLCAxLCAzLCAxLCAyLCAzLCAtMTI3LCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyBpbnRbXToKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKG5ldyBpbnRbXSB7IDEsIDIsIDMgfSwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMTEsIC0xMjIsIDEsIDMsIDEsIDIsIDMsIC0xMjcsIC0xMjcgfSk7CisKKyAgICAgICAgICAgIC8vIGxvbmdbXToKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKG5ldyBsb25nW10geyAxLCAyLCAzIH0sCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTIxLCAxLCAzLCAxLCAyLCAzLCAtMTI3LCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyBmbG9hdFtdOgorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMobmV3IGZsb2F0W10geyAxLCAyLCAzIH0sCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTIwLCAxLCAzLCAtMTIwLCA2MywgLTEyOCwgMCwgMCwgLTEyMCwgNjQsIDAsIDAsIDAsIC0xMjAsIDY0LCA2NCwgMCwgMCwgLTEyNywgLTEyNyB9KTsKKworICAgICAgICAgICAgLy8gZG91YmxlW106CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFZhbHVlVG9CeXRlcyhuZXcgZG91YmxlW10geyAxLCAyLCAzIH0sCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTE5LCAxLCAzLCAtMTE5LCA2MywgLTE2LCAwLCAwLCAwLCAwLCAwLCAwLCAtMTE5LCA2NCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTExOSwgNjQsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIC0xMjcsIC0xMjcgfSk7CisKKyAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZzoKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKCIiLAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExMCwgLTEyNyB9KTsKKworICAgICAgICAgICAgLy8gc3RyaW5nOgorCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMoImFiYyIsCisgICAgICAgICAgICAgICAgbmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAtMTA5LCAzLCA5NywgOTgsIDk5LCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyBzdHJpbmdbXToKKworICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKG5ldyBTdHJpbmdbXSB7ICJhIiwgIiIsICJjIiB9LAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExMSwgLTEwOSwgMSwgMywgLTEwOSwgMSwgOTcsIC0xMTAsIC0xMDksIDEsIDk5LCAtMTI3LCAtMTI3IH0pOworCisgICAgICAgICAgICAvLyBEYXRlOgorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnRWYWx1ZVRvQnl0ZXMobmV3IERhdGVUaW1lKDIwMDgsIDEsIDIsIDMsIDQsIDUsIDYsIERhdGVUaW1lS2luZC5VdGMpLAorICAgICAgICAgICAgICAgIG5ldyBzYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEwNywgLTEyMiwgNDMsIDU3LCAxMDcsIC01MiwgMSwgLTEyMiwgMTAyLCAwLCAyNiwgNjQsIC0xMjEsIDAsIDAsIDEsIDIzLCA1NiwgMTE2LCAtODgsIC0xMTQsIC0xMjcsIC0xMjcgfSk7CisKKyAgICAgICAgICAgIC8vIERhdGVbXToKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0VmFsdWVUb0J5dGVzKG5ldyBEYXRlVGltZVtdIHsgbmV3IERhdGVUaW1lKDIwMDgsIDEsIDIsIDMsIDQsIDUsIDYsIERhdGVUaW1lS2luZC5VdGMpLCBuZXcgRGF0ZVRpbWUoMjAwOCwgMiwgMywgNCwgNSwgNiwgNywgRGF0ZVRpbWVLaW5kLlV0YykgfSwKKyAgICAgICAgICAgICAgICBuZXcgc2J5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMTEsIC0xMDcsIC0xMjIsIDQzLCA1NywgMTA3LCAtNTIsIDEsIDIsIC0xMDcsIC0xMjIsIDQzLCA1NywgMTA3LCAtNTIsIDEsIC0xMjIsIDEwMiwgMCwgMjYsIDY0LCAtMTIxLCAwLCAwLCAxLCAyMywgNTYsIDExNiwgLTg4LCAtMTE0LCAtMTI3LCAtMTA3LCAtMTIyLCA0MywgNTcsIDEwNywgLTUyLCAxLCAtMTIyLCAxMDIsIDAsIDI2LCA2NCwgLTEyMSwgMCwgMCwgMSwgMjMsIC0zNSwgMTIwLCA1LCA4NywgLTEyNywgLTEyNywgLTEyNyB9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBiYWR0eXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBCeXRlczJtc2cobmV3IHNieXRlW10geyAzLCAxLCAwLCAtMTI3IH0pOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1zZy5HZXRYVHlwZS5JZCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBiYWRtc2dsZW4xKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBCeXRlczJtc2cobmV3IHNieXRlW10geyAzLCAxLCAtMSwgLTEyNyB9KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtc2cgPSAiICsgbXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIGJhZG1zZ2xlbjIoKQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IEJ5dGVzMm1zZyhuZXcgc2J5dGVbXSB7IDMsIDEsIDk5LCAtMTI3IH0pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm1zZyA9ICIgKyBtc2cpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGJhZGZpZWxkKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBCeXRlczJtc2cobmV3IHNieXRlW10geyAzLCAxLCAxLCAyLCAyLCAtMTI3IH0sIFZhbGlkYXRvci5MZXZlbC5NSVNTSU5HX09LKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtc2cgPSAiICsgbXNnKTsKKyAgICAgICAgfQorICAgIAkKKwkgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFZhbHVlVG9CeXRlcyggT2JqZWN0IHZhbHVlLCBzYnl0ZVtdIGV4cGVjdGVkQnl0ZXMgKSAKKwkgICAgeworICAgICAgICAgICAgWFR5cGUgdCA9IG5ldyBYVHlwZSgxLCAiYSIpOworICAgICAgICAgICAgRmllbGQgZiA9IG5ldyBGaWVsZCgyLCAiYiIpOworICAgICAgICAgICAgdC5QdXRWYWxpZGF0b3IoZiwgVmFsaWRhdG9yX29iamVjdC5HZXQoMCkpOworCisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKHQsIHZmKTsKKyAgICAgICAgICAgIG1zZy5BZGQoZiwgdmFsdWUpOworCisJCSAgICBCaW5hcnlUYWdnZWREYXRhT3V0cHV0IGJ0ZG8gPSBuZXcgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCggdmYsICJub25lOiIgKTsKKwkJICAgIEZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ0ZG8uV3JpdGVNZXNzYWdlKG1zZywgYnVmKTsKKworCQkgICAgYnVmLlNldEluZGV4KCAwICk7CisJCSAgICBieXRlW10gYiA9IGJ1Zi5HZXRBdmFpbEJ5dGVzKCk7CisgICAgICAgICAgICBzYnl0ZVtdIGIxID0gbmV3IHNieXRlW2IuTGVuZ3RoXTsKKyAgICAgICAgICAgIEJ1ZmZlci5CbG9ja0NvcHkoYiwwLGIxLDAsYi5MZW5ndGgpOworICAgICAgICAgICAgRHVtcCggYiApOworCQkgICAgQXNzZXJ0QXJyYXlFcXVhbHMoIGV4cGVjdGVkQnl0ZXMsIGIxICk7CisJICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFRlc3RQZXJmKCBTdHJpbmcgbmFtZSwgaW50IGl0ZXIsIE1lc3NhZ2l6ZXIgbSwgTWVzc2FnZSBtc2csIGludCBuICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyB0MCA9IEhQVGltZXIuTm93KCk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAgICAgbS5UcmFuc3BvcnRNZXNzYWdlKCBudWxsLCBtc2cgKTsKKworICAgICAgICAgICAgbG9uZyB0MSA9IEhQVGltZXIuTnNTaW5jZSggdDAgKTsKKworICAgICAgICAgICAgZG91YmxlIHRpbWVEaWZmID0gdDEgLyAxMDAwMDAwMDAwLjA7CisgICAgICAgICAgICBkb3VibGUgciA9IG4gLyB0aW1lRGlmZjsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIG5hbWUgKyAiIC0tIGl0ZXJhdGlvbiA6ICIgKyBpdGVyICsgIiB0aW1lIDogIiArIHRpbWVEaWZmICsgCisgICAgICAgICAgICAgICAgIiBjb3VudCA6ICIgKyBuICsgIiByYXRlIDogIiArIHIgKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gTXlQYWNrZXRTb3VyY2UKKyAgICAgICAgcHVibGljIGNsYXNzIE15UGFja2V0U291cmNlIDogVHJhbnNwb3J0UGFja2V0CisgICAgICAgIHsKKworICAgICAgICAgICAgcHVibGljIGludCBIZWFkZXJTaXplKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgUGFja2V0KCBXaG8gcmVjZXBpZW50LCBGbGV4QnVmZmVyIGJ1ZiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNyZWdpb24gU291cmNlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBHZXRIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2V0SGFuZGxlciggb2JqZWN0IGhhbmRsZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0IE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBUcmFuc3BvcnRRdWVyeSggb2JqZWN0IHF1ZXJ5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Q29udHJvbCggb2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeSggb2JqZWN0IGV2ZW50T2JqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydFBhY2tldCBNZW1iZXJzCisKKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0UGFja2V0KFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25QYWNrZXQ+IE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25QYWNrZXQgc2Vzc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25QYWNrZXQ+IE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgU2Vzc2lvblBhY2tldCBHZXRTZXNzaW9uKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIE15UGFja2V0U291cmNlCisKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gTXNnMmJ5dGVzKE1lc3NhZ2UgbXNnLCBib29sPyBzdHJpbmdUeXBlQW5kRmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKworICAgICAgICAgICAgVVJMIHUgPSBuZXcgVVJMKCJub25lOiIpOworICAgICAgICAgICAgaWYgKHN0cmluZ1R5cGVBbmRGaWVsZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHUuQWRkVGVybShCaW5hcnlUYWdnZWREYXRhT3V0cHV0LlNUUklOR19UWVBFX0FORF9GSUVMRCwgc3RyaW5nVHlwZUFuZEZpZWxkLlRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBCaW5hcnlUYWdnZWREYXRhT3V0cHV0IGJ0ZG8gPSBuZXcgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCh2ZiwgdS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGJ0ZG8uV3JpdGVNZXNzYWdlKCBtc2csIGJ1ZiApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAwICk7CisgICAgICAgICAgICByZXR1cm4gYnVmLkdldEF2YWlsQnl0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTWVzc2FnZSBCeXRlczJtc2coYnl0ZVtdIGJ1ZiwgVmFsaWRhdG9yLkxldmVsIGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBCaW5hcnlUYWdnZWREYXRhSW5wdXQgYnRkaSA9IG5ldyBCaW5hcnlUYWdnZWREYXRhSW5wdXQodmYsICJub25lOiIpOworICAgICAgICAgICAgcmV0dXJuIGJ0ZGkuUmVhZE1lc3NhZ2UobmV3IEZsZXhCdWZmZXIoYnVmKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lc3NhZ2UgQnl0ZXMybXNnKGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlczJtc2coYnVmLCBWYWxpZGF0b3IuTGV2ZWwuRlVMTCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lc3NhZ2UgQnl0ZXMybXNnKHNieXRlW10gYnVmLCBWYWxpZGF0b3IuTGV2ZWwgbGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlczJtc2coKGJ5dGVbXSkoQXJyYXkpYnVmLCBsZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lc3NhZ2UgQnl0ZXMybXNnKHNieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZXMybXNnKGJ1ZiwgVmFsaWRhdG9yLkxldmVsLkZVTEwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRlc3RYKCBPYmplY3QgeCwgVmFsaWRhdG9yIHYgKQorCSAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggeCBpcyBBcnJheSApCisJCSAgICB7CisgICAgICAgICAgICAgICAgaW50IG4gPSAoICggQXJyYXkgKSB4ICkuR2V0TGVuZ3RoKCAwICk7CisJCQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQkgICAgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgZ2V0VmFsdWUgPSAoICggQXJyYXkgKSB4ICkuR2V0VmFsdWUoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgVGVzdFgoIGdldFZhbHVlLCB2LkVsZW1lbnRWYWxpZGF0b3IoKSApOworCQkJICAgIH0KKwkJICAgIH0KKworICAgICAgICAgICAgVGVzdCh4LCB2LCBudWxsKTsKKyAgICAgICAgICAgIFRlc3QoeCwgdiwgZmFsc2UpOworICAgICAgICAgICAgVGVzdCh4LCB2LCB0cnVlKTsKKwkgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRlc3QoT2JqZWN0IHgsIFZhbGlkYXRvciB2LCBib29sPyBzdHJpbmdUeXBlQW5kRmllbGQpCisJICAgIHsKKwkJICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKworICAgICAgICAgICAgbXRfZm9vLkNsZWFyVmFsaWRhdG9yKCBtZl94ICk7CisgICAgICAgICAgICBtdF9mb28uUHV0VmFsaWRhdG9yKCBtZl94LCB2ICk7CisKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10X2ZvbywgdmYgKTsKKwkJICAgIG1zZy5BZGQoIG1mX3gsIHggKTsKKwkJICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoICJtc2cgPSAiK21zZyApOworCisgICAgICAgICAgICBieXRlW10gYnVmeCA9IE1zZzJieXRlcyhtc2csIHN0cmluZ1R5cGVBbmRGaWVsZCk7CisgICAgICAgICAgICBEdW1wKGJ1ZngpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cyID0gQnl0ZXMybXNnKCBidWZ4ICk7CisgICAgCQkKKwkJICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoICJtc2cyID0gIittc2cyICk7CisJCSAgICBtc2cyLkNoZWNrVHlwZSggbXRfZm9vICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIG1zZzIuQ291bnQgKTsKKwkJICAgIEFzc2VydC5Jc1RydWUobXNnLkNvbnRhaW5zS2V5KCBtZl94ICkpOworICAgICAgICAgICAgT2JqZWN0IHkgPSBtc2cyLkdldChtZl94KTsKKyAgICAgICAgICAgIEFyZUVxdWFsKHgsIHkpOworCSAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRHVtcChieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJidWYgPSB7Iik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgoc2J5dGUpYnVmW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgfSIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFyZUVxdWFsKCBPYmplY3QgYSwgT2JqZWN0IGIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKKwkJICAgIHsKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGEsIGIgKTsKKwkJCSAgICByZXR1cm47CisJCSAgICB9CisgICAgCQkKKyAgICAgICAgICAgIFR5cGUgYVR5cGUgPSBhLkdldFR5cGUoKTsKKyAgICAgICAgICAgIFR5cGUgYlR5cGUgPSBiLkdldFR5cGUoKTsKKyAgICAJCQorCQkgICAgaWYgKGFUeXBlID09IGJUeXBlKQorCQkgICAgeworICAgICAgICAgICAgICAgIGlmICggKCBhIGlzIEFycmF5ICkgJiYgKCBiIGlzIEFycmF5ICkgKQorICAgICAgICAgICAgICAgICAgICBBc3NlcnRBcnJheUVxdWFscyggYSwgYiApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBhLCBiICk7CisJCSAgICB9CisJCSAgICAvL2Vsc2UgaWYgKGEgaW5zdGFuY2VvZiBOdW1iZXIgJiYgYiBpbnN0YW5jZW9mIE51bWJlcikKKwkJICAgIGVsc2UKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggImEgezB9LCBiIHsxfVxuIiwgYVR5cGUsIGJUeXBlICk7CisJCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBhLCBiICk7CisJCSAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQXNzZXJ0QXJyYXlFcXVhbHMoIE9iamVjdCBhLCBPYmplY3QgYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGphZ2dlZCBhcnJheXMgLi4uIG9uZSBkaW1lbnNpb24KKyAgICAgICAgICAgIGludCBhbiA9ICggKCBBcnJheSApIGEgKS5HZXRMZW5ndGgoIDAgKTsKKyAgICAgICAgICAgIGludCBibiA9ICggKCBBcnJheSApIGIgKS5HZXRMZW5ndGgoIDAgKTsKKworICAgICAgICAgICAgQXJlRXF1YWwoIGFuLCBibiApOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhbjsgaSsrICkKKyAgICAgICAgICAgICAgICBBcmVFcXVhbCggKCAoIEFycmF5ICkgYSApLkdldFZhbHVlKCAwICksICggKCBBcnJheSApIGIgKS5HZXRWYWx1ZSggMCApICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmdbXSBHZXRUZXN0TG9uZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IDY1NTM2ICsgMiArIDY7CisgICAgICAgICAgICBpbnQgayA9IDY1NTM2ICsgMjsKKyAgICAgICAgICAgIGludCBtaW4gPSBzaG9ydC5NaW5WYWx1ZSAtIDE7CisgICAgICAgICAgICBsb25nW10gdmFscyA9IG5ldyBsb25nW25dOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKGstLSA+IDApCisgICAgICAgICAgICAgICAgdmFsc1tpKytdID0gbWluKys7CisgICAgICAgICAgICB2YWxzW2krK10gPSBpbnQuTWluVmFsdWU7CisgICAgICAgICAgICB2YWxzW2krK10gPSBpbnQuTWF4VmFsdWU7CisgICAgICAgICAgICB2YWxzW2krK10gPSBpbnQuTWluVmFsdWUgLSAxTDsKKyAgICAgICAgICAgIHZhbHNbaSsrXSA9IGludC5NYXhWYWx1ZSArIDFMOworICAgICAgICAgICAgdmFsc1tpKytdID0gbG9uZy5NaW5WYWx1ZTsKKyAgICAgICAgICAgIHZhbHNbaSsrXSA9IGxvbmcuTWF4VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdmFsczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50W10gR2V0VGVzdEludHMoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IDY1NTM2ICsgMiArIDI7CisgICAgICAgICAgICBpbnQgayA9IDY1NTM2ICsgMjsKKyAgICAgICAgICAgIGludCBtaW4gPSBzaG9ydC5NaW5WYWx1ZSAtIDE7CisgICAgICAgICAgICBpbnRbXSB2YWxzID0gbmV3IGludFtuXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChrLS0gPiAwKQorICAgICAgICAgICAgICAgIHZhbHNbaSsrXSA9IG1pbisrOworICAgICAgICAgICAgdmFsc1tpKytdID0gaW50Lk1pblZhbHVlOworICAgICAgICAgICAgdmFsc1tpKytdID0gaW50Lk1heFZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHZhbHM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHNob3J0W10gR2V0U2hvcnRzKHNob3J0IG1pbiwgaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0W10gdmFscyA9IG5ldyBzaG9ydFtuXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChuLS0gPiAwKQorICAgICAgICAgICAgICAgIHZhbHNbaSsrXSA9IG1pbisrOworICAgICAgICAgICAgcmV0dXJuIHZhbHM7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc2J5dGVbXSBHZXRCeXRlcyhzYnl0ZSBtaW4sIGludCBuKQorICAgICAgICB7CisgICAgICAgICAgICBzYnl0ZVtdIHZhbHMgPSBuZXcgc2J5dGVbbl07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAobi0tID4gMCkKKyAgICAgICAgICAgICAgICB2YWxzW2krK10gPSBtaW4rKzsKKyAgICAgICAgICAgIHJldHVybiB2YWxzOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlWYWx1ZUZhY3RvcnkgOiBEZWZhdWx0VmFsdWVGYWN0b3J5CisgICAgICAgIHsKKwkgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSAKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisJICAgICAgICBzdGF0aWMgTXlWYWx1ZUZhY3RvcnkoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuSW5pdCggdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkgICAgICAgIH0KKworCSAgICAgICAgcHVibGljIE15VmFsdWVGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICA6IGJhc2UgKCJub25lOiIsIHR5cGVzLCBjbGFzczJ0eXBlKQorCSAgICAgICAgeworCQkgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisJICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1RyYW5zcG9ydC9UZXN0QXJyYXlWYWx1ZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L1Rlc3RBcnJheVZhbHVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjllNGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1RyYW5zcG9ydC9UZXN0QXJyYXlWYWx1ZS5jcwpAQCAtMCwwICsxLDEwNSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydAoreworCisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0QXJyYXlWYWx1ZQorICAgIHsKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0QXJyYXlWYWx1ZSIgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yMSgpCisJICAgIHsKKwkJICAgIEFycmF5VmFsdWUgYXYgPSBuZXcgQXJyYXlWYWx1ZSggbmV3IHNieXRlWzBdICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChzYnl0ZSkgMCwgYXYuVHlwZSApOworCQkgICAgQXNzZXJ0LklzTnVsbCggYXYuQ3VzdG9tU3RydWN0VHlwZSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBhdi5EaW0gKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yMigpCisJICAgIHsKKwkJICAgIFhUeXBlIHQxID0gbmV3IFhUeXBlKCAidDEiICk7CisJCSAgICBBcnJheVZhbHVlIGF2ID0gbmV3IEFycmF5VmFsdWUoIG5ldyBzYnl0ZVswXSwgKHNieXRlKSAxLCB0MSwgMiApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAoc2J5dGUpIDEsIGF2LlR5cGUgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggdDEsIGF2LkN1c3RvbVN0cnVjdFR5cGUgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMiwgYXYuRGltICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjMoKQorCSAgICB7CisJCSAgICBYVHlwZSB0MiA9IG5ldyBYVHlwZSggInQyIiApOworICAgICAgICAgICAgQXJyYXlWYWx1ZSBhdiA9IG5ldyBBcnJheVZhbHVlKCBuZXcgc2J5dGVbIDAgXSwgKCBzYnl0ZSApIDMsIHQyLCA0ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChieXRlKSAzLCBhdi5UeXBlICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHQyLCBhdi5DdXN0b21TdHJ1Y3RUeXBlICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDQsIGF2LkRpbSApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgQWRkTWFueTEoKQorCSAgICB7CisJCSAgICBEYXRlVGltZSBkdCA9IG5ldyBEYXRlVGltZSgpOworCQkgICAgQXJyYXlWYWx1ZSBhdiA9IG5ldyBBcnJheVZhbHVlKCBuZXcgT2JqZWN0W10geyBmYWxzZSwgKHNieXRlKSAxLCAoc2hvcnQpIDIsIDMsIChsb25nKSA0LCAoZmxvYXQpIDEuNSwgMS42LCAiYWJjIiwgbnVsbCwgZHQgfSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMCwgYXYuU2l6ZSgpICk7CisJCSAgICBpbnQgaW5kZXggPSAwOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBmYWxzZSwgYXYuR2V0KCBpbmRleCsrICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggKHNieXRlKSAxLCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAoc2hvcnQpIDIsIGF2LkdldCggaW5kZXgrKyApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIGF2LkdldCggaW5kZXgrKyApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChsb25nKSA0LCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAoZmxvYXQpIDEuNSwgYXYuR2V0KCBpbmRleCsrICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMS42LCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAiYWJjIiwgYXYuR2V0KCBpbmRleCsrICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggbnVsbCwgYXYuR2V0KCBpbmRleCsrICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZHQsIGF2LkdldCggaW5kZXgrKyApICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBBZGRNYW55MigpCisJICAgIHsKKwkJICAgIERhdGVUaW1lIGR0ID0gbmV3IERhdGVUaW1lKCk7CisJCSAgICBBcnJheVZhbHVlIGF2ID0gbmV3IEFycmF5VmFsdWUoIG5ldyBPYmplY3RbXSB7IChmbG9hdCkgMS41LCAxLjYsICJhYmMiLCBudWxsLCBkdCwgZmFsc2UsIChzYnl0ZSkgMSwgKHNob3J0KSAyLCAzLCAobG9uZykgNCB9ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEwLCBhdi5TaXplKCkgKTsKKwkJICAgIGludCBpbmRleCA9IDA7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChmbG9hdCkgMS41LCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLjYsIGF2LkdldCggaW5kZXgrKyApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoICJhYmMiLCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBudWxsLCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBkdCwgYXYuR2V0KCBpbmRleCsrICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZmFsc2UsIGF2LkdldCggaW5kZXgrKyApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChzYnl0ZSkgMSwgYXYuR2V0KCBpbmRleCsrICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggKHNob3J0KSAyLCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAzLCBhdi5HZXQoIGluZGV4KysgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAobG9uZykgNCwgYXYuR2V0KCBpbmRleCsrICkgKTsKKwkgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1RyYW5zcG9ydC9UZXN0RGVmYXVsdERlbGl2ZXJ5U2VydmljZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L1Rlc3REZWZhdWx0RGVsaXZlcnlTZXJ2aWNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDY0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1RyYW5zcG9ydC9UZXN0RGVmYXVsdERlbGl2ZXJ5U2VydmljZS5jcwpAQCAtMCwwICsxLDI5MyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgLy9bVGVzdEZpeHR1cmVdCisgICAgLy9wdWJsaWMgY2xhc3MgVGVzdERlZmF1bHREZWxpdmVyeVNlcnZpY2UKKyAgICAvL3sKKyAgICAvLyAgICBwcml2YXRlIERlZmF1bHREZWxpdmVyeVNlcnZpY2U8TXlTdHViPiBzdmM7CisKKyAgICAvLyAgICBwcml2YXRlIE15U3R1YiBtczsKKworICAgIC8vICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAvLyAgICBwcml2YXRlIE1lc3NhZ2UgbXNnOworCisgICAgLy8gICAgcHJpdmF0ZSBNeURhdGFTb3VyY2UgZHMgPSBuZXcgTXlEYXRhU291cmNlKCk7CisKKyAgICAvLyAgICBYVHlwZSBtdF9hZGQgPSBuZXcgWFR5cGUoICJhZGQiICk7CisgICAgLy8gICAgWFR5cGUgbXRfYWRkX3Jlc3VsdCA9IG5ldyBYVHlwZSggImFkZF9yZXN1bHQiICk7CisgICAgLy8gICAgRmllbGQgbWZfeCA9IG5ldyBGaWVsZCggIngiICk7CisgICAgLy8gICAgRmllbGQgbWZfeSA9IG5ldyBGaWVsZCggInkiICk7CisgICAgLy8gICAgRmllbGQgbWZfcmVzdWx0ID0gbmV3IEZpZWxkKCAicmVzdWx0IiApOworCisgICAgLy8gICAgcHVibGljIE1lc3NhZ2UgQ29uc3RydWN0U2ltcGxlTWVzc2FnZSgpCisgICAgLy8gICAgeyAgIAorICAgIC8vICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UoIE15VmFsdWVGYWN0b3J5Lm10X2Z1bmN0aW9uLCB2ZiApOworICAgICAgICAgICAgCisgICAgLy8gICAgfQorCisgICAgLy8gICAgcHVibGljIE1lc3NhZ2UgQ29uc3RydWN0QWRkTWVzc2FnZSgpIAorICAgIC8vICAgIHsKKworICAgIC8vICAgICAgICBtc2cgPSBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkLCB2ZiApOworICAgIC8vICAgICAgICBtc2cuQWRkKCBNeVZhbHVlRmFjdG9yeS5tZl94LCA0ICk7CisgICAgLy8gICAgICAgIG1zZy5BZGQoIE15VmFsdWVGYWN0b3J5Lm1mX3ksIDUgKTsKKyAgICAJCQorICAgIC8vICAgICAgICByZXR1cm4gbXNnOworICAgIC8vICAgIH0KKworICAgIC8vICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLyAgICAvLy8gU2V0dXAgbWV0aG9kIHRvIGJlIGNhbGxlZCBiZWZvcmUgZXZlcnkgdGVzdC4KKyAgICAvLyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vICAgIFtTZXRVcF0KKyAgICAvLyAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICBtcyA9IG5ldyBNeVN0dWIoIG51bGwsIG51bGwgKTsKKworICAgIC8vICAgICAgICBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlPE15U3R1Yj4gZGRzID0gbmV3IE15RGVmYXVsdERlbGl2ZXJ5U2VydmljZSggbXMgKTsKKworICAgIC8vICAgICAgICBzdmMgPSBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlPE15U3R1Yj4uU2V0VXAoIGRkcywgZHMsIHZmICk7CisgICAgLy8gICAgfQorCisgICAgLy8gICAgLy9bVGVzdF0KKyAgICAvLyAgICAvL3B1YmxpYyB2b2lkIFVwKCkKKyAgICAvLyAgICAvL3sKKyAgICAvLyAgICAvLyAgICBTZXR1cCgpOworICAgIC8vICAgIC8vICAgIHN2Yy5VcCggbmV3IE1haWxib3hNYW5hZ2VyKCBzdmMsIDAgKSApOworICAgIC8vICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCggbXMud2hhdCwgV2hhdC5NWVNUVUJDUkVBVEVEICk7CisgICAgLy8gICAgLy99CisKKyAgICAvLyAgICAvL1tUZXN0XQorICAgIC8vICAgIC8vcHVibGljIHZvaWQgRG93bigpCisgICAgLy8gICAgLy97CisgICAgLy8gICAgLy8gICAgU2V0dXAoKTsKKyAgICAvLyAgICAvLyAgICBzdmMuVXAoIG5ldyBNYWlsYm94TWFuYWdlciggc3ZjLCAwICkgKTsKKyAgICAvLyAgICAvLyAgICBzdmMuRG93biggbmV3IE1haWxib3hNYW5hZ2VyKCBzdmMsIDAgKSApOworICAgIC8vICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCggbXMud2hhdCwgV2hhdC5NWVNUVUJNRVNTQUdFICk7CisgICAgLy8gICAgLy99CisKKyAgICAvLyAgICBbVGVzdF0KKyAgICAvLyAgICBwdWJsaWMgdm9pZCBTaHV0ZG93bk91dHB1dCgpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICBzdmMuVHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0Q29uc3RzLlNUT1AsIG51bGwgKTsKKyAgICAvLyAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBkcy53aGF0LCBXaGF0Lk1ZREFUQVNPVVJDRVNIVVRET1dOT1VUUFVUICk7CisgICAgLy8gICAgfQorCisgICAgLy8gICAgW1Rlc3RdCisgICAgLy8gICAgcHVibGljIHZvaWQgTWVzc2FnZSgpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICBzdmMuU2Vzc2lvbk5vdGlmeSggU2Vzc2lvbkNvbnN0cy5VUCApOworICAgIC8vICAgICAgICBzdmMuTWVzc2FnZSggbnVsbCwgQ29uc3RydWN0U2ltcGxlTWVzc2FnZSgpICk7CisgICAgLy8gICAgICAgIEFzc2VydC5BcmVFcXVhbCggbXMud2hhdCwgV2hhdC5NWVNUVUJNRVNTQUdFICk7CisgICAgLy8gICAgfQorCisgICAgLy8gICAgW1Rlc3RdCisgICAgLy8gICAgcHVibGljIHZvaWQgU2VuZCgpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICBzdmMuU2VuZCggQ29uc3RydWN0U2ltcGxlTWVzc2FnZSgpICk7CisgICAgLy8gICAgICAgIEFzc2VydC5BcmVFcXVhbCggZHMud2hhdCwgV2hhdC5NWURBVEFTT1VSQ0VEQVRBICk7CisgICAgLy8gICAgfQorCisgICAgLy8gICAgW1Rlc3RdCisgICAgLy8gICAgcHVibGljIHZvaWQgQ2FsbCgpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICB0cnkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgc3ZjLkVuZENhbGwoIHN2Yy5CZWdpbkNhbGwoIENvbnN0cnVjdEFkZE1lc3NhZ2UoKSApLCBtdF9hZGRfcmVzdWx0LAorICAgIC8vICAgICAgICAgICAgICAgIG1mX3Jlc3VsdCwgMSApOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgICAgIGNhdGNoICggRXhjZXB0aW9uICkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBkcy53aGF0LCBXaGF0Lk1ZREFUQVNPVVJDRURBVEEgKTsKKyAgICAvLyAgICAgICAgfQorICAgIC8vICAgIH0KKworICAgIC8vICAgIHB1YmxpYyBjbGFzcyBNeURlZmF1bHREZWxpdmVyeVNlcnZpY2UgOiBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlPE15U3R1Yj4KKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIHByaXZhdGUgTXlTdHViIG1zOworCisgICAgLy8gICAgICAgIHB1YmxpYyBNeURlZmF1bHREZWxpdmVyeVNlcnZpY2UoIE15U3R1YiBtcyApCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHRoaXMubXMgPSBtczsKKyAgICAvLyAgICAgICAgfQorCisgICAgLy8gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBNeVN0dWIgTmV3U3R1YiggTWFpbGJveE1lc3NhZ2VTb3VyY2Ugc3JjICkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIG1zOworICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiAiTXlEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlIHRlc3RpbmciOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgfQorCisgICAgLy8gICAgcHVibGljIGVudW0gV2hhdAorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgTVlTVFVCQ1JFQVRFRCwKKyAgICAvLyAgICAgICAgTVlTVFVCTUVTU0FHRSwKKyAgICAvLyAgICAgICAgTVlEQVRBU09VUkNFU0hVVERPV05PVVRQVVQsCisgICAgLy8gICAgICAgIE1ZREFUQVNPVVJDRURBVEEKKyAgICAvLyAgICB9OworCisgICAgLy8gICAgcHVibGljIGNsYXNzIE15RGF0YVNvdXJjZSA6IERhdGFTb3VyY2UKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIHB1YmxpYyBFbnVtIHdoYXQ7CisKKyAgICAvLyAgICAgICAgI3JlZ2lvbiBEYXRhU291cmNlIE1lbWJlcnMKKworICAgIC8vICAgICAgICBwdWJsaWMgdm9pZCBEYXRhKCBXaG8gcmVjaXBpZW50LCBGbGV4QnVmZmVyIGJ1ZiApCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHdoYXQgPSBXaGF0Lk1ZREFUQVNPVVJDRURBVEE7CisgICAgLy8gICAgICAgIH0KKworICAgIC8vICAgICAgICAjZW5kcmVnaW9uCisKKworICAgIC8vICAgICAgICAjcmVnaW9uIFNvdXJjZSBNZW1iZXJzCisKKyAgICAvLyAgICAgICAgcHVibGljIG9iamVjdCBHZXRIYW5kbGVyKCkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgLy8gICAgICAgIH0KKworICAgIC8vICAgICAgICBwdWJsaWMgdm9pZCBTZXRIYW5kbGVyKCBvYmplY3QgaGFuZGxlciApCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uIAorICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgLy8gICAgICAgICNyZWdpb24gVHJhbnNwb3J0IE1lbWJlcnMKKworICAgIC8vICAgICAgICBwdWJsaWMgb2JqZWN0IFRyYW5zcG9ydFF1ZXJ5KCBvYmplY3QgcXVlcnkgKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAvLyAgICAgICAgfQorCisgICAgLy8gICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydENvbnRyb2woIG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUgKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICBpZiAoIGNvbnRyb2wuRXF1YWxzKCBUcmFuc3BvcnRDb25zdHMuU1RPUCApICkKKyAgICAvLyAgICAgICAgICAgICAgICB3aGF0ID0gV2hhdC5NWURBVEFTT1VSQ0VTSFVURE9XTk9VVFBVVDsKKyAgICAvLyAgICAgICAgfQorCisgICAgLy8gICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeSggb2JqZWN0IGV2ZW50T2JqICkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgLy8gaWdub3JlCisgICAgLy8gICAgICAgIH0KKworICAgIC8vICAgICAgICAjZW5kcmVnaW9uCisgICAgLy8gICAgfQorCisgICAgLy8gICAgcHVibGljIGNsYXNzIE15U3R1YiA6IFN0dWJCYXNlCisgICAgLy8gICAgeworICAgIC8vICAgICAgICBwdWJsaWMgRW51bSB3aGF0OworCisgICAgLy8gICAgICAgIHB1YmxpYyBNeVN0dWIoIE1lc3NhZ2VTb3VyY2Ugc3JjLCBPYmplY3Qgb2JqICkgOiBiYXNlICggc3JjLCBvYmosIG51bGwsIG51bGwgKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICB3aGF0ID0gV2hhdC5NWVNUVUJDUkVBVEVEOworICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgTWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICB3aGF0ID0gV2hhdC5NWVNUVUJNRVNTQUdFOworICAgIC8vICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gICAgICAgIH0KKyAgICAvLyAgICB9CisKKyAgICAvLyAgICBwdWJsaWMgY2xhc3MgTXlWYWx1ZUZhY3RvcnkgOiBEZWZhdWx0VmFsdWVGYWN0b3J5CisgICAgLy8gICAgeworICAgIC8vICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBUeXBlTWFwIHR5cGVzID0gbmV3IFR5cGVNYXAoKTsKKworICAgIC8vICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBGaWVsZE1hcCBmaWVsZHMgPSBuZXcgRmllbGRNYXAoKTsKKworICAgIC8vICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSAKKyAgICAvLyAgICAgICAgICAgIG5ldyBDbGFzczJUeXBlTWFwKCk7CisKKyAgICAvLyAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBYVHlwZSBtdF9mdW5jdGlvbiA9IHR5cGVzLkdldCggImZ1bmN0aW9uIiApOworCisgICAgLy8gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgWFR5cGUgbXRfYWRkID0gdHlwZXMuR2V0KCAiYWRkIiApOworCisgICAgLy8gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgWFR5cGUgbXRfYWRkX3Jlc3VsdCA9IHR5cGVzLkdldCggImFkZF9yZXN1bHQiICk7CisKKyAgICAvLyAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBtZl94ID0gZmllbGRzLkdldCggIngiICk7CisKKyAgICAvLyAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBtZl95ID0gZmllbGRzLkdldCggInkiICk7CisKKyAgICAvLyAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBtZl9yZXN1bHQgPSBmaWVsZHMuR2V0KCAieHJlc3VsdCIgKTsKKworICAgIC8vICAgICAgICBzdGF0aWMgTXlWYWx1ZUZhY3RvcnkoKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICBEZWZhdWx0VmFsdWVGYWN0b3J5LkluaXQoIHR5cGVzLCBmaWVsZHMsIGNsYXNzMnR5cGUgKTsKKworICAgIC8vICAgICAgICAgICAgbXRfZnVuY3Rpb24uUHV0VmFsaWRhdG9yKCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworCisgICAgLy8gICAgICAgICAgICBtdF9hZGQuUHV0VmFsaWRhdG9yKCBtZl94LCBWYWxpZGF0b3JfaW50LkdldCggMCApICk7CisgICAgLy8gICAgICAgICAgICBtdF9hZGQuUHV0VmFsaWRhdG9yKCBtZl95LCBWYWxpZGF0b3JfaW50LkdldCggMCApICk7CisgICAgLy8gICAgICAgICAgICBtdF9hZGQuUHV0VmFsaWRhdG9yKCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworCisgICAgLy8gICAgICAgICAgICBtdF9hZGRfcmVzdWx0LlB1dFZhbGlkYXRvciggbWZfcmVzdWx0LCBWYWxpZGF0b3JfaW50LkdldCggMCApICk7CisgICAgLy8gICAgICAgICAgICBtdF9hZGRfcmVzdWx0LlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKyAgICAvLyAgICAgICAgICAgIG10X2FkZF9yZXN1bHQuUHV0VmFsaWRhdG9yKCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9faW5SZXBseVRvLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgcHVibGljIG92ZXJyaWRlIFhUeXBlIEdldFR5cGUoIGludD8gaWQgKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICByZXR1cm4gdHlwZXMuR2V0KCBpZCApOworICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgcHVibGljIG92ZXJyaWRlIFhUeXBlIEdldFR5cGUoIHN0cmluZyBuYW1lICkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIHR5cGVzLkdldCggbmFtZSApOworICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgcHVibGljIG92ZXJyaWRlIElDb2xsZWN0aW9uPFhUeXBlPiBHZXRUeXBlcygpCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiB0eXBlcy5WYWx1ZXMoKTsKKyAgICAvLyAgICAgICAgfQorCisgICAgLy8gICAgICAgIHB1YmxpYyBvdmVycmlkZSBGaWVsZCBHZXRGaWVsZCggaW50PyBpZCApCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiBmaWVsZHMuR2V0KCBpZCApOworICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgcHVibGljIG92ZXJyaWRlIEZpZWxkIEdldEZpZWxkKCBzdHJpbmcgbmFtZSApCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiBmaWVsZHMuR2V0KCBuYW1lICk7CisgICAgLy8gICAgICAgIH0KKworICAgIC8vICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUNvbGxlY3Rpb248RmllbGQ+IEdldEZpZWxkcygpCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiBmaWVsZHMuVmFsdWVzKCk7CisgICAgLy8gICAgICAgIH0KKworICAgIC8vICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RydWN0VmFsdWUgRXhwb3J0Q3VzdG9tVmFsdWUoIE9iamVjdCB2YWx1ZSApCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiBFeHBvcnRDdXN0b21WYWx1ZSggdGhpcywgY2xhc3MydHlwZSwgdmFsdWUgKTsKKyAgICAvLyAgICAgICAgfQorCisgICAgLy8gICAgICAgIHB1YmxpYyBvdmVycmlkZSBYVHlwZSBHZXRDdXN0b21TdHJ1Y3RUeXBlKCBUeXBlIGMgKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICByZXR1cm4gY2xhc3MydHlwZS5HZXQoIGMgKTsKKyAgICAvLyAgICAgICAgfQorICAgIC8vICAgIH0KKyAgICAvL30KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L1Rlc3RNZXNzYWdpemVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9UcmFuc3BvcnQvVGVzdE1lc3NhZ2l6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMzc0OQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L1Rlc3RNZXNzYWdpemVyLmNzCkBAIC0wLDAgKzEsNjczIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0TWVzc2FnaXplcgorICAgIHsKKworICAgICAgICBwcml2YXRlIGNvbnN0IHNieXRlIFZFUlNJT04gPSAzOyAvLyBCaW5hcnlUYWdnZWREYXRhLlZFUlNJT047CisJcHJpdmF0ZSBjb25zdCBzYnl0ZSBOT05FID0gLTEyNzsgLy8gVHlwZUNvZGUuTk9ORTsKKwlwcml2YXRlIGNvbnN0IHNieXRlIEJZVEUgPSAtMTI0OyAvLyBUeXBlQ29kZS5CWVRFOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBXaG8gd2hvID0gbmV3IE15V2hvKCk7CisKKyAgICAgICAgLy9zdGF0aWMgRXRjaC5TdXBwb3J0LkRlZmF1bHRWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRXRjaC5TdXBwb3J0LkRlZmF1bHRWYWx1ZUZhY3RvcnkoKTsKKyAgICAgICAgcHVibGljIERlZmF1bHRWYWx1ZUZhY3RvcnkgdmY7CisgICAgICAgIHB1YmxpYyBNeU1lc3NhZ2VIYW5kbGVyIG1oOworICAgICAgICBwdWJsaWMgTXlQYWNrZXRTb3VyY2UgcHM7CisgICAgICAgIE1lc3NhZ2l6ZXIgbTsKKworICAgICAgICBwdWJsaWMgVGVzdE1lc3NhZ2l6ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvL3BzID0gbmV3IE15UGFja2V0U291cmNlKCB0aGlzICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsIGJlZm9yZSB0aGUgdGVzdCBmaXh0dXJlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRVcEJlZm9yZUNsYXNzKCkgCisJICAgIHsKKyAgICAgICAgICAgIHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7CisgICAgICAgICAgICBwcyA9IG5ldyBNeVBhY2tldFNvdXJjZSgpOworICAgICAgICAgICAgbWggPSBuZXcgTXlNZXNzYWdlSGFuZGxlcigpOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IG5ldyBSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHJlcy5BZGQoVHJhbnNwb3J0Q29uc3RzLlZBTFVFX0ZBQ1RPUlksIHZmKTsKKyAgICAgICAgICAgIG0gPSBuZXcgTWVzc2FnaXplcihwcywiZm9vOj9NZXNzYWdpemVyLmZvcm1hdD1iaW5hcnkiLCByZXMpOworICAgICAgICAgICAgbS5TZXRTZXNzaW9uKG1oKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdE1lc3NhZ2l6ZXIiICk7CisJICAgIH0KKworICAgICAgLyogIHB1YmxpYyB2b2lkIFNldFVwQmVmb3JlRXZlcnlUZXN0KCkKKyAgICAgICAgeworCisgICAgICAgICAgICBwcyA9IG5ldyBNeVBhY2tldFNvdXJjZSgpOworICAgICAgICAgICAgbWggPSBuZXcgTXlNZXNzYWdlSGFuZGxlcigpOworCisgICAgICAgICAgICBtID0gbmV3IE1lc3NhZ2l6ZXIoIG1oLCB2ZiApOworICAgICAgICAgICAgbS5TZXRTb3VyY2UoIHBzICk7CisKKyAgICAgICAgfSAqLworCisgICAgICAgICNyZWdpb24gVGVzdCBQYWNrZXRIYW5kbGVyIG1ldGhvZHMgCisJICAgIAorICAgICAgICBwdWJsaWMgY2xhc3MgTXlXaG8gOiBXaG8KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIE15V2hvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL25vdGhpbmcKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIC8vcHVibGljIHZvaWQgVXAoKSAKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIFNldFVwQmVmb3JlRXZlcnlUZXN0KCk7CisKKyAgICAgICAgLy8gICAgUGFja2V0SGFuZGxlciBwaCA9IG07CisKKyAgICAgICAgLy8gICAgQXNzZXJ0LklzTnVsbChtaC53aGF0KTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LklzTnVsbCggbWguc3JjICk7CisKKyAgICAgICAgLy8gICAgcGguVXAoIHBzICk7CisKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKCBtaC5zcmMsIG0gKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKG1oLndoYXQsIFdoYXQuVEVTVE1FU1NBR0VIQU5ETEVSVVApOworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIHBzLCBtLkdldFBhY2tldFNvdXJjZSgpICk7CisgICAgICAgIC8vfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQYWNrZXQxKCkKKyAgICAgICAgeworICAgICAgICAgICAKKworICAgICAgICAvLyAgICBQYWNrZXRIYW5kbGVyIHBoID0gbTsKKyAgICAgICAgICAgIFNlc3Npb25QYWNrZXQgcGggPSBtOworCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgKGJ5dGUpVkVSU0lPTiwgCisgICAgICAgICAgICAgICAgdW5jaGVja2VkKChieXRlKUJZVEUpLCAxLCAwLCB1bmNoZWNrZWQoKGJ5dGUpTk9ORSkgfSApOworCisgICAgICAgICAgICBtaC5oYW5kbGVkID0gdHJ1ZTsKKworICAgICAgICAgLy8gICBwaC5QYWNrZXQoIHdobywgYnVmICk7CisgICAgICAgICAgICBwaC5TZXNzaW9uUGFja2V0KHdobyxidWYpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIFdoYXQuVEVTVE1FU1NBR0VIQU5ETEVSTUVTU0FHRSwgbWgud2hhdCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBwcywgbS5HZXRUcmFuc3BvcnQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB3aG8sIG1oLnhzZW5kZXIpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCggbWgueG1zZyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBNeVZhbHVlRmFjdG9yeS5tdF9hZGQsIG1oLnhtc2cuR2V0WFR5cGUgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMCwgbWgueG1zZy5Db3VudCApOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUGFja2V0MigpCisgICAgICAgIHsKKyAgICAgICAgICAgCisKKyAgICAgICAgICAgIFNlc3Npb25QYWNrZXQgcGggPSBtOworCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKG5ldyBieXRlW10geyAoYnl0ZSlWRVJTSU9OLCAKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQoKGJ5dGUpQllURSksIDEsIDAsIHVuY2hlY2tlZCgoYnl0ZSlOT05FKSB9KTsKKworICAgICAgICAgICAgbWguaGFuZGxlZCA9IGZhbHNlOworCisgICAgICAgICAgICBwaC5TZXNzaW9uUGFja2V0KCB3aG8sIGJ1ZiApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV2hhdC5PT0JfTk9USUZZX0hBTkRMRVIsIG1oLndoYXQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBwcywgbS5HZXRUcmFuc3BvcnQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB3aG8sIG1oLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoIG1oLnhtc2cgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggTXlWYWx1ZUZhY3RvcnkubXRfYWRkLCBtaC54bXNnLkdldFhUeXBlICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIG1oLnhtc2cuQ291bnQgKTsKKworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBhY2tldDMoKQorICAgICAgICB7CisgICAgICAgICAgCisKKyAgICAgICAgICAgIFNlc3Npb25QYWNrZXQgcGggPSBtOworCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKG5ldyBieXRlW10geyAoYnl0ZSlWRVJTSU9OLCAKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQoKGJ5dGUpQllURSksIDIsIDAsIHVuY2hlY2tlZCgoYnl0ZSlOT05FKSB9KTsKKyAgICAgICAgICAgIG1oLmhhbmRsZWQgPSB0cnVlOworCisgICAgICAgICAgICBwaC5TZXNzaW9uUGFja2V0KCB3aG8sIGJ1ZiApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIFdoYXQuVEVTVE1FU1NBR0VIQU5ETEVSTUVTU0FHRSwgbWgud2hhdCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBwcywgbS5HZXRUcmFuc3BvcnQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB3aG8sIG1oLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoIG1oLnhtc2cgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggTXlWYWx1ZUZhY3RvcnkubXRfYWRkX3Jlc3VsdCwgbWgueG1zZy5HZXRYVHlwZSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBtaC54bXNnLkNvdW50ICk7CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQYWNrZXQ0KCkKKyAgICAgICAgeworICAgICAgICAgICAKKworICAgICAgICAgICAgU2Vzc2lvblBhY2tldCBwaCA9IG07CisKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIobmV3IGJ5dGVbXSB7IChieXRlKVZFUlNJT04sIAorICAgICAgICAgICAgICAgIHVuY2hlY2tlZCgoYnl0ZSlCWVRFKSwgMiwgMCwgdW5jaGVja2VkKChieXRlKU5PTkUpIH0pOworCisgICAgICAgICAgICBtaC5oYW5kbGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHBoLlNlc3Npb25QYWNrZXQoIHdobywgYnVmICk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChXaGF0Lk9PQl9OT1RJRllfSEFORExFUiwgbWgud2hhdCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHBzLCBtLkdldFRyYW5zcG9ydCgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHdobywgbWgueHNlbmRlciApOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCggbWgueG1zZyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBNeVZhbHVlRmFjdG9yeS5tdF9hZGRfcmVzdWx0LCBtaC54bXNnLkdldFhUeXBlICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIG1oLnhtc2cuQ291bnQgKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy9bVGVzdF0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBEb3duKCkgCisgICAgICAgIC8veworICAgICAgICAvLyAgICBTZXRVcEJlZm9yZUV2ZXJ5VGVzdCgpOworICAgICAgICAvLyAgICBQYWNrZXRIYW5kbGVyIHBoID0gbTsKKworICAgICAgICAvLyAgICBBc3NlcnQuSXNOdWxsKCBtaC53aGF0ICk7CisgICAgICAgIC8vICAgIEFzc2VydC5Jc051bGwoIG1oLnNyYyApOworCisgICAgICAgIC8vICAgIHBoLkRvd24ocHMpOworCisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCggbWguc3JjLCBtICk7CisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCggbWgud2hhdCwgV2hhdC5URVNUTUVTU0FHRUhBTkRMRVJET1dOICk7CisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCggcHMsIG0uR2V0UGFja2V0U291cmNlKCkgKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgI2VuZHJlZ2lvbiBUZXN0IFBhY2tldEhhbmRsZXIgbWV0aG9kcworCisgICAgICAgICNyZWdpb24gTWVzc2FnaXplck1lc3NhZ2VTb3VyY2UgbWV0aG9kcworCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIC8vcHVibGljIHZvaWQgQ2xvc2UxKCkgCisgICAgICAgIC8veworICAgICAgICAvLyAgICBTZXRVcEJlZm9yZUV2ZXJ5VGVzdCgpOworCisgICAgICAgIC8vICAgIE1lc3NhZ2l6ZXJNZXNzYWdlU291cmNlIG1tcyA9IG07CisgICAgICAgIC8vICAgIEFzc2VydC5Jc051bGwoIHBzLndoYXQgKTsKKworICAgICAgICAvLyAgICBtbXMuQ2xvc2UoIHRydWUgKTsKKworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwocHMud2hhdCwgV2hhdC5QQUNLRVRTT1VSQ0VDTE9TRSk7CisgICAgICAgIC8vICAgIEFzc2VydC5Jc1RydWUoIHBzLnJlc2V0ICk7CisgICAgICAgIC8vfQorCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIC8vcHVibGljIHZvaWQgQ2xvc2UyKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIFNldFVwQmVmb3JlRXZlcnlUZXN0KCk7CisKKyAgICAgICAgLy8gICAgTWVzc2FnaXplck1lc3NhZ2VTb3VyY2UgbW1zID0gbTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LklzTnVsbCggcHMud2hhdCApOworCisgICAgICAgIC8vICAgIG1tcy5DbG9zZSggZmFsc2UgKTsKKworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIHBzLndoYXQsIFdoYXQuUEFDS0VUU09VUkNFQ0xPU0UgKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LklzRmFsc2UoIHBzLnJlc2V0ICk7CisgICAgICAgIC8vfQorCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIC8vcHVibGljIHZvaWQgTG9jYWxBZGRyZXNzKCkgCisgICAgICAgIC8veworICAgICAgICAvLyAgICBTZXRVcEJlZm9yZUV2ZXJ5VGVzdCgpOworCisgICAgICAgIC8vICAgIE1lc3NhZ2l6ZXJNZXNzYWdlU291cmNlIG1tcyA9IG07CisgICAgICAgIC8vICAgIEVuZFBvaW50IGlzYSA9IG5ldyBJUEVuZFBvaW50KCBJUEFkZHJlc3MuUGFyc2UoICIxMjcuMC4wLjEiICksIDIzICk7CisgICAgICAgIC8vICAgIHBzLmxvY2FsQWRkcmVzcyAgPSAgaXNhOworCisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCggaXNhLCBtbXMuTG9jYWxBZGRyZXNzKCkgKTsKKyAgICAgICAgLy99CisgICAgCQorICAgICAgICAvL1tUZXN0XQorICAgICAgICAvL3B1YmxpYyB2b2lkIFJlbW90ZUFkZHJlc3MoKSAKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIFNldFVwQmVmb3JlRXZlcnlUZXN0KCk7CisKKyAgICAgICAgLy8gICAgTWVzc2FnaXplck1lc3NhZ2VTb3VyY2UgbW1zID0gbTsKKyAgICAgICAgLy8gICAgRW5kUG9pbnQgaXNhID0gbmV3IElQRW5kUG9pbnQoIElQQWRkcmVzcy5QYXJzZSggIjEyNy4wLjAuMSIgKSwgMjMgKTsKKyAgICAgICAgLy8gICAgcHMucmVtb3RlQWRkcmVzcyA9IGlzYTsKKworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIGlzYSwgbW1zLlJlbW90ZUFkZHJlc3MoKSApOworICAgICAgICAvL30KKyAgICAJCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIC8vcHVibGljIHZvaWQgU2h1dGRvd25JbnB1dCgpIAorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgU2V0VXBCZWZvcmVFdmVyeVRlc3QoKTsKKworICAgICAgICAvLyAgICBNZXNzYWdpemVyTWVzc2FnZVNvdXJjZSBtbXMgPSBtOworICAgICAgICAvLyAgICBBc3NlcnQuSXNOdWxsKCBwcy53aGF0ICk7CisgICAgICAgIC8vICAgIG0uU2h1dGRvd25JbnB1dCgpOworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIHBzLndoYXQsIFdoYXQuUEFDS0VUU09VUkNFU0hVVERPV05JTlBVVCApOworICAgICAgICAvL30KKyAgICAJCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIC8vcHVibGljIHZvaWQgU2h1dGRvd25PdXRwdXQoKSAKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIFNldFVwQmVmb3JlRXZlcnlUZXN0KCk7CisKKyAgICAgICAgLy8gICAgTWVzc2FnaXplck1lc3NhZ2VTb3VyY2UgbW1zID0gbTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LklzTnVsbCggcHMud2hhdCApOworICAgICAgICAvLyAgICBtLlNodXRkb3duT3V0cHV0KCk7CisKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKCBwcy53aGF0LCBXaGF0LlBBQ0tFVFNPVVJDRVNIVVRET1dOT1VUUFVUICk7CisgICAgICAgIC8vfQorICAgIAkKKyAgICAgICAgLy9bVGVzdF0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBTdG9wKCkgCisgICAgICAgIC8veworICAgICAgICAvLyAgICBTZXRVcEJlZm9yZUV2ZXJ5VGVzdCgpOworCisgICAgICAgIC8vICAgIE1lc3NhZ2l6ZXJNZXNzYWdlU291cmNlIG1tcyA9IG07CisgICAgICAgIC8vICAgIEFzc2VydC5Jc051bGwoIHBzLndoYXQgKTsKKworICAgICAgICAvLyAgICBtbXMuU3RvcCgpOworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwocHMud2hhdCwgV2hhdC5QQUNLRVRTT1VSQ0VTVE9QKTsKKyAgICAgICAgLy99CisKKyAgIC8qICAgICBwdWJsaWMgdm9pZCBNZXNzYWdlMSgpCisgICAgICAgIHsKKyAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTWVzc2FnaXplck1lc3NhZ2VTb3VyY2UgbW1zID0gbTsKKworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkLCB2ZiApOworICAgICAgICAgICAgcHMuaGVhZGVyU2l6ZSA9IDA7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIHBzLndoYXQgKTsKKworICAgICAgICAgICAgbW1zLk1lc3NhZ2V4KCB3aG8sIG1zZyApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIFdoYXQuUEFDS0VUU09VUkNFUEFDS0VULCBwcy53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHdobywgcHMueHJlY2lwaWVudCApOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCggcHMueGJ1ZiApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA0LCBwcy54YnVmLkxlbmd0aCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBWRVJTSU9OLCBwcy54YnVmWyAwIF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoYnl0ZSkxLCBwcy54YnVmWzFdKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoYnl0ZSkwLCBwcy54YnVmWzJdKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggTk9ORSwgcHMueGJ1ZlsgMyBdICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBNZXNzYWdlMigpCisgICAgICAgIHsKKyAgICAgICAgICAKKyAgICAgICAgICAgIE1lc3NhZ2l6ZXJNZXNzYWdlU291cmNlIG1tcyA9IG07CisKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIE15VmFsdWVGYWN0b3J5Lm10X2FkZCwgdmYgKTsKKyAgICAgICAgICAgIHBzLmhlYWRlclNpemUgPSA4OworCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBwcy53aGF0ICk7CisKKyAgICAgICAgICAgIG1tcy5NZXNzYWdleCggd2hvLCBtc2cgKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBXaGF0LlBBQ0tFVFNPVVJDRVBBQ0tFVCwgcHMud2hhdCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB3aG8sIHBzLnhyZWNpcGllbnQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoIHBzLnhidWYgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMTIsIHBzLnhidWYuTGVuZ3RoICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDAsIHBzLnhidWZbIDAgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAoIGJ5dGUgKSAwLCBwcy54YnVmWyAxIF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgMCwgcHMueGJ1ZlsgMiBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDAsIHBzLnhidWZbIDMgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAoIGJ5dGUgKSAwLCBwcy54YnVmWyA0IF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgMCwgcHMueGJ1ZlsgNSBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDAsIHBzLnhidWZbIDYgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAoIGJ5dGUgKSAwLCBwcy54YnVmWyA3IF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggVkVSU0lPTiwgcHMueGJ1ZlsgOCBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDEsIHBzLnhidWZbIDkgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKChieXRlKTAsIHBzLnhidWZbOV0pOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBOT05FLCBwcy54YnVmWyAxMSBdICk7CisgICAgICAgIH0gKi8KKworCSAgICAKKyAgICAgICAgI2VuZHJlZ2lvbiBNZXNzYWdpemVyTWVzc2FnZVNvdXJjZSBtZXRob2RzCisKKyAgICAgICAgLy8gRG8gZm9sbG93aW5nIHRlc3QgaW4gc3RyZXNzIHRlc3RpbmcuCisJICAgIC8qCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBTZW5kcmVjZWl2ZU1lc3NhZ2VJdGVyYXRpdmUoKSAKKwkgICAgeworICAgICAgICAgICAgU2V0VXBCZWZvcmVFdmVyeVRlc3QoKTsKKwkJICAgIHJlcG9ydCA9IGZhbHNlOworCisgICAgICAgICAgICBpbnQgbiA9IDEwMDAwMDsKKyAgICAJCQorCQkgICAgLy9sb25nIHQwID0gVGltZXIuSW5pdCgpOworICAgICAgICAgICAgLy9UaW1lciB0MCA9IG5ldyBUaW1lcigpLkluaXQoKTsKKwkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkgICAgTXlNZXNzYWdlSGFuZGxlci5TZW5kKCBtLCBwcyApOworCQkJICAgIEFzc2VydC5Jc1RydWUocHMuY2hlY2tGbGFnKTsKKwkJICAgIH0KKwkJICAgIC8vbG9uZyB0MSA9IHQwLkVsYXBzZWROYW5vcygpOworCQkgICAgLy9kb3VibGUgdCA9ICh0MS10MCkgLyAxMDAwMDAwMDAwLjA7CisJCSAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCAidG9vayAiICsgdCArICIgdG8gc2VuZCAiICsgbiAgKyAiICggIiArIG4vdCArICIgKyBwZXIgc2VjKVxuIiApOworCSAgICB9CisgICAgICAgICovCisKKyAgICAgICAgcHVibGljIGVudW0gV2hhdAorICAgICAgICB7CisgICAgICAgICAgICBQQUNLRVRTT1VSQ0VQQUNLRVQsCisgICAgICAgICAgICBURVNUTUVTU0FHRUhBTkRMRVJNRVNTQUdFLAorICAgICAgICAgICAgT09CX1FVRVJZX1NPVVJDRSwKKwkJICAgIE9PQl9DT05UUk9MX1NPVVJDRSwKKwkJICAgIE9PQl9OT1RJRllfU09VUkNFLAorCQkgICAgT09CX1FVRVJZX0hBTkRMRVIsCisJCSAgICBPT0JfQ09OVFJPTF9IQU5ETEVSLAorCQkgICAgT09CX05PVElGWV9IQU5ETEVSCisgICAgICAgIH07CisKKyAgICAgICAgI3JlZ2lvbiBNeVBhY2tldFNvdXJjZQorICAgICAgICBwdWJsaWMgY2xhc3MgTXlQYWNrZXRTb3VyY2UgOiBUcmFuc3BvcnRQYWNrZXQKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdE1lc3NhZ2l6ZXIgX3RtOworCisgICAgICAgICAgICBwdWJsaWMgV2hhdCB3aGF0OworICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBjaGVja0ZsYWcgPSB0cnVlOworICAgICAgICAgICAgLy9wdWJsaWMgUGt0U3JjTWVzc2FnZUhhbmRsZXIgbWg7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBNZXNzYWdpemVyIG07CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXNzaW9uUGFja2V0IGhhbmRsZXI7CisgICAgICAgICAgICBwdWJsaWMgaW50IGhlYWRlclNpemUgPSAwOworICAgICAgICAgICAgcHVibGljIGJvb2wgcmVzZXQ7CisgICAgICAgICAgICBwdWJsaWMgV2hvIHhyZWNpcGllbnQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeHF1ZXJ5OworICAgICAgICAgICAgLyoqICovCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHhxdWVyeV9yZXN1bHQ7CisgICAgICAgICAgICAvKiogKi8KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeGNvbnRyb2w7CisgICAgICAgICAgICAvKiogKi8KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeHZhbHVlOworICAgICAgICAgICAgLyoqICovCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHhldmVudDsKKworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSB4YnVmOworCisgICAgICAgICAgICBwdWJsaWMgaW50IEhlYWRlclNpemUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXJTaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTXlQYWNrZXRTb3VyY2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBNeVBhY2tldFNvdXJjZSggVGVzdE1lc3NhZ2l6ZXIgdG0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90bSA9IHRtOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBQa3RTcmNNZXNzYWdlSGFuZGxlciA6IE1lc3NhZ2VIYW5kbGVyPE1lc3NhZ2l6ZXJNZXNzYWdlU291cmNlPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE15UGFja2V0U291cmNlIF9tcHM7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgUGt0U3JjTWVzc2FnZUhhbmRsZXIoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgUGt0U3JjTWVzc2FnZUhhbmRsZXIoIE15UGFja2V0U291cmNlIG1wcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbXBzID0gbXBzOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBVcCggTWVzc2FnaXplck1lc3NhZ2VTb3VyY2Ugc3JjICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggInVwIiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sIE1lc3NhZ2UoIE1lc3NhZ2l6ZXJNZXNzYWdlU291cmNlIHNyYywgV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKQorCQkJCXsKKwkJCQkgICAgaWYgKHJlcG9ydCkKKwkJCQkJICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiZ290IHJlcGx5ICIgKyBtc2cgKTsKKyAgICAJCQkJCisJCQkJICAgIAorCQkJCSAgICBpZiAoIChpbnQpKG1zZy5HZXQobWZfcmVzdWx0KSkgIT0gOSApIAorCQkJCQkgICAgX21wcy5jaGVja0ZsYWcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAJCQkJCisJCQkgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgRG93biggTWVzc2FnaXplck1lc3NhZ2VTb3VyY2Ugc3JjICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggImRvd24iICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIAkJKiovCisJCSAgICBwdWJsaWMgdm9pZCBQYWNrZXQoIFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmICkgCisJCSAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuUEFDS0VUU09VUkNFUEFDS0VUOworICAgICAgICAgICAgICAgIHRoaXMueHJlY2lwaWVudCA9IHJlY2lwaWVudDsKKyAgICAgICAgICAgICAgICB0aGlzLnhidWYgPSBidWYuR2V0QXZhaWxCeXRlcygpOworCQkgICAgfQorCQkgICAgCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0IE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBUcmFuc3BvcnRRdWVyeSggb2JqZWN0IHF1ZXJ5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGF0ID0gV2hhdC5PT0JfUVVFUllfU09VUkNFOworICAgICAgICAgICAgICAgIHhxdWVyeSA9IHF1ZXJ5OworICAgICAgICAgICAgICAgIHJldHVybiB4cXVlcnlfcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRDb250cm9sKCBvYmplY3QgY29udHJvbCwgb2JqZWN0IHZhbHVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGF0ID0gV2hhdC5PT0JfQ09OVFJPTF9TT1VSQ0U7CisgICAgICAgICAgICAgICAgeGNvbnRyb2wgPSBjb250cm9sOworICAgICAgICAgICAgICAgIHh2YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkoIG9iamVjdCBldmVudE9iaiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuT09CX05PVElGWV9TT1VSQ0U7CisgICAgICAgICAgICAgICAgeGV2ZW50ID0gZXZlbnRPYmo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0UGFja2V0IE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRQYWNrZXQoV2hvIHJlY2lwaWVudCwgRmxleEJ1ZmZlciBidWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuUEFDS0VUU09VUkNFUEFDS0VUOworICAgICAgICAgICAgICAgIHRoaXMueHJlY2lwaWVudCA9IHJlY2lwaWVudDsKKyAgICAgICAgICAgICAgICB0aGlzLnhidWYgPSBidWYuR2V0QXZhaWxCeXRlcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25QYWNrZXQ+IE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25QYWNrZXQgc2Vzc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBzZXNzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25QYWNrZXQ+IE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgU2Vzc2lvblBhY2tldCBHZXRTZXNzaW9uKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbiBNeVBhY2tldFNvdXJjZQorCisgICAgICAgICNyZWdpb24gTXlNZXNzYWdlSGFuZGxlcgorCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeU1lc3NhZ2VIYW5kbGVyIDogU2Vzc2lvbk1lc3NhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEVudW0gd2hhdDsKKyAgICAgICAgICAgIHB1YmxpYyBXaG8geHNlbmRlcjsKKyAgICAgICAgICAgIHB1YmxpYyBNZXNzYWdlIHhtc2c7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBoYW5kbGVkOworCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHhxdWVyeTsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeHF1ZXJ5X3Jlc3VsdDsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeGNvbnRyb2w7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHh2YWx1ZTsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeGV2ZW50OworCisgICAgICAgICAgICAKKworICAgICAgICAgICAgcHVibGljIGJvb2wgTWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSAKKwkJICAgIHsKKworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0LlRFU1RNRVNTQUdFSEFORExFUk1FU1NBR0U7CisgICAgICAgICAgICAgICAgdGhpcy54c2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgICAgIHRoaXMueG1zZyA9IG1zZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlZDsKKworICAgICAgICAgICAgICAgIC8qKgorCQkJICAgIGlmIChyZXBvcnQpCisJCSAgICAJICAgIENvbnNvbGUuV3JpdGVMaW5lKCAibWVzc2FnZTogIittc2cgKTsKKyAgICAJCSAgICAKKwkJICAgICAgICBpZiAobXNnLklzVHlwZSggbXRfYWRkICkpCisJCSAgICAgICAgeworCQkgICAgCSAgICBpbnQ/IHggPSAoaW50PykoIG1zZy5HZXQoIG1mX3ggKSApOworICAgICAgICAgICAgICAgICAgICBpbnQ/IHkgPSAoIGludD8gKSAoIG1zZy5HZXQoIG1mX3kgKSApOworCisgICAgICAgICAgICAgICAgICAgIEludDMyIHIgPSAoIGludCApICggeCArIHkgKTsKKyAgICAJCSAgICAJCisJCSAgICAJICAgIE1lc3NhZ2Ugcm1zZyA9IG1zZy5SZXBseSggbXRfYWRkX3Jlc3VsdCApOworCQkgICAgCSAgICBybXNnLkFkZCggbWZfcmVzdWx0LCByICk7CisgICAgCQkgICAgCQorCQkgICAgCSAgICBpZiAocmVwb3J0KQorCQkgICAgCQkgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJyZXBseWluZyB3aXRoICIrcm1zZyApOworICAgIAkJICAgIAkKKwkJICAgIAkgICAgc3JjLk1lc3NhZ2UoIHNlbmRlciwgcm1zZyApOworCQkgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAqICovCisJICAgICAgICB9CisKKyAgICAgICAgIAorCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb24gTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFNlc3Npb25RdWVyeSggb2JqZWN0IHF1ZXJ5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGF0ID0gV2hhdC5PT0JfUVVFUllfSEFORExFUjsKKyAgICAgICAgICAgICAgICB4cXVlcnkgPSBxdWVyeTsKKyAgICAgICAgICAgICAgICByZXR1cm4geHF1ZXJ5X3Jlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2woIG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0Lk9PQl9DT05UUk9MX0hBTkRMRVI7CisgICAgICAgICAgICAgICAgeGNvbnRyb2wgPSBjb250cm9sOworICAgICAgICAgICAgICAgIHh2YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uTm90aWZ5KCBvYmplY3QgZXZlbnRPYmogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0Lk9PQl9OT1RJRllfSEFORExFUjsKKyAgICAgICAgICAgICAgICB4ZXZlbnQgPSBldmVudE9iajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb25NZXNzYWdlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIGJvb2wgU2Vzc2lvbk1lc3NhZ2UoV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuVEVTVE1FU1NBR0VIQU5ETEVSTUVTU0FHRTsKKyAgICAgICAgICAgICAgICB0aGlzLnhzZW5kZXIgPSBzZW5kZXI7CisgICAgICAgICAgICAgICAgdGhpcy54bXNnID0gbXNnOworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBNeU1lc3NhZ2VIYW5kbGVyCisKKyAgICAgICAgcHVibGljIGNsYXNzIE15VmFsdWVGYWN0b3J5IDogRGVmYXVsdFZhbHVlRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBUeXBlTWFwIHR5cGVzID0gbmV3IFR5cGVNYXAoKTsKKworICAgICAgICAgICAKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSA9IAorICAgICAgICAgICAgICAgIG5ldyBDbGFzczJUeXBlTWFwKCk7CisKKyAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgWFR5cGUgbXRfYWRkID0gdHlwZXMuQWRkKCBuZXcgWFR5cGUoIDEsICJhZGQiICkgKTsKKworICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBYVHlwZSBtdF9hZGRfcmVzdWx0ID0gdHlwZXMuQWRkKCBuZXcgWFR5cGUoIDIsICJhZGRfcmVzdWx0IiApICk7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRmllbGQgbWZfeCA9IG5ldyBGaWVsZCgzLCAieCIpOworCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZpZWxkIG1mX3kgPSBuZXcgRmllbGQoNCwgInkiKTsgCisKKyAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0aWMgRmllbGQgbWZfcmVzdWx0ID0gIG5ldyBGaWVsZCggNSwgInhyZXN1bHQiKTsKKworICAgICAgICAgICAgc3RhdGljIE15VmFsdWVGYWN0b3J5KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWVGYWN0b3J5LkluaXQoIHR5cGVzLCAgY2xhc3MydHlwZSApOworCisgICAgICAgICAgICAgICAgbXRfYWRkLlB1dFZhbGlkYXRvciggbWZfeCwgVmFsaWRhdG9yX2ludC5HZXQoIDAgKSApOworICAgICAgICAgICAgICAgIG10X2FkZC5QdXRWYWxpZGF0b3IoIG1mX3ksIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkgKTsKKyAgICAgICAgICAgICAgICBtdF9hZGQuUHV0VmFsaWRhdG9yKCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG10X2FkZF9yZXN1bHQuUHV0VmFsaWRhdG9yKCBtZl9yZXN1bHQsIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkgKTsKKyAgICAgICAgICAgICAgICBtdF9hZGRfcmVzdWx0LlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKyAgICAgICAgICAgICAgICBtdF9hZGRfcmVzdWx0LlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX2luUmVwbHlUbywgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTXlWYWx1ZUZhY3RvcnkoKSA6IGJhc2UoIm5vbmU6IiwgdHlwZXMsIGNsYXNzMnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90aGluZy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L1Rlc3RQbGFpbk1haWxib3guY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1RyYW5zcG9ydC9UZXN0UGxhaW5NYWlsYm94LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjRmODEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1RyYW5zcG9ydC9UZXN0UGxhaW5NYWlsYm94LmNzCkBAIC0wLDAgKzEsODQ4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RQbGFpbk1haWxib3ggOiBNYWlsYm94TWFuYWdlcgorICAgIHsKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5yZWdpc3RlcmVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vICAgICBBbGFybU1hbmFnZXIuU2V0QWxhcm1NYW5hZ2VyKG51bGwpOworCisgICAgICAgICAgICByZWRlbGl2ZXJlZCA9IG5ldyBMaXN0PEVsZW1lbnQ+KCk7CisKKyAgICAgICAgICAgIHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIG10X2ZvbyA9IG5ldyBYVHlwZSgiZm9vIik7CisKKyAgICAgICAgICAgIGZvb19tc2cgPSBuZXcgTWVzc2FnZShtdF9mb28sIHZmKTsKKworICAgICAgICAgICAgZnJlZF93aG8gPSBuZXcgV2hvQW1JKCk7CisKKyAgICAgICAgICAgIG10X2JhciA9IG5ldyBYVHlwZSgiYmFyIik7CisKKyAgICAgICAgICAgIGJhcl9tc2cgPSBuZXcgTWVzc2FnZShtdF9iYXIsIHZmKTsKKworICAgICAgICAgICAgYWxpY2Vfd2hvID0gbmV3IFdob0FtSSgpOworCisgICAgICAgICAgICBub3RpZnkgPSBuZXcgTXlOb3RpZnkoKTsKKworICAgICAgICAgICAgbm90aWZ5MXggPSBuZXcgTXlOb3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdDEoKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0Q29uc3RydWN0KDFMKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3QyKCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IFBsYWluTWFpbGJveChudWxsLCAxTCk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZURlbGl2ZXJ5MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG9wZW4gbWFpbGJveCBhbmQgY2xvc2UgaXQgZm9yIGRlbGl2ZXJ5IHdoaWxlIGVtcHR5LgorCisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VEZWxpdmVyeShtYiwgdHJ1ZSk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlRGVsaXZlcnkyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gb3BlbiBtYWlsYm94IGFuZCBjbG9zZSBpdCBmb3IgZGVsaXZlcnkgd2hpbGUgbm90IGVtcHR5LgorCisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrRGVsaXZlcihtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBmb29fbXNnKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VEZWxpdmVyeShtYiwgdHJ1ZSk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlRGVsaXZlcnkzKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gb3BlbiBtYWlsYm94IGFuZCBjbG9zZSBpdCBmb3IgZGVsaXZlcnkgdHdpY2UuCisKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tDbG9zZURlbGl2ZXJ5KG1iLCB0cnVlKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDApOworCisgICAgICAgICAgICBjaGVja0Nsb3NlRGVsaXZlcnkobWIsIGZhbHNlKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDApOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG9wZW4gbWFpbGJveCBhbmQgY2xvc2UgaXQgZm9yIHJlYWRpbmcgd2hpbGUgZW1wdHkuCisKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tDbG9zZVJlYWQobWIsIHRydWUpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMCk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZVJlYWQyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gb3BlbiBtYWlsYm94IGFuZCBjbG9zZSBpdCBmb3IgcmVhZGluZyB3aGlsZSBub3QgZW1wdHkuCisKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tEZWxpdmVyKG1iLCB0cnVlLCBhbGljZV93aG8sIGZvb19tc2cpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tDbG9zZVJlYWQobWIsIHRydWUpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMSk7CisgICAgICAgICAgICBjaGVja1JlZGVsaXZlcmVkKDAsIGFsaWNlX3dobywgZm9vX21zZyk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZVJlYWQzKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gb3BlbiBtYWlsYm94IGFuZCBjbG9zZSBpdCBmb3IgcmVhZGluZyB0d2ljZSB3aGlsZSBlbXB0eS4KKworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBjaGVja0Nsb3NlUmVhZChtYiwgdHJ1ZSk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tDbG9zZVJlYWQobWIsIGZhbHNlKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDApOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG9wZW4gbWFpbGJveCBhbmQgY2xvc2UgaXQgZm9yIHJlYWRpbmcgdHdpY2Ugd2hpbGUgbm90IGVtcHR5LgorCisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrRGVsaXZlcihtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBmb29fbXNnKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VSZWFkKG1iLCB0cnVlKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDEpOworICAgICAgICAgICAgY2hlY2tSZWRlbGl2ZXJlZCgwLCBhbGljZV93aG8sIGZvb19tc2cpOworCisgICAgICAgICAgICBjaGVja0Nsb3NlUmVhZChtYiwgZmFsc2UpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMSk7CisgICAgICAgICAgICBjaGVja1JlZGVsaXZlcmVkKDAsIGFsaWNlX3dobywgZm9vX21zZyk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBmdWxsMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tEZWxpdmVyKG1iLCB0cnVlLCBmcmVkX3dobywgZm9vX21zZyk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBjaGVja0RlbGl2ZXIobWIsIGZhbHNlLCBhbGljZV93aG8sIGJhcl9tc2cpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGZ1bGwyKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBjaGVja0RlbGl2ZXIobWIsIHRydWUsIGZyZWRfd2hvLCBmb29fbXNnKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrRGVsaXZlcihtYiwgZmFsc2UsIGFsaWNlX3dobywgYmFyX21zZyk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBjaGVja0RlbGl2ZXIobWIsIGZhbHNlLCBmcmVkX3dobywgYmFyX21zZyk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDApOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcmVhZDEoKQorICAgICAgICB7CisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrRGVsaXZlcihtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBiYXJfbXNnKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrUmVhZChtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBiYXJfbXNnKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VEZWxpdmVyeShtYiwgdHJ1ZSk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWQyKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBjaGVja0RlbGl2ZXIobWIsIHRydWUsIGFsaWNlX3dobywgYmFyX21zZyk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBjaGVja0Nsb3NlRGVsaXZlcnkobWIsIHRydWUpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrUmVhZChtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBiYXJfbXNnKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDApOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcmVhZDMoKQorICAgICAgICB7CisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrRGVsaXZlcihtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBiYXJfbXNnKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VEZWxpdmVyeShtYiwgdHJ1ZSk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tSZWFkKG1iLCB0cnVlLCBhbGljZV93aG8sIGJhcl9tc2cpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMCk7CisgICAgICAgIH0gCisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcmVhZDQoKQorICAgICAgICB7CisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VEZWxpdmVyeShtYiwgdHJ1ZSk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tSZWFkKG1iLCBmYWxzZSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTsKKyAgICAgICAgfSAKKworICAgICAgICAKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWQ1KCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBUaHJlYWQuU2xlZXAoMTAwMCk7CisKKyAgICAgICAgICAgIGNoZWNrUmVhZChtYiwgZmFsc2UsIG51bGwsIG51bGwpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMCk7CisgICAgICAgIH0KKworCisgICAgICAgCisgICAgICAgIFtUZXN0XQorICAgICAgICBbSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCByZWFkNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tSZWFkKG1iLCBmYWxzZSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcmVhZDcoKQorICAgICAgICB7CisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisKKyAgICAgICAgICAgIGNoZWNrUmVhZChtYiwgLTEsIGZhbHNlLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWQ4KCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCisgICAgICAgICAgICBjaGVja1JlYWQobWIsIDEsIGZhbHNlLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBkZWxpdmVyMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgY2hlY2tNYWlsYm94KG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKworICAgICAgICAgICAgY2hlY2tDbG9zZURlbGl2ZXJ5KG1iLCB0cnVlKTsKKyAgICAgICAgICAgIGNoZWNrTWFpbGJveChtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDApOworCisgICAgICAgICAgICBjaGVja0RlbGl2ZXIobWIsIGZhbHNlLCBmcmVkX3dobywgYmFyX21zZyk7CisgICAgICAgICAgICBjaGVja01haWxib3gobWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeTEoKQorICAgICAgICB7CisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIG5vdGlmeS5jaGVja01haWxib3hTdGF0dXMoZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlKTsKKworICAgICAgICAgICAgT2JqZWN0IHN0YXRlID0gbmV3IE9iamVjdCgpOworCisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIHN0YXRlLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeS5jaGVja01haWxib3hTdGF0dXMoZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlKTsKKworICAgICAgICAgICAgY2hlY2tDbG9zZURlbGl2ZXJ5KG1iLCB0cnVlKTsKKyAgICAgICAgICAgIG5vdGlmeS5jaGVja01haWxib3hTdGF0dXModHJ1ZSwgbWIsIHN0YXRlLCB0cnVlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeTIoKQorICAgICAgICB7CisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIG5vdGlmeS5jaGVja01haWxib3hTdGF0dXMoZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlKTsKKworICAgICAgICAgICAgT2JqZWN0IHN0YXRlID0gbmV3IE9iamVjdCgpOworCisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIHN0YXRlLCAxMDAwKTsKKyAgICAgICAgICAgIG5vdGlmeS5jaGVja01haWxib3hTdGF0dXMoZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlKTsKKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKDIwMDApOworICAgICAgICAgICAgbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyh0cnVlLCBtYiwgc3RhdGUsIHRydWUpOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5MygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyhmYWxzZSwgbnVsbCwgbnVsbCwgZmFsc2UpOworCisgICAgICAgICAgICBPYmplY3Qgc3RhdGUgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgICAgIG1iLlJlZ2lzdGVyTm90aWZ5KG5vdGlmeSwgc3RhdGUsIDApOworICAgICAgICAgICAgbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyhmYWxzZSwgbnVsbCwgbnVsbCwgZmFsc2UpOworCisgICAgICAgICAgICBUaHJlYWQuU2xlZXAoMjAwMCk7CisgICAgICAgICAgICBub3RpZnkuY2hlY2tNYWlsYm94U3RhdHVzKGZhbHNlLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnk0KCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBub3RpZnkuY2hlY2tNYWlsYm94U3RhdHVzKGZhbHNlLCBudWxsLCBudWxsLCBmYWxzZSk7CisKKyAgICAgICAgICAgIE9iamVjdCBzdGF0ZSA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICAgICAgbWIuUmVnaXN0ZXJOb3RpZnkobm90aWZ5LCBzdGF0ZSwgMCk7CisgICAgICAgICAgICBub3RpZnkuY2hlY2tNYWlsYm94U3RhdHVzKGZhbHNlLCBudWxsLCBudWxsLCBmYWxzZSk7CisKKyAgICAgICAgICAgIG1iLk1lc3NhZ2UoYWxpY2Vfd2hvLCBmb29fbXNnKTsKKyAgICAgICAgICAgIG5vdGlmeS5jaGVja01haWxib3hTdGF0dXModHJ1ZSwgbWIsIHN0YXRlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgcmVnMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGlmeSA9PSBudWxsCisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIG1iLlJlZ2lzdGVyTm90aWZ5KG51bGwsIG51bGwsIDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgcmVnMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG1heERlbGF5IDwgMAorICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIG51bGwsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCByZWczKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIG51bGwsIDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZzQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzLm5vdGlmeSAhPSBudWxsCisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIG1iLlJlZ2lzdGVyTm90aWZ5KG5vdGlmeSwgbnVsbCwgMCk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIG51bGwsIDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZzUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzLm5vdGlmeSAhPSBudWxsCisgICAgICAgICAgICBQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KHRoaXMsIDFMKTsKKyAgICAgICAgICAgIG1iLlJlZ2lzdGVyTm90aWZ5KG5vdGlmeSwgbnVsbCwgMCk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnkxeCwgbnVsbCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgdW5yZWcxKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBtYi5VbnJlZ2lzdGVyTm90aWZ5KG5vdGlmeSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgdW5yZWcyKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIG51bGwsIDApOworICAgICAgICAgICAgbWIuVW5yZWdpc3Rlck5vdGlmeShub3RpZnkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIHVucmVnMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgbWIuUmVnaXN0ZXJOb3RpZnkobm90aWZ5LCBudWxsLCAwKTsKKyAgICAgICAgICAgIG1iLlVucmVnaXN0ZXJOb3RpZnkobm90aWZ5KTsKKyAgICAgICAgICAgIG1iLlVucmVnaXN0ZXJOb3RpZnkobm90aWZ5KTsKKyAgICAgICAgICAgIG1iLlVucmVnaXN0ZXJOb3RpZnkobm90aWZ5MXgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIHVucmVnNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgMUwpOworICAgICAgICAgICAgbWIuUmVnaXN0ZXJOb3RpZnkobm90aWZ5LCBudWxsLCAwKTsKKyAgICAgICAgICAgIG1iLlVucmVnaXN0ZXJOb3RpZnkobm90aWZ5KTsKKyAgICAgICAgICAgIG1iLlJlZ2lzdGVyTm90aWZ5KG5vdGlmeSwgbnVsbCwgMCk7CisgICAgICAgICAgICBtYi5VbnJlZ2lzdGVyTm90aWZ5KG5vdGlmeSk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnkxeCwgbnVsbCwgMCk7CisgICAgICAgICAgICBtYi5VbnJlZ2lzdGVyTm90aWZ5KG5vdGlmeTF4KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIHVucmVnNSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGlmeSAhPSB0aGlzLm5vdGlmeQorICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIG51bGwsIDApOworICAgICAgICAgICAgbWIuVW5yZWdpc3Rlck5vdGlmeShub3RpZnkxeCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgdW5yZWc2KCkKKyAgICAgICAgeworICAgICAgICAgICAgUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCh0aGlzLCAxTCk7CisgICAgICAgICAgICBtYi5SZWdpc3Rlck5vdGlmeShub3RpZnksIG51bGwsIDMwKTsKKyAgICAgICAgICAgIG1iLlVucmVnaXN0ZXJOb3RpZnkobm90aWZ5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gSEVMUEZVTCBTVFVGRiAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVGYWN0b3J5IHZmOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhUeXBlIG10X2ZvbzsKKworICAgICAgICBwcml2YXRlIE1lc3NhZ2UgZm9vX21zZzsKKworICAgICAgICBwcml2YXRlIFdobyBmcmVkX3dobzsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYVHlwZSBtdF9iYXI7CisKKyAgICAgICAgcHJpdmF0ZSBNZXNzYWdlIGJhcl9tc2c7CisKKyAgICAgICAgcHJpdmF0ZSBXaG8gYWxpY2Vfd2hvOworCisgICAgICAgIHByaXZhdGUgTXlOb3RpZnkgbm90aWZ5OworCisgICAgICAgIHByaXZhdGUgTXlOb3RpZnkgbm90aWZ5MXg7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRlc3RDb25zdHJ1Y3QobG9uZyBtZXNzYWdlSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3godGhpcywgbWVzc2FnZUlkKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0aGlzLCBtYi5HZXRNYWlsYm94TWFuYWdlcigpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlSWQsIG1iLkdldE1lc3NhZ2VJZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0RlbGl2ZXIoUGxhaW5NYWlsYm94IG1iLCBib29sIGhhbmRsZWQsIFdobyB3aG8sCisgICAgICAgICAgICBNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGhhbmRsZWQsIG1iLk1lc3NhZ2Uod2hvLCBtc2cpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1JlYWQoUGxhaW5NYWlsYm94IG1iLCBib29sIHByZXNlbnQsIFdobyB3aG8sIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50IGUgPSBtYi5SZWFkKCk7CisgICAgICAgICAgICBpZiAocHJlc2VudCkKKyAgICAgICAgICAgICAgICBjaGVja0VsZW1lbnQoZSwgd2hvLCBtc2cpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc051bGwoZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tSZWFkKFBsYWluTWFpbGJveCBtYiwgaW50IG1heERlbGF5LCBib29sIHByZXNlbnQsCisgICAgICAgICAgICBXaG8gd2hvLCBNZXNzYWdlIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudCBlID0gbWIuUmVhZChtYXhEZWxheSk7CisgICAgICAgICAgICBpZiAocHJlc2VudCkKKyAgICAgICAgICAgICAgICBjaGVja0VsZW1lbnQoZSwgd2hvLCBtc2cpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFzc2VydC5Jc051bGwoZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tSZWRlbGl2ZXJlZChpbnQgaW5kZXgsIFdobyB3aG8sIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50IGUgPSByZWRlbGl2ZXJlZFtpbmRleF07CisgICAgICAgICAgICBjaGVja0VsZW1lbnQoZSwgd2hvLCBtc2cpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRWxlbWVudChFbGVtZW50IGUsIFdobyB3aG8sIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUod2hvLCBlLnNlbmRlcik7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShtc2csIGUubXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja01haWxib3goUGxhaW5NYWlsYm94IG1iLCBib29sIGVtcHR5LCBib29sIGZ1bGwsCisgICAgICAgICAgICBib29sIGNsb3NlZCwgYm9vbCB1bnJlZywgaW50IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChlbXB0eSwgbWIuSXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmdWxsLCBtYi5Jc0Z1bGwoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY2xvc2VkLCBtYi5Jc0Nsb3NlZCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh1bnJlZywgdW5yZWdpc3RlcmVkKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChzaXplLCByZWRlbGl2ZXJlZC5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tDbG9zZVJlYWQoUGxhaW5NYWlsYm94IG1iLCBib29sIGNsb3NlZCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNsb3NlZCwgbWIuQ2xvc2VSZWFkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VEZWxpdmVyeShQbGFpbk1haWxib3ggbWIsIGJvb2wgY2xvc2VkKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY2xvc2VkLCBtYi5DbG9zZURlbGl2ZXJ5KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gTWFpbGJveE1hbmFnZXJJbnRmIG1ldGhvZHMgLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBwdWJsaWMgdm9pZCBSZWRlbGl2ZXIoV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGVsaXZlcmVkLkFkZChuZXcgRWxlbWVudChzZW5kZXIsIG1zZykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSAgTGlzdDxFbGVtZW50PiByZWRlbGl2ZXJlZDsKKworICAgICAgICBwdWJsaWMgdm9pZCBVbnJlZ2lzdGVyKE1haWxib3ggbWIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgdW5yZWdpc3RlcmVkOworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIE15VmFsdWVGYWN0b3J5IC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgcHVibGljIGNsYXNzIE15VmFsdWVGYWN0b3J5IDogVmFsdWVGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJ1Y3RWYWx1ZSBFeHBvcnRDdXN0b21WYWx1ZShPYmplY3QgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWFR5cGUgR2V0Q3VzdG9tU3RydWN0VHlwZShUeXBlIGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nPyBHZXRJblJlcGx5VG8oTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nPyBHZXRNZXNzYWdlSWQoTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBFbmNvZGluZyBHZXRTdHJpbmdFbmNvZGluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYVHlwZSBHZXRUeXBlKGludCBpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFhUeXBlIEdldFR5cGUoU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJQ29sbGVjdGlvbjxYVHlwZT4gR2V0VHlwZXMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWFR5cGUgR2V0X210X19FdGNoX0F1dGhFeGNlcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWFR5cGUgR2V0X210X19FdGNoX1J1bnRpbWVFeGNlcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWFR5cGUgZ2V0X210X19leGNlcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBJbXBvcnRDdXN0b21WYWx1ZShTdHJ1Y3RWYWx1ZSBzdikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNldEluUmVwbHlUbyhNZXNzYWdlIG1zZywgbG9uZz8gbXNnaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOyA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNldE1lc3NhZ2VJZChNZXNzYWdlIG1zZywgbG9uZz8gbXNnaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOyA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgcHVibGljIHZvaWQgQWRkVHlwZShYVHlwZSB0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgTG9ja0R5bmFtaWNUeXBlcygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBVbmxvY2tEeW5hbWljVHlwZXMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZpZWxkIEdldF9tZl9fbWVzc2FnZUlkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBGaWVsZCBHZXRfbWZfX2luUmVwbHlUbygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVmFsaWRhdG9yLkxldmVsIEdldExldmVsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9yLkxldmVsLkZVTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBWYWxpZGF0b3IuTGV2ZWwgU2V0TGV2ZWwoVmFsaWRhdG9yLkxldmVsIGxldmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBXaG9BbUkgOiBXaG8KKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlOb3RpZnkgOiBOb3RpZnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgbWFpbGJveFN0YXR1cyhNYWlsYm94IG1iLCBPYmplY3Qgc3RhdGUsIGJvb2wgY2xvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1haWxib3hTdGF0dXMxID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLm1haWxib3ggPSBtYjsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSBjbG9zZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBtYWlsYm94U3RhdHVzMTsKKworICAgICAgICAgICAgcHJpdmF0ZSBNYWlsYm94IG1haWxib3g7CisKKyAgICAgICAgICAgIHByaXZhdGUgT2JqZWN0IHN0YXRlOworCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgY2xvc2VkOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja01haWxib3hTdGF0dXMoYm9vbCBtYWlsYm94U3RhdHVzLCBNYWlsYm94IG1haWxib3gsCisgICAgICAgICAgICAgICAgT2JqZWN0IHN0YXRlLCBib29sIGNsb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWFpbGJveFN0YXR1cywgdGhpcy5tYWlsYm94U3RhdHVzMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUobWFpbGJveCwgdGhpcy5tYWlsYm94KTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShzdGF0ZSwgdGhpcy5zdGF0ZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNsb3NlZCwgdGhpcy5jbG9zZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBNYWlsYm94TWFuYWdlciBNZW1iZXJzCisKKworICAgICAgICBwdWJsaWMgTWFpbGJveCBUcmFuc3BvcnRDYWxsKFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnRNZXNzYWdlIE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRNZXNzYWdlKFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnQ8U2Vzc2lvbk1lc3NhZ2U+IE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgb2JqZWN0IFRyYW5zcG9ydFF1ZXJ5KG9iamVjdCBxdWVyeSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Q29udHJvbChvYmplY3QgY29udHJvbCwgb2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25NZXNzYWdlIHNlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZSBHZXRTZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gU2Vzc2lvbk1lc3NhZ2UgTWVtYmVycworCisgICAgICAgIHB1YmxpYyBib29sIFNlc3Npb25NZXNzYWdlKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgb2JqZWN0IFNlc3Npb25RdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Db250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Ob3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQorCisKKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L1Rlc3RQbGFpbk1haWxib3hNYW5hZ2VyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9UcmFuc3BvcnQvVGVzdFBsYWluTWFpbGJveE1hbmFnZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1ZWY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVHJhbnNwb3J0L1Rlc3RQbGFpbk1haWxib3hNYW5hZ2VyLmNzCkBAIC0wLDAgKzEsNDA1IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVHJhbnNwb3J0Cit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0UGxhaW5NYWlsYm94TWFuYWdlcgorICAgIHsKKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RNYWlsYm94TWFuYWdlciIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUGxhaW5NYWlsYm94TWFuYWdlciBtbWdyOworICAgICAgICBwcml2YXRlIE1lc3NhZ2UgbXNnOworICAgICAgICBwcml2YXRlIE15TWVzc2FnZUhhbmRsZXIgbWg7CisgICAgICAgIHByaXZhdGUgTXlNZXNzYWdpemVyIG07CisKKyAgICAgICAgcHJpdmF0ZSBib29sIGR1cGxleEZsYWcgPSB0cnVlOworICAgICAgICBwcml2YXRlIGJvb2wgcmVnaXN0ZXJGbGFnID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgTXlWYWx1ZUZhY3RvcnkoKTsKKworICAgICAgICBwdWJsaWMgTWVzc2FnZSBDb25zdHJ1Y3RTaW1wbGVNZXNzYWdlKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnkubXRfZnVuY3Rpb24sIHZmICk7CisgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc3NhZ2UgQ29uc3RydWN0QWRkTWVzc2FnZSgpIAorCSAgICB7CisJCSAgICBtc2cgPSBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkLCB2ZiApOworCQkgICAgbXNnLkFkZCggTXlWYWx1ZUZhY3RvcnkubWZfeCwgNCApOworCQkgICAgbXNnLkFkZCggTXlWYWx1ZUZhY3RvcnkubWZfeSwgNSApOworICAgIAkJCisJCSAgICByZXR1cm4gbXNnOworCSAgICB9CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRVcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGR1cGxleEZsYWcgPSB0cnVlOworICAgICAgICAgIAorICAgICAgICAgICAgbSA9IG5ldyBNeU1lc3NhZ2l6ZXIodGhpcyk7CisgICAgICAgICAgICBtbWdyID0gbmV3IFBsYWluTWFpbGJveE1hbmFnZXIobSwgIm5vbmU6IiwgbnVsbCk7CisgICAgICAgICAgICBtaCA9IG5ldyBNeU1lc3NhZ2VIYW5kbGVyKG1tZ3IpOworICAgICAgIAorICAgICAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgU2ltcGxleE1lc3NhZ2UoKSAKKwkgICAgeworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtLndoYXQpOworICAgIAkJCisJCSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBDb25zdHJ1Y3RTaW1wbGVNZXNzYWdlKCk7CisJCSAgICBtbWdyLlRyYW5zcG9ydE1lc3NhZ2UoIG51bGwsIG1lc3NhZ2UgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKG0ud2hhdCwgV2hhdC5NWU1FU1NBR0laRVJNRVNTQUdFKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIER1cGxleE1lc3NhZ2UoKSAKKwkgICAgeworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtLndoYXQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtaC53aGF0KTsKKworICAgICAgICAgICAgbW1nci5TZXNzaW9uTm90aWZ5KFNlc3Npb25Db25zdHMuVVApOworICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gQ29uc3RydWN0QWRkTWVzc2FnZSgpOworICAgICAgICAgICAgbW1nci5UcmFuc3BvcnRDYWxsKCBudWxsLCBtZXNzYWdlKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKG0ud2hhdCwgV2hhdC5NWU1FU1NBR0laRVJNRVNTQUdFKTsKKyAgICAJCQorCQkgICAgLyogCisJCSAgICAgKiBCZWNhdXNlIFBsYWluTWFpbGJveCB3aWxsIGludGVyY2VwdCBtZXNzYWdlcyAuLi4KKwkJICAgICAqIFRoZSBEZWZhdWx0IG1lc3NhZ2VoYW5kbGVyIHdvbid0IGJlIGNhbGxlZC4KKwkJICAgICAqLworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFdoYXQuT09CX05PVElGWV9IQU5ETEVSLCBtaC53aGF0KTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIER1cGxpY2F0ZVJlZ2lzdHJhdGlvbigpIAorCSAgICB7CisgICAgICAgICAgICBtbWdyLlNlc3Npb25Ob3RpZnkoU2Vzc2lvbkNvbnN0cy5VUCk7CisKKyAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IENvbnN0cnVjdEFkZE1lc3NhZ2UoKTsKKwkJICAgIE1haWxib3ggbWIgPSAKKyAgICAgICAgICAgICAgICAoIE1haWxib3ggKSBtbWdyLlRyYW5zcG9ydENhbGwoIG51bGwsIG1lc3NhZ2UpOworCisJCSAgICAvKgorCQkgICAgICogQ2hlY2sgZm9yIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24KKwkJICAgICAqLworCQkgICAgdHJ5IAorCQkgICAgeworCQkJICAgIG1tZ3IuUmVnaXN0ZXIobWIpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICByZWdpc3RlckZsYWcgPSB0cnVlOworCQkgICAgfQorCQkgICAgQXNzZXJ0LklzVHJ1ZShyZWdpc3RlckZsYWcpOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgVGVzdFVucmVnaXN0cmF0aW9uKCkgCisJICAgIHsKKyAgICAgICAgICAgIG1tZ3IuU2Vzc2lvbk5vdGlmeShTZXNzaW9uQ29uc3RzLlVQKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IENvbnN0cnVjdEFkZE1lc3NhZ2UoKTsKKwkJICAgIE1haWxib3ggbWIgPSAgbW1nci5UcmFuc3BvcnRDYWxsKCBudWxsLCBtZXNzYWdlICk7CisKKwkJICAgIC8qCisJCSAgICAgKiBVbnJlZ2lzdGVyIGFuZCB0aGVuIHJlZ2lzdGVyIGFnYWluIC4uLiAKKwkJICAgICAqLworCQkgICAgbW1nci5VbnJlZ2lzdGVyKG1iKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyRmxhZyA9IGZhbHNlOworCQkgICAgdHJ5IAorCQkgICAgeworICAgICAgICAgICAgICAgIG1tZ3IuUmVnaXN0ZXIoICggTWFpbGJveCApIG1iICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoRXhjZXB0aW9uKQorCQkgICAgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRmxhZyA9IHRydWU7CisJCSAgICB9CisJCSAgICBBc3NlcnQuSXNGYWxzZShyZWdpc3RlckZsYWcpOworCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBOb01haWxib3hPclJlcGx5VG9JZCgpIAorCSAgICB7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG1oLndoYXQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtLndoYXQpOworICAgIAkJCisJCSAgICBkdXBsZXhGbGFnID0gZmFsc2U7CisJCSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBDb25zdHJ1Y3RBZGRNZXNzYWdlKCk7CisgICAgCQkKKwkJICAgIG0uVHJhbnNwb3J0TWVzc2FnZShudWxsLCBtZXNzYWdlKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKG0ud2hhdCwgV2hhdC5NWU1FU1NBR0laRVJNRVNTQUdFKTsKKwkJICAgIC8qCisJCSAgICAgKiBTaW5jZSBubyBtYWlsYm94LCBkZWZhdWx0IG1lc3NhZ2UgaGFuZGxlciByZWNlaXZlcworCQkgICAgICogbWVzc2FnZXMuCisJCSAgICAgKi8KKwkJICAgIEFzc2VydC5BcmVFcXVhbChtaC53aGF0LCBXaGF0Lk1NR1JNRVNTQUdFSEFORExFUk1FU1NBR0UpOworCSAgICB9CisKKyAgICAgICAgcHVibGljIGVudW0gV2hhdAorICAgICAgICB7CisgICAgICAgICAgICBNTUdSTUVTU0FHRUhBTkRMRVJTVEFSVEVELAorICAgICAgICAgICAgTU1HUk1FU1NBR0VIQU5ETEVSVVAsCisgICAgICAgICAgICBNTUdSTUVTU0FHRUhBTkRMRVJEb3duLAorICAgICAgICAgICAgTU1HUk1FU1NBR0VIQU5ETEVSU1RPUFBFRCwKKyAgICAgICAgICAgIE1ZTUVTU0FHSVpFUkNsb3NlLAorICAgICAgICAgICAgTVlNRVNTQUdJWkVSTG9jYWxBZGRyZXNzLAorICAgICAgICAgICAgTVlNRVNTQUdJWkVSUmVtb3RlQWRkcmVzcywKKyAgICAgICAgICAgIE1ZTUVTU0FHSVpFUlNodXRkb3duSW5wdXQsCisgICAgICAgICAgICBNWU1FU1NBR0laRVJTaHV0ZG93bk91dHB1dCwKKyAgICAgICAgICAgIE1ZTUVTU0FHSVpFUlNUT1AsCisgICAgICAgICAgICBNWU1FU1NBR0laRVJNRVNTQUdFLAorICAgICAgICAgICAgTU1HUk1FU1NBR0VIQU5ETEVSTUVTU0FHRSwgCisgICAgICAgICAgICBPT0JfQ09OVFJPTF9IQU5ETEVSLCAKKyAgICAgICAgICAgIE9PQl9OT1RJRllfSEFORExFUiwgCisgICAgICAgICAgICBPT0JfUVVFUllfSEFORExFUgorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeU1lc3NhZ2VIYW5kbGVyIDogU2Vzc2lvbk1lc3NhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEVudW0gd2hhdDsKKworICAgICAgICAgICAgcHVibGljIFdobyB4c2VuZGVyOworCisgICAgICAgICAgICBwdWJsaWMgTWVzc2FnZSB4bXNnOworCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHhjb250cm9sOworCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHh2YWx1ZTsKKworICAgICAgICAgICAgcHVibGljIE9iamVjdCB4cXVlcnk7CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeGV2ZW50OworCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHhxdWVyeV9yZXN1bHQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBUcmFuc3BvcnRNZXNzYWdlIF90bW07CisKKyAgICAgICAgICAgIHB1YmxpYyBNeU1lc3NhZ2VIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTXlNZXNzYWdlSGFuZGxlciggVHJhbnNwb3J0TWVzc2FnZSB0bW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90bW0gPSB0bW07CisgICAgICAgICAgICAgICAgX3RtbS5TZXRTZXNzaW9uKHRoaXMpOworICAgICAgICAgICAgfQorICAgIAkJCisgICAgICAgICAgICAvL3B1YmxpYyBib29sIE1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHdoYXQgPSBXaGF0Lk1NR1JNRVNTQUdFSEFORExFUk1FU1NBR0U7CisgICAgICAgICAgICAvLyAgICB4c2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgLy8gICAgeG1zZyA9IG1zZzsKKyAgICAgICAgICAgIC8vICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgLy99CisKKyAgICAgICAgICAgCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgU2Vzc2lvblF1ZXJ5KCBvYmplY3QgcXVlcnkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0Lk9PQl9RVUVSWV9IQU5ETEVSOworICAgICAgICAgICAgICAgIHhxdWVyeSA9IHF1ZXJ5OworICAgICAgICAgICAgICAgIHJldHVybiB4cXVlcnlfcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uQ29udHJvbCggb2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuT09CX0NPTlRST0xfSEFORExFUjsKKyAgICAgICAgICAgICAgICB4Y29udHJvbCA9IGNvbnRyb2w7CisgICAgICAgICAgICAgICAgeHZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Ob3RpZnkoIG9iamVjdCBldmVudE9iaiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuT09CX05PVElGWV9IQU5ETEVSOworICAgICAgICAgICAgICAgIHhldmVudCA9IGV2ZW50T2JqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbk1lc3NhZ2UgTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBTZXNzaW9uTWVzc2FnZShXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGF0ID0gV2hhdC5NTUdSTUVTU0FHRUhBTkRMRVJNRVNTQUdFOworICAgICAgICAgICAgICAgIHhzZW5kZXIgPSBzZW5kZXI7CisgICAgICAgICAgICAgICAgeG1zZyA9IG1zZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15TWVzc2FnaXplciA6IFRyYW5zcG9ydE1lc3NhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uTWVzc2FnZSBoYW5kbGVyOworCisgICAgICAgICAgICBwdWJsaWMgRW51bSB3aGF0OworCisgICAgICAgICAgICBwdWJsaWMgVGVzdFBsYWluTWFpbGJveE1hbmFnZXIgX3RtbTsKKworICAgICAgICAgICAgcHVibGljIE15TWVzc2FnaXplciggVGVzdFBsYWluTWFpbGJveE1hbmFnZXIgdG1tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdG1tID0gdG1tOworICAgICAgICAgICAgfQorCisgICAgICAKKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJNeSBNZXNzYWdpemVyIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIAorICAgICAgICAgICAgLy9wdWJsaWMgdm9pZCBNZXNzYWdleCggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cgKSAKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgLy8gbWVzc2FnZSBmcm9tIG1haWxib3ggbWFuYWdlcgorICAgICAgICAgICAgLy8gICAgd2hhdCA9IFdoYXQuTVlNRVNTQUdJWkVSTUVTU0FHRTsKKyAgICAJCQkKKyAgICAgICAgICAgIC8vICAgIC8vIHNlbmQgbWVzc2FnZSBiYWNrIC4uLiAKKyAgICAgICAgICAgIC8vICAgIGlmICggX3RtbS5kdXBsZXhGbGFnID09IHRydWUgKQorICAgICAgICAgICAgLy8gICAgICAgIG1zZy5JblJlcGx5VG8gPSBtc2cuTWVzc2FnZUlkOworCQkJCSAgICAKKyAgICAgICAgICAgIC8vICAgIGhhbmRsZXIuTWVzc2FnZShudWxsLCBtc2cpOworICAgICAgICAgICAgLy99CisKKyAgICAgICAgICAgCisgICAgICAgICAgIAorCisgICAgICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydCBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgVHJhbnNwb3J0UXVlcnkoIG9iamVjdCBxdWVyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydENvbnRyb2woIG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkoIG9iamVjdCBldmVudE9iaiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnRNZXNzYWdlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0TWVzc2FnZShXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGZyb20gbWFpbGJveCBtYW5hZ2VyCisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuTVlNRVNTQUdJWkVSTUVTU0FHRTsKKworICAgICAgICAgICAgICAgIC8vIHNlbmQgbWVzc2FnZSBiYWNrIC4uLiAKKyAgICAgICAgICAgICAgICBpZiAoX3RtbS5kdXBsZXhGbGFnID09IHRydWUpCisgICAgICAgICAgICAgICAgICAgIG1zZy5JblJlcGx5VG8gPSBtc2cuTWVzc2FnZUlkOworCisgICAgICAgICAgICAgICAgaGFuZGxlci5TZXNzaW9uTWVzc2FnZShudWxsLCBtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25NZXNzYWdlPiBNZW1iZXJzCisKKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2V0U2Vzc2lvbihTZXNzaW9uTWVzc2FnZSBzZXNzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IHNlc3Npb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnQ8U2Vzc2lvbk1lc3NhZ2U+IE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgR2V0U2Vzc2lvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlWYWx1ZUZhY3RvcnkgOiBEZWZhdWx0VmFsdWVGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCisgICAgICAgICAgICAKKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdGF0aWMgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlID0gCisgICAgICAgICAgICAgICAgbmV3IENsYXNzMlR5cGVNYXAoKTsKKworICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBYVHlwZSBtdF9mdW5jdGlvbiA9IHR5cGVzLkdldCggImZ1bmN0aW9uIiApOworCisgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGljIFhUeXBlIG10X2FkZCA9IHR5cGVzLkdldCggImFkZCIgKTsKKworICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBYVHlwZSBtdF9hZGRfcmVzdWx0ID0gdHlwZXMuR2V0KCAiYWRkX3Jlc3VsdCIgKTsKKworICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBtZl94ID0gbmV3IEZpZWxkKCAieCIgKTsKKworICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBtZl95ID0gbmV3IEZpZWxkKCAieSIgKTsKKworICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBGaWVsZCBtZl9yZXN1bHQgPSBuZXcgRmllbGQoICJ4cmVzdWx0IiApOworCisgICAgICAgICAgICBzdGF0aWMgTXlWYWx1ZUZhY3RvcnkoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkuSW5pdCggdHlwZXMsIGNsYXNzMnR5cGUgKTsKKworICAgICAgICAgICAgICAgIG10X2Z1bmN0aW9uLlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKyAgICAgICAgICAgICAgICBtdF9mdW5jdGlvbi5QdXRWYWxpZGF0b3IoIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisKKyAgICAgICAgICAgICAgICBtdF9hZGQuUHV0VmFsaWRhdG9yKCBtZl94LCBWYWxpZGF0b3JfaW50LkdldCggMCApICk7CisgICAgICAgICAgICAgICAgbXRfYWRkLlB1dFZhbGlkYXRvciggbWZfeSwgVmFsaWRhdG9yX2ludC5HZXQoIDAgKSApOworICAgICAgICAgICAgICAgIG10X2FkZC5QdXRWYWxpZGF0b3IoIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisgICAgICAgICAgICAgICAgbXRfYWRkLlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX2luUmVwbHlUbywgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKworICAgICAgICAgICAgICAgIG10X2FkZF9yZXN1bHQuUHV0VmFsaWRhdG9yKCBtZl9yZXN1bHQsIFZhbGlkYXRvcl9pbnQuR2V0KCAwICkgKTsKKyAgICAgICAgICAgICAgICBtdF9hZGRfcmVzdWx0LlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKyAgICAgICAgICAgICAgICBtdF9hZGRfcmVzdWx0LlB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX2luUmVwbHlUbywgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE15VmFsdWVGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICA6IGJhc2UoIm5vbmU6IiwgdHlwZXMsIGNsYXNzMnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdEFsYXJtTWFuYWdlci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0QWxhcm1NYW5hZ2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliY2NmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdEFsYXJtTWFuYWdlci5jcwpAQCAtMCwwICsxLDQzNSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdEFsYXJtTWFuYWdlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgUTEgPSA1MDsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBRMiA9IDEwMDsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBRMyA9IDE1MDsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBzMSA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBzMiA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYW0uSXNTdGFydGVkKCkpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYW0uSXNTdGFydGVkKCkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0MigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZAorICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYW0uSXNTdGFydGVkKCkpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYW0uSXNTdGFydGVkKCkpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBzdG9wMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlzIG5vdCBzdGFydGVkCisgICAgICAgICAgICBBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhbS5Jc1N0YXJ0ZWQoKSk7CisgICAgICAgICAgICBhbS5TdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgc3RvcDIoKQorICAgICAgICB7CisgICAgICAgICAgICBBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhbS5Jc1N0YXJ0ZWQoKSk7CisgICAgICAgICAgICBhbS5TdGFydCgpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhbS5Jc1N0YXJ0ZWQoKSk7CisgICAgICAgICAgICBhbS5TdG9wKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhbS5Jc1N0YXJ0ZWQoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgc3RhdGljMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsYXJtTWFuYWdlci5zaHV0ZG93bigpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKEFsYXJtTWFuYWdlci5HZXRBbGFybU1hbmFnZXIoZmFsc2UpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoQWxhcm1NYW5hZ2VyLkdldEFsYXJtTWFuYWdlcihmYWxzZSkpOworCisgICAgICAgICAgICBBbGFybU1hbmFnZXIgYW0xID0gQWxhcm1NYW5hZ2VyLkdldEFsYXJtTWFuYWdlcih0cnVlKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoYW0xKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYW0xLklzU3RhcnRlZCgpKTsKKworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtMiA9IEFsYXJtTWFuYWdlci5HZXRBbGFybU1hbmFnZXIodHJ1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShhbTIsIGFtMSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFtMS5Jc1N0YXJ0ZWQoKSk7CisKKyAgICAgICAgICAgIEFsYXJtTWFuYWdlci5zaHV0ZG93bigpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYW0xLklzU3RhcnRlZCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoQWxhcm1NYW5hZ2VyLkdldEFsYXJtTWFuYWdlcihmYWxzZSkpOworCisgICAgICAgICAgICBBbGFybU1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBsaXN0ZW5lcjEoKQorICAgICAgICB7CisgICAgICAgICAgICBNeUFsYXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTXlBbGFybUxpc3RlbmVyKDApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbGlzdGVuZXIuZGVsYXkpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdGVuZXIud2FrZS5HZXQoKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGxpc3RlbmVyLnN0YXRlKTsKKworICAgICAgICAgICAgbGlzdGVuZXIuV2FrZXVwKG51bGwsIG51bGwsIDEyMzQ1KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBsaXN0ZW5lci5kZWxheSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChsaXN0ZW5lci5zdGF0ZSk7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLldha2V1cChudWxsLCBzMSwgMjM0NTYpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGxpc3RlbmVyLmRlbGF5KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobGlzdGVuZXIud2FrZS5HZXQoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShzMSwgbGlzdGVuZXIuc3RhdGUpOworCisgICAgICAgICAgICBNeUFsYXJtTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IE15QWxhcm1MaXN0ZW5lcigxKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBsaXN0ZW5lcjEuZGVsYXkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZDEoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpcyBub3Qgc3RhcnRlZAorICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCisgICAgICAgICAgICBNeUFsYXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTXlBbGFybUxpc3RlbmVyKDApOworCisgICAgICAgICAgICBhbS5BZGQobGlzdGVuZXIsIG51bGwsIFExKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBhZGQyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbGlzdGVuZXIgPT0gbnVsbAorICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKworICAgICAgICAgICAgYW0uQWRkKG51bGwsIG51bGwsIFExKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZDMoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkZWxheSA8PSAwCisgICAgICAgICAgICBBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisgICAgICAgICAgICBhbS5TdGFydCgpOworCisgICAgICAgICAgICBNeUFsYXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTXlBbGFybUxpc3RlbmVyKDApOworCisgICAgICAgICAgICBhbS5BZGQobGlzdGVuZXIsIG51bGwsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBhZGQ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKworICAgICAgICAgICAgTXlBbGFybUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE15QWxhcm1MaXN0ZW5lcigwKTsKKworICAgICAgICAgICAgLy9Mb2coIkFkZGluZyIpOworICAgICAgICAgICAgYW0uQWRkKGxpc3RlbmVyLCBudWxsLCBRMSk7CisgICAgICAgICAgICAvL0xvZygiQWRkZWQiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChsaXN0ZW5lci5zdGF0ZSk7CisKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcChRMik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChsaXN0ZW5lci5zdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkNSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKyAgICAgICAgICAgIGFtLlN0YXJ0KCk7CisKKyAgICAgICAgICAgIE15QWxhcm1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNeUFsYXJtTGlzdGVuZXIoMCk7CisKKyAgICAgICAgICAgIGFtLkFkZChsaXN0ZW5lciwgczEsIFExKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChsaXN0ZW5lci5zdGF0ZSk7CisKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcChRMik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoczEsIGxpc3RlbmVyLnN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBhZGQ2KCkKKyAgICAgICAgeworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKworICAgICAgICAgICAgTXlBbGFybUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE15QWxhcm1MaXN0ZW5lcigwKTsKKworICAgICAgICAgICAgYW0uQWRkKGxpc3RlbmVyLCBzMSwgUTMpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdGVuZXIud2FrZS5HZXQoKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGxpc3RlbmVyLnN0YXRlKTsKKworICAgICAgICAgICAgYW0uQWRkKGxpc3RlbmVyLCBzMiwgUTEpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdGVuZXIud2FrZS5HZXQoKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGxpc3RlbmVyLnN0YXRlKTsKKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKFEyKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobGlzdGVuZXIud2FrZS5HZXQoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShzMiwgbGlzdGVuZXIuc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZDcoKQorICAgICAgICB7CisgICAgICAgICAgICBBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisgICAgICAgICAgICBhbS5TdGFydCgpOworCisgICAgICAgICAgICBNeUFsYXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTXlBbGFybUxpc3RlbmVyKDApOworCisgICAgICAgICAgICBsaXN0ZW5lci5leGNwID0gdHJ1ZTsKKyAgICAgICAgICAgIGFtLkFkZChsaXN0ZW5lciwgczEsIFExKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChsaXN0ZW5lci5zdGF0ZSk7CisKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcChRMik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoczEsIGxpc3RlbmVyLnN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUxKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaXMgbm90IHN0YXJ0ZWQKKyAgICAgICAgICAgIEFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKworICAgICAgICAgICAgTXlBbGFybUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE15QWxhcm1MaXN0ZW5lcigwKTsKKworICAgICAgICAgICAgYW0uUmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUyKCkKKyAgICAgICAgeworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKworICAgICAgICAgICAgTXlBbGFybUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE15QWxhcm1MaXN0ZW5lcigwKTsKKworICAgICAgICAgICAgYW0uUmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUzKCkKKyAgICAgICAgeworICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKworICAgICAgICAgICAgTXlBbGFybUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE15QWxhcm1MaXN0ZW5lcigwKTsKKworICAgICAgICAgICAgYW0uQWRkKGxpc3RlbmVyLCBudWxsLCBRMSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShsaXN0ZW5lci53YWtlLkdldCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwobGlzdGVuZXIuc3RhdGUpOworCisgICAgICAgICAgICBhbS5SZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdGVuZXIud2FrZS5HZXQoKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGxpc3RlbmVyLnN0YXRlKTsKKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKFEyKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3RlbmVyLndha2UuR2V0KCkpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChsaXN0ZW5lci5zdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgcmVwZWF0MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKyAgICAgICAgICAgIGFtLlN0YXJ0KCk7CisKKyAgICAgICAgICAgIE15QWxhcm1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNeUFsYXJtTGlzdGVuZXIoMCk7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLmRlbGF5ID0gUTI7CisgICAgICAgICAgICBhbS5BZGQobGlzdGVuZXIsIG51bGwsIFEyKTsKKworICAgICAgICAgICAgbGlzdGVuZXIud2FrZS5XYWl0VW50aWxFcUFuZFNldCh0cnVlLCBRMywgZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImR1ZTAgPSB7MH0iLCBsaXN0ZW5lci5kdWUpOworICAgICAgICAgICAgbG9uZyB0MCA9IGxpc3RlbmVyLmR1ZTsKKworICAgICAgICAgICAgbGlzdGVuZXIud2FrZS5XYWl0VW50aWxFcUFuZFNldCh0cnVlLCBRMywgZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImR1ZTEgPSB7MH0iLCBsaXN0ZW5lci5kdWUpOworICAgICAgICAgICAgbG9uZyBkMSA9IGxpc3RlbmVyLmR1ZSAtIHQwOworCisgICAgICAgICAgICBsaXN0ZW5lci53YWtlLldhaXRVbnRpbEVxQW5kU2V0KHRydWUsIFEzLCBmYWxzZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZHVlMiA9IHswfSIsIGxpc3RlbmVyLmR1ZSk7CisgICAgICAgICAgICBsb25nIGQyID0gbGlzdGVuZXIuZHVlIC0gdDA7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLndha2UuV2FpdFVudGlsRXFBbmRTZXQodHJ1ZSwgUTMsIGZhbHNlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkdWUzID0gezB9IiwgbGlzdGVuZXIuZHVlKTsKKyAgICAgICAgICAgIGxvbmcgZDMgPSBsaXN0ZW5lci5kdWUgLSB0MDsKKworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKFExKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLmRlbGF5ID0gMDsKKworICAgICAgICAgICAgbGlzdGVuZXIud2FrZS5XYWl0VW50aWxFcUFuZFNldCh0cnVlLCBRMywgZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImR1ZTQgPSB7MH0iLCBsaXN0ZW5lci5kdWUpOworICAgICAgICAgICAgbG9uZyBkNCA9IGxpc3RlbmVyLmR1ZSAtIHQwOworCisgICAgICAgICAgICBsb25nIG0xID0gKGxvbmcpIE1hdGguUm91bmQoZDEgLyAoZG91YmxlKWQxKTsKKyAgICAgICAgICAgIGxvbmcgbTIgPSAobG9uZykgTWF0aC5Sb3VuZChkMiAvIChkb3VibGUpZDEpOworICAgICAgICAgICAgbG9uZyBtMyA9IChsb25nKSBNYXRoLlJvdW5kKGQzIC8gKGRvdWJsZSlkMSk7CisgICAgICAgICAgICBsb25nIG00ID0gKGxvbmcpIE1hdGguUm91bmQoZDQgLyAoZG91YmxlKWQxKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRpbWVzIHswfSB7MX0gezJ9IHszfSB7NH0iLCB0MCwgZDEsIGQyLCBkMywgZDQpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbTEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIG0yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBtMyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgbTQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIHJlcGVhdDIoKQorICAgICAgICB7CisgICAgICAgICAgICBBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisgICAgICAgICAgICBhbS5TdGFydCgpOworCisgICAgICAgICAgICBNeUFsYXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTXlBbGFybUxpc3RlbmVyKDApOworCisgICAgICAgICAgICBsaXN0ZW5lci5kZWxheSA9IC1RMjsKKyAgICAgICAgICAgIGFtLkFkZChsaXN0ZW5lciwgbnVsbCwgUTIpOworCisgICAgICAgICAgICBsaXN0ZW5lci53YWtlLldhaXRVbnRpbEVxQW5kU2V0KHRydWUsIFEzLCBmYWxzZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZHVlMCA9IHswfSIsIGxpc3RlbmVyLmR1ZSk7CisgICAgICAgICAgICBsb25nIHQwID0gbGlzdGVuZXIuZHVlOworCisgICAgICAgICAgICBsaXN0ZW5lci53YWtlLldhaXRVbnRpbEVxQW5kU2V0KHRydWUsIFEzLCBmYWxzZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZHVlMSA9IHswfSIsIGxpc3RlbmVyLmR1ZSk7CisgICAgICAgICAgICBsb25nIGQxID0gbGlzdGVuZXIuZHVlIC0gdDA7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLndha2UuV2FpdFVudGlsRXFBbmRTZXQodHJ1ZSwgUTMsIGZhbHNlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkdWUyID0gezB9IiwgbGlzdGVuZXIuZHVlKTsKKyAgICAgICAgICAgIGxvbmcgZDIgPSBsaXN0ZW5lci5kdWUgLSB0MDsKKworICAgICAgICAgICAgbGlzdGVuZXIud2FrZS5XYWl0VW50aWxFcUFuZFNldCh0cnVlLCBRMywgZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImR1ZTMgPSB7MH0iLCBsaXN0ZW5lci5kdWUpOworICAgICAgICAgICAgbG9uZyBkMyA9IGxpc3RlbmVyLmR1ZSAtIHQwOworCisgICAgICAgICAgICBUaHJlYWQuU2xlZXAoUTEpOworICAgICAgICAgICAgbGlzdGVuZXIuZGVsYXkgPSAwOworCisgICAgICAgICAgICBsaXN0ZW5lci53YWtlLldhaXRVbnRpbEVxQW5kU2V0KHRydWUsIFEzLCBmYWxzZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZHVlNCA9IHswfSIsIGxpc3RlbmVyLmR1ZSk7CisgICAgICAgICAgICBsb25nIGQ0ID0gbGlzdGVuZXIuZHVlIC0gdDA7CisKKyAgICAgICAgICAgIGxvbmcgbTEgPSAobG9uZykgTWF0aC5Sb3VuZChkMSAvIChkb3VibGUpZDEpOworICAgICAgICAgICAgbG9uZyBtMiA9IChsb25nKSBNYXRoLlJvdW5kKGQyIC8gKGRvdWJsZSlkMSk7CisgICAgICAgICAgICBsb25nIG0zID0gKGxvbmcpIE1hdGguUm91bmQoZDMgLyAoZG91YmxlKWQxKTsKKyAgICAgICAgICAgIGxvbmcgbTQgPSAobG9uZykgTWF0aC5Sb3VuZChkNCAvIChkb3VibGUpZDEpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGltZXMgezB9IHsxfSB7Mn0gezN9IHs0fSIsIHQwLCBkMSwgZDIsIGQzLCBkNCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbTIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIG0zKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCBtNCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCByZXBlYXQzKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGltZW91dAorICAgICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworICAgICAgICAgICAgYW0uU3RhcnQoKTsKKworICAgICAgICAgICAgTXlBbGFybUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE15QWxhcm1MaXN0ZW5lcigwKTsKKworICAgICAgICAgICAgbGlzdGVuZXIuZGVsYXkgPSBRMjsKKyAgICAgICAgICAgIGFtLkFkZChsaXN0ZW5lciwgbnVsbCwgUTIpOworCisgICAgICAgICAgICBsaXN0ZW5lci53YWtlLldhaXRVbnRpbEVxQW5kU2V0KHRydWUsIFEzLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLndha2UuV2FpdFVudGlsRXFBbmRTZXQodHJ1ZSwgUTMsIGZhbHNlKTsKKworICAgICAgICAgICAgbGlzdGVuZXIud2FrZS5XYWl0VW50aWxFcUFuZFNldCh0cnVlLCBRMywgZmFsc2UpOworCisgICAgICAgICAgICBUaHJlYWQuU2xlZXAoUTEpOworICAgICAgICAgICAgbGlzdGVuZXIuZGVsYXkgPSAwOworCisgICAgICAgICAgICBsaXN0ZW5lci53YWtlLldhaXRVbnRpbEVxQW5kU2V0KHRydWUsIFEzLCBmYWxzZSk7CisgICAgICAgICAgICAvLyBhbGFybSBpcyBub3cgY2FuY2VsZWQKKworICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgdGltZW91dC4uLgorICAgICAgICAgICAgbGlzdGVuZXIud2FrZS5XYWl0VW50aWxFcUFuZFNldCh0cnVlLCBRMywgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgTXlBbGFybUxpc3RlbmVyIDogQWxhcm1MaXN0ZW5lcgorICAgIHsKKyAgICAgICAgcHVibGljIE15QWxhcm1MaXN0ZW5lcihpbnQgZGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZGVsYXk7CisKKyAgICAgICAgcHVibGljIGJvb2wgZXhjcDsKKworICAgICAgICBwdWJsaWMgTW9uaXRvcjxib29sPiB3YWtlID0gbmV3IE1vbml0b3I8Ym9vbD4oIndha2UiLCBmYWxzZSk7CisKKyAgICAgICAgcHVibGljIG9iamVjdCBzdGF0ZTsKKworICAgICAgICBwdWJsaWMgbG9uZyBkdWU7CisKKyAgICAgICAgcHVibGljIGludCBXYWtldXAoQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIG9iamVjdCBzdGF0ZSwgbG9uZyBkdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuZHVlID0gZHVlOworICAgICAgICAgICAgd2FrZS5TZXQodHJ1ZSk7CisKKyAgICAgICAgICAgIGlmIChleGNwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlbGF5OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RDaGFySXRlcmF0b3IuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdENoYXJJdGVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODAxNzNjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RDaGFySXRlcmF0b3IuY3MKQEAgLTAsMCArMSw3MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2hhckl0ZXJhdG9yCisgICAgeworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdENoYXJJdGVyYXRvciIgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTdHJpbmcxKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHN0cjEgPSAidGNwIjsKKyAgICAgICAgICAgIENoYXJJdGVyYXRvciBjdCA9IG5ldyBDaGFySXRlcmF0b3IoIHN0cjEgKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggY3QuTW92ZU5leHQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAndCcsIGN0LkN1cnJlbnQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGN0Lk1vdmVOZXh0KCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJ2MnLCBjdC5DdXJyZW50ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBjdC5Nb3ZlTmV4dCgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICdwJywgY3QuQ3VycmVudCApOworCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggY3QuTW92ZU5leHQoKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3ROdWxsU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHN0cjEgPSBudWxsOworICAgICAgICAgICAgQ2hhckl0ZXJhdG9yIGN0ID0gbmV3IENoYXJJdGVyYXRvciggc3RyMSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RFbXB0eVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBzdHIxID0gIiI7CisgICAgICAgICAgICBDaGFySXRlcmF0b3IgY3QgPSBuZXcgQ2hhckl0ZXJhdG9yKCBzdHIxICk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBjdC5Nb3ZlTmV4dCgpICk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0Q2lyY3VsYXJRdWV1ZS5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0Q2lyY3VsYXJRdWV1ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTBjNjNmCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RDaXJjdWxhclF1ZXVlLmNzCkBAIC0wLDAgKzEsNzU0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgaW50ZXJuYWwgZGVsZWdhdGUgdm9pZCBydW4oKTsKKyAgICAKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RDaXJjdWxhclF1ZXVlCisgICAgeworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0Q2lyY3VsYXJRdWV1ZSIpOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgICAgIFtUZXN0XQorICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3QxKCkgCisJICAgIHsKKwkJICAgIG5ldyBDaXJjdWxhclF1ZXVlPGludD8+KCAwICk7CisJICAgIH0KKworICAgICAgICAKKwlbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pKV0KKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QyKCkgCisJeworCQluZXcgQ2lyY3VsYXJRdWV1ZTxpbnQ/PiggLTEgKTsKKwl9CisJCisJCisJW1Rlc3RdCisJcHVibGljIHZvaWQgY29uc3RydWN0MygpIAorCXsKKwkJQ2lyY3VsYXJRdWV1ZTxpbnQ/PiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPGludD8+KCAxICk7CisJCUFzc2VydC5BcmVFcXVhbCggMSwgcXVldWUuU2l6ZSgpICk7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDQoKSAKKwl7CisJCUNpcmN1bGFyUXVldWU8aW50Pz4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxpbnQ/PiggMiApOworCQlBc3NlcnQuQXJlRXF1YWwoIDIsIHF1ZXVlLlNpemUoKSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Q1KCkgCisJeworCQlDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAxMCwgcXVldWUuU2l6ZSgpICk7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIHB1dGdldDEoKSAKKwl7CisJCUNpcmN1bGFyUXVldWU8aW50Pz4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxpbnQ/PigpOworCQkKKwkJQXNzZXJ0LkFyZUVxdWFsKCAwLCBxdWV1ZS5Db3VudCgpICk7CisJCUFzc2VydC5Jc1RydWUoIHF1ZXVlLklzRW1wdHkoKSApOworCQlBc3NlcnQuSXNGYWxzZSggcXVldWUuSXNGdWxsKCkgKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKwkJeworCQkJcXVldWUuUHV0KCBpICk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIDEsIHF1ZXVlLkNvdW50KCkgKTsKKwkJCUFzc2VydC5Jc0ZhbHNlKCBxdWV1ZS5Jc0VtcHR5KCkgKTsKKwkJCQorCQkJQXNzZXJ0LkFyZUVxdWFsKCBpLCBxdWV1ZS5HZXQoKSApOworCQkJQXNzZXJ0LkFyZUVxdWFsKCAwLCBxdWV1ZS5Db3VudCgpICk7CisJCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5Jc0VtcHR5KCkgKTsKKwkJfQorCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBwdXRnZXQyKCkgCisJeworCQlDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oKTsKKwkJCisJCUFzc2VydC5Jc051bGwoIHF1ZXVlLkdldCggMSApICk7CisJCUFzc2VydC5Jc051bGwoIHF1ZXVlLkdldCggLTEgKSApOworCQlBc3NlcnQuSXNOdWxsKCBxdWV1ZS5HZXQoIDEwICkgKTsKKwkJCisJCXF1ZXVlLlB1dCggOSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDksIHF1ZXVlLkdldCggMSApICk7CisJCQorCQlxdWV1ZS5QdXQoIDkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCA5LCBxdWV1ZS5HZXQoIC0xICkgKTsKKwkJCisJCXF1ZXVlLlB1dCggOSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDksIHF1ZXVlLkdldCggMTAgKSApOworCQkKKwkJQXNzZXJ0LklzTnVsbCggcXVldWUuR2V0KCAxICkgKTsKKwkJQXNzZXJ0LklzTnVsbCggcXVldWUuR2V0KCAtMSApICk7CisJCUFzc2VydC5Jc051bGwoIHF1ZXVlLkdldCggMTAgKSApOworCQkKKwkvKglsb25nIHQwOworCQlkb3VibGUgdDsKKwkJCisJCisJICAgIHQwID0gSFBUaW1lci5Ob3coKTsKKwkgICAgQXNzZXJ0LklzTnVsbChxdWV1ZS5HZXQoMTApKTsKKyAgICAgICAgdCA9ICggSFBUaW1lci5Ob3coKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJYXNzZXJ0UmVsRXJyb3IoIDEwLCB0LCAxICk7CisJCQorCQkKKyAgICAgICAgdDAgPSBIUFRpbWVyLk5vdygpOworCSAgICBBc3NlcnQuSXNOdWxsKHF1ZXVlLkdldCgyMCkpOworICAgICAgICB0ID0gKEhQVGltZXIuTm93KCkgLSB0MCkgLyAxMDAwMDAwLjA7CisJCWFzc2VydFJlbEVycm9yKCAyMCwgdCwgMSApOworCQkKKwkKKyAgICAgICAgdDAgPSBIUFRpbWVyLk5vdygpOworCQlBc3NlcnQuSXNOdWxsKCBxdWV1ZS5HZXQoIDMwICkgKTsKKyAgICAgICAgdCA9IChIUFRpbWVyLk5vdygpIC0gdDApIC8gMTAwMDAwMC4wOworCQlhc3NlcnRSZWxFcnJvciggMzAsIHQsIDEgKTsgKi8KKwl9CisJCisJCisJW1Rlc3RdCisJcHVibGljIHZvaWQgcHV0Z2V0MygpIAorCXsKKwkJQ2lyY3VsYXJRdWV1ZTxpbnQ/PiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPGludD8+KCk7CisJCQorCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDEgKSApOworCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDIgKSApOworCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDMgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDEsIHF1ZXVlLkdldCgpICk7CisJCUFzc2VydC5BcmVFcXVhbCggMiwgcXVldWUuR2V0KCkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAzLCBxdWV1ZS5HZXQoKSApOworCQkKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuUHV0KCAxLCAwICkgKTsKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuUHV0KCAyLCAwICkgKTsKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuUHV0KCAzLCAwICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAxLCBxdWV1ZS5HZXQoIDAgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDIsIHF1ZXVlLkdldCggMCApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMywgcXVldWUuR2V0KCAwICkgKTsKKwkJCisJCUFzc2VydC5Jc1RydWUoIHF1ZXVlLlB1dCggMSwgLTEgKSApOworCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDIsIC0xICkgKTsKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuUHV0KCAzLCAtMSApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMSwgcXVldWUuR2V0KCAtMSApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMiwgcXVldWUuR2V0KCAtMSApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMywgcXVldWUuR2V0KCAtMSApICk7CisJCQorCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDEsIDEgKSApOworCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDIsIDEgKSApOworCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDMsIDEgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDEsIHF1ZXVlLkdldCggMSApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMiwgcXVldWUuR2V0KCAxICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAzLCBxdWV1ZS5HZXQoIDEgKSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBnZXQoKSAKKwl7CisJCUNpcmN1bGFyUXVldWU8aW50Pz4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxpbnQ/PiggMSApOworCQkKKwkvLwlTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgSFBUaW1lci5Ob3coKTsKKwkJQXNzZXJ0LklzTnVsbCggcXVldWUuR2V0KCAxMCApICk7CisJCWFzc2VydFJlbEVycm9yKCAxLCAxLCAxICk7CisKKwkgICAgZm9yZWFjaCAoaW50IGkgaW4gbmV3IGludFtdIHsgMTAsIDIwLCAzMCwgNTAsIDgwLCAxMzAsIDIxMCwgMzQwLCA1NTAsIDg5MCwgMTQ0MCB9KQkgICAKKwkJeworCQkvLwlDb25zb2xlLldyaXRlTGluZSggImdldCBkZWxheSA9IHswfVxuIiwgaSApOworICAgICAgICAgICAgbG9uZyB0MCA9IEhQVGltZXIuTm93KCk7CisJCQlBc3NlcnQuSXNOdWxsKCBxdWV1ZS5HZXQoIGkgKSApOworICAgICAgLyogICAgICBkb3VibGUgdCA9IChIUFRpbWVyLk5vdygpIC0gdDApIC8gMTAwMDAwMC4wOworCQkJYXNzZXJ0UmVsRXJyb3IoIGksIHQsIDIgKTsgKi8KKwkJfQorCX0KKwkKKwkKKwlbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KKwlwdWJsaWMgdm9pZCBwdXQoKSAKKwl7CisJCUNpcmN1bGFyUXVldWU8aW50Pz4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxpbnQ/PigpOworCQlxdWV1ZS5QdXQoIG51bGwgKTsKKwl9CisJCisJCisJW1Rlc3RdCisJcHVibGljIHZvaWQgZnVsbCgpIAorCXsKKwkJQ2lyY3VsYXJRdWV1ZTxpbnQ/PiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPGludD8+KCAxICk7CisJCQorCQlBc3NlcnQuSXNGYWxzZSggcXVldWUuSXNGdWxsKCkgKTsKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuUHV0KCAwICkgKTsKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuSXNGdWxsKCkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAwLCBxdWV1ZS5HZXQoKSApOworCQlBc3NlcnQuSXNGYWxzZSggcXVldWUuSXNGdWxsKCkgKTsKKwkJCisJCUFzc2VydC5Jc1RydWUoIHF1ZXVlLlB1dCggMCApICk7CisJCUFzc2VydC5Jc0ZhbHNlKCBxdWV1ZS5QdXQoIDAsIC0xICkgKTsKKwkJQXNzZXJ0LklzRmFsc2UoIHF1ZXVlLlB1dCggMCwgMSApICk7CisJCUFzc2VydC5Jc0ZhbHNlKCBxdWV1ZS5QdXQoIDAsIDEwICkgKTsKKwl9CisJCisJCisJW1Rlc3RdCisJcHVibGljIHZvaWQgY2xvc2UxKCkgCisJeworCQlDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oKTsKKwkJCisJCUFzc2VydC5Jc0ZhbHNlKCBxdWV1ZS5Jc0Nsb3NlZCgpICk7CisJCXF1ZXVlLkNsb3NlKCk7CisJCUFzc2VydC5Jc1RydWUoIHF1ZXVlLklzQ2xvc2VkKCkgKTsKKwkJCisJCUFzc2VydC5Jc051bGwoIHF1ZXVlLkdldCgpICk7CisJCUFzc2VydC5Jc051bGwoIHF1ZXVlLkdldCggLTEgKSApOworCQlBc3NlcnQuSXNOdWxsKCBxdWV1ZS5HZXQoIDAgKSApOworCQlBc3NlcnQuSXNOdWxsKCBxdWV1ZS5HZXQoIDEgKSApOworCQkKKwkJcXVldWUuQ2xvc2UoKTsKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuSXNDbG9zZWQoKSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBjbG9zZTIoKSAKKwl7CisJCUNpcmN1bGFyUXVldWU8aW50Pz4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxpbnQ/PigpOworCisJCUFzc2VydC5Jc0ZhbHNlKCBxdWV1ZS5Jc0Nsb3NlZCgpICk7CisJCXF1ZXVlLkNsb3NlKCk7CisJCUFzc2VydC5Jc1RydWUoIHF1ZXVlLklzQ2xvc2VkKCkgKTsKKwkJCisJCUFzc2VydC5Jc0ZhbHNlKCBxdWV1ZS5QdXQoIDAgKSApOworCQlBc3NlcnQuSXNGYWxzZSggcXVldWUuUHV0KCAwLCAtMSApICk7CisJCUFzc2VydC5Jc0ZhbHNlKCBxdWV1ZS5QdXQoIDAsIDAgKSApOworCQlBc3NlcnQuSXNGYWxzZSggcXVldWUuUHV0KCAwLCAxICkgKTsKKwkJCisJCXF1ZXVlLkNsb3NlKCk7CisJCUFzc2VydC5Jc1RydWUoIHF1ZXVlLklzQ2xvc2VkKCkgKTsKKwl9CisJCisJCisJW1Rlc3RdCisJcHVibGljIHZvaWQgY2xvc2UzKCkgCisJeworCQlDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oKTsKKwkJcXVldWUuUHV0KCAxICk7CisJCXF1ZXVlLlB1dCggMiApOworCQlxdWV1ZS5QdXQoIDMgKTsKKwkJcXVldWUuQ2xvc2UoKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAxLCBxdWV1ZS5HZXQoKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDIsIHF1ZXVlLkdldCgpICk7CisJCUFzc2VydC5BcmVFcXVhbCggMywgcXVldWUuR2V0KCkgKTsKKwkJQXNzZXJ0LklzTnVsbCggcXVldWUuR2V0KCkgKTsKKwl9CisJCisJCisJW1Rlc3RdCisJcHVibGljIHZvaWQgZGVsYXkxKCkgCisJeworCQlDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oKTsKKwkJCisJCURlbGF5KCAxMCwgZGVsZWdhdGUoKSB7cXVldWUuUHV0KCA5OSApOyB9ICk7CisJCUFzc2VydC5BcmVFcXVhbCggOTksIHF1ZXVlLkdldCgpICk7CisJCQorCQlEZWxheSggMTAsIGRlbGVnYXRlKCkgeyBxdWV1ZS5DbG9zZSgpOyB9ICk7CisJCUFzc2VydC5Jc051bGwoIHF1ZXVlLkdldCgpICk7IAorCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBkZWxheTIoKSAKKwl7CisJCSBDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oIDEgKTsKKwkJCisJCUFzc2VydC5Jc1RydWUoIHF1ZXVlLlB1dCggMSApICk7CisJCURlbGF5KCAxMCwgZGVsZWdhdGUoKSB7IEFzc2VydC5BcmVFcXVhbCggMSwgcXVldWUuR2V0KCkgKTsgfSApOworCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDIgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDIsIHF1ZXVlLkdldCgpICk7CisJCQorCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDEgKSApOworCSAgICBEZWxheSgxMCwgZGVsZWdhdGUoKSB7IHF1ZXVlLkNsb3NlKCk7IH0pOworCQlBc3NlcnQuSXNGYWxzZSggcXVldWUuUHV0KCAyICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAxLCBxdWV1ZS5HZXQoKSApOworCQlBc3NlcnQuSXNOdWxsKCBxdWV1ZS5HZXQoKSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBzdHJlc3MxKCkgCisJeworCQkgQ2lyY3VsYXJRdWV1ZTxpbnQ/PiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPGludD8+KCAxICk7CisJCSBpbnQgbiA9IDEwMDAwOworCisgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICAgZGVsZWdhdGUoKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCQl7CisJCQkJCXRyeQorCQkJCQl7CisJCQkJCQlxdWV1ZS5QdXQoIGkgKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQlDb25zb2xlLldyaXRlTGluZShlKTsKKwkJCQkJfQorCQkJCX0gIAorICAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKwkJCisJCXQuU3RhcnQoKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJQXNzZXJ0LkFyZUVxdWFsKCBpLCBxdWV1ZS5HZXQoKSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBzdHJlc3MyKCkgCisJeworCQlDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oIDEgKTsKKwkJIGludCBuID0gMTAwMDsKKworICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKAorICAgICAgICAgICAgIGRlbGVnYXRlKCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJeworCQkJCQl0cnkKKwkJCQkJeworCQkJCQkJVGhyZWFkLlNsZWVwKCA1ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5QdXQoIGkgKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQlDb25zb2xlLldyaXRlTGluZShlKTsKKwkJCQkJfQorCQkJCX0gIAorICAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKwkJCisJCXQuU3RhcnQoKTsKKyAgICAgCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJQXNzZXJ0LkFyZUVxdWFsKCBpLCBxdWV1ZS5HZXQoKSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBzdHJlc3MzKCkgCisJeworCQkKKyAgICAgICAgQ2lyY3VsYXJRdWV1ZTxpbnQ/PiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPGludD8+KCAxICk7CisJCSBpbnQgbiA9IDEwMDA7CisKKyAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgKKyAgICAgICAgICAgICBkZWxlZ2F0ZSgpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJCXsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuUHV0KCBpICk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKCBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQkJeworCQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoZSk7CisJCQkJCX0KKwkJCQl9ICAKKyAgICAgICAgICAgICB9CisgICAgICAgICk7CisJCQorCQl0LlN0YXJ0KCk7CisgICAgICAgIAorICAgICAgICAKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQl7CisJCQlUaHJlYWQuU2xlZXAoIDUgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggaSwgcXVldWUuR2V0KCkgKTsKKwkJfQorCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBzdHJlc3M0KCkgCisJeworCQkgQ2lyY3VsYXJRdWV1ZTxpbnQ/PiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPGludD8+KCk7CisJCQorCQkvLyB3ZSB3aWxsIHNldHVwIHR3byB0aHJlYWRzIHdhaXRpbmcgdG8gZ2V0IGFuZAorCQkvLyB0aGVuIGluIGEgc2luZ2xlIHN5bmNocm9uaXplZCBzdGVwIHB1dCB0d28KKwkJLy8gaXRlbXMgaW4gdGhlIHF1ZXVlLiB0aGUgZmlyc3QgdGhyZWFkIHdpbGwgYmUKKwkJLy8gd29rZW4gdG8gZ2V0LCBhbmQgb25jZSBkb25lIHRoZSBzZWNvbmQgdGhyZWFkCisJCS8vIHNob3VsZCBiZSB3b2tlbiBieSB0aGUgZmlyc3QuCisJCQorCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCAKKyAgICAgICAgICAgIGRlbGVnYXRlKCkKKwkJICAgIHsJCQkKKwkJCQl0cnkKKwkJCQl7CisJCQkJCUFzc2VydC5Jc05vdE51bGwoIHF1ZXVlLkdldCgpICk7CisJCQkJfQorCQkJCWNhdGNoICggVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQlDb25zb2xlLldyaXRlTGluZShlKTsKKwkJCQl9CisJCQl9CisJCSk7CisJCQorCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCAKKyAgICAgICAgICAgIGRlbGVnYXRlKCkKKwkJICAgIHsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCUFzc2VydC5Jc05vdE51bGwoIHF1ZXVlLkdldCgpICk7CisJCQkJfQorCQkJCWNhdGNoICggVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlKTsKKwkJCQl9CisJCSAgICB9CisgICAgICAgICk7CisKKwkJdDEuU3RhcnQoKTsKKwkJdDIuU3RhcnQoKTsKKwkJCisJCS8vIHdhaXQgdW50aWwgYm90aCB0aHJlYWRzIGFyZSB3YWl0aW5nIG9uIHF1ZXVlLi4uCisJCQorCQlUaHJlYWQuU2xlZXAoIDEwMCApOworCQkKKwkJbG9jayhxdWV1ZSkKKwkJeworCQkJcXVldWUuUHV0KCAxICk7CisJCQlxdWV1ZS5QdXQoIDIgKTsKKwkJfQorCisJCWhhcnZlc3QoIHQxICk7CisJCWhhcnZlc3QoIHQyICk7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIHN0cmVzczUoKSAKKwl7CisJCSBDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oIDMgKTsKKwkJCisJCS8vIHdlIHdpbGwgc2V0dXAgdHdvIHRocmVhZHMgd2FpdGluZyB0byBwdXQgdG8gdGhlIHF1ZXVlLAorCQkvLyB0aGVuIGluIGEgc2luZ2xlIHN5bmNocm9uaXplZCBzdGVwLCByZWFkIHR3byBpdGVtcyBmcm9tCisJCS8vIHRoZSBxdWV1ZS4gdGhlIGZpcnN0IHRocmVhZCB3aWxsIGJlIHdva2VuIHRvIHB1dCwgYW5kCisJCS8vIG9uY2UgZG9uZSB0aGUgc2Vjb25kIHRocmVhZCBzaG91bGQgYmUgd29rZW4gYnkgdGhlIGZpcnN0LgorCQkKKwkJcXVldWUuUHV0KCAwICk7CisJCXF1ZXVlLlB1dCggMSApOworCQlxdWV1ZS5QdXQoIDIgKTsKKwkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuSXNGdWxsKCkgKTsKKwkJCisJCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQoIAorICAgICAgICAgICAgZGVsZWdhdGUoKQorCQkgICAgeworCQkJCisJCQkJdHJ5CisJCQkJeworCQkJCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDMgKSApOworCQkJCX0KKwkJCQljYXRjaCAoIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZSk7CisJCQkJfQorCQkJfQorCQkgKTsKKwkJCisJCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICBkZWxlZ2F0ZSgpCisJCSAgICB7CisJCQkJdHJ5CisJCQkJeworCQkJCQlBc3NlcnQuSXNUcnVlKCBxdWV1ZS5QdXQoIDQgKSApOworCQkJCX0KKwkJCQljYXRjaCAoIFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZSk7CisJCQkJfQorCQkJfQorCQkpOworCQkKKwkJdDEuU3RhcnQoKTsKKwkJdDIuU3RhcnQoKTsKKwkJCisJCS8vIHdhaXQgdW50aWwgYm90aCB0aHJlYWRzIGFyZSB3YWl0aW5nIG9uIHF1ZXVlLi4uCisJCQorCQlUaHJlYWQuU2xlZXAoIDEwMCApOworCQkKKwkJbG9jayhxdWV1ZSkKKwkJeworCQkJQXNzZXJ0LklzTm90TnVsbCggcXVldWUuR2V0KCkgKTsKKwkJCUFzc2VydC5Jc05vdE51bGwoIHF1ZXVlLkdldCgpICk7CisJCX0KKworCQloYXJ2ZXN0KCB0MSApOworCQloYXJ2ZXN0KCB0MiApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBzdHJlc3M2KCkgCisJeworCQlDaXJjdWxhclF1ZXVlPGludD8+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8aW50Pz4oIDUgKTsKKwkJCisJCS8vIHN0YXJ0IHR3byBnZXR0ZXJzIGFuZCB0d28gcHV0dGVycyBhbmQgbGV0ICdlbSBkdWtlIGl0IG91dC4uLgorCQkKKwkJVGhyZWFkIHQxID0gbmV3IFRocmVhZCggCisgICAgICAgICAgICBkZWxlZ2F0ZSgpCisJCSAgICB7CisJCQkJdHJ5CisJCQkJeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJCQkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuUHV0KCBpICkgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUpOworCQkJCX0KKwkJCX0KKwkJKTsKKwkJCisJCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICBkZWxlZ2F0ZSgpCisJCSAgICB7CisJCQkJdHJ5CisJCQkJeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJCQkJQXNzZXJ0LklzVHJ1ZSggcXVldWUuUHV0KCBpICkgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUpOworCQkJCX0KKwkJCX0KKwkJKTsKKwkJCisJCVRocmVhZCB0MyA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICBkZWxlZ2F0ZSgpCisJCSAgICB7CisJCQkJdHJ5CisJCQkJeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJCQkJQXNzZXJ0LklzTm90TnVsbCggcXVldWUuR2V0KCkgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUpOworCQkJCX0KKwkJCX0KKwkJKTsKKwkJCisJCVRocmVhZCB0NCA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICBkZWxlZ2F0ZSgpCisJCSAgICB7CisJCQkJdHJ5CisJCQkJeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJCQkJQXNzZXJ0LklzTm90TnVsbCggcXVldWUuR2V0KCkgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUpOworCQkJCX0KKwkJCX0KKwkJKTsKKwkJCisJCXQxLlN0YXJ0KCk7CisJCXQyLlN0YXJ0KCk7CisJCXQzLlN0YXJ0KCk7CisJCXQ0LlN0YXJ0KCk7CisKKwkJaGFydmVzdCggdDEgKTsKKwkJaGFydmVzdCggdDIgKTsKKwkJaGFydmVzdCggdDMgKTsKKwkJaGFydmVzdCggdDQgKTsKKwl9CisJCisJCisJW1Rlc3RdCisJcHVibGljIHZvaWQgaGFydmVzdDEoKSAKKwl7CisJCVRocmVhZCB0ID0gbmV3IFRocmVhZCgKKyAgICAgICAgICAgIGRlbGVnYXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKwkJdC5TdGFydCgpOworCQloYXJ2ZXN0KCB0ICk7CisJfQorCQorCQorCVtUZXN0XQorICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBUaW1lb3V0RXhjZXB0aW9uICkgKV0KKwlwdWJsaWMgdm9pZCBoYXJ2ZXN0MigpIAorCXsKKwkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCAKKyAgICAgICAgICAgIGRlbGVnYXRlKCkgCisJCSAgICB7CisJCQkJdHJ5CisJCQkJeworCQkJCQlUaHJlYWQuU2xlZXAoIDEwMDAwICk7CisJCQkJfQorCQkJCWNhdGNoICggVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlKTsKKwkJCQl9CisJCQl9CisJCSk7CisJCXQuU3RhcnQoKTsKKwkJaGFydmVzdCggdCApOworCX0gCisJCisJcHJpdmF0ZSB2b2lkIGhhcnZlc3QoIFRocmVhZCB0ICkgCisJeworCQl0LkpvaW4oIDEwMDAgKTsKKwkJaWYgKHQuSXNBbGl2ZSkKKwkJeworCQkJdC5JbnRlcnJ1cHQoKTsKKwkJCXRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCB0Lk5hbWUrIiBpcyBzdHVjayIgKTsKKwkJfQorCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCB0ZXN0UmVsRXJyb3IxKCkgCisJeworCQlhc3NlcnRSZWxFcnJvciggMTAsIDksIC4xMSApOworCQlhc3NlcnRSZWxFcnJvciggMTAsIDExLCAuMTQgKTsKKwkJYXNzZXJ0UmVsRXJyb3IoIDIwLCAxOSwgLjA3ICk7CisJCWFzc2VydFJlbEVycm9yKCAxOSwgMjMsIC4yMiApOworCX0KKwkKKwkKKwlbVGVzdF0KKyAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoQXNzZXJ0aW9uRXhjZXB0aW9uICkgKV0KKwlwdWJsaWMgdm9pZCB0ZXN0UmVsRXJyb3IyKCkgCisJeworCQlhc3NlcnRSZWxFcnJvciggOSwgOCwgLjEgKTsKKwl9CisJCisJCisJW1Rlc3RdCisgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoQXNzZXJ0aW9uRXhjZXB0aW9uICkgKV0KKwlwdWJsaWMgdm9pZCB0ZXN0UmVsRXJyb3IzKCkgCisJeworCQlhc3NlcnRSZWxFcnJvciggOSwgMTAsIC4xICk7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIHRlc3RBYnNFcnJvcjEoKSAKKwl7CisJCUFzc2VydEFic0Vycm9yKCAxMSwgMTUsIDQgKTsKKwkJQXNzZXJ0QWJzRXJyb3IoIDE1LCAxMCwgNSApOworCQlBc3NlcnRBYnNFcnJvciggNSwgMywgMiApOworCQlBc3NlcnRBYnNFcnJvciggNCwgNywgMyApOworCX0KKwkKKwkKKwlbVGVzdF0KKyAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZihBc3NlcnRpb25FeGNlcHRpb24gKSApXQorCXB1YmxpYyB2b2lkIHRlc3RBYnNFcnJvcjIoKSAKKwl7CisJCUFzc2VydEFic0Vycm9yKCAxMSwgMTUsIDMgKTsKKwl9CisJCisJCisJW1Rlc3RdCisgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBc3NlcnRpb25FeGNlcHRpb24pKV0KKwlwdWJsaWMgdm9pZCB0ZXN0QWJzRXJyb3IzKCkgCisJeworCQlBc3NlcnRBYnNFcnJvciggMTksIDE1LCAzICk7CisJfSAKKwkKKwlwcml2YXRlIHZvaWQgRGVsYXkoICBpbnQgZGVsYXksIHJ1biBkZWwgKQorCXsKKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoZGVsZWdhdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5TbGVlcChkZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHQuU3RhcnQoKTsKKworICAgICAgCisJfQorCQorCQorCisJcHJpdmF0ZSB2b2lkIGFzc2VydFJlbEVycm9yKCBkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwsIGRvdWJsZSBlcnJvciApCisJeworCQlkb3VibGUgcmVsRXJyb3IgPSBSZWxFcnJvciggZXhwZWN0ZWQsIGFjdHVhbCApOworCQlpZiAocmVsRXJyb3IgPiBlcnJvcikKKwkJCUFzc2VydC5GYWlsKCBTdHJpbmcuRm9ybWF0KCAiZXhwZWN0ZWQ6IHswfSBidXQgd2FzOiB7MX0gcmVsYXRpdmUgZXJyb3I6IHsyfSIsIGV4cGVjdGVkLCBhY3R1YWwsIHJlbEVycm9yICkgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIEFzc2VydEFic0Vycm9yKCBkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwsIGRvdWJsZSBlcnJvciApCisJeworCQlkb3VibGUgYWJzRXJyb3IgPSBBYnNFcnJvciggZXhwZWN0ZWQsIGFjdHVhbCApOworCQlpZiAoYWJzRXJyb3IgPiBlcnJvcikKKyAgICAgICAgICAgCisJCQlBc3NlcnQuRmFpbCggU3RyaW5nLkZvcm1hdCggImV4cGVjdGVkOiB7MH0gYnV0IHdhczogezF9IGFic29sdXRlIGVycm9yOiB7Mn0iLCBleHBlY3RlZCwgYWN0dWFsLCBhYnNFcnJvciApICk7CisJfQorCQorCXByaXZhdGUgZG91YmxlIFJlbEVycm9yKCBkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwgKQorCXsKKwkJcmV0dXJuIEFic0Vycm9yKCBleHBlY3RlZCwgYWN0dWFsICkgLyBleHBlY3RlZDsKKwl9CisJCisJcHJpdmF0ZSBkb3VibGUgQWJzRXJyb3IoIGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCApCisJeworCQlyZXR1cm4gTWF0aC5BYnMoIGV4cGVjdGVkIC0gYWN0dWFsICk7CisJfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3REYXRlU2VyaWFsaXplci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0RGF0ZVNlcmlhbGl6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhZjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0RGF0ZVNlcmlhbGl6ZXIuY3MKQEAgLTAsMCArMSw2NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3REYXRlU2VyaWFsaXplcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRHVtbXlWYWx1ZUZhY3RvcnkoKTsKKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3REYXRlU2VyaWFsaXplciIgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJbXBvcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBEYXRlVGltZSBkYXRlID0gbmV3IERhdGVUaW1lKCk7CisgICAgICAgICAgICBUZXN0RGF0ZSggZGF0ZSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRlc3REYXRlKCBEYXRlVGltZSBkYXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgWFR5cGUgdHlwZSA9IG5ldyBYVHlwZSggImRhdGUiICk7CisgICAgICAgICAgCisgICAgICAgICAgICBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSAKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3MyVHlwZU1hcCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBEYXRlU2VyaWFsaXplci5Jbml0KCB0eXBlLCBjbGFzczJ0eXBlICk7CisKKyAgICAgICAgICAgIEltcG9ydEV4cG9ydEhlbHBlciBoZWxwZXIgPSB0eXBlLkdldEltcG9ydEV4cG9ydEhlbHBlcigpOworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBoZWxwZXIuRXhwb3J0VmFsdWUoIHZmLCBkYXRlICk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggc3YuR2V0WFR5cGUsIHR5cGUgKTsKKworICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZTIgPSAoIERhdGVUaW1lICkgaGVscGVyLkltcG9ydFZhbHVlKCBzdiApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGRhdGUsIGRhdGUyICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdEZsZXhCdWZmZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdEZsZXhCdWZmZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlNmFiNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0RmxleEJ1ZmZlci5jcwpAQCAtMCwwICsxLDEzMzYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdEZsZXhCdWZmZXIKKyAgICB7CisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0RmxleEJ1ZmZlciIpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIEZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKworICAgICAgICAvLyBHZW5lcmFsIHRlc3QgZnVuY3Rpb24KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrQnVmKCBpbnQgbGVuZ3RoLCBpbnQgaW5kZXgsIGludCBhdmFpbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggbGVuZ3RoLCBidWYuTGVuZ3RoKCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggaW5kZXgsIGJ1Zi5JbmRleCgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGF2YWlsLCBidWYuQXZhaWwoKSApOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBCYXNpYyBUZXN0cworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisgICAgICAgICAgICBDaGVja0J1ZiggMCwgMCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWwyKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlWyA1IF0gKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCA1LCAwLCA1ICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbDMoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbIDUgXSwgMiApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDIsIDAsIDIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVsgNSBdLCAxLCAzICk7CisgICAgICAgICAgICBDaGVja0J1ZiggNCwgMSwgMyApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldExlbmd0aDAoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCAwICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMCwgMCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldExlbmd0aDEoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCAxICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMSwgMCwgMSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldExlbmd0aDIoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCAyICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMiwgMCwgMiApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldExlbmd0aDMoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCAyICk7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCAwICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMCwgMCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiAoIHR5cGVvZiAoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFNldExlbmd0aDQoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCAtMSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEluZGV4MCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAwICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMCwgMCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiAoIHR5cGVvZiAoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEluZGV4MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEluZGV4MigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleCggLTEgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEluZGV4MygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5TZXRMZW5ndGgoIDUgKTsKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleCggMSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDUsIDEsIDQgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRJbmRleDQoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCA1ICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIDQgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCA1LCA0LCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0SW5kZXg1KCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLlNldExlbmd0aCggNSApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCA1ICk7CisgICAgICAgICAgICBDaGVja0J1ZiggNSwgNSwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEluZGV4NigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5TZXRMZW5ndGgoIDUgKTsKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleCggNSApOworICAgICAgICAgICAgYnVmLlNldExlbmd0aCggMCApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDAsIDAsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRJbmRleDcoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCA1ICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIDUgKTsKKyAgICAgICAgICAgIGJ1Zi5TZXRMZW5ndGgoIDIgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAyLCAyLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuU2V0TGVuZ3RoKCAyICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIDEgKTsKKyAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworICAgICAgICAgICAgQ2hlY2tCdWYoIDAsIDAsIDAgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uIEJhc2ljIFRlc3RzCisKKyAgICAgICAgI3JlZ2lvbiBDYXNlcyBmb3IgcHV0ICggaW50ICkKKyAgICAgICAgLy8gcHV0IG9uY2Ugb3IgdHdpY2UgKHRoZSBwdXQgMCBjYXNlIGhhcyBhbHJlYWR5IGJlZW4gdGVzdGVkKS4KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0MWEoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuUmVzZXQoKTsKKyAgICAgICAgICAgIGJ1Zi5QdXQoIDEgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAxLCAxLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQdXQxYigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworICAgICAgICAgICAgYnVmLlB1dCggMSApOworICAgICAgICAgICAgYnVmLlB1dCggMiApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDIsIDIsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24gQ2FzZXMgZm9yIHB1dCAoIGludCApCisKKyAgICAgICAgI3JlZ2lvbiBDYXNlcyBmb3IgcHV0ICggYnl0ZVtdIGJ1ZiApCisgICAgICAgIC8vIGJ1Zi5sZW5ndGggPSBudWxsLCAwLCAxLCAyCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRlc3RQdXRCeXRlcyggaW50IGJ1ZkxlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworICAgICAgICAgICAgYnVmLlB1dCggMSApOworICAgICAgICAgICAgYnVmLlB1dCggYnVmTGVuID49IDAgPyBuZXcgYnl0ZVsgYnVmTGVuIF0gOiBudWxsICk7CisgICAgICAgICAgICBDaGVja0J1ZiggYnVmTGVuICsgMSwgYnVmTGVuICsgMSwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mICggTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDJhKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzKCAtMSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDJiKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzKCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0MmMoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXMoIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQdXQyZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlcyggMiApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbiBDYXNlcyBmb3IgcHV0ICggYnl0ZVtdIGJ1ZiApCisKKyAgICAgICAgI3JlZ2lvbiBDYXNlcyBmb3IgcHV0KCBieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKKyAgICAgICAgLy8gYnVmLmxlbmd0aCwgb2ZmLCBsZW4gLy8gZmFpbHVyZSByZWFzb24KKyAgICAgICAgLy8gLS0tIGdyb3VwIDM6CisgICAgICAgIC8vIG51bGwsIDAsIDAgLy8gZmFpbCAoYnVmIGlzIG51bGwpCisgICAgICAgIC8vIG51bGwsIDAsIDEgLy8gZmFpbCAoYnVmIGlzIG51bGwpCisgICAgICAgIC8vIG51bGwsIDEsIDAgLy8gZmFpbCAoYnVmIGlzIG51bGwpCisgICAgICAgIC8vIC0tLSBncm91cCA0OgorICAgICAgICAvLyAwLCAwLCAwCisgICAgICAgIC8vIDAsIDAsIDEgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIC8vIDAsIDEsIDAgLy8gZmFpbCAob2ZmID4gYnVmLmxlbmd0aCkKKyAgICAgICAgLy8gLS0tIGdyb3VwIDU6CisgICAgICAgIC8vIDEsIDAsIDAKKyAgICAgICAgLy8gMSwgMCwgMQorICAgICAgICAvLyAxLCAwLCAyIC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICAvLyAxLCAxLCAwCisgICAgICAgIC8vIDEsIDEsIDEgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIC8vIDEsIDEsIDIgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIC8vIDEsIDIsIDAgLy8gZmFpbCAob2ZmID4gYnVmLmxlbmd0aCkKKyAgICAgICAgLy8gMSwgMiwgMSAvLyBmYWlsIChvZmYgPiBidWYubGVuZ3RoKQorICAgICAgICAvLyAxLCAyLCAyIC8vIGZhaWwgKG9mZiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIC8vIC0tLSBncm91cCA2OgorICAgICAgICAvLyAyLCAwLCAwCisgICAgICAgIC8vIDIsIDAsIDEKKyAgICAgICAgLy8gMiwgMCwgMgorICAgICAgICAvLyAyLCAxLCAwCisgICAgICAgIC8vIDIsIDEsIDEKKyAgICAgICAgLy8gMiwgMSwgMiAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKyAgICAgICAgLy8gMiwgMiwgMAkKKyAgICAgICAgLy8gMiwgMiwgMSAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKyAgICAgICAgLy8gMiwgMiwgMiAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdFB1dEJ5dGVzT2ZmTGVuKCBpbnQgYnVmTGVuLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoICkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLlJlc2V0KCk7CisgICAgICAgICAgICBidWYuUHV0KCAxICk7CisgICAgICAgICAgICBidWYuUHV0KCBidWZMZW4gPj0gMCA/IG5ldyBieXRlWyBidWZMZW4gXSA6IG51bGwsIG9mZnNldCwgbGVuZ3RoICk7CisgICAgICAgICAgICBDaGVja0J1ZiggbGVuZ3RoICsgMSwgbGVuZ3RoICsgMSwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0M2EoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIC0xLCAwLCAwICk7IC8vIGZhaWwgKGJ1ZiBpcyBudWxsKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE51bGxSZWZlcmVuY2VFeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBQdXQzYigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc09mZkxlbiggLTEsIDAsIDEgKTsgLy8gZmFpbCAoYnVmIGlzIG51bGwpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE51bGxSZWZlcmVuY2VFeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBQdXQzYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc09mZkxlbiggLTEsIDEsIDAgKTsgLy8gZmFpbCAoYnVmIGlzIG51bGwpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NGEoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDAsIDAsIDAgKTsgCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NGIoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDAsIDAsIDEgKTsgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDRjKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAwLCAxLCAwICk7IC8vIGZhaWwgKG9mZiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NWEoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDEsIDAsIDAgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDViKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAwLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDVjKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAwLCAyICk7IC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAxLCAwICk7IAorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBQdXQ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc09mZkxlbiggMSwgMSwgMSApOyAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NWYoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDEsIDEsIDIgKTsgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDVnKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAyLCAwICk7IC8vIGZhaWwgKG9mZiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDVoKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAyLCAxICk7IC8vIGZhaWwgKG9mZiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDVpKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAyLCAyICk7IC8vIGZhaWwgKG9mZiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NmEoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDIsIDAgKTsgCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NmIoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDAsIDEgKTsgCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NmMoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDAsIDIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQdXQ2ZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc09mZkxlbiggMiwgMSwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAyLCAxLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NmYoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDEsIDIgKTsgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NmcoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDIsIDAgKTsgCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0NmgoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDIsIDEgKTsgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dDZpKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzT2ZmTGVuKCAyLCAyLCAyICk7IC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbiBDYXNlcyBmb3IgcHV0KCBieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKKworICAgICAgICAjcmVnaW9uIENhc2VzIGZvciBQdXQoIGludCApLCBHZXQoKSAKKyAgICAgICAgLy8gcHV0IDAsIGdldCAwLiAvLyBhbHJlYWR5IHRlc3RlZCBhYm92ZQorICAgICAgICAvLyBwdXQgMCwgZ2V0IDEuIC8vIGZhaWxzIHdpdGggRU9GRXhjZXB0aW9uCisgICAgICAgIC8vIHB1dCAxLCBnZXQgMC4KKyAgICAgICAgLy8gcHV0IDEsIGdldCAxLgorICAgICAgICAvLyBwdXQgMSwgZ2V0IDIuIC8vIGZhaWxzIHdpdGggRU9GRXhjZXB0aW9uCisgICAgICAgIC8vIHB1dCAyLCBnZXQgMC4KKyAgICAgICAgLy8gcHV0IDIsIGdldCAxLgorICAgICAgICAvLyBwdXQgMiwgZ2V0IDIuCisgICAgICAgIC8vIHB1dCAyLCBnZXQgMy4gLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKyAgICAgICAgLy8gcHV0IDEwMDAwLCBnZXQgMTAwMDAuCisKKyAgICAgICAgLy8ganVzdCBsaWtlIGFib3ZlLCBwdXR0aW5nIGJ5dGUgYXJyYXkgaW5zdGVhZAorICAgICAgICAvLyBqdXN0IGxpa2UgYWJvdmUsIGdldHRpbmcgYnl0ZSBhcnJheSBpbnN0ZWFkLgorICAgICAgICAvLyBqdXN0IGxpa2UgYWJvdmUsIHB1dHRpbmcgYW5kIGdldHRpbmcgYnl0ZSBhcnJheS4KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdFB1dEdldCggaW50IG5QdXRzLCBpbnQgbkdldHMgKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuUmVzZXQoKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgblB1dHM7IGkrKyApCisgICAgICAgICAgICAgICAgYnVmLlB1dCggaSApOworCisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIDAgKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPTA7IGkgPCBuR2V0czsgaSsrICkKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIGksICggYnl0ZSApIGJ1Zi5HZXQoKSApOworCisgICAgICAgICAgICBDaGVja0J1ZiggblB1dHMsIG5HZXRzLCBuUHV0cyAtIG5HZXRzICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdFB1dEJ5dGVzR2V0KCBpbnQgblB1dHMsIGludCBuR2V0cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworCisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbIG5QdXRzIF07CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuUHV0czsgaSsrICkKKyAgICAgICAgICAgICAgICBidWZmZXJbIGkgXSA9ICggYnl0ZSApIGk7CisKKyAgICAgICAgICAgIGJ1Zi5QdXQoIGJ1ZmZlciApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAwICk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0wOyBpPG5HZXRzOyBpKysgKQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgaSwgKCBieXRlICkgYnVmLkdldCgpICk7CisKKyAgICAgICAgICAgIENoZWNrQnVmKCBuUHV0cywgbkdldHMsIG5QdXRzLW5HZXRzICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdFB1dEdldEJ5dGVzKCBpbnQgblB1dHMsIGludCBuR2V0cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5SZXNldCgpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuUHV0czsgaSsrICkKKyAgICAgICAgICAgICAgICBidWYuUHV0KCBpICk7CisKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleCggMCApOworCisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbIG5HZXRzIF07CisgICAgICAgICAgICBpbnQgbiA9IGJ1Zi5HZXQoIGJ1ZmZlciApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBNYXRoLk1pbiggblB1dHMsIG5HZXRzICksIG4gKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPTA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgaSwgYnVmZmVyWyBpIF0gKTsKKworICAgICAgICAgICAgQ2hlY2tCdWYoIG5QdXRzLCBuLCBuUHV0cy1uICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVGVzdFB1dEJ5dGVzR2V0Qnl0ZXMoIGludCBuUHV0cywgaW50IG5HZXRzICkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLlJlc2V0KCk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsgblB1dHMgXTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG5QdXRzOyBpKysgKQorICAgICAgICAgICAgICAgIGJ1ZmZlclsgaSBdID0gKCBieXRlICkgaTsKKworICAgICAgICAgICAgYnVmLlB1dCggYnVmZmVyICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIDAgKTsKKworICAgICAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbIG5HZXRzIF07CisgICAgICAgICAgICBpbnQgbiA9IGJ1Zi5HZXQoIGJ1ZmZlciApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBNYXRoLk1pbiggblB1dHMsIG5HZXRzICksIG4gKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPTA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgaSwgYnVmZmVyWyBpIF0gKTsKKworICAgICAgICAgICAgQ2hlY2tCdWYoIG5QdXRzLCBuLCBuUHV0cy1uICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEVuZE9mU3RyZWFtRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWEoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAwLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWIoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAxLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWMoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAxLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEVuZE9mU3RyZWFtRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWQoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAxLCAyICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWUoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAyLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWYoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAyLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWcoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAyLCAyICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEVuZE9mU3RyZWFtRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWgoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAyLCAzICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWkoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAxMDAwMCwgOTk5NSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDFqKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEdldCggMTAwMDAsIDEwMDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MWsoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0KCAxMDAwMDAsIDEwMDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBFbmRPZlN0cmVhbUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDJhKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzR2V0KCAwLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MmIoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXQoIDEsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQyYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc0dldCggMSwgMSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBFbmRPZlN0cmVhbUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDJkKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzR2V0KCAxLCAyICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MmUoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXQoIDIsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQyZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc0dldCggMiwgMSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDJnKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzR2V0KCAyLCAyICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEVuZE9mU3RyZWFtRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MmgoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXQoIDIsIDMgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQyaSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc0dldCggMTAwMDAsIDk5OTUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQyaigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc0dldCggMTAwMDAsIDEwMDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0MmsoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXQoIDEwMDAwMCwgMTAwMDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEVuZE9mU3RyZWFtRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0M2EoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0Qnl0ZXMoIDAsIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQzYigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRHZXRCeXRlcyggMSwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDNjKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEdldEJ5dGVzKCAxLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0M2QoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0Qnl0ZXMoIDEsIDIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRHZXRCeXRlcyggMiwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDNmKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEdldEJ5dGVzKCAyLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0M2coKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0R2V0Qnl0ZXMoIDIsIDIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRHZXRCeXRlcyggMiwgMyApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDNpKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEdldEJ5dGVzKCAxMDAwMCwgOTk5NSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDNqKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEdldEJ5dGVzKCAxMDAwMCwgMTAwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQzaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRHZXRCeXRlcyggMTAwMDAwLCAxMDAwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggRW5kT2ZTdHJlYW1FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQ0YSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc0dldEJ5dGVzKCAwLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0NGIoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXRCeXRlcyggMSwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDRjKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzR2V0Qnl0ZXMoIDEsIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQ0ZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc0dldEJ5dGVzKCAxLCAyICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0NGUoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXRCeXRlcyggMiwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDRmKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzR2V0Qnl0ZXMoIDIsIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQ0ZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RQdXRCeXRlc0dldEJ5dGVzKCAyLCAyICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0NGgoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXRCeXRlcyggMiwgMyApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDRpKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFB1dEJ5dGVzR2V0Qnl0ZXMoIDEwMDAwLCA5OTk1ICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0NGooKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXRCeXRlcyggMTAwMDAsIDEwMDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0NGsoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0UHV0Qnl0ZXNHZXRCeXRlcyggMTAwMDAwLCAxMDAwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQ1YSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGJ1Zi5HZXQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBidWYuR2V0KCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMywgYnVmLkdldCgpICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMywgMywgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldDViKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyLCAzIH0sIDIgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYnVmLkdldCgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIGJ1Zi5HZXQoKSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDIsIDIsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQ1YygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiwgMywgNCwgNSB9LCAxLCAyICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIGJ1Zi5HZXQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAzLCBidWYuR2V0KCkgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAzLCAzLCAwICk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBPdGhlciB0ZXN0cworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBHZXQ2KCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyA1LCA2LCA3LCA4IH0gKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtdIHsgMTEsIDEyLCAxMywgMTQsIDE1IH07CisgICAgICAgICAgICBidWYuR2V0KCBidWZmZXIsIDEsIDMgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgMTEsIGJ1ZmZlclsgMCBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDUsIGJ1ZmZlclsgMSBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDYsIGJ1ZmZlclsgMiBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDcsIGJ1ZmZlclsgMyBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDE1LCBidWZmZXJbIDQgXSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbXBhY3QoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQsIDUgfSwgMSwgMyApOworICAgICAgICAgICAgYnVmLkNvbXBhY3QoKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAzLCAwLCAzICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIGJ1Zi5HZXQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAzLCBidWYuR2V0KCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggNCwgYnVmLkdldCgpICk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBUZXN0IGRhdGEgZ2V0cyAoIGludCwgYnl0ZSwgc2hvcnQsIGV0YyApCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldEJ5dGUxKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxMjcsIDEsIDAsIHVuY2hlY2tlZCggKGJ5dGUpLTEpLCB1bmNoZWNrZWQoIChieXRlKS0xMjgpIH0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgMTI3LCBidWYuR2V0Qnl0ZSgpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDEsIGJ1Zi5HZXRCeXRlKCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgMCwgYnVmLkdldEJ5dGUoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAtMSwgYnVmLkdldEJ5dGUoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAtMTI4ICwgYnVmLkdldEJ5dGUoKSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDUsIDUsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggRW5kT2ZTdHJlYW1FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRCeXRlMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5HZXRCeXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0U2hvcnQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAyLCAxLCB1bmNoZWNrZWQoICggYnl0ZSApIC0yICksIHVuY2hlY2tlZCggKCBieXRlICkgLTEgKSB9ICk7CisgICAgICAgICAgICBpZiAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggc2hvcnQgKSAweDAxMDIsIGJ1Zi5HZXRTaG9ydCgpICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB1bmNoZWNrZWQoICggc2hvcnQgKSAweGZmZmUgKSwgYnVmLkdldFNob3J0KCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggc2hvcnQgKSAweDAyMDEsIGJ1Zi5HZXRTaG9ydCgpICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB1bmNoZWNrZWQoICggc2hvcnQgKSAweGZlZmYgKSwgYnVmLkdldFNob3J0KCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoZWNrQnVmKCA0LCA0LCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEVuZE9mU3RyZWFtRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0U2hvcnQyKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLkdldFNob3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0SW50MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgNCwgMywgMiwgMSwgdW5jaGVja2VkKCAoIGJ5dGUgKSAtNCApLCB1bmNoZWNrZWQoICggYnl0ZSApIC0zICksIAorICAgICAgICAgICAgICAgIHVuY2hlY2tlZCggKCBieXRlICkgLTIgKSwgdW5jaGVja2VkKCAoIGJ5dGUgKSAtMSApIH0gKTsKKyAgICAgICAgICAgIGlmICggRmxleEJ1ZmZlci5saXR0bGVFbmRpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMHgwMTAyMDMwNCwgYnVmLkdldEludCgpICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB1bmNoZWNrZWQoICggaW50ICkgMHhmZmZlZmRmYyApLCBidWYuR2V0SW50KCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4MDQwMzAyMDEsIGJ1Zi5HZXRJbnQoKSApOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdW5jaGVja2VkKCAoIGludCApIDB4ZmNmZGZlZmYgKSwgYnVmLkdldEludCgpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDaGVja0J1ZiggOCwgOCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBFbmRPZlN0cmVhbUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldEludDIoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuR2V0SW50KCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0TG9uZzEoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIHVuY2hlY2tlZCggKCBieXRlICkgLTggKSwgdW5jaGVja2VkKCAoIGJ5dGUgKSAtNyApLCAKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQoICggYnl0ZSApIC02ICksIHVuY2hlY2tlZCggKCBieXRlICkgLTUgKSwgdW5jaGVja2VkKCAoIGJ5dGUgKSAtNCApLCB1bmNoZWNrZWQoICggYnl0ZSApIC0zICksIAorICAgICAgICAgICAgICAgIHVuY2hlY2tlZCggKCBieXRlICkgLTIgKSwgdW5jaGVja2VkKCAoIGJ5dGUgKSAtMSApIH0gKTsKKyAgICAgICAgICAgIGlmICggRmxleEJ1ZmZlci5saXR0bGVFbmRpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMHgwMTAyMDMwNDA1MDYwNzA4TCwgYnVmLkdldExvbmcoKSApOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdW5jaGVja2VkKCAoIGxvbmcgKSAweGZmZmVmZGZjZmJmYWY5ZjhMICksIGJ1Zi5HZXRMb25nKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4MDgwNzA2MDUwNDAzMDIwMUwsIGJ1Zi5HZXRMb25nKCkgKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHVuY2hlY2tlZCggKCBsb25nICkgMHhmOGY5ZmFmYmZjZmRmZWZmTCApLCBidWYuR2V0TG9uZygpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENoZWNrQnVmKCAxNiwgMTYsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggRW5kT2ZTdHJlYW1FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRMb25nMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi5HZXRMb25nKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEVuZE9mU3RyZWFtRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0RmxvYXQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyB9ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEyMzQ1NmUtMTBmLCBidWYuR2V0RmxvYXQoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMjM0NTZlMTBmLCBidWYuR2V0RmxvYXQoKSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDAsIDAsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggRW5kT2ZTdHJlYW1FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRGbG9hdDIoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuR2V0RmxvYXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggRW5kT2ZTdHJlYW1FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXREb3VibGUxKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyB9ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEyMzQ1Njc4OTEyMzQ1Njc4OWUtMTEwLCBidWYuR2V0RG91YmxlKCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMTIzNDU2Nzg5MTIzNDU2Nzg5ZTExMCwgYnVmLkdldERvdWJsZSgpICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMCwgMCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBFbmRPZlN0cmVhbUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldERvdWJsZTIoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuR2V0RG91YmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0RnVsbHkxKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1LCA2IH0gKTsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbIDMgXTsKKyAgICAgICAgICAgIGJ1Zi5HZXRGdWxseSggYiApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAoIGJ5dGUgKSAxLCBiWyAwIF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgMiwgYlsgMSBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDMsIGJbIDIgXSApOworICAgICAgICAgICAgYnVmLkdldEZ1bGx5KCBiICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDQsIGJbIDAgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAoIGJ5dGUgKSA1LCBiWyAxIF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgNiwgYlsgMiBdICk7CisgICAgICAgICAgICBDaGVja0J1ZiggNiwgNiwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBFbmRPZlN0cmVhbUV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldEZ1bGx5MigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisgICAgICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWyAzIF07CisgICAgICAgICAgICBidWYuR2V0RnVsbHkoIGIgKTsgCisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBDYXNlcyBmb3IgRmxleGJ1ZmZlciBQdXQoIEZsZXhCdWZmZXIsIC4uLiApCisKKyAgICAgICAgLy8gcHV0LCBwdXQgRmxleEJ1ZmZlciB3aXRoIHZhbGlkIGJ1ZmZlcgorICAgICAgICAvLyBwdXQsIHB1dCBGbGV4YnVmZmVyIHRvIGEgRmxleGJ1ZmZlciBhcHByb2FjaGluZyBtYXggbGVuZ3RoLCBmYWlscyB3aXRoIElPRXhjZXB0aW9uLgorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQdXRGbGV4QnVmZmVyMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmMCA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IH0gKTsKKyAgICAgICAgICAgIGJ1Zi5QdXQoIGJ1ZjAgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCBidWYwLkxlbmd0aCgpLCBidWYwLkxlbmd0aCgpLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIElPRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0RmxleEJ1ZmZlcjIoKQorICAgICAgICB7CisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZjAgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIgfSApOworICAgICAgICAgICAgaW50IG1heCA9IDQqMTAyNCoxMDI0OworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlWyBtYXggXSApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCBtYXggKTsKKyAgICAgICAgICAgIGJ1Zi5QdXQoIGJ1ZjAgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCBtYXgrYnVmMC5MZW5ndGgoKSwgbWF4K2J1ZjAuTGVuZ3RoKCksIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB1dCwgcHV0IEZsZXhCdWZmZXIgd2l0aCBsZW5ndGggbGFyZ2VyIHRoYW4gYXZhaWxhYmxlIGJ5dGVzLCBmYWlscyB3aXRoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAvLyBwdXQsIHB1dCBGbGV4QnVmZmVyIHdpdGggdmFsaWQgbGVuZ3RoIHZhbHVlCisgICAgICAgIC8vIHB1dCwgcHV0IEZsZXhidWZmZXIgdG8gYSBGbGV4YnVmZmVyIGFwcHJvYWNoaW5nIG1heCBsZW5ndGgsIGZhaWxzIHdpdGggSU9FeGNlcHRpb24uCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBQdXRGbGV4QnVmZmVyMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmMCA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IH0gKTsKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleCggMCApOworICAgICAgICAgICAgYnVmLlB1dCggYnVmMCwgMyApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDMsIDMsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBQdXRGbGV4QnVmZmVyNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmMCA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IH0gKTsKKyAgICAgICAgICAgIGJ1Zi5QdXQoIGJ1ZjAsIDEgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAxLCAxLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIElPRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0RmxleEJ1ZmZlcjUoKSAKKwkgICAgeworCQkgICAgRmxleEJ1ZmZlciBidWYwID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKwkJICAgIGludCBtYXggPSA0KjEwMjQqMTAyNDsKKwkJICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVttYXhdICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIG1heCApOworICAgICAgICAgICAgYnVmLlB1dCggYnVmMCwgMSApOworCQkgICAgQ2hlY2tCdWYoIG1heCsxLCBtYXgrMSwgMCApOworCSAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gQ2FzZXMgZm9yIHZvaWQgcHV0Qnl0ZSggYnl0ZSApCisgICAgICAgIC8vIHB1dEJ5dGUsIHB1dCBieXRlIHZhbHVlIGFuZCBleHBlY3QgZ2V0Qnl0ZSB0byByZXR1cm4gbWF0Y2hlZCB2YWx1ZS4KKyAgICAgICAgLy8gcHV0Qnl0ZSB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0Qnl0ZTEoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IH0gKTsKKyAgICAgICAgICAgIGJ1Zi5QdXRCeXRlKCAoIGJ5dGUgKSAweDAxICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMSwgMSwgMCApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAwICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDB4MDEsIGJ1Zi5HZXRCeXRlKCkgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAxLCAxLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIElPRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0Qnl0ZTIoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF4ID0gNCoxMDI0KjEwMjQ7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbIG1heCBdICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIG1heCApOworICAgICAgICAgICAgYnVmLlB1dEJ5dGUoICggYnl0ZSApIDB4MDEgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCBtYXgrMSwgbWF4KzEsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIENhc2VzIGZvciB2b2lkIFB1dERvdWJsZSggRG91YmxlICkKKyAgICAgICAgLy8gcHV0RG91YmxlLCBwdXQgRG91YmxlIGFuZCBleHBlY3QgZ2V0RG91YmxlIHRvIHJldHVybiBtYXRjaGVkIHZhbHVlLgorICAgICAgICAvLyBwdXREb3VibGUgdG8gYSBGbGV4YnVmZmVyIGFwcHJvYWNoaW5nIG1heCBsZW5ndGgsIGZhaWxzIHdpdGggSU9FeGNlcHRpb24uCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dERvdWJsZTEoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IH0gKTsKKyAgICAgICAgICAgIGJ1Zi5QdXREb3VibGUoIERvdWJsZS5NYXhWYWx1ZSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDgsIDgsIDAgKTsKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleCggMCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBEb3VibGUuTWF4VmFsdWUsIGJ1Zi5HZXREb3VibGUoKSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDgsIDgsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggSU9FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBQdXREb3VibGUyKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1heCA9IDQqMTAyNCoxMDI0OworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlWyBtYXggXSApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCBtYXggKTsKKyAgICAgICAgICAgIGJ1Zi5QdXREb3VibGUoIERvdWJsZS5NaW5WYWx1ZSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIG1heCs4LCBtYXgrOCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gQ2FzZXMgZm9yIHZvaWQgcHV0RmxvYXQoIGZsb2F0ICkKKyAgICAgICAgLy8gcHV0RmxvYXQsIHB1dCBGbG9hdCBhbmQgZXhwZWN0IGdldEZsb2F0IHRvIHJldHVybiBtYXRjaGVkIHZhbHVlLgorICAgICAgICAvLyBwdXRGbG9hdCB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0RmxvYXQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyB9ICk7CisgICAgICAgICAgICBidWYuUHV0RmxvYXQoIGZsb2F0Lk1heFZhbHVlICk7CisgICAgICAgICAgICBDaGVja0J1ZiggNCwgNCwgMCApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAwICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGZsb2F0Lk1heFZhbHVlLCBidWYuR2V0RmxvYXQoKSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDQsIDQsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggSU9FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBQdXRGbG9hdDIoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF4ID0gNCoxMDI0KjEwMjQ7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbIG1heCBdICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIG1heCApOworICAgICAgICAgICAgYnVmLlB1dEZsb2F0KCBmbG9hdC5NaW5WYWx1ZSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIG1heCs0LCBtYXgrNCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gQ2FzZXMgZm9yIHZvaWQgUHV0SW50KCBpbnQgKQorICAgICAgICAvLyBwdXRJbnQsIHB1dCBJbnQgYW5kIGV4cGVjdCBnZXRJbnQgdG8gcmV0dXJuIG1hdGNoZWQgdmFsdWUuCisgICAgICAgIC8vIHB1dEludCB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0SW50MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgfSApOworICAgICAgICAgICAgYnVmLlB1dEludCggaW50Lk1heFZhbHVlICk7CisgICAgICAgICAgICBDaGVja0J1ZiggNCwgNCwgMCApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAwICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGludC5NYXhWYWx1ZSwgYnVmLkdldEludCgpICk7CisgICAgICAgICAgICBDaGVja0J1ZiggNCwgNCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBJT0V4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dEludDIoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF4ID0gNCoxMDI0KjEwMjQ7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbIG1heCBdICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIG1heCApOworICAgICAgICAgICAgYnVmLlB1dEludCggaW50Lk1pblZhbHVlICk7CisgICAgICAgICAgICBDaGVja0J1ZiggbWF4KzQsIG1heCs0LCAwICk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBDYXNlcyBmb3Igdm9pZCBwdXRMb25nKCBsb25nICkKKyAgICAgICAgLy8gcHV0TG9uZywgcHV0IExvbmcgYW5kIGV4cGVjdCBnZXRMb25nIHRvIHJldHVybiBtYXRjaGVkIHZhbHVlLgorICAgICAgICAvLyBwdXRTaG9ydCB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0TG9uZzAoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IH0gKTsKKyAgICAgICAgICAgIGJ1Zi5QdXRMb25nKCBsb25nLk1heFZhbHVlICk7CisgICAgICAgICAgICBDaGVja0J1ZiggOCwgOCwgMCApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCAwICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGxvbmcuTWF4VmFsdWUsIGJ1Zi5HZXRMb25nKCkgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCA4LCA4LCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIElPRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0TG9uZzEoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF4ID0gNCoxMDI0KjEwMjQ7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbIG1heCBdICk7CisgICAgICAgICAgICBidWYuU2V0SW5kZXgoIG1heCApOworICAgICAgICAgICAgYnVmLlB1dExvbmcoIGxvbmcuTWluVmFsdWUgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCBtYXgrOCwgbWF4KzgsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIENhc2VzIGZvciB2b2lkIFB1dFNob3J0KCBzaG9ydCApCisgICAgICAgIC8vIHB1dFNob3J0LCBwdXQgc2hvcnQgYW5kIGV4cGVjdCBnZXRTaG9ydCB0byByZXR1cm4gbWF0Y2hlZCB2YWx1ZS4KKyAgICAgICAgLy8gcHV0U2hvcnQgdG8gYSBGbGV4YnVmZmVyIGFwcHJvYWNoaW5nIG1heCBsZW5ndGgsIGZhaWxzIHdpdGggSU9FeGNlcHRpb24uCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFB1dFNob3J0MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgfSApOworICAgICAgICAgICAgYnVmLlB1dFNob3J0KCBzaG9ydC5NYXhWYWx1ZSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDIsIDIsIDAgKTsKKyAgICAgICAgICAgIGJ1Zi5TZXRJbmRleCggMCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBzaG9ydC5NYXhWYWx1ZSwgYnVmLkdldFNob3J0KCkgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAyLCAyLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIElPRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgUHV0U2hvcnQyKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1heCA9IDQqMTAyNCoxMDI0OworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlWyBtYXggXSApOworICAgICAgICAgICAgYnVmLlNldEluZGV4KCBtYXggKTsKKyAgICAgICAgICAgIGJ1Zi5QdXRTaG9ydCggKCBzaG9ydCApIDEgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCBtYXgrMiwgbWF4KzIsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIENhc2VzIGZvciBGbGV4QnVmZmVyIFNraXAoIGludCwgYm9vbCApCisgICAgICAgIC8vIHNraXAgbGVuZ3RoIDwgMCwgcHV0ID0gZmFsc2UuICAJCQkJLy8gZmFpbHMgd2l0aCBpbGxlZ2FsIGFyZ3VtZW50CisgICAgICAgIC8vIHNraXAgbGVuZ3RoID4gYnVmZmVyIGxlbmd0aCwgcHV0ID0gZmFsc2UuICAJLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKyAgICAgICAgLy8gc2tpcCBsZW5ndGggPSAwLCBwdXQgPSBmYWxzZS4KKyAgICAgICAgLy8gc2tpcCBsZW5ndGggPSBidWZmZXIgbGVuZ3RoLCBwdXQgPSBmYWxzZS4KKyAgICAgICAgLy8gc2tpcCBsZW5ndGggPCBidWZmZXIgbGVuZ3RoLCBwdXQgPSBmYWxzZS4KKyAgICAgICAgLy8gc2tpcCBsZW5ndGggPiBidWZmZXIgbGVuZ3RoLCBwdXQgPSB0cnVlLiAKKyAgICAgICAgLy8gc2tpcCBsZW5ndGggPCBidWZmZXIgbGVuZ3RoLCBwdXQgPSB0cnVlLgkKKyAgICAgICAgLy8gc2tpcCBsZW5ndGggPSBtYXggYnVmZmVyIGxlbmd0aCwgcHV0ID0gdHJ1ZS4JLy8gZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbgorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudEV4Y2VwdGlvbiApICldCisgICAgICAgIHB1YmxpYyB2b2lkIFNraXAxKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyB9ICk7CisgICAgICAgICAgICBidWYuU2tpcCggLTEsIGZhbHNlICk7CQkKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggRW5kT2ZTdHJlYW1FeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBTa2lwMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisgICAgICAgICAgICBidWYuU2tpcCggMywgZmFsc2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTa2lwMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgfSApOworICAgICAgICAgICAgYnVmLlNraXAoIDAsIGZhbHNlICk7CisgICAgICAgICAgICBDaGVja0J1ZiggMCwgMCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNraXA0KCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKyAgICAgICAgICAgIGJ1Zi5Ta2lwKCAyLCBmYWxzZSApOworICAgICAgICAgICAgQ2hlY2tCdWYoIDIsIDIsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTa2lwNSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisgICAgICAgICAgICBidWYuU2tpcCggMSwgZmFsc2UgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAyLCAxLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgU2tpcDYoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIgfSApOworICAgICAgICAgICAgYnVmLlNraXAoIDEsIHRydWUgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCAyLCAxLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgU2tpcDcoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIgfSApOworICAgICAgICAgICAgYnVmLlNraXAoIDUsIHRydWUgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCA1LCA1LCAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIElPRXhjZXB0aW9uICkgKV0KKyAgICAgICAgcHVibGljIHZvaWQgU2tpcDgoKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIgfSApOworCisgICAgICAgICAgICBpbnQgbWF4ID0gNCoxMDI0KjEwMjQ7CisgICAgICAgICAgICBidWYuU2tpcCggbWF4KzEsIHRydWUgKTsKKyAgICAgICAgICAgIENoZWNrQnVmKCBtYXgrMSwgbWF4KzEsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0SFBUaW1lci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0SFBUaW1lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ5ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RIUFRpbWVyLmNzCkBAIC0wLDAgKzEsODQgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RIUFRpbWVyCisgICAgeworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCJvbmUgc3RhcnRpbmciKTsKKworICAgICAgICAgICAgbG9uZyB4ID0gSFBUaW1lci5Ob3coKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhc3NlcnQgdGhhdCB2YWx1ZXMgZnJvbSBIUFRpbWVyLk5vdygpIGFyZSBhbHdheXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCisgICAgICAgICAgICAgICAgbG9uZyB5ID0gSFBUaW1lci5Ob3coKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuR3JlYXRlck9yRXF1YWwoeSwgeCk7CisgICAgICAgICAgICAgICAgbG9uZyBkaWZmID0geSAtIHg7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKHksIDApOworICAgICAgICAgICAgICAgIGludCBpZGlmZiA9IChpbnQpIGRpZmY7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKGlkaWZmLCAwKTsKKyAgICAgICAgICAgICAgICB4ID0geTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuU2xlZXAoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgib25lIGRvbmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCB0d28oKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoInR3byBzdGFydGluZyIpOworCisgICAgICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKGZvbyk7CisgICAgICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKGZvbyk7CisKKyAgICAgICAgICAgIHQxLlN0YXJ0KCk7CisgICAgICAgICAgICB0Mi5TdGFydCgpOworCisgICAgICAgICAgICB0MS5Kb2luKCk7CisgICAgICAgICAgICB0Mi5Kb2luKCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgidHdvIGRvbmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZvbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgeCA9IEhQVGltZXIuTm93KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYXNzZXJ0IHRoYXQgdmFsdWVzIGZyb20gSFBUaW1lci5Ob3coKSBhcmUgYWx3YXlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZworICAgICAgICAgICAgICAgIGxvbmcgeSA9IEhQVGltZXIuTm93KCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKHksIHgpOworICAgICAgICAgICAgICAgIGxvbmcgZGlmZiA9IHkgLSB4OworICAgICAgICAgICAgICAgIEFzc2VydC5HcmVhdGVyT3JFcXVhbCh5LCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgaWRpZmYgPSAoaW50KWRpZmY7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkdyZWF0ZXJPckVxdWFsKGlkaWZmLCAwKTsKKyAgICAgICAgICAgICAgICB4ID0geTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuU2xlZXAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdEhlbHAuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdEhlbHAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhMjZkYgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0SGVscC5jcwpAQCAtMCwwICsxLDgyIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgRXRjaDQuVXRpbC5UZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFRlc3RIZWxwCisgICAgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkIGRlbGF5QW5kU3RhcnQoIGludCBkZWxheSwgVGhyZWFkIHJ1bm5hYmxlICkKKwl7CisJCVRocmVhZCB0ID0gRGVsYXkoIGRlbGF5LCBydW5uYWJsZSApOworCQl0LlN0YXJ0KCk7CisJCXJldHVybiB0OworCX0KKworICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkIERlbGF5KCBpbnQgZGVsYXksICBUaHJlYWQgcnVubmFibGUgKQorCXsKKwkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCBuZXcgVGhyZWFkU3RhcnQoZGVsZWdhdGUoKQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKwkJCQl7CisJCQkJCVRocmVhZC5TbGVlcCggZGVsYXkgKTsKKwkJCQkJcnVubmFibGUuU3RhcnQoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQlDb25zb2xlLldyaXRlTGluZSgiIFRoZSBleGNlcHRpb24gaW4gVGVzdEhlbHAtPmRlbGF5IGlzICIgKyBlKTsKKwkJCQl9ICAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKSk7CisJCQorCQkJCisJCXJldHVybiB0OworCX0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBc3NlcnRSZWxFcnJvcihkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwsIGRvdWJsZSBlcnJvcikKKyAgICB7CisgICAgICAgIGRvdWJsZSByZWxFcnJvciA9IFJlbEVycm9yKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICBpZiAocmVsRXJyb3IgPiBlcnJvcikKKyAgICAgICAgICAgIEFzc2VydC5GYWlsKFN0cmluZy5Gb3JtYXQoImV4cGVjdGVkOiB7MH0gYnV0IHdhczogezF9IHJlbGF0aXZlIGVycm9yOiB7Mn0iLCBleHBlY3RlZCwgYWN0dWFsLCByZWxFcnJvcikpOworICAgICAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIEFzc2VydEFic0Vycm9yKGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgZG91YmxlIGVycm9yKQorICAgIHsKKyAgICAgICAgZG91YmxlIGFic0Vycm9yID0gQWJzRXJyb3IoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgIGlmIChhYnNFcnJvciA+IGVycm9yKQorICAgICAgICAgICAgQXNzZXJ0LkZhaWwoU3RyaW5nLkZvcm1hdCgiZXhwZWN0ZWQ6IHswfSBidXQgd2FzOiB7MX0gcmVsYXRpdmUgZXJyb3I6IHsyfSIsIGV4cGVjdGVkLCBhY3R1YWwsIGVycm9yKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgUmVsRXJyb3IoZG91YmxlIGV4cGVjdGVkLCBkb3VibGUgYWN0dWFsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFic0Vycm9yKGV4cGVjdGVkLCBhY3R1YWwpIC8gZXhwZWN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgQWJzRXJyb3IoZG91YmxlIGV4cGVjdGVkLCBkb3VibGUgYWN0dWFsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1hdGguQWJzKGV4cGVjdGVkIC0gYWN0dWFsKTsKKyAgICB9CisKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0TW9uaXRvci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0TW9uaXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzEzNmIyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RNb25pdG9yLmNzCkBAIC0wLDAgKzEsNDI0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgRXRjaDQuVXRpbC5UZXN0OwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0TW9uaXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBkb3VibGUgUkVMX0VSUk9SID0gMTAwMDAwOworCQorCS8qKiBAICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgY29uc3RydWN0MSgpIAorCXsKKwkJdGVzdGNvbnN0cnVjdDEoIG51bGwgKTsKKwkJdGVzdGNvbnN0cnVjdDEoICJhIiApOworCQl0ZXN0Y29uc3RydWN0MSggImIiICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0Y29uc3RydWN0MSggU3RyaW5nIGRlc2NyICkKKwl7CisJCU1vbml0b3I8T2JqZWN0PiBtID0gbmV3IE1vbml0b3I8T2JqZWN0PiggZGVzY3IgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCBkZXNjciwgbS5HZXREZXNjcmlwdGlvbigpICk7CisJCUFzc2VydC5Jc051bGwoIG0uR2V0KCkgKTsKKwl9CisKKwkvKiogQCAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDIoKSAKKwl7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCBudWxsICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCB0cnVlICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCAxICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCAiYWJjIiApOworCQl0ZXN0Y29uc3RydWN0MiggbnVsbCwgMy4xNDE1OSApOworCQkKKwkJdGVzdGNvbnN0cnVjdDIoICJhIiwgbnVsbCApOworCQl0ZXN0Y29uc3RydWN0MiggImIiLCB0cnVlICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCAiYyIsIDEgKTsKKwkJdGVzdGNvbnN0cnVjdDIoICJkIiwgImFiYyIgKTsKKwkJdGVzdGNvbnN0cnVjdDIoICJlIiwgMy4xNDE1OSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdDIoIFN0cmluZyBkZXNjciwgT2JqZWN0IHZhbHVlICkKKwl7CisJCU1vbml0b3I8T2JqZWN0PiBtID0gbmV3IE1vbml0b3I8T2JqZWN0PiggZGVzY3IsIHZhbHVlICk7CisJCUFzc2VydC5BcmVFcXVhbCggZGVzY3IsIG0uR2V0RGVzY3JpcHRpb24oKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCBtLkdldCgpICk7CisJfQorCQorCS8qKiBAICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgbVRvU3RyaW5nKCkgCisJeworICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIk1vbml0b3IgOiAiLCBuZXcgTW9uaXRvcjxPYmplY3Q+KG51bGwsIG51bGwpLlRvU3RyaW5nKCkpOworCQlBc3NlcnQuQXJlRXF1YWwoICJNb25pdG9yIDogVHJ1ZSIsIG5ldyBNb25pdG9yPE9iamVjdD4oIG51bGwsIHRydWUgKS5Ub1N0cmluZygpICk7CisJCUFzc2VydC5BcmVFcXVhbCggIk1vbml0b3IgOiAxIiwgbmV3IE1vbml0b3I8T2JqZWN0PiggbnVsbCwgMSApLlRvU3RyaW5nKCkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAiTW9uaXRvciA6IGFiYyIsIG5ldyBNb25pdG9yPE9iamVjdD4oIG51bGwsICJhYmMiICkuVG9TdHJpbmcoKSApOworCQlBc3NlcnQuQXJlRXF1YWwoICJNb25pdG9yIDogMy4xNDE1OSIsIG5ldyBNb25pdG9yPE9iamVjdD4oIG51bGwsIDMuMTQxNTkgKS5Ub1N0cmluZygpICk7CisKKwkJQXNzZXJ0LkFyZUVxdWFsKCAiTW9uaXRvciBhOiAiLCBuZXcgTW9uaXRvcjxPYmplY3Q+KCAiYSIsIG51bGwgKS5Ub1N0cmluZygpICk7CisJCUFzc2VydC5BcmVFcXVhbCggIk1vbml0b3IgYjogVHJ1ZSIsIG5ldyBNb25pdG9yPE9iamVjdD4oICJiIiwgdHJ1ZSApLlRvU3RyaW5nKCkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAiTW9uaXRvciBjOiAxIiwgbmV3IE1vbml0b3I8T2JqZWN0PiggImMiLCAxICkuVG9TdHJpbmcoKSApOworCQlBc3NlcnQuQXJlRXF1YWwoICJNb25pdG9yIGQ6IGFiYyIsIG5ldyBNb25pdG9yPE9iamVjdD4oICJkIiwgImFiYyIgKS5Ub1N0cmluZygpICk7CisJCUFzc2VydC5BcmVFcXVhbCggIk1vbml0b3IgZTogMy4xNDE1OSIsIG5ldyBNb25pdG9yPE9iamVjdD4oICJlIiwgMy4xNDE1OSApLlRvU3RyaW5nKCkgKTsKKwl9CisJCisJLyoqIEAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBTZXQxKCkgCisJeworCQlNb25pdG9yPE9iamVjdD4gbSA9IG5ldyBNb25pdG9yPE9iamVjdD4oICJhIiwgbnVsbCApOworCQlBc3NlcnQuQXJlRXF1YWwoIG51bGwsIG0uU2V0KCAxICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAxLCBtLlNldCggMiApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMiwgbS5TZXQoIG51bGwgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIG51bGwsIG0uU2V0KCBudWxsICkgKTsKKwl9CisJCisJLyoqIEAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBTZXQyKCkgCisJeworCQlNb25pdG9yPE9iamVjdD4gbSA9IG5ldyBNb25pdG9yPE9iamVjdD4oICJhIiwgMSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDEsIG0uU2V0KCAyICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAyLCBtLlNldCggbnVsbCApICk7CisJCUFzc2VydC5BcmVFcXVhbCggbnVsbCwgbS5TZXQoIG51bGwgKSApOworCX0KKwkKKwkvKiogQCAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIFNldEdldCgpIAorCXsKKwkJTW9uaXRvcjxPYmplY3Q+IG0gPSBuZXcgTW9uaXRvcjxPYmplY3Q+KCAiYSIsIDEgKTsKKwkJCisJCUFzc2VydC5BcmVFcXVhbCggMSwgbS5TZXQoIDIgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDIsIG0uR2V0KCkgKTsKKwkJCisJCUFzc2VydC5BcmVFcXVhbCggMiwgbS5TZXQoIG51bGwgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIG51bGwsIG0uR2V0KCkgKTsKKwkJCisJCUFzc2VydC5BcmVFcXVhbCggbnVsbCwgbS5TZXQoIG51bGwgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIG51bGwsIG0uR2V0KCkgKTsKKwl9CisJCisJLyoqIEAgKi8KKyAgICAgICAgW0lnbm9yZV0KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBTZXRzeW5jKCkgCisJeworCQkgTW9uaXRvcjxpbnQ/PiBtID0gbmV3IE1vbml0b3I8aW50Pz4oICJhIiwgbnVsbCApOworCQkgYm9vbFtdIGZsYWcgPSBuZXcgYm9vbFsyMDAwXTsKKworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KCBkZWxlZ2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJCQkJeworCQkJCQlpbnQ/IHggPSBtLlNldCggaSApOworCQkJCQkKKwkJCQkJCWZsYWdbeC5HZXRWYWx1ZU9yRGVmYXVsdCgpXSA9IHRydWU7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisJICAgIFRocmVhZCB0MSA9IFRlc3RIZWxwLkRlbGF5KDEwMDAsIHQpOworCisKKwkgICAgVGhyZWFkIHQyID0gVGVzdEhlbHAuRGVsYXkoMTAwMCwgbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoZGVsZWdhdGUoKQorCSAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDEwMDA7IGkgPCAyMDAwOyBpKyspCisJCQkJICAgICAgICAgeworCQkJCQkgICAgICAgICAgICBpbnQ/IHggPSBtLlNldCggaSApOwkJCQkJCisJCQkJCQkgICAgICAgIGZsYWdbeC5HZXRWYWx1ZU9yRGVmYXVsdCgpXSA9IHRydWU7CisJCQkJICAgICAgICAgfQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICApKSk7CisJCQorCisJCXQxLlN0YXJ0KCk7CisJCXQyLlN0YXJ0KCk7CisJCQorCQl0MS5Kb2luKCk7CisJCXQyLkpvaW4oKTsKKwkJCisJCWludD8geDEgPSBtLlNldCggbnVsbCApOworCQkKKwkJCWZsYWdbeDEuR2V0VmFsdWVPckRlZmF1bHQoKV0gPSB0cnVlOworCQkKKwkJZm9yZWFjaCAoYm9vbCBiICBpbiBmbGFnKQorCQkJQXNzZXJ0LklzVHJ1ZSggYiApOworCX0KKwkKKwkvKiogQCAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxMSgpIAorCXsKKwkJTW9uaXRvcjxpbnQ/PiBtID0gbmV3IE1vbml0b3I8aW50Pz4oICJhIiwgbnVsbCApOworCQltLldhaXRVbnRpbEVxKCBudWxsICk7CisJCW0uV2FpdFVudGlsRXEoIG51bGwsIDAgKTsKKwkJCisJCW0uU2V0KCAxICk7CisJCW0uV2FpdFVudGlsRXEoIDEgKTsKKwkJbS5XYWl0VW50aWxFcSggMSwgMCApOworCQkKKwkJbS5TZXQoIDIgKTsKKwkJbS5XYWl0VW50aWxFcSggMiApOworCQltLldhaXRVbnRpbEVxKCAyLCAwICk7CisJfQorCQorCS8qKiBAICovCisJW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24pKV0KKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxFcTIoKSAKKwl7CisJCU1vbml0b3I8aW50Pz4gbSA9IG5ldyBNb25pdG9yPGludD8+KCAiYSIsIDEgKTsKKwkJbS5XYWl0VW50aWxFcSggMiwgMSApOworCX0KKwkKKwkvKiogQCAqLworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbikpXQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxMygpIAorCXsKKwkJTW9uaXRvcjxpbnQ/PiBtID0gbmV3IE1vbml0b3I8aW50Pz4oICJhIiwgbnVsbCApOworCQltLldhaXRVbnRpbEVxKCAyLCAxICk7CisJfQorCQorCS8qKiBAICovCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uKSldCisJcHVibGljIHZvaWQgd2FpdFVudGlsRXE0KCkgCisJeworCQlNb25pdG9yPGludD8+IG0gPSBuZXcgTW9uaXRvcjxpbnQ/PiggImEiLCAxICk7CisJCW0uV2FpdFVudGlsRXEoIG51bGwsIDEgKTsKKwl9CisJCisJLyoqIEAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3RFcTEoKSAKKwl7CisJCU1vbml0b3I8aW50Pz4gbSA9IG5ldyBNb25pdG9yPGludD8+KCAiYSIsIG51bGwgKTsKKwkJbS5XYWl0VW50aWxOb3RFcSggMSApOworCQltLldhaXRVbnRpbE5vdEVxKCAxLCAwICk7CisJCQorCQltLlNldCggMSApOworCQltLldhaXRVbnRpbE5vdEVxKCBudWxsICk7CisJCW0uV2FpdFVudGlsTm90RXEoIG51bGwsIDAgKTsKKwl9CisJCisJLyoqIEAgKi8KKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24pKV0KKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3RFcTIoKSAKKwl7CisJCU1vbml0b3I8aW50Pz4gbSA9IG5ldyBNb25pdG9yPGludD8+KCAiYSIsIG51bGwgKTsKKwkJbS5XYWl0VW50aWxOb3RFcSggbnVsbCwgMSApOworCX0KKwkKKwkvKiogQCAqLworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbikpXQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxMygpIAorCXsKKwkJTW9uaXRvcjxpbnQ/PiBtID0gbmV3IE1vbml0b3I8aW50Pz4oICJhIiwgMSApOworCQltLldhaXRVbnRpbE5vdEVxKCAxLCAxICk7CisJfQorCQorCS8qKiBAICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgd2FpdFVudGlsRXFBbmRTZXQxKCkgCisJeworCQlNb25pdG9yPGludD8+IG0gPSBuZXcgTW9uaXRvcjxpbnQ/PiggImEiLCBudWxsICk7CisJCUFzc2VydC5BcmVFcXVhbCggbnVsbCwgbS5XYWl0VW50aWxFcUFuZFNldCggbnVsbCwgMSApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMSwgbS5XYWl0VW50aWxFcUFuZFNldCggMSwgMiApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMiwgbS5XYWl0VW50aWxFcUFuZFNldCggMiwgbnVsbCApICk7CisJCUFzc2VydC5BcmVFcXVhbCggbnVsbCwgbS5XYWl0VW50aWxFcUFuZFNldCggbnVsbCwgbnVsbCApICk7CisKKwkJQXNzZXJ0LkFyZUVxdWFsKCBudWxsLCBtLldhaXRVbnRpbEVxQW5kU2V0KCBudWxsLCAwLCAxICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAxLCBtLldhaXRVbnRpbEVxQW5kU2V0KCAxLCAwLCAyICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCAyLCBtLldhaXRVbnRpbEVxQW5kU2V0KCAyLCAwLCBudWxsICkgKTsKKwkJQXNzZXJ0LkFyZUVxdWFsKCBudWxsLCBtLldhaXRVbnRpbEVxQW5kU2V0KCBudWxsLCAwLCBudWxsICkgKTsKKwl9CisJCisJLyoqIEAgKi8KKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24pKV0KKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxFcUFuZFNldDIoKSAKKwl7CisJCU1vbml0b3I8aW50Pz4gbSA9IG5ldyBNb25pdG9yPGludD8+KCAiYSIsIG51bGwgKTsKKwkJdHJ5CisJCXsKKwkJCW0uV2FpdFVudGlsRXFBbmRTZXQoIDEsIDEsIDIgKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCUFzc2VydC5BcmVFcXVhbCggbnVsbCwgbS5HZXQoKSApOworCQl9CisJfQorCQorCS8qKiBAICovCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uKSldCisJcHVibGljIHZvaWQgd2FpdFVudGlsRXFBbmRTZXQzKCkgCisJeworCQlNb25pdG9yPGludD8+IG0gPSBuZXcgTW9uaXRvcjxpbnQ/PiggImEiLCAxICk7CisJCXRyeQorCQl7CisJCQltLldhaXRVbnRpbEVxQW5kU2V0KCBudWxsLCAxLCAyICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQlBc3NlcnQuQXJlRXF1YWwoIDEsIG0uR2V0KCkgKTsKKwkJfQorCX0KKwkKKwkvKiogQCAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxQW5kU2V0MSgpIAorCXsKKwkJTW9uaXRvcjxpbnQ/PiBtID0gbmV3IE1vbml0b3I8aW50Pz4oICJhIiwgbnVsbCApOworCQlBc3NlcnQuQXJlRXF1YWwoIG51bGwsIG0uV2FpdFVudGlsTm90RXFBbmRTZXQoIDIsIDEgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDEsIG0uV2FpdFVudGlsTm90RXFBbmRTZXQoIDMsIDIgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIDIsIG0uV2FpdFVudGlsTm90RXFBbmRTZXQoIDQsIG51bGwgKSApOworCQlBc3NlcnQuQXJlRXF1YWwoIG51bGwsIG0uV2FpdFVudGlsTm90RXFBbmRTZXQoIDUsIG51bGwgKSApOworCisJCUFzc2VydC5BcmVFcXVhbCggbnVsbCwgbS5XYWl0VW50aWxOb3RFcUFuZFNldCggMiwgMCwgMSApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMSwgbS5XYWl0VW50aWxOb3RFcUFuZFNldCggMywgMCwgMiApICk7CisJCUFzc2VydC5BcmVFcXVhbCggMiwgbS5XYWl0VW50aWxOb3RFcUFuZFNldCggNCwgMCwgbnVsbCApICk7CisJCUFzc2VydC5BcmVFcXVhbCggbnVsbCwgbS5XYWl0VW50aWxOb3RFcUFuZFNldCggNSwgMCwgbnVsbCApICk7CisJfQorCQorCS8qKiBAICovCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uKSldCisJcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXFBbmRTZXQyKCkgCisJeworCQlNb25pdG9yPGludD8+IG0gPSBuZXcgTW9uaXRvcjxpbnQ/PiggImEiLCBudWxsICk7CisJCXRyeQorCQl7CisJCQltLldhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCAxLCAxICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQlBc3NlcnQuQXJlRXF1YWwoIG51bGwsIG0uR2V0KCkgKTsKKwkJfQorCX0KKwkKKwkvKiogQCAqLworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbikpXQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxQW5kU2V0MygpIAorCXsKKwkJTW9uaXRvcjxpbnQ/PiBtID0gbmV3IE1vbml0b3I8aW50Pz4oICJhIiwgMSApOworCQl0cnkKKwkJeworCQkJbS5XYWl0VW50aWxOb3RFcUFuZFNldCggMSwgMSwgbnVsbCApOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJQXNzZXJ0LkFyZUVxdWFsKCAxLCBtLkdldCgpICk7CisJCX0KKwl9CisJCisJLyoqIEAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxFcTUoKSAKKwl7CisJICAgIE1vbml0b3I8aW50Pz4gbSA9IG5ldyBNb25pdG9yPGludD8+KCAiYSIsIG51bGwgKTsKKwkJCisJCVRocmVhZCB0ID0gVGVzdEhlbHAuZGVsYXlBbmRTdGFydCggMjAwLCBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChkZWxlZ2F0ZSgpCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uU2V0KCAxICk7IAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisKKworCSAgICBsb25nIHQwID0gSFBUaW1lci5Ob3coKTsKKwkJbS5XYWl0VW50aWxFcSggMSApOworCQlkb3VibGUgdDEgPSAoSFBUaW1lci5Ob3coKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJVGVzdEhlbHAuQXNzZXJ0UmVsRXJyb3IoIDIwMCwgdDEsIFJFTF9FUlJPUiApOworCQkKKwkJdC5Kb2luKCk7CisJfQorCQorCS8qKiBAICovCisJW1Rlc3RdCisJcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXE0KCkgCisJeworCQkgICBNb25pdG9yPGludD8+IG0gPSBuZXcgTW9uaXRvcjxpbnQ/PiggImEiLCBudWxsICk7CisJCQorCQlUaHJlYWQgdCA9IFRlc3RIZWxwLmRlbGF5QW5kU3RhcnQoIDIwMCwgbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoZGVsZWdhdGUoKQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLlNldCggMSApOyAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOworCisKKwkJbG9uZyB0MCA9IEhQVGltZXIuTm93KCk7CisJCW0uV2FpdFVudGlsTm90RXEoIG51bGwgKTsKKwkJZG91YmxlIHQxID0gKEhQVGltZXIuTm93KCkgLSB0MCkgLyAxMDAwMDAwLjA7CisJCVRlc3RIZWxwLkFzc2VydFJlbEVycm9yKCAyMDAsIHQxLCBSRUxfRVJST1IgKTsKKwkJCisJCXQuSm9pbigpOworCX0KKwkKKwkvKiogQCAqLworCVtUZXN0XQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxQW5kU2V0NCgpIAorCXsKKwkJTW9uaXRvcjxpbnQ/PiBtID0gbmV3IE1vbml0b3I8aW50Pz4oICJhIiwgbnVsbCApOworCQkKKwkJVGhyZWFkIHQgPSBUZXN0SGVscC5kZWxheUFuZFN0YXJ0KCAyMDAsIG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KGRlbGVnYXRlKCkKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5TZXQoIDEgKTsgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKworCSAgICBsb25nIHQwID0gSFBUaW1lci5Ob3coKTsKKwkJbS5XYWl0VW50aWxFcUFuZFNldCggMSwgMiApOworCQlkb3VibGUgdDEgPSAoSFBUaW1lci5Ob3coKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJLy8gVE9ETyBpcyB0aGVyZSBhIGJldHRlciB3YXkgZm9yIGNob29zaW5nIHJlbGF0aXZlIGVycm9yPworCQlUZXN0SGVscC5Bc3NlcnRSZWxFcnJvciggMjAwLCB0MSwgUkVMX0VSUk9SICk7CisJCQorCQl0LkpvaW4oKTsKKwl9CisJCisJLyoqIEAgKi8KKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3RFcUFuZFNldDQoKSAKKwl7CisgICAgICAgIE1vbml0b3I8aW50Pz4gbSA9IG5ldyBNb25pdG9yPGludD8+KCJhIiwgbnVsbCk7CisKKyAgICAgICAgVGhyZWFkIHQgPSBUZXN0SGVscC5kZWxheUFuZFN0YXJ0KDIwMCwgbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoZGVsZWdhdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5TZXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKworCSAgICBsb25nIHQwID0gSFBUaW1lci5Ob3coKTsKKwkJbS5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgMiApOworICAgICAgICBkb3VibGUgdDEgPSAoSFBUaW1lci5Ob3coKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJVGVzdEhlbHAuQXNzZXJ0UmVsRXJyb3IoIDIwMCwgdDEsIFJFTF9FUlJPUiApOworCQkKKwkJdC5Kb2luKCk7CisJfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RQYWNrZXRpemVyLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RQYWNrZXRpemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTQwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFBhY2tldGl6ZXIuY3MKQEAgLTAsMCArMSw3MDEgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RQYWNrZXRpemVyCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBNeVBhY2tldEhhbmRsZXIgbXBoIDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUGFja2V0aXplciBwIDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTXlEYXRhSGFuZGxlciBkaDsKKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RQYWNrZXRpemVyIiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0VXAoKQorICAgICAgICB7CisgICAgICAgICAgICBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisgICAgICAgICAgICBwID0gbmV3IFBhY2tldGl6ZXIoZGgsInRjcDoiLG51bGwpOworICAgICAgICAgICAgbXBoID0gbmV3IE15UGFja2V0SGFuZGxlciggcCk7CisgICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIER1bW15V2hvIDogV2hvIAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgRHVtbXlXaG8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFdobyB3aG9EdW1teSA9IG5ldyBEdW1teVdobygpOworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTZW5kUGFja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0VXAoKTsKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0gKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnl0ZVtdW10gcmVzdWx0ID0gKCBGbGV4QnVmZmVyLmxpdHRsZUVuZGlhbiApPyBuZXcgYnl0ZVtdW10geyBuZXcgYnl0ZVtdIHsgMjM5LCAxOTAsIDE3MywgMjIyLCAwLCAwLCAwLCAwIH0sIH0gOgorICAgICAgICAgICAgICAgIG5ldyBieXRlW11bXSB7IG5ldyBieXRlW10geyAyMjIsIDE3MywgMTkwLCAyMzksIDAsIDAsIDAsIDAgfSwgfTsKKworICAgICAgICAvLyAgICBwLlBhY2tldCggd2hvRHVtbXksIGJ1ZiApOworICAgICAgICAgICAgcC5UcmFuc3BvcnRQYWNrZXQod2hvRHVtbXksYnVmKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggZGgud2hhdCwgV2hhdC5EQVRBICk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBkaC5DaGVjayggcmVzdWx0ICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTZW5kUGFja2V0MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFVwKCk7CisgICAgICAgICAgICAvLyBDcmVhdGUgUGFja2V0IHRvIHNlbmQKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxIH0gKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnl0ZVtdW10gcmVzdWx0ID0gKCBGbGV4QnVmZmVyLmxpdHRsZUVuZGlhbiApID8gbmV3IGJ5dGVbXVtdIHsgbmV3IGJ5dGVbXSB7IDIzOSwgMTkwLCAxNzMsIDIyMiwgMSwgMCwgMCwgMCwgMSB9LCAgfSA6IAorICAgICAgICAgICAgICAgIG5ldyBieXRlW11bXSB7IG5ldyBieXRlW10geyAyMjIsIDE3MywgMTkwLCAyMzksIDAsIDAsIDAsIDEsIDEgfSwgIH07CisKKyAgICAgICAgLy8gICAgcC5QYWNrZXQoIG51bGwsIGJ1ZiApOworICAgICAgICAgICAgcC5UcmFuc3BvcnRQYWNrZXQobnVsbCxidWYpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBkaC53aGF0LCBXaGF0LkRBVEEgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGRoLkNoZWNrKCByZXN1bHQgKSApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueHNlbmRlciApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueGJ1ZiApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgU2VuZFBhY2tldDIoKSAKKwkgICAgeworICAgICAgICAgICAgU2V0VXAoKTsKKwkJICAgIC8vIENyZWF0ZSBQYWNrZXQgdG8gc2VuZAorCQkgICAgRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciAobmV3IGJ5dGVbXSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDMgfSk7CisgICAgICAgICAgICBieXRlW11bXSByZXN1bHQgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgYnl0ZVtdW10geyBuZXcgYnl0ZVtdIHsgMjM5LCAxOTAsIDE3MywgMjIyLCAyLCAwLCAwLCAwLCAyLCAzIH0sIH0gOiAKKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdW10geyBuZXcgYnl0ZVtdIHsgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAyLCAyLCAzIH0sIH07CisgICAgCQkKKwkJICAgIHAuVHJhbnNwb3J0UGFja2V0KG51bGwsIGJ1Zik7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGRoLndoYXQsIFdoYXQuREFUQSApOworCQkgICAgQXNzZXJ0LklzVHJ1ZShkaC5DaGVjayhyZXN1bHQpKTsKKwkJICAgIEFzc2VydC5Jc051bGwoZGgueHNlbmRlcik7CisJCSAgICBBc3NlcnQuSXNOdWxsKGRoLnhidWYpOworCSAgICB9CisgICAgICAgIAorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gdGhlc2UgdGVzdHMgYXJlIGZvciBhIHNpbmdsZSBQYWNrZXQgaW4gYSBzaW5nbGUgYnVmZmVyIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTZW5kU2luZ2xlU2luZ2xlRGF0YTAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRVcCgpOworICAgICAgICAgICAgLy8gQ3JlYXRlIERhdGEgdG8gc2VuZAorICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIzOSwgMTkwLCAxNzMsIDIyMiwgMCwgMCwgMCwgMCB9ICkgOgorICAgICAgICAgICAgICAgIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAwIH0gKTsKKwkJICAgIAorICAgICAgICAgICAgYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdIHsgfTsKKyAgICAJCQorCQkgICAgcC5TZXNzaW9uRGF0YShudWxsLCBidWYpOworCQkgICAgQXNzZXJ0LklzVHJ1ZShtcGguQ2hlY2socmVzdWx0KSk7CisgICAgCQkKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLndoYXQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueHNlbmRlcik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54YnVmKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFNlbmRTaW5nbGVTaW5nbGVEYXRhMSgpIAorCSAgICB7CisgICAgICAgICAgICBTZXRVcCgpOworCQkgICAgLy8gbGVuZ3RoID0gMQorICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIzOSwgMTkwLCAxNzMsIDIyMiwgMSwgMCwgMCwgMCwgMSB9ICkgOgorICAgICAgICAgICAgICAgIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAxLCAxIH0gKTsKKworCQkgICAgYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdIHsgbmV3IGJ5dGVbXSB7IDEgfSwgIH07CisgICAgCQkKKwkJICAgIHAuU2Vzc2lvbkRhdGEobnVsbCwgYnVmKTsKKwkJICAgIEFzc2VydC5Jc1RydWUobXBoLkNoZWNrKHJlc3VsdCkpOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwobXBoLndoYXQsIFdoYXQuUEFDS0VUKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhzZW5kZXIpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueGJ1Zik7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBTZW5kU2luZ2xlU2luZ2xlRGF0YTIoKSAgCisJICAgIHsKKyAgICAgICAgICAgIFNldFVwKCk7CisJCSAgICAvLyBsZW5ndGggPSAyCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZiA9ICggRmxleEJ1ZmZlci5saXR0bGVFbmRpYW4gKSA/IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjM5LCAxOTAsIDE3MywgMjIyLCAyLCAwLCAwLCAwLCAzLCA0IH0gKSA6CisgICAgICAgICAgICAgICAgbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAyMjIsIDE3MywgMTkwLCAyMzksIDAsIDAsIDAsIDIsIDMsIDQgfSApOworCisJCSAgICBieXRlW11bXSByZXN1bHQgPSBuZXcgYnl0ZVtdW10geyBuZXcgYnl0ZVtdIHsgMywgNCB9LCB9OworICAgIAkJCisJCSAgICBwLlNlc3Npb25EYXRhKG51bGwsIGJ1Zik7CisJCSAgICBBc3NlcnQuSXNUcnVlKG1waC5DaGVjayhyZXN1bHQpKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKG1waC53aGF0LCBXaGF0LlBBQ0tFVCk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhidWYpOworCSAgICB9CisgICAgCQorCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCSAgICAvLyB0aGVzZSB0ZXN0cyBhcmUgZm9yIHR3byBQYWNrZXRzIGluIGEgc2luZ2xlIGJ1ZmZlciAvLworCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFNlbmREb3VibGVTaW5nbGVEYXRhMCgpICAKKwkgICAgeworICAgICAgICAgICAgU2V0VXAoKTsKKwkJICAgIC8vIGxlbmd0aCA9IDAKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmID0gKCBGbGV4QnVmZmVyLmxpdHRsZUVuZGlhbiApID8gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAyMzksIDE5MCwgMTczLCAyMjIsIDAsIDAsIDAsIDAsIDIzOSwgMTkwLCAxNzMsIDIyMiwgMCwgMCwgMCwgMCB9ICkgOiAKKyAgICAgICAgICAgICAgICBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIyMiwgMTczLCAxOTAsIDIzOSwgMCwgMCwgMCwgMCwgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAwIH0gKTsKKworCQkgICAgYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdIHt9OworICAgIAkJCisJCSAgICBwLlNlc3Npb25EYXRhKG51bGwsIGJ1Zik7CisgICAgCQkKKwkJICAgIEFzc2VydC5Jc1RydWUobXBoLkNoZWNrKHJlc3VsdCkpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgud2hhdCk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54YnVmKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhzZW5kZXIpOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgU2VuZERvdWJsZVNpbmdsZURhdGExKCkgIAorCSAgICB7CisgICAgICAgICAgICBTZXRVcCgpOworCQkgICAgLy8gbGVuZ3RoID0gMQorICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICk/IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjM5LCAxOTAsIDE3MywgMjIyLCAxLCAwLCAwLCAwLCAxLCAyMzksIDE5MCwgMTczLCAyMjIsIDEsIDAsIDAsIDAsIDIgfSApIDogCisgICAgICAgICAgICAgICAgbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAyMjIsIDE3MywgMTkwLCAyMzksIDAsIDAsIDAsIDEsIDEsIDIyMiwgMTczLCAxOTAsIDIzOSwgMCwgMCwgMCwgMSwgMiB9ICk7CisKKwkJICAgIGJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW11bXSB7IG5ldyBieXRlW10geyAxIH0sIG5ldyBieXRlW10geyAyIH0gfTsKKyAgICAJCQorCQkgICAgcC5TZXNzaW9uRGF0YShudWxsLCBidWYpOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNUcnVlKG1waC5DaGVjayhyZXN1bHQpKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbChtcGgud2hhdCwgV2hhdC5QQUNLRVQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueHNlbmRlcik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54YnVmKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFNlbmREb3VibGVTaW5nbGVEYXRhMigpICAKKwkgICAgeworICAgICAgICAgICAgU2V0VXAoKTsKKwkJICAgIC8vIGxlbmd0aCA9IDIKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmID0gKCBGbGV4QnVmZmVyLmxpdHRsZUVuZGlhbiApID8gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAyMzksIDE5MCwgMTczLCAyMjIsIDIsIDAsIDAsIDAsIDMsIDQsIDIzOSwgMTkwLCAxNzMsIDIyMiwgMiwgMCwgMCwgMCwgNSwgNiB9ICkgOiAKKyAgICAgICAgICAgICAgICBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIyMiwgMTczLCAxOTAsIDIzOSwgMCwgMCwgMCwgMiwgMywgNCwgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAyLCA1LCA2IH0gKTsKKworCQkgICAgYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdIHsgbmV3IGJ5dGVbXSB7IDMsIDQgfSwgbmV3IGJ5dGVbXSB7IDUsIDYgfSB9IDsKKyAgICAJCQorCQkgICAgcC5TZXNzaW9uRGF0YShudWxsLCBidWYpOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNUcnVlKG1waC5DaGVjayhyZXN1bHQpKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbChtcGgud2hhdCwgV2hhdC5QQUNLRVQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueGJ1Zik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkgICAgfQorICAgIAkKKwkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCSAgICAvLyB0aGVzZSB0ZXN0cyBhcmUgZm9yIHR3byBQYWNrZXRzIGluIHR3byBidWZmZXJzIHdpdGggaGVhZGVyIHNwbGl0IC8vCisJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBTZW5kRG91YmxlU2luZ2xlX0hlYWRlclNwbGl0X0RhdGEwKCkgIAorCSAgICB7CisgICAgICAgICAgICBTZXRVcCgpOworCQkgICAgLy8gbGVuZ3RoID0gMAorICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIzOSwgMTkwLCAxNzMsIDIyMiwgMCwgMCB9ICkgOiAKKyAgICAgICAgICAgICAgICBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIyMiwgMTczLCAxOTAsIDIzOSwgMCwgMCB9ICk7CisJCSAgICBieXRlW11bXSByZXN1bHQgPSBuZXcgYnl0ZVtdW10geyB9IDsKKyAgICAJCQorCQkgICAgcC5TZXNzaW9uRGF0YShudWxsLCBidWYpOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNUcnVlKG1waC5DaGVjayhyZXN1bHQpKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLndoYXQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueHNlbmRlcik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54YnVmKTsKKworICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYyID0gKCBGbGV4QnVmZmVyLmxpdHRsZUVuZGlhbiApID8gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAwLCAwLCAyMzksIDE5MCwgMTczLCAyMjIsIDAsIDAsIDAsIDAgfSApIDoKKyAgICAgICAgICAgICAgICBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDAsIDAsIDIyMiwgMTczLCAxOTAsIDIzOSwgMCwgMCwgMCwgMCB9ICk7CisJCSAgICBieXRlW11bXSByZXN1bHQyID0gbmV3IGJ5dGVbXVtdIHt9OworICAgIAkJCisJCSAgICBwLlNlc3Npb25EYXRhKG51bGwsIGJ1ZjIpOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNUcnVlKG1waC5DaGVjayhyZXN1bHQyKSk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC53aGF0KTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhzZW5kZXIpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueGJ1Zik7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBTZW5kRG91YmxlU2luZ2xlX0hlYWRlclNwbGl0X0RhdGExKCkgIAorCSAgICB7CisgICAgICAgICAgICBTZXRVcCgpOworCQkgICAgLy8gbGVuZ3RoID0gMQorICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIzOSwgMTkwLCAxNzMsIDIyMiwgMSwgMCB9ICkgOiAKKyAgICAgICAgICAgICAgICBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIyMiwgMTczLCAxOTAsIDIzOSwgMCwgMCB9ICk7CisJCSAgICBieXRlW11bXSByZXN1bHQgPSBuZXcgYnl0ZVtdW10geyB9IDsKKyAgICAJCQorCQkgICAgcC5TZXNzaW9uRGF0YShudWxsLCBidWYpOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNUcnVlKG1waC5DaGVjayhyZXN1bHQpKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLndoYXQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueHNlbmRlcik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54YnVmKTsKKworICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYyID0gKCBGbGV4QnVmZmVyLmxpdHRsZUVuZGlhbiApID8gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAwLCAwLCAxLCAyMzksIDE5MCwgMTczLCAyMjIsIDEsIDAsIDAsIDAsIDIgfSApIDogCisgICAgICAgICAgICAgICAgbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAwLCAxLCAxLCAyMjIsIDE3MywgMTkwLCAyMzksIDAsIDAsIDAsIDEsIDIgfSApOworCQkgICAgYnl0ZVtdW10gcmVzdWx0MiA9IG5ldyBieXRlW11bXSB7bmV3IGJ5dGVbXSB7IDEgfSwgbmV3IGJ5dGVbXSB7IDIgfX07CisgICAgCQkKKwkJICAgIHAuU2Vzc2lvbkRhdGEobnVsbCwgYnVmMik7CisgICAgCQkKKwkJICAgIEFzc2VydC5Jc1RydWUobXBoLkNoZWNrKHJlc3VsdDIpKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbChtcGgud2hhdCwgV2hhdC5QQUNLRVQpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueHNlbmRlcik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54YnVmKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHNlbmREb3VibGVTaW5nbGVfSGVhZGVyU3BsaXRfRGF0YTIoKSAgCisJICAgIHsKKyAgICAgICAgICAgIFNldFVwKCk7CisJCSAgICAvLyBsZW5ndGggPSAyCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZiA9ICggRmxleEJ1ZmZlci5saXR0bGVFbmRpYW4gKSA/IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjM5LCAxOTAsIDE3MywgMjIyLCAyLCAwIH0gKSA6IAorICAgICAgICAgICAgICAgIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwIH0gKTsKKwkJICAgIGJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW11bXSB7IH0gOworICAgIAkJCisJCSAgICBwLlNlc3Npb25EYXRhKG51bGwsIGJ1Zik7CisgICAgCQkKKwkJICAgIEFzc2VydC5Jc1RydWUobXBoLkNoZWNrKHJlc3VsdCkpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgud2hhdCk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhidWYpOworCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZjIgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDAsIDAsIDMsIDQsIDIzOSwgMTkwLCAxNzMsIDIyMiwgMiwgMCwgMCwgMCwgNSwgNiB9ICkgOgorICAgICAgICAgICAgICAgIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMCwgMiwgMywgNCwgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAyLCA1LCA2IH0gKTsKKworCQkgICAgYnl0ZVtdW10gcmVzdWx0MiA9IG5ldyBieXRlW11bXSB7IG5ldyBieXRlW10geyAzLCA0IH0sIG5ldyBieXRlW10geyA1LCA2IH0gfTsKKyAgICAJCQorCQkgICAgcC5TZXNzaW9uRGF0YShudWxsLCBidWYyKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LklzVHJ1ZShtcGguQ2hlY2socmVzdWx0MikpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKG1waC53aGF0LCBXaGF0LlBBQ0tFVCk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhidWYpOworCSAgICB9CisgICAgCQorCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCSAgICAvLyB0aGVzZSB0ZXN0cyBhcmUgZm9yIHR3byBQYWNrZXRzIGluIHR3byBidWZmZXJzIHdpdGggYm9keSBzcGxpdCAvLworCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFNlbmREb3VibGVTaW5nbGVfQm9keVNwbGl0X0RhdGEyKCkgIAorCSAgICB7CisgICAgICAgICAgICBTZXRVcCgpOworCQkgICAgLy8gbGVuZ3RoID0gMgorICAgICAgICAgICAgRmxleEJ1ZmZlciBidWYgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIzOSwgMTkwLCAxNzMsIDIyMiwgMiwgMCwgMCwgMCwgMSB9ICkgOiAKKyAgICAgICAgICAgICAgICBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIyMiwgMTczLCAxOTAsIDIzOSwgMCwgMCwgMCwgMiwgMSB9ICk7CisJCSAgICAKKyAgICAgICAgICAgIGJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW11bXSB7IH0gOworICAgIAkJCisJCSAgICBwLlNlc3Npb25EYXRhKG51bGwsIGJ1Zik7CisgICAgCQkKKwkJICAgIEFzc2VydC5Jc1RydWUobXBoLkNoZWNrKHJlc3VsdCkpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgud2hhdCk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhidWYpOworCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZjIgPSAoIEZsZXhCdWZmZXIubGl0dGxlRW5kaWFuICkgPyBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDIsIDIzOSwgMTkwLCAxNzMsIDIyMiwgMiwgMCwgMCwgMCwgMywgNCB9ICkgOgorICAgICAgICAgICAgICAgIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMiwgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAyLCAzLCA0IH0gKTsKKworCQkgICAgYnl0ZVtdW10gcmVzdWx0MiA9IG5ldyBieXRlW11bXSB7IG5ldyBieXRlW10geyAxLCAyIH0sIG5ldyBieXRlW10geyAzLCA0IH0gfTsKKyAgICAJCQorCQkgICAgcC5TZXNzaW9uRGF0YShudWxsLCBidWYyKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LklzVHJ1ZShtcGguQ2hlY2socmVzdWx0MikpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKG1waC53aGF0LCBXaGF0LlBBQ0tFVCk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhidWYpOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgU2VuZERvdWJsZVNpbmdsZV9Cb2R5U3BsaXRfRGF0YTMoKSAgCisJICAgIHsKKyAgICAgICAgICAgIFNldFVwKCk7CisJCSAgICAvLyBsZW5ndGggPSAzCisgICAgICAgICAgICBGbGV4QnVmZmVyIGJ1ZiA9ICggRmxleEJ1ZmZlci5saXR0bGVFbmRpYW4gKSA/IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjM5LCAxOTAsIDE3MywgMjIyLCAzLCAwLCAwLCAwLCA1LCA2IH0gKSA6IAorICAgICAgICAgICAgICAgIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAzLCA1LCA2IH0gKTsKKworCQkgICAgYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdIHsgfSA7CisgICAgCQkKKwkJICAgIHAuU2Vzc2lvbkRhdGEobnVsbCwgYnVmKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LklzVHJ1ZShtcGguQ2hlY2socmVzdWx0KSk7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC53aGF0KTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhzZW5kZXIpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueGJ1Zik7CisKKyAgICAgICAgICAgIEZsZXhCdWZmZXIgYnVmMiA9ICggRmxleEJ1ZmZlci5saXR0bGVFbmRpYW4gKSA/IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgNywgMjM5LCAxOTAsIDE3MywgMjIyLCAzLCAwLCAwLCAwLCA4LCA5LCAxMCB9ICkgOgorICAgICAgICAgICAgICAgIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgNywgMjIyLCAxNzMsIDE5MCwgMjM5LCAwLCAwLCAwLCAzLCA4LCA5LCAxMCB9ICk7CisKKwkJICAgIGJ5dGVbXVtdIHJlc3VsdDIgPSBuZXcgYnl0ZVtdW10geyBuZXcgYnl0ZVtdIHsgNSwgNiwgNyB9LCBuZXcgYnl0ZVtdIHsgOCwgOSwgMTAgfSB9OworICAgIAkJCisJCSAgICBwLlNlc3Npb25EYXRhKG51bGwsIGJ1ZjIpOworICAgIAkJCisJCSAgICBBc3NlcnQuSXNUcnVlKG1waC5DaGVjayhyZXN1bHQyKSk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwobXBoLndoYXQsIFdoYXQuUEFDS0VUKTsKKwkJICAgIEFzc2VydC5Jc051bGwobXBoLnhzZW5kZXIpOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueGJ1Zik7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBVcCgpICAKKwkgICAgeworICAgICAgICAgICAgU2V0VXAoKTsKKyAgICAgICAgICAgIHAuU2Vzc2lvbk5vdGlmeSggU2Vzc2lvbkNvbnN0cy5VUCApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwobXBoLndoYXQsIFdoYXQuVVApOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueGJ1Zik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIERvd24oKSAgIAorCSAgICB7CisgICAgICAgICAgICBTZXRVcCgpOworICAgICAgICAgICAgcC5TZXNzaW9uTm90aWZ5KCBTZXNzaW9uQ29uc3RzLkRPV04gKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKG1waC53aGF0LCBXaGF0LkRPV04pOworCQkgICAgQXNzZXJ0LklzTnVsbChtcGgueGJ1Zik7CisJCSAgICBBc3NlcnQuSXNOdWxsKG1waC54c2VuZGVyKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIExvY2FsQWRkcmVzcygpICAgCisJICAgIHsKKyAgICAgICAgICAgIFNldFVwKCk7CisJCSAgICBwLlRyYW5zcG9ydFF1ZXJ5KCBDb25uZWN0aW9uPFNlc3Npb25EYXRhPi5MT0NBTF9BRERSRVNTICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbChkaC53aGF0LCBXaGF0LkxPQ0FMQUREUkVTUyk7CisJCSAgICBBc3NlcnQuSXNOdWxsKGRoLnhzZW5kZXIpOworCQkgICAgQXNzZXJ0LklzTnVsbChkaC54YnVmKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorCSAgICBwdWJsaWMgdm9pZCBSZW1vdGVBZGRyZXNzKCkgICAKKwkgICAgeworICAgICAgICAgICAgU2V0VXAoKTsKKyAgICAgICAgICAgIHAuVHJhbnNwb3J0UXVlcnkoIENvbm5lY3Rpb248U2Vzc2lvbkRhdGE+LlJFTU9URV9BRERSRVNTICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbChkaC53aGF0LCBXaGF0LlJFTU9URUFERFJFU1MpOworCQkgICAgQXNzZXJ0LklzTnVsbChkaC54c2VuZGVyKTsKKwkJICAgIEFzc2VydC5Jc051bGwoZGgueGJ1Zik7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKwkgICAgcHVibGljIHZvaWQgU3RvcCgpICAgCisJICAgIHsKKyAgICAgICAgICAgIFNldFVwKCk7CisgICAgICAgICAgICBwLlRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydENvbnN0cy5TVE9QLCBudWxsICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbChkaC53aGF0LCBXaGF0LlNUT1ApOworCQkgICAgQXNzZXJ0LklzTnVsbChkaC54c2VuZGVyKTsKKwkJICAgIEFzc2VydC5Jc051bGwoZGgueGJ1Zik7CisJICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBlbnVtIFdoYXQgeyBEQVRBLCBQQUNLRVQsIFVQLCBET1dOLCBSRVNFVCwgTE9DQUxBRERSRVNTLCBSRU1PVEVBRERSRVNTLCAKKyAgICAgICAgICAgIFNUT1AsIFNUQVJURUQsIFNUT1BQRUQsIEVYQ0VQVElPTiB9OworCisKKyAgICAgICAgLy8gVGhpcyBpcyBsaWtlIG1lc3NhZ2l6ZXIgaGFuZGxpbmcgcGFja2V0cworICAgICAgICBwdWJsaWMgY2xhc3MgTXlQYWNrZXRIYW5kbGVyIDogU2Vzc2lvblBhY2tldAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgRW51bSB3aGF0OworICAgICAgICAgICAgcHVibGljIFdobyB4c2VuZGVyOworICAgICAgICAgICAgcHVibGljIEZsZXhCdWZmZXIgeGJ1ZjsKKyAgICAgICAgICAgIHB1YmxpYyBXaG8geHJlY2lwaWVudDsKKyAgICAgICAgICAgIHB1YmxpYyBUcmFuc3BvcnRQYWNrZXQgX3RwOworCisgICAgICAgICAgICBwdWJsaWMgTXlQYWNrZXRIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTXlQYWNrZXRIYW5kbGVyKCBUcmFuc3BvcnRQYWNrZXQgdHAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90cCA9IHRwOworICAgICAgICAgICAgICAgIF90cC5TZXRTZXNzaW9uKHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIExpc3Q8Ynl0ZVtdPiBsaXN0ID0gbmV3IExpc3Q8Ynl0ZVtdPigpOworCisgICAgICAgICAgICAvLyBBdXhpbGlhcnkgbWV0aG9kcworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdC5DbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBDaGVjayggYnl0ZVtdW10gcmVzdWx0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGZsYWcgPSBDaGVjayggbGlzdC5Db3VudCA9PSByZXN1bHQuTGVuZ3RoICk7CisgICAgICAgICAgICAgICAgaWYgKCBmbGFnID09IGZhbHNlICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWc7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9IENoZWNrKCBsaXN0W2ldLCByZXN1bHRbaV0gKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmbGFnID09IGZhbHNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBib29sIENoZWNrKCBieXRlW10gYSwgYnl0ZVtdIGIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgZmxhZyA9IENoZWNrKCBhLkxlbmd0aCA9PSBiLkxlbmd0aCApOworICAgICAgICAgICAgICAgIGlmICggZmxhZyA9PSBmYWxzZSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnOworCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYS5MZW5ndGg7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbGFnID0gQ2hlY2soIGFbIGkgXSA9PSBiWyBpIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmbGFnID09IGZhbHNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBib29sIENoZWNrKCBib29sIG9rICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRwX3ByaW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICggYnl0ZSBiIGluIGxpc3RbMF0gKQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQYWNrZXRIYW5kbGVyIG1ldGhvZHMKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3JjIj48L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPjwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZiI+PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgICAgICAvLy8gICAgICAKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFBhY2tldCggV2hvIHNlbmRlciwgRmxleEJ1ZmZlciBidWYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0LlBBQ0tFVDsKKyAgICAgICAgICAgICAgICB4c2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgICAgIGxpc3QuQWRkKGJ1Zi5HZXRBdmFpbEJ5dGVzKCkpOworICAgICAgICAgICAgfQorICAgIAkJCisgICAgICAgICAgICAvLyBEYXRhU291cmNlIG1ldGhvZHMKKwkJCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZWNpcGllbnQiPjwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZiI+PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyBFeGNlcHRpb246CisgICAgICAgICAgICAvLy8gICAgICAKKwkJICAgIHB1YmxpYyB2b2lkIERhdGEoIFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmICkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB3aGF0ID0gV2hhdC5EQVRBOworICAgICAgICAgICAgICAgIHRoaXMueHJlY2lwaWVudCA9IHJlY2lwaWVudDsKKwkJCSAgICBsaXN0LkFkZCggYnVmLkdldEF2YWlsQnl0ZXMoKSApOworCQkgICAgfQorCisgICAgICAgICAgICAKKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBTZXNzaW9uUXVlcnkoIG9iamVjdCBxdWVyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggInVuc3VwcG9ydGVkIHF1ZXJ5ICIgKyBxdWVyeSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uQ29udHJvbCggb2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggIiB1bnN1cHBvcnRlZCBjb250cm9sICIgKyBjb250cm9sICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Ob3RpZnkoIG9iamVjdCBldmVudE9iaiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBldmVudE9iai5FcXVhbHMoIFNlc3Npb25Db25zdHMuVVAgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3aGF0ID0gV2hhdC5VUDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGV2ZW50T2JqLkVxdWFscyggU2Vzc2lvbkNvbnN0cy5ET1dOICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgIAorCisgICAgICAgICAgICAjcmVnaW9uIFNlc3Npb25QYWNrZXQgTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uUGFja2V0KFdobyBzZW5kZXIsIEZsZXhCdWZmZXIgYnVmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0LlBBQ0tFVDsKKyAgICAgICAgICAgICAgICB4c2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgICAgIGxpc3QuQWRkKGJ1Zi5HZXRBdmFpbEJ5dGVzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlEYXRhSGFuZGxlciA6IFRyYW5zcG9ydERhdGEKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEVudW0gd2hhdDsKKyAgICAgICAgICAgIHB1YmxpYyBXaG8geHNlbmRlcjsKKyAgICAgICAgICAgIHB1YmxpYyBGbGV4QnVmZmVyIHhidWY7CisgICAgICAgICAgICBwdWJsaWMgV2hvIHhyZWNpcGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIExpc3Q8Ynl0ZVtdPiBsaXN0ID0gbmV3IExpc3Q8Ynl0ZVtdPigpOworCisgICAgICAgICAgICBwcml2YXRlIFNlc3Npb25EYXRhIHNlc3Npb247CisgICAgICAgICAgICBwdWJsaWMgTXlEYXRhSGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0RGF0YSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydERhdGEoV2hvIHJlY2lwaWVudCwgRmxleEJ1ZmZlciBidWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuREFUQTsKKyAgICAgICAgICAgICAgICB0aGlzLnhyZWNpcGllbnQgPSByZWNpcGllbnQ7CisgICAgICAgICAgICAgICAgbGlzdC5BZGQoYnVmLkdldEF2YWlsQnl0ZXMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnQ8U2Vzc2lvbkRhdGE+IE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBUcmFuc3BvcnRRdWVyeShvYmplY3QgcXVlcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5LkVxdWFscyhDb25uZWN0aW9uPFNlc3Npb25EYXRhPi5MT0NBTF9BRERSRVNTKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0LkxPQ0FMQUREUkVTUzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChxdWVyeS5FcXVhbHMoQ29ubmVjdGlvbjxTZXNzaW9uRGF0YT4uUkVNT1RFX0FERFJFU1MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuUkVNT1RFQUREUkVTUzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIiB1bnN1cHBvcnRlZCBxdWVyeSAiICsgcXVlcnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnRDb250cm9sKG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuRXF1YWxzKFRyYW5zcG9ydENvbnN0cy5TVE9QKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0LlNUT1A7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiIHVuc3VwcG9ydGVkIGNvbnRyb2wgIiArIGNvbnRyb2wpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBUcmFuc3BvcnROb3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25EYXRhIHNlc3Npb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNlc3Npb25EYXRhIEdldFNlc3Npb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgIC8vIEF1eGlsaWFyeSBtZXRob2RzCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0LkNsZWFyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIENoZWNrKGJ5dGVbXVtdIHJlc3VsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGZsYWcgPSBDaGVjayhsaXN0LkNvdW50ID09IHJlc3VsdC5MZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChmbGFnID09IGZhbHNlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZzsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9IENoZWNrKGxpc3RbaV0sIHJlc3VsdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbGFnID09IGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgQ2hlY2soYnl0ZVtdIGEsIGJ5dGVbXSBiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgZmxhZyA9IENoZWNrKGEuTGVuZ3RoID09IGIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWc7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbGFnID0gQ2hlY2soYVtpXSA9PSBiW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWcgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBDaGVjayhib29sIG9rKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RTdHJJbnRIYXNoTWFwU2VyaWFsaXplci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0U3RySW50SGFzaE1hcFNlcmlhbGl6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzMTQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0U3RySW50SGFzaE1hcFNlcmlhbGl6ZXIuY3MKQEAgLTAsMCArMSwxMDQgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0U3RySW50SGFzaE1hcFNlcmlhbGl6ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0U3RySW50SGFzaE1hcFNlcmlhbGl6ZXIiICk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SW1wb3J0MCgpIAorCSAgICB7CisJCSAgICBTdHJJbnRIYXNoTWFwIG1hcCA9IG5ldyBTdHJJbnRIYXNoTWFwKCk7CisJCSAgICBUZXN0TWFwKCBtYXAgKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBUZXN0SW1wb3J0MSgpIAorCSAgICB7CisJCSAgICBTdHJJbnRIYXNoTWFwIG1hcCA9IG5ldyBTdHJJbnRIYXNoTWFwKCk7CisJCSAgICBtYXAuQWRkKCAiYSIsIDEgKTsKKwkJICAgIFRlc3RNYXAoIG1hcCApOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RJbXBvcnQyKCkgCisJICAgIHsKKwkJICAgIFN0ckludEhhc2hNYXAgbWFwID0gbmV3IFN0ckludEhhc2hNYXAoKTsKKwkJICAgIG1hcC5BZGQoICJhIiwgMSApOworCQkgICAgbWFwLkFkZCggImIiLCAyICk7CisJCSAgICBUZXN0TWFwKCBtYXAgKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBUZXN0SW1wb3J0MygpIAorCSAgICB7CisJCSAgICBTdHJJbnRIYXNoTWFwIG1hcCA9IG5ldyBTdHJJbnRIYXNoTWFwKCk7CisJCSAgICBtYXAuQWRkKCAiYSIsIDEgKTsKKwkJICAgIG1hcC5BZGQoICJiIiwgMiApOworCQkgICAgbWFwLkFkZCggImMiLCAzICk7CisJCSAgICBUZXN0TWFwKCBtYXAgKTsKKwkgICAgfQorICAgIAkKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RJbXBvcnROdWxsMSgpIAorCSAgICB7CisJCSAgICBTdHJJbnRIYXNoTWFwIG1hcCA9IG5ldyBTdHJJbnRIYXNoTWFwKCk7CisgICAgICAgICAgICBtYXAuQWRkKCAiYSIsIDEgKTsKKwkJICAgIG1hcC5BZGQoICJiIiwgbnVsbCApOworICAgICAgICAgICAgbWFwLkFkZCggImMiLCAyICk7CisJCSAgICBUZXN0TWFwKCBtYXAgKTsKKwkgICAgfQorICAgIAkKKwkgICAgLy8gbm8gdGVzdHMgZm9yIG51bGwga2V5cyBhcyBzdHJpbmc/IGlzbid0IGFsbG93ZWQKKworICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TWFwKCBTdHJJbnRIYXNoTWFwIG1hcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFhUeXBlIHR5cGUgPSBuZXcgWFR5cGUoICJtYXAiICk7CisJCSAgCisgICAgICAgICAgICBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCQkgICAgU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIuSW5pdCggdHlwZSwgY2xhc3MydHlwZSApOworCQkgICAgSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlciA9IHR5cGUuR2V0SW1wb3J0RXhwb3J0SGVscGVyKCk7CisgICAgCQkKKwkJICAgIFN0cnVjdFZhbHVlIHN2ID0gaGVscGVyLkV4cG9ydFZhbHVlKCB2ZiwgbWFwICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggc3YuR2V0WFR5cGUsIHR5cGUgKTsKKyAgICAJCQorCQkgICAgU3RySW50SGFzaE1hcCBtYXAyID0gKFN0ckludEhhc2hNYXApIGhlbHBlci5JbXBvcnRWYWx1ZSggc3YgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBtYXAsIG1hcDIgKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RTdHJTdHJIYXNoTWFwU2VyaWFsaXplci5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0U3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0NzZiNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0U3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuY3MKQEAgLTAsMCArMSw5NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7CisKK25hbWVzcGFjZSBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RTdHJTdHJIYXNoTWFwU2VyaWFsaXplcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRHVtbXlWYWx1ZUZhY3RvcnkoKTsKKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RTdHJTdHJIYXNoTWFwU2VyaWFsaXplciIgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJbXBvcnQwKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyU3RySGFzaE1hcCBtYXAgPSBuZXcgU3RyU3RySGFzaE1hcCgpOworICAgICAgICAgICAgVGVzdE1hcCggbWFwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEltcG9ydDEoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisgICAgICAgICAgICBtYXAuQWRkKCAiYSIsICIxIiApOworICAgICAgICAgICAgVGVzdE1hcCggbWFwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEltcG9ydDIoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisgICAgICAgICAgICBtYXAuQWRkKCAiYSIsICIxIiApOworICAgICAgICAgICAgbWFwLkFkZCggImIiLCAiMiIgKTsKKyAgICAgICAgICAgIFRlc3RNYXAoIG1hcCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJbXBvcnQzKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyU3RySGFzaE1hcCBtYXAgPSBuZXcgU3RyU3RySGFzaE1hcCgpOworICAgICAgICAgICAgbWFwLkFkZCggImEiLCAiMSIgKTsKKyAgICAgICAgICAgIG1hcC5BZGQoICJiIiwgIjIiICk7CisgICAgICAgICAgICBtYXAuQWRkKCAiYyIsICIzIiApOworICAgICAgICAgICAgVGVzdE1hcCggbWFwICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBubyB0ZXN0cyBmb3IgbnVsbCBrZXlzIGFzIHN0cmluZz8gaXNuJ3QgYWxsb3dlZAorCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNYXAoIFN0clN0ckhhc2hNYXAgbWFwICkKKyAgICAgICAgeworICAgICAgICAgICAgWFR5cGUgdHlwZSA9IG5ldyBYVHlwZSggIm1hcCIgKTsKKwkJICAgCisgICAgICAgICAgICBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCQkgICAgU3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuSW5pdCggdHlwZSwgY2xhc3MydHlwZSApOworCQkgICAgSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlciA9IHR5cGUuR2V0SW1wb3J0RXhwb3J0SGVscGVyKCk7CisgICAgCQkKKwkJICAgIFN0cnVjdFZhbHVlIHN2ID0gaGVscGVyLkV4cG9ydFZhbHVlKCB2ZiwgbWFwICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggc3YuR2V0WFR5cGUsIHR5cGUgKTsKKyAgICAJCQorCQkgICAgU3RyU3RySGFzaE1hcCBtYXAyID0gKFN0clN0ckhhc2hNYXApIGhlbHBlci5JbXBvcnRWYWx1ZSggc3YgKTsKKyAgICAJCQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBtYXAsIG1hcDIgKTsKKyAgICAgICAgfQorCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFN0cmluZ1V0aWwuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFN0cmluZ1V0aWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5NWY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0U3RyaW5nVXRpbC5jcwpAQCAtMCwwICsxLDE2MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgCisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0U3RyaW5nVXRpbAorICAgIHsKKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RTdHJpbmdVdGlsIiApOworICAgICAgICB9CisKKworICAgICAgICAjcmVnaW9uIExFRlQgU1BMSVQgVEVTVFMKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFNpbXBsZUxlZnRTcGxpdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gIkhlbGxvOiBXb3JsZCI7CisgICAgICAgICAgICBTdHJpbmdbXSBzID0gU3RyaW5nVXRpbC5MZWZ0U3BsaXQoIHRlc3QsICc6JyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiSGVsbG8iLCBzWyAwIF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggIiBXb3JsZCIsIHNbIDEgXSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RNdWx0aXBsZUxlZnRTcGxpdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gIkhlbGxvOiBXb3JsZDogU2Vjb25kIjsKKyAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBTdHJpbmdVdGlsLkxlZnRTcGxpdCggdGVzdCwgJzonICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJIZWxsbyIsIHNbIDAgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiIFdvcmxkOiBTZWNvbmQiLCBzWyAxIF0gKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Tm9EZWxpbXNMZWZ0U3BsaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGVzdCA9ICJIZWxsbyBXb3JsZCI7CisgICAgICAgICAgICBTdHJpbmdbXSBzID0gU3RyaW5nVXRpbC5MZWZ0U3BsaXQoIHRlc3QsICc6JyApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggcyApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gUklHSFQgU1BMSVQgVEVTVFMKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFNpbXBsZVJpZ2h0U3BsaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGVzdCA9ICJIZWxsbzogV29ybGQiOworICAgICAgICAgICAgU3RyaW5nW10gcyA9IFN0cmluZ1V0aWwuUmlnaHRTcGxpdCggdGVzdCwgJzonICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJIZWxsbyIsIHNbIDAgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiIFdvcmxkIiwgc1sgMSBdICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE11bHRpcGxlUmlnaHRTcGxpdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gIkhlbGxvOiBXb3JsZDogU2Vjb25kIjsKKyAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBTdHJpbmdVdGlsLlJpZ2h0U3BsaXQoIHRlc3QsICc6JyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiSGVsbG86IFdvcmxkIiwgc1sgMCBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICIgU2Vjb25kIiwgc1sgMSBdICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdE5vRGVsaW1zUmlnaHRTcGxpdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gIkhlbGxvIFdvcmxkIjsKKyAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBTdHJpbmdVdGlsLlJpZ2h0U3BsaXQoIHRlc3QsICc6JyApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggcyApOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVE9IRVggVEVTVFMKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFRvSGV4X3ZhbGlkQXJncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzAnLCBTdHJpbmdVdGlsLlRvSGV4KCAwICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzEnLCBTdHJpbmdVdGlsLlRvSGV4KCAxICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzInLCBTdHJpbmdVdGlsLlRvSGV4KCAyICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzMnLCBTdHJpbmdVdGlsLlRvSGV4KCAzICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzQnLCBTdHJpbmdVdGlsLlRvSGV4KCA0ICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzUnLCBTdHJpbmdVdGlsLlRvSGV4KCA1ICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzYnLCBTdHJpbmdVdGlsLlRvSGV4KCA2ICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzcnLCBTdHJpbmdVdGlsLlRvSGV4KCA3ICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzgnLCBTdHJpbmdVdGlsLlRvSGV4KCA4ICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJzknLCBTdHJpbmdVdGlsLlRvSGV4KCA5ICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJ2EnLCBTdHJpbmdVdGlsLlRvSGV4KCAxMCApICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICdiJywgU3RyaW5nVXRpbC5Ub0hleCggMTEgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAnYycsIFN0cmluZ1V0aWwuVG9IZXgoIDEyICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggJ2QnLCBTdHJpbmdVdGlsLlRvSGV4KCAxMyApICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICdlJywgU3RyaW5nVXRpbC5Ub0hleCggMTQgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAnZicsIFN0cmluZ1V0aWwuVG9IZXgoIDE1ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RUb0hleF9pbnZhbGlkQXJnKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nVXRpbC5Ub0hleCggMTYgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIEZST01IRVggVEVTVFMKKworICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RnJvbUhleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMCwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnMCcgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBTdHJpbmdVdGlsLkZyb21IZXgoICcxJyApICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIFN0cmluZ1V0aWwuRnJvbUhleCggJzInICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMywgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnMycgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA0LCBTdHJpbmdVdGlsLkZyb21IZXgoICc0JyApICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDUsIFN0cmluZ1V0aWwuRnJvbUhleCggJzUnICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggNiwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnNicgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA3LCBTdHJpbmdVdGlsLkZyb21IZXgoICc3JyApICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDgsIFN0cmluZ1V0aWwuRnJvbUhleCggJzgnICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggOSwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnOScgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMCwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnYScgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMSwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnYicgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMiwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnYycgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMywgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnZCcgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxNCwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnZScgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxNSwgU3RyaW5nVXRpbC5Gcm9tSGV4KCAnZicgKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEZyb21IZXhfaW52YWxpZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1V0aWwuRnJvbUhleCggJ2cnICk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RUY3BDb25uZWN0aW9uLmNzIGIvYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvdGVzdC9jc2hhcnAvRXRjaC9VdGlsL1Rlc3RUY3BDb25uZWN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOThmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFRjcENvbm5lY3Rpb24uY3MKQEAgLTAsMCArMSw4NDcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOwordXNpbmcgVGNwTGlzdGVuZXI9T3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsLlRjcExpc3RlbmVyOworCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQKK3sgICAgICAgCisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0VGNwQ29ubmVjdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBNeUxpc3RlbmVyIGxoID0gbmV3IE15TGlzdGVuZXIoKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb25uZWN0aW9uPFNlc3Npb25MaXN0ZW5lcjxTb2NrZXQ+PiBsOworICAgICAgICBwdWJsaWMgVGNwQ29ubmVjdGlvbiBjOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUSU1FT1VUID0gNDAwMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBvcnQ7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0TGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RUQ1BDb25uZWN0aW9uIiApOworCisgICAgICAgICAgICBsID0gbmV3IFRjcExpc3RlbmVyKCAidGNwOiIsIG51bGwgKTsKKyAgICAgICAgICAgIGwuU2V0U2Vzc2lvbihsaCk7CisgICAgICAgICAgICBsLlN0YXJ0KCk7CisgICAgICAgICAgICBsLldhaXRVcCggVElNRU9VVCApOworICAgICAgICAgICAgcG9ydCA9ICggKCBJUEVuZFBvaW50ICkgbC5Mb2NhbEFkZHJlc3MoKSApLlBvcnQ7CisgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCAiIHBvcnQgPSAiICsgcG9ydCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlVGVhckRvd25dCisgICAgICAgIHB1YmxpYyB2b2lkIFN0b3BMaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGwuU3RvcCgpOworICAgICAgICAgICAgbC5XYWl0RG93biggVElNRU9VVCApOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvciB0ZXN0cworCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvcjEoKQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDoiLCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVhckRvd25dCisgICAgICAgIHB1YmxpYyB2b2lkIFNsZWVwQVdoaWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGhyZWFkLlNsZWVwKCAxMDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3RydWN0b3IyKCkKKyAgICAgICAgeworICAgICAgICAgICAgSVBFbmRQb2ludCBpcGUgPSBuZXcgSVBFbmRQb2ludCggSVBBZGRyZXNzLlBhcnNlKCAiMTI3LjAuMC4xIiApLCBwb3J0ICk7CisgICAgICAgICAgICBTb2NrZXQgcyA9IG5ldyBTb2NrZXQoIGlwZS5BZGRyZXNzRmFtaWx5LCBTb2NrZXRUeXBlLlN0cmVhbSwgUHJvdG9jb2xUeXBlLlRjcCApOworICAgICAgICAgICAgcy5Db25uZWN0KCBpcGUgKTsKKworICAgICAgICAgICAgU29ja2V0IHQgPSBsaC5hY2NlcHRlZC5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisgICAgICAgICAgICBUY3BDb25uZWN0aW9uIGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggcywgInRjcDoiLG51bGwgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGMuR2V0U2Vzc2lvbigpICk7CisKKyAgICAgICAgICAgIHMuQ2xvc2UoKTsKKyAgICAgICAgICAgIHQuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvcjMoKQorICAgICAgICB7CisgICAgICAgICAgICBJUEVuZFBvaW50IGlwZSA9IG5ldyBJUEVuZFBvaW50KCBJUEFkZHJlc3MuUGFyc2UoICIxMjcuMC4wLjEiICksIHBvcnQgKTsKKyAgICAgICAgICAgIFNvY2tldCBzID0gbmV3IFNvY2tldCggaXBlLkFkZHJlc3NGYW1pbHksIFNvY2tldFR5cGUuU3RyZWFtLCBQcm90b2NvbFR5cGUuVGNwICk7CisgICAgICAgICAgICBzLkNvbm5lY3QoIGlwZSApOworCisgICAgICAgICAgICBTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLldhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisKKyAgICAgICAgICAgIFRjcENvbm5lY3Rpb24gYyA9IG5ldyBUY3BDb25uZWN0aW9uKHMsICJ0Y3A6IiwgbnVsbCk7CisgICAgICAgICAgICBTZXNzaW9uRGF0YSBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKGMpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBkaCwgYy5HZXRTZXNzaW9uKCkgKTsKKworICAgICAgICAgICAgcy5DbG9zZSgpOworICAgICAgICAgICAgdC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBUY3BDb25uZWN0aW9uKCBudWxsLCAoc3RyaW5nKSBudWxsLCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3RydWN0b3I1KCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IFRjcENvbm5lY3Rpb24oIG51bGwsIChzdHJpbmcpIG51bGwsbnVsbCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yOCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcENvbm5lY3Rpb24gYyA9IG5ldyBUY3BDb25uZWN0aW9uKCBudWxsLCJ0Y3A6Ly9sb2NhbGhvc3Q6Iitwb3J0LCBudWxsICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBjLkdldFNlc3Npb24oKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yOSgpCisgICAgICAgIHsKKworICAgICAgICAgICAgVGNwQ29ubmVjdGlvbiBjID0gbmV3IFRjcENvbm5lY3Rpb24obnVsbCwgInRjcDovL2xvY2FsaG9zdDoiICsgcG9ydCwgbnVsbCk7CisgICAgICAgICAgICBTZXNzaW9uRGF0YSBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKGMpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBkaCwgYy5HZXRTZXNzaW9uKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFN0YXJ0IHZhcmlhdGlvbnMKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgU3RhcnQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgSVBFbmRQb2ludCBpcGUgPSBuZXcgSVBFbmRQb2ludCggSVBBZGRyZXNzLlBhcnNlKCAiMTI3LjAuMC4xIiApLCBwb3J0ICk7CisgICAgICAgICAgICBTb2NrZXQgcyA9IG5ldyBTb2NrZXQoIGlwZS5BZGRyZXNzRmFtaWx5LCBTb2NrZXRUeXBlLlN0cmVhbSwgUHJvdG9jb2xUeXBlLlRjcCApOworICAgICAgICAgICAgcy5Db25uZWN0KCBpcGUgKTsKKworICAgICAgICAgICAgU29ja2V0IHQgPSBsaC5hY2NlcHRlZC5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisgICAgICAgICAgIAorICAgICAgICAgICAgVGNwQ29ubmVjdGlvbiBjID0gbmV3IFRjcENvbm5lY3Rpb24oIHMsInRjcDoiLG51bGwgKTsKKyAgICAgICAgICAgIE15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcihjKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIGMuSXNTdGFydGVkKCkgKTsKKyAgICAgICAgICAgIGMuU3RhcnQoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGMuSXNTdGFydGVkKCkgKTsKKworICAgICAgICAgICAgYy5XYWl0VXAoIFRJTUVPVVQgKTsKKworICAgICAgICAgICAgQXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueHNlbmRlciApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueGJ1ZiApOworCisgICAgICAgICAgICBjLkZsdXNoKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKCBjLlJlbW90ZUFkZHJlc3MoKSApOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCggYy5Mb2NhbEFkZHJlc3MoKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBjLlJlbW90ZUFkZHJlc3MoKSwgdC5Mb2NhbEVuZFBvaW50ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGMuTG9jYWxBZGRyZXNzKCksIHQuUmVtb3RlRW5kUG9pbnQgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdC5DbG9zZSgpOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTdGFydDIoKQorICAgICAgICB7CisgICAgICAgICAgICBJUEVuZFBvaW50IGlwZSA9IG5ldyBJUEVuZFBvaW50KCBJUEFkZHJlc3MuUGFyc2UoICIxMjcuMC4wLjEiICksIHBvcnQgKTsKKyAgICAgICAgICAgIFNvY2tldCBzID0gbmV3IFNvY2tldCggaXBlLkFkZHJlc3NGYW1pbHksIFNvY2tldFR5cGUuU3RyZWFtLCBQcm90b2NvbFR5cGUuVGNwICk7CisgICAgICAgICAgICBzLkNvbm5lY3QoIGlwZSApOworCisgICAgICAgICAgICBTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLldhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVGNwQ29ubmVjdGlvbiBjID0gbmV3IFRjcENvbm5lY3Rpb24ocywgInRjcDoiLCBudWxsICk7CisgICAgICAgICAgICBNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoYyk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBjLklzU3RhcnRlZCgpICk7CisgICAgICAgICAgICBjLlN0YXJ0KCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBjLklzU3RhcnRlZCgpICk7CisgICAgICAgICAgICBjLldhaXRVcCggVElNRU9VVCApOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54c2VuZGVyICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54YnVmICk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGMuSXNTdGFydGVkKCkgKTsKKyAgICAgICAgICAgIGMuU3RvcCgpOworCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggYy5Jc1N0YXJ0ZWQoKSApOworCisgICAgICAgICAgICBjLldhaXREb3duKCBUSU1FT1VUICk7CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54c2VuZGVyICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54YnVmICk7CisKKyAgICAgICAgICAgIHQuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTdGFydDMoKQorICAgICAgICB7CisKKyAgICAgICAgICAgIElQRW5kUG9pbnQgaXBlID0gbmV3IElQRW5kUG9pbnQoIElQQWRkcmVzcy5QYXJzZSggIjEyNy4wLjAuMSIgKSwgcG9ydCApOworICAgICAgICAgICAgU29ja2V0IHMgPSBuZXcgU29ja2V0KCBpcGUuQWRkcmVzc0ZhbWlseSwgU29ja2V0VHlwZS5TdHJlYW0sIFByb3RvY29sVHlwZS5UY3AgKTsKKyAgICAgICAgICAgIHMuQ29ubmVjdCggaXBlICk7CisKKyAgICAgICAgICAgIFNvY2tldCB0ID0gbGguYWNjZXB0ZWQuV2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKworICAgICAgICAgICAKKyAgICAgICAgICAgIFRjcENvbm5lY3Rpb24gYyA9IG5ldyBUY3BDb25uZWN0aW9uKCBzLCAidGNwOiIsIG51bGwgKTsKKyAgICAgICAgICAgIE15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcihjKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIGMuSXNTdGFydGVkKCkgKTsKKyAgICAgICAgICAgIGMuU3RhcnQoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGMuSXNTdGFydGVkKCkgKTsKKworICAgICAgICAgICAgYy5XYWl0VXAoIFRJTUVPVVQgKTsKKworICAgICAgICAgICAgQXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueHNlbmRlciApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueGJ1ZiApOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBjLklzU3RhcnRlZCgpICk7CisgICAgICAgICAgICBjLkNsb3NlKCk7CisKKyAgICAgICAgICAgIGMuV2FpdERvd24oIFRJTUVPVVQgKTsKKworICAgICAgICAgICAgQXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54c2VuZGVyICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54YnVmICk7CisKKyAgICAgICAgICAgIHQuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBTdGFydDQoKQorICAgICAgICB7CisKKyAgICAgICAgICAgIElQRW5kUG9pbnQgaXBlID0gbmV3IElQRW5kUG9pbnQoIElQQWRkcmVzcy5QYXJzZSggIjEyNy4wLjAuMSIgKSwgcG9ydCApOworICAgICAgICAgICAgU29ja2V0IHMgPSBuZXcgU29ja2V0KCBpcGUuQWRkcmVzc0ZhbWlseSwgU29ja2V0VHlwZS5TdHJlYW0sIFByb3RvY29sVHlwZS5UY3AgKTsKKworICAgICAgICAgICAgcy5Db25uZWN0KCBpcGUgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU29ja2V0IHQgPSBsaC5hY2NlcHRlZC5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisgICAgICAgICAgCisgICAgICAgICAgICBUY3BDb25uZWN0aW9uIGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggcywgInRjcDoiLCBudWxsICk7CisgICAgICAgICAgICBNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoYyk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBjLklzU3RhcnRlZCgpICk7CisgICAgICAgICAgICBjLlN0YXJ0KCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBjLklzU3RhcnRlZCgpICk7CisKKyAgICAgICAgICAgIGMuV2FpdFVwKCBUSU1FT1VUICk7CisKKyAgICAgICAgICAgIEFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggYy5Jc1N0YXJ0ZWQoKSApOworICAgICAgICAgICAgYy5DbG9zZSggZmFsc2UgKTsKKworICAgICAgICAgICAgYy5XYWl0RG93biggVElNRU9VVCApOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKworICAgICAgICAgICAgdC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0NSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIElQRW5kUG9pbnQgaXBlID0gbmV3IElQRW5kUG9pbnQoSVBBZGRyZXNzLlBhcnNlKCIxMjcuMC4wLjEiKSwgcG9ydCk7CisgICAgICAgICAgICBTb2NrZXQgcyA9IG5ldyBTb2NrZXQoaXBlLkFkZHJlc3NGYW1pbHksIFNvY2tldFR5cGUuU3RyZWFtLCBQcm90b2NvbFR5cGUuVGNwKTsKKyAgICAgICAgICAgIHMuQ29ubmVjdChpcGUpOworCisgICAgICAgICAgICBTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLldhaXRVbnRpbE5vdEVxQW5kU2V0KG51bGwsIFRJTUVPVVQsIG51bGwpOworCisgICAgICAgICAgICBUY3BDb25uZWN0aW9uIGMgPSBuZXcgVGNwQ29ubmVjdGlvbihzLCAidGNwOiIsIG51bGwpOworICAgICAgICAgICAgTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKGMpOworCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShjLklzU3RhcnRlZCgpKTsKKyAgICAgICAgICAgIGMuU3RhcnQoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYy5Jc1N0YXJ0ZWQoKSk7CisKKyAgICAgICAgICAgIGMuV2FpdFVwKFRJTUVPVVQpOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KFdoYXQuVVAsIGRoLndoYXQpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChkaC54c2VuZGVyKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoZGgueGJ1Zik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYy5Jc1N0YXJ0ZWQoKSk7CisgICAgICAgICAgICBjLkNsb3NlKHRydWUpOworCisgICAgICAgICAgICBjLldhaXREb3duKFRJTUVPVVQpOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KFdoYXQuRE9XTiwgZGgud2hhdCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGRoLnhzZW5kZXIpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChkaC54YnVmKTsKKworICAgICAgICAgICAgdC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0NigpCisgICAgICAgIHsKKworICAgICAgICAgICAgVGNwQ29ubmVjdGlvbiBjID0gbmV3IFRjcENvbm5lY3Rpb24obnVsbCwgInRjcDovLzEyNy4wLjAuMToiICsgcG9ydCwgbnVsbCk7CisgICAgICAgICAgICBNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoYyk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBjLklzU3RhcnRlZCgpICk7CisgICAgICAgICAgICBjLlN0YXJ0KCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBjLklzU3RhcnRlZCgpICk7CisgICAgICAgICAgICBjLldhaXRVcCggVElNRU9VVCApOworCisgICAgICAgICAgICBTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLldhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisKKyAgICAgICAgICAgIEFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggYy5Jc1N0YXJ0ZWQoKSApOworICAgICAgICAgICAgYy5TdG9wKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggYy5Jc1N0YXJ0ZWQoKSApOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKworICAgICAgICAgICAgdC5DbG9zZSgpOworICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAKKyAgICAgICAgLy8gQ2F1c2UgQnVpbGRTZXJ2ZXIgdG8gaGFuZywgaGVuY2UgaWdub3JlZAorICAgICAgIFtJZ25vcmVdCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCByZXN0YXJ0MSgpIAorCSAgICB7CisKKworCisgICAgICAgICAgICBUY3BDb25uZWN0aW9uIGMgPSBuZXcgVGNwQ29ubmVjdGlvbihudWxsLCAidGNwOi8vMTI3LjAuMC4xOiIgKyBwb3J0ICsgIj9UY3BUcmFuc3BvcnQucmVjb25uZWN0RGVsYXk9MjAwIiwgbnVsbCk7CisgICAgICAgICAgICBNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoYyk7CisJCQorCQkgICAgYy5TdGFydCgpOworCQkgICAgYy5XYWl0VXAoIFRJTUVPVVQgKTsKKwkJCisJCSAgICBpbnQgbiA9IDEwOworCQkgICAgaW50IGkgPSAwOworCQkgICAgd2hpbGUgKCsraSA8PSBuKQorCQkgICAgeworCQkJICAgIFNvY2tldCB0ID0gbGguYWNjZXB0ZWQuV2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKworCQkJICAgIENvbnNvbGUuV3JpdGVMaW5lKFN0cmluZy5Gb3JtYXQoICJhY2NlcHRlZCBpIHswfSB0LmxvY2FsIHsxfSB0LnJlbW90ZSB7Mn0iLCAgaSwKKwkJCQkgICAgIHQuTG9jYWxFbmRQb2ludCwgdC5SZW1vdGVFbmRQb2ludCApKTsKKwkJCQorCQkJQXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQkJCisJCQlBc3NlcnQuQXJlRXF1YWwoIHQuTG9jYWxFbmRQb2ludCwgYy5SZW1vdGVBZGRyZXNzKCkgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggdC5SZW1vdGVFbmRQb2ludCwgYy5Mb2NhbEFkZHJlc3MoKSApOworICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHtDb252ZXJ0LlRvQnl0ZShpKX07CisJCSAgICAgICAgCisJCSAgICAgICB0LlNlbmQoZGF0YSk7CisJLy8JCXQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoIGkgKTsKKwkJCUFzc2VydFdoYXQoIFdoYXQuREFUQSwgZGgud2hhdCApOworCQkJQXNzZXJ0LklzTnVsbCggZGgueHNlbmRlciApOworCQkJQXNzZXJ0LklzTm90TnVsbCggZGgueGJ1ZiApOworCQkJQXNzZXJ0LkFyZUVxdWFsKCAxLCBkaC54YnVmLkxlbmd0aCApOworCQkJQXNzZXJ0LkFyZUVxdWFsKCAoYnl0ZSkgaSwgZGgueGJ1ZlswXSApOworCisJCS8vCXQuc2h1dGRvd25PdXRwdXQoKTsKKyAgICAgICAgICAgICAgICB0LlNodXRkb3duKFNvY2tldFNodXRkb3duLlNlbmQpOworCQkJdC5DbG9zZSgpOworCQkJdCA9IG51bGw7CisJCQkKKwkJCUFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQl9CisKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoUnVuTW9uaXRvclNvY2tldFRocmVhZCkpOworCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KGRlbGVnYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3I8V2hhdD4gbW9uID0gZGgud2hhdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gbW9uLldhaXRVbnRpbE5vdEVxQW5kU2V0KGRlZmF1bHQoV2hhdCksIFRJTUVPVVQsIGRlZmF1bHQoV2hhdCkpKSAhPSBudWxsKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8JTG9nLnJlcG9ydCggImhhcnZlc3RlZCIsICJtb24iLCBtb24sICJ0IiwgdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgIAorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKwkJCisJLy8JVGhyZWFkIHQxID0gbmV3IE1vbml0b3JIYXJ2ZXN0ZXI8U29ja2V0PiggbGguYWNjZXB0ZWQgKTsKKwkJdDEuU3RhcnQoKTsKKwkvLwlUaHJlYWQgdDIgPSBuZXcgTW9uaXRvckhhcnZlc3RlcjxXaGF0PiggZGgud2hhdCApOworCQl0Mi5TdGFydCgpOworCisJCUNvbnNvbGUuV3JpdGVMaW5lKCAic3RvcHBpbmciICk7CisJCWMuU3RvcCgpOworCQljLldhaXREb3duKCBUSU1FT1VUICk7CisJCUNvbnNvbGUuV3JpdGVMaW5lKCAic3RvcHBwZWQiICk7CisJCQorCQl0MS5Kb2luKCk7CisJCXQyLkpvaW4oKTsKKwl9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJ1bk1vbml0b3JTb2NrZXRUaHJlYWQoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdDsKKyAgICAgICAgICAgICAgICBNb25pdG9yPFNvY2tldD4gbW9uID0gbGguYWNjZXB0ZWQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gbW9uLldhaXRVbnRpbE5vdEVxQW5kU2V0KG51bGwsIFRJTUVPVVQsIG51bGwpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8JTG9nLnJlcG9ydCggImhhcnZlc3RlZCIsICJtb24iLCBtb24sICJ0IiwgdCApOyAgIAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0gICAgCisgICAgICAgIH0KKworICAgICAgIAorCS8qKgorCSAqIEBwYXJhbSA8VD4KKwkgKi8KKwkgICAgcHVibGljIGNsYXNzIE1vbml0b3JIYXJ2ZXN0ZXI8VD4gCisJeworCQkvKioKKwkJICogQHBhcmFtIG1vbgorCQkgKi8KKwkJcHVibGljIE1vbml0b3JIYXJ2ZXN0ZXIoIE1vbml0b3I8VD4gbW9uICkKKwkJeworCQkJdGhpcy5tb24gPSBtb247CisgICAgICAgICAgIAorCQl9CisJCQorCQlwcml2YXRlIHJlYWRvbmx5IE1vbml0b3I8VD4gbW9uOworCisJCisJfQorICAgIC8vIENhdXNlIEJ1aWxkU2VydmVyIHRvIGhhbmcsIGhlbmNlIGlnbm9yZWQKKyAgICBbSWdub3JlXQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIHJlc3RhcnQyKCkgCisJeworCisKKworICAgICAgICBUY3BDb25uZWN0aW9uIGMgPSBuZXcgVGNwQ29ubmVjdGlvbihudWxsLCAidGNwOi8vMTI3LjAuMC4xOiIgKyBwb3J0ICsgIj9UY3BUcmFuc3BvcnQucmVjb25uZWN0RGVsYXk9MjAwIiwgbnVsbCk7CisgICAgICAgIE15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcihjKTsKKwkJCisJCWMuU3RhcnQoKTsKKwkJYy5XYWl0VXAoIFRJTUVPVVQgKTsKKwkJCisJCWludCBuID0gMTA7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKCsraSA8PSBuKQorCQl7CisvLwkJCUxvZy5yZXBvcnQoICItLS0gd2FpdEFjY2VwdGVkIiApOworCQkJU29ja2V0IHQgPSBsaC5hY2NlcHRlZC5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShTdHJpbmcuRm9ybWF0KCJhY2NlcHRlZCBpIHswfSB0LmxvY2FsIHsxfSB0LnJlbW90ZSB7Mn0iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgdC5Mb2NhbEVuZFBvaW50LCB0LlJlbW90ZUVuZFBvaW50KSk7CisJCQkKKwkJCUFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKy8vCQkJTG9nLnJlcG9ydCggInVwIiwgImMubG9jYWwiLCBjLmxvY2FsQWRkcmVzcygpLCAiYy5yZW1vdGUiLCBjLnJlbW90ZUFkZHJlc3MoKSApOworCQkJCisJCQlBc3NlcnQuQXJlRXF1YWwoIHQuTG9jYWxFbmRQb2ludCwgYy5SZW1vdGVBZGRyZXNzKCkgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggdC5SZW1vdGVFbmRQb2ludCwgYy5Mb2NhbEFkZHJlc3MoKSApOworCisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyBDb252ZXJ0LlRvQnl0ZShpKSB9OworCisgICAgICAgICAgICB0LlNlbmQoZGF0YSk7CisJCQlBc3NlcnRXaGF0KCBXaGF0LkRBVEEsIGRoLndoYXQgKTsKKwkJCUFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKwkJCUFzc2VydC5Jc05vdE51bGwoIGRoLnhidWYgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggMSwgZGgueGJ1Zi5MZW5ndGggKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggKGJ5dGUpIGksIGRoLnhidWZbMF0gKTsKKworLy8JCQlMb2cucmVwb3J0KCAiYy5zaHV0aW5nRG93bk91dHB1dCIgKTsKKwkJCWMuU2h1dGRvd25PdXRwdXQoKTsKKy8vCQkJTG9nLnJlcG9ydCggImMuc2h1dGRvd25PdXRwdXQiICk7CisJCQkKKy8vCQkJTG9nLnJlcG9ydCggInQucmVhZGluZyIgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggMCwgdC5SZWNlaXZlKGRhdGEpICk7CisvLwkJCUxvZy5yZXBvcnQoICJ0LmVvZiIgKTsKKwkJCQorCQkJdC5TaHV0ZG93bihTb2NrZXRTaHV0ZG93bi5TZW5kKTsKKwkJCXQuQ2xvc2UoKTsKKwkJCXQgPSBudWxsOworCQkJCisJCQlBc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKy8vCQkJTG9nLnJlcG9ydCggImRvd24iICk7CisJCX0KKworICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChSdW5Nb25pdG9yU29ja2V0VGhyZWFkKSk7CisJCXQxLlN0YXJ0KCk7CisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KGRlbGVnYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yPFdoYXQ+IG1vbiA9IGRoLndoYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gbW9uLldhaXRVbnRpbE5vdEVxQW5kU2V0KGRlZmF1bHQoV2hhdCksIFRJTUVPVVQsIGRlZmF1bHQoV2hhdCkpKSAhPSBudWxsKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwlMb2cucmVwb3J0KCAiaGFydmVzdGVkIiwgIm1vbiIsIG1vbiwgInQiLCB0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisJCXQyLlN0YXJ0KCk7CisJCQorCQlDb25zb2xlLldyaXRlTGluZSggInN0b3BwaW5nIiApOworCQljLlN0b3AoKTsKKwkJYy5XYWl0RG93biggVElNRU9VVCApOworCQlDb25zb2xlLldyaXRlTGluZSggInN0b3BwZWQiICk7CisJCQorCQl0MS5Kb2luKCk7CisJCXQyLkpvaW4oKTsKKwl9IAorCisgICAgICAgICNyZWdpb24gRGF0YSB0ZXN0cworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRhMSgpCisgICAgICAgIHsKKworICAgICAgICAgICAgVGNwQ29ubmVjdGlvbiBjID0gbmV3IFRjcENvbm5lY3Rpb24obnVsbCwgInRjcDovLzEyNy4wLjAuMToiICsgcG9ydCwgbnVsbCk7CisgICAgICAgICAgICBNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoYyk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBjLklzU3RhcnRlZCgpICk7CisgICAgICAgICAgICBjLlN0YXJ0KCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBjLklzU3RhcnRlZCgpICk7CisKKyAgICAgICAgICAgIGMuV2FpdFVwKCBUSU1FT1VUICk7CisKKyAgICAgICAgICAgIFNvY2tldCB0ID0gbGguYWNjZXB0ZWQuV2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKworICAgICAgICAgICAgQXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueHNlbmRlciApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueGJ1ZiApOworICAgICAgICAKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtdIHsgMjMgfTsKKyAgICAgICAgICAgIHQuU2VuZCggYnVmICk7CisKKyAgICAgICAgICAgIEFzc2VydFdoYXQoIFdoYXQuREFUQSwgZGgud2hhdCApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggZGgueHNlbmRlciApOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCggZGgueGJ1ZiApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBkaC54YnVmLkxlbmd0aCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAoIGJ5dGUgKSAyMywgZGgueGJ1ZlsgMCBdICk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGMuSXNTdGFydGVkKCkgKTsKKyAgICAgICAgICAgIGMuU3RvcCgpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIGMuSXNTdGFydGVkKCkgKTsKKworICAgICAgICAgICAgQXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54c2VuZGVyICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54YnVmICk7CisKKyAgICAgICAgICAgIHQuQ2xvc2UoKTsKKworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIERhdGEyKCkKKyAgICAgICAgeworCisgICAgICAgICAgICBUY3BDb25uZWN0aW9uIGMgPSBuZXcgVGNwQ29ubmVjdGlvbihudWxsLCAidGNwOi8vMTI3LjAuMC4xOiIgKyBwb3J0LCBudWxsKTsKKyAgICAgICAgICAgIE15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcihjKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIGMuSXNTdGFydGVkKCkgKTsKKyAgICAgICAgICAgIGMuU3RhcnQoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGMuSXNTdGFydGVkKCkgKTsKKworICAgICAgICAgICAgYy5XYWl0VXAoIFRJTUVPVVQgKTsKKworICAgICAgICAgICAgU29ja2V0IHQgPSBsaC5hY2NlcHRlZC5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCxUSU1FT1VULCBudWxsICk7CisKKyAgICAgICAgICAgIEFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IHsgMjEsIDIyLCAyMyB9OworCisgICAgICAgICAgICB0LlNlbmQoIGJ1ZiApOworICAgICAgICAgICAgLy8gdC5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KCBXaGF0LkRBVEEsIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoIGRoLnhidWYgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMywgZGgueGJ1Zi5MZW5ndGggKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggKCBieXRlICkgMjEsIGRoLnhidWZbIDAgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAoIGJ5dGUgKSAyMiwgZGgueGJ1ZlsgMSBdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICggYnl0ZSApIDIzLCBkaC54YnVmWyAyIF0gKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggYy5Jc1N0YXJ0ZWQoKSApOworICAgICAgICAgICAgYy5TdG9wKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggYy5Jc1N0YXJ0ZWQoKSApOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKworICAgICAgICAgICAgdC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIERhdGEzKCkKKyAgICAgICAgeworCisgICAgICAgICAgICBUY3BDb25uZWN0aW9uIGMgPSBuZXcgVGNwQ29ubmVjdGlvbihudWxsLCAidGNwOi8vMTI3LjAuMC4xOiIgKyBwb3J0LCBudWxsKTsKKyAgICAgICAgICAgIE15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcihjKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIGMuSXNTdGFydGVkKCkgKTsKKyAgICAgICAgICAgIGMuU3RhcnQoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGMuSXNTdGFydGVkKCkgKTsKKworICAgICAgICAgICAgYy5XYWl0VXAoIFRJTUVPVVQgKTsKKworICAgICAgICAgICAgU29ja2V0IHQgPSBsaC5hY2NlcHRlZC5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisgICAgICAgICAgICBBc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54c2VuZGVyICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54YnVmICk7CisKKyAgICAgICAgICAgIHQuU2h1dGRvd24oIFNvY2tldFNodXRkb3duLlNlbmQgKTsKKworICAgICAgICAgICAgQXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54c2VuZGVyICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCBkaC54YnVmICk7CisKKyAgICAgICAgICAgIHQuQ2xvc2UoKTsKKyAgICAgICAgICAgIGMuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRhNCgpCisgICAgICAgIHsKKworICAgICAgICAgICAgVGNwQ29ubmVjdGlvbiBjID0gbmV3IFRjcENvbm5lY3Rpb24obnVsbCwgInRjcDovLzEyNy4wLjAuMToiICsgcG9ydCwgbnVsbCk7CisgICAgICAgICAgICBNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoYyk7CisKKwkJICAgIGMuU3RhcnQoKTsKKworICAgICAgICAgICAgYy5XYWl0VXAoIFRJTUVPVVQgKTsKKworCQkgICAgU29ja2V0IHQgPSBsaC5hY2NlcHRlZC5XYWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCxUSU1FT1VULCBudWxsICk7CisgICAgCQkKKwkJICAgIEFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKyAgICAJCQorICAgICAgICAgICAgYnl0ZVtdIHNlbmRCdWYgPSBuZXcgYnl0ZVtdIHsgMjEsIDIyLCAyMyB9OworCisJLy8JICAgIGMuRGF0YSggbnVsbCwgbmV3IEZsZXhCdWZmZXIoIHNlbmRCdWYgKSApOworICAgICAgICAgICAgYy5UcmFuc3BvcnREYXRhKG51bGwsIG5ldyBGbGV4QnVmZmVyKHNlbmRCdWYpKTsKKwkJICAgIC8vIGMuZmx1c2goKTsKKyAgICAJCQorICAgICAgICAgICAgYnl0ZVtdIHJlY2VpdmVCdWYgPSBuZXcgYnl0ZVsgMyBdOworICAgICAgICAgICAgdC5SZWNlaXZlKCByZWNlaXZlQnVmICk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggc2VuZEJ1ZiwgcmVjZWl2ZUJ1ZiApOworCisgICAgICAgICAgICBjLlNodXRkb3duT3V0cHV0KCk7CisgICAgICAgIAkJCisJCSAgICAvLyBBc3NlcnQuQXJlRXF1YWwoIC0xLCBpcy5yZWFkKCkgKTsKKyAgICAJCQorCQkgICAgYy5DbG9zZSgpOworICAgIAkJCisJCSAgICBBc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGRoLnhzZW5kZXIgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGRoLnhidWYgKTsKKyAgICAJCQorCQkgICAgdC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFzc2VydFdoYXQoIFdoYXQgd2hhdCwgTW9uaXRvcjxXaGF0PiBtb24gKQorICAgICAgICB7CisgICAgICAgICAgICBtb24uV2FpdFVudGlsRXFBbmRTZXQoIHdoYXQsIFRJTUVPVVQsIGRlZmF1bHQoIFdoYXQpICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZW51bSBXaGF0IHsgCisgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGlzIHVwCisgICAgICAgICAgICBVUCwgCisgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGlzIGRvd24KKyAgICAgICAgICAgIERPV04sIAorICAgICAgICAgICAgLy8gY29ubmVjdGlvbiByZWFkIHNvbWUgZGF0YQorICAgICAgICAgICAgREFUQSAKKyAgICAgICAgfTsKKworICAgICAgICAjcmVnaW9uIEZpbGxlciBjbGFzc2VzCisKKyAgICAgICAgcHVibGljIGNsYXNzIE15TGlzdGVuZXIgOiBTZXNzaW9uTGlzdGVuZXI8U29ja2V0PgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgTW9uaXRvcjxTb2NrZXQ+IGFjY2VwdGVkID0gbmV3IE1vbml0b3I8U29ja2V0PiggImFjY2VwdGVkIiApOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBBY2NlcHRlZCggU29ja2V0IHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyAgYWNjZXB0ZWQuU2V0KCBzICk7CisgICAgICAgICAgICAgICAgYWNjZXB0ZWQuV2FpdFVudGlsRXFBbmRTZXQobnVsbCwgVElNRU9VVCwgcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgU2Vzc2lvblF1ZXJ5KCBvYmplY3QgcXVlcnkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigidW5rbm93biBxdWVyeTogIiArIHF1ZXJ5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2woIG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oInVua25vd24gY29udHJvbDogICIgKyBjb250cm9sKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeSggb2JqZWN0IGV2ZW50T2JqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRPYmogaXMgRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiTXlMaXN0ZW5lci5TZXNzaW9uTm90aWZ5OiAiICsgZXZlbnRPYmopOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbkxpc3RlbmVyIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkFjY2VwdGVkKFNvY2tldCBzb2NrZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBhY2NlcHRlZC5XYWl0VW50aWxFcUFuZFNldChudWxsLCBUSU1FT1VULCBzb2NrZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlEYXRhSGFuZGxlciA6IFNlc3Npb25EYXRhCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGhvbGRzIGV2ZW50IHR5cGUKKyAgICAgICAgICAgIHB1YmxpYyBNb25pdG9yPFdoYXQ+IHdoYXQgPSBuZXcgTW9uaXRvcjxXaGF0PiggIndoYXQiICk7CisKKwkJICAgIC8vIHNlbmRlciBvZiB0aGUgZXZlbnQgaWYgREFUQSAKKwkJICAgIHB1YmxpYyBXaG8geHNlbmRlcjsKKworCQkgICAgLy8gZGF0YSBvZiB0aGUgZXZlbnQgaWYgREFUQSAKKwkJICAgIHB1YmxpYyBieXRlW10geGJ1ZjsKKyAgICAJCQorICAgICAgICAgICAgLy9wdWJsaWMgdm9pZCBEYXRhKCBXaG8gc2VuZGVyLCBGbGV4QnVmZmVyIGJ1ZiApIAorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICB4c2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgLy8gICAgeGJ1ZiA9IGJ1Zi5HZXRBdmFpbEJ5dGVzKCk7CisgICAgICAgICAgIAorICAgICAgICAgICAgLy8gICAgd2hhdC5XYWl0VW50aWxFcUFuZFNldChkZWZhdWx0KFdoYXQpLCBUSU1FT1VULCBXaGF0LkRBVEEpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICBwdWJsaWMgTXlEYXRhSGFuZGxlcihUY3BDb25uZWN0aW9uIGNvbm4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubi5TZXRTZXNzaW9uKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAKKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBTZXNzaW9uUXVlcnkoIG9iamVjdCBxdWVyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiggIiBVbnN1cHBvcnRlZCBxdWVyeSAiICsgcXVlcnkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2woIG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oICIgVW5zdXBwb3J0ZWQgY29udHJvbCAiICsgY29udHJvbCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uTm90aWZ5KCBvYmplY3QgZXZlbnRPYmogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggZXZlbnRPYmouRXF1YWxzKCBTZXNzaW9uQ29uc3RzLlVQICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeGJ1ZiA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gICAgd2hhdC5TZXQoIFdoYXQuVVAgKTsKKyAgICAgICAgICAgICAgICAgICAgd2hhdC5XYWl0VW50aWxFcUFuZFNldChkZWZhdWx0KFdoYXQpLCBUSU1FT1VULCBXaGF0LlVQKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggZXZlbnRPYmouRXF1YWxzKCBTZXNzaW9uQ29uc3RzLkRPV04gKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4YnVmID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgd2hhdC5XYWl0VW50aWxFcUFuZFNldChkZWZhdWx0KFdoYXQpLCBUSU1FT1VULCBXaGF0LkRPV04pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbkRhdGEgTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uRGF0YShXaG8gc2VuZGVyLCBGbGV4QnVmZmVyIGJ1ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4c2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgICAgIHhidWYgPSBidWYuR2V0QXZhaWxCeXRlcygpOworCisgICAgICAgICAgICAgICAgd2hhdC5XYWl0VW50aWxFcUFuZFNldChkZWZhdWx0KFdoYXQpLCBUSU1FT1VULCBXaGF0LkRBVEEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKyAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFVSTC5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0VVJMLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjRhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFVSTC5jcwpAQCAtMCwwICsxLDM1MSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCisvLyBzIGlzIHNjaGVtZTpbLy9bdXNlcls6cGFzc3dvcmRdQF1ob3N0Wzpwb3J0XS9ddXJpWztwYXJhbXNdWz90ZXJtc11bI2ZyYWdtZW50XQorCituYW1lc3BhY2UgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0VVJMCisgICAgeworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdFVSTCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBBcmd1bWVudE51bGxFeGNlcHRpb24gKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TnVsbFVSTCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXN0VXJsID0gIiI7CisgICAgICAgICAgICBVUkwgdXJsMSA9IG5ldyBVUkwoIHRlc3RVcmwgKTsKKworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQYXJzZSBhIHNpbXBsZSBVUkwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQYXJzZTEoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdGVzdFVybCA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxIjsKKyAgICAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCggdGVzdFVybCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAidGNwIiwgdXJsMS5TY2hlbWUgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggInVzZXIiLCB1cmwxLlVzZXIgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggInBhc3N3b3JkIiwgdXJsMS5QYXNzd29yZCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiMTI3LjAuMC4xIiwgdXJsMS5Ib3N0ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDQwMDEsIHVybDEuUG9ydCApOworCisgICAgICAgICAgICAvL3NjaGVtZSB0ZXN0cworICAgICAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsMS5IYXNUZXJtcygpICk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsMS5IYXNQYXJhbXMoKSApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxLyIsIHVybDEuVG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTY2hlbWVGdW5jdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdGVzdFVybCA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxIjsKKyAgICAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCggdGVzdFVybCApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0Y3AiLCB1cmwxLlNjaGVtZSApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggdXJsMS5Jc1NjaGVtZSggInRjcCIgKSApOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIHVybDEuSXNTY2hlbWUoICIiICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCB1cmwxLklzU2NoZW1lKCAidGNwLSIgKSApOworCisgICAgICAgICAgICB1cmwxLlNjaGVtZSA9ICJ1ZHAiOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAidWRwIiwgdXJsMS5TY2hlbWUgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIHVybDEuSXNTY2hlbWUoICJ1ZHAiICkgKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAidWRwOi8vdXNlcjpwYXNzd29yZEAxMjcuMC4wLjE6NDAwMS8iLCB1cmwxLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VXNlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXN0VXJsID0gInRjcDovL3VzZXI6cGFzc3dvcmRAMTI3LjAuMC4xOjQwMDEiOworICAgICAgICAgICAgVVJMIHVybDEgPSBuZXcgVVJMKCB0ZXN0VXJsICk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggInVzZXIiLCB1cmwxLlVzZXIgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdXJsMS5Vc2VyID0gInVzZXIyIjsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggInVzZXIyIiwgdXJsMS5Vc2VyICk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVybDEuVXNlciA9ICIiOworICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggdHJ1ZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0Y3A6Ly91c2VyMjpwYXNzd29yZEAxMjcuMC4wLjE6NDAwMS8iLCB1cmwxLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UGFzc3dvcmQoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdGVzdFVybCA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxIjsKKyAgICAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCggdGVzdFVybCApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJwYXNzd29yZCIsIHVybDEuUGFzc3dvcmQgKTsKKworICAgICAgICAgICAgdXJsMS5QYXNzd29yZCA9ICJwYXNzd29yZDIiOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAicGFzc3dvcmQyIiwgdXJsMS5QYXNzd29yZCApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0Y3A6Ly91c2VyOnBhc3N3b3JkMkAxMjcuMC4wLjE6NDAwMS8iLCB1cmwxLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SG9zdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXN0VXJsID0gInRjcDovL3VzZXI6cGFzc3dvcmRAMTI3LjAuMC4xOjQwMDEiOworICAgICAgICAgICAgVVJMIHVybDEgPSBuZXcgVVJMKCB0ZXN0VXJsICk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggIjEyNy4wLjAuMSIsIHVybDEuSG9zdCApOworCisgICAgICAgICAgICB1cmwxLkhvc3QgPSAibG9jYWxob3N0IjsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggImxvY2FsaG9zdCIsIHVybDEuSG9zdCApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQGxvY2FsaG9zdDo0MDAxLyIsIHVybDEuVG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQb3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHRlc3RVcmwgPSAidGNwOi8vdXNlcjpwYXNzd29yZEAxMjcuMC4wLjE6NDAwMSI7CisgICAgICAgICAgICBVUkwgdXJsMSA9IG5ldyBVUkwoIHRlc3RVcmwgKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA0MDAxLCB1cmwxLlBvcnQgKTsKKworICAgICAgICAgICAgdXJsMS5Qb3J0ID0gODAwMDsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggODAwMCwgdXJsMS5Qb3J0ICk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVybDEuUG9ydCA9IC0xOworICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEFyZ3VtZW50RXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB0cnVlICk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1cmwxLlBvcnQgPSA2NTUzNjsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBBcmd1bWVudEV4Y2VwdGlvbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB0cnVlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo4MDAwLyIsIHVybDEuVG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RVcmkoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdGVzdFVybCA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxL215VXJpIjsKKyAgICAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCggdGVzdFVybCApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJteVVyaSIsIHVybDEuVXJpICk7CisKKyAgICAgICAgICAgIHVybDEuVXJpID0gIiI7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICIiLCB1cmwxLlVyaSApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxLyIsIHVybDEuVG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RQYXJhbXMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdGVzdFVybCA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxL215VXJpIjsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCB0ZXN0VXJsICk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsLkhhc1BhcmFtcygpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgdXJsLkdldFBhcmFtcygpLkxlbmd0aCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHVybC5HZXRQYXJhbSgiUEFSQU0xPSIpKTsKKworICAgICAgICAgICAgdGVzdFVybCA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxL2N1YWU7UEFSQU0xPTE7UEFSQU0yPTIiOworICAgICAgICAgICAgdXJsID0gbmV3IFVSTCggdGVzdFVybCApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggdXJsLkhhc1BhcmFtcygpICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJQQVJBTTE9MSIsIHVybC5HZXRQYXJhbSggIlBBUkFNMSIgKSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiUEFSQU0yPTIiLCB1cmwuR2V0UGFyYW0oICJQQVJBTTIiICkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gZ2V0IGl0ZXJhdG9yIG92ZXIgcGFyYW1zCisgICAgICAgICAgICBzdHJpbmdbXSBwID0gdXJsLkdldFBhcmFtcygpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHAuTGVuZ3RoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoRmluZCgiUEFSQU0xPTEiLCBwKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKEZpbmQoIlBBUkFNMj0yIiwgcCkpOworCisgICAgICAgICAgICAvLyBhZGQgYSBuZXcgcGFyYW0KKyAgICAgICAgICAgIHVybC5BZGRQYXJhbSggIjAxMjM0NTY3ODkiICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICIwMTIzNDU2Nzg5IiwgdXJsLkdldFBhcmFtKCAiMDEyMyIgKSApOworICAgICAgICAgICAgcCA9IHVybC5HZXRQYXJhbXMoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBwLkxlbmd0aCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKEZpbmQoIlBBUkFNMT0xIiwgcCkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShGaW5kKCJQQVJBTTI9MiIsIHApKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoRmluZCgiMDEyMzQ1Njc4OSIsIHApKTsKKworICAgICAgICAgICAgLy8gcmVtb3ZlIGEgcGFyYW0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggIlBBUkFNMT0xIiwgdXJsLlJlbW92ZVBhcmFtKCAiUEFSQU0xIiApICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHVybC5HZXRQYXJhbSgiUEFSQU0xPSIpKTsKKyAgICAgICAgICAgIHAgPSB1cmwuR2V0UGFyYW1zKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcC5MZW5ndGgpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShGaW5kKCJQQVJBTTI9MiIsIHApKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoRmluZCgiMDEyMzQ1Njc4OSIsIHApKTsKKworICAgICAgICAgICAgLy8gY2xlYXIgYWxsIHBhcmFtcworICAgICAgICAgICAgdXJsLkNsZWFyUGFyYW1zKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsLkhhc1BhcmFtcygpICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgRmluZChzdHJpbmcgcywgc3RyaW5nW10gYSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHggaW4gYSkKKyAgICAgICAgICAgICAgICBpZiAoeC5FcXVhbHMocykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RRdWVyeVRlcm1zKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHRlc3RVcmwgPSAidGNwOi8vdXNlcjpwYXNzd29yZEAxMjcuMC4wLjE6NDAwMS9jdWFlIjsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCB0ZXN0VXJsICk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsLkhhc1Rlcm1zKCkgKTsKKworICAgICAgICAgICAgdGVzdFVybCA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxL2N1YWU/dGVybTE9NTAwIjsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoIHRlc3RVcmwgKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggdXJsLkhhc1Rlcm1zKCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIHVybC5IYXNUZXJtKCAidGVybTEiICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIHVybC5IYXNUZXJtKCAidGVybTEiLCAiNTAwIiApICk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHVybC5IYXNUZXJtKCJ0ZXJtMSIsIDUwMCkpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UodXJsLkhhc1Rlcm0oInRlcm0xIiwgIjEwMDAiKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSh1cmwuSGFzVGVybSgidGVybTEiLCAxMDAwKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSh1cmwuSGFzTXVsdGlwbGVWYWx1ZXMoInRlcm0xIikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MDAiLCB1cmwuR2V0VGVybSgidGVybTEiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTAwLCB1cmwuR2V0SW50ZWdlclRlcm0oInRlcm0xIikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI1MDAiLCB1cmwuR2V0VGVybSgidGVybTEiLCAieCIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDAsIHVybC5HZXRJbnRlZ2VyVGVybSgidGVybTEiLCAyKSk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHVybC5IYXNUZXJtKCJ0ZXJtMiIpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHVybC5IYXNUZXJtKCJ0ZXJtMiIsICI1MDAiKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSh1cmwuSGFzVGVybSgidGVybTIiLCA1MDApKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwodXJsLkdldFRlcm0oInRlcm0yIikpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCh1cmwuR2V0SW50ZWdlclRlcm0oInRlcm0yIikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ4IiwgdXJsLkdldFRlcm0oInRlcm0yIiwgIngiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgdXJsLkdldEludGVnZXJUZXJtKCJ0ZXJtMiIsIDIpKTsKKworICAgICAgICAgICAgLy8gbXVsdGlwbGUgdmFsdWVzIG9mIHRoZSBzYW1lIHRlcm0KKyAgICAgICAgICAgIHVybC5BZGRUZXJtKCAidGVybTEiLCA1MDAuNSApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh1cmwuSGFzTXVsdGlwbGVWYWx1ZXMoInRlcm0xIikpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh1cmwuSGFzVGVybSgidGVybTEiKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHVybC5IYXNUZXJtKCJ0ZXJtMSIsICI1MDAiKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHVybC5IYXNUZXJtKCJ0ZXJtMSIsIDUwMCkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh1cmwuSGFzVGVybSgidGVybTEiLCAiNTAwLjUiKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHVybC5IYXNUZXJtKCJ0ZXJtMSIsIDUwMC41KSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1cmwuR2V0VGVybSggInRlcm0xIiApOworICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCAiRXhjZXB0aW9uIHdhc24ndCB0aHJvd24uLi4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGV4Y2VwdGlvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nW10gdCA9IHVybC5HZXRUZXJtcyggInRlcm0xIiApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHQuTGVuZ3RoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggIjUwMCIsIHRbMF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggIjUwMC41IiwgdFsxXSApOworCisgICAgICAgICAgICAvLyBhZGQgYW5vdGhlciB0ZXJtID0+IG11bHRpcGxlIHRlcm1zCisgICAgICAgICAgICB1cmwuQWRkVGVybSggInRlcm0yIiwgInZhbHVlIiApOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIHVybC5IYXNNdWx0aXBsZVZhbHVlcyggInRlcm0yIiApICk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB1cmwuSGFzVGVybSggInRlcm0yIiApICk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB1cmwuSGFzVGVybSggInRlcm0yIiwgInZhbHVlIiApICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ2YWx1ZSIsIHVybC5HZXRUZXJtKCAidGVybTIiICkgKTsKKworICAgICAgICAgICAgdCA9IHVybC5HZXRUZXJtTmFtZXMoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB0Lkxlbmd0aCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICJ0ZXJtMSIsIHRbMF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggInRlcm0yIiwgdFsxXSApOworCisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSggdXJsLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIC8vIHJlbW92ZSB0ZXJtCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsLlJlbW92ZVRlcm0oICJ0ZXJtMyIgKSApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggdXJsLlJlbW92ZVRlcm0oICJ0ZXJtMiIgKSApOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIHVybC5IYXNUZXJtKCAidGVybTIiICkgKTsKKyAgICAgICAgICAgIHQgPSB1cmwuR2V0VGVybU5hbWVzKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdC5MZW5ndGgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0ZXJtMSIsIHRbMF0pOworCisgICAgICAgICAgICAvLyByZW1vdmUgb25lIHZhbHVlIGZyb20gYSBsaXN0IG9mIHZhbHVlcyBmb3IgYSB0ZXJtCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB1cmwuUmVtb3ZlVGVybSggInRlcm0xIiwgIjUwMC41IiApICk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsLkhhc011bHRpcGxlVmFsdWVzKCAidGVybTEiICkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggIjUwMCIsIHVybC5HZXRUZXJtKCAidGVybTEiICkgKTsKKworICAgICAgICAgICAgLy8gY2xlYXIgdGVybXMKKyAgICAgICAgICAgIHVybC5DbGVhclRlcm1zKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggdXJsLkhhc1Rlcm1zKCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCB1cmwuR2V0VGVybU5hbWVzKCkuTGVuZ3RoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggInRjcDovL3VzZXI6cGFzc3dvcmRAMTI3LjAuMC4xOjQwMDEvY3VhZSIsIHVybC5Ub1N0cmluZygpICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEZyYWdtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHRlc3RVcmwgPSAidGNwOi8vdXNlcjpwYXNzd29yZEAxMjcuMC4wLjE6NDAwMS9jdWFlO3AxO3AyP3QxPTE/dDI9MiI7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCggdGVzdFVybCApOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggdXJsLkZyYWdtZW50ICk7CisKKyAgICAgICAgICAgIHVybC5GcmFnbWVudCA9ICJmcmFnbWVudHMiOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiZnJhZ21lbnRzIiwgdXJsLkZyYWdtZW50ICk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RDb25zdHJ1Y3RvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXN0VXJsMiA9ICJ0Y3A6Ly91c2VyOnBhc3N3b3JkQDEyNy4wLjAuMTo0MDAxL2N1YWU7cDE7cDI/dDE9MT90Mj0yI2ZyYWdtZW50IjsKKyAgICAgICAgICAgIFVSTCB1cmwyID0gbmV3IFVSTCggdGVzdFVybDIgKTsKKyAgICAgICAgICAgIFVSTCB1cmwzID0gbmV3IFVSTCggdXJsMiApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHVybDIuU2NoZW1lLCB1cmwzLlNjaGVtZSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB1cmwyLlVzZXIsIHVybDMuVXNlciApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB1cmwyLlBhc3N3b3JkLCB1cmwzLlBhc3N3b3JkICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHVybDIuSG9zdCwgdXJsMy5Ib3N0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdXJsMi5Qb3J0LCB1cmwzLlBvcnQgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdXJsMi5VcmksIHVybDMuVXJpICk7CisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbCggdXJsMi5HZXRQYXJhbXMoKSwgdXJsMy5HZXRQYXJhbXMoKSApOworICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwoIHVybDIuLCB1cmwzLkdldFRlcm1zKCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdXJsMi5GcmFnbWVudCwgdXJsMy5GcmFnbWVudCApOworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFVybFNlcmlhbGl6ZXIuY3MgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoL1V0aWwvVGVzdFVybFNlcmlhbGl6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExMzZlMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2gvVXRpbC9UZXN0VXJsU2VyaWFsaXplci5jcwpAQCAtMCwwICsxLDY0IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKKworbmFtZXNwYWNlIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFVybFNlcmlhbGl6ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0VXJsU2VyaWFsaXplciIgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIFRlc3RJbXBvcnQoKQorCSAgICB7CisJCSAgICBVUkwgdXJsID0gbmV3IFVSTCggInNjaGVtZTovL3VzZXI6cHdAaG9zdDoyMy9yZXNvdXJjZTtzPTE7dD0yP3A9MyZxPTQjZnJhZyIgKTsKKwkJICAgIFRlc3QoIHVybCApOworCSAgICB9CisgICAgCQorCSAgICBwcml2YXRlIHZvaWQgVGVzdCggVVJMIHVybCApCisJICAgIHsKKyAgICAJCQorCQkgICAgWFR5cGUgdHlwZSA9IG5ldyBYVHlwZSggInVybCIgKTsKKyAgICAgICAgICAgIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSA9IG5ldyBDbGFzczJUeXBlTWFwKCk7CisJCSAgICBVUkxTZXJpYWxpemVyLkluaXQoIHR5cGUsIGNsYXNzMnR5cGUgKTsKKwkJICAgIEltcG9ydEV4cG9ydEhlbHBlciBoZWxwZXIgPSB0eXBlLkdldEltcG9ydEV4cG9ydEhlbHBlcigpOworICAgIAkJCisJCSAgICBTdHJ1Y3RWYWx1ZSBzdiA9IGhlbHBlci5FeHBvcnRWYWx1ZSggdmYsIHVybCApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHN2LkdldFhUeXBlLCB0eXBlICk7CisgICAgCQkKKwkJICAgIFVSTCB1cmwyID0gKFVSTCkgaGVscGVyLkltcG9ydFZhbHVlKCBzdiApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHVybC5Ub1N0cmluZygpLCB1cmwyLlRvU3RyaW5nKCkgKTsKKwkgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL0V0Y2hUZXN0UHJvai5jc3Byb2ogYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoVGVzdFByb2ouY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjEzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9FdGNoVGVzdFByb2ouY3Nwcm9qCkBAIC0wLDAgKzEsMTI2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57M0Q0NEMzM0MtMEU1Ri00NDNCLUEwQjQtQUJERjE2QjY0QUM1fTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+RXRjaDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkV0Y2hUZXN0PC9Bc3NlbWJseU5hbWU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmssIFZlcnNpb249Mi40LjcuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05NmQwOWExZWI3ZjQ0YTc3LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8SGludFBhdGg+JChOVU5JVF9IT01FKVxiaW5cbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcTXNnXFRlc3RDb21ib1ZhbGlkYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXE1zZ1xUZXN0RmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxNc2dcVGVzdEZpZWxkTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcTXNnXFRlc3RJZE5hbWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxNc2dcVGVzdElkTmFtZU1hcC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXE1zZ1xUZXN0TWVzc2FnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXE1zZ1xUZXN0U3RydWN0VmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxNc2dcVGVzdFR5cGVNYXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxNc2dcVGVzdFhUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0RGVmYXVsdFZhbHVlRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFN1cHBvcnRcVGVzdEZyZWVQb29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0UmVtb3RlQmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFN1cHBvcnRcVGVzdFN0dWJCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0VG9kb01hbmFnZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxTdXBwb3J0XFRlc3RUeXBlVmFsaWRhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0VmFsaWRhdG9ycy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFN1cHBvcnRcVGVzdFZhbGlkYXRvcl9ib29sZWFuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0VmFsaWRhdG9yX2J5dGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxTdXBwb3J0XFRlc3RWYWxpZGF0b3JfZG91YmxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0VmFsaWRhdG9yX2Zsb2F0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0VmFsaWRhdG9yX2ludC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFN1cHBvcnRcVGVzdFZhbGlkYXRvcl9sb25nLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcU3VwcG9ydFxUZXN0VmFsaWRhdG9yX29iamVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFN1cHBvcnRcVGVzdFZhbGlkYXRvcl9zaG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFN1cHBvcnRcVGVzdFZhbGlkYXRvcl9zdHJpbmcuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxTdXBwb3J0XFRlc3RWYWxpZGF0b3JfU3RydWN0VmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxTdXBwb3J0XFRlc3RWYWxpZGF0b3Jfdm9pZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFRyYW5zcG9ydFxGaWx0ZXJcVGVzdEtlZXBBbGl2ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFRyYW5zcG9ydFxGaWx0ZXJcVGVzdExvZ2dlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFRyYW5zcG9ydFxGaWx0ZXJcVGVzdFB3QXV0aC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFRyYW5zcG9ydFxGbXRcQmluYXJ5XFRlc3RCaW5hcnlUYWdnZWREYXRhSW5PdXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxUcmFuc3BvcnRcVGVzdEFycmF5VmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxUcmFuc3BvcnRcVGVzdERlZmF1bHREZWxpdmVyeVNlcnZpY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxUcmFuc3BvcnRcVGVzdE1lc3NhZ2l6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxUcmFuc3BvcnRcVGVzdFBsYWluTWFpbGJveC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFRyYW5zcG9ydFxUZXN0UGxhaW5NYWlsYm94TWFuYWdlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFV0aWxcVGVzdEFsYXJtTWFuYWdlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFV0aWxcVGVzdENoYXJJdGVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFV0aWxcVGVzdENpcmN1bGFyUXVldWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxVdGlsXFRlc3REYXRlU2VyaWFsaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFV0aWxcVGVzdEZsZXhCdWZmZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxVdGlsXFRlc3RIZWxwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcVXRpbFxUZXN0SFBUaW1lci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFV0aWxcVGVzdE1vbml0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxVdGlsXFRlc3RQYWNrZXRpemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcVXRpbFxUZXN0U3RyaW5nVXRpbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFdGNoXFV0aWxcVGVzdFN0ckludEhhc2hNYXBTZXJpYWxpemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcVXRpbFxUZXN0U3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXRjaFxVdGlsXFRlc3RUY3BDb25uZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcVXRpbFxUZXN0VVJMLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV0Y2hcVXRpbFxUZXN0VXJsU2VyaWFsaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cbWFpblxjc2hhcnBcRXRjaFByb2ouY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PnswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RXRjaFByb2o8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2JpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWUwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWNzaGFycC9ydW50aW1lL3NyYy90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJFdGNoVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJFdGNoIEMjIFVuaXQgVGVzdHMgRExMIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiQ2lzY28gU3lzdGVtcyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkV0Y2giKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCCpIENpc2NvIFN5c3RlbXMgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiNDQ3MTJhMTUtMjJjMi00YTcyLTljMWEtZTliODhiYmQxMjE5IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIFJldmlzaW9uIGFuZCBCdWlsZCBOdW1iZXJzIAorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9idWlsZC54bWwgYi9iaW5kaW5nLWphdmEvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjdmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvYnVpbGQueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLWphdmEtYmluZGluZyIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+CisgICAgPGRlc2NyaXB0aW9uPkV0Y2gtdG8tSmF2YSBCaW5kaW5nPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guY29tbW9uLnhtbCIgLz4KKworICAgIDwhLS0gc3RhbmRhcmQsIHN1cHBvcnRlZCB0YXJnZXRzIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iRGVidWciICAgICAgICAgZGVwZW5kcz0iZGVidWciIC8+CisgICAgPHRhcmdldCBuYW1lPSJSZWxlYXNlIiAgICAgICBkZXBlbmRzPSJyZWxlYXNlIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iQ2xlYW4iICAgICAgICAgZGVwZW5kcz0iY2xlYW4iIC8+CisgICAgPHRhcmdldCBuYW1lPSJkZWJ1ZyIgICAgICAgICBkZXBlbmRzPSJpbml0LWRlYnVnLGNvbXBvbmVudC1hbGwscG9zdC1kZWJ1ZyIgICAvPgorICAgIDx0YXJnZXQgbmFtZT0icmVsZWFzZSIgICAgICAgZGVwZW5kcz0iaW5pdC1yZWxlYXNlLGNvbXBvbmVudC1hbGwscG9zdC1yZWxlYXNlIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iICAgICAgICAgZGVwZW5kcz0iaW5pdC1jbGVhbixjb21wb25lbnQtYWxsLHBvc3QtY2xlYW4iIC8+CisgICAgPHRhcmdldCBuYW1lPSJtYXZlbi1pbnN0YWxsIiBkZXBlbmRzPSJpbml0LW1hdmVuLHJlbGVhc2UiIC8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtbWF2ZW4iID4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkRPLm1hdmVuLmluc3RhbGwiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiID4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtFdGNoLmxvZ0RpcmVjdG9yeX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtZGVidWciIGRlcGVuZHM9InZhbGlkYXRlLWRlcGVuZGVuY2llcyIgPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiIHZhbHVlPSJEZWJ1ZyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMuZGVidWciIHZhbHVlPSJvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMub3B0aW1pemUiIHZhbHVlPSJvZmYiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InBvc3QtZGVidWciID4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1yZWxlYXNlIiBkZXBlbmRzPSJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiPgorICAgICAgICA8IS0tIEZvciBub3csIGtlZXAgZGVidWctc3ltYm9scyBhbmQgbm8tb3B0aW1pemUsIGV2ZW4gZm9yIHJlbGVhc2UgYnVpbGRzIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiIHZhbHVlPSJSZWxlYXNlIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5qYXZhYy5kZWJ1ZyIgIHZhbHVlPSJvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMub3B0aW1pemUiIHZhbHVlPSJvZmYiIC8+CisgICAgICAgIDwhLS0KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMuZGVidWciICB2YWx1ZT0ib2ZmIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5qYXZhYy5vcHRpbWl6ZSIgdmFsdWU9Im9uIiAvPgorICAgICAgICAtLT4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9InBvc3QtcmVsZWFzZSIgPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJpbml0LWNsZWFuIiBkZXBlbmRzPSJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiIHZhbHVlPSJDbGVhbiIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icG9zdC1jbGVhbiIgPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJFeGVjdXRpbmcgY2xlYW4iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBvbmVudC1hbGwiID4KKyAgICAgICAgPGJ1aWxkX2NvbXBvbmVudCBkaXI9ImNvbXBpbGVyIiAvPgorICAgICAgICA8YnVpbGRfY29tcG9uZW50IGRpcj0icnVudGltZSIgLz4KKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL2NvbXBpbGVyL2J1aWxkLnhtbCBiL2JpbmRpbmctamF2YS9jb21waWxlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5MTg5OAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9jb21waWxlci9idWlsZC54bWwKQEAgLTAsMCArMSwyMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLWphdmEtY29tcGlsZXIiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiPgorICAgIDxkZXNjcmlwdGlvbj5FdGNoLXRvLUphdmEgY29tcGlsZXIgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJhc2VkaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uIiAvPgorICAgIDxpbXBvcnQgZmlsZT0iJHtFdGNoLmJhc2VkaXJ9L2J1aWxkLXN1cHBvcnQvZXRjaC5pbmNsdWRlcy54bWwiIC8+CisKKyAgICA8IS0tIFN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBzdWItcHJvamVjdCAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvaiIgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke0V0Y2guYmFzZWRpcn0vYmluZGluZy1qYXZhL2NvbXBpbGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQiICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vdGFyZ2V0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiICAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vc3JjIiAvPiAgICAgICAgCisgICAgPHByb3BlcnR5IG5hbWU9ImdlbmVyYXRlZFNyYyIgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2dlbmVyYXRlZC1zb3VyY2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzRGlyZWN0b3J5IiAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9jbGFzc2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXNEaXJlY3RvcnkiICAgbG9jYXRpb249IiR7dGFyZ2V0fS9yZXNvdXJjZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RSZXN1bHRzRGlyZWN0b3J5IiBsb2NhdGlvbj0iJHt0YXJnZXR9L3Rlc3QtcmVzdWx0cyIgLz4KKworICAgIDwhLS0gTUFDUk86IGluaXQtdGFyZ2V0IC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJpbml0LXRhcmdldCIgPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDxkZWxldGUgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IiAgIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHtyZXNvdXJjZXNEaXJlY3Rvcnl9IiBmYWlsb25lcnJvcj0iZmFsc2UiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vdGVzdCIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7cmVzb3VyY2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8IS0tIE1BQ1JPOiBjb21waWxlLXNvdXJjZXMgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImNvbXBpbGUtc291cmNlcyIgPgorICAgICAgICA8c2VxdWVudGlhbD4gICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gY29tcGlsZSBjb21waWxlciBwbHVnaW4gLS0+CisgICAgICAgICAgICA8amF2YWMgIGRlYnVnPSIke0V0Y2guamF2YWMuZGVidWd9IgorICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9IjEuNSIKKyAgICAgICAgICAgICAgICAgICAgb3B0aW1pemU9IiR7RXRjaC5qYXZhYy5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgPgorICAgICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9L21haW4vamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IkV0Y2guZGVwZW5kZW5jaWVzLmphci5wYXRocyIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5IT01FfS9saWIvJHtldGNoLWNvbXBpbGVyLmphcn0iIC8+CisgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8L2phdmFjPgorCisgICAgICAgICAgICA8IS0tIGNvbXBpbGVyIHBsdWdpbiByZXNvdXJjZXMgLS0+CisgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiA+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9yZXNvdXJjZXMiPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmt3ZCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi52bSIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L2NvcHk+CisKKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgIDxqYXZhYyAgZGVidWc9IiR7RXRjaC5qYXZhYy5kZWJ1Z30iCisgICAgICAgICAgICAgICAgICAgIHRhcmdldD0iMS41IgorICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtFdGNoLmphdmFjLm9wdGltaXplfSIKKyAgICAgICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiA+CisgICAgICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30vdGVzdC9qYXZhIiAvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iRXRjaC5kZXBlbmRlbmNpZXMuamFyLnBhdGhzIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5IT01FfS9saWIvJHtldGNoLWNvbXBpbGVyLmphcn0iIC8+CisgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8L2phdmFjPgorICAgICAgICAgICAgLS0+CisKKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgCisgICAgPCEtLSBNQUNSTzogYnVuZGxlLWphcnMgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImJ1bmRsZS1qYXJzIiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzdCIgZGVmYXVsdD0iJHtFdGNoLmRpc3R9IiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IkB7ZGlzdH0vbGliIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8IS0tIENSRUFURSBqYXJzIC0tPgorCisgICAgICAgICAgICA8IS0tIFBhY2thZ2UgdXAgZXRjaC1qYXZhLWNvbXBpbGVyIGphciAtLT4KKyAgICAgICAgICAgIDxqYXIgamFyZmlsZT0iQHtkaXN0fS9saWIvJHtldGNoLWphdmEtY29tcGlsZXIuamFyfSIgPgorICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDb3B5cmlnaHQiICAgIHZhbHVlPSIke0V0Y2guY29weXJpZ2h0Tm90aWNlfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJWZXJzaW9uIiAgICAgIHZhbHVlPSIke0V0Y2gudmVyc2lvbn0iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTG9uZ1ZlcnNpb24iICB2YWx1ZT0iJHtFdGNoLmxvbmd2ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsZC1UYWciICAgIHZhbHVlPSIke0V0Y2guYnVpbGRUYWd9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNWTi1SZXZpc2lvbiIgdmFsdWU9IiR7RXRjaC5ydW50aW1lLnJldmlzaW9uTnVtYmVyfSIgLz4KKyAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxtZXRhaW5mIGRpcj0iJHtFdGNoLmJhc2VkaXJ9IiA+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgorICAgICAgICAgICAgICAgIDwvbWV0YWluZj4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy8qKiIgLz4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5jbHVkZSBuYW1lPSJyZXNvdXJjZXMvKioiIC8+IC0tPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvamFyPgorCisgICAgICAgICAgICA8IS0tIENSRUFURSBzb3VyY2UgYXJjaGl2ZXMgLS0+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gcGFja2FnZSB1cCBldGNoLWphdmEtY29tcGlsZXIgc3JjIC0tPgorICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0iQHtkaXN0fS9saWIvJHtldGNoLWphdmEtY29tcGlsZXItc3JjLnppcH0iID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2phdmEiID4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzLyoqLyouamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9yZXNvdXJjZXMiID4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKiIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L3ppcD4KKworICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICAKKyAgICA8IS0tIElOSVQgVEFSR0VUIC0tPgorICAgIDwhLS0gTW9kaWZ5IHRoaXMgdGFyZ2V0IHRvIGRlZmluZSBwcm9qZWN0IHNwZWNpZmljIHByb3BlcnRpZXMgdGhhdCBjYW4gb25seSBiZSBzZXQgYXQgcnVudGltZSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLWluaXQiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9IiBmYWlsb25lcnJvcj0iZmFsc2UiIHF1aWV0PSJ0cnVlIiAvPgorCisgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWRTcmN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Jlc291cmNlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGVzdFJlc3VsdHNEaXJlY3Rvcnl9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBDTEVBTiBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1jbGVhbiI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIEJVSUxEIFRBUkdFVCAtLT4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXNvdXJjZXMiID4KKyAgICAgICAgPCEtLSBHZW5lcmF0ZSB2ZXJzaW9uIGluZm8gLS0+CisgICAgICAgIDx1cGRhdGUtdG9rZW5zIGZpbGVuYW1lPSIke3NyY30vbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhIiAvPiAgCisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtZm9yLWRpc3QiID4KKyAgICAgICAgPCEtLSBJbml0aWFsaXplIHRhcmdldCBkaXJlY3RvcmllcyAtLT4KKyAgICAgICAgPGluaXQtdGFyZ2V0IC8+CisKKyAgICAgICAgPCEtLSBDb21waWxlIFNvdXJjZSAtLT4KKyAgICAgICAgPGNvbXBpbGUtc291cmNlcyAvPgorCisgICAgICAgIDwhLS0gQnVuZGxlIEphcnMgLS0+CisgICAgICAgIDxidW5kbGUtamFycyBkaXN0PSIke0V0Y2guZGlzdH0iIC8+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLWZvci1jbG92ZXIiIGlmPSJDbG92ZXIuZW5hYmxlZCIgPgorCisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlJlYnVpbGRpbmcgd2l0aCBjbG92ZXIiIC8+CisKKyAgICAgICAgPCEtLSBpbml0aWFsaXplLWNsb3ZlciAtLT4KKyAgICAgICAgPGluaXRpYWxpemUtY2xvdmVyIHN1ZmZpeD0iZXRjaGphdmFjb21waWxlciIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9qYXZhIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICA8dGVzdHNvdXJjZXMgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L3Rlc3Rzb3VyY2VzPgorICAgICAgICAgICAgLS0+CisgICAgICAgIDwvaW5pdGlhbGl6ZS1jbG92ZXI+CisgICAgICAgIAorICAgICAgICA8IS0tIEluaXRpYWxpemUgdGFyZ2V0IGRpcmVjdG9yaWVzIC0tPgorICAgICAgICA8aW5pdC10YXJnZXQgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gQ29tcGlsZSBTb3VyY2UgLS0+CisgICAgICAgIDxjb21waWxlLXNvdXJjZXMgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gQnVuZGxlIEphcnMgLS0+CisgICAgICAgIDxidW5kbGUtamFycyBkaXN0PSIke0V0Y2guY2xvdmVyLWRpc3R9IiAvPgorCisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJkby1idWlsZCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyxjb21waWxlLWZvci1kaXN0LGNvbXBpbGUtZm9yLWNsb3ZlciIgLz4KKworICAgIDwhLS0gVEVTVCBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby10ZXN0Ij4KKyAgICAgICAgCisgICAgICAgIDwhLS0gUnVuIFVuaXQgVGVzdHMgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IgorICAgICAgICAgICAgZXJyb3JQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCIgZmFpbHVyZVByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qdW5pdC5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLkhPTUV9L2xpYi8ke2V0Y2gtY29tcGlsZXIuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmNsb3Zlci5qYXJ9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InRydWUiIHRvZGlyPSIke3Rlc3RSZXN1bHRzRGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgICAgICAtLT4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gUE9TVEJVSUxEIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXBvc3RidWlsZCI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXB1Ymxpc2giIGlmPSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgPCEtLSBTZXQgZmxhZyBmaWxlIGlmIGFueSB0ZXN0cyBmYWlsZWQgLS0+CisgICAgICAgIDx0b3VjaCBmaWxlPSIke0V0Y2gucnVudGltZS50ZXN0cy5mYWlsfSIvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9Db21waWxlci5qYXZhIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvQ29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWI4MzdlCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDExMjYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5DbWRMaW5lT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuRXRjaEdyYW1tYXJDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkxvZ0hhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLk91dHB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuQnVpbHRpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LkV4Y2VwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lkl0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTWVzc2FnZURpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1vZHVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1zZ0RpckhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlJlc2VydmVkV29yZENoZWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuU3RydWN0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuVGhyb3duOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuVHlwZVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LlRvU3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuVG9TdHJpbmcuRmllbGRJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuVG9TdHJpbmcuRm10SXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LlRvU3RyaW5nLlN0cmluZ0l0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5leGNlcHRpb24uUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZVNlcnZpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5sb2cuTG9nQ2h1dGU7CisKKworLyoqCisgKiBDb21waWxlciBpcyBhIGhlbHBlciBjbGFzcyBub3Qgb25seSBmb3IgQmFja2VuZCwgYnV0IGFsc28gZm9yIHRoZSB0ZW1wbGF0ZXMuCisgKiBUaGV5IGNhbGwgbWV0aG9kcyBoZXJlIHRvIHBlcmZvcm0gImhhcmQiIHRhc2tzLgorICovCitwdWJsaWMgY2xhc3MgQ29tcGlsZXIgZXh0ZW5kcyBCYWNrZW5kCit7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgdG1wbFBhdGgxID0gIm9yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyLyI7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgdG1wbFBhdGgyID0gInJlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci8iOworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZuU3VmZml4ID0gIi5qYXZhIjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWRVJTSU9OID0gVmVyc2lvbi5WRVJTSU9OICsgIiAvICIKKwkJKyBDb21waWxlclZlcnNpb24uVkVSU0lPTjsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIENvbXBpbGVyLiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIG5vdCBvbmx5IGZvciBCYWNrZW5kLCBidXQKKwkgKiBhbHNvIGZvciB0aGUgdGVtcGxhdGVzLiBUaGV5IGNhbGwgbWV0aG9kcyBoZXJlIHRvIHBlcmZvcm0gImhhcmQiIHRhc2tzLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgQ29tcGlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpbml0VmVsb2NpdHkoKTsKKwkJCisJCVN0cmluZ1tdIHBhdGggPSB7IHRtcGxQYXRoMSwgdG1wbFBhdGgyIH07CisJCXZmX3ZtID0gZ2V0VGVtcGxhdGUoIHBhdGgsICJ2Zi52bSIgKTsKKwkJaW50Zl92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiaW50Zi52bSIgKTsKKwkJcmVtb3RlX3ZtID0gZ2V0VGVtcGxhdGUoIHBhdGgsICJyZW1vdGUudm0iICk7CisJCXN0dWJfdm0gPSBnZXRUZW1wbGF0ZSggcGF0aCwgInN0dWIudm0iICk7CisJCWhlbHBlcl92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiaGVscGVyLnZtIiApOworCQlyZWFkbWVfdm0gPSBnZXRUZW1wbGF0ZSggcGF0aCwgInJlYWRtZS52bSIgKTsKKwkJbWFpbl92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAibWFpbi52bSIgKTsKKwkJYmFzZV92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiYmFzZS52bSIgKTsKKwkJaW1wbF92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAiaW1wbC52bSIgKTsKKworCQlsb2NhbF9rd2QgPSBnZXRQYXRoKCBwYXRoLCAiamF2YUtleXdvcmRzLmt3ZCIgKTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIHZmX3ZtOworCisJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSBpbnRmX3ZtOworCisJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSByZW1vdGVfdm07CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIHN0dWJfdm07CisKKwlwcml2YXRlIGZpbmFsIFRlbXBsYXRlIGhlbHBlcl92bTsKKworCXByaXZhdGUgZmluYWwgVGVtcGxhdGUgcmVhZG1lX3ZtOworCisJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSBtYWluX3ZtOworCisJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSBiYXNlX3ZtOworCisJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSBpbXBsX3ZtOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxfa3dkOworCisJcHJpdmF0ZSBMb2dIYW5kbGVyIGxoOworCQorCS8qKgorCSAqIEluaXRpYWxpemVzIHVzZSBvZiB2ZWxvY2l0eSBlbmdpbmUgYW5kIHNldHMgdXAKKwkgKiByZXNvdXJjZSBsb2FkZXJzLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGluaXRWZWxvY2l0eSgpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCVZlbG9jaXR5LnNldFByb3BlcnR5KCBWZWxvY2l0eS5SVU5USU1FX0xPR19MT0dTWVNURU0sIG5ldyBNeUxvZ2dlcigpICk7CisJCQorCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggVmVsb2NpdHkuUkVTT1VSQ0VfTE9BREVSLCAiZmlsZSwgY2xhc3MiICk7CisKKwkJVmVsb2NpdHkuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5kZXNjcmlwdGlvbiIsICJWZWxvY2l0eSBGaWxlIFJlc291cmNlIExvYWRlciIgKTsKKwkJVmVsb2NpdHkuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5jbGFzcyIsICJvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UubG9hZGVyLkZpbGVSZXNvdXJjZUxvYWRlciIgKTsKKwkJVmVsb2NpdHkuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5wYXRoIiwgIi4iICk7CisKKwkJVmVsb2NpdHkuc2V0UHJvcGVydHkoICJjbGFzcy5yZXNvdXJjZS5sb2FkZXIuZGVzY3JpcHRpb24iLCAiVmVsb2NpdHkgQ2xhc3NwYXRoIFJlc291cmNlIExvYWRlciIgKTsKKwkJVmVsb2NpdHkuc2V0UHJvcGVydHkoICJjbGFzcy5yZXNvdXJjZS5sb2FkZXIuY2xhc3MiLCAib3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLnJlc291cmNlLmxvYWRlci5DbGFzc3BhdGhSZXNvdXJjZUxvYWRlciIgKTsKKwkJCisJCVZlbG9jaXR5LmluaXQoKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlMb2dnZXIgaW1wbGVtZW50cyBMb2dDaHV0ZQorCXsKKwkJcHJpdmF0ZSBmaW5hbCBMb2dIYW5kbGVyIGxoID0gbnVsbDsKKwkJCisJCXB1YmxpYyB2b2lkIGluaXQoIFJ1bnRpbWVTZXJ2aWNlcyBydHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCS8vIGlnbm9yZS4KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzTGV2ZWxFbmFibGVkKCBpbnQgbGV2ZWwgKQorCQl7CisJCQlyZXR1cm4gbGV2ZWwgPj0gMjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGxvZyggaW50IGxldmVsLCBTdHJpbmcgbXNnICkKKwkJeworCQkJaWYgKGxldmVsIDwgMikKKwkJCQlyZXR1cm47CisJCQkKKwkJCWlmIChsaCAhPSBudWxsKQorCQkJCWxoLnJlcG9ydCggbGV2ZWwgPT0gMiA/IExvZ0hhbmRsZXIuTEVWRUxfV0FSTklORyA6IExvZ0hhbmRsZXIuTEVWRUxfRVJST1IsIG51bGwsIG1zZyApOworCQkJZWxzZQorCQkJCVN5c3RlbS5vdXQucHJpbnRmKCAiVmVsb2NpdHkgbXNnICglZCk6ICVzXG4iLCBsZXZlbCwgbXNnICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBsb2coIGludCBsZXZlbCwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUgKQorCQl7CisJCQlpZiAobGV2ZWwgPCAyKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKGxoICE9IG51bGwpCisJCQkJbGgucmVwb3J0KCBsZXZlbCA9PSAyID8gTG9nSGFuZGxlci5MRVZFTF9XQVJOSU5HIDogTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwgbnVsbCwgbXNnICk7CisJCQllbHNlCisJCQkJU3lzdGVtLm91dC5wcmludGYoICJWZWxvY2l0eSBtc2cgKCVkKTogJXM6ICVzXG4iLCBsZXZlbCwgbXNnLCBlICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcGF0aAorCSAqIEBwYXJhbSBmbgorCSAqIEByZXR1cm4gdGhlIHZlbG9jaXR5IHRlbXBsYXRlCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIFRlbXBsYXRlIGdldFRlbXBsYXRlKCBTdHJpbmdbXSBwYXRoLCBTdHJpbmcgZm4gKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHJuZmUgPSBudWxsOworCQkKKwkJZm9yIChTdHJpbmcgcDogcGF0aCkKKwkJeworCQkJaWYgKHAgPT0gbnVsbCkKKwkJCQljb250aW51ZTsKKwkJCQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ0cnlpbmcgdG8gbG9hZCB0ZW1wbGF0ZSAiKyhwK2ZuKSApOworCQkJdHJ5CisJCQl7CisJCQkJaWYgKFZlbG9jaXR5LnJlc291cmNlRXhpc3RzKCBwK2ZuICkpCisJCQkJCXJldHVybiBWZWxvY2l0eS5nZXRUZW1wbGF0ZSggcCtmbiApOworCQkJfQorCQkJY2F0Y2ggKCBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCXJuZmUgPSBlOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCAiaWdub3JpbmcgIitlKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHJuZmUgIT0gbnVsbCkKKwkJCXRocm93IHJuZmU7CisJCQorCQl0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigiY291bGQgbm90IGZpbmQgcmVzb3VyY2U6ICIrZm4pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGdlbmVyYXRlKCBNb2R1bGUgbW9kdWxlLCBDbWRMaW5lT3B0aW9ucyBvcHRpb25zICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gamF2YSBhbHdheXMgd2FudHMgdG8gbm90IGZsYXR0ZW4gcGFja2FnZXM6CisJCW9wdGlvbnMubm9GbGF0dGVuUGFja2FnZXMgPSB0cnVlOworCQkKKwkJbGggPSBvcHRpb25zLmxoOworCisJCWJvb2xlYW4gaWdub3JlR2xvYmFsID0gb3B0aW9ucy5pZ25vcmVHbG9iYWxXb3Jkc0xpc3Q7CisJCWJvb2xlYW4gaWdub3JlTG9jYWwgPSBvcHRpb25zLmlnbm9yZUxvY2FsV29yZHNMaXN0OworCQlTdHJpbmcgdXNlcldvcmRzID0gb3B0aW9ucy51c2VyV29yZHNMaXN0ICE9IG51bGwgPyBvcHRpb25zLnVzZXJXb3Jkc0xpc3QuZ2V0UGF0aCgpIDogbnVsbDsKKwkJU2V0PFN0cmluZz4gd2hhdCA9IG9wdGlvbnMud2hhdDsKKworCQkvLyBMb2FkIHRoZSByZXNlcnZlZCB3b3JkcyBsaXN0cyBpZiBhbnkgaGF2ZSBiZWVuIHByb3ZpZGVkLgorCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHdvcmRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWlmICghaWdub3JlR2xvYmFsKQorCQkJbWFwV29yZHMoIGdsb2JhbF9rd2QsIHdvcmRzICk7CisJCWlmICghaWdub3JlTG9jYWwpCisJCQltYXBXb3JkcyggbG9jYWxfa3dkLCB3b3JkcyApOworCQlpZiAodXNlcldvcmRzICE9IG51bGwpCisJCQltYXBXb3JkcyggdXNlcldvcmRzLCB3b3JkcyApOworCisJCS8vIGNoZWNrIGZvciBjb2xsaXNpb25zIHdpdGggdGhlIHJlc2VydmVkIHdvcmQgbGlzdC4KKwkJUmVzZXJ2ZWRXb3JkQ2hlY2tlciBjaGVja2VyID0gbmV3IFJlc2VydmVkV29yZENoZWNrZXIoIHdvcmRzLCBmYWxzZSwgbGggKTsKKwkJbW9kdWxlLnRyZWV3YWxrKCBjaGVja2VyICk7CisJCWlmICghY2hlY2tlci5vaygpKQorCQl7CisJCQlsaC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfRVJST1IsIG51bGwsICJFbmNvdW50ZXJlZCBlcnJvcnMgZHVyaW5nIGphdmEgZ2VuZXJhdGlvbi4iICk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBvaywgd2UncmUgcmVhZHkgdG8gZ2VuZXJhdGUgY29kZS4gbWFrZSBzdXJlIHRoZQorCQkvLyBvdXRwdXQgZGlyZWN0b3JpZXMgZXhpc3QuCisKKwkJT3V0cHV0IGRpciA9IG9wdGlvbnMub3V0cHV0OworCQlPdXRwdXQgdGVtcGxhdGVEaXIgPSBvcHRpb25zLnRlbXBsYXRlT3V0cHV0OworCQkKKwkJU3RyaW5nIG0gPSBtb2R1bGUubmFtZSgpLm5hbWU7CisJCWlmIChtLmxlbmd0aCgpID4gMCkKKwkJeworCQkJZGlyID0gZGlyLm5ld1BhY2thZ2UoIG0gKTsKKwkJCXRlbXBsYXRlRGlyID0gdGVtcGxhdGVEaXIubmV3UGFja2FnZSggbSApOworCQl9CisJCQorCQkvLyBnZW5lcmF0ZSBjb2RlIGZvciBlYWNoIHNlcnZpY2UuCisKKwkJZm9yIChTZXJ2aWNlIGludGYgOiBtb2R1bGUpCisJCXsKKwkJCWdlbmVyYXRlKCBpbnRmLCB3aGF0LCBkaXIsIHRlbXBsYXRlRGlyICk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGUoIGZpbmFsIFNlcnZpY2UgaW50ZiwgU2V0PFN0cmluZz4gd2hhdCwgT3V0cHV0IGRpciwKKwkJT3V0cHV0IHRlbXBsYXRlRGlyICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJd2hhdCA9IHBvcHVsYXRlV2hhdCggd2hhdCApOworCisJCWlmICh3aGF0LmlzRW1wdHkoKSkKKwkJeworCQkJLy8gbGgubG9nTWVzc2FnZSggbGguTEVWRUxfRVJST1IsIG51bGwsICJVc2VyIGhhcyBzZWxlY3RlZCBOT05FXG4iICk7CisJCQlyZXR1cm47CisJCX0KKworCQlmaW5hbCBNZXNzYWdlRGlyZWN0aW9uIG1zZ0RpciA9IGdldE1lc3NhZ2VEaXJlY3Rpb24oIHdoYXQgKTsKKworCQlpZiAod2hhdC5jb250YWlucyggV0hBVF9JTlRGICkpCisJCXsKKwkJCS8vIEdlbmVyYXRlIHRoZSB2YWx1ZSBmYWN0b3J5IGZpbGUuCisJCQkKKwkJCWdlbmVyYXRlVmYoIGludGYsIGRpciApOworCQorCQkJLy8gR2VuZXJhdGUgdGhlIGludGVyZmFjZSwgcmVtb3RlLCBhbmQgc3R1YiBmaWxlcy4KKwkKKwkJCWdlbmVyYXRlSW50ZlJlbW90ZVN0dWIoIGludGYsIGRpciwgbXNnRGlyLCBNZXNzYWdlRGlyZWN0aW9uLkJPVEgsIGZhbHNlICk7CisJCisJCQlnZW5lcmF0ZUludGZSZW1vdGVTdHViKCBpbnRmLCBkaXIsIG1zZ0RpciwgTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIsIHRydWUgKTsKKwkKKwkJCWdlbmVyYXRlSW50ZlJlbW90ZVN0dWIoIGludGYsIGRpciwgbXNnRGlyLCBNZXNzYWdlRGlyZWN0aW9uLkNMSUVOVCwgdHJ1ZSApOworCQorCQkJLy8gR2VuZXJhdGUgaGVscGVyIGZpbGUuCisJCisJCQlnZW5lcmF0ZUhlbHBlciggaW50ZiwgZGlyLCBtc2dEaXIgKTsKKwkJCQorCQkJLy8gR2VuZXJhdGUgYmFzZSBmaWxlLgorCQkJCisJCQlnZW5lcmF0ZUJhc2UoIGludGYsIGRpciwgbXNnRGlyICk7CisJCisJCQkvLyBHZW5lcmF0ZSByZWFkbWUgZmlsZS4KKwkJCQorCQkJZ2VuZXJhdGVSZWFkbWUoIGludGYsIGRpciwgbXNnRGlyICk7CisJCX0KKworCQkvLyBHZW5lcmF0ZSBtYWluIHRlbXBsYXRlIGZpbGUuCisKKwkJaWYgKHdoYXQuY29udGFpbnMoIFdIQVRfTUFJTiApKQorCQkJZ2VuZXJhdGVNYWluKCBpbnRmLCB0ZW1wbGF0ZURpciwgbXNnRGlyICk7CisKKwkJLy8gR2VuZXJhdGUgaW1wbCB0ZW1wbGF0ZSBmaWxlLgorCisJCWlmICh3aGF0LmNvbnRhaW5zKCBXSEFUX0lNUEwgKSkKKwkJCWdlbmVyYXRlSW1wbCggaW50ZiwgdGVtcGxhdGVEaXIsIG1zZ0RpciApOworCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVJlYWRtZSggZmluYWwgU2VydmljZSBpbnRmLCBPdXRwdXQgZGlyLAorCQlmaW5hbCBNZXNzYWdlRGlyZWN0aW9uIG1zZ0RpciApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWRvRmlsZSggZGlyLCAicmVhZG1lLWV0Y2gtamF2YS1maWxlcy50eHQiLCBsaCwgbmV3IEdlbigpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1biggUHJpbnRXcml0ZXIgcHcgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJZ2VuZXJhdGVSZWFkbWUoIHB3LCBpbnRmLCBtc2dEaXIgKTsKKwkJCX0KKwkJfSApOworCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVZmKCBmaW5hbCBTZXJ2aWNlIGludGYsIE91dHB1dCBkaXIgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkb0ZpbGUoIGRpciwgZ2V0VmZOYW1lKCBpbnRmICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQl7CisJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCWdlbmVyYXRlVmYoIHB3LCBpbnRmICk7CisJCQl9CisJCX0gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVIZWxwZXIoIGZpbmFsIFNlcnZpY2UgaW50ZiwgT3V0cHV0IGRpciwKKwkJZmluYWwgTWVzc2FnZURpcmVjdGlvbiBtc2dEaXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkb0ZpbGUoIGRpciwgZ2V0SGVscGVyTmFtZSggaW50ZiApICsgZm5TdWZmaXgsIGxoLCBuZXcgR2VuKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlnZW5lcmF0ZUhlbHBlciggcHcsIGludGYsIG1zZ0RpciApOworCQkJfQorCQl9ICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTWFpbiggZmluYWwgU2VydmljZSBpbnRmLCBPdXRwdXQgZGlyLAorCQlNZXNzYWdlRGlyZWN0aW9uIG1zZ0RpciApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChtc2dEaXIgPT0gTWVzc2FnZURpcmVjdGlvbi5CT1RICisJCQkJfHwgbXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5UKQorCQkJZG9GaWxlKCBkaXIsIGdldE1haW5OYW1lKCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLkNMSUVOVCApICsgZm5TdWZmaXgsIGxoLCBuZXcgR2VuKCkKKwkJCXsKKwkJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJCXsKKwkJCQkJZ2VuZXJhdGVNYWluKCBwdywgaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5DTElFTlQsIGZhbHNlICk7CisJCQkJfQorCQkJfSApOworCisJCWlmIChtc2dEaXIgPT0gTWVzc2FnZURpcmVjdGlvbi5CT1RICisJCQkJfHwgbXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uU0VSVkVSKQorCQkJZG9GaWxlKCBkaXIsIGdldE1haW5OYW1lKCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUiApICsgZm5TdWZmaXgsIGxoLCBuZXcgR2VuKCkKKwkJCXsKKwkJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJCXsKKwkJCQkJZ2VuZXJhdGVNYWluKCBwdywgaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIsIGZhbHNlICk7CisJCQkJfQorCQkJfSApOworCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUJhc2UoIGZpbmFsIFNlcnZpY2UgaW50ZiwgT3V0cHV0IGRpciwKKwkJTWVzc2FnZURpcmVjdGlvbiBtc2dEaXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAobXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USCB8fCBtc2dEaXIgPT0gTWVzc2FnZURpcmVjdGlvbi5DTElFTlQpCisJCQlkb0ZpbGUoIGRpciwgZ2V0QmFzZU5hbWUoIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5UICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQkJeworCQkJCXB1YmxpYyB2b2lkIHJ1biggUHJpbnRXcml0ZXIgcHcgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQkJeworCQkJCQlnZW5lcmF0ZUJhc2UgKHB3LCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLkNMSUVOVCwgZmFsc2UgKTsKKwkJCQl9CisJCQl9ICk7CisKKwkJaWYgKG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLkJPVEggfHwgbXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uU0VSVkVSKQorCQkJZG9GaWxlKCBkaXIsIGdldEJhc2VOYW1lKCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUiApICsgZm5TdWZmaXgsIGxoLCBuZXcgR2VuKCkKKwkJCXsKKwkJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJCXsKKwkJCQkJZ2VuZXJhdGVCYXNlIChwdywgaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIsIGZhbHNlICk7CisJCQkJfQorCQkJfSApOworCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUltcGwoIGZpbmFsIFNlcnZpY2UgaW50ZiwgT3V0cHV0IGRpciwKKwkJTWVzc2FnZURpcmVjdGlvbiBtc2dEaXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAobXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USAorCQkJCXx8IG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLkNMSUVOVCkKKwkJCWRvRmlsZSggZGlyLCBnZXRJbXBsTmFtZSggaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5DTElFTlQgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCQl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCWdlbmVyYXRlSW1wbCggcHcsIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5ULCBmYWxzZSApOworCQkJCX0KKwkJCX0gKTsKKworCQlpZiAobXNnRGlyID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USAorCQkJCXx8IG1zZ0RpciA9PSBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUikKKwkJCWRvRmlsZSggZGlyLCBnZXRJbXBsTmFtZSggaW50ZiwgTWVzc2FnZURpcmVjdGlvbi5TRVJWRVIgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCQl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCWdlbmVyYXRlSW1wbCggcHcsIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uU0VSVkVSLCBmYWxzZSApOworCQkJCX0KKwkJCX0gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVJbnRmUmVtb3RlU3R1YiggZmluYWwgU2VydmljZSBpbnRmLCBPdXRwdXQgZGlyLAorCQlmaW5hbCBNZXNzYWdlRGlyZWN0aW9uIHdoYXQsIGZpbmFsIE1lc3NhZ2VEaXJlY3Rpb24gbWMsCisJCWZpbmFsIGJvb2xlYW4gaGFzQmFzZUNsYXNzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gR2VuZXJhdGUgaW50ZXJmYWNlIGZpbGUKKworCQlkb0ZpbGUoIGRpciwgZ2V0SW50Zk5hbWUoIGludGYsIG1jICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQl7CisJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCWdlbmVyYXRlSW50ZiggcHcsIGludGYsIG1jLCBoYXNCYXNlQ2xhc3MgKTsKKwkJCX0KKwkJfSApOworCisJCS8vIEdlbmVyYXRlIHJlbW90ZSBmaWxlCisKKwkJaWYgKG1jID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USCB8fCB3aGF0ID09IE1lc3NhZ2VEaXJlY3Rpb24uQk9USAorCQkJCXx8IG1jICE9IHdoYXQpCisJCQlkb0ZpbGUoIGRpciwgZ2V0UmVtb3RlTmFtZSggaW50ZiwgbWMgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCQl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCWdlbmVyYXRlUmVtb3RlKCBwdywgaW50ZiwgbWMsIGhhc0Jhc2VDbGFzcyApOworCQkJCX0KKwkJCX0gKTsKKworCQkvLyBHZW5lcmF0ZSBzdHViIGZpbGUKKworCQlpZiAobWMgPT0gTWVzc2FnZURpcmVjdGlvbi5CT1RIIHx8IHdoYXQgPT0gTWVzc2FnZURpcmVjdGlvbi5CT1RICisJCQkJfHwgbWMgPT0gd2hhdCkKKwkJCWRvRmlsZSggZGlyLCBnZXRTdHViTmFtZSggaW50ZiwgbWMgKSArIGZuU3VmZml4LCBsaCwgbmV3IEdlbigpCisJCQl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBQcmludFdyaXRlciBwdyApIHRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCWdlbmVyYXRlU3R1YiggcHcsIGludGYsIG1jLCBoYXNCYXNlQ2xhc3MgKTsKKwkJCQl9CisJCQl9ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIHZhbHVlIGZhY3RvcnkgZm9yIHRoZSBzZXJ2aWNlLgorCSAqCisJICogQHBhcmFtIHB3CisJICogQHBhcmFtIGludGYKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVWZiggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHBhcmFtcyBrZWVwcyB0cmFjayBvZiB0aGUgdG90YWwgc2V0IG9mIHBhcmFtZXRlcnMKKwkJLy8gbmFtZWQgKGZvciBlbnVtcywgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIG1lc3NhZ2VzKS4KKwkJU2V0PFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQljb250ZXh0LnB1dCggIm5vdyIsIG5ldyBEYXRlKCkgKTsKKwkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJY29udGV4dC5wdXQoICJpbnRmIiwgaW50ZiApOworCQljb250ZXh0LnB1dCggInBhcmFtcyIsIHBhcmFtcyApOworCQl2Zl92bS5tZXJnZSggY29udGV4dCwgcHcgKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciB0aGUgc2VydmljZS4KKwkgKgorCSAqIEBwYXJhbSBwdworCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG1jCisJICogQHBhcmFtIGhhc0Jhc2VDbGFzcworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJdm9pZCBnZW5lcmF0ZUludGYoIFByaW50V3JpdGVyIHB3LCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMsCisJCWJvb2xlYW4gaGFzQmFzZUNsYXNzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmVsb2NpdHlDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7CisJCWNvbnRleHQucHV0KCAibm93IiwgbmV3IERhdGUoKSApOworCQljb250ZXh0LnB1dCggInZlcnNpb24iLCBWRVJTSU9OICk7CisJCWNvbnRleHQucHV0KCAiaGVscGVyIiwgdGhpcyApOworCQljb250ZXh0LnB1dCggImludGYiLCBpbnRmICk7CisJCWNvbnRleHQucHV0KCAibWMiLCBtYyApOworCQljb250ZXh0LnB1dCggInN1ZmZpeCIsIE1zZ0RpckhlbHBlci5nZXRTdWZmaXgoIG1jICkgKTsKKwkJY29udGV4dC5wdXQoICJoYXNCYXNlQ2xhc3MiLCBoYXNCYXNlQ2xhc3MgKTsKKwkJaW50Zl92bS5tZXJnZSggY29udGV4dCwgcHcgKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgY2FsbCB0byBtZXNzYWdlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UuIFRoaXMgY2xhc3MKKwkgKiB0dXJucyBjYWxscyBvbiBpdHMgbWV0aG9kcyBpbnRvIG1lc3NhZ2VzIHdoaWNoIGFyZSBzZW50IHRvIHRoZSByZW1vdGUKKwkgKiBzdHViLiBGb3IgdHdvLXdheSBjYWxscywgaXQgdGhlbiB3YWl0cyBmb3IgYSByZXNwb25zZSBtZXNzYWdlLCByZXR1cm5pbmcKKwkgKiB0aGUgcmVzdWx0IHRoZXJlaW4gdG8gdGhlIGNhbGxlci4KKwkgKgorCSAqIEBwYXJhbSBwdworCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG1jCisJICogQHBhcmFtIGhhc0Jhc2VDbGFzcworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJdm9pZCBnZW5lcmF0ZVJlbW90ZSggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYywKKwkJYm9vbGVhbiBoYXNCYXNlQ2xhc3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCWNvbnRleHQucHV0KCAidmVyc2lvbiIsIFZFUlNJT04gKTsKKwkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJY29udGV4dC5wdXQoICJtYyIsIG1jICk7CisJCWNvbnRleHQucHV0KCAic3VmZml4IiwgTXNnRGlySGVscGVyLmdldFN1ZmZpeCggbWMgKSApOworCQljb250ZXh0LnB1dCggImhhc0Jhc2VDbGFzcyIsIGhhc0Jhc2VDbGFzcyApOworCQljb250ZXh0LnB1dCggIm1ldGhvZExpc3QiLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisJCXJlbW90ZV92bS5tZXJnZSggY29udGV4dCwgcHcgKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgbWVzc2FnZSB0byBjYWxsIGltcGxlbWVudGF0aW9uLiBUaGlzIGNsYXNzIGFjY2VwdHMgYSBtZXNzYWdlCisJICogYW5kIHR1cm5zIGl0IGJhY2sgaW50byBhIGNhbGwgb24gdGhlIHVzZXIncyBpbXBsZW1lbnRhdGlvbi4gRm9yIHR3by13YXkKKwkgKiBtZXNzYWdlcywgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB1c2VyJ3MgaW1wbGVtZW50YXRpb24gbWV0aG9kIGlzIHR1cm5lZAorCSAqIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlc3BvbnNlIG1lc3NhZ2UgYW5kIHNlbnQuCisJICoKKwkgKiBAcGFyYW0gcHcKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBtYworCSAqIEBwYXJhbSBoYXNCYXNlQ2xhc3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVTdHViKCBQcmludFdyaXRlciBwdywgU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jLAorCQlib29sZWFuIGhhc0Jhc2VDbGFzcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQljb250ZXh0LnB1dCggIm5vdyIsIG5ldyBEYXRlKCkgKTsKKwkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJY29udGV4dC5wdXQoICJpbnRmIiwgaW50ZiApOworCQljb250ZXh0LnB1dCggIm1jIiwgbWMgKTsKKwkJY29udGV4dC5wdXQoICJzdWZmaXgiLCBNc2dEaXJIZWxwZXIuZ2V0U3VmZml4KCBtYyApICk7CisJCWNvbnRleHQucHV0KCAiaGFzQmFzZUNsYXNzIiwgaGFzQmFzZUNsYXNzICk7CisJCXN0dWJfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIHRyYW5zcG9ydCBwbHVtYmluZyBoZWxwZXIuCisJICoKKwkgKiBAcGFyYW0gcHcKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBtYworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJdm9pZCBnZW5lcmF0ZUhlbHBlciggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYyApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQljb250ZXh0LnB1dCggIm5vdyIsIG5ldyBEYXRlKCkgKTsKKwkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJY29udGV4dC5wdXQoICJpbnRmIiwgaW50ZiApOworCQljb250ZXh0LnB1dCggIm1jIiwgbWMgKTsKKworCQloZWxwZXJfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIHJlYWRtZS50eHQuCisJICoKKwkgKiBAcGFyYW0gcHcKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBtYworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJdm9pZCBnZW5lcmF0ZVJlYWRtZSggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQljb250ZXh0LnB1dCggIm5vdyIsIG5ldyBEYXRlKCkgKTsKKwkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJY29udGV4dC5wdXQoICJpbnRmIiwgaW50ZiApOworCQljb250ZXh0LnB1dCggIm1jIiwgbWMgKTsKKworCQlyZWFkbWVfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIHRlbXBsYXRlIG1haW4gcHJvZ3JhbS4KKwkgKgorCSAqIEBwYXJhbSBwdworCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG1jCisJICogQHBhcmFtIGhhc0Jhc2VDbGFzcworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJdm9pZCBnZW5lcmF0ZU1haW4oIFByaW50V3JpdGVyIHB3LCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMsCisJCWJvb2xlYW4gaGFzQmFzZUNsYXNzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmVsb2NpdHlDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7CisJCWNvbnRleHQucHV0KCAibm93IiwgbmV3IERhdGUoKSApOworCQljb250ZXh0LnB1dCggInZlcnNpb24iLCBWRVJTSU9OICk7CisJCWNvbnRleHQucHV0KCAiaGVscGVyIiwgdGhpcyApOworCQljb250ZXh0LnB1dCggImludGYiLCBpbnRmICk7CisJCWNvbnRleHQucHV0KCAibWMiLCBtYyApOworCQljb250ZXh0LnB1dCggInN1ZmZpeCIsIE1zZ0RpckhlbHBlci5nZXRTdWZmaXgoIG1jICkgKTsKKwkJY29udGV4dC5wdXQoICJoYXNCYXNlQ2xhc3MiLCBoYXNCYXNlQ2xhc3MgKTsKKwkJbWFpbl92bS5tZXJnZSggY29udGV4dCwgcHcgKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZXMgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZXMsIHdpdGggZWFjaAorCSAqIG1ldGhvZCB0aHJvd2luZyBhbiBleGNlcHRpb24gdG8gdGhlIHR1bmUgdGhhdCBpdCBpc24ndCBpbXBsZW1lbnRlZC4KKwkgKiBVc2VyJ3MgaW1wbCB3aWxsIGV4dGVuZCB0aGlzIGJhc2UgaW1wbGVtZW50YXRpb24uCisJICogQHBhcmFtIHB3CisJICogQHBhcmFtIGludGYKKwkgKiBAcGFyYW0gbWMKKwkgKiBAcGFyYW0gaGFzQmFzZUNsYXNzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwl2b2lkIGdlbmVyYXRlQmFzZSggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYywKKwkJYm9vbGVhbiBoYXNCYXNlQ2xhc3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCQljb250ZXh0LnB1dCggInZlcnNpb24iLCBWRVJTSU9OICk7CisJCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJCWNvbnRleHQucHV0KCAibWMiLCBtYyApOworCQkJY29udGV4dC5wdXQoICJzdWZmaXgiLCBNc2dEaXJIZWxwZXIuZ2V0U3VmZml4KCBtYyApICk7CisJCQljb250ZXh0LnB1dCggImhhc0Jhc2VDbGFzcyIsIGhhc0Jhc2VDbGFzcyApOworCQkJY29udGV4dC5wdXQoICJtZXRob2RMaXN0IiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQkJYmFzZV92bS5tZXJnZSggY29udGV4dCwgcHcgKTsKKwkJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIHRlbXBsYXRlIHVzZXIgaW1wbGVtZW50aW9uIGNsYXNzIHdoaWNoIGV4dGVuZHMgdGhlIGJhc2UKKwkgKiBpbXBsZW1lbnRhdGlvbiBnZW5lcmF0ZWQgYWJvdmUuIFRoaXMgY2xhc3Mgd2lsbCBvbmx5IGhhdmUgdGhlIGFwcHJvcHJpYXRlCisJICogY29uc3RydWN0b3IgYW5kIHJlZmVyZW5jZSB0byB0aGUgYXBwcm9wcmlhdGUgcmVtb3RlLCBhbmQgYSBjb21tZW50IGludml0aW5nCisJICogdGhlIHVzZXIgdG8gb3ZlcnJpZGUgbWV0aG9kcy4KKwkgKiBAcGFyYW0gcHcKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBtYworCSAqIEBwYXJhbSBoYXNCYXNlQ2xhc3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVJbXBsKCBQcmludFdyaXRlciBwdywgU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jLAorCQlib29sZWFuIGhhc0Jhc2VDbGFzcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworCQljb250ZXh0LnB1dCggIm5vdyIsIG5ldyBEYXRlKCkgKTsKKwkJY29udGV4dC5wdXQoICJ2ZXJzaW9uIiwgVkVSU0lPTiApOworCQljb250ZXh0LnB1dCggImhlbHBlciIsIHRoaXMgKTsKKwkJY29udGV4dC5wdXQoICJpbnRmIiwgaW50ZiApOworCQljb250ZXh0LnB1dCggIm1jIiwgbWMgKTsKKwkJY29udGV4dC5wdXQoICJzdWZmaXgiLCBNc2dEaXJIZWxwZXIuZ2V0U3VmZml4KCBtYyApICk7CisJCWNvbnRleHQucHV0KCAiaGFzQmFzZUNsYXNzIiwgaGFzQmFzZUNsYXNzICk7CisJCWltcGxfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VmZOYW1lKCBTZXJ2aWNlIGludGYgKQorCXsKKwkJcmV0dXJuICJWYWx1ZUZhY3RvcnkiICsgZ2V0SW50Zk5hbWUoIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24uQk9USCApOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEludGZOYW1lKCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMgKQorCXsKKwkJU3RyaW5nIHN1ZmZpeCA9IE1zZ0RpckhlbHBlci5nZXRTdWZmaXgoIG1jICk7CisJCXJldHVybiBpbnRmLm5hbWUoKSArIHN1ZmZpeDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRNYWluTmFtZSggU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jICkKKwl7CisJCWlmIChtYyA9PSBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUikKKwkJCXJldHVybiAiTWFpbiIgKyBpbnRmLm5hbWUoKSArICJMaXN0ZW5lciI7CisJCXJldHVybiAiTWFpbiIgKyBnZXRJbnRmTmFtZSggaW50ZiwgbWMgKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRJbXBsTmFtZSggU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jICkKKwl7CisJCXJldHVybiAiSW1wbCIgKyBnZXRJbnRmTmFtZSggaW50ZiwgbWMgKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRSZW1vdGVOYW1lKCBTZXJ2aWNlIGludGYsIE1lc3NhZ2VEaXJlY3Rpb24gbWMgKQorCXsKKwkJcmV0dXJuICJSZW1vdGUiICsgZ2V0SW50Zk5hbWUoIGludGYsIG1jICk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3R1Yk5hbWUoIFNlcnZpY2UgaW50ZiwgTWVzc2FnZURpcmVjdGlvbiBtYyApCisJeworCQlyZXR1cm4gIlN0dWIiICsgZ2V0SW50Zk5hbWUoIGludGYsIG1jICk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0SGVscGVyTmFtZSggU2VydmljZSBpbnRmICkKKwl7CisJCXJldHVybiBpbnRmLm5hbWUoKSArICJIZWxwZXIiOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRCYXNlTmFtZSggU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jICkKKwl7CisJCXJldHVybiAiQmFzZSIgKyBnZXRJbnRmTmFtZSggaW50ZiwgbWMgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGFzeW5jUmVjZWl2ZXJQb29sTmFtZSggTWVzc2FnZSBtc2cgKQorCXsKKwkJcmV0dXJuIG1zZy5nZXRBc3luY1JlY2VpdmVyKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVZhbHVlKCBUeXBlUmVmIHR5cGUsIFRva2VuIHZhbHVlICkKKwl7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbiggImdldFR5cGVWYWx1ZSBjYWxsZWQgd2l0aDogIit0eXBlKyI6ICIrdmFsdWUgKTsKKwkJVG9rZW4gdCA9IHR5cGUudHlwZSgpOworCQlzd2l0Y2ggKHQua2luZCkKKwkJeworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5MT05HOgorCQkJCXJldHVybiB2YWx1ZS5pbWFnZSArICJsIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRkxPQVQ6CisJCQkJcmV0dXJuIHZhbHVlLmltYWdlICsgImYiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6CisJCQkJcmV0dXJuIHZhbHVlLmltYWdlICsgImQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkc6CisJCQkJcmV0dXJuIHByb3RlY3RTdHJpbmcoIHZhbHVlLmltYWdlICk7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiB2YWx1ZS5pbWFnZTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIHByb3RlY3RTdHJpbmcoIFN0cmluZyBzICkKKwl7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbiggInByb3RlY3RTdHJpbmcgY2FsbGVkIHdpdGg6ICIrcyApOworCisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJc2IuYXBwZW5kKCAiXCIiICk7CisJCWZvciAoY2hhciBjIDogcy50b0NoYXJBcnJheSgpKQorCQl7CisJCQlpZiAoYyA9PSAnXHQnKQorCQkJeworCQkJCXNiLmFwcGVuZCggIlxcdCIgKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjID09ICdccicpCisJCQl7CisJCQkJc2IuYXBwZW5kKCAiXFxyIiApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGMgPT0gJ1xuJykKKwkJCXsKKwkJCQlzYi5hcHBlbmQoICJcXG4iICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYyA9PSAnXCInKQorCQkJeworCQkJCXNiLmFwcGVuZCggIlxcXCIiICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYyA9PSAnXFwnKQorCQkJeworCQkJCXNiLmFwcGVuZCggIlxcXFwiICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYyA+PSAzMiAmJiBjIDwgMTI3KQorCQkJeworCQkJCXNiLmFwcGVuZCggYyApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2IuYXBwZW5kKCBTdHJpbmcuZm9ybWF0KCAiXFx1JTA0eCIsIChpbnQpIGMgKSApOworCQl9CisJCXNiLmFwcGVuZCggIlwiIiApOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEByZXR1cm4gdHlwZSBuYW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgYXMgYSBzdHJ1Y3R1cmUgZWxlbWVudCBvciBleGNlcHRpb24KKwkgKiBwYXJhbWV0ZXIgb3IgZnVuY3Rpb24gcGFyYW1ldGVyIG9yIHJlc3VsdC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCBUeXBlUmVmIHR5cGUgKQorCXsKKwkJaWYgKHR5cGUuZGltKCkgPiAwKQorCQkJcmV0dXJuIGdldE5hdGl2ZVR5cGVOYW1lKCB0eXBlICkgKyBkaW0yc3BlYyggdHlwZS5kaW0oKSApOworCQlyZXR1cm4gZ2V0UmVmVHlwZU5hbWUoIHR5cGUgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZSB0aGUgZXRjaCB0eXBlCisJICogQHJldHVybiB0aGUgZnVuZGFtZW50YWwgbmF0aXZlIHR5cGUgZm9yIGphdmEuIHNvIGV0Y2ggaW50IC0+IGphdmEgaW50LAorCSAqIHdoaWxlIGV0Y2ggc3RyaW5nIC0+IGphdmEgU3RyaW5nLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmF0aXZlVHlwZU5hbWUoIFR5cGVSZWYgdHlwZSApCisJeworCQlUb2tlbiB0ID0gdHlwZS50eXBlKCk7CisJCXN3aXRjaCAodC5raW5kKQorCQl7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlZPSUQ6CisJCQkJcmV0dXJuICJ2b2lkIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQk9PTEVBTjoKKwkJCQlyZXR1cm4gImJvb2xlYW4iOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5CWVRFOgorCQkJCXJldHVybiAiYnl0ZSI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNIT1JUOgorCQkJCXJldHVybiAic2hvcnQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQ6CisJCQkJcmV0dXJuICJpbnQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5MT05HOgorCQkJCXJldHVybiAibG9uZyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUOgorCQkJCXJldHVybiAiZmxvYXQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6CisJCQkJcmV0dXJuICJkb3VibGUiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkc6CisJCQkJcmV0dXJuICJTdHJpbmciOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5PQkpFQ1Q6CisJCQkJcmV0dXJuICJPYmplY3QiOworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyB3ZSBoYXZlIHRvIHVzZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGhlcmUuCisJCQkJLy8gZmluZCB0aGUgYWN0dWFsIHR5cGUuLi4KKwkJCQlOYW1lZDw/PiBuID0gdHlwZS5pbnRmKCkuZ2V0KCB0LmltYWdlICk7CisJCQkJaWYgKG4gPT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJ1bmRlZmluZWQgb3IgYW1iaWd1b3VzIG5hbWUgYXQgbGluZSAlZDogJXMiLAorCQkJCQkJdC5iZWdpbkxpbmUsIHQuaW1hZ2UgKSApOworCQkJCXJldHVybiBuLmVmcW5hbWUoIHRoaXMgKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSB0eXBlIHRoZSBldGNoIHR5cGUKKwkgKiBAcmV0dXJuIHRoZSBmdW5kYW1lbnRhbCBuYXRpdmUgcmVmZXJlbmNlIHR5cGUgZm9yIGphdmEuIHNvIGV0Y2ggaW50IC0+CisJICogamF2YSBJbnRlZ2VyLCB3aGlsZSBldGNoIHN0cmluZyAtPiBqYXZhIFN0cmluZy4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRSZWZUeXBlTmFtZSggVHlwZVJlZiB0eXBlICkKKwl7CisJCVRva2VuIHQgPSB0eXBlLnR5cGUoKTsKKwkJc3dpdGNoICh0LmtpbmQpCisJCXsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuVk9JRDoKKwkJCQlyZXR1cm4gInZvaWQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5CT09MRUFOOgorCQkJCXJldHVybiAiQm9vbGVhbiI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEU6CisJCQkJcmV0dXJuICJCeXRlIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuU0hPUlQ6CisJCQkJcmV0dXJuICJTaG9ydCI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVDoKKwkJCQlyZXR1cm4gIkludGVnZXIiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5MT05HOgorCQkJCXJldHVybiAiTG9uZyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUOgorCQkJCXJldHVybiAiRmxvYXQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6CisJCQkJcmV0dXJuICJEb3VibGUiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkc6CisJCQkJcmV0dXJuICJTdHJpbmciOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5PQkpFQ1Q6CisJCQkJcmV0dXJuICJPYmplY3QiOworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyB3ZSBoYXZlIHRvIHVzZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGhlcmUuCisJCQkJLy8gZmluZCB0aGUgYWN0dWFsIHR5cGUuLi4KKwkJCQlOYW1lZDw/PiBuID0gdHlwZS5pbnRmKCkuZ2V0KCB0LmltYWdlICk7CisJCQkJaWYgKG4gPT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJ1bmRlZmluZWQgb3IgYW1iaWd1b3VzIG5hbWUgYXQgbGluZSAlZDogJXMiLAorCQkJCQkJdC5iZWdpbkxpbmUsIHQuaW1hZ2UgKSApOworCQkJCXJldHVybiBuLmVmcW5hbWUoIHRoaXMgKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGRpbTJzcGVjKCBpbnQgaSApCisJeworCQlTdHJpbmcgcyA9ICIiOworCQl3aGlsZSAoaS0tID4gMCkKKwkJCXMgKz0gIltdIjsKKwkJcmV0dXJuIHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmb3JtYXRTdHJpbmcoIFBhcmFtTGlzdDxTZXJ2aWNlPiBuLCBib29sZWFuIGlzRXhjZXB0ICkKKwkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorCXsKKwkJVG9TdHJpbmcgdHMgPSAoVG9TdHJpbmcpIG4uZ2V0T3B0KCAiVG9TdHJpbmciICk7CisJCUxpc3Q8Rm10SXRlbT4gbGlzdDsKKwkJaWYgKHRzICE9IG51bGwpCisJCXsKKwkJCWxpc3QgPSB0cy5nZXRGb3JtYXQoKTsKKwkJCW4uY2hlY2tGb3JtYXRMaXN0KCB0cy5saW5lbm8oKSwgbGlzdCApOworCQl9CisJCWVsc2UgaWYgKGlzRXhjZXB0KQorCQkJbGlzdCA9IG4ubWtGb3JtYXRMaXN0KCB0cnVlLCAoKEV4Y2VwdCluKS5oYXNFeHRlbmRzKCkgKTsKKwkJZWxzZQorCQkJbGlzdCA9IG4ubWtGb3JtYXRMaXN0KCBmYWxzZSwgKChTdHJ1Y3QpbikuaGFzRXh0ZW5kcygpICk7CisKKwkJaWYgKGxpc3Quc2l6ZSgpID09IDEpCisJCXsKKwkJCXJldHVybiBsaXN0LmdldCggMCApLnZhbHVlKCk7CisJCX0KKworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXNiLmFwcGVuZCggIlN0cmluZy5mb3JtYXQoICIgKTsKKwkJc2IuYXBwZW5kKCAiXCIiICk7CisJCWZvciAoRm10SXRlbSBpIDogbGlzdCkKKwkJeworCQkJaWYgKGkgaW5zdGFuY2VvZiBGaWVsZEl0ZW0pCisJCQl7CisJCQkJc2IuYXBwZW5kKCAiJXMiICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZXNjYXBlKCBzYiwgKChTdHJpbmdJdGVtKSBpKS52YWx1ZSgpICk7CisJCQl9CisJCX0KKwkJc2IuYXBwZW5kKCAiXCIiICk7CisJCWZvciAoRm10SXRlbSBpIDogbGlzdCkKKwkJeworCQkJaWYgKGkgaW5zdGFuY2VvZiBGaWVsZEl0ZW0pCisJCQl7CisJCQkJc2IuYXBwZW5kKCAiLCAiICk7CisJCQkJc2IuYXBwZW5kKCAoKEZpZWxkSXRlbSkgaSkudmFsdWUoKSApOworCQkJfQorCQl9CisJCXNiLmFwcGVuZCggIiApIiApOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZXNjYXBlKCBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlTdHJpbmdSZWFkZXIgcmRyID0gbmV3IFN0cmluZ1JlYWRlciggcyApOworCQlpbnQgYzsKKwkJd2hpbGUgKChjID0gcmRyLnJlYWQoKSkgPj0gMCkKKwkJeworCQkJaWYgKGMgPT0gJyInKQorCQkJCXNiLmFwcGVuZCggIlxcXCIiICk7CisJCQllbHNlIGlmIChjID09ICdcXCcpCisJCQkJc2IuYXBwZW5kKCAiXFxcXCIgKTsKKwkJCWVsc2UgaWYgKGMgPT0gJ1x0JykKKwkJCQlzYi5hcHBlbmQoICJcXHQiICk7CisJCQllbHNlIGlmIChjID09ICdccicpCisJCQkJc2IuYXBwZW5kKCAiXFxyIiApOworCQkJZWxzZSBpZiAoYyA9PSAnXG4nKQorCQkJCXNiLmFwcGVuZCggIlxcbiIgKTsKKwkJCWVsc2UKKwkJCQlzYi5hcHBlbmQoIChjaGFyKSBjICk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIG1mdm5hbWUoIFN0cmluZyB2bmFtZSApCisJeworCQlyZXR1cm4gIl9tZl8iICsgdm5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBtdHZuYW1lKCBTdHJpbmcgdm5hbWUgKQorCXsKKwkJcmV0dXJuICJfbXRfIiArIHZuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpCisJeworCQlyZXR1cm4gImphdmEiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZW51bV9lZnFuYW1lKCBTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwKKwkJU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZW51bU5hbWUgKQorCXsKKwkJcmV0dXJuIGZxbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGV4Y2VwdF9lZnFuYW1lKCBTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwKKwkJU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZXhjZXB0TmFtZSApCisJeworCisJCXJldHVybiBmcW5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBzdHJ1Y3RfZWZxbmFtZSggU3RyaW5nIGZxbmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUsCisJCVN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGVudW1OYW1lICkKKwl7CisKKwkJcmV0dXJuIGZxbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHF1YWxpZnlQYXJhbWV0ZXJOYW1lKCBUb2tlbiBuYW1lICkKKwl7CisJCXJldHVybiBuYW1lLmltYWdlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgcXVhbGlmeUNvbnN0YW50TmFtZSggU2VydmljZSBpbnRmLCBUb2tlbiBuYW1lICkKKwl7CisJCXJldHVybiBpbnRmLmZxbmFtZSgpICsgJy4nICsgbmFtZS5pbWFnZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHF1YWxpZnlFbnVtTmFtZSggU2VydmljZSBpbnRmLCBUb2tlbiBuYW1lICkKKwl7CisJCXJldHVybiBpbnRmLmZxbmFtZSgpICsgJy4nICsgbmFtZS5pbWFnZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvciggTmFtZWQ8Pz4gbmFtZWQgKQorCXsKKwkJaWYgKG5hbWVkIGluc3RhbmNlb2YgUGFyYW1ldGVyKQorCQl7CisJCQlQYXJhbWV0ZXIgcGFyYW0gPSAoUGFyYW1ldGVyKSBuYW1lZDsKKwkJCVR5cGVSZWYgdHlwZSA9IHBhcmFtLnR5cGUoKTsKKworCQkJaWYgKHR5cGUuaXNCdWlsdGluKCkpCisJCQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJWYWxpZGF0b3JfJXMuZ2V0KCAlZCApIiwKKwkJCQkJdHlwZS50eXBlKCksIHR5cGUuZGltKCkgKTsKKworCQkJTmFtZWQ8Pz4gbiA9IHR5cGUuZ2V0TmFtZWQoIHR5cGUuaW50ZigpICk7CisKKwkJCWlmIChuLmlzQnVpbHRpbigpKQorCQkJeworCQkJCUJ1aWx0aW4gYiA9IChCdWlsdGluKSBuOworCQkJCVN0cmluZyBjbiA9IGIuY2xhc3NOYW1lKCk7CisJCQkJCisJCQkJaW50IGkgPSBjbi5pbmRleE9mKCAnPCcgKTsKKwkJCQlpZiAoaSA+PSAwKQorCQkJCQljbiA9IGNuLnN1YnN0cmluZyggMCwgaSApOworCQkJCQorCQkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVmFsaWRhdG9yX2N1c3RvbS5nZXQoICVzLmNsYXNzLCAlZCwgJXMgKSIsCisJCQkJCWNuLCB0eXBlLmRpbSgpLCBiLmFsbG93U3ViY2xhc3MoKSApOworCQkJfQorCisJCQkvLyBBbGxvdyBzdWJjbGFzc2luZyBmb3IgZXRjaCBkZWZpbmVkIHN0cnVjdHMgYW5kIGV4dGVybnMuCisKKwkJCWlmIChuLmlzU3RydWN0KCkgfHwgbi5pc0V4Y2VwdCgpKQorCQkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVmFsaWRhdG9yX2N1c3RvbS5nZXQoICVzLmNsYXNzLCAlZCwgdHJ1ZSApIiwKKwkJCQkJbi5lZnFuYW1lKCB0aGlzICksIHR5cGUuZGltKCkgKTsKKworCQkJLy8gRG9uJ3QgYWxsb3cgc3ViY2xhc3NpbmcgZm9yIGV4dGVybnMgb3IgZXRjaCBkZWZpbmVkIGVudW1zLgorCisJCQlpZiAoIShuLmlzRXh0ZXJuKCkgfHwgbi5pc0VudW14KCkpKQorCQkJCUFzc2VydGlvbi5jaGVjayggbi5pc0V4dGVybigpIHx8IG4uaXNFbnVteCgpLAorCQkJCQkibi5pc0V4dGVybigpIHx8IG4uaXNFbnVteCgpOiAiK24gKTsKKworCQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJWYWxpZGF0b3JfY3VzdG9tLmdldCggJXMuY2xhc3MsICVkLCBmYWxzZSApIiwKKwkJCQluLmVmcW5hbWUoIHRoaXMgKSwgdHlwZS5kaW0oKSApOworCQl9CisKKwkJaWYgKG5hbWVkIGluc3RhbmNlb2YgVGhyb3duKQorCQl7CisJCQlUaHJvd24gdGhyb3duID0gKFRocm93bikgbmFtZWQ7CisJCQlFeGNlcHQgZSA9IChFeGNlcHQpIHRocm93bi5nZXROYW1lZCgpOworCQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJWYWxpZGF0b3JfY3VzdG9tLmdldCggJXMuY2xhc3MsIDAsIHRydWUgKSIsIGUuZWZxbmFtZSggdGhpcyApICk7CisJCX0KKworCQlpZiAobmFtZWQgaW5zdGFuY2VvZiBJdGVtKQorCQkJcmV0dXJuICJWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIDAgKSI7CisKKwkJcmV0dXJuICJudWxsIjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5hbWUgZm9yIGEgZ2V0dGVyIG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEdldHRlck5hbWUoIE5hbWUgbmFtZSApCisJeworCQlTdHJpbmcgcyA9IG5hbWUubmFtZTsKKwkJcmV0dXJuICJnZXQiK3Muc3Vic3RyaW5nKCAwLCAxICkudG9VcHBlckNhc2UoKStzLnN1YnN0cmluZyggMSApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmFtZSBmb3IgYSBzZXR0ZXIgbWV0aG9kLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTmFtZSggTmFtZSBuYW1lICkKKwl7CisJCVN0cmluZyBzID0gbmFtZS5uYW1lOworCQlyZXR1cm4gInNldCIrcy5zdWJzdHJpbmcoIDAsIDEgKS50b1VwcGVyQ2FzZSgpK3Muc3Vic3RyaW5nKCAxICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkRGVmYXVsdHMoIFNlcnZpY2Ugc2VydmljZSApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJYWRkQnVpbHRpbiggc2VydmljZSwgbmV3TmFtZSggIkxpc3QiICksICJqYXZhLnV0aWwuTGlzdDw/PiIsIHRydWUgKTsKKwkJYWRkQnVpbHRpbiggc2VydmljZSwgbmV3TmFtZSggIk1hcCIgKSwgImphdmEudXRpbC5NYXA8PywgPz4iLCB0cnVlICk7CisJCWFkZEJ1aWx0aW4oIHNlcnZpY2UsIG5ld05hbWUoICJTZXQiICksICJqYXZhLnV0aWwuU2V0PD8+IiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiRGF0ZXRpbWUiICksICJqYXZhLnV0aWwuRGF0ZSIsIGZhbHNlICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEgYi9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9Db21waWxlclZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBhNTVkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLmNvbXBpbGVyOworCisvKioKKyAqIFRoZSB2ZXJzaW9uIGluZm8gb2YgdGhpcyBFdGNoIGJhY2tlbmQgKGNvbXBpbGVyKS4KKyAqLworcHVibGljIGludGVyZmFjZSBDb21waWxlclZlcnNpb24KK3sKKwkvLyBUaGlzIGZpbGUgaXMgZWRpdGVkIGJ5IHRoZSBwcm9kdWN0aW9uIGJ1aWxkIHN5c3RlbSB0byByZXBsYWNlIHRoZSB2YWx1ZQorCS8vIG9mIFZFUlNJT04gYmVsb3cgd2l0aCB3aGF0ZXZlciBpdCB3YW50cyB0aGUgdmVyc2lvbiBzdHJpbmcgdG8gYWN0dWFsbHkgYmUuCisJCisJLyoqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgRXRjaCBiYWNrZW5kIChjb21waWxlcikgKi8KKwlwdWJsaWMgU3RyaW5nIFZFUlNJT04gPSAiamF2YSAxLjEuMC1pbmN1YmF0aW5nIChMT0NBTC0wKSI7Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9Db21waWxlclZlcnNpb24uamF2YS50bXBsIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGMwZGNiCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEudG1wbApAQCAtMCwwICsxLDMwIEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5jb21waWxlcjsKKworLyoqCisgKiBUaGUgdmVyc2lvbiBpbmZvIG9mIHRoaXMgRXRjaCBiYWNrZW5kIChjb21waWxlcikuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29tcGlsZXJWZXJzaW9uCit7CisJLy8gVGhpcyBmaWxlIGlzIGVkaXRlZCBieSB0aGUgcHJvZHVjdGlvbiBidWlsZCBzeXN0ZW0gdG8gcmVwbGFjZSB0aGUgdmFsdWUKKwkvLyBvZiBWRVJTSU9OIGJlbG93IHdpdGggd2hhdGV2ZXIgaXQgd2FudHMgdGhlIHZlcnNpb24gc3RyaW5nIHRvIGFjdHVhbGx5IGJlLgorCQorCS8qKiBUaGUgdmVyc2lvbiBvZiB0aGlzIEV0Y2ggYmFja2VuZCAoY29tcGlsZXIpICovCisJcHVibGljIFN0cmluZyBWRVJTSU9OID0gImphdmEgQEV0Y2hMb25nVmVyc2lvbkAgKEBFdGNoQnVpbGRUYWdAKSI7Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL2Jhc2Uudm0gYi9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL2Jhc2Uudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzZTY5NgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvYmFzZS52bQpAQCAtMCwwICsxLDE0MyBAQAorIyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyMjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIyBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgZWRpdGVkIQorLy8gUmUtaW1wbGVtZW50IHRoZXNlIG1ldGhvZHMgYnkgb3ZlcnJpZGluZyB0aGVtIGluIEltcGwkaW50Zi5uYW1lKCkkc3VmZml4LgorI3NldCgkaSA9ICRpbnRmLm5hbWUoKSkKKyNzZXQoJGludGZuYW1lID0gIiRpJHN1ZmZpeCIpCisjc2V0KCRjbG5hbWUgPSAiQmFzZSRpbnRmbmFtZSIpCisjaWYgKCRoZWxwZXIuaXNTZXJ2ZXIoJG1jKSkKKyNzZXQoJHBlZXIgPSAiY2xpZW50IikKKyNlbHNlCisjc2V0KCRwZWVyID0gInNlcnZlciIpCisjZW5kCisKK3BhY2thZ2UgJGludGYucGFyZW50KCkubmFtZSgpOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5PYmpTZXNzaW9uOworCisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRXh0ZXJuKCkpCisjaWYgKCRuLmhhc0ltcG9ydCggJGhlbHBlciApKQoraW1wb3J0ICRuLmdldEltcG9ydCggJGhlbHBlciApOworI2VuZAorI2VuZAorI2VuZAorCisvKioKKyAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgJGludGZuYW1lLCB3aXRoIGRlZmF1bHQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICogd2hpY2ggdGhyb3cgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uIEV4dGVuZCB0aGlzIGNsYXNzIHRvIHByb3ZpZGUKKyAqIGltcGxlbWVudGF0aW9ucyBvZiBtZXNzYWdlcyBmcm9tIHRoZSAkcGVlci4KKyAqCisgKiBAc2VlIEltcGwkaW50Zm5hbWUKKyAqLworcHVibGljIGNsYXNzICRjbG5hbWUgaW1wbGVtZW50cyAkaW50Zm5hbWUsIE9ialNlc3Npb24KK3sKKwlwdWJsaWMgT2JqZWN0IF9zZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnk6ICIrcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBfc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2w6ICIrY29udHJvbCApOworCX0KKworCXB1YmxpYyB2b2lkIF9zZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBUaHJvd2FibGUpCisJCQkoKFRocm93YWJsZSkgZXZlbnQpLnByaW50U3RhY2tUcmFjZSgpOworCX0KKyNmb3JlYWNoICgkbXRoZCBpbiAkaW50Zi5pdGVyYXRvcigpKQorI2lmICgkbXRoZC5pc01zZ0RpcigkbWMpIHx8ICRtdGhkLmlzTXNnRGlyQm90aCgpKQorI2lmICghJG10aGQuaXNIaWRkZW4oKSkKKyNpZighJG1ldGhvZExpc3QuY29udGFpbnMoJG10aGQubmFtZSgpLm5hbWUoKSkpCisjc2V0ICggJGFkZE1ldGhvZExpc3RTdGF0dXMgPSAkbWV0aG9kTGlzdC5hZGQoJG10aGQubmFtZSgpLm5hbWUoKSkgKQorCisJcHVibGljICRoZWxwZXIuZ2V0VHlwZU5hbWUoICRtdGhkLnR5cGUoKSApICRtdGhkLm5hbWUoKQorCSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHBhcmFtIGluICRtdGhkLml0ZXJhdG9yKCkgKQorCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHBhcmFtLnR5cGUoKSApICRwYXJhbS5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkpCisjaWYoJG10aGQuaGFzVGhyb3duKCkpCisJdGhyb3dzCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goJHQgaW4gJG10aGQudGhyb3duKCkuaXRlcmF0b3IoKSkKKwkJJHNlcCR0LmdldE5hbWVkKCkuZnFuYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKyNlbmQKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIiRtdGhkLm5hbWUoKSIgKTsKKwl9CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZm9yZWFjaCggJHggaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYoICR4LmlzTWl4aW4oKSApCisjc2V0KCAkbSA9ICR4LmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQorI2ZvcmVhY2goICRuIGluICR6Lm1lc3NhZ2VzKCB0cnVlICkgKQorI2lmKCRuLmlzTXNnRGlyKCRtYykgfHwgJG4uaXNNc2dEaXJCb3RoKCkgKQorI2lmKCEkbi5pc0hpZGRlbigpKQorI2lmKCEkbWV0aG9kTGlzdC5jb250YWlucygkbi5uYW1lKCkubmFtZSgpKSkKKyNzZXQgKCAkYWRkTWV0aG9kTGlzdFN0YXR1cyA9ICRtZXRob2RMaXN0LmFkZCgkbi5uYW1lKCkubmFtZSgpKSApCisjaWYoJG4uaXNPbmV3YXkoKSkKKworCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkKKwkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkgJHAubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiJG4ubmFtZSgpIiApOworCX0KKyNlbHNlCisKKwlwdWJsaWMgJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkgJG4ubmFtZSgpCisJKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCSkKKyNpZigkbi5oYXNUaHJvd24oKSkKKwl0aHJvd3MKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCgkdCBpbiAkbi50aHJvd24oKS5pdGVyYXRvcigpKQorCQkkc2VwJHQuZ2V0TmFtZWQoKS5mcW5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorI2VuZAorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiJG4ubmFtZSgpIiApOworCX0KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvaGVscGVyLnZtIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9oZWxwZXIudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1NjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvaGVscGVyLnZtCkBAIC0wLDAgKzEsMTg5IEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBlZGl0ZWQhCisKKyNzZXQoJGkgPSAkaW50Zi5uYW1lKCkpIAorcGFja2FnZSAkaW50Zi5wYXJlbnQoKS5uYW1lKCk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlbGl2ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlBvb2w7CisjaWYoJGhlbHBlci5pc1NlcnZlcigkbWMpIHx8ICRoZWxwZXIuaXNCb3RoKCRtYykpCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWZhdWx0U2VydmVyRmFjdG9yeTsKKyNlbmQKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5UcmFuc3BvcnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LkRlZmF1bHREZWxpdmVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0Lk1haWxib3hNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5QbGFpbk1haWxib3hNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5UcmFuc3BvcnRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CisKKy8qKgorICogVHJhbnNwb3J0IGhlbHBlciBmb3IgJHtpfS4gQWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzICR7aX1IZWxwZXIgZXh0ZW5kcyBUcmFuc3BvcnRIZWxwZXIKK3sKKyNpZigkaGVscGVyLmlzU2VydmVyKCRtYykgfHwgJGhlbHBlci5pc0JvdGgoJG1jKSkKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgc2VydmVyIHNlc3Npb24gbGlzdGVuZXIgcGVyIHNwZWNpZmljYXRpb25zIGluIHVyaSBhbmQKKwkgKiByZXNvdXJjZXMuIFRoaXMgbGlzdGVuZXIgd2lsbCBhY2NlcHQgcmVxdWVzdHMgZnJvbSBjbGllbnRzIGZvciBuZXcgc2VydmVyCisJICogc2Vzc2lvbnMuCisJICoKKwkgKiBAcGFyYW0gdXJpIGNvbnRhaW5zIHNwZWNpZmljYXRpb25zIGZvciB0aGUgc2VydmVyIHNlc3Npb24gbGlzdGVuZXIgYW5kCisJICogZm9yIHRoZSBzZXJ2ZXIgc2Vzc2lvbiB0cmFuc3BvcnQgc3RhY2suCisJICoKKwkgKiBAcGFyYW0gcmVzb3VyY2VzIGFkZGl0aW9uYWwgcmVzb3VyY2VzIHRvIGFpZCBpbiBjb25zdHJ1Y3RpbmcgbmV3IHNlcnZlcgorCSAqIHNlc3Npb25zLgorCSAqCisJICogQHBhcmFtIGltcGxGYWN0b3J5IGZhY3RvcnkgdXNlZCB0byBjb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2UgaW1wbGVtZW50aW5nCisJICogJHtpfVNlcnZlci4gVGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlY2VpdmUgYW5kIHByb2Nlc3MgbWVzc2FnZXMgZnJvbQorCSAqIHRoZSBjbGllbnQgc2Vzc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gYSBzZXJ2ZXIgc2Vzc2lvbiBsaXN0ZW5lci4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IG5ld0xpc3RlbmVyKCBmaW5hbCBTdHJpbmcgdXJpLAorCQlmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBmaW5hbCAke2l9U2VydmVyRmFjdG9yeSBpbXBsRmFjdG9yeSApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIFJlc291cmNlcyByZXMgPSBpbml0UmVzb3VyY2VzKCByZXNvdXJjZXMgKTsKKwkJCisJCWZpbmFsIFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBsaXN0ZW5lciA9IFRyYW5zcG9ydEZhY3RvcnkuZ2V0TGlzdGVuZXIoIHVyaSwgcmVzICk7CisJCQorCQlyZXR1cm4gbmV3IERlZmF1bHRTZXJ2ZXJGYWN0b3J5KCBsaXN0ZW5lciwgaW1wbEZhY3RvcnkgKQorCQl7CisJCQlwdWJsaWMgdm9pZCBuZXdTZXJ2ZXIoIFRyYW5zcG9ydE1lc3NhZ2UgdCwgU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHIgKQorCQkJCXRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlWYWx1ZUZhY3RvcnkgdmYgPSAoVmFsdWVGYWN0b3J5KSByLmdldCggVHJhbnNwb3J0LlZBTFVFX0ZBQ1RPUlkgKTsKKwkJCQlNYWlsYm94TWFuYWdlciB4ID0gbmV3IFBsYWluTWFpbGJveE1hbmFnZXIoIHQsIHVyaSwgciApOworCQkJCURlbGl2ZXJ5U2VydmljZSBkID0gbmV3IERlZmF1bHREZWxpdmVyeVNlcnZpY2UoIHgsIHVyaSwgciApOworCQkJCVJlbW90ZSR7aX1DbGllbnQgY2xpZW50ID0gbmV3IFJlbW90ZSR7aX1DbGllbnQoIGQsIHZmICk7CisJCQkJJHtpfVNlcnZlciBzZXJ2ZXIgPSBpbXBsRmFjdG9yeS5uZXcke2l9U2VydmVyKCBjbGllbnQgKTsKKwkJCQlQb29sIHFwID0gKFBvb2wpIHIuZ2V0KCBRVUVVRURfUE9PTCApOworCQkJCVBvb2wgZnAgPSAoUG9vbCkgci5nZXQoIEZSRUVfUE9PTCApOworCQkJCW5ldyBTdHViJHtpfVNlcnZlciggZCwgc2VydmVyLCBxcCwgZnAgKTsKKwkJCQljbGllbnQuX3N0YXJ0KCk7CisJCQl9CisKKwkJCXB1YmxpYyBWYWx1ZUZhY3RvcnkgbmV3VmFsdWVGYWN0b3J5KCBTdHJpbmcgdXJpICkKKwkJCXsKKwkJCQlyZXR1cm4gbmV3IFZhbHVlRmFjdG9yeSR7aX0oIHVyaSApOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCQkJeworCQkJCXJldHVybiAiJHtpfUhlbHBlci5TZXJ2ZXJGYWN0b3J5LyIgKyBsaXN0ZW5lcjsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBGYWN0b3J5IHVzZWQgYnkKKwkgKiB7QGxpbmsgJHtpfUhlbHBlciNuZXdMaXN0ZW5lcihTdHJpbmcsIFJlc291cmNlcywgJHtpfVNlcnZlckZhY3RvcnkpfQorCSAqIHRvIGNvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rICR7aX1TZXJ2ZXJ9LiBUaGUgbmV3CisJICogaW5zdGFuY2Ugd2lsbCByZWNlaXZlIGFuZCBwcm9jZXNzIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCBzZXNzaW9uLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgJHtpfVNlcnZlckZhY3RvcnkKKwl7CisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIGltcGxlbWVudGluZyAke2l9U2VydmVyLiBUaGUgbmV3CisJCSAqIGluc3RhbmNlIHdpbGwgcmVjZWl2ZSBhbmQgcHJvY2VzcyBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgc2Vzc2lvbi4KKwkJICoKKwkJICogQHBhcmFtIGNsaWVudCBhbiBpbnN0YW5jZSBvZiBSZW1vdGUke2l9Q2xpZW50IHdoaWNoIG1heSBiZSB1c2VkIHRvCisJCSAqIHNlbmQgbWVzc2FnZXMgdG8gdGhlIGNsaWVudCBzZXNzaW9uLgorCQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIGltcGxlbWVudGluZyAke2l9U2VydmVyICh0eXBpY2FsbHkKKwkJICogSW1wbCR7aX1TZXJ2ZXIpLgorCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljICR7aX1TZXJ2ZXIgbmV3JHtpfVNlcnZlciggUmVtb3RlJHtpfUNsaWVudCBjbGllbnQgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbjsKKwl9CisjZW5kCisjaWYoJGhlbHBlci5pc0NsaWVudCgkbWMpIHx8ICRoZWxwZXIuaXNCb3RoKCRtYykpCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsaWVudCBzZXNzaW9uIHBlciBzcGVjaWZpY2F0aW9ucyBpbiB1cmkgYW5kIHJlc291cmNlcy4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpIGNvbnRhaW5zIHNwZWNpZmljYXRpb25zIGZvciB0aGUgY2xpZW50IHNlc3Npb24gdHJhbnNwb3J0CisJICogc3RhY2suCisJICogCisJICogQHBhcmFtIHJlc291cmNlcyBhZGRpdGlvbmFsIHJlc291cmNlcyB0byBhaWQgaW4gY29uc3RydWN0aW5nIG5ldyBjbGllbnQKKwkgKiBzZXNzaW9ucy4KKwkgKiAKKwkgKiBAcGFyYW0gaW1wbEZhY3RvcnkgZmFjdG9yeSB1c2VkIHRvIGNvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBpbXBsZW1lbnRpbmcKKwkgKiAke2l9Q2xpZW50LiBUaGUgbmV3IGluc3RhbmNlIHdpbGwgcmVjZWl2ZSBhbmQgcHJvY2VzcyBtZXNzYWdlcyBmcm9tCisJICogdGhlIHNlcnZlciBzZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgUmVtb3RlJHtpfVNlcnZlciBpbml0aWFsaXplZCBieSB1cmkgYW5kCisJICogcmVzb3VyY2VzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciBzZXNzaW9uLgorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBSZW1vdGUke2l9U2VydmVyIG5ld1NlcnZlciggU3RyaW5nIHVyaSwKKwkJUmVzb3VyY2VzIHJlc291cmNlcywgJHtpfUNsaWVudEZhY3RvcnkgaW1wbEZhY3RvcnkgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlmaW5hbCBSZXNvdXJjZXMgcmVzID0gaW5pdFJlc291cmNlcyggcmVzb3VyY2VzICk7CisJCQorCQlmaW5hbCBWYWx1ZUZhY3Rvcnkke2l9IHZmID0gbmV3IFZhbHVlRmFjdG9yeSR7aX0oIHVyaSApOworCQlyZXMucHV0KCBUcmFuc3BvcnQuVkFMVUVfRkFDVE9SWSwgdmYgKTsKKwkJCisJCVVSTCB1ID0gbmV3IFVSTCggdXJpICk7CisJCQorCQlUcmFuc3BvcnRNZXNzYWdlIG0gPSBUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydCggdXJpLCByZXMgKTsKKwkJTWFpbGJveE1hbmFnZXIgciA9IG5ldyBQbGFpbk1haWxib3hNYW5hZ2VyKCBtLCB1LCByZXNvdXJjZXMgKTsKKwkJRGVsaXZlcnlTZXJ2aWNlIGQgPSBuZXcgRGVmYXVsdERlbGl2ZXJ5U2VydmljZSggciwgdSwgcmVzb3VyY2VzICk7CisJCVJlbW90ZSR7aX1TZXJ2ZXIgc2VydmVyID0gbmV3IFJlbW90ZSR7aX1TZXJ2ZXIoIGQsIHZmICk7CisJCSR7aX1DbGllbnQgY2xpZW50ID0gaW1wbEZhY3RvcnkubmV3JHtpfUNsaWVudCggc2VydmVyICk7CisJCVBvb2wgcXAgPSAoUG9vbCkgcmVzLmdldCggUVVFVUVEX1BPT0wgKTsKKwkJUG9vbCBmcCA9IChQb29sKSByZXMuZ2V0KCBGUkVFX1BPT0wgKTsKKwkJbmV3IFN0dWIke2l9Q2xpZW50KCBkLCBjbGllbnQsIHFwLCBmcCApOworCisJCXJldHVybiBzZXJ2ZXI7CisJfQorCisJLyoqCisJICogRmFjdG9yeSB1c2VkIGJ5CisJICoge0BsaW5rICR7aX1IZWxwZXIjbmV3U2VydmVyKFN0cmluZywgUmVzb3VyY2VzLCAke2l9Q2xpZW50RmFjdG9yeSl9CisJICogdG8gY29uc3RydWN0IGEgbmV3IGluc3RhbmNlIGltcGxlbWVudGluZyB7QGxpbmsgJHtpfUNsaWVudH0uIFRoZSBuZXcKKwkgKiBpbnN0YW5jZSB3aWxsIHJlY2VpdmUgYW5kIHByb2Nlc3MgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyIHNlc3Npb24uCisJICovCisJcHVibGljIGludGVyZmFjZSAke2l9Q2xpZW50RmFjdG9yeQorCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UgaW1wbGVtZW50aW5nICR7aX1DbGllbnQuIFRoZSBuZXcKKwkJICogaW5zdGFuY2Ugd2lsbCByZWNlaXZlIGFuZCBwcm9jZXNzIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlciBzZXNzaW9uLgorCQkgKiAKKwkJICogQHBhcmFtIHNlcnZlciBhbiBpbnN0YW5jZSBvZiBSZW1vdGUke2l9U2VydmVyIHdoaWNoIG1heSBiZSB1c2VkIHRvCisJCSAqIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciBzZXNzaW9uLgorCQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIGltcGxlbWVudGluZyAke2l9Q2xpZW50ICh0eXBpY2FsbHkKKwkJICogSW1wbCR7aX1DbGllbnQpLgorCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljICR7aX1DbGllbnQgbmV3JHtpfUNsaWVudCggUmVtb3RlJHtpfVNlcnZlciBzZXJ2ZXIgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbjsKKwl9CisjZW5kCit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL2ltcGwudm0gYi9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL2ltcGwudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2ODdmNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvaW1wbC52bQpAQCAtMCwwICsxLDYwIEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgeW91ciBjb252ZW5pZW5jZSBhbmQgd2lsbCBub3QgYmUKKy8vIG92ZXJ3cml0dGVuIG9uY2UgaXQgZXhpc3RzISBQbGVhc2UgZWRpdCB0aGlzIGZpbGUgYXMgbmVjZXNzYXJ5IHRvIGltcGxlbWVudAorLy8geW91ciBzZXJ2aWNlIGxvZ2ljLgorI3NldCgkaSA9ICRpbnRmLm5hbWUoKSkKKyNzZXQoJGludGZuYW1lID0gIiRpJHN1ZmZpeCIpCisjc2V0KCRiYXNlY2xuYW1lID0gIkJhc2UkaW50Zm5hbWUiKQorI3NldCgkY2xuYW1lID0gIkltcGwkaW50Zm5hbWUiKQorI2lmICgkaGVscGVyLmlzU2VydmVyKCRtYykpCisjc2V0KCRwZWVyID0gImNsaWVudCIpCisjc2V0KCRwZWVyY2xhc3MgPSAiUmVtb3RlJHtpfUNsaWVudCIpCisjZWxzZQorI3NldCgkcGVlciA9ICJzZXJ2ZXIiKQorI3NldCgkcGVlcmNsYXNzID0gIlJlbW90ZSR7aX1TZXJ2ZXIiKQorI2VuZAorCitwYWNrYWdlICRpbnRmLnBhcmVudCgpLm5hbWUoKTsKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiAkYmFzZWNsbmFtZS4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgJHBlZXIuCisgKi8KK3B1YmxpYyBjbGFzcyAkY2xuYW1lIGV4dGVuZHMgJGJhc2VjbG5hbWUKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSAkY2xuYW1lLgorCSAqCisJICogQHBhcmFtICRwZWVyIGEgY29ubmVjdGlvbiB0byB0aGUgJHBlZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgJHBlZXIuCisJICovCisJcHVibGljICRjbG5hbWUoICRwZWVyY2xhc3MgJHBlZXIgKQorCXsKKwkJdGhpcy4kcGVlciA9ICRwZWVyOworCX0KKwkKKwkvKioKKwkgKiBBIGNvbm5lY3Rpb24gdG8gdGhlICRwZWVyIHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlICRwZWVyLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCAidW51c2VkIiApCisJcHJpdmF0ZSBmaW5hbCAkcGVlcmNsYXNzICRwZWVyOworCisJLy8gVE9ETyBpbnNlcnQgbWV0aG9kcyBoZXJlIHRvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mICRpbnRmbmFtZQorCS8vIG1lc3NhZ2VzIGZyb20gdGhlICRwZWVyLgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvaW50Zi52bSBiL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvaW50Zi52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTM4NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9pbnRmLnZtCkBAIC0wLDAgKzEsMjg5IEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBlZGl0ZWQhCisKK3BhY2thZ2UgJGludGYucGFyZW50KCkubmFtZSgpOworCisjaWYoICEkaGFzQmFzZUNsYXNzICkKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKyNlbmQKKworI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0V4dGVybigpKQorI2lmICgkbi5oYXNJbXBvcnQoICRoZWxwZXIgKSkKK2ltcG9ydCAkbi5nZXRJbXBvcnQoICRoZWxwZXIgKTsKKyNlbmQKKyNlbmQKKyNlbmQKKworI2lmICgkaW50Zi5oYXNEZXNjcigpKQorLyoqCisjZm9yZWFjaCggJHMgaW4gJGludGYuZGVzY3IoKSApCisgKiAkcworI2VuZAorICovCisjZW5kCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyNzZXQgKCRzZXAgPSAiZXh0ZW5kcyIpCisjaWYgKCRoYXNCYXNlQ2xhc3MpCitwdWJsaWMgaW50ZXJmYWNlICRpbnRmLm5hbWUoKSRzdWZmaXggJHNlcCAkaW50Zi5uYW1lKCkKKyNzZXQgKCRzZXAgPSAiLCIpCisjZWxzZQorcHVibGljIGludGVyZmFjZSAkaW50Zi5uYW1lKCkkc3VmZml4CisjZW5kCisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzTWl4aW4oKSkKKwkkc2VwICRuLmZxbmFtZSgpJHN1ZmZpeAorI3NldCAoJHNlcCA9ICIsIikKKyNlbmQKKyNlbmQKK3sKKyNpZiAoISRpbnRmLmhhc01lc3NhZ2VEaXJlY3Rpb24oJG1jKSkKKwkvLyBubyAkbWMgZGlyZWN0aW9uIGl0ZW1zIGRlZmluZWQuCisjZW5kCisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzTWVzc2FnZSgpKQorI2lmICgkbi5pc01zZ0RpcigkbWMpKQorI2lmICghJG4uaXNIaWRkZW4oKSkKKwkvKioKKyNmb3JlYWNoKCAkcyBpbiAkbi5kZXNjcigpICkKKwkgKiAkcworI2VuZAorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorI3NldCgkZmlyc3QgPSB0cnVlKQorI2ZvcmVhY2goICRzIGluICRwLmRlc2NyKCkgKQorI2lmICgkZmlyc3QpCisjc2V0KCRmaXJzdCA9IGZhbHNlKQorCSAqIEBwYXJhbSAkcC5uYW1lKCkgJHMKKyNlbHNlCisJICogJHMKKyNlbmQKKyNlbmQKKyNlbmQKKyNpZiAoJG4uaGFzUmV0dXJuKCkpCisjc2V0KCRmaXJzdCA9IHRydWUpCisjZm9yZWFjaCggJHMgaW4gJG4ucmV0dXJuRGVzY3IoKSApCisjaWYgKCRmaXJzdCkKKyNzZXQoJGZpcnN0ID0gZmFsc2UpCisJICogQHJldHVybiAkcworI2Vsc2UKKwkgKiAkcworI2VuZAorI2VuZAorI2VuZAorI2ZvcmVhY2goJHQgaW4gJG4udGhyb3duKCkuaXRlcmF0b3IoKSkKKyNzZXQoJGZpcnN0ID0gdHJ1ZSkKKyNmb3JlYWNoKCAkcyBpbiAkdC5kZXNjcigpICkKKyNpZiAoJGZpcnN0KQorI3NldCgkZmlyc3QgPSBmYWxzZSkKKwkgKiBAdGhyb3dzICR0Lm5hbWUoKSAkcworI2Vsc2UKKwkgKiAkcworI2VuZAorI2VuZAorI2VuZAorCSAqLworCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkgJHAubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJKQorI2lmICgkbi5oYXNUaHJvd24oKSkKKwl0aHJvd3MKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCgkdCBpbiAkbi50aHJvd24oKS5pdGVyYXRvcigpKQorCQkkc2VwJHQuZ2V0TmFtZWQoKS5mcW5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorI2VuZAorCTsKKyNlbmQKKyNlbmQKKyNlbHNlaWYgKCRuLmlzQ29uc3RhbnQoKSkKKyNpZiAoISRoYXNCYXNlQ2xhc3MpCisjaWYgKCRuLmhhc0Rlc2NyKCkpCisJLyoqCisjZm9yZWFjaCggJHMgaW4gJG4uZGVzY3IoKSApCisJICogJHMKKyNlbmQKKwkgKi8KKyNlbmQKKwlwdWJsaWMgJGhlbHBlci5nZXROYXRpdmVUeXBlTmFtZSggJG4udHlwZSgpICkgJG4ubmFtZSgpID0gJGhlbHBlci5nZXRUeXBlVmFsdWUoICRuLnR5cGUoKSwgJG4udmFsdWUoKSApOworCisjZW5kCisjZWxzZWlmICgkbi5pc0VudW14KCkpCisjaWYgKCEkaGFzQmFzZUNsYXNzKQorI2lmICgkbi5oYXNEZXNjcigpKQorCS8qKgorI2ZvcmVhY2goICRzIGluICRuLmRlc2NyKCkgKQorCSAqICRzCisjZW5kCisJICovCisjZW5kCisJcHVibGljIGVudW0gJG4ubmFtZSgpCisJeworI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkaSBpbiAkbi5pdGVyYXRvcigpICkKKwkJLyoqCisjZm9yZWFjaCggJHMgaW4gJGkuZGVzY3IoKSApCisJCSAqICRzCisjZW5kCisJCSAqLworCQkkc2VwJGkubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJfQorCisjZW5kCisjZWxzZWlmICgkbi5pc0V4dGVybigpKQorIyMgaWdub3JlIGV4dGVybgorI2Vsc2VpZiAoJG4uaXNNaXhpbigpKQorIyMgaWdub3JlIG1peGluCisjZWxzZWlmICgkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXhjZXB0KCkpCisjaWYgKCEkaGFzQmFzZUNsYXNzKQorI2lmICgkbi5oYXNEZXNjcigpKQorCS8qKgorI2ZvcmVhY2goICRzIGluICRuLmRlc2NyKCkgKQorCSAqICRzCisjZW5kCisJICovCisjZW5kCisJQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisJcHVibGljIGNsYXNzICRuLm5hbWUoKQorI2lmKCAkbi5oYXNFeHRlbmRzKCkgKQorCQlleHRlbmRzICRuLmdldEV4dGVuZHMoKS5uYW1lKCkKKyNlbHNlCisjaWYoICRuLmlzRXhjZXB0KCkgKQorI2lmKCAkbi5pc1VuY2hlY2tlZCgpICkKKwkJZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCisjZWxzZQorCQlleHRlbmRzIEV4Y2VwdGlvbgorI2VuZAorI2Vsc2UKKwkJaW1wbGVtZW50cyBTZXJpYWxpemFibGUKKyNlbmQKKyNlbmQKKwl7CisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIHRoZSAkbi5uYW1lKCkuIERvbid0IGluaXQgYW55IGZpZWxkcy4KKwkJICovCisJCXB1YmxpYyAkbi5uYW1lKCkoKQorCQl7CisJCQkvLyBkb24ndCBpbml0IGFueSBmaWVsZHMuCisJCX0KKyNpZiAoJG4uaGFzQW55UGFyYW1ldGVycygpKQorCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIHRoZSAkbi5uYW1lKCkuCisjZm9yZWFjaCggJGkgaW4gJG4uZ2V0QWxsUGFyYW1ldGVycygpICkKKyNzZXQoICRzZXAgPSAiQHBhcmFtICIgKQorI2ZvcmVhY2goICRzIGluICRpLmRlc2NyKCkgKQorCQkgKiAkc2VwJGkubmFtZSgpICRzCisjc2V0KCAkc2VwID0gIiIgKQorI2VuZAorI2VuZAorCQkgKi8KKwkJcHVibGljICRuLm5hbWUoKQorCQkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRpIGluICRuLmdldEFsbFBhcmFtZXRlcnMoKSApCisJCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJGkudHlwZSgpICkgJGkubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJCSkKKwkJeworI2lmKCAkbi5oYXNFeHRlbmRzKCkgKQorCQkJc3VwZXIKKwkJCSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJGkgaW4gJG4uZ2V0RXh0ZW5kcygpLmdldEFsbFBhcmFtZXRlcnMoKSApCisJCQkJJHNlcCRpLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkJKTsKKyNlbmQKKyNmb3JlYWNoKCAkaSBpbiAkbi5nZXRQYXJhbWV0ZXJzKCkgKQorCQkJdGhpcy4kaS5uYW1lKCkgPSAkaS5uYW1lKCk7CisjZW5kCisJCX0KKyNlbmQKKyNpZiggJG4uaXNFeGNlcHQoKSApCisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCisJCXsKKwkJCXJldHVybiAkaGVscGVyLmZvcm1hdFN0cmluZyggJG4sIHRydWUgKTsKKwkJfQorI2Vsc2UKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJCXsKKwkJCXJldHVybiAkaGVscGVyLmZvcm1hdFN0cmluZyggJG4sIGZhbHNlICk7CisJCX0KKyNlbmQKKyNmb3JlYWNoKCAkaSBpbiAkbi5pdGVyYXRvcigpICkKKworI2lmKCAkaS5oYXNEZXNjcigpKQorCQkvKioKKyNmb3JlYWNoKCAkcyBpbiAkaS5kZXNjcigpICkKKwkJICogJHMKKyNlbmQKKwkJICovCisjZW5kCisJCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkaS50eXBlKCkgKSAkaS5uYW1lKCk7CisKKwkJLyoqCisJCSAqIEdldHMgdGhlIHZhbHVlLgorCQkgKgorI2ZvcmVhY2goICRzIGluICRpLmRlc2NyKCkgKQorCQkgKiAkcworI2VuZAorCQkgKgorCQkgKiBAcmV0dXJuIHRoZSB2YWx1ZS4KKwkJICovCisJCXB1YmxpYyAkaGVscGVyLmdldFR5cGVOYW1lKCAkaS50eXBlKCkgKSAkaGVscGVyLmdldEdldHRlck5hbWUoICRpLm5hbWUoKSApKCkKKwkJeworCQkJcmV0dXJuICRpLm5hbWUoKTsKKwkJfQorCisJCS8qKgorCQkgKiBTZXRzIHRoZSB2YWx1ZS4KKwkJICoKKyNmb3JlYWNoKCAkcyBpbiAkaS5kZXNjcigpICkKKwkJICogJHMKKyNlbmQKKwkJICoKKwkJICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS4KKwkJICovCisJCXB1YmxpYyB2b2lkICRoZWxwZXIuZ2V0U2V0dGVyTmFtZSggJGkubmFtZSgpICkoICRoZWxwZXIuZ2V0VHlwZU5hbWUoICRpLnR5cGUoKSApIHZhbHVlICkKKwkJeworCQkJdGhpcy4kaS5uYW1lKCkgPSB2YWx1ZTsKKwkJfQorI2VuZAorCX0KKworI2VuZAorI2Vsc2VpZiAoJG4uaXNCdWlsdGluKCkpCisjIyBub3RoaW5nIHRvIGRvLgorI2Vsc2UKKwkqKiogaW50Zi52bTogZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggJG4gKioqCisjZW5kCisjZW5kCit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL2phdmFLZXl3b3Jkcy5rd2QgYi9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL2phdmFLZXl3b3Jkcy5rd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5MWY5MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvamF2YUtleXdvcmRzLmt3ZApAQCAtMCwwICsxLDc2IEBACisjICRJZCQNCisjIA0KKyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4NCisjIA0KKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90DQorIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQ0KKyMgb2YgdGhlIExpY2Vuc2UgYXQNCisjICANCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjIA0KKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVA0KKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlDQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorDQorDQorIyAqICAJICAgCW5vdCB1c2VkDQorIyAqKiAJICAJYWRkZWQgaW4gMS4yDQorIyAqKiogCSAgCWFkZGVkIGluIDEuNA0KKyMgKioqKiAJICAJYWRkZWQgaW4gNS4wDQorDQordHJ1ZQ0KK2ZhbHNlDQorbnVsbA0KK2Fic3RyYWN0DQorY29udGludWUNCitmb3INCituZXcNCitzd2l0Y2gNCithc3NlcnQJCQkjICoqKg0KK2RlZmF1bHQNCitnb3RvCQkJIyAqDQorcGFja2FnZQ0KK3N5bmNocm9uaXplZA0KK2Jvb2xlYW4NCitkbw0KK2lmDQorcHJpdmF0ZQ0KK3RoaXMNCiticmVhaw0KK2RvdWJsZQ0KK2ltcGxlbWVudHMNCitwcm90ZWN0ZWQNCit0aHJvdw0KK2J5dGUNCitlbHNlDQoraW1wb3J0DQorcHVibGljDQordGhyb3dzDQorY2FzZQ0KK2VudW0JCQkjICoqKioNCitpbnN0YW5jZW9mDQorcmV0dXJuDQordHJhbnNpZW50DQorY2F0Y2gNCitleHRlbmRzDQoraW50DQorc2hvcnQNCit0cnkNCitjaGFyDQorZmluYWwNCitpbnRlcmZhY2UNCitzdGF0aWMNCit2b2lkDQorY2xhc3MNCitmaW5hbGx5DQorbG9uZw0KK3N0cmljdGZwCQkjICoqDQordm9sYXRpbGUNCitjb25zdAkJCSMgKg0KK2Zsb2F0DQorbmF0aXZlDQorc3VwZXINCit3aGlsZQ0KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvbWFpbi52bSBiL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvbWFpbi52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQzMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9tYWluLnZtCkBAIC0wLDAgKzEsMTAzIEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgeW91ciBjb252ZW5pZW5jZSBhbmQgd2lsbCBub3QgYmUKKy8vIG92ZXJ3cml0dGVuIG9uY2UgaXQgZXhpc3RzISBQbGVhc2UgZWRpdCB0aGlzIGZpbGUgYXMgbmVjZXNzYXJ5IHRvIGltcGxlbWVudAorLy8geW91ciBzZXJ2aWNlIGxvZ2ljLgorI3NldCgkaSA9ICRpbnRmLm5hbWUoKSkKKyNzZXQoJGludGZuYW1lID0gIiRpJHN1ZmZpeCIpCisjc2V0KCRiYXNlY2xuYW1lID0gIkJhc2UkaW50Zm5hbWUiKQorI3NldCgkY2xuYW1lID0gIkltcGwkaW50Zm5hbWUiKQorI2lmICgkaGVscGVyLmlzU2VydmVyKCRtYykpCisjc2V0KCRwZWVyID0gImNsaWVudCIpCisjc2V0KCRwZWVyY2xhc3MgPSAiUmVtb3RlJHtpfUNsaWVudCIpCisjZWxzZQorI3NldCgkcGVlciA9ICJzZXJ2ZXIiKQorI3NldCgkcGVlcmNsYXNzID0gIlJlbW90ZSR7aX1TZXJ2ZXIiKQorI2VuZAorCitwYWNrYWdlICRpbnRmLnBhcmVudCgpLm5hbWUoKTsKKworI2lmICgkaGVscGVyLmlzU2VydmVyKCRtYykpCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgJHtpfVNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW4ke2l9Q2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpbiR7aX1MaXN0ZW5lciBpbXBsZW1lbnRzICR7aX1IZWxwZXIuJHtpfVNlcnZlckZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yICR7aX1TZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyBDaGFuZ2UgdG8gY29ycmVjdCBVUkkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly8wLjAuMC4wOjQwMDEiOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9ICR7aX1IZWxwZXIubmV3TGlzdGVuZXIoIHVyaSwgbnVsbCwKKwkJCW5ldyBNYWluJHtpfUxpc3RlbmVyKCkgKTsKKworCQkvLyBTdGFydCB0aGUgTGlzdGVuZXIKKwkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisJfQorCisJcHVibGljICR7aX1TZXJ2ZXIgbmV3JHtpfVNlcnZlciggUmVtb3RlJHtpfUNsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsJHtpfVNlcnZlciggY2xpZW50ICk7CisJfQorfQorI2Vsc2UKKy8qKgorICogTWFpbiBwcm9ncmFtIGZvciAke2l9Q2xpZW50LiBUaGlzIHByb2dyYW0gbWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZQorICogbGlzdGVuZXIgY3JlYXRlZCBieSBNYWluJHtpfUxpc3RlbmVyLgorICovCitwdWJsaWMgY2xhc3MgTWFpbiR7aX1DbGllbnQgaW1wbGVtZW50cyAke2l9SGVscGVyLiR7aX1DbGllbnRGYWN0b3J5Cit7CisJLyoqCisJICogTWFpbiBwcm9ncmFtIGZvciAke2l9Q2xpZW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gQ2hhbmdlIHRvIGNvcnJlY3QgVVJJCisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQkKKwkJUmVtb3RlJHtpfVNlcnZlciBzZXJ2ZXIgPSAke2l9SGVscGVyLm5ld1NlcnZlciggdXJpLCBudWxsLAorCQkJbmV3IE1haW4ke2l9Q2xpZW50KCkgKTsKKworCQkvLyBDb25uZWN0IHRvIHRoZSBzZXJ2aWNlCisJCXNlcnZlci5fc3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKworCQkvLyBUT0RPIEluc2VydCBZb3VyIENvZGUgSGVyZQorCisJCS8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmljZQorCQlzZXJ2ZXIuX3N0b3BBbmRXYWl0RG93biggNDAwMCApOworCX0KKworCXB1YmxpYyAke2l9Q2xpZW50IG5ldyR7aX1DbGllbnQoIFJlbW90ZSR7aX1TZXJ2ZXIgc2VydmVyICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBJbXBsJHtpfUNsaWVudCggc2VydmVyICk7CisJfQorfQorI2VuZApkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9yZWFkbWUudm0gYi9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL3JlYWRtZS52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBjYWRkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9yZWFkbWUudm0KQEAgLTAsMCArMSwxMzUgQEAKKyMjIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisjIworIyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisjIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorIyMgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMjIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5OgorLy8gICAkdmVyc2lvbgorLy8gICAkbm93CisvLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCBzaG91bGQgbm90IGJlIGVkaXRlZCEKKworVGhpcyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBldGNoLWdlbmVyYXRlZCBmaWxlcyBmb3IgeW91ciBzZXJ2aWNlLgorCistLS0tLS0tLS0tLS0tLS0tCistIEhvdyBUbyBCdWlsZCAtCistLS0tLS0tLS0tLS0tLS0tCisKK0luIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGV0Y2ggZmlsZSBpcyBsb2NhdGVkLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworZXRjaCAtcSAtZCAuIC1JIC4gLWIgamF2YSAtdyBhbGwgQmxhaC5ldGNoCisKK1RoaXMgd291bGQgY29tcGlsZSB0aGUgc2VydmljZSBkZXNjcmlwdGlvbiBCbGFoLmV0Y2gsIGdlbmVyYXRpbmcgYWxsIGphdmEgZmlsZXMsCitpbnRvIGphdmEgcGFja2FnZXMgcm9vdGVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoLWQgLiksIHJlc29sdmluZyBpbmNsdWRlcworYW5kIG1peGlucyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoLUkgLikgYW5kIGJlaW5nIHF1aWV0IGFib3V0IGl0ICgtcSkuCisKK0Fzc3VtaW5nIHRoZSBCbGFoLmV0Y2ggc3BlY2lmaWVkIGEgbW9kdWxlIG9mICJkZW1vIiBhbmQgYSBzZXJ2aWNlIG9mIEJsYWgsCit0aGUgamF2YSBmaWxlcyB3b3VsZCBiZSBnZW5lcmF0ZWQgaW50byBhIHN1Yi1kaXJlY3RvcnkgZGVtbyBvZiB0aGUgY3VycmVudAorZGlyZWN0b3J5LiB5b3UgbWF5IG5vdyBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgYW5kIGNvbXBpbGUgdGhlIHJlc3VsdGluZyBmaWxlczoKKworY2QgZGVtbworamF2YWMgLWNwICVFVENIX0hPTUUlXGxpYlxldGNoLWphdmEtcnVudGltZS5qYXIgKi5qYXZhCisKKyhBc3N1bWluZyB3aW5kb3dzOyBmb3IgdW5peCwgeW91IG9ubHkgbmVlZCB0byBjaGFuZ2UgdGhlIHNsYXNoIGRpcmVjdGlvbiBhbmQKK2NoYW5nZSAlRVRDSF9IT01FJSBpbnRvIFwkRVRDSF9IT01FLikKKworVG8gcnVuIHRoZSBzZXJ2aWNlICh3aGljaCBpbml0aWFsbHkgd29uJ3QgZG8gYW55dGhpbmcgYnV0IG1ha2UgYSBjb25uZWN0aW9uIGFuZAordGhlbiBjbG9zZSBpdCwgdXNlIHRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIGluIHNlcGFyYXRlIHNoZWxscyAoYWdhaW4sIGZyb20KK3RoZSBkZW1vIGRpcmVjdG9yeSk6CisKK2phdmEgLWNwICVFVENIX0hPTUUlXGxpYlxldGNoLWphdmEtcnVudGltZS5qYXI7Li4gZGVtby5NYWluQmxhaExpc3RlbmVyCisKK2phdmEgLWNwICVFVENIX0hPTUUlXGxpYlxldGNoLWphdmEtcnVudGltZS5qYXI7Li4gZGVtby5NYWluQmxhaENsaWVudAorCisoQWdhaW4sIGFzc3VtaW5nIHdpbmRvd3M7IGZvciB1bml4LCBtYWtlIHRoZSBjaGFuZ2VzIGRldGFpbGVkIGFib3ZlIGFuZCBhbHNvCitjaGFuZ2UgdGhlIHNlbWktY29sb24gaW4gdGhlIC1jcCBzcGVjIHRvIGEgY29sb24uKQorCitUaGUgZmlyc3QgY29tbWFuZCAoamF2YSAuLi4gZGVtby5NYWluQmxhaExpc3RlbmVyKSBzdGFydHMgdGhlIHNlcnZpY2UgbGlzdGVuZXIKK3doaWNoIGFjY2VwdHMgY29ubmVjdGlvbnMuIFRoZSBzZWNvbmQgY29tbWFuZCBydW5zIGEgc2FtcGxlIGNsaWVudCwgd2hpY2ggbWFrZXMKK2EgY29ubmVjdGlvbiB0byB0aGUgcnVubmluZyBsaXN0ZW5lciBhbmQgdGhlbiBjbG9zZXMgaXQgYWdhaW4uCisKK09uY2UgeW91J3ZlIGNvbXBpbGVkIHRoZSBzZXJ2aWNlIGFuZCB0ZXN0ZWQgdGhlIHJlc3VsdCwgeW91IG1heSBpbXBsZW1lbnQgeW91cgorc2VydmljZSBieSBhZGRpbmcgY29udGVudCB0byB0aGUgZXRjaCBmaWxlLCBhZGRpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0byB0aGUKK0ltcGwqLmphdmEgYW5kIE1haW4qLmphdmEgZmlsZXMsIGFuZCByZWNvbXBpbGluZyB1c2luZyB0aGUgYWJvdmUgc3RlcHMuIFlvdSBtYXkKK2Fsc28gbG9hZCB0aGVzZSBmaWxlcyBpbnRvIGFuIElERSBzdWNoIGFzIGVjbGlwc2Ugb3IgaW50ZWxsaWosIG9yIHVzZSBhIGJ1aWxkCittYW5hZ2VtZW50IHN5c3RlbSBzdWNoIGFzIG1hdmVuIG9yIGFudC4gUmVtZW1iZXIsIHdoZW5ldmVyIHlvdSBjaGFuZ2UgdGhlIGV0Y2gKK2ZpbGUsIHlvdSBtdXN0IHJlLWV0Y2ggdGhlIHNlcnZpY2UgZGVzY3JpcHRpb24gYW5kIHRoZW4gcmUtamF2YWMgYWxsIHRoZSBqYXZhCitmaWxlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLQorLSBHZW5lcmF0ZWQgRmlsZXMgLQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGdlbmVyYXRlZCBmaWxlcyBmb3IgYSBzZXJ2aWNlIG5hbWVkIEJsYWguCisKK0JsYWguamF2YQorQmxhaENsaWVudC5qYXZhCitCbGFoU2VydmVyLmphdmEKKworVGhlc2UgdGhyZWUgZmlsZXMgYXJlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIGNsYXNzZXMuIFNlcnZpY2UgZGVmaW5lZCBjb25zdGFudHMKK2FuZCB0eXBlcyBhcmUgaW4gQmxhaC5qYXZhLCBhcyB3ZWxsIGFzIGRpcmVjdGlvbiAiYm90aCIgbWVzc2FnZXMsIHdoaWNoIGFyZQorbWVzc2FnZXMgd2hpY2ggYXJlIHNoYXJlZCBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLiBCbGFoQ2xpZW50LmphdmEgYW5kCitCbGFoU2VydmVyLmphdmEgYXJlIHJlc3BlY3RpdmVseSB0aGUgbWVzc2FnZXMgZm9yIGp1c3QgdGhlIGRpcmVjdGlvbiBjbGllbnQgb3IKK3NlcnZlci4gWW91IHNob3VsZCBub3QgZWRpdCB0aGVzZSBmaWxlcy4KKworUmVtb3RlQmxhaC5qYXZhCitSZW1vdGVCbGFoQ2xpZW50LmphdmEKK1JlbW90ZUJsYWhTZXJ2ZXIuamF2YQorCitSZW1vdGVCbGFoKi5qYXZhIGFyZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoZSBpbnRlcmZhY2VzLAord2l0aCBtZXNzYWdlIGltcGxlbWVudGF0aW9ucyB3aGljaCBlbmNvZGUgdGhlIG1lc3NhZ2UgdHlwZSBhbmQgYXJndW1lbnRzIGZvcgordHJhbnNwb3J0IHRvIHRoZSBjb25uZWN0aW9uIHBlZXIgYW5kIHRoZW4gcmVjZWl2ZSBhbmQgZGVjb2RlIGFueSByZXNwb25zZS4gWW91CitzaG91bGQgbm90IGVkaXQgdGhlc2UgZmlsZXMuCisKK1N0dWJCbGFoLmphdmEKK1N0dWJCbGFoQ2xpZW50LmphdmEKK1N0dWJCbGFoU2VydmVyLmphdmEKKworU3R1YkJsYWgqLmphdmEgYXJlIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyB3aGljaCByZWNlaXZlIG1lc3NhZ2VzIGVuY29kZWQgYnkKK1JlbW90ZUJsYWgqLmphdmEgYW5kIGRlY29kZSB0aGVtLCBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGltcGxlbWVudGF0aW9uCithbmQgdGhlbiBlbmNvZGluZyBhbmQgc2VuZGluZyBhbnkgcmVzdWx0LiBZb3Ugc2hvdWxkIG5vdCBlZGl0IHRoZXNlIGZpbGVzLgorCitWYWx1ZUZhY3RvcnlCbGFoLmphdmEKKworVmFsdWVGYWN0b3J5QmxhaC5qYXZhIGlzIGEgZ2VuZXJhdGVkIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGhlbHBlciBjb2RlIHRvCitzZXJpYWxpemUgc2VydmljZSBkZWZpbmVkIHR5cGVzIGFuZCBhbHNvIHRoZSBtZXRhIGRhdGEgd2hpY2ggZGVzY3JpYmVzIHRoZQorbWVzc2FnZXMgYW5kIGZpZWxkcywgZmllbGQgdHlwZXMsIHRpbWVvdXRzLCBldGMuIFlvdSBzaG91bGQgbm90IGVkaXQgdGhpcyBmaWxlLgorCitCYXNlQmxhaC5qYXZhCitCYXNlQmxhaENsaWVudC5qYXZhCitCYXNlQmxhaFNlcnZlci5qYXZhCisKK0Jhc2VCbGFoKi5qYXZhIGFyZSBnZW5lcmF0ZWQgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZXMsIHdpdGgKK21lc3NhZ2UgaW1wbGVtZW50YXRpb25zIHdoaWNoIGRvIG5vdGhpbmcgYnV0IHRocm93IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorVGhleSBjYW4gYmUgdXNlZCB0byBzdXBwbHkgYW4gaW1wbGVtZW50YXRpb24gd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBpbW1lZGlhdGVseQoraW1wbGVtZW50IGFsbCB0aGUgbWVzc2FnZXMuIFlvdSBzaG91bGQgbm90IGVkaXQgdGhlc2UgZmlsZXMuCisKK0ltcGxCbGFoQ2xpZW50LmphdmEKK0ltcGxCbGFoU2VydmVyLmphdmEKKworSW1wbEJsYWgqLmphdmEgYXJlIHRoZSBnZW5lcmF0ZWQgc2FtcGxlIGNsaWVudCBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9uCitjbGFzc2VzLiBUaGV5IGV4dGVuZCB0aGUgZ2VuZXJhdGVkIGJhc2UgY2xhc3Nlcy4gVGhlc2UgYXJlIHVzZWQgYnkgdGhlIHNhbXBsZQorbWFpbiBwcm9ncmFtcyB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgY2xpZW50IG9yIHNlcnZlciBtZXNzYWdlcy4gRWRpdAordGhlc2UgZmlsZXMgYXMgeW91IHdpc2ggdG8gaW1wbGVtZW50IHlvdXIgc2VydmljZSAob3ZlcnJpZGluZyB0aGUgZGVmYXVsdAoraW1wbGVtZW50YXRpb25zIGZyb20gdGhlIGdlbmVyYXRlZCBiYXNlIGNsYXNzZXMpLgorCitCbGFoSGVscGVyLmphdmEKKworQmxhaEhlbHBlci5qYXZhIGlzIGEgZ2VuZXJhdGVkIGNsYXNzIHdoaWNoIGluY2x1ZGVzIHN0YXRpYyBtZXRob2RzIHRvIGhlbHAKK2NvbnN0cnVjdCB0cmFuc3BvcnRzIGZvciBjbGllbnQgYW5kIGxpc3RlbmVyLiBZb3Ugc2hvdWxkIG5vdCBlZGl0IHRoaXMgZmlsZS4KKworTWFpbkJsYWhDbGllbnQuamF2YQorTWFpbkJsYWhMaXN0ZW5lci5qYXZhCisKK01haW5CbGFoKi5qYXZhIGFyZSB0aGUgZ2VuZXJhdGVkIHNhbXBsZSBjbGllbnQgYW5kIHNlcnZlciBtYWluIHByb2dyYW1zLgorVGhleSBzaG93IGhvdyB0byBzZXR1cCBhIHRyYW5zcG9ydCBhbmQgc3RhcnQgaXQgYW5kIGhvdyB0byBjcmVhdGUgYSBzZXNzaW9uLgorRWRpdCB0aGVzZSBmaWxlcyBhcyB5b3Ugd2lzaCB0byBpbXBsZW1lbnQgeW91ciBzZXJ2aWNlLCBvciBqdXN0IGNvcHkgdGhlIGNvZGUKK2ludG8geW91ciBvd24gYXBwbGljYXRpb24uCisKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvcmVtb3RlLnZtIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9yZW1vdGUudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4MzZiYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvY29tcGlsZXIvcmVtb3RlLnZtCkBAIC0wLDAgKzEsNDIyIEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgJHZlcnNpb24KKy8vICAgJG5vdworLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBlZGl0ZWQhCisjc2V0KCRpID0gJGludGYubmFtZSgpKQorI3NldCgkdmZuYW1lID0gIlZhbHVlRmFjdG9yeSRpIikKKyNzZXQoJGludGZuYW1lID0gIiRpJHN1ZmZpeCIpCisjc2V0KCRjbG5hbWUgPSAiUmVtb3RlJGludGZuYW1lIikKKworcGFja2FnZSAkaW50Zi5wYXJlbnQoKS5uYW1lKCk7CisKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZigkbi5pc0V4dGVybigpKQorI2lmKCRuLmhhc0ltcG9ydCggJGhlbHBlciApKQoraW1wb3J0ICRuLmdldEltcG9ydCggJGhlbHBlciApOworI2VuZAorI2VuZAorI2VuZAorCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciAkaW50Zm5hbWUuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorI2lmKCRoYXNCYXNlQ2xhc3MpCitwdWJsaWMgZmluYWwgY2xhc3MgJGNsbmFtZSBleHRlbmRzIFJlbW90ZSRpIGltcGxlbWVudHMgJGludGZuYW1lCisjZWxzZQorcHVibGljIGNsYXNzICRjbG5hbWUgZXh0ZW5kcyBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlJlbW90ZUJhc2UgaW1wbGVtZW50cyAkaW50Zm5hbWUKKyNlbmQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSAkY2xuYW1lLgorCSAqCisJICogQHBhcmFtIHN2YworCSAqIEBwYXJhbSB2ZgorCSAqLworCXB1YmxpYyAkY2xuYW1lKCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlbGl2ZXJ5U2VydmljZSBzdmMsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3RvcnkgdmYgKQorCXsKKwkJc3VwZXIoIHN2YywgdmYgKTsKKyNzZXQoICRrID0gMCApCisjZm9yZWFjaCggJHggaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYoICR4LmlzTWl4aW4oKSApCisjc2V0KCAkayA9ICRrICsgMSApCisjc2V0KCAkdiA9ICJfbWl4aW4kayIgKQorI3NldCggJG0gPSAkeC5nZXRNb2R1bGUoKSApCisjc2V0KCAkeiA9ICRtLml0ZXJhdG9yKCkubmV4dCgpICkKKwkJJHYgPSBuZXcgJHttLm5hbWUoKX0uUmVtb3RlJHoubmFtZSgpJHtzdWZmaXh9KCBzdmMsIHZmICk7CisjZW5kCisjZW5kCisJfQorCisJLyoqCisJICoge0BsaW5rIF9Bc3luY30gY2xhc3MgaW5zdGFuY2UgdXNlZCB0byBoaWRlIGFzeW5jaHJvbm91cyBtZXNzYWdlCisJICogaW1wbGVtZW50YXRpb24uIFVzZSB0aGlzIHRvIGludm9rZSB0aGUgYXN5bmNocm9ub3VzIG1lc3NhZ2UKKwkgKiBpbXBsZW1lbnRhdGlvbnMuCisJICovCisJcHVibGljIGZpbmFsIF9Bc3luYyBfYXN5bmMgPSBuZXcgX0FzeW5jKCk7CisKKwkvKioKKwkgKiB7QGxpbmsgX0FzeW5jfSBjbGFzcyBpbnN0YW5jZSB1c2VkIHRvIGhpZGUgYXN5bmNocm9ub3VzIG1lc3NhZ2UKKwkgKiBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5LCB1c2UKKwkgKiB7QGxpbmsgI19hc3luY30gaW5zdGVhZC4KKwkgKiBAZGVwcmVjYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIGZpbmFsIF9Bc3luYyBfaW5uZXIgPSBfYXN5bmM7CisjZm9yZWFjaCgkbiBpbiAkaW50Zi5pdGVyYXRvcigpKQorI2lmKCRuLmlzTXNnRGlyKCRtYykpCisjaWYoISRuLmlzSGlkZGVuKCkpCisjaWYoISRtZXRob2RMaXN0LmNvbnRhaW5zKCRuLm5hbWUoKS5uYW1lKCkpKQorI3NldCAoICRhZGRNZXRob2RMaXN0U3RhdHVzID0gJG1ldGhvZExpc3QuYWRkKCRuLm5hbWUoKS5uYW1lKCkpKQorI2lmKCRuLmlzT25ld2F5KCkpCisKKwlwdWJsaWMgZmluYWwgJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkgJG4ubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCSkKKwl7CisJCW9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlIF9tc2cgPSBfbmV3TWVzc2FnZSggJHZmbmFtZS4kbi52bmFtZSggJGhlbHBlciApICk7CisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCV9tc2cucHV0KCAkdmZuYW1lLiRwLnZuYW1lKCAkaGVscGVyICksICRwLm5hbWUoKSApOworI2VuZAorCQl0cnkKKwkJeworCQkJX3NlbmQoIF9tc2cgKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBfZSApCisJCXsKKwkJCWlmIChfZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBfZTsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAidW5leHBlY3RlZCBleGNlcHRpb24gZnJvbSBwZWVyOiAiK19lLCBfZSApOworCQl9CisJfQorI2Vsc2UKKworCXB1YmxpYyBmaW5hbCAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkgJHAubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJKQorI2lmKCRuLnRocm93bigpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKQorCXRocm93cworI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCR0IGluICRuLnRocm93bigpLml0ZXJhdG9yKCkpCisJCSRzZXAkdC5nZXROYW1lZCgpLmZxbmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisjZW5kCisJeworI2lmKCRuLmhhc1JldHVybigpKQorCQlyZXR1cm4KKyNlbmQKKwkJX2FzeW5jLl9lbmRfJHtuLm5hbWUoKX0oIF9hc3luYy5fYmVnaW5fJHtuLm5hbWUoKX0oCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJJHNlcCRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkpICk7CisJfQorI2VuZAorI2VuZAorI2VuZAorI2VuZAorI2VuZAorI3NldCggJGsgPSAwICkKKyNmb3JlYWNoKCAkeCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJHguaXNNaXhpbigpICkKKworCS8vIC0tLS0tIG1peGluICR4Lm5hbWUoKSAtLS0tLSAvLworI3NldCggJGsgPSAkayArIDEgKQorI3NldCggJHYgPSAiX21peGluJGsiICkKKyNzZXQoICRtID0gJHguZ2V0TW9kdWxlKCkgKQorI3NldCggJHogPSAkbS5pdGVyYXRvcigpLm5leHQoKSApCisKKwlwcml2YXRlIGZpbmFsICR7bS5uYW1lKCl9LlJlbW90ZSR6Lm5hbWUoKSRzdWZmaXggJHY7CisjZm9yZWFjaCggJG4gaW4gJHoubWVzc2FnZXMoIHRydWUgKSApCisjaWYoJG4uaXNNc2dEaXIoJG1jKSkKKyNpZighJG4uaXNIaWRkZW4oKSkKKyNpZighJG1ldGhvZExpc3QuY29udGFpbnMoJG4ubmFtZSgpLm5hbWUoKSkpCisjc2V0ICggJGFkZE1ldGhvZExpc3RTdGF0dXMgPSAkbWV0aG9kTGlzdC5hZGQoJG4ubmFtZSgpLm5hbWUoKSkgKQorCS8vIC0tLSBnZW5lcmF0ZWQgbWV0aG9kcyBmb3IgJG4ubmFtZSgpIC0tLSAvLworCisjaWYoJG4uaXNPbmV3YXkoKSkKKwlwdWJsaWMgZmluYWwgJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkgJG4ubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJJHNlcCRoZWxwZXIuZ2V0VHlwZU5hbWUoICRwLnR5cGUoKSApICRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCSkKKwl7CisJCSR7dn0uJG4ubmFtZSgpKAorI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCSRzZXAkcC5uYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJKTsKKwl9CisjZWxzZQorCXB1YmxpYyBmaW5hbCAkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSAkbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkgJHAubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJKQorI2lmKCRuLnRocm93bigpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKQorCXRocm93cworI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCR0IGluICRuLnRocm93bigpLml0ZXJhdG9yKCkpCisJCSRzZXAkdC5nZXROYW1lZCgpLmZxbmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisjZW5kCisJeworI2lmKCRuLmhhc1JldHVybigpKQorCQlyZXR1cm4KKyNlbmQKKwkJJHt2fS4kbi5uYW1lKCkoCisjc2V0KCAkc2VwID0gIiIgKQorI2ZvcmVhY2goICRwIGluICRuLml0ZXJhdG9yKCkgKQorCQkJJHNlcCRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkpOworCX0KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKworCS8qKgorCSAqIEFzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbiBvZiBzZXJ2aWNlIG1ldGhvZHMuCisJICovCisjaWYoJGhhc0Jhc2VDbGFzcykKKwlwdWJsaWMgZmluYWwgY2xhc3MgX0FzeW5jIGV4dGVuZHMgUmVtb3RlJHtpfS5fQXN5bmMKKyNlbHNlCisJcHVibGljIGNsYXNzIF9Bc3luYworI2VuZAorCXsKKyNmb3JlYWNoKCRuIGluICRpbnRmLml0ZXJhdG9yKCkpCisjaWYoJG4uaXNNc2dEaXIoJG1jKSkKKyNpZighJG4uaXNIaWRkZW4oKSkKKyNpZighJG1ldGhvZExpc3QuY29udGFpbnMoIl9iZWdpbl9lbmRfJG4ubmFtZSgpLm5hbWUoKSIpKQorI3NldCAoICRhZGRNZXRob2RMaXN0U3RhdHVzID0gJG1ldGhvZExpc3QuYWRkKCJfYmVnaW5fZW5kXyRuLm5hbWUoKS5uYW1lKCkiKSApCisjaWYoISRuLmlzT25ld2F5KCkpCisKKwkJLyoqCisJCSAqIEJlZ2lucyBhIGNhbGwgdG8gJHtuLm5hbWUoKX0uCisJCSAqCisjZm9yZWFjaCggJHMgaW4gJG4uZGVzY3IoKSApCisJCSAqICRzCisjZW5kCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisjc2V0KCRzZXAgPSAiQHBhcmFtICRwLm5hbWUoKSAiKQorI2ZvcmVhY2goICRzIGluICRwLmRlc2NyKCkgKQorCQkgKiAkc2VwJHMKKyNzZXQoJHNlcCA9ICIiKQorI2VuZAorI2VuZAorCQkgKiBAcmV0dXJuIG1haWxib3ggdXNlZCB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IHVzaW5nIF9lbmRfJHtuLm5hbWUoKX0uCisJCSAqIEBzZWUgJGNsbmFtZSMke24ubmFtZSgpfQorCQkgKiBAc2VlICNfZW5kXyR7bi5uYW1lKCl9CisJCSAqLworCQlwdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94IF9iZWdpbl8ke24ubmFtZSgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkgJHAubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJCSkKKwkJeworCQkJb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2UgX21zZyA9IF9uZXdNZXNzYWdlKCAkdmZuYW1lLiRuLnZuYW1lKCAkaGVscGVyICkgKTsKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKwkJCV9tc2cucHV0KCAkdmZuYW1lLiRwLnZuYW1lKCAkaGVscGVyICksICRwLm5hbWUoKSApOworI2VuZAorCQkJcmV0dXJuIF9iZWdpbmNhbGwoIF9tc2cgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEVuZHMgYSBjYWxsIHRvICR7bi5uYW1lKCl9LgorCQkgKgorI2ZvcmVhY2goICRzIGluICRuLmRlc2NyKCkgKQorCQkgKiAkcworI2VuZAorCQkgKiBAcGFyYW0gbWIgbWFpbGJveCByZXR1cm5lZCBieSBfYmVnaW5fJHtuLm5hbWUoKX0uCisjaWYoJG4uaGFzUmV0dXJuKCkpCisjc2V0KCRzZXAgPSAiQHJldHVybiAiKQorI2ZvcmVhY2goICRzIGluICRuLnJldHVybkRlc2NyKCkgKQorCQkgKiAkc2VwJHMKKyNzZXQoJHNlcCA9ICIiKQorI2VuZAorI2VuZAorI2ZvcmVhY2goJHQgaW4gJG4udGhyb3duKCkuaXRlcmF0b3IoKSkKKyNzZXQoJHNlcCA9ICJAdGhyb3dzICR0Lm5hbWUoKSAiKQorI2ZvcmVhY2goICRzIGluICR0LmRlc2NyKCkgKQorCQkgKiAkc2VwJHMKKyNzZXQoJHNlcCA9ICIiKQorI2VuZAorI2VuZAorCQkgKgorCQkgKiBAc2VlICRjbG5hbWUjJHtuLm5hbWUoKX0KKwkJICogQHNlZSAjX2JlZ2luXyR7bi5uYW1lKCl9CisJCSAqLworCQlwdWJsaWMgZmluYWwgJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkgX2VuZF8ke24ubmFtZSgpfSggb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94IG1iICkKKyNpZigkbi50aHJvd24oKS5pdGVyYXRvcigpLmhhc05leHQoKSkKKwkJCXRocm93cworI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCR0IGluICRuLnRocm93bigpLml0ZXJhdG9yKCkpCisJCQkJJHNlcCR0LmdldE5hbWVkKCkuZnFuYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKyNlbmQKKwkJeworCQkJdHJ5CisJCQl7CisjaWYoJG4uaGFzUmV0dXJuKCkpCisJCQkJcmV0dXJuCisJCQkJCSgkaGVscGVyLmdldFR5cGVOYW1lKCAkbi50eXBlKCkgKSkKKwkJCQkJCV9lbmRjYWxsKCBtYiwKKwkJCQkJCQkkdmZuYW1lLiRuLmdldFJlc3VsdE1lc3NhZ2UoKS52bmFtZSggJGhlbHBlciApICk7CisjZWxzZQorCQkJCV9lbmRjYWxsKCBtYiwKKwkJCQkJJHZmbmFtZS4kbi5nZXRSZXN1bHRNZXNzYWdlKCkudm5hbWUoICRoZWxwZXIgKSAgKTsKKyNlbmQKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworI2ZvcmVhY2goJHQgaW4gJG4udGhyb3duKCkuaXRlcmF0b3IoKSkKKwkJCQlpZiAoZSBpbnN0YW5jZW9mICR7dC5nZXROYW1lZCgpLmZxbmFtZSgpfSkKKwkJCQkJdGhyb3cgKCR0LmdldE5hbWVkKCkuZnFuYW1lKCkpIGU7CisjZW5kCisJCQkJaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGZyb20gcGVlcjogIitlLCBlICk7CisJCQl9CisJCX0KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQgCisjZW5kCisKKwkJLy8gTWl4aW4gTWV0aG9kcworI3NldCggJGsgPSAwICkKKyNmb3JlYWNoKCAkeCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJHguaXNNaXhpbigpICkKKyNzZXQoICRrID0gJGsgKyAxICkKKyNzZXQoICR2ID0gIl9taXhpbiRrIiApCisjc2V0KCAkbSA9ICR4LmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQorI2ZvcmVhY2goICRuIGluICR6Lm1lc3NhZ2VzKCB0cnVlICkgKQorI2lmKCRuLmlzTXNnRGlyKCRtYykpCisjaWYoISRuLmlzSGlkZGVuKCkpCisjaWYoISRtZXRob2RMaXN0LmNvbnRhaW5zKCJfYmVnaW5fZW5kXyRuLm5hbWUoKS5uYW1lKCkiKSkKKyNzZXQgKCAkYWRkTWV0aG9kTGlzdFN0YXR1cyA9ICRtZXRob2RMaXN0LmFkZCgiX2JlZ2luX2VuZF8kbi5uYW1lKCkubmFtZSgpIikgKQorCQkvLyAtLS0gZ2VuZXJhdGVkIG1ldGhvZHMgZm9yICRuLm5hbWUoKSAtLS0gLy8KKworI2lmKCEkbi5pc09uZXdheSgpKQorCQkvKioKKwkJICogQmVnaW5zIGEgY2FsbCB0byAke24ubmFtZSgpfS4KKwkJICoKKyNmb3JlYWNoKCAkcyBpbiAkbi5kZXNjcigpICkKKwkJICogJHMKKyNlbmQKKyNmb3JlYWNoKCAkcCBpbiAkbi5pdGVyYXRvcigpICkKKyNzZXQoICRzZXAgPSAiQHBhcmFtICRwLm5hbWUoKSAiICkKKyNmb3JlYWNoKCAkcyBpbiAkcC5kZXNjcigpICkKKwkJICogJHNlcCRzCisjc2V0KCAkc2VwID0gIiIgKQorI2VuZAorI2VuZAorCQkgKiBAcmV0dXJuIG1haWxib3ggdXNlZCB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IHVzaW5nIF9lbmRfJHtuLm5hbWUoKX0uCisJCSAqIEBzZWUgJGNsbmFtZSMke24ubmFtZSgpfQorCQkgKiBAc2VlICNfZW5kXyR7bi5uYW1lKCl9CisJCSAqLworCQlwdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94IF9iZWdpbl8ke24ubmFtZSgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkkc2VwJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkgJHAubmFtZSgpCisjc2V0KCAkc2VwID0gIiwgIiApCisjZW5kCisJCSkKKwkJeworCQkJcmV0dXJuICR7dn0uX2FzeW5jLl9iZWdpbl8ke24ubmFtZSgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCggJHAgaW4gJG4uaXRlcmF0b3IoKSApCisJCQkJJHNlcCRwLm5hbWUoKQorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorCQkJKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEVuZHMgYSBjYWxsIHRvICR7bi5uYW1lKCl9LgorCQkgKgorI2ZvcmVhY2goICRzIGluICRuLmRlc2NyKCkgKQorCQkgKiAkcworI2VuZAorCQkgKiBAcGFyYW0gbWIgbWFpbGJveCByZXR1cm5lZCBieSBfYmVnaW5fJHtuLm5hbWUoKX0uCisjaWYoICRuLmhhc1JldHVybigpICkKKyNzZXQoICRzZXAgPSAiQHJldHVybiAiICkKKyNmb3JlYWNoKCAkcyBpbiAkbi5yZXR1cm5EZXNjcigpICkKKwkJICogJHNlcCRzCisjc2V0KCAkc2VwID0gIiIgKQorI2VuZAorI2VuZAorI2ZvcmVhY2goICR0IGluICRuLnRocm93bigpLml0ZXJhdG9yKCkgKQorI3NldCggJHNlcCA9ICJAdGhyb3dzICR0Lm5hbWUoKSAiICkKKyNmb3JlYWNoKCAkcyBpbiAkdC5kZXNjcigpICkKKwkJICogJHNlcCRzCisjc2V0KCAkc2VwID0gIiIgKQorI2VuZAorI2VuZAorCQkgKgorCQkgKiBAc2VlICRjbG5hbWUjJHtuLm5hbWUoKX0KKwkJICogQHNlZSAjX2JlZ2luXyR7bi5uYW1lKCl9CisJCSAqLworCQlwdWJsaWMgZmluYWwgJGhlbHBlci5nZXRUeXBlTmFtZSggJG4udHlwZSgpICkgX2VuZF8ke24ubmFtZSgpfSggb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94IG1iICkKKyNpZigkbi50aHJvd24oKS5pdGVyYXRvcigpLmhhc05leHQoKSkKKwkJCXRocm93cworI3NldCggJHNlcCA9ICIiICkKKyNmb3JlYWNoKCR0IGluICRuLnRocm93bigpLml0ZXJhdG9yKCkpCisJCQkJJHNlcCR0LmdldE5hbWVkKCkuZnFuYW1lKCkKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKyNlbmQKKwkJeworI2lmKCRuLmhhc1JldHVybigpKQorCQkJcmV0dXJuCisjZW5kCisJCQkke3Z9Ll9hc3luYy5fZW5kXyR7bi5uYW1lKCl9KCBtYiApOworCQl9CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisjZW5kCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9zdHViLnZtIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci9zdHViLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjA5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL3N0dWIudm0KQEAgLTAsMCArMSwxNzAgQEAKKyMjIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisjIworIyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisjIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorIyMgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMjIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5OgorLy8gICAkdmVyc2lvbgorLy8gICAkbm93CisvLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCBzaG91bGQgbm90IGJlIGVkaXRlZCEKKyNzZXQoJGkgPSAkaW50Zi5uYW1lKCkpCisKK3BhY2thZ2UgJGludGYucGFyZW50KCkubmFtZSgpOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWxpdmVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5Qb29sOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU3R1YkhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0Ll9FdGNoX0F1dGhFeGNlcHRpb247CisjaWYgKCEkaGFzQmFzZUNsYXNzKQoraW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU3R1YkJhc2U7CisjZW5kCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5Qb29sLlBvb2xSdW5uYWJsZTsKKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNFeHRlcm4oKSkKKyNpZiAoJG4uaGFzSW1wb3J0KCAkaGVscGVyICkpCitpbXBvcnQgJG4uZ2V0SW1wb3J0KCAkaGVscGVyICk7CisjZW5kCisjZW5kCisjZW5kCisKKyNpZiAoJGhhc0Jhc2VDbGFzcykKKy8qKgorICogTWVzc2FnZSB0byBjYWxsIHRyYW5zbGF0b3IgZm9yICRpJHN1ZmZpeC4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCitwdWJsaWMgY2xhc3MgU3R1YiRpJHN1ZmZpeCBleHRlbmRzIFN0dWIkaTwkaSRzdWZmaXg+Cisjc2V0KCAkVCA9ICIkaSRzdWZmaXgiICkKKyNlbHNlCisvKioKKyAqIE1lc3NhZ2UgdG8gY2FsbCB0cmFuc2xhdG9yIGZvciAkaSRzdWZmaXguCisgKiBAcGFyYW0gPFQ+ICRpJHN1ZmZpeCBvciBhIHN1YmNsYXNzIHRoZXJlb2YuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorcHVibGljIGNsYXNzIFN0dWIkaSRzdWZmaXg8VCBleHRlbmRzICRpJHN1ZmZpeD4gZXh0ZW5kcyBTdHViQmFzZTxUPgorI3NldCggJFQgPSAiVCIgKQorI2VuZAoreworCS8qKgorCSAqIFN0dWIgZm9yICRpJHN1ZmZpeC4KKwkgKiBAcGFyYW0gc3ZjIHRoZSBkZWxpdmVyeSBzZXJ2aWNlLgorCSAqIEBwYXJhbSBvYmogdGhlIGltcGxlbWVudGF0aW9uIG9mICRpJHN1ZmZpeCByZXNwb25zaXZlIHRvIHJlcXVlc3RzLgorCSAqIEBwYXJhbSBxdWV1ZWQgdGhyZWFkIHBvb2wgdXNlZCB0byBydW4gQXN5bmNNb2RlLlFVRVVFRCBtZXRob2RzLgorCSAqIEBwYXJhbSBmcmVlIHRocmVhZCBwb29sIHVzZWQgdG8gcnVuIEFzeW5jTW9kZS5GUkVFIG1ldGhvZHMuCisJICovCisJcHVibGljIFN0dWIkaSRzdWZmaXgoIERlbGl2ZXJ5U2VydmljZSBzdmMsICRUIG9iaiwgUG9vbCBxdWV1ZWQsIFBvb2wgZnJlZSApCisJeworCQlzdXBlciggc3ZjLCBvYmosIHF1ZXVlZCwgZnJlZSApOworCX0KKwkKKwlzdGF0aWMKKwl7CisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYoICRuLmlzTWl4aW4oKSApCisjc2V0KCAkbSA9ICRuLmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQorCQkke20ubmFtZSgpfS5TdHViJHt6Lm5hbWUoKX0ke3N1ZmZpeH0uaW5pdCgpOworI2VuZAorI2VuZAorCX0KKworCS8qKgorCSAqIE1ldGhvZCB1c2VkIHRvIGZvcmNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpCisJeworCQkvLyBub3RoaW5nIHRvIGRvLgorCX0KKwkKKwlzdGF0aWMKKwl7CisjZm9yZWFjaCggJG10aGQgaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRtdGhkLmlzTXNnRGlyKCRtYykpCisjaWYgKCEkbXRoZC5pc0hpZGRlbigpKQorCQlWYWx1ZUZhY3RvcnkkaS4ke210aGQudm5hbWUoICRoZWxwZXIgKX0uc2V0U3R1YkhlbHBlciggbmV3IFN0dWJIZWxwZXI8JGkkc3VmZml4PigpCisJCXsKKwkJCXB1YmxpYyBmaW5hbCB2b2lkIHJ1biggRGVsaXZlcnlTZXJ2aWNlIF9zdmMsICRpJHN1ZmZpeCBfb2JqLCBXaG8gX3NlbmRlciwgTWVzc2FnZSBfbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworI2lmICghJG10aGQuaXNPbmV3YXkoKSkKKwkJCQlmaW5hbCBNZXNzYWdlIF9ybXNnID0gX21zZy5yZXBseSgpOworI2VuZAorCQkJCXRyeQorCQkJCXsKKyNpZiAoJG10aGQuaGFzQXV0aCgpKQorI2ZvcmVhY2ggKCRwYXJhbSBpbiAkbXRoZC5pdGVyYXRvcigpKQorCQkJCQkkaGVscGVyLmdldFR5cGVOYW1lKCAkcGFyYW0udHlwZSgpICkgJHBhcmFtLm5hbWUoKSA9ICgkaGVscGVyLmdldFR5cGVOYW1lKCAkcGFyYW0udHlwZSgpICkpIF9tc2cuZ2V0KCBWYWx1ZUZhY3RvcnkkaS4kcGFyYW0udm5hbWUoICRoZWxwZXIgKSApOworI2VuZAorI2VuZAorI2lmICgkbXRoZC5oYXNBdXRoKCkpCisjc2V0KCAkYXV0aCA9ICRtdGhkLmdldEF1dGgoKSApCisjaWYgKCRhdXRoLmlzTWV0aG9kRmFsc2UoKSkKKwkJCQkJaWYgKHRydWUpCisjZWxzZQorCQkJCQlpZiAoIV9vYmouJHthdXRoLm1ldGhvZCgpfSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCgkYXJnIGluICRhdXRoLmFyZ3MoKSkKKyNpZiAoJGFyZy5pc0xpdGVyYWxDb25zdGFudCgpKQorCQkJCQkJKCRoZWxwZXIuZ2V0TmF0aXZlVHlwZU5hbWUoICRhcmcudHlwZSgpICkpICR7c2VwfSRoZWxwZXIuZ2V0VHlwZVZhbHVlKCAkYXJnLnR5cGUoKSwgJGFyZy52YWx1ZSgpICkKKyNlbHNlaWYgKCRhcmcuaXNQYXJhbWV0ZXIoICRtdGhkICkpCisJCQkJCQkke3NlcH0kaGVscGVyLnF1YWxpZnlQYXJhbWV0ZXJOYW1lKCAkYXJnLnZhbHVlKCkgKQorI2Vsc2VpZiAoJGFyZy5pc0NvbnN0YW50KCAkaW50ZiApKQorCQkJCQkJJHtzZXB9JGhlbHBlci5xdWFsaWZ5Q29uc3RhbnROYW1lKCAkaW50ZiwgJGFyZy52YWx1ZSgpICkKKyNlbHNlaWYgKCRhcmcuaXNFbnVtKCAkaW50ZiApKQorCQkJCQkJJHtzZXB9JGhlbHBlci5xdWFsaWZ5RW51bU5hbWUoICRpbnRmLCAkYXJnLnZhbHVlKCkgKQorI2Vsc2UKKwkJCQkJCSR7c2VwfW51bGwKKyNlbmQKKyNzZXQoICRzZXAgPSAiLCAiICkKKyNlbmQKKwkJCQkJKSkKKyNlbmQKKwkJCQkJdGhyb3cgbmV3IF9FdGNoX0F1dGhFeGNlcHRpb24oICJzdHViIGNvdWxkIG5vdCBhdXRob3JpemUgJG10aGQubmFtZSgpIHVzaW5nICRhdXRoLm1ldGhvZCgpIiApOworI2VuZAorI2lmICgkbXRoZC5oYXNSZXR1cm4oKSkKKwkJCQkJX3Jtc2cucHV0KCBWYWx1ZUZhY3RvcnkkaS5fbWZfcmVzdWx0LAorI2VuZAorCQkJCQlfb2JqLiRtdGhkLm5hbWUoKSgKKyNzZXQoICRzZXAgPSAiIiApCisjZm9yZWFjaCAoJHBhcmFtIGluICRtdGhkLml0ZXJhdG9yKCkpCisjaWYgKCRtdGhkLmhhc0F1dGgoKSkKKwkJCQkJCSR7c2VwfSRwYXJhbS5uYW1lKCkKKyNlbHNlCisJCQkJCQkke3NlcH0oJGhlbHBlci5nZXRUeXBlTmFtZSggJHBhcmFtLnR5cGUoKSApKSBfbXNnLmdldCggVmFsdWVGYWN0b3J5JGkuJHBhcmFtLnZuYW1lKCAkaGVscGVyICkgKQorI2VuZAorI3NldCggJHNlcCA9ICIsICIgKQorI2VuZAorI2lmICgkbXRoZC5oYXNSZXR1cm4oKSkKKwkJCQkJKQorI2VuZAorCQkJCQkpOworCQkJCX0KKwkJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCXNlc3Npb25Ob3RpZnkoIF9vYmosIGUgKTsKKyNpZiAoJG10aGQuaXNPbmV3YXkoKSkKKwkJCQkJTWVzc2FnZSBfcm1zZyA9IF9tc2cucmVwbHkoIF9tc2cudmYoKS5nZXRfbXRfX2V4Y2VwdGlvbigpICk7CisjZW5kCisJCQkJCV9ybXNnLnB1dCggVmFsdWVGYWN0b3J5JGkuX21mX3Jlc3VsdCwgZSApOworI2lmICgkbXRoZC5pc09uZXdheSgpKQorCQkJCQlfc3ZjLnRyYW5zcG9ydE1lc3NhZ2UoIF9zZW5kZXIsIF9ybXNnICk7CisjZW5kCisJCQkJfQorI2lmICghJG10aGQuaXNPbmV3YXkoKSkKKwkJCQlfc3ZjLnRyYW5zcG9ydE1lc3NhZ2UoIF9zZW5kZXIsIF9ybXNnICk7CisjZW5kCisJCQl9CisJCX0gKTsKKyNlbmQKKyNlbmQKKyNlbmQKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL3ZmLnZtIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci92Zi52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QyMTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9jb21waWxlci92Zi52bQpAQCAtMCwwICsxLDMwMiBAQAorIyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyMjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIyBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgZWRpdGVkIQorCitwYWNrYWdlICRpbnRmLnBhcmVudCgpLm5hbWUoKTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5Bc3luY01vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkRpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkltcG9ydEV4cG9ydEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkNsYXNzMlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWZhdWx0VmFsdWVGYWN0b3J5OworCisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRXh0ZXJuKCkpCisjaWYgKCRuLmhhc0ltcG9ydCggJGhlbHBlciApKQoraW1wb3J0ICRuLmdldEltcG9ydCggJGhlbHBlciApOworI2VuZAorI2lmICgkbi5oYXNTZXJpYWxpemVySW1wb3J0KCAkaGVscGVyICkpCitpbXBvcnQgJG4uZ2V0U2VyaWFsaXplckltcG9ydCggJGhlbHBlciApOworI2VuZAorI2VuZAorI2VuZAorCisjc2V0KCAkdmYgPSAiVmFsdWVGYWN0b3J5JGludGYubmFtZSgpIiApCisvKioKKyAqIFZhbHVlRmFjdG9yeSBmb3IgJGludGYubmFtZSgpLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBmaW5hbCBjbGFzcyAke3ZmfSBleHRlbmRzIERlZmF1bHRWYWx1ZUZhY3RvcnkKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzICR7dmZ9LgorCSAqIEBwYXJhbSB1cmkgdGhlIHVyaSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgc2Vzc2lvbi4KKwkgKi8KKwlwdWJsaWMgJHt2Zn0oIFN0cmluZyB1cmkgKQorCXsKKwkJc3VwZXIoIHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUgKTsKKyNmb3JlYWNoICggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzTWl4aW4oKSkKKyNzZXQoICRtID0gJG4uZ2V0TW9kdWxlKCkgKQorI3NldCggJHMgPSAkbS5pdGVyYXRvcigpLm5leHQoKSApCisJCWFkZE1peGluKCBuZXcgJHttLm5hbWUoKX0uVmFsdWVGYWN0b3J5JHtzLm5hbWUoKX0oIHVyaSApICk7CisjZW5kCisjZW5kCisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSA9IG5ldyBDbGFzczJUeXBlTWFwKCk7CisKKwlzdGF0aWMKKwl7CisJCURlZmF1bHRWYWx1ZUZhY3RvcnkuaW5pdCggdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkJaW5pdFR5cGVzKCk7CisJCWluaXRSZXN1bHRzKCk7CisJCWluaXRGaWVsZHMoKTsKKwkJaW5pdFBhcmFtcygpOworCX0KKyNmb3JlYWNoICggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRW51bXgoKSB8fCAkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXh0ZXJuKCkgfHwgJG4uaXNFeGNlcHQoKSB8fCAkbi5pc01lc3NhZ2UoKSkKKworCS8qKiBUeXBlIGZvciAkbi5mcW5hbWUoKSAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSAke24udm5hbWUoICRoZWxwZXIgKX07CisjZW5kCisjZW5kCisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRUeXBlcygpCisJeworI2ZvcmVhY2ggKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNFbnVteCgpIHx8ICRuLmlzU3RydWN0KCkgfHwgJG4uaXNFeHRlcm4oKSB8fCAkbi5pc0V4Y2VwdCgpIHx8ICRuLmlzTWVzc2FnZSgpKQorCQkke24udm5hbWUoICRoZWxwZXIgKX0gPSB0eXBlcy5nZXQoICIkbi5mcW5hbWUoKSIgKTsKKyNlbmQKKyNlbmQKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRSZXN1bHRzKCkKKwl7CisjZm9yZWFjaCAoICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc01lc3NhZ2UoKSkKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnNldERpcmVjdGlvbiggRGlyZWN0aW9uLiRuLm1zZ0RpcigpICk7CisjaWYgKCEkbi5pc0hpZGRlbigpKQorI2lmICgkbi5pc1F1ZXVlZEFzeW5jUmVjZWl2ZXIoKSkKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnNldEFzeW5jTW9kZSggQXN5bmNNb2RlLlFVRVVFRCApOworI2Vsc2VpZiAoJG4uaXNGcmVlQXN5bmNSZWNlaXZlcigpKQorCQkke24udm5hbWUoICRoZWxwZXIgKX0uc2V0QXN5bmNNb2RlKCBBc3luY01vZGUuRlJFRSApOworI2Vsc2UKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnNldEFzeW5jTW9kZSggQXN5bmNNb2RlLk5PTkUgKTsKKyNlbmQKKyNpZiAoISRuLmlzT25ld2F5KCkpCisjc2V0KCAkciA9ICRuLmdldFJlc3VsdE1lc3NhZ2UoKSApCisJCSR7bi52bmFtZSggJGhlbHBlciApfS5zZXRSZXN1bHQoICRyLnZuYW1lKCAkaGVscGVyICkgKTsKKwkJJHtyLnZuYW1lKCAkaGVscGVyICl9LnNldFRpbWVvdXQoICRuLmdldFRpbWVvdXQoKSApOworI2VuZAorI2VuZAorI2VuZAorI2VuZAorCX0KKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGltcG9ydCAvIGV4cG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2ZvcmVhY2ggKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNTdHJ1Y3QoKSB8fCAkbi5pc0V4Y2VwdCgpKQorI3NldCggJHRuYW1lID0gJG4uZWZxbmFtZSggJGhlbHBlciApICkKKworCXN0YXRpYworCXsKKwkJY2xhc3MydHlwZS5wdXQoICR7dG5hbWV9LmNsYXNzLCAke24udm5hbWUoICRoZWxwZXIgKX0gKTsKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnNldENvbXBvbmVudFR5cGUoICR7dG5hbWV9LmNsYXNzICk7CisjaWYgKCRuLmhhc0V4dGVuZHMoKSkKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnNldFN1cGVyVHlwZSggJG4uZ2V0RXh0ZW5kcygpLnZuYW1lKCAkaGVscGVyICkgKTsKKyNlbmQKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnNldEltcG9ydEV4cG9ydEhlbHBlciggbmV3IEltcG9ydEV4cG9ydEhlbHBlcigpCisJCXsKKwkJCXB1YmxpYyBmaW5hbCBTdHJ1Y3RWYWx1ZSBleHBvcnRWYWx1ZSggVmFsdWVGYWN0b3J5IHZmLCBPYmplY3QgdmFsdWUgKQorCQkJeworCQkJCVN0cnVjdFZhbHVlIHN0cnVjdCA9IG5ldyBTdHJ1Y3RWYWx1ZSggJHtuLnZuYW1lKCAkaGVscGVyICl9LCB2ZiApOworCQkJCSR0bmFtZSB2ID0gKCR0bmFtZSkgdmFsdWU7CisjZm9yZWFjaCggJHAgaW4gJG4uZ2V0QWxsUGFyYW1ldGVycygpICkKKwkJCQlzdHJ1Y3QucHV0KCAkcC52bmFtZSggJGhlbHBlciApLCB2LiRwLm5hbWUoKSApOworI2VuZAorCQkJCXJldHVybiBzdHJ1Y3Q7CisJCQl9CisKKwkJCXB1YmxpYyBmaW5hbCBPYmplY3QgaW1wb3J0VmFsdWUoIFN0cnVjdFZhbHVlIHN0cnVjdCApCisJCQl7CisJCQkJJHRuYW1lIHYgPSBuZXcgJHt0bmFtZX0oKTsKKyNmb3JlYWNoICgkcCBpbiAkbi5nZXRBbGxQYXJhbWV0ZXJzKCkpCisJCQkJdi4kcC5uYW1lKCkgPSAoJGhlbHBlci5nZXRUeXBlTmFtZSggJHAudHlwZSgpICkpIHN0cnVjdC5nZXQoICRwLnZuYW1lKCAkaGVscGVyICkgKTsKKyNlbmQKKwkJCQlyZXR1cm4gdjsKKwkJCX0KKwkJfSApOworCX0KKyNlbHNlaWYgKCRuLmlzRXh0ZXJuKCkpCisjc2V0KCAkdG5hbWUgPSAkbi5lZnFuYW1lKCAkaGVscGVyICkgKQorI2Vsc2VpZiAoJG4uaXNFbnVteCgpKQorI3NldCggJHRuYW1lID0gJG4uZWZxbmFtZSggJGhlbHBlciApICkKKworCXN0YXRpYworCXsKKwkJY2xhc3MydHlwZS5wdXQoICR7dG5hbWV9LmNsYXNzLCAke24udm5hbWUoICRoZWxwZXIgKX0gKTsKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnNldENvbXBvbmVudFR5cGUoICR7dG5hbWV9LmNsYXNzICk7CisJCSR7bi52bmFtZSggJGhlbHBlciApfS5zZXRJbXBvcnRFeHBvcnRIZWxwZXIoIG5ldyBJbXBvcnRFeHBvcnRIZWxwZXIoKQorCQl7CisJCQlwdWJsaWMgZmluYWwgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKwkJCXsKKwkJCQlTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgPSBuZXcgU3RydWN0VmFsdWUoICR7bi52bmFtZSggJGhlbHBlciApfSwgdmYgKTsKKwkJCQkke3RuYW1lfSB2ID0gKCR7dG5hbWV9KSB2YWx1ZTsKKwkJCQlzd2l0Y2ggKHYpCisJCQkJeworI2ZvcmVhY2ggKCRwIGluICRuLml0ZXJhdG9yKCkpCisJCQkJCWNhc2UgJHAubmFtZSgpOiBzdHJ1Y3QucHV0KCAkcC52bmFtZSggJGhlbHBlciApLCB0cnVlICk7IGJyZWFrOworI2VuZAorCQkJCX0KKwkJCQlyZXR1cm4gc3RydWN0OworCQkJfQorCisJCQlwdWJsaWMgZmluYWwgT2JqZWN0IGltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCQkJeworCQkJCS8vIGlmIGVtcHR5LCBpdCBsaWtlbHkgbWVhbnMgdGhhdCBhIG51bGwgdmFsdWUgd2FzIHNlbnQKKwkJCQkvLyBvciBhbiB1bmtub3duIGtleSAoZnJvbSBhIGRpZmZlcmVudCByZXYgb2YgdGhlIHNlcnZpY2UpLgorCQkJCWlmIChzdHJ1Y3QuaXNFbXB0eSgpKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkKKwkJCQkvLyB0aGVyZSBzaG91bGQgb25seSBiZSBhIHNpbmdsZSBrZXksIHNvIHRha2UgdGhlIGZpcnN0IG9uZQorCQkJCUZpZWxkIGtleSA9IHN0cnVjdC5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKyNmb3JlYWNoICgkcCBpbiAkbi5pdGVyYXRvcigpKQorCQkJCWlmIChrZXkgPT0gJHAudm5hbWUoICRoZWxwZXIgKSkgcmV0dXJuICR7dG5hbWV9LiRwLm5hbWUoKTsKKyNlbmQKKworCQkJCS8vIGEga25vd24ga2V5IHdhcyBzZW50LCBidXQgaXQgZGlkIG5vdCBtYXRjaCBhbnkgZGVmaW5lZAorCQkJCS8vIGtleSBmb3IgdGhpcyB0eXBlLgorCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9ICk7CisJfQorI2VuZAorI2VuZAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjc2V0KCAkeCA9ICRwYXJhbXMuY2xlYXIoKSApCisjIyBzdGFuZGFyZCBwYXJhbXMgZnJvbSBEZWZhdWx0VmFsdWVGYWN0b3J5Cisjc2V0KCAkeCA9ICRwYXJhbXMuYWRkKCAibXNnIiApICkKKyNzZXQoICR4ID0gJHBhcmFtcy5hZGQoICJyZXN1bHQiICkgKQorI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0VudW14KCkgfHwgJG4uaXNTdHJ1Y3QoKSB8fCAkbi5pc0V4Y2VwdCgpIHx8ICRuLmlzTWVzc2FnZSgpKQorI2ZvcmVhY2goICRwYXJhbSBpbiAkbi5pdGVyYXRvcigpICkKKyNpZiAoISRwYXJhbXMuY29udGFpbnMoJHBhcmFtLm5hbWUoKS5uYW1lKCkpKQorI3NldCggJHggPSAkcGFyYW1zLmFkZCgkcGFyYW0ubmFtZSgpLm5hbWUoKSkgKQorCisJLyoqIEZpZWxkIGZvciAkcGFyYW0ubmFtZSgpLm5hbWUoKSAqLworCXB1YmxpYyBzdGF0aWMgRmllbGQgJHBhcmFtLnZuYW1lKCAkaGVscGVyICk7CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRGaWVsZHMoKQorCXsKKyNzZXQoICR4ID0gJHBhcmFtcy5jbGVhcigpICkKKyMjIHN0YW5kYXJkIHBhcmFtcyBmcm9tIERlZmF1bHRWYWx1ZUZhY3RvcnkKKyNzZXQoICR4ID0gJHBhcmFtcy5hZGQoICJtc2ciICkgKQorI3NldCggJHggPSAkcGFyYW1zLmFkZCggInJlc3VsdCIgKSApCisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRW51bXgoKSB8fCAkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXhjZXB0KCkgfHwgJG4uaXNNZXNzYWdlKCkpCisjZm9yZWFjaCggJHBhcmFtIGluICRuLml0ZXJhdG9yKCkgKQorI2lmICghJHBhcmFtcy5jb250YWlucygkcGFyYW0ubmFtZSgpLm5hbWUoKSkpCisjc2V0KCAkeCA9ICRwYXJhbXMuYWRkKCRwYXJhbS5uYW1lKCkubmFtZSgpKSApCisJCSRwYXJhbS52bmFtZSggJGhlbHBlciApID0gbmV3IEZpZWxkKCAiJHBhcmFtLm5hbWUoKS5uYW1lKCkiICk7CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisKKyNmb3JlYWNoICggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzTWVzc2FnZSgpKQorI2lmICghJG4uaXNIaWRkZW4oKSkKKyNpZiAoISRuLmlzT25ld2F5KCkpCisjc2V0KCAkciA9ICRuLmdldFJlc3VsdE1lc3NhZ2UoKSApCisJCSR7ci52bmFtZSggJGhlbHBlciApfS5zZXRSZXNwb25zZUZpZWxkKCBfbWZfcmVzdWx0ICk7CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisJfQorCQorCXN0YXRpYworCXsKKwkJLy8gaW5pdGlhbGl6ZSB0aGUgZXh0ZXJuIHNlcmlhbGl6ZXJzOgorI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0V4dGVybigpKQorCQkke24uc25hbWUoICRoZWxwZXIgKX0uaW5pdCggJHtuLnZuYW1lKCAkaGVscGVyICl9LCBjbGFzczJ0eXBlICk7CisjZW5kCisjZW5kCisJfQorCisjc2V0KCAkY3RyID0gMCApCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0UGFyYW1zKCkKKwl7CisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRW51bXgoKSB8fCAkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXhjZXB0KCkgfHwgJG4uaXNNZXNzYWdlKCkpCisjaWYgKCRjdHIgPiAwICYmICRjdHIgJSAxMDAgPT0gMCkKKworCQlpbml0UGFyYW1zJHtjdHJ9KCk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFBhcmFtcyR7Y3RyfSgpCisJeworI2VuZAorI3NldCggJGN0ciA9ICRjdHIgKyAxICkKKworCQkvLyBwYXJhbXMgZm9yICRuLm5hbWUoKQorI2lmICgkbi5pc1N0cnVjdCgpIHx8ICRuLmlzRXhjZXB0KCkpCisjZm9yZWFjaCggJHBhcmFtIGluICRuLmdldEFsbFBhcmFtZXRlcnMoKSApCisJCSR7bi52bmFtZSggJGhlbHBlciApfS5wdXRWYWxpZGF0b3IoICRwYXJhbS52bmFtZSggJGhlbHBlciApLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LiRoZWxwZXIuZ2V0VmFsaWRhdG9yKCAkcGFyYW0gKSApOworI2VuZAorI2Vsc2UKKyNmb3JlYWNoKCAkcGFyYW0gaW4gJG4uaXRlcmF0b3IoKSApCisJCSR7bi52bmFtZSggJGhlbHBlciApfS5wdXRWYWxpZGF0b3IoICRwYXJhbS52bmFtZSggJGhlbHBlciApLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LiRoZWxwZXIuZ2V0VmFsaWRhdG9yKCAkcGFyYW0gKSApOworI2VuZAorI2VuZAorI2lmICgkbi5pc01lc3NhZ2UoKSkKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKyNpZiAoJG4uaXNIaWRkZW4oKSkKKyNzZXQoICRwYXJhbSA9ICRuLmdldFJlc3VsdFBhcmFtKCkgKQorI3NldCggJHJlcU1zZyA9ICRuLmdldFJlcXVlc3RNZXNzYWdlKCkgKQorI2ZvcmVhY2goICR0IGluICRyZXFNc2cudGhyb3duKCkuaXRlcmF0b3IoKSApCisJCSR7bi52bmFtZSggJGhlbHBlciApfS5wdXRWYWxpZGF0b3IoICRwYXJhbS52bmFtZSggJGhlbHBlciApLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LiRoZWxwZXIuZ2V0VmFsaWRhdG9yKCAkdCApICk7IC8vIHRocm93biAkdC5uYW1lKCkKKyNlbmQKKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnB1dFZhbGlkYXRvciggJHBhcmFtLnZuYW1lKCAkaGVscGVyICksIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uZ2V0KCkgKTsgLy8gdGhyb3duIFJ1bnRpbWVFeGNlcHRpb24KKwkJJHtuLnZuYW1lKCAkaGVscGVyICl9LnB1dFZhbGlkYXRvciggX21mX19pblJlcGx5VG8sIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKwl9CisJCisJc3RhdGljCisJeworCQkvLyBkb25lIHVwZGF0aW5nIHR5cGVzLCBhbmQgY2xhc3MydHlwZTogbG9jayB0aGVtLgorCQl0eXBlcy5sb2NrKCk7CisJCWZvciAoVHlwZSB0OiB0eXBlcy52YWx1ZXMoKSkKKwkJCXQubG9jaygpOworCQljbGFzczJ0eXBlLmxvY2soKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9idWlsZC54bWwgYi9iaW5kaW5nLWphdmEvcnVudGltZS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MGUyYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL2J1aWxkLnhtbApAQCAtMCwwICsxLDI2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtamF2YS1ydW50aW1lIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIj4KKyAgICA8ZGVzY3JpcHRpb24+RXRjaC10by1KYXZhIHJ1bnRpbWUgYmluZGluZyBpbXBsZW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYmFzZWRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4iIC8+CisgICAgPGltcG9ydCBmaWxlPSIke0V0Y2guYmFzZWRpcn0vYnVpbGQtc3VwcG9ydC9ldGNoLmluY2x1ZGVzLnhtbCIgLz4KKworICAgIDwhLS0gU3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIHN1Yi1wcm9qZWN0IC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qIiAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7RXRjaC5iYXNlZGlyfS9iaW5kaW5nLWphdmEvcnVudGltZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke3Byb2p9L3RhcmdldCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke3Byb2p9L3NyYyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkU3JjIiAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vZ2VuZXJhdGVkLXNvdXJjZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNEaXJlY3RvcnkiICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlc291cmNlc0RpcmVjdG9yeSIgICBsb2NhdGlvbj0iJHt0YXJnZXR9L3Jlc291cmNlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdFJlc3VsdHNEaXJlY3RvcnkiIGxvY2F0aW9uPSIke3RhcmdldH0vdGVzdC1yZXN1bHRzIiAvPgorCisgICAgPCEtLSBNQUNSTzogaW5pdC10YXJnZXQgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImluaXQtdGFyZ2V0IiA+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iICAgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDxkZWxldGUgZGlyPSIke3Jlc291cmNlc0RpcmVjdG9yeX0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtyZXNvdXJjZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDwhLS0gTUFDUk86IGNvbXBpbGUtc291cmNlcyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iY29tcGlsZS1zb3VyY2VzIiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcG9ydCIgZGVmYXVsdD0iJHtFdGNoLnN1cHBvcnR9IiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKworICAgICAgICAgICAgPGphdmFjICBkZWJ1Zz0iJHtFdGNoLmphdmFjLmRlYnVnfSIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjUiCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPSIke0V0Y2guamF2YWMub3B0aW1pemV9IgorICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iID4KKyAgICAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfS9tYWluL2phdmEiIC8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJFdGNoLmRlcGVuZGVuY2llcy5qYXIucGF0aHMiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJAe3N1cHBvcnR9L2xpYi8ke2V0Y2gtdXRpbC5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPC9qYXZhYz4KKworICAgICAgICAgICAgPGphdmFjICBkZWJ1Zz0iJHtFdGNoLmphdmFjLmRlYnVnfSIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjUiCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPSIke0V0Y2guamF2YWMub3B0aW1pemV9IgorICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiID4KKyAgICAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfS90ZXN0L2phdmEiIC8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJFdGNoLmRlcGVuZGVuY2llcy5qYXIucGF0aHMiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iQHtzdXBwb3J0fS9saWIvJHtldGNoLXV0aWwuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwvamF2YWM+CisKKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8IS0tIE1BQ1JPOiBidW5kbGUtamFycyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iYnVuZGxlLWphcnMiID4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXN0IiBkZWZhdWx0PSIke0V0Y2guZGlzdH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtkaXN0fS9saWIiIC8+CisKKyAgICAgICAgICAgIDwhLS0gQ1JFQVRFIGphcnMgLS0+CisKKyAgICAgICAgICAgIDwhLS0gUGFja2FnZSB1cCBldGNoLWphdmEtcnVudGltZSBqYXIgLS0+CisgICAgICAgICAgICA8amFyIGphcmZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1qYXZhLXJ1bnRpbWUuamFyfSIgPgorICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDb3B5cmlnaHQiICAgIHZhbHVlPSIke0V0Y2guY29weXJpZ2h0Tm90aWNlfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJWZXJzaW9uIiAgICAgIHZhbHVlPSIke0V0Y2gudmVyc2lvbn0iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTG9uZ1ZlcnNpb24iICB2YWx1ZT0iJHtFdGNoLmxvbmd2ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsZC1UYWciICAgIHZhbHVlPSIke0V0Y2guYnVpbGRUYWd9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNWTi1SZXZpc2lvbiIgdmFsdWU9IiR7RXRjaC5ydW50aW1lLnJldmlzaW9uTnVtYmVyfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiICAgdmFsdWU9IiR7ZXRjaC11dGlsLmphcn0iIC8+IC0tPgorICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPG1ldGFpbmYgZGlyPSIke0V0Y2guYmFzZWRpcn0iID4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+CisgICAgICAgICAgICAgICAgPC9tZXRhaW5mPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzLyoqIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvamFyPgorCisgICAgICAgICAgICA8IS0tIHBsYWNlaG9sZGVyIC0tPgorICAgICAgICAgICAgPGphciBqYXJmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtdXRpbC5qYXJ9IiB1cGRhdGU9InRydWUiIGZpbGVzZXRtYW5pZmVzdD0ibWVyZ2UiPgorICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJWZXJzaW9uIiB2YWx1ZT0iJHtFdGNoLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4gICAKKyAgICAgICAgICAgIDwvamFyPgorCisgICAgICAgICAgICA8IS0tIENSRUFURSBzb3VyY2UgYXJjaGl2ZXMgLS0+CisKKyAgICAgICAgICAgIDwhLS0gcGFja2FnZSB1cCBldGNoLWphdmEtcnVudGltZSBzcmMgLS0+CisgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLXNyYy56aXB9IiA+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9qYXZhIiA+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy8qKi8qLmphdmEiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC96aXA+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fS9lbXB0eS1kaXIiIC8+CisgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtdXRpbC1zcmMuemlwfSIgdXBkYXRlPSJ0cnVlIiB3aGVuZW1wdHk9ImNyZWF0ZSIgYmFzZWRpcj0iJHt0YXJnZXR9L2VtcHR5LWRpciIvPgorCisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIAorICAgIDwhLS0gTUFDUk86IHVwZGF0ZS1qYXJzIC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJ1cGRhdGUtamFycyIgPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc3QiIGRlZmF1bHQ9IiR7RXRjaC5kaXN0fSIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwb3J0IiBkZWZhdWx0PSIke0V0Y2guc3VwcG9ydH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPCEtLSByZXBhY2thZ2UgLmphciAtLT4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IkB7ZGlzdH0vbGliIiAvPgorICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fS90bXAtcnVudGltZSIgIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9L3RtcC1ydW50aW1lIiAvPgorCisgICAgICAgICAgICA8dW5qYXIgc3JjPSJAe3N1cHBvcnR9L2xpYi8ke2V0Y2gtdXRpbC5qYXJ9IiAgICAgZGVzdD0iJHt0YXJnZXR9L3RtcC1ydW50aW1lIiAvPgorICAgICAgICAgICAgPHVuamFyIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLWphdmEtcnVudGltZS5qYXJ9IiBkZXN0PSIke3RhcmdldH0vdG1wLXJ1bnRpbWUiIC8+CisKKyAgICAgICAgICAgIDxqYXIgamFyZmlsZT0iQHtkaXN0fS9saWIvJHtldGNoLWphdmEtcnVudGltZS5qYXJ9IiB1cGRhdGU9InRydWUiIGZpbGVzZXRtYW5pZmVzdD0ibWVyZ2UiID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGFyZ2V0fS90bXAtcnVudGltZSIgIC8+CisgICAgICAgICAgICA8L2phcj4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPCEtLSByZXBhY2thZ2UgLnppcCBzcmMgLS0+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSJAe2Rpc3R9L2xpYiIgLz4KKyAgICAgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0vdG1wLXJ1bnRpbWUtc3JjIiAgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0vdG1wLXJ1bnRpbWUtc3JjIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dW56aXAgc3JjPSJAe3N1cHBvcnR9L2xpYi8ke2V0Y2gtdXRpbC1zcmMuemlwfSIgZGVzdD0iJHt0YXJnZXR9L3RtcC1ydW50aW1lLXNyYyIgLz4KKyAgICAgICAgICAgIDx1bnppcCBzcmM9IkB7c3VwcG9ydH0vbGliLyR7ZXRjaC1qYXZhLXJ1bnRpbWUtc3JjLnppcH0iIGRlc3Q9IiR7dGFyZ2V0fS90bXAtcnVudGltZS1zcmMiIC8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1qYXZhLXJ1bnRpbWUtc3JjLnppcH0iID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGFyZ2V0fS90bXAtcnVudGltZS1zcmMiIC8+CisgICAgICAgICAgICA8L3ppcD4KKyAgICAgICAgICAgIAorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDwhLS0gSU5JVCBUQVJHRVQgLS0+CisgICAgPCEtLSBNb2RpZnkgdGhpcyB0YXJnZXQgdG8gZGVmaW5lIHByb2plY3Qgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNhbiBvbmx5IGJlIHNldCBhdCBydW50aW1lIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8taW5pdCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisKKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbmVyYXRlZFNyY30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7cmVzb3VyY2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0UmVzdWx0c0RpcmVjdG9yeX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIENMRUFOIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLWNsZWFuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gQlVJTEQgVEFSR0VUIC0tPgorCisgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1zb3VyY2VzIiA+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtZm9yLWRpc3QiID4KKyAgICAgICAgPCEtLSBJbml0aWFsaXplIHRhcmdldCBkaXJlY3RvcmllcyAtLT4KKyAgICAgICAgPGluaXQtdGFyZ2V0IC8+CisKKyAgICAgICAgPCEtLSBDb21waWxlIFNvdXJjZSAtLT4KKyAgICAgICAgPGNvbXBpbGUtc291cmNlcyBzdXBwb3J0PSIke0V0Y2guc3VwcG9ydH0iIC8+CisKKyAgICAgICAgPCEtLSBCdW5kbGUgSmFycyAtLT4KKyAgICAgICAgPGJ1bmRsZS1qYXJzIGRpc3Q9IiR7RXRjaC5zdXBwb3J0fSIgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gVXBkYXRlIEphcnMgLS0+CisgICAgICAgIDx1cGRhdGUtamFycyBkaXN0PSIke0V0Y2guZGlzdH0iIHN1cHBvcnQ9IiR7RXRjaC5zdXBwb3J0fSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS1mb3ItY2xvdmVyIiBpZj0iQ2xvdmVyLmVuYWJsZWQiID4KKworICAgICAgICA8ZWNobyBtZXNzYWdlPSJSZWJ1aWxkaW5nIHdpdGggY2xvdmVyIiAvPgorCisgICAgICAgIDwhLS0gaW5pdGlhbGl6ZS1jbG92ZXIgLS0+CisgICAgICAgIDxpbml0aWFsaXplLWNsb3ZlciBzdWZmaXg9ImV0Y2hqYXZhYmluZGluZyIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9qYXZhIj4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8dGVzdHNvdXJjZXMgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L3Rlc3Rzb3VyY2VzPgorICAgICAgICA8L2luaXRpYWxpemUtY2xvdmVyPgorCisgICAgICAgIDwhLS0gSW5pdGlhbGl6ZSB0YXJnZXQgZGlyZWN0b3JpZXMgLS0+CisgICAgICAgIDxpbml0LXRhcmdldCAvPgorCisgICAgICAgIDwhLS0gQ29tcGlsZSBTb3VyY2UgLS0+CisgICAgICAgIDxjb21waWxlLXNvdXJjZXMgc3VwcG9ydD0iJHtFdGNoLnN1cHBvcnR9IiAvPgorCisgICAgICAgIDwhLS0gQnVuZGxlIEphcnMgLS0+CisgICAgICAgIDxidW5kbGUtamFycyBkaXN0PSIke0V0Y2guY2xvdmVyLXN1cHBvcnR9IiAvPgorICAgICAgICAKKyAgICAgICAgPCEtLSBVcGRhdGUgSmFycyAtLT4KKyAgICAgICAgPHVwZGF0ZS1qYXJzIGRpc3Q9IiR7RXRjaC5jbG92ZXItZGlzdH0iIHN1cHBvcnQ9IiR7RXRjaC5jbG92ZXItc3VwcG9ydH0iIC8+CisKKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tYnVpbGQiIGRlcGVuZHM9ImdlbmVyYXRlLXNvdXJjZXMsY29tcGlsZS1mb3ItZGlzdCxjb21waWxlLWZvci1jbG92ZXIiIC8+CisKKyAgICA8IS0tIFRFU1QgVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8tdGVzdCI+CisKKyAgICAgICAgPCEtLSBSdW4gVW5pdCBUZXN0cyAtLT4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IgorICAgICAgICAgICAgZXJyb3JQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCIgZmFpbHVyZVByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qdW5pdC5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPCEtLSBUT0RPOiByZW1vdmUgaWYgY2xvdmVyIG5vdCBhdmFpbGFibGUgLS0+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guU1VQUE9SVH0vbGliLyR7ZXRjaC11dGlsLmphcn0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5jbG92ZXIuamFyfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIvPgorICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ0cnVlIiB0b2Rpcj0iJHt0ZXN0UmVzdWx0c0RpcmVjdG9yeX0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L3Rlc3QvamF2YSI+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBQT1NUQlVJTEQgVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8tcG9zdGJ1aWxkIj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tcHVibGlzaCIgaWY9ImJ1aWxkLnRlc3RzLmZhaWwiPgorICAgICAgICA8IS0tIFNldCBmbGFnIGZpbGUgaWYgYW55IHRlc3RzIGZhaWxlZCAtLT4KKyAgICAgICAgPHRvdWNoIGZpbGU9IiR7RXRjaC5ydW50aW1lLnRlc3RzLmZhaWx9Ii8+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL0FzeW5jTW9kZS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvQXN5bmNNb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlMWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL0FzeW5jTW9kZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKKy8qKgorICogVGhlIGFzeW5jaHJvbm91cyByZWNlaXZlciBtb2RlIG9mIHRoaXMgaGVscGVyLgorICovCitwdWJsaWMgZW51bSBBc3luY01vZGUKK3sKKwkvKiogc3luY2hyb25vdXMgbW9kZSAqLworCU5PTkUsCisJLyoqIHRoZSBvcGVyYXRpb24gaXMgcXVldWVkIHRvIGEgdGhyZWFkIHBvb2wgZm9yIGV4ZWN1dGlvbiAqLworCVFVRVVFRCwKKwkvKiogdGhlIG9wZXJhdGlvbiBpcyBleGVjdXRlZCBieSBhIG5ld2x5IGFsbG9jYXRlZCB0aHJlYWQgKi8KKwlGUkVFCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvQ29tYm9WYWxpZGF0b3IuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL0NvbWJvVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwZTZhZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL0NvbWJvVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKKy8qKgorICogVmFsaWRhdGVzIHZhbHVlcyB1c2luZyBvbmUgb2YgdHdvIHZhbGlkYXRvcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb21ib1ZhbGlkYXRvciBpbXBsZW1lbnRzIFZhbGlkYXRvcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIENvbWJvVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIGEKKwkgKiBAcGFyYW0gYgorCSAqLworCXB1YmxpYyBDb21ib1ZhbGlkYXRvciggVmFsaWRhdG9yIGEsIFZhbGlkYXRvciBiICkKKwl7CisJCXRoaXMuYSA9IGE7CisJCXRoaXMuYiA9IGI7CisJfQorCQorCXByaXZhdGUgZmluYWwgVmFsaWRhdG9yIGE7CisJCisJcHJpdmF0ZSBmaW5hbCBWYWxpZGF0b3IgYjsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiKCVzIE9SICVzKSIsIGEsIGIgKTsKKwl9CisKKwlwdWJsaWMgVmFsaWRhdG9yIGVsZW1lbnRWYWxpZGF0b3IoKQorCXsKKwkJVmFsaWRhdG9yIG5hOworCQl0cnkKKwkJeworCQkJbmEgPSBhLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJfQorCQljYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKwkJeworCQkJbmEgPSBudWxsOworCQl9CisJCQorCQlWYWxpZGF0b3IgbmI7CisJCXRyeQorCQl7CisJCQluYiA9IGIuZWxlbWVudFZhbGlkYXRvcigpOworCQl9CisJCWNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQorCQl7CisJCQluYiA9IG51bGw7CisJCX0KKwkJCisJCWlmIChuYSA9PSBudWxsICYmIG5iID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibmEgPT0gbnVsbCAmJiBuYiA9PSBudWxsIiApOworCQkKKwkJaWYgKG5hID09IG51bGwpCisJCQlyZXR1cm4gbmI7CisJCQorCQlpZiAobmIgPT0gbnVsbCkKKwkJCXJldHVybiBuYTsKKwkJCisJCXJldHVybiBuZXcgQ29tYm9WYWxpZGF0b3IoIG5hLCBuYiApOworCX0KKworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJcmV0dXJuIGEudmFsaWRhdGUoIHZhbHVlICkgfHwgYi52YWxpZGF0ZSggdmFsdWUgKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IHZhbGlkYXRlVmFsdWUoIE9iamVjdCB2YWx1ZSApCisJeworCQl0cnkKKwkJeworCQkJcmV0dXJuIGEudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJfQorCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gYi52YWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgImEiIGNoaWxkIG9mIHRoaXMgdmFsaWRhdG9yLgorCSAqLworCXB1YmxpYyBWYWxpZGF0b3IgYSgpCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSAiYiIgY2hpbGQgb2YgdGhpcyB2YWxpZGF0b3IuCisJICovCisJcHVibGljIFZhbGlkYXRvciBiKCkKKwl7CisJCXJldHVybiBiOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL0RpcmVjdGlvbi5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvRGlyZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2YjNiMAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL0RpcmVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKKy8qKgorICogVGhlIGRpcmVjdGlvbiBvZiBhIG1lc3NhZ2UuCisgKi8KK3B1YmxpYyBlbnVtIERpcmVjdGlvbgoreworCS8qKiBNZXNzYWdlIGlzIGJvdGggdG93YXJkIGNsaWVudCBhbmQgdG93YXJkIHNlcnZlci4gKi8KKwlCT1RILAorCQorCS8qKiBNZXNzYWdlIGlzIHRvd2FyZCBzZXJ2ZXIuICovCisJU0VSVkVSLAorCQorCS8qKiBNZXNzYWdlIGlzIHRvd2FyZCBjbGllbnQuICovCisJQ0xJRU5UCit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9GaWVsZC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI5ZDljCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvRmllbGQuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCisvKioKKyAqIEZpZWxkIGlzIGFuIElkTmFtZSB3aGljaCBkZW5vdGVzIGEgZmllbGQgb2YgYSBzdHJ1Y3QKKyAqIG9yIG1lc3NhZ2UgKGkuZS4sIGEga2V5IGZvciBhIHZhbHVlKS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpZWxkIGV4dGVuZHMgSWROYW1lCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgRmllbGQuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgZmllbGQuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorCSAqLworCXB1YmxpYyBGaWVsZCggaW50IGlkLCBTdHJpbmcgbmFtZSApCisJeworCQlzdXBlciggaWQsIG5hbWUgKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBGaWVsZCwgY29tcHV0aW5nIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZQorCSAqIGZvciB0aGUgaWQuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorCSAqLworCXB1YmxpYyBGaWVsZCggU3RyaW5nIG5hbWUgKQorCXsKKwkJc3VwZXIoIG5hbWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9GaWVsZE1hcC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvRmllbGRNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ2NjEzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvRmllbGRNYXAuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCisvKioKKyAqIEZpZWxkTWFwIGlzIGEgSWROYW1lTWFwIGZvciBGaWVsZC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpZWxkTWFwIGV4dGVuZHMgSWROYW1lTWFwPEZpZWxkPgoreworCUBPdmVycmlkZQorCXB1YmxpYyBGaWVsZCBtYWtlTmV3KCBTdHJpbmcgbmFtZSApCisJeworCQlyZXR1cm4gbmV3IEZpZWxkKCBuYW1lICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvSWROYW1lLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9JZE5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNhODU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvSWROYW1lLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5IYXNoOworCisvKioKKyAqIEFuIElkTmFtZSBpcyBhIGJhc2UgY2xhc3MgZm9yIEZpZWxkIG9yIFR5cGUuIEl0IGlzIHVzZWQKKyAqIHRvIGJpbmQgdG9nZXRoZXIgYSB0eXBlIG9yIGZpZWxkIG5hbWUgd2l0aCB0aGUgYXNzb2NpYXRlZCBpZC4gVGhlIGlkCisgKiBpcyB1c2VkIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMsIHN1Y2ggYXMgdGhlIGtleSBpbiBhIE1hcCwgY29tcGFyaXNvbnMsCisgKiBhbmQgYmluYXJ5IGVuY29kaW5nIG9uIHRoZSB3aXJlLCB3aGlsZSB0aGUgbmFtZSBpcyB1c2VkIGZvciBkaXNwbGF5LgorICogCisgKiBAc2VlIEZpZWxkCisgKiBAc2VlIFR5cGUKKyAqLworcHVibGljIGNsYXNzIElkTmFtZSBleHRlbmRzIEhhc2gKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJZE5hbWUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBmb3IgdGhlIG5hbWUgKG5vcm1hbGx5IGNvbXB1dGVkIHVzaW5nCisJICoge0BsaW5rICNoYXNoKFN0cmluZyl9KQorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBpdGVtLgorCSAqLworCXB1YmxpYyBJZE5hbWUoIEludGVnZXIgaWQsIFN0cmluZyBuYW1lICkKKwl7CisJCXRoaXMuaWQgPSBpZDsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSWROYW1lIGJ5IGNvbXB1dGluZyB0aGUgYXBwcm9wcmlhdGUgaWQgZ2l2ZW4KKwkgKiB0aGUgbmFtZS4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgaXRlbS4KKwkgKiBAc2VlICNoYXNoKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSWROYW1lKCBTdHJpbmcgbmFtZSApCisJeworCQl0aGlzKCBoYXNoKCBuYW1lICksIG5hbWUgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIGlkOworCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgaWQgb2YgdGhlIGl0ZW0uCisJICovCisJcHVibGljIGZpbmFsIEludGVnZXIgZ2V0SWQoKQorCXsKKwkJcmV0dXJuIGlkOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBpdGVtLgorCSAqLworCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIiVzKCVkKSIsIG5hbWUsIGlkICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKCBPYmplY3Qgb2JqICkKKwl7CisJCWlmIChvYmogPT0gdGhpcykKKwkJCXJldHVybiB0cnVlOworCQkKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlJZE5hbWUgb3RoZXIgPSAoSWROYW1lKSBvYmo7CisJCQorCQlyZXR1cm4gaWQuZXF1YWxzKCBvdGhlci5pZCApICYmIG5hbWUuZXF1YWxzKCBvdGhlci5uYW1lICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCisJeworCQlyZXR1cm4gaWQuaGFzaENvZGUoKSBeIG5hbWUuaGFzaENvZGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9JZE5hbWVNYXAuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL0lkTmFtZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGZjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9JZE5hbWVNYXAuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworCisvKioKKyAqIE1hcCBieSBpZCBhbmQgbmFtZSBvZiBJZE5hbWVzIChvciBzdWJjbGFzc2VzIHRoZXJlb2YpLgorICogQHBhcmFtIDxUPiB0aGUgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgSWROYW1lIHRoYXQgaXMgaW4gdGhlIG1hcC4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIElkTmFtZU1hcDxUIGV4dGVuZHMgSWROYW1lPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIElkTmFtZU1hcC4KKwkgKi8KKwlwdWJsaWMgSWROYW1lTWFwKCkKKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorCQorCS8qKgorCSAqIEdldHMgdGhlIElkTmFtZSBzdWJjbGFzcyB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgc3BlY2lmaWVkIGlkLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYW4gSWROYW1lLgorCSAqIEByZXR1cm4gdGhlIElkTmFtZSBzdWJjbGFzcyBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVCBnZXQoIEludGVnZXIgaWQgKQorCXsKKwkJcmV0dXJuIGJ5SWQuZ2V0KCBpZCApOworCX0KKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBJZE5hbWUgc3ViY2xhc3Mgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZAorCSAqIG5hbWUsIG9yIGNyZWF0ZXMgaXQgaWYgaXQgaXNuJ3QgZm91bmQgYW5kIGlmIHRoaXMgbWFwIGlzIG5vdAorCSAqIGxvY2tlZC4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhbiBJZE5hbWUuCisJICogQHJldHVybiB0aGUgSWROYW1lIHN1YmNsYXNzIGZvdW5kIG9yIGNyZWF0ZWQuCisJICogQHNlZSAjbG9jaygpCisJICovCisJcHVibGljIGZpbmFsIFQgZ2V0KCBTdHJpbmcgbmFtZSApCisJeworCQlUIHQgPSBieU5hbWUuZ2V0KCBuYW1lICk7CisJCWlmICh0ID09IG51bGwgJiYgIWxvY2tlZCkKKwkJCXQgPSBhZGQoIG1ha2VOZXcoIG5hbWUgKSApOworCQlyZXR1cm4gdDsKKwl9CisJCisJLyoqCisJICogQWRkcyB0aGUgSWROYW1lIHN1YmNsYXNzIHRvIHRoZSBtYXAuCisJICogCisJICogQHBhcmFtIHQgdGhlIElkTmFtZSBzdWJjbGFzcyB0byBhZGQuCisJICogCisJICogQHJldHVybiB0aGUgSWROYW1lIGZyb20gdGhlIG1hcC4KKwkgKiAKKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBsb2NrZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBjb2xsaXNpb24gd2l0aCBhbgorCSAqIGV4aXN0aW5nIGVudHJ5IGJ5IGlkIG9yIG5hbWUuCisJICovCisJcHVibGljIFQgYWRkKCBUIHQgKQorCXsKKwkJaWYgKGxvY2tlZCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJsb2NrZWQiICk7CisJCQorCQlpZiAoYnlJZC5jb250YWluc0tleSggdC5nZXRJZCgpICkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaWQgY29sbGlzaW9uOiAiK3QgKTsKKworCQlpZiAoYnlOYW1lLmNvbnRhaW5zS2V5KCB0LmdldE5hbWUoKSApKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm5hbWUgY29sbGlzaW9uOiAiK3QgKTsKKwkJCisJCWJ5SWQucHV0KCB0LmdldElkKCksIHQgKTsKKwkJYnlOYW1lLnB1dCggdC5nZXROYW1lKCksIHQgKTsKKwkJcmV0dXJuIHQ7CisJfQorCisJLyoqCisJICogQWRkcyBhbGwgdGhlIElkTmFtZXMgdG8gdGhpcyBJZE5hbWVNYXAuCisJICogQHBhcmFtIHRzCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbG9ja2VkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgY29sbGlzaW9uIHdpdGggYW4KKwkgKiBleGlzdGluZyBlbnRyeSBieSBpZCBvciBuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZEFsbCggSWROYW1lTWFwPFQ+IHRzICkKKwl7CisJCWlmIChsb2NrZWQpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAibG9ja2VkIiApOworCQkKKwkJZm9yIChUIHQ6IHRzLmJ5SWQudmFsdWVzKCkpCisJCQlhZGQoIHQgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGEgbmV3IHNldCB3aGljaCBpcyBhIHNuYXBzaG90IG9mIGFsbCB0aGUgdmFsdWVzLgorCSAqLworCXB1YmxpYyBmaW5hbCBTZXQ8VD4gdmFsdWVzKCkKKwl7CisJCXJldHVybiBuZXcgSGFzaFNldDxUPiggYnlJZC52YWx1ZXMoKSApOworCX0KKworCS8qKgorCSAqIExvY2tzIHRoZSBtYXAgcHJldmVudGluZyBmdXJ0aGVyIGNoYW5nZXMuCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgbG9jaygpCisJeworCQlsb2NrZWQgPSB0cnVlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIG1hcC4KKwkgKi8KKwlwdWJsaWMgaW50IHNpemUoKQorCXsKKwkJcmV0dXJuIGJ5SWQuc2l6ZSgpOworCX0KKwkKKwkvKioKKwkgKiBNYWtlcyBhIG5ldyBzdWJjbGFzcyBvZiBJZE5hbWUgdG8gcHV0IGluIHRoaXMgbWFwLgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgc3ViY2xhc3Mgb2YgSWROYW1lLgorCSAqIEByZXR1cm4gYSBuZXdseSBjb25zdHJ1Y3RlZCBzdWJjbGFzcyBvZiBJZE5hbWUgdG8gcHV0IGluCisJICogdGhpcyBtYXAuCisJICovCisJYWJzdHJhY3QgcHVibGljIFQgbWFrZU5ldyggU3RyaW5nIG5hbWUgKTsKKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBUPiBieUlkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgVD4oKTsKKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFQ+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgVD4oKTsKKwkKKwlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOworfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvSW1wb3J0RXhwb3J0SGVscGVyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9JbXBvcnRFeHBvcnRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk5Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvSW1wb3J0RXhwb3J0SGVscGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZzsKKworLyoqCisgKiBJbnRlcmZhY2UgdXNlZCB0byBpbXBsZW1lbnQgVmFsdWVGYWN0b3J5IGJhc2VkIGltcG9ydCAvIGV4cG9ydCBjb2RlCisgKiBmb3Igc2VydmljZSBkZWZpbmVkIHR5cGVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEltcG9ydEV4cG9ydEhlbHBlcgoreworCS8qKgorCSAqIEV4cG9ydHMgYSB2YWx1ZSBieSBjcmVhdGluZyBhbiBlcXVpdmFsZW50IFN0cnVjdFZhbHVlLgorCSAqIEBwYXJhbSB2ZiB0aGUgdmFsdWUgZmFjdG9yeSBmb3IgdGhpcyBjb25uZWN0aW9uLgorCSAqIEBwYXJhbSB2YWx1ZSBhIHNlcnZpY2UgZGVmaW5lZCB0eXBlIHRvIGV4cG9ydC4KKwkgKiBAcmV0dXJuIGEgU3RydWN0VmFsdWUgcmVwcmVzZW50aW5nIHRoZSBleHBvcnRlZCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICk7CisKKwkvKioKKwkgKiBJbXBvcnRzIGEgdmFsdWUgZnJvbSBhbiBlcXVpdmFsZW50IFN0cnVjdFZhbHVlLgorCSAqIEBwYXJhbSBzdHJ1Y3QgYSBTdHJ1Y3RWYWx1ZSByZXByZXNlbnRpbmcgdGhlIGV4cG9ydGVkIHZhbHVlLgorCSAqIEByZXR1cm4gYSBzZXJ2aWNlIGRlZmluZWQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKTsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL01lc3NhZ2UuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE4ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCisvKioKKyAqIEEgbWVzc2FnZSBpcyBtb2RlbGVkIGFzIGEgY29tbWFuZCBhbmQgc29tZSBhcmdtZW50cy4gVGhlIGNvbW1hbmQgaXMgYW4gYXJiaXRyYXJ5CisgKiBpbnRlZ2VyIHZhbHVlLCBhbmQgdGhlIGFyZ3VtZW50cyBhcmUga2V5IC8gdmFsdWUgcGFpcnMsIHdoZXJlIHRoZQorICoga2V5IGlzIGFuIGFyYml0cmFyeSBpbnRlZ2VyIHZhbHVlIGFuZCB0aGUgdmFsdWUgaXMgYW55IG9uZSBvZiB0aGUKKyAqIHN0YW5kYXJkIGphdmEgb2JqZWN0cywgYW4gQXJyYXlWYWx1ZSwgYSBTdHJ1Y3RWYWx1ZSwgb3IgYW55IHR5cGUKKyAqIHdoaWNoIG1heSBiZSBzZXJpYWxpemVkIGJ5IHRoZSBWYWx1ZUZhY3RvcnkuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlIGV4dGVuZHMgU3RydWN0VmFsdWUKK3sKKwkvKioKKwkgKiBBIGJvZ3VzIHNlcmlhbCB2ZXJzaW9uIHVpZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIE1lc3NhZ2Ugd2l0aCBkZWZhdWx0IGxlbmd0aC4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlIChjb21tYW5kKS4KKwkgKiBAcGFyYW0gdmYgdGhlIHZhbHVlIGZhY3RvcnkuCisJICovCisJcHVibGljIE1lc3NhZ2UoIFR5cGUgdHlwZSwgVmFsdWVGYWN0b3J5IHZmICkKKwl7CisJCXN1cGVyKCB0eXBlLCB2ZiApOworCQl0aGlzLnZmID0gdmY7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgTWVzc2FnZS4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlIChjb21tYW5kKS4KKwkgKiBAcGFyYW0gdmYgdGhlIHZhbHVlIGZhY3RvcnkuCisJICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIG5hbWUgLyB2YWx1ZSBwYWlycyBleHBlY3RlZC4gMCBtZWFucyB1c2UKKwkgKiBkZWZhdWx0LgorCSAqLworCXB1YmxpYyBNZXNzYWdlKCBUeXBlIHR5cGUsIFZhbHVlRmFjdG9yeSB2ZiwgaW50IGxlbmd0aCApCisJeworCQlzdXBlciggdHlwZSwgdmYsIGxlbmd0aCApOworCQl0aGlzLnZmID0gdmY7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBWYWx1ZUZhY3RvcnkgdmY7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgdmFsdWUgZmFjdG9yeS4KKwkgKi8KKwlwdWJsaWMgVmFsdWVGYWN0b3J5IHZmKCkKKwl7CisJCXJldHVybiB2ZjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbWVzc2FnZSB3aGljaCBpcyBhIHJlcGx5IHRvIHRoZSBjdXJyZW50IG1lc3NhZ2UuCisJICogVGhlIGN1cnJlbnQgbWVzc2FnZSdzIHZhbHVlIGZhY3RvcnkgaXMgY29waWVkIHRvIHRoZSBuZXcKKwkgKiBtZXNzYWdlLiBUaGUgbWVzc2FnZS1pZCBvZiB0aGUgY3VycmVudCBtZXNzYWdlIChpZiBhbnkpIGlzCisJICogY29waWVkIGludG8gdGhlIGluLXJlcGx5LXRvIGZpZWxkIG9mIHRoZSBuZXcgbWVzc2FnZS4KKwkgKiBAcGFyYW0gclR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlcGx5LgorCSAqIEByZXR1cm4gYSByZXBseSBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBNZXNzYWdlIHJlcGx5KCBUeXBlIHJUeXBlICkKKyAgICB7CisJICAgIE1lc3NhZ2Ugcm1zZyA9IG5ldyBNZXNzYWdlKCByVHlwZSwgdmYgKTsKKwkgICAgcm1zZy5zZXRJblJlcGx5VG8oIGdldE1lc3NhZ2VJZCgpICk7CisJICAgIHJldHVybiBybXNnOworICAgIH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgbWVzc2FnZSB3aGljaCBpcyB0aGUgYXBwcm9wcmlhdGUgcmVwbHkgdG8gdGhpcyBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBNZXNzYWdlIHJlcGx5KCkKKwl7CisJICAgIE1lc3NhZ2Ugcm1zZyA9IG5ldyBNZXNzYWdlKCB0eXBlKCkuZ2V0UmVzdWx0KCksIHZmICk7CisJICAgIHJtc2cuc2V0SW5SZXBseVRvKCBnZXRNZXNzYWdlSWQoKSApOworCSAgICByZXR1cm4gcm1zZzsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb25uZWN0aW9uIHNwZWNpZmljIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMKKwkgKiBtZXNzYWdlLCBvciBudWxsIGlmIHRoZXJlIHdhcyBubyBzdWNoIGlkZW50aWZpZXIuCisJICovCisJcHVibGljIExvbmcgZ2V0TWVzc2FnZUlkKCkKKyAgICB7CisJICAgIHJldHVybiB2Zi5nZXRNZXNzYWdlSWQoIHRoaXMgKTsKKyAgICB9CisJCisJLyoqCisJICogU2V0cyB0aGUgbWVzc2FnZS1pZCBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuCisJICogQHBhcmFtIG1zZ2lkIHRoZSBjb25uZWN0aW9uIHNwZWNpZmljIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMKKwkgKiBtZXNzYWdlLiBOdWxsIGlmIHRoZSBtZXNzYWdlIGhhcyBub3QgYmVlbiBzZW50IHlldC4gTk9URTogdGhlCisJICogc2VuZCBwcm9jZXNzIG92ZXJ3cml0ZXMgYW55IHZhbHVlIHRoZSB1c2VyIG1pZ2h0IHNldCBoZXJlLiBTbworCSAqIGRvbid0IGJvdGhlciB0cnlpbmcgdG8gc2V0IGl0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZCggTG9uZyBtc2dpZCApCisJeworCQl2Zi5zZXRNZXNzYWdlSWQoIHRoaXMsIG1zZ2lkICk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UtaWQgb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIGlzIGEgcmVzcG9uc2UgdG8uCisJICogTnVsbCBpZiB0aGlzIGlzIGFuIG9yaWdpbmFsIG1lc3NhZ2Ugb3IgaWYgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgZGlkCisJICogbm90IGhhdmUgYSBtZXNzYWdlLWlkLgorCSAqLworCXB1YmxpYyBMb25nIGdldEluUmVwbHlUbygpCisJeworCQlyZXR1cm4gdmYuZ2V0SW5SZXBseVRvKCB0aGlzICk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGluLXJlcGx5LXRvIGZpZWxkIG9mIHRoaXMgbWVzc2FnZS4KKwkgKiBAcGFyYW0gbXNnaWQgdGhlIG1lc3NhZ2UtaWQgb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIGlzIGEgcmVzcG9uc2UgdG8uCisJICovCisJcHVibGljIHZvaWQgc2V0SW5SZXBseVRvKCBMb25nIG1zZ2lkICkKKwl7CisJCXZmLnNldEluUmVwbHlUbyggdGhpcywgbXNnaWQgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9TdHJ1Y3RWYWx1ZS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvU3RydWN0VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQyN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvU3RydWN0VmFsdWUuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvci5MZXZlbDsKKworCisvKioKKyAqIEEgdHlwZWQgbWFwIG9mIGtleS92YWx1ZSBwYWlycywgd2hlcmUgdGhlIHR5cGUgaXMgYSBUeXBlLAorICogZWFjaCBrZXkgaXMgYSBGaWVsZCwgYW5kIGVhY2ggdmFsdWUgaXMgb2YgYXJiaXRyYXJ5IHR5cGUKKyAqIGNob3NlbiBmcm9tIHRoZSBiYXNpYyBqYXZhIHR5cGVzIGJvb2xlYW4sIGJ5dGUsIHNob3J0LCBpbnQsIGxvbmcsCisgKiBmbG9hdCwgZG91YmxlLCBTdHJpbmcsIGFuIGFycmF5IG9mIHRob3NlLCB0aGUgZXh0ZW5kZWQgdHlwZXMKKyAqIEFycmF5VmFsdWUgYW5kIFN0cnVjdFZhbHVlLCBhbmQgc3BlY2lmaWMgdHlwZXMgc3VwcG9ydGVkIGJ5CisgKiBWYWx1ZUZhY3RvcnkuCisgKiAKKyAqIFN0cnVjdFZhbHVlIGlzIG5vdCBwcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2Vzcy4KKyAqLworcHVibGljIGNsYXNzIFN0cnVjdFZhbHVlIGV4dGVuZHMgSGFzaE1hcDxGaWVsZCwgT2JqZWN0PgorCWltcGxlbWVudHMgSXRlcmFibGU8TWFwLkVudHJ5PEZpZWxkLCBPYmplY3Q+PgoreworCS8qKgorCSAqIEEgYm9ndXMgc2VyaWFsIHZlcnNpb24gdWlkLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLy8gbWFnaWMgbnVtYmVyIDYgcmVzdWx0cyBpbiBzdXBlciggOCApIGluIEhhc2hNYXAgY29uc3RydWN0b3IuCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfU0laRSA9IDg7CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgU3RydWN0VmFsdWUgd2l0aCBkZWZhdWx0IGxlbmd0aC4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgc3RydWN0LgorCSAqIEBwYXJhbSB2ZiB0aGUgdmFsdWUgZmFjdG9yeS4KKwkgKi8KKwlwdWJsaWMgU3RydWN0VmFsdWUoIFR5cGUgdHlwZSwgVmFsdWVGYWN0b3J5IHZmICkKKwl7CisJCXRoaXMoIHR5cGUsIHZmLCAwICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFN0cnVjdFZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QuCisJICogQHBhcmFtIHZmIHRoZSB2YWx1ZSBmYWN0b3J5LgorCSAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBuYW1lIC8gdmFsdWUgcGFpcnMgZXhwZWN0ZWQuIDAgbWVhbnMgdXNlCisJICogZGVmYXVsdC4KKwkgKi8KKwlwdWJsaWMgU3RydWN0VmFsdWUoIFR5cGUgdHlwZSwgVmFsdWVGYWN0b3J5IHZmLCBpbnQgbGVuZ3RoICkKKwl7CisJCXN1cGVyKCBsZW5ndGggPiAwID8gKGxlbmd0aCo0KzIpLzMgOiBERUZBVUxUX1NJWkUgKTsKKwkJCisJCWlmICh0eXBlID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAidHlwZSA9PSBudWxsIiApOworCQkKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJbGV2ZWwgPSB2Zi5nZXRMZXZlbCgpOworCX0KKworCXByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworCQorCXByaXZhdGUgZmluYWwgTGV2ZWwgbGV2ZWw7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgc3RydWN0IHR5cGUuCisJICovCisJcHVibGljIFR5cGUgdHlwZSgpCisJeworCQlyZXR1cm4gdHlwZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB2YWxpZGF0aW9uIGxldmVsLgorCSAqLworCXB1YmxpYyBMZXZlbCBsZXZlbCgpCisJeworCQlyZXR1cm4gbGV2ZWw7CisJfQorCisJLyoqCisJICogQ29tcGFyZXMgdGhlIHR5cGUgb2YgdGhpcyBzdHJ1Y3QgdG8gYW5vdGhlciB0eXBlLgorCSAqIEBwYXJhbSBvdGhlclR5cGUgdGhlIHR5cGUgdG8gY29tcGFyZSB0aGlzIHR5cGUgdG8uCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgc3RydWN0IGlzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1R5cGUoIFR5cGUgb3RoZXJUeXBlICkKKwl7CisJCXJldHVybiB0eXBlLmVxdWFscyggb3RoZXJUeXBlICk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIGEgc3RydWN0IGZvciBoYXZpbmcgdGhlIGV4cGVjdGVkIHR5cGUuCisJICogQHBhcmFtIGV4cGVjdGVkVHlwZSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGlzIHN0cnVjdC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3QgYXMgZXhwZWN0ZWQuCisJICovCisJcHVibGljIHZvaWQgY2hlY2tUeXBlKCBUeXBlIGV4cGVjdGVkVHlwZSApCisJeworCQlpZiAoIWlzVHlwZSggZXhwZWN0ZWRUeXBlICkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgZW50cnkgc2V0IChrZXkvdmFsdWUgcGFpcnMpIG9mIHRoaXMgc3RydWN0LgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqLworCXB1YmxpYyBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8RmllbGQsIE9iamVjdD4+IGl0ZXJhdG9yKCkKKwl7CisJCXJldHVybiBlbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJfQorCQorCUBPdmVycmlkZQorCWZpbmFsIHB1YmxpYyBPYmplY3QgcHV0KCBGaWVsZCBrZXksIE9iamVjdCB2YWx1ZSApCisJeworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiByZW1vdmUoIGtleSApOworCQkKKwkJaWYgKGxldmVsICE9IExldmVsLk5PTkUpCisJCXsKKwkJICAgIFZhbGlkYXRvciB2ID0gdHlwZS5nZXRWYWxpZGF0b3IoIGtleSApOworCQkgICAgCisJCSAgICBpZiAobGV2ZWwgPT0gTGV2ZWwuRlVMTCAmJiB2ID09IG51bGwpCisJCSAgICAJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJICAgIAkJInZhbGlkYXRvciBtaXNzaW5nIGZvciB0eXBlICVzIGZpZWxkICVzIiwgdHlwZSwga2V5ICkgKTsKKwkJICAgIAorCQkgICAgaWYgKHYgIT0gbnVsbCAmJiAhdi52YWxpZGF0ZSggdmFsdWUgKSkKKwkJICAgIAl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkgICAgCQkidmFsaWRhdG9yICVzIGZhaWxlZCBmb3IgdHlwZSAlcyBmaWVsZCAlczogdmFsdWUgJXMiLAorCQkgICAgCQl2LCB0eXBlLCBrZXksIHZhbHVlICkgKTsKKwkJfQorCQkKKwkgICAgcmV0dXJuIHN1cGVyLnB1dCgga2V5LCB2YWx1ZSApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiJXM6ICVzIiwgdHlwZSwgc3VwZXIudG9TdHJpbmcoKSApOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UeXBlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3YzkxYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1R5cGUuamF2YQpAQCAtMCwwICsxLDM3MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogVHlwZSBkZW5vdGVzIHRoZSB0eXBlIG9mIGEgc3RydWN0IG9yIG1lc3NhZ2UuIFdoZW4gdXNlZCB3aXRoIGEKKyAqIG1lc3NhZ2UgaXQgdHlwaWNhbGx5IGRlbm90ZXMgYW4gYWN0aW9uIG9yIGV2ZW50LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHlwZSBleHRlbmRzIElkTmFtZQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFR5cGUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgdHlwZS4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdHlwZS4KKwkgKi8KKwlwdWJsaWMgVHlwZSggaW50IGlkLCBTdHJpbmcgbmFtZSApCisJeworCQlzdXBlciggaWQsIG5hbWUgKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBUeXBlLCBjb21wdXRpbmcgdGhlIGFwcHJvcHJpYXRlIHZhbHVlCisJICogZm9yIHRoZSBpZC4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdHlwZS4KKwkgKi8KKwlwdWJsaWMgVHlwZSggU3RyaW5nIG5hbWUgKQorCXsKKwkJc3VwZXIoIG5hbWUgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgdmFsaWRhdG9yIGZvciB0aGlzIGtleSBvZiB0aGlzIHR5cGUuCisJICovCisJcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoIEZpZWxkIGtleSApCisgICAgeworCSAgICByZXR1cm4gdmFsaWRhdG9ycy5nZXQoIGtleSApOworICAgIH0KKwkKKwkvKioKKwkgKiBBZGRzIHRoZSB2YWxpZGF0b3IgdG8gdGhlIGNoYWluIGZvciB0aGlzIGtleS4KKwkgKiBAcGFyYW0ga2V5CisJICogQHBhcmFtIHZsZHRyCisJICovCisJcHVibGljIHZvaWQgcHV0VmFsaWRhdG9yKCBGaWVsZCBrZXksIFZhbGlkYXRvciB2bGR0ciApCisJeworCQljaGVja05vdExvY2tlZCgpOworCQkKKwkJaWYgKHZsZHRyID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpZiAoZmllbGRzLmdldCgga2V5LmdldElkKCkgKSA9PSBudWxsKQorCQkJYWRkRmllbGQoIGtleSApOworCisJCVZhbGlkYXRvciB2ID0gdmFsaWRhdG9ycy5nZXQoIGtleSApOworCQlpZiAodiAhPSBudWxsKQorCQkJdmFsaWRhdG9ycy5wdXQoIGtleSwgbmV3IENvbWJvVmFsaWRhdG9yKCB2LCB2bGR0ciApICk7CisJCWVsc2UKKwkJCXZhbGlkYXRvcnMucHV0KCBrZXksIHZsZHRyICk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUgdmFsaWRhdG9yIGNoYWluIGZvciB0aGlzIGtleS4KKwkgKiBAcGFyYW0ga2V5CisJICovCisJcHVibGljIHZvaWQgY2xlYXJWYWxpZGF0b3IoIEZpZWxkIGtleSApCisgICAgeworCQljaGVja05vdExvY2tlZCgpOworCSAgICB2YWxpZGF0b3JzLnJlbW92ZSgga2V5ICk7CisgICAgfQorCQorCXByaXZhdGUgZmluYWwgTWFwPEZpZWxkLCBWYWxpZGF0b3I+IHZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcDxGaWVsZCwgVmFsaWRhdG9yPigpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBtZXNzYWdlIHR5cGUgb2YgdGhpcyBtZXNzYWdlIHR5cGUuCisJICovCisJcHVibGljIFR5cGUgZ2V0UmVzdWx0KCkKKwl7CisJCXJldHVybiByVHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSByZXN1bHQgbWVzc2FnZSB0eXBlIG9mIHRoaXMgbWVzc2FnZSB0eXBlLgorCSAqIEBwYXJhbSByVHlwZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc3VsdCggVHlwZSByVHlwZSApCisJeworCQljaGVja05vdExvY2tlZCgpOworCQl0aGlzLnJUeXBlID0gclR5cGU7CisJfQorCQorCXByaXZhdGUgVHlwZSByVHlwZTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgaW1wb3J0IC8gZXhwb3J0IGhlbHBlci4KKwkgKi8KKwlwdWJsaWMgSW1wb3J0RXhwb3J0SGVscGVyIGdldEltcG9ydEV4cG9ydEhlbHBlcigpCisJeworCQlyZXR1cm4gaGVscGVyOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBhc3NvY2lhdGVkIGltcG9ydCAvIGV4cG9ydCBoZWxwZXIuCisJICogQHBhcmFtIGhlbHBlcgorCSAqLworCXB1YmxpYyB2b2lkIHNldEltcG9ydEV4cG9ydEhlbHBlciggSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlciApCisJeworCQljaGVja05vdExvY2tlZCgpOworCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKKwl9CisJCisJcHJpdmF0ZSBJbXBvcnRFeHBvcnRIZWxwZXIgaGVscGVyOworCisJLyoqCisJICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBjb21wb25lbnQgdHlwZSBmb3IgYW4gYXJyYXkgb2YgdGhpcyB0eXBlLgorCSAqIFRoaXMgdHlwZSBpcyBub3QgdXNlZCB3aGVuIGRlLXNlcmlhbGl6aW5nIHRoZSBhcnJheSBjb21wb25lbnRzLAorCSAqIGp1c3Qgd2hlbiBhbGxvY2F0aW5nIHRoZSBhcnJheSBpdHNlbGYuCisJICovCisJcHVibGljIENsYXNzPD8+IGdldENvbXBvbmVudFR5cGUoKQorCXsKKwkJcmV0dXJuIGNsc3M7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGFzc29jaWF0ZWQgY29tcG9uZW50IHR5cGUgZm9yIGFuIGFycmF5IG9mIHRoaXMgdHlwZS4KKwkgKiBUaGlzIHR5cGUgaXMgbm90IHVzZWQgd2hlbiBkZS1zZXJpYWxpemluZyB0aGUgYXJyYXkgY29tcG9uZW50cywKKwkgKiBqdXN0IHdoZW4gYWxsb2NhdGluZyB0aGUgYXJyYXkgaXRzZWxmLgorCSAqIEBwYXJhbSBjbHNzCisJICovCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZSggQ2xhc3M8Pz4gY2xzcyApCisJeworCQljaGVja05vdExvY2tlZCgpOworCQl0aGlzLmNsc3MgPSBjbHNzOworCX0KKwkKKwlwcml2YXRlIENsYXNzPD8+IGNsc3M7CisKKwkvKioKKwkgKiBAcmV0dXJuIGFuIG9iamVjdCB0byBoZWxwIHRoZSBzdHViIGRpc3BhdGNoIHRoZSByZWNlaXZlZCBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0U3R1YkhlbHBlcigpCisJeworCQlyZXR1cm4gc3R1YkhlbHBlcjsKKwl9CisJCisJLyoqCisJICogU2V0cyBhbiBvYmplY3QgdG8gaGVscCB0aGUgc3R1YiBkaXNwYXRjaCB0aGUgcmVjZWl2ZWQgbWVzc2FnZS4KKwkgKiBAcGFyYW0gc3R1YkhlbHBlcgorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0dWJIZWxwZXIoIE9iamVjdCBzdHViSGVscGVyICkKKwl7CisvLwkJY2hlY2tOb3RMb2NrZWQoKTsgY2FsbGVkIGZyb20gc3R1YiBhbmQgbm90IGZyb20gdmFsdWUgZmFjdG9yeS4KKwkJaWYgKHRoaXMuc3R1YkhlbHBlciAhPSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggInRoaXMuc3R1YkhlbHBlciAhPSBudWxsIiApOworCQl0aGlzLnN0dWJIZWxwZXIgPSBzdHViSGVscGVyOworCX0KKworCXByaXZhdGUgT2JqZWN0IHN0dWJIZWxwZXI7CisJCisJLyoqCisJICogTG9ja3MgdGhlIGZpZWxkcyBmb3IgdGhpcyB0eXBlLgorCSAqLworCXB1YmxpYyB2b2lkIGxvY2soKQorCXsKKwkJbG9ja2VkID0gdHJ1ZTsKKwkJZmllbGRzLmxvY2soKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrTm90TG9ja2VkKCkKKwl7CisJCWlmIChsb2NrZWQpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAibG9ja2VkIiApOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOworCQorCS8qKgorCSAqIEFkZHMgYSBmaWVsZCB0byB0aGUgc2V0IG9mIGZpZWxkcy4KKwkgKiAKKwkgKiBAcGFyYW0gZmllbGQgYSBmaWVsZCB0byBhZGQuCisJICogCisJICogQHJldHVybiB0aGUgYXJndW1lbnQuIElmIHRoZXJlIGlzIGEgY29sbGlzaW9uIHdpdGgKKwkgKiBhbiBpZCBhbmQgbmFtZSwgYm90aCBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgZmllbGQsCisJICogdGhlbiB0aGF0IGZpZWxkIGlzIHJldHVybmVkIGluc3RlYWQgb2YgdGhlIGFyZ3VtZW50LgorCSAqIAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEKKwkgKiBjb2xsaXNpb24gaW4gdGhlIGlkIG9yIG5hbWUsIG9yIGJvdGggaWQgYW5kIG5hbWUKKwkgKiB3aGVuIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgZmllbGQuCisJICovCisJcHVibGljIEZpZWxkIGFkZEZpZWxkKCBGaWVsZCBmaWVsZCApCisJeworCQlyZXR1cm4gZmllbGRzLmFkZCggZmllbGQgKTsKKwl9CisKKwkvKioKKwkgKiBUcmFuc2xhdGVzIGEgZmllbGQgaWQgaW50byB0aGUgYXBwcm9wcmlhdGUgRmllbGQgb2JqZWN0LgorCSAqIEBwYXJhbSBpZCBhIGZpZWxkIGlkLgorCSAqIEByZXR1cm4gaWQgdHJhbnNsYXRlZCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBGaWVsZC4KKwkgKi8KKwlwdWJsaWMgRmllbGQgZ2V0RmllbGQoIEludGVnZXIgaWQgKQorCXsKKwkJcmV0dXJuIGZpZWxkcy5nZXQoIGlkICk7CisJfQorCisJLyoqCisJICogVHJhbnNsYXRlcyBhIGZpZWxkIG5hbWUgaW50byB0aGUgYXBwcm9wcmlhdGUgRmllbGQKKwkgKiBvYmplY3QuCisJICogQHBhcmFtIG5hbWUgYSBmaWVsZCBuYW1lLgorCSAqIEByZXR1cm4gbmFtZSB0cmFuc2xhdGVkIGludG8gdGhlIGFwcHJvcHJpYXRlIEZpZWxkLgorCSAqLworCXB1YmxpYyBGaWVsZCBnZXRGaWVsZCggU3RyaW5nIG5hbWUgKQorCXsKKwkJcmV0dXJuIGZpZWxkcy5nZXQoIG5hbWUgKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiBhIHNldCBvZiBhbGwgdGhlIGZpZWxkcy4KKwkgKi8KKwlwdWJsaWMgU2V0PEZpZWxkPiBnZXRGaWVsZHMoKQorCXsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggZmllbGRzLnZhbHVlcygpICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgRmllbGRNYXAgZmllbGRzID0gbmV3IEZpZWxkTWFwKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGlzIHJlc3BvbnNlIG1lc3NhZ2UuCisJICovCisJcHVibGljIGludCBnZXRUaW1lb3V0KCkKKwl7CisJCXJldHVybiB0aW1lb3V0OworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGlzIHJlc3BvbnNlIG1lc3NhZ2UuCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZW91dCggaW50IHRpbWVvdXQgKQorCXsKKwkJY2hlY2tOb3RMb2NrZWQoKTsKKwkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgdGltZW91dDsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZpZWxkIHdpdGggdGhlIHZhbHVlIG9mIHRoaXMgcmVzcG9uc2UuCisJICovCisJcHVibGljIEZpZWxkIGdldFJlc3BvbnNlRmllbGQoKQorCXsKKwkJcmV0dXJuIHJlc3BvbnNlRmllbGQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIHJlc3BvbnNlRmllbGQgdGhlIGZpZWxkIHdpdGggdGhlIHZhbHVlIG9mIHRoaXMgcmVzcG9uc2UuCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzcG9uc2VGaWVsZCggRmllbGQgcmVzcG9uc2VGaWVsZCApCisJeworCQljaGVja05vdExvY2tlZCgpOworCQl0aGlzLnJlc3BvbnNlRmllbGQgPSByZXNwb25zZUZpZWxkOworCX0KKwkKKwlwcml2YXRlIEZpZWxkIHJlc3BvbnNlRmllbGQ7CisJCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIG90aGVyLiBUaGlzCisJICogbWVhbnMgdGhhdCBvdGhlciBpcyBhIHN1YmNsYXNzIG9mIHRoaXMuCisJICogQHBhcmFtIG90aGVyCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSBpcyBhc3NpZ25hYmxlIGZyb20gb3RoZXIuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbSggVHlwZSBvdGhlciApCisJeworCQlyZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiAoZXF1YWxzKCBvdGhlciApIHx8IGlzQXNzaWduYWJsZUZyb20oIG90aGVyLnN1cGVyVHlwZSgpICkpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB0byBzZWUgaWYgdGhpcyB0eXBlIGlzIGFzc2lnbmFibGUgZnJvbSB0aGUgb3RoZXIgdHlwZS4KKwkgKiBAcGFyYW0gb3RoZXIKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIG5vdCBhc3NpZ25hYmxlIGZyb20gb3RoZXIuCisJICogQHNlZSAjaXNBc3NpZ25hYmxlRnJvbShUeXBlKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrSXNBc3NpZ25hYmxlRnJvbSggVHlwZSBvdGhlciApCisJeworCQlpZiAoIWlzQXNzaWduYWJsZUZyb20oIG90aGVyICkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAidGhpcyBub3Qgc3VwZXIgdHlwZSBvZiBvdGhlciIgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdXBlciB0eXBlIG9mIHRoaXMgdHlwZS4gSWYgc3RydWN0IEEgZXh0ZW5kcyBCLCB0aGVuCisJICogQiBpcyB0aGUgc3VwZXIgdHlwZSBvZiBBLgorCSAqLworCXB1YmxpYyBUeXBlIHN1cGVyVHlwZSgpCisJeworCQlyZXR1cm4gc3VwZXJUeXBlOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBzdXBlciB0eXBlIG9mIHRoaXMgdHlwZS4gSWYgc3RydWN0IEEgZXh0ZW5kcyBCLCB0aGVuCisJICogQiBpcyB0aGUgc3VwZXIgdHlwZSBvZiBBLgorCSAqIEBwYXJhbSBzdXBlclR5cGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdXBlclR5cGUoIFR5cGUgc3VwZXJUeXBlICkKKwl7CisJCWNoZWNrTm90TG9ja2VkKCk7CisJCXRoaXMuc3VwZXJUeXBlID0gc3VwZXJUeXBlOworCX0KKwkKKwlwcml2YXRlIFR5cGUgc3VwZXJUeXBlOworCisJLyoqCisJICogQHJldHVybiB0aGUgQXN5bmNNb2RlIGZvciB0aGlzIHR5cGUuCisJICovCisJcHVibGljIEFzeW5jTW9kZSBnZXRBc3luY01vZGUoKQorCXsKKwkJcmV0dXJuIGFzeW5jTW9kZTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgQXN5bmNNb2RlIGZvciB0aGlzIHR5cGUuCisJICogQHBhcmFtIG1vZGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBc3luY01vZGUoIEFzeW5jTW9kZSBtb2RlICkKKwl7CisJCWNoZWNrTm90TG9ja2VkKCk7CisJCWFzeW5jTW9kZSA9IG1vZGU7CisJfQorCQorCXByaXZhdGUgQXN5bmNNb2RlIGFzeW5jTW9kZTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZGlyZWN0aW9uLgorCSAqLworCXB1YmxpYyBEaXJlY3Rpb24gZ2V0RGlyZWN0aW9uKCkKKwl7CisJCXJldHVybiBkaXJlY3Rpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbWVzc2FnZSBkaXJlY3Rpb24uCisJICogQHBhcmFtIGRpcmVjdGlvbiB0aGUgZGlyZWN0aW9uIHRvIHNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREaXJlY3Rpb24oIERpcmVjdGlvbiBkaXJlY3Rpb24gKQorCXsKKwkJY2hlY2tOb3RMb2NrZWQoKTsKKwkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisJfQorCQorCXByaXZhdGUgRGlyZWN0aW9uIGRpcmVjdGlvbjsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1R5cGVNYXAuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1R5cGVNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdjNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVHlwZU1hcC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKKy8qKgorICogVHlwZU1hcCBpcyBhIElkTmFtZU1hcCBmb3IgVHlwZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFR5cGVNYXAgZXh0ZW5kcyBJZE5hbWVNYXA8VHlwZT4KK3sKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVHlwZSBtYWtlTmV3KCBTdHJpbmcgbmFtZSApCisJeworCQlyZXR1cm4gbmV3IFR5cGUoIG5hbWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9WYWxpZGF0b3IuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1ZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjQ2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCisvKioKKyAqIFZhbGlkYXRlIHZhbHVlcyBwdXQgaW50byBtZXNzYWdlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYXJyYXlzICg5KS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNQVhfTkRJTVMgPSA5OworCQorCS8qKgorCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIGNhY2hlIHBlciB0eXBlLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1BWF9DQUNIRUQgPSA0OworCQorCS8qKiBWYWxpZGF0aW9uIGxldmVsIGZvciBwdXQgaW50byBTdHJ1Y3RWYWx1ZSBhbmQgVGFnZ2VkRGF0YU91dHB1dCAqLworCXB1YmxpYyBlbnVtIExldmVsCisJeworCQkvKiogTm8gdmFsaWRhdGlvbiBvbiBwdXQgb3Igb3V0cHV0LiAqLworCQlOT05FLAorCQkvKiogVmFsaWRhdGlvbiBvbiBwdXQgb3Igb3V0cHV0IGlmIHZhbGlkYXRvciBkZWZpbmVkLiAqLworCQlNSVNTSU5HX09LLAorCQkvKiogTGlrZSBNSVNTSU5HX09LLCBidXQgZmFpbCBpZiBubyB2YWxpZGF0b3IgZGVmaW5lZC4gKi8KKwkJRlVMTAorCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIGZvciBhbiBhcnJheSB0eXBlLCByZXR1cm4gYSB2YWxpZGF0b3IgZm9yIGFuIGVsZW1lbnQgb2YKKwkgKiB0aGUgYXJyYXkgKHdoaWNoIG1pZ2h0IGJlIGEgc2NhbGFyIG9yIGFub3RoZXIgYXJyYXkgZWxlbWVudCkuCisJICovCisJcHVibGljIFZhbGlkYXRvciBlbGVtZW50VmFsaWRhdG9yKCk7CisKKwkvKioKKwkgKiBDaGVja3MgdGhlIHZhbHVlIGZvciBiZWluZyB2YWxpZC4gSWYgdGhlIHZhbHVlIGlzIHZhbGlkCisJICogYnkgdGhpcyB2YWxpZGF0b3IsIHJldHVybiB0cnVlLgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdmFsaWQgYnkgYW55IHZhbGlkYXRvciBpbiB0aGUKKwkgKiBjaGFpbiwgb3IgZmFsc2UgaWYgYWxsIHJlamVjdCBpdC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSggT2JqZWN0IHZhbHVlICk7CisKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBnaXZlbiB0aGUgaW5wdXQgdmFsdWUgYW5kIHRoaXMKKwkgKiB2YWxpZGF0b3IncyBzZW5zaWJpbGl0eSBhYm91dCB3aGF0IGl0IHNob3VsZCBiZSByZWFsbHkgKGUuZy4sCisJICogaW5wdXQgQnl0ZSBidXQgb3V0cHV0IExvbmcuCisJICovCisJcHVibGljIE9iamVjdCB2YWxpZGF0ZVZhbHVlKCBPYmplY3QgdmFsdWUgKTsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1ZhbHVlRmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVmFsdWVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwNWZjMAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1ZhbHVlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3IuTGV2ZWw7CisKKworLyoqCisgKiBJbnRlcmZhY2Ugd2hpY2ggZGVmaW5lcyB0aGUgdmFsdWUgZmFjdG9yeSB3aGljaCBoZWxwcworICogdGhlIGlkbCBjb21waWxlciBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIG1lc3NhZ2VzLAorICogY29udmVydCB2YWx1ZXMsIGV0Yy4KKyAqLworcHVibGljIGludGVyZmFjZSBWYWx1ZUZhY3RvcnkKK3sKKwkvLy8vLy8vLy8vCisJLy8gVHlwZSAvLworCS8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBUcmFuc2xhdGVzIGEgdHlwZSBpZCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBUeXBlIG9iamVjdC4gSWYgdGhlIHR5cGUgZG9lcworCSAqIG5vdCBleGlzdCwgYW5kIGlmIGR5bmFtaWMgdHlwaW5nIGlzIGVuYWJsZWQsIGFkZHMgaXQgdG8gdGhlIGR5bmFtaWMgdHlwZXMuCisJICogQHBhcmFtIGlkIGEgdHlwZSBpZC4KKwkgKiBAcmV0dXJuIGlkIHRyYW5zbGF0ZWQgaW50byB0aGUgYXBwcm9wcmlhdGUgVHlwZS4KKwkgKi8KKwlwdWJsaWMgVHlwZSBnZXRUeXBlKCBJbnRlZ2VyIGlkICk7CisKKwkvKioKKwkgKiBUcmFuc2xhdGVzIGEgdHlwZSBuYW1lIGludG8gdGhlIGFwcHJvcHJpYXRlIFR5cGUgb2JqZWN0LiBJZiB0aGUgdHlwZSBkb2VzCisJICogbm90IGV4aXN0LCBhbmQgaWYgZHluYW1pYyB0eXBpbmcgaXMgZW5hYmxlZCwgYWRkcyBpdCB0byB0aGUgZHluYW1pYyB0eXBlcy4KKwkgKiBAcGFyYW0gbmFtZSBhIHR5cGUgbmFtZS4KKwkgKiBAcmV0dXJuIG5hbWUgdHJhbnNsYXRlZCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBUeXBlLgorCSAqLworCXB1YmxpYyBUeXBlIGdldFR5cGUoIFN0cmluZyBuYW1lICk7CisKKwkvKioKKwkgKiBBZGRzIHRoZSB0eXBlIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gVXNlIHRoaXMgdG8gZHluYW1pY2FsbHkgYWRkCisJICogdHlwZXMgdG8gYSBWYWx1ZUZhY3RvcnkuIFRoZSB0eXBlIGlzIHBlciBpbnN0YW5jZSBvZiB0aGUgVmFsdWVGYWN0b3J5LAorCSAqIG5vdCBnbG9iYWwuIE5vdCBhdmFpbGFibGUgaWYgZHluYW1pYyB0eXBpbmcgaXMgbG9ja2VkLgorCSAqIEBwYXJhbSB0eXBlCisJICovCisJcHVibGljIHZvaWQgYWRkVHlwZSggVHlwZSB0eXBlICk7CisKKwkvKioKKwkgKiBMb2NrcyB0aGUgZHluYW1pYyB0eXBpbmcgc28gdGhhdCBubyBuZXcgdHlwZXMgbWF5IGJlIGNyZWF0ZWQgYnkgYWRkVHlwZQorCSAqIG9yIGdldFR5cGUuCisJICovCisJcHVibGljIHZvaWQgbG9ja0R5bmFtaWNUeXBlcygpOworCisJLyoqCisJICogVW5sb2NrcyB0aGUgZHluYW1pYyB0eXBpbmcgc28gdGhhdCBuZXcgdHlwZXMgbWF5IGJlIGNyZWF0ZWQgYnkgYWRkVHlwZQorCSAqIG9yIGdldFR5cGUuCisJICovCisJcHVibGljIHZvaWQgdW5sb2NrRHluYW1pY1R5cGVzKCk7CisJCisJLyoqCisJICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgYWxsIHRoZSB0eXBlcy4KKwkgKi8KKwlwdWJsaWMgU2V0PFR5cGU+IGdldFR5cGVzKCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTVFJJTkcgRU5DT0RJTkcgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGVuY29kaW5nIHRvIHVzZSBmb3Igc3RyaW5ncy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0VuY29kaW5nKCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vCisJLy8gTUVTU0FHRSBJRCAvLworCS8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2Ugd2hvc2Ugd2VsbC1rbm93biBtZXNzYWdlLWlkIGZpZWxkIGlzIHRvIGJlCisJICogcmV0dXJuZWQuCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHdlbGwta25vd24gbWVzc2FnZS1pZCBmaWVsZC4gVGhpcyBpcyBhCisJICogdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgbWVzc2FnZSBvbiBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0CisJICogZHVyaW5nIGEgcGFydGljdWxhciBzZXNzaW9uLiBJZiB0aGVyZSBpcyBubyB3ZWxsLWtub3duIG1lc3NhZ2UtaWQKKwkgKiBmaWVsZCBkZWZpbmVkLCBvciBpZiB0aGUgbWVzc2FnZS1pZCBmaWVsZCBoYXMgbm90IGJlZW4gc2V0LCB0aGVuCisJICogcmV0dXJuIG51bGwuCisJICovCisJcHVibGljIExvbmcgZ2V0TWVzc2FnZUlkKCBNZXNzYWdlIG1zZyApOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHdlbGwta25vd24gbWVzc2FnZS1pZCBmaWVsZC4gVGhpcyBpcyBhCisJICogdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgbWVzc2FnZSBvbiBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0CisJICogZHVyaW5nIGEgcGFydGljdWxhciBzZXNzaW9uLiBJZiB0aGVyZSBpcyBubyB3ZWxsLWtub3duIG1lc3NhZ2UtaWQKKwkgKiBmaWVsZCBkZWZpbmVkIHRoZW4gbm90aGluZyBpcyBkb25lLiBJZiBtc2dpZCBpcyBudWxsLCB0aGVuIHRoZQorCSAqIGZpZWxkIGlzIGNsZWFyZWQuCisJICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB3aG9zZSB3ZWxsLWtub3duIG1lc3NhZ2UtaWQgZmllbGQgaXMgdG8KKwkgKiBiZSBzZXQuCisJICogQHBhcmFtIG1zZ2lkIHRoZSB2YWx1ZSBvZiB0aGUgd2VsbC1rbm93biBtZXNzYWdlLWlkIGZpZWxkLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZCggTWVzc2FnZSBtc2csIExvbmcgbXNnaWQgKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2VsbC1rbm93biBtZXNzYWdlIGZpZWxkIGZvciBtZXNzYWdlIGlkLgorCSAqLworCXB1YmxpYyBGaWVsZCBnZXRfbWZfX21lc3NhZ2VJZCgpOworCisJLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTiBSRVBMWSBUTyAvLworCS8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB3aG9zZSB3ZWxsLWtub3duIGluLXJlcGx5LXRvIGZpZWxkIGlzIHRvCisJICogYmUgcmV0dXJuZWQuCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGluLXJlcGx5LXRvIGZpZWxkLCBvciBudWxsIGlmIHRoZXJlIGlzCisJICogbm9uZSBvciBpZiB0aGVyZSBpcyBubyBzdWNoIGZpZWxkIGRlZmluZWQuCisJICovCisJcHVibGljIExvbmcgZ2V0SW5SZXBseVRvKCBNZXNzYWdlIG1zZyApOworCisJLyoqCisJICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB3aG9zZSB3ZWxsLWtub3duIGluLXJlcGx5LXRvIGZpZWxkIGlzIHRvCisJICogYmUgc2V0LgorCSAqIEBwYXJhbSBtc2dpZCB0aGUgdmFsdWUgb2YgdGhlIHdlbGwta25vd24gaW4tcmVwbHktdG8gZmllbGQuIElmCisJICogdGhlcmUgaXMgbm8gd2VsbC1rbm93biBpbi1yZXBseS10byBmaWVsZCBkZWZpbmVkIHRoZW4gbm90aGluZworCSAqIGlzIGRvbmUuIElmIG1zZ2lkIGlzIG51bGwsIHRoZW4gdGhlIGZpZWxkIGlzIGNsZWFyZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0SW5SZXBseVRvKCBNZXNzYWdlIG1zZywgTG9uZyBtc2dpZCApOworCisJLyoqCisJICogQHJldHVybiB3ZWxsLWtub3duIG1lc3NhZ2UgZmllbGQgZm9yIGluIHJlcGx5IHRvLgorCSAqLworCXB1YmxpYyBGaWVsZCBnZXRfbWZfX2luUmVwbHlUbygpOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFZBTFVFIENPTlZFUlNJT04gLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEgc3RydWN0IHZhbHVlIHJlcHJlc2VudGF0aW9uIHRvIGJlIGV4cG9ydGVkCisJICogdG8gYSB0YWdnZWQgZGF0YSBvdXRwdXQuCisJICogQHBhcmFtIHZhbHVlIGEgY3VzdG9tIHR5cGUgZGVmaW5lZCBieSBhIHNlcnZpY2UsIG9yIGEgd2VsbC1rbm93bgorCSAqIHN0YW5kYXJkIHR5cGUgKGUuZy4sIGRhdGUpLgorCSAqIEByZXR1cm4gYSBzdHJ1Y3QgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZS4KKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBleHBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0Q3VzdG9tVmFsdWUoIE9iamVjdCB2YWx1ZSApCisJCXRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBDb252ZXJ0cyBhIHN0cnVjdCB2YWx1ZSBpbXBvcnRlZCBmcm9tIGEgdGFnZ2VkIGRhdGEgaW5wdXQgdG8KKwkgKiBhIG5vcm1hbCB0eXBlLgorCSAqIEBwYXJhbSBzdHJ1Y3QgYSBzdHJ1Y3QgdmFsdWUgcmVwcmVzZW50YXRpb24gb2YgYSBjdXN0b20gdHlwZSwgb3IgYQorCSAqIHdlbGwga25vd24gc3RhbmRhcmQgdHlwZS4KKwkgKiBAcmV0dXJuIGEgY3VzdG9tIHR5cGUsIG9yIGEgd2VsbCBrbm93biBzdGFuZGFyZCB0eXBlLgorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHR5cGUgY2Fubm90IGJlIGltcG9ydGVkLgorCSAqLworCXB1YmxpYyBPYmplY3QgaW1wb3J0Q3VzdG9tVmFsdWUoIFN0cnVjdFZhbHVlIHN0cnVjdCApCisJCXRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKworCS8qKgorCSAqIEBwYXJhbSBjIHRoZSBjbGFzcyBvZiBhIGN1c3RvbSB2YWx1ZS4KKwkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3QgdHlwZSBvZiBhIGN1c3RvbSB2YWx1ZSBjbGFzcy4KKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisJICogQHNlZSAjZXhwb3J0Q3VzdG9tVmFsdWUoT2JqZWN0KQorCSAqLworCXB1YmxpYyBUeXBlIGdldEN1c3RvbVN0cnVjdFR5cGUoIENsYXNzPD8+IGMgKQorCQl0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CisKKwkvKioKKwkgKiBAcmV0dXJuIHdlbGwta25vd24gbWVzc2FnZSB0eXBlIGZvciBleGNlcHRpb24gdGhyb3duIGJ5IG9uZS13YXkKKwkgKiBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBUeXBlIGdldF9tdF9fZXhjZXB0aW9uKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIGxldmVsIG9mIGZpZWxkIFN0cnVjdFZhbHVlLnB1dCBhbmQgVGFnZ2VkRGF0YU91dHB1dC4KKwkgKi8KKwlwdWJsaWMgTGV2ZWwgZ2V0TGV2ZWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbGlkYXRpb24gbGV2ZWwgb2YgZmllbGQgU3RydWN0VmFsdWUucHV0IGFuZCBUYWdnZWREYXRhT3V0cHV0LgorCSAqIEBwYXJhbSBsZXZlbAorCSAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZQorCSAqLworCXB1YmxpYyBMZXZlbCBzZXRMZXZlbCggTGV2ZWwgbGV2ZWwgKTsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9BdXRoRXhjZXB0aW9uU2VyaWFsaXplci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L0F1dGhFeGNlcHRpb25TZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1MWM3YQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9BdXRoRXhjZXB0aW9uU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5JbXBvcnRFeHBvcnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CisKKy8qKgorICogU2VyaWFsaXplciBmb3IgX0V0Y2hfQXV0aEV4Y2VwdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEF1dGhFeGNlcHRpb25TZXJpYWxpemVyIGltcGxlbWVudHMgSW1wb3J0RXhwb3J0SGVscGVyCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAibXNnIjsKKwkKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSB0eXBlcyBhbmQgZmllbGRzIGZvciB0aGlzIHNlcmlhbGl6ZXIuCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcGFyYW0gY2xhc3MydHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCBUeXBlIHR5cGUsIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSApCisJeworCQlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIEZJRUxEX05BTUUgKTsKKwkJY2xhc3MydHlwZS5wdXQoIF9FdGNoX0F1dGhFeGNlcHRpb24uY2xhc3MsIHR5cGUgKTsKKwkJdHlwZS5zZXRDb21wb25lbnRUeXBlKCBfRXRjaF9BdXRoRXhjZXB0aW9uLmNsYXNzICk7CisJCXR5cGUuc2V0SW1wb3J0RXhwb3J0SGVscGVyKCBuZXcgQXV0aEV4Y2VwdGlvblNlcmlhbGl6ZXIoIHR5cGUsIGZpZWxkICkgKTsKKwkJdHlwZS5wdXRWYWxpZGF0b3IoIGZpZWxkLCBWYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApICk7CisJCXR5cGUubG9jaygpOworCX0KKwkKKwlwcml2YXRlIEF1dGhFeGNlcHRpb25TZXJpYWxpemVyKCBUeXBlIHR5cGUsIEZpZWxkIGZpZWxkICkKKwl7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuZmllbGQgPSBmaWVsZDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKKwkKKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCB0eXBlLCB2ZiApOworCQlzdi5wdXQoIGZpZWxkLCB2YWx1ZS50b1N0cmluZygpICk7CisJCXJldHVybiBzdjsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCXsKKwkJc3RydWN0LmNoZWNrVHlwZSggdHlwZSApOworCQlyZXR1cm4gbmV3IF9FdGNoX0F1dGhFeGNlcHRpb24oIChTdHJpbmcpIHN0cnVjdC5nZXQoIGZpZWxkICkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvQ2xhc3MyVHlwZU1hcC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L0NsYXNzMlR5cGVNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzkzYjQyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L0NsYXNzMlR5cGVNYXAuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKKworCisvKioKKyAqIE1hcHBpbmcgYmV0d2VlbiBDbGFzcyBhbmQgVHlwZS4KKyAqLworcHVibGljIGNsYXNzIENsYXNzMlR5cGVNYXAKK3sKKwkvKioKKwkgKiBAcGFyYW0gYworCSAqIEByZXR1cm4gdGhlIFR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG9yIG51bGwuCisJICovCisJcHVibGljIFR5cGUgZ2V0KCBDbGFzczw/PiBjICkKKwl7CisJCXJldHVybiBjMnQuZ2V0KCBjICk7CisJfQorCisJLyoqCisJICogQWRkcyBhIG1hcCBlbnRyeSBmcm9tIGMgdG8gdC4KKwkgKiBAcGFyYW0gYworCSAqIEBwYXJhbSB0CisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbG9ja2VkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbmZsaWN0LgorCSAqLworCXB1YmxpYyB2b2lkIHB1dCggQ2xhc3M8Pz4gYywgVHlwZSB0ICkKKwl7CisJCWlmIChsb2NrZWQpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAibG9ja2VkIiApOworCQkKKwkJVHlwZSB4ID0gYzJ0LmdldCggYyApOworCQlpZiAoeCAhPSBudWxsKQorCQl7CisJCQlpZiAoIXguZXF1YWxzKCB0ICkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJInR5cGUgJXM6IGNsYXNzICVzIGlzIGFscmVhZHkgbWFwcGVkIHRvIHR5cGUgJXMiLAorCQkJCQl0LCBjLCB4ICkgKTsKKwkJCQorCQkJLy8geC5lcXVhbHMoIHQgKSB0aGVyZWZvcmUgb3VyIHdvcmsgaXMgZmluaXNoZWQuCisJCQlyZXR1cm47CisJCX0KKwkJCisJCWMydC5wdXQoIGMsIHQgKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGFsbCB0aGUgbWFwcGluZ3MgZnJvbSBvdGhlciB0byB0aGlzLgorCSAqIEBwYXJhbSBvdGhlcgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGxvY2tlZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBjb25mbGljdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRBbGwoIENsYXNzMlR5cGVNYXAgb3RoZXIgKQorCXsKKwkJaWYgKGxvY2tlZCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJsb2NrZWQiICk7CisJCQorCQlmb3IgKE1hcC5FbnRyeTxDbGFzczw/PiwgVHlwZT4gbWU6IG90aGVyLmMydC5lbnRyeVNldCgpKQorCQkJcHV0KCBtZS5nZXRLZXkoKSwgbWUuZ2V0VmFsdWUoKSApOworCX0KKworCS8qKgorCSAqIExvY2tzIHRoZSBtYXAsIGRpc2FsbG93aW5nIGFueSBtb3JlIGNoYW5nZXMuCisJICovCisJcHVibGljIHZvaWQgbG9jaygpCisJeworCQlsb2NrZWQgPSB0cnVlOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgVHlwZT4gYzJ0ID0gbmV3IEhhc2hNYXA8Q2xhc3M8Pz4sIFR5cGU+KCk7CisJCisJcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvRGVmYXVsdFNlcnZlckZhY3RvcnkuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9EZWZhdWx0U2VydmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MGU5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvRGVmYXVsdFNlcnZlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBTZXJ2ZXJGYWN0b3J5LiBVc2VkIGJ5IEV0Y2ggZ2VuZXJhdGVkIEhlbHBlciBmaWxlcworICogdG8gcHJvdmlkZSBsaXN0ZW5lcnMgd2l0aCBiYWNrc3RvcCBpbXBsZW1lbnRhdGlvbnMgb2YgU2Vzc2lvbiBtZXRob2RzIHdoaWNoCisgKiBmb3J3YXJkIHRvIHVzZXIncyBpbXBsZW1lbnRhdGlvbiBmYWN0b3J5LgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgRGVmYXVsdFNlcnZlckZhY3RvcnkgaW1wbGVtZW50cyBTZXJ2ZXJGYWN0b3J5Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgRGVmYXVsdFNlcnZlckZhY3RvcnkuCisJICogQHBhcmFtIGxpc3RlbmVyIAorCSAqIEBwYXJhbSBpbXBsRmFjdG9yeQorCSAqLworCXB1YmxpYyBEZWZhdWx0U2VydmVyRmFjdG9yeSggVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+IGxpc3RlbmVyLAorCQlPYmplY3QgaW1wbEZhY3RvcnkgKQorCXsKKwkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOworCQkKKwkJaWYgKGltcGxGYWN0b3J5IGluc3RhbmNlb2YgU2Vzc2lvbikKKwkJCXNldFNlc3Npb24oIChTZXNzaW9uKSBpbXBsRmFjdG9yeSApOworCQkKKwkJbGlzdGVuZXIuc2V0U2Vzc2lvbiggdGhpcyApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBsaXN0ZW5lcjsKKworCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoc2Vzc2lvbiAhPSBudWxsKQorCQkJcmV0dXJuIHNlc3Npb24uc2Vzc2lvblF1ZXJ5KCBxdWVyeSApOworCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnkgIiArIHF1ZXJ5ICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoc2Vzc2lvbiAhPSBudWxsKQorCQl7CisJCQlzZXNzaW9uLnNlc3Npb25Db250cm9sKCBjb250cm9sLCB2YWx1ZSApOworCQkJcmV0dXJuOworCQl9CisKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sICIgKyBjb250cm9sICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHNlc3Npb24gIT0gbnVsbCkKKwkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggZXZlbnQgKTsKKwl9CisKKwlwdWJsaWMgU2Vzc2lvbiBnZXRTZXNzaW9uKCkKKwl7CisJCXJldHVybiBzZXNzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb24gc2Vzc2lvbiApCisJeworCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCX0KKwkKKwlwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBjb250cm9sLCB2YWx1ZSApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbGlzdGVuZXIudHJhbnNwb3J0Tm90aWZ5KCBldmVudCApOworCX0KKworCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBsaXN0ZW5lci50cmFuc3BvcnRRdWVyeSggcXVlcnkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvRGVmYXVsdFZhbHVlRmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L0RlZmF1bHRWYWx1ZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzU0Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L0RlZmF1bHRWYWx1ZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQzMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkltcG9ydEV4cG9ydEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yLkxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuRGF0ZVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5MaXN0U2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLk1hcFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TZXRTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKKworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgVmFsdWVGYWN0b3J5IHdoaWNoIHByb3ZpZGVzIHNvbWUKKyAqIGR5bmFtaWMgdHlwZSBhbmQgZmllbGQgc3VwcG9ydCwgYXMgd2VsbCBhcyBzdGFuZGFyZAorICogdmFsdWUgY29udmVyc2lvbnMgYW5kIGltcG9ydCBhbmQgcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0VmFsdWVGYWN0b3J5IGltcGxlbWVudHMgVmFsdWVGYWN0b3J5Cit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQ0hfUlVOVElNRV9FWENFUFRJT05fVFlQRV9OQU1FID0gIl9FdGNoX1J1bnRpbWVFeGNlcHRpb24iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQ0hfTElTVF9UWVBFX05BTUUgPSAiX0V0Y2hfTGlzdCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRDSF9NQVBfVFlQRV9OQU1FID0gIl9FdGNoX01hcCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRDSF9TRVRfVFlQRV9OQU1FID0gIl9FdGNoX1NldCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRDSF9EQVRFVElNRV9UWVBFX05BTUUgPSAiX0V0Y2hfRGF0ZXRpbWUiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQ0hfQVVUSF9FWENFUFRJT05fVFlQRV9OQU1FID0gIl9FdGNoX0F1dGhFeGNlcHRpb24iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQ0hfRVhDRVBUSU9OX01FU1NBR0VfTkFNRSA9ICJfZXhjZXB0aW9uIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfRklFTERfTkFNRSA9ICJtc2ciOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfSURfRklFTERfTkFNRSA9ICJfbWVzc2FnZUlkIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTl9SRVBMWV9UT19GSUVMRF9OQU1FID0gIl9pblJlcGx5VG8iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9GSUVMRF9OQU1FID0gInJlc3VsdCI7CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgc3RhbmRhcmQgdHlwZXMgYW5kIGZpZWxkcyBuZWVkZWQgYnkKKwkgKiBhbGwgZXRjaCBnZW5lcmF0ZWQgdmFsdWUgZmFjdG9yaWVzLgorCSAqIEBwYXJhbSB0eXBlcworCSAqIEBwYXJhbSBjbGFzczJ0eXBlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGluaXQoIFR5cGVNYXAgdHlwZXMsIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSApCisJeworCQlSdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5pbml0KAorCQkJdHlwZXMuZ2V0KCBFVENIX1JVTlRJTUVfRVhDRVBUSU9OX1RZUEVfTkFNRSApLCBjbGFzczJ0eXBlICk7CisJCQorCQlMaXN0U2VyaWFsaXplci5pbml0KAorCQkJdHlwZXMuZ2V0KCBFVENIX0xJU1RfVFlQRV9OQU1FICksIGNsYXNzMnR5cGUgKTsKKwkJCisJCU1hcFNlcmlhbGl6ZXIuaW5pdCgKKwkJCXR5cGVzLmdldCggRVRDSF9NQVBfVFlQRV9OQU1FICksIGNsYXNzMnR5cGUgKTsKKwkJCisJCVNldFNlcmlhbGl6ZXIuaW5pdCgKKwkJCXR5cGVzLmdldCggRVRDSF9TRVRfVFlQRV9OQU1FICksIGNsYXNzMnR5cGUgKTsKKwkJCisJCURhdGVTZXJpYWxpemVyLmluaXQoCisJCQl0eXBlcy5nZXQoIEVUQ0hfREFURVRJTUVfVFlQRV9OQU1FICksIGNsYXNzMnR5cGUgKTsKKwkJCisJCUF1dGhFeGNlcHRpb25TZXJpYWxpemVyLmluaXQoCisJCQl0eXBlcy5nZXQoIEVUQ0hfQVVUSF9FWENFUFRJT05fVFlQRV9OQU1FICksIGNsYXNzMnR5cGUgKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0gX210X19FdGNoX0F1dGhFeGNlcHRpb24gLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQl7CisJCQlmaW5hbCBUeXBlIHQgPSB0eXBlcy5nZXQoIEVUQ0hfRVhDRVBUSU9OX01FU1NBR0VfTkFNRSApOworCQkJdC5wdXRWYWxpZGF0b3IoIF9tZl9yZXN1bHQsIFZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uLmdldCgpICk7CisJCQl0LnB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCQl0LnB1dFZhbGlkYXRvciggX21mX19pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCX0KKwl9CisJCisJLyoqCisJICogVGhlIG1zZyBmaWVsZCBvZiB0aGUgc3RhbmRhcmQgdW5jaGVja2VkIGV4Y2VwdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkIF9tZl9tc2cgPSBuZXcgRmllbGQoIE1TR19GSUVMRF9OQU1FICk7CisJCisJLyoqCisJICogIFRoZSB3ZWxsLWtub3duIF9tZXNzYWdlSWQgZmllbGQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBGaWVsZCBfbWZfX21lc3NhZ2VJZCA9IG5ldyBGaWVsZCggTUVTU0FHRV9JRF9GSUVMRF9OQU1FICk7CisJCisJLyoqCisJICogVGhlIHdlbGwta25vd24gX2luUmVwbHlUbyBmaWVsZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkIF9tZl9faW5SZXBseVRvID0gbmV3IEZpZWxkKCBJTl9SRVBMWV9UT19GSUVMRF9OQU1FICk7CisJCisJLyoqCisJICogVGhlIHdlbGwta25vd24gcmVzdWx0IGZpZWxkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRmllbGQgX21mX3Jlc3VsdCA9IG5ldyBGaWVsZCggUkVTVUxUX0ZJRUxEX05BTUUgKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVmFsdWVGYWN0b3J5IGltcGwgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIERlZmF1bHRWYWx1ZUZhY3RvcnkuCisJICogQHBhcmFtIHVyaSB1cmkgb2YgdGhpcyB0cmFuc3BvcnQgc3RhY2suCisJICogQHBhcmFtIHR5cGVzIHRoZSB0eXBlIG1hcCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB2YWx1ZSBmYWN0b3J5LgorCSAqIEBwYXJhbSBjbGFzczJ0eXBlIHRoZSBjbGFzcyB0byB0eXBlIG1hcCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB2YWx1ZSBmYWN0b3J5LgorCSAqLworCXB1YmxpYyBEZWZhdWx0VmFsdWVGYWN0b3J5KCBTdHJpbmcgdXJpLCBUeXBlTWFwIHR5cGVzLAorCQlDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorCXsKKwkJVVJMIHUgPSBuZXcgVVJMKCB1cmkgKTsKKwkJCisJCWxldmVsID0gTGV2ZWwudmFsdWVPZiggdS5nZXRUZXJtKCAiRGVmYXVsdFZhbHVlRmFjdG9yeS5sZXZlbCIsICJGVUxMIiApICk7CisJCQorCQl0aGlzLnR5cGVzID0gdHlwZXM7CisJCXRoaXMuY2xhc3MydHlwZSA9IGNsYXNzMnR5cGU7CisJCQorCQlfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiA9IHR5cGVzLmdldCggRVRDSF9SVU5USU1FX0VYQ0VQVElPTl9UWVBFX05BTUUgKTsKKwkJX210X19FdGNoX0xpc3QgPSB0eXBlcy5nZXQoIEVUQ0hfTElTVF9UWVBFX05BTUUgKTsKKwkJX210X19FdGNoX01hcCA9IHR5cGVzLmdldCggRVRDSF9NQVBfVFlQRV9OQU1FICk7CisJCV9tdF9fRXRjaF9TZXQgPSB0eXBlcy5nZXQoIEVUQ0hfU0VUX1RZUEVfTkFNRSApOworCQlfbXRfX0V0Y2hfRGF0ZXRpbWUgPSB0eXBlcy5nZXQoIEVUQ0hfREFURVRJTUVfVFlQRV9OQU1FICk7CisJCV9tdF9fRXRjaF9BdXRoRXhjZXB0aW9uID0gdHlwZXMuZ2V0KCBFVENIX0FVVEhfRVhDRVBUSU9OX1RZUEVfTkFNRSApOworCQlfbXRfX2V4Y2VwdGlvbiA9IHR5cGVzLmdldCggRVRDSF9FWENFUFRJT05fTUVTU0FHRV9OQU1FICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgVHlwZU1hcCB0eXBlczsKKwkKKwlwcml2YXRlIGZpbmFsIFR5cGVNYXAgZHluYW1pY1R5cGVzID0gbmV3IFR5cGVNYXAoKTsKKworCXByaXZhdGUgZmluYWwgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlOworCQorCXByaXZhdGUgZmluYWwgVHlwZSBfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbjsKKwkKKwlwcml2YXRlIGZpbmFsIFR5cGUgX210X19FdGNoX0xpc3Q7CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIF9tdF9fRXRjaF9NYXA7CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIF9tdF9fRXRjaF9TZXQ7CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIF9tdF9fRXRjaF9EYXRldGltZTsKKwkKKwlwcml2YXRlIGZpbmFsIFR5cGUgX210X19FdGNoX0F1dGhFeGNlcHRpb247CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIF9tdF9fZXhjZXB0aW9uOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIF9tdF9fRXRjaF9SdW50aW1lRXhjZXB0aW9uLgorCSAqLworCXB1YmxpYyBmaW5hbCBUeXBlIGdldF9tdF9fRXRjaF9SdW50aW1lRXhjZXB0aW9uKCkKKwl7CisJCXJldHVybiBfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbjsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgc3RhbmRhcmQgX210X19FdGNoX0xpc3QuCisJICovCisJcHVibGljIGZpbmFsIFR5cGUgZ2V0X210X19FdGNoX0xpc3QoKQorCXsKKwkJcmV0dXJuIF9tdF9fRXRjaF9MaXN0OworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBfbXRfX0V0Y2hfTWFwLgorCSAqLworCXB1YmxpYyBmaW5hbCBUeXBlIGdldF9tdF9fRXRjaF9NYXAoKQorCXsKKwkJcmV0dXJuIF9tdF9fRXRjaF9NYXA7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIF9tdF9fRXRjaF9TZXQuCisJICovCisJcHVibGljIGZpbmFsIFR5cGUgZ2V0X210X19FdGNoX1NldCgpCisJeworCQlyZXR1cm4gX210X19FdGNoX1NldDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgc3RhbmRhcmQgX210X19FdGNoX0RhdGV0aW1lLgorCSAqLworCXB1YmxpYyBmaW5hbCBUeXBlIGdldF9tdF9fRXRjaF9EYXRldGltZSgpCisJeworCQlyZXR1cm4gX210X19FdGNoX0RhdGV0aW1lOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBfbXRfX0V0Y2hfQXV0aEV4Y2VwdGlvbi4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVHlwZSBnZXRfbXRfX0V0Y2hfQXV0aEV4Y2VwdGlvbigpCisJeworCQlyZXR1cm4gX210X19FdGNoX0F1dGhFeGNlcHRpb247CisJfQorCQorCXB1YmxpYyBmaW5hbCBUeXBlIGdldF9tdF9fZXhjZXB0aW9uKCkKKwl7CisJCXJldHVybiBfbXRfX2V4Y2VwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgdmFsdWUgZmFjdG9yeSBhcyBhIG1peGluIHRvIHRoaXMgb25lLgorCSAqIEBwYXJhbSB2ZgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE1peGluKCBWYWx1ZUZhY3RvcnkgdmYgKQorCXsKKwkJVmFsdWVGYWN0b3J5W10gbmV3TWl4aW5zID0gbmV3IFZhbHVlRmFjdG9yeVttaXhpbnMubGVuZ3RoKzFdOworCQlTeXN0ZW0uYXJyYXljb3B5KCBtaXhpbnMsIDAsIG5ld01peGlucywgMCwgbWl4aW5zLmxlbmd0aCApOworCQluZXdNaXhpbnNbbWl4aW5zLmxlbmd0aF0gPSB2ZjsKKwkJbWl4aW5zID0gbmV3TWl4aW5zOworCX0KKwkKKwlwcml2YXRlIFZhbHVlRmFjdG9yeVtdIG1peGlucyA9IHt9OworCQorCXB1YmxpYyBmaW5hbCBUeXBlIGdldFR5cGUoIEludGVnZXIgaWQgKQorCXsKKwkJVHlwZSB0eXBlID0gdHlwZXMuZ2V0KCBpZCApOworCQlpZiAodHlwZSAhPSBudWxsKQorCQkJcmV0dXJuIHR5cGU7CisJCQorCQlmb3IgKFZhbHVlRmFjdG9yeSB2ZjogbWl4aW5zKQorCQkJaWYgKCh0eXBlID0gdmYuZ2V0VHlwZSggaWQgKSkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gdHlwZTsKKworCQlzeW5jaHJvbml6ZWQgKGR5bmFtaWNUeXBlcykKKwkJeworCQkJcmV0dXJuIGR5bmFtaWNUeXBlcy5nZXQoIGlkICk7CisJCX0KKwl9CisKKwlwdWJsaWMgZmluYWwgVHlwZSBnZXRUeXBlKCBTdHJpbmcgbmFtZSApCisJeworCQlUeXBlIHR5cGUgPSB0eXBlcy5nZXQoIG5hbWUgKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkKKwkJCXJldHVybiB0eXBlOworCQkKKwkJZm9yIChWYWx1ZUZhY3RvcnkgdmY6IG1peGlucykKKwkJCWlmICgodHlwZSA9IHZmLmdldFR5cGUoIG5hbWUgKSkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gdHlwZTsKKwkJCisJCXN5bmNocm9uaXplZCAoZHluYW1pY1R5cGVzKQorCQl7CisJCQlyZXR1cm4gZHluYW1pY1R5cGVzLmdldCggbmFtZSApOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkVHlwZSggVHlwZSB0eXBlICkKKwl7CisJCXRyeQorCQl7CisJCQlzeW5jaHJvbml6ZWQgKGR5bmFtaWNUeXBlcykKKwkJCXsKKwkJCQlkeW5hbWljVHlwZXMuYWRkKCB0eXBlICk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZS4KKwkJfQorCX0KKwkKKwlwdWJsaWMgZmluYWwgU2V0PFR5cGU+IGdldFR5cGVzKCkKKwl7CisJCVNldDxUeXBlPiB2YWx1ZXMgPSB0eXBlcy52YWx1ZXMoKTsKKwkJCisJCWZvciAoVmFsdWVGYWN0b3J5IHZmOiBtaXhpbnMpCisJCQl2YWx1ZXMuYWRkQWxsKCB2Zi5nZXRUeXBlcygpICk7CisKKwkJc3luY2hyb25pemVkIChkeW5hbWljVHlwZXMpCisJCXsKKwkJCXZhbHVlcy5hZGRBbGwoIGR5bmFtaWNUeXBlcy52YWx1ZXMoKSApOworCQl9CisJCQorCQlyZXR1cm4gdmFsdWVzOworCX0KKworCXB1YmxpYyBmaW5hbCBTdHJ1Y3RWYWx1ZSBleHBvcnRDdXN0b21WYWx1ZSggT2JqZWN0IHZhbHVlICkKKwl7CisJCUNsYXNzPD8+IGNsc3MgPSB2YWx1ZS5nZXRDbGFzcygpOworCQkKKwkJVHlwZSB0eXBlID0gZ2V0Q3VzdG9tU3RydWN0VHlwZSggY2xzcyApOworCQkKKwkJaWYgKHR5cGUgPT0gbnVsbCAmJiBjbHNzID09IFN0cnVjdFZhbHVlLmNsYXNzKQorCQl7CisJCQlTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgPSAoU3RydWN0VmFsdWUpIHZhbHVlOworCQkJdHlwZSA9IHN0cnVjdC50eXBlKCk7CisJCX0KKwkJCisJCWlmICh0eXBlID09IG51bGwpCisJCXsKKwkJCWlmIChUaHJvd2FibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggY2xzcyApKQorCQkJCXR5cGUgPSBfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbjsKKwkJCWVsc2UgaWYgKExpc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggY2xzcyApKQorCQkJCXR5cGUgPSBfbXRfX0V0Y2hfTGlzdDsKKwkJCWVsc2UgaWYgKE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBjbHNzICkpCisJCQkJdHlwZSA9IF9tdF9fRXRjaF9NYXA7CisJCQllbHNlIGlmIChTZXQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggY2xzcyApKQorCQkJCXR5cGUgPSBfbXRfX0V0Y2hfU2V0OworCQkJZWxzZQorCQkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlJbXBvcnRFeHBvcnRIZWxwZXIgaGVscGVyID0gdHlwZS5nZXRJbXBvcnRFeHBvcnRIZWxwZXIoKTsKKwkJCisJCWlmIChoZWxwZXIgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJcmV0dXJuIGhlbHBlci5leHBvcnRWYWx1ZSggdGhpcywgdmFsdWUgKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgT2JqZWN0IGltcG9ydEN1c3RvbVZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCXsKKwkJSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlciA9IHN0cnVjdC50eXBlKCkuZ2V0SW1wb3J0RXhwb3J0SGVscGVyKCk7CisJCQorCQlpZiAoaGVscGVyID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBoZWxwZXIuaW1wb3J0VmFsdWUoIHN0cnVjdCApOworCX0KKworCXB1YmxpYyBmaW5hbCBUeXBlIGdldEN1c3RvbVN0cnVjdFR5cGUoIENsYXNzPD8+IGMgKQorCXsKKwkJVHlwZSB0eXBlID0gY2xhc3MydHlwZS5nZXQoIGMgKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkKKwkJCXJldHVybiB0eXBlOworCQkKKwkJZm9yIChWYWx1ZUZhY3RvcnkgdmY6IG1peGlucykKKwkJCWlmICgodHlwZSA9IHZmLmdldEN1c3RvbVN0cnVjdFR5cGUoIGMgKSkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gdHlwZTsKKwkJCisJCXJldHVybiBudWxsOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNUUklORyBFTkNPRElORyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nRW5jb2RpbmcoKQorCXsKKwkJcmV0dXJuICJ1dGYtOCI7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLworCS8vIE1FU1NBR0UgSUQgLy8KKwkvLy8vLy8vLy8vLy8vLy8vCisKKwlwdWJsaWMgZmluYWwgTG9uZyBnZXRNZXNzYWdlSWQoIE1lc3NhZ2UgbXNnICkKKwl7CisJCXJldHVybiAoTG9uZykgbXNnLmdldCggX21mX19tZXNzYWdlSWQgKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgdm9pZCBzZXRNZXNzYWdlSWQoIE1lc3NhZ2UgbXNnLCBMb25nIG1zZ2lkICkKKwl7CisJCW1zZy5wdXQoIF9tZl9fbWVzc2FnZUlkLCBtc2dpZCApOworCX0KKworCXB1YmxpYyBGaWVsZCBnZXRfbWZfX21lc3NhZ2VJZCgpCisJeworCQlyZXR1cm4gX21mX19tZXNzYWdlSWQ7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTiBSRVBMWSBUTyAvLworCS8vLy8vLy8vLy8vLy8vLy8vCisKKwlwdWJsaWMgZmluYWwgTG9uZyBnZXRJblJlcGx5VG8oIE1lc3NhZ2UgbXNnICkKKwl7CisJCXJldHVybiAoTG9uZykgbXNnLmdldCggX21mX19pblJlcGx5VG8gKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgdm9pZCBzZXRJblJlcGx5VG8oIE1lc3NhZ2UgbXNnLCBMb25nIG1zZ2lkICkKKwl7CisJCW1zZy5wdXQoIF9tZl9faW5SZXBseVRvLCBtc2dpZCApOworCX0KKworCXB1YmxpYyBGaWVsZCBnZXRfbWZfX2luUmVwbHlUbygpCisJeworCQlyZXR1cm4gX21mX19pblJlcGx5VG87CisJfQorCisJcHVibGljIHZvaWQgbG9ja0R5bmFtaWNUeXBlcygpCisJeworCQlkeW5hbWljVHlwZXMubG9jaygpOworCX0KKworCXB1YmxpYyBMZXZlbCBnZXRMZXZlbCgpCisJeworCQlyZXR1cm4gbGV2ZWw7CisJfQorCisJcHVibGljIExldmVsIHNldExldmVsKCBMZXZlbCBsZXZlbCApCisJeworCQlMZXZlbCBvbGRMZXZlbCA9IHRoaXMubGV2ZWw7CisJCXRoaXMubGV2ZWwgPSBsZXZlbDsKKwkJcmV0dXJuIG9sZExldmVsOworCX0KKworCXByaXZhdGUgTGV2ZWwgbGV2ZWwgPSBMZXZlbC5GVUxMOworCisJcHVibGljIHZvaWQgdW5sb2NrRHluYW1pY1R5cGVzKCkKKwl7CisJCS8vIFRPRE8gaW1wbGVtZW50IGR5bmFtaWNUeXBlcy51bmxvY2soKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5sb2NrRHluYW1pY1R5cGVzIG5vdCBpbXBsZW1lbnRlZCIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvRGVsaXZlcnlTZXJ2aWNlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvRGVsaXZlcnlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhNWFkMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9EZWxpdmVyeVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZTsKKworLyoqCisgKiBBZGFwdGVyIGJldHdlZW4gcmVtb3RlIGFuZCBtZXNzYWdlIHNvdXJjZS4KKyAqLworcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVNlcnZpY2UgZXh0ZW5kcyBTZXNzaW9uTWVzc2FnZSwgVHJhbnNwb3J0TWVzc2FnZQoreworCS8qKgorCSAqIFNlbmRzIHRoZSBtZXNzYWdlIHdoaWNoIGJlZ2lucyBhIGNhbGwgc2VxdWVuY2UuCisJICogCisJICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB0byBzZW5kLgorCSAqIEByZXR1cm4gYSBtYWlsYm94IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIHJlc3BvbnNlLCB1c2luZworCSAqIHtAbGluayAjZW5kY2FsbChNYWlsYm94LCBUeXBlKX0uCisJICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNlbmRpbmcKKwkgKi8KKwlwdWJsaWMgTWFpbGJveCBiZWdpbmNhbGwoIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIEZpbmlzaGVzIGEgY2FsbCBzZXF1ZW5jZSBieSB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWIgYSBtYWlsYm94IHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZWFkIHRoZSByZXNwb25zZSwgcmV0dXJuZWQgYnkKKwkgKiB7QGxpbmsgI2JlZ2luY2FsbChNZXNzYWdlKX0uCisJICogQHBhcmFtIHJlc3BvbnNlVHlwZSB0aGUgdHlwZSBvZiB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UuCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIGZpZWxkIGlmIGl0IGlzbid0IGFuIGV4Y2VwdGlvbi4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2VuZGluZyBvciBhIHRpbWVvdXQgd2FpdGluZyBvcgorCSAqIGlmIHRoZSByZXN1bHQgdmFsdWUgd2FzIGFuIGV4Y2VwdGlvbi4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGVuZGNhbGwoIE1haWxib3ggbWIsIFR5cGUgcmVzcG9uc2VUeXBlICkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9EdW1teVZhbHVlRmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L0R1bW15VmFsdWVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxODc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9EdW1teVZhbHVlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvci5MZXZlbDsKKworCisvKiogRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgVmFsdWVGYWN0b3J5IHVzZWQgZm9yIHRlc3RpbmcuICovCitwdWJsaWMgY2xhc3MgRHVtbXlWYWx1ZUZhY3RvcnkgaW1wbGVtZW50cyBWYWx1ZUZhY3RvcnkKK3sKKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0Q3VzdG9tVmFsdWUoIE9iamVjdCB2YWx1ZSApCisJCXRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFR5cGUgZ2V0Q3VzdG9tU3RydWN0VHlwZSggQ2xhc3M8Pz4gYyApCisJCXRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIExvbmcgZ2V0SW5SZXBseVRvKCBNZXNzYWdlIG1zZyApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRNZXNzYWdlSWQoIE1lc3NhZ2UgbXNnICkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nRW5jb2RpbmcoKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFR5cGUgZ2V0VHlwZSggSW50ZWdlciBpZCApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgVHlwZSBnZXRUeXBlKCBTdHJpbmcgbmFtZSApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgU2V0PFR5cGU+IGdldFR5cGVzKCkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBUeXBlIGdldF9tdF9fZXhjZXB0aW9uKCkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBPYmplY3QgaW1wb3J0Q3VzdG9tVmFsdWUoIFN0cnVjdFZhbHVlIHN0cnVjdCApCisJCXRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5SZXBseVRvKCBNZXNzYWdlIG1zZywgTG9uZyBtc2dpZCApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlSWQoIE1lc3NhZ2UgbXNnLCBMb25nIG1zZ2lkICkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFR5cGUoIFR5cGUgdHlwZSApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgRmllbGQgZ2V0X21mX19pblJlcGx5VG8oKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEZpZWxkIGdldF9tZl9fbWVzc2FnZUlkKCkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIGxvY2tEeW5hbWljVHlwZXMoKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgdW5sb2NrRHluYW1pY1R5cGVzKCkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBMZXZlbCBzZXRMZXZlbCggTGV2ZWwgbGV2ZWwgKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIExldmVsIGdldExldmVsKCkKKwl7CisJCXJldHVybiBMZXZlbC5GVUxMOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvRnJlZVBvb2wuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9GcmVlUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmY3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvRnJlZVBvb2wuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworLyoqCisgKiBBIGZyZWUgaW1wbGVtZW50YXRpb24gb2YgUG9vbC4KKyAqLworcHVibGljIGNsYXNzIEZyZWVQb29sIGltcGxlbWVudHMgUG9vbAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBGcmVlUG9vbCB3aXRoIHNwZWNpZmllZCBtYXhTaXplLgorCSAqIEBwYXJhbSBtYXhTaXplIG1heGltdW0gbnVtYmVyIG9mIGZyZWUgdGhyZWFkcyBhdCBvbmUKKwkgKiB0aW1lLiBhZnRlciB0aGF0LCByZWplY3QgcmVxdWVzdHMuCisJICovCisJcHVibGljIEZyZWVQb29sKCBpbnQgbWF4U2l6ZSApCisJeworCQl0aGlzLm1heFNpemUgPSBtYXhTaXplOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgRnJlZVBvb2wgd2l0aCBtYXhTaXplIDUwLgorCSAqLworCXB1YmxpYyBGcmVlUG9vbCgpCisJeworCQl0aGlzKCA1MCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIGludCBtYXhTaXplOworCQorCXByaXZhdGUgZmluYWwgVGhyZWFkR3JvdXAgdGcgPSBuZXcgVGhyZWFkR3JvdXAoICJGcmVlUG9vbFRocmVhZEdyb3VwIiApOworCQorCXByaXZhdGUgYm9vbGVhbiBvcGVuID0gdHJ1ZTsKKwkKKwkvKioKKwkgKiBDbG9zZXMgdGhlIHBvb2wuIFRoaXMganVzdCBtYXJrcyB0aGUgcG9vbCBhcyBiZWluZyBjbG9zZWQsIGl0IGRvZXNuJ3QKKwkgKiBhY3R1YWxseSBkbyBhbnl0aGluZyB0byB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkLiBCdXQgbm8gbW9yZQorCSAqIHRocmVhZHMgYXJlIGFsbG93ZWQgdG8gc3RhcnQuCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKQorCXsKKwkJb3BlbiA9IGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBKb2lucyBlYWNoIG9mIHRoZSB0aHJlYWRzIGluIHRoaXMgcG9vbCB1bnRpbCB0aGVyZQorCSAqIGFyZSBub25lIGxlZnQuIFRoZSBwb29sIHdpbGwgYmUgY2xvc2VkIGZpcnN0LgorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBqb2luKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQljbG9zZSgpOworCQlUaHJlYWRbXSBsaXN0ID0gbmV3IFRocmVhZFsxMF07CisJCWludCBuOworCQl3aGlsZSAoKG4gPSB0Zy5lbnVtZXJhdGUoIGxpc3QgKSkgPiAwKQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJbGlzdFtpXS5qb2luKCk7CisJfQorCQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBydW4oIGZpbmFsIFBvb2xSdW5uYWJsZSBydW5uYWJsZSApCisJeworCQlpZiAoIW9wZW4gfHwgdGcuYWN0aXZlQ291bnQoKSA+PSBtYXhTaXplKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggImZyZWUgcG9vbCB0aHJlYWQgY291bnQgZXhjZWVkZWQgb3IgcG9vbCBjbG9zZWQiICk7CisJCQorCQluZXcgVGhyZWFkKCB0ZywgbmV3IFJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCXJ1bm5hYmxlLnJ1bigpOworCQkJCX0KKwkJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCXJ1bm5hYmxlLmV4Y2VwdGlvbiggZSApOworCQkJCX0KKwkJCX0KKwkJfSApLnN0YXJ0KCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9NYWlsYm94LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvTWFpbGJveC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTU0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvTWFpbGJveC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisKKy8qKgorICogQW4gaW50ZXJmYWNlIHVzZWQgdG8gZGVsaXZlciByZXNwb25zZXMgdG8gYSBtZXNzYWdlLiBTdXBwb3J0IGZvcgorICogdGhlIG1lY2hhbmlzbSBpcyBzb21ld2hhdCBkZXBlbmRlbnQgdXBvbiBwcm9wZXJ0aWVzIG9mIHRoZSB0cmFuc3BvcnQKKyAqIGFuZCBtZXNzYWdlIGZvcm1hdC4KKyAqLworcHVibGljIGludGVyZmFjZSBNYWlsYm94Cit7CisJLyoqCisJICogQHJldHVybiB0aGUgbWVzc2FnZSBpZCBvZiB0aGlzIG1haWxib3guCisJICovCisJcHVibGljIExvbmcgZ2V0TWVzc2FnZUlkKCk7CisKKwkvKioKKwkgKiBRdWV1ZXMgdGhlIG1lc3NhZ2UgdG8gdGhlIG1haWxib3guCisJICogQHBhcmFtIHNlbmRlcgorCSAqIEBwYXJhbSBtc2cKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIGFjY2VwdGVkLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gbWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uOworCisJLyoqCisJICogQHJldHVybiB0aGUgbmV4dCBtZXNzYWdlIHRvIGJlIHJlYWQgZnJvbSB0aGUgbWFpbGJveCwgb3IgbnVsbCBpZgorCSAqIHRoZSBtYWlsYm94IGlzIGVtcHR5IGFuZCBjbG9zZWQuIFdhaXQgZm9yZXZlciBmb3Igc3VjaCBhIG1lc3NhZ2UKKwkgKiB0byBiZSBkZWxpdmVyZWQuCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJlYWQgaW50ZXJydXB0LgorCSAqLworCXB1YmxpYyBFbGVtZW50IHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CisKKwkvKioKKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvCisJICogd2FpdCB0byByZWFkIGEgbWVzc2FnZSBmcm9tIGFuIGVtcHR5IG1haWxib3guIDAgbWVhbnMgd2FpdAorCSAqIGZvcmV2ZXIsIC0xIG1lYW5zIGRvbid0IHdhaXQgYXQgYWxsLgorCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgcmVhZCBmcm9tIHRoZSBtYWlsYm94LCBvciBudWxsIGlmIHRoZSBtYWlsYm94CisJICogaXMgZW1wdHkgYW5kIGNsb3NlZCwgb3IgaWYgdGhlIHRpbWUgbGltaXQgd2FzIGV4Y2VlZWRlZC4KKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocmVhZCBpbnRlcnJ1cHQuCisJICovCisJcHVibGljIEVsZW1lbnQgcmVhZCggaW50IG1heERlbGF5ICkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOworCQorCS8qKgorCSAqIENsb3NlcyB0aGUgbWFpbGJveCBzbyB0aGF0IG5vIG1vcmUgbWVzc2FnZXMgY2FuIGJlIGRlbGl2ZXJlZC4KKwkgKiBRdWV1ZWQgbWVzc2FnZXMgcmVtYWluIHRvIGJlIHJlYWQuIFJlYWRpbmcgYW4gZW1wdHkgY2xvc2VkCisJICogbWFpbGJveCByZXR1cm5zIG51bGwuCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbCBjbG9zZWQgdGhlIG1haWxib3ggKHRoYXQgaXMsIGlmIGFjdGlvbiB3YXMKKwkgKiB0YWtlbiksIGZhbHNlIGlmIHRoZSBtYWlsYm94IHdhcyBhbHJlYWR5IGNsb3NlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjbG9zZURlbGl2ZXJ5KCk7CisJCisJLyoqCisJICogQ2xvc2VzIHRoZSBtYWlsYm94IHNvIHRoYXQgbm8gbW9yZSBtZXNzYWdlcyB3aWxsIGJlIGRlbGl2ZXJlZCBvcgorCSAqIHJlYWQuIEFueSByZW1haW5pbmcgcXVldWVkIG1lc3NhZ2VzIGFyZSBkZWxpdmVyZWQgdG8gYSBkZWZhdWx0CisJICogaGFuZGxlci4KKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjYWxsIGNsb3NlZCB0aGUgbWFpbGJveCAodGhhdCBpcywgaWYgYWN0aW9uIHdhcworCSAqIHRha2VuKSwgZmFsc2UgaWYgdGhlIG1haWxib3ggd2FzIGFscmVhZHkgY2xvc2VkLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gY2xvc2VSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZWdpc3RlcnMgYSBOb3RpZnkgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIHRvIHJlY2VpdmUgYSBjYWxsYmFjaworCSAqIHdoZW4gYSBtYWlsYm94J3Mgc3RhdHVzIGlzIGNoYW5nZWQuCisJICogQHBhcmFtIG5vdGlmeSBhIE5vdGlmeSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gdG8gcmVwb3J0IHRoZQorCSAqIGRlbGl2ZXJ5IHN0YXR1cyB0by4KKwkgKiBAcGFyYW0gc3RhdGUgYSBzdGF0ZSB2YWx1ZSB0byBwYXNzIHRocnUgdG8gdGhlIE5vdGlmeSBpbnRlcmZhY2UKKwkgKiBpbXBsZW1lbnRhdGlvbi4KKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvCisJICogd2FpdCBmb3IgZGVsaXZlcnkgb2YgYSBtZXNzYWdlIHRvIHRoZSBtYWlsYm94LiAwIG1lYW5zIHdhaXQKKwkgKiBmb3JldmVyLiBUaGUgbWFpbGJveCBpcyBjbG9zZWQgdXBvbiB0aW1lb3V0LgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdGlmeSBhbHJlYWR5IHJlZ2lzdGVyZWQuCisJICovCisJcHVibGljIHZvaWQgcmVnaXN0ZXJOb3RpZnkoIE5vdGlmeSBub3RpZnksIE9iamVjdCBzdGF0ZSwgaW50IG1heERlbGF5ICk7CisJCisJLyoqCisJICogVW5yZWdpc3RlcnMgYSBOb3RpZnkgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZyb20gcmVjZWl2aW5nIGEgY2FsbGJhY2sKKwkgKiB3aGVuIGEgbWFpbGJveCdzIHN0YXR1cyBpcyBjaGFuZ2VkLiBDYW5jZWxzIGFueSB0aW1lb3V0LgorCSAqIEBwYXJhbSBub3RpZnkgYSBOb3RpZnkgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIHdoaWNoIHdhcyBwcmV2aW91c2x5CisJICogcmVnaXN0ZXJlZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aGUgc3BlY2lmaWVkIG5vdGlmeSBpcyBub3QgcmVnaXN0ZXJlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTm90aWZ5KCBOb3RpZnkgbm90aWZ5ICk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1haWxib3ggaXMgZW1wdHkuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFpbGJveCBpcyBjbG9zZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFpbGJveCBpcyBmdWxsLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRnVsbCgpOworCQorCS8qKgorCSAqIFRoZSBtZXNzYWdlIGFzIHF1ZXVlZCwgaW5jbHVkaW5nIHNyYyBhbmQgc2VuZGVyLgorCSAqLworCXB1YmxpYyBmaW5hbCBjbGFzcyBFbGVtZW50CisJeworCQkvKioKKwkJICogQHBhcmFtIHNlbmRlciB0aGUgbWVzc2FnZSBzZW5kZXIuCisJCSAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UuCisJCSAqLworCQlwdWJsaWMgRWxlbWVudCggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKQorCQl7CisJCQl0aGlzLnNlbmRlciA9IHNlbmRlcjsKKwkJCXRoaXMubXNnID0gbXNnOworCQl9CisJCQorCQkvKioKKwkJICogVGhlIG1lc3NhZ2Ugc2VuZGVyLgorCQkgKi8KKwkJCisJCXB1YmxpYyBmaW5hbCBXaG8gc2VuZGVyOworCQkvKioKKwkJICogdGhlIG1lc3NhZ2UuCisJCSAqLworCQlwdWJsaWMgZmluYWwgTWVzc2FnZSBtc2c7CisJfQorCQorCS8qKgorCSAqIEludGVyZmFjZSB1c2VkIHRvIG5vdGlmeSBvZiBtYWlsYm94IHN0YXR1cy4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIE5vdGlmeQorCXsKKwkJLyoqCisJCSAqIE5vdGlmaWVzIG9mIG1haWxib3ggc3RhdHVzIGNoYW5nZS4KKwkJICogQHBhcmFtIG1iIHRoZSBtYWlsYm94IHdob3NlIHN0YXR1cyBoYXMgY2hhbmdlZC4KKwkJICogQHBhcmFtIHN0YXRlIHRoZSBzdGF0ZSBvYmplY3QgcGFzc2VkIGluIHRoZSByZWdpc3RlcgorCQkgKiBtZXRob2QuCisJCSAqIEBwYXJhbSBjbG9zZWQgdHJ1ZSBpZiB0aGUgbWFpbGJveCB0aW1lb3V0IGhhcyBleHBpcmVkIGFuZAorCQkgKiB0aGUgbWFpbGJveCBpcyBub3cgY2xvc2VkIHRvIGRlbGl2ZXJ5LCBmYWxzZSBpZiBhIG1lc3NhZ2UKKwkJICogaGFzIGFycml2ZWQuCisJCSAqLworCQlwdWJsaWMgdm9pZCBtYWlsYm94U3RhdHVzKCBNYWlsYm94IG1iLCBPYmplY3Qgc3RhdGUsIGJvb2xlYW4gY2xvc2VkICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L051bGxQb29sLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvTnVsbFBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWM1NzFhCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L051bGxQb29sLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKKy8qKgorICogQSBwb29sIHdoaWNoIHJ1bnMgdGhlIHJ1bm5hYmxlIGRpcmVjdGx5LgorICovCitwdWJsaWMgY2xhc3MgTnVsbFBvb2wgaW1wbGVtZW50cyBQb29sCit7CisJcHVibGljIHZvaWQgcnVuKCBQb29sUnVubmFibGUgcnVubmFibGUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cnkKKwkJeworCQkJcnVubmFibGUucnVuKCk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXJ1bm5hYmxlLmV4Y2VwdGlvbiggZSApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L09ialNlc3Npb24uamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9PYmpTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkNTBhMAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9PYmpTZXNzaW9uLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKKy8qKgorICogT3V0LW9mLWJhbmQgcXVlcnksIGNvbnRyb2wsIGFuZCBub3RpZmljYXRpb24gaW50ZXJmYWNlIGZvciBzZXNzaW9ucy4KKyAqIFRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlNlc3Npb24gZXhjZXB0CisgKiB0aGUgbmFtZXMgYXJlIGNoYW5nZWQgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggc2VydmljZSBkZWZpbmVkIG5hbWVzLgorICogQHNlZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb24KKyAqLworcHVibGljIGludGVyZmFjZSBPYmpTZXNzaW9uCit7CisJLyoqCisJICogR2V0cyBhIGNvbmZpZ3VyYXRpb24gb3Igb3BlcmF0aW9uYWwgdmFsdWUgZnJvbSB0aGUgaGFuZGxlci4gVGhlCisJICogcmVxdWVzdCBpcyBwYXNzZWQgdXAgdGhlIGNoYWluIG9mIHNlc3Npb25zIHVudGlsIHNvbWUgc2Vzc2lvbgorCSAqIHJlY29nbml6ZXMgdGhlIHF1ZXJ5LCB3aGVyZXVwb24gaXQgcmV0dXJucyB0aGUgcmVxdWVzdGVkIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSBxdWVyeSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgcXVlcnksIHdoaWNoIGNvdWxkIGJlIGFzCisJICogc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworCSAqIGEgY2xhc3Mgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMgZm9yIHF1ZXJ5IHRlcm1zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgb3IgbnVsbCBpZiBub3QgZGVmaW5lZC4KKwkgKiAKKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBpcyBub3QgcmVjb2duaXplZAorCSAqIGJ5IGFueSBzZXNzaW9uICh3aGljaCBpcyB0byBzYXksIGlmIHRoZSBsYXN0IHNlc3Npb24gaW4gdGhlIHNlc3Npb24KKwkgKiBjaGFpbiBkb2VzIG5vdCByZWNvZ25pemUgaXQsIGl0IHNob3VsZCB0aHJvdyB0aGlzIGV4Y2VwdGlvbikuIFR5cGljYWxseQorCSAqIHRoaXMgd291bGQgYmUgYSBzZXJ2aWNlJ3MgY2xpZW50IG9yIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPYmplY3QgX3Nlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFNldHMgYSBjb25maWd1cmF0aW9uIG9yIG9wZXJhdGlvbmFsIHZhbHVlIGluIHRoZSBzZXNzaW9uLiBUaGUKKwkgKiByZXF1ZXN0IGlzIHBhc3NlZCB1cCB0aGUgY2hhaW4gb2Ygc2Vzc2lvbnMgdW50aWwgc29tZSBzZXNzaW9uCisJICogcmVjb2duaXplcyB0aGUgY29udHJvbCwgd2hlcmV1cG9uIGl0IHN0b3JlcyB0aGUgc3BlY2lmaWVkIHZhbHVlCisJICogYW5kIHJldHVybnMuCisJICogCisJICogQHBhcmFtIGNvbnRyb2wgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbnRyb2wsIHdoaWNoIGNvdWxkIGJlIGFzCisJICogc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworCSAqIGEgY2xhc3Mgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMgZm9yIGNvbnRyb2wgdGVybXMuCisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCisJICogCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQKKwkgKiB0eXBlIG9yIGlmIHRoZSB2YWx1ZSBpcyBpbmFwcHJvcHJpYXRlLgorCSAqIAorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIGNvbnRyb2wgaXMgbm90IHJlY29nbml6ZWQKKwkgKiBieSBhbnkgc2Vzc2lvbiAod2hpY2ggaXMgdG8gc2F5LCBpZiB0aGUgbGFzdCBzZXNzaW9uIGluIHRoZSBzZXNzaW9uCisJICogY2hhaW4gZG9lcyBub3QgcmVjb2duaXplIGl0LCBpdCBzaG91bGQgdGhyb3cgdGhpcyBleGNlcHRpb24pLiBUeXBpY2FsbHkKKwkgKiB0aGlzIHdvdWxkIGJlIGEgc2VydmljZSdzIGNsaWVudCBvciBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBfc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uOworCisJLyoqCisJICogTm90aWZpZXMgdGhlIGNoYWluIG9mIHNlc3Npb25zIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuIFVubGlrZSBxdWVyeQorCSAqIGFuZCBjb250cm9sIG9wZXJhdGlvbnMgYWJvdmUsIGV2ZW50cyBhcmUgYWx3YXlzIHBhc3NlZCB1cCB0byB0aGUKKwkgKiB0b3AgdG8gYWxsb3cgYWxsIHNlc3Npb25zIHRvIG5vdGljZSB0aGVtLgorCSAqIAorCSAqIEBwYXJhbSBldmVudCBhIGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LCBwb3NzaWJseSB3aXRoCisJICogcGFyYW1ldGVycy4gVGhlIHNpbXBsZXN0IGV2ZW50IGNvdWxkIGJlIGEgc3RyaW5nLCBpbnRlZ2VyLAorCSAqIG9yIGVudW0sIGJ1dCBhbnkgY2xhc3MgaW5zdGFuY2Ugd2lsbCBkbyAoYXMgbG9uZyBhcyBzb21lIHNlc3Npb24KKwkgKiBpbiB0aGUgY2hhaW4gZXhwZWN0cyBpdCkuCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBfc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9Qb29sLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMDM2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvUG9vbC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCisvKioKKyAqIEludGVyZmFjZSB0byBhIHF1ZXVlZCBvciBmcmVlIHRocmVhZCBwb29sLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFBvb2wKK3sKKwkvKioKKwkgKiBAcGFyYW0gcnVubmFibGUgdGhlIHRoaW5nIHRvIHJ1bi4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2NoZWR1bGluZyB0aGUKKwkgKiBydW5uYWJsZSB0byBydW4uCisJICovCisJdm9pZCBydW4oIFBvb2xSdW5uYWJsZSBydW5uYWJsZSApIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogQSBydW5uYWJsZSB3aGljaCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgUG9vbFJ1bm5hYmxlCisJeworCQkvKioKKwkJICogQHRocm93cyBFeGNlcHRpb24KKwkJICovCisJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb247CisKKwkJLyoqCisJCSAqIFJlcG9ydHMgYW4gZXhjZXB0aW9uIHRocm93biBieSB0aGUgcnVuIG1ldGhvZC4KKwkJICogQHBhcmFtIGUKKwkJICovCisJCXB1YmxpYyB2b2lkIGV4Y2VwdGlvbiggRXhjZXB0aW9uIGUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvUXVldWVkUG9vbC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1F1ZXVlZFBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFjMTkyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1F1ZXVlZFBvb2wuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRvZG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVG9kb01hbmFnZXI7CisKKy8qKgorICogQSBxdWV1ZWQgaW1wbGVtZW50YXRpb24gb2YgcG9vbC4KKyAqLworcHVibGljIGNsYXNzIFF1ZXVlZFBvb2wgaW1wbGVtZW50cyBQb29sCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgcXVldWVkIHBvb2wgd2l0aCBhIHNwZWNpZmllZCB0b2RvIG1hbmFnZXIuCisJICogQHBhcmFtIG1ncgorCSAqLworCXB1YmxpYyBRdWV1ZWRQb29sKCBUb2RvTWFuYWdlciBtZ3IgKQorCXsKKwkJdGhpcy5tZ3IgPSBtZ3I7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIHF1ZXVlZCBwb29sIHdpdGggYSBkZWZhdWx0IHRvZG8gbWFuYWdlci4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBRdWV1ZWRQb29sKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGhpcyggVG9kb01hbmFnZXIuZ2V0VG9kb01hbmFnZXIoKSApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFRvZG9NYW5hZ2VyIG1ncjsKKwkKKwlwdWJsaWMgdm9pZCBydW4oIGZpbmFsIFBvb2xSdW5uYWJsZSBydW5uYWJsZSApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIG1nci5hZGQoIG5ldyBUb2RvKCkKKyAgICAgICAgeworCQkJcHVibGljIHZvaWQgZG9pdCggVG9kb01hbmFnZXIgbWdyICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOworICAgICAgICAgICAgfQorCisJCQlwdWJsaWMgdm9pZCBleGNlcHRpb24oIFRvZG9NYW5hZ2VyIG1nciwgRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bm5hYmxlLmV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9SZW1vdGVCYXNlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvUmVtb3RlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmU5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvUmVtb3RlQmFzZS5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQuV2FpdERvd247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQuV2FpdFVwOworCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgY2FsbCB0byBtZXNzYWdlIHRyYW5zbGF0b3JzLgorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlQmFzZQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFJlbW90ZUJhc2UuCisJICoKKwkgKiBAcGFyYW0gc3ZjIHRoZSBkZWxpdmVyeSBzZXJ2aWNlIHVzZWQgdG8gc2VuZCBtZXNzYWdlcy4KKwkgKiBAcGFyYW0gdmYgdGhlIHZhbHVlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgbWVzc2FnZXMgYW5kIGVuY29kZS9kZWNvZGUgdHlwZXMuCisJICovCisJcHVibGljIFJlbW90ZUJhc2UoIERlbGl2ZXJ5U2VydmljZSBzdmMsIFZhbHVlRmFjdG9yeSB2ZiApCisJeworCQlfc3ZjID0gc3ZjOworCQlfdmYgPSB2ZjsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBEZWxpdmVyeVNlcnZpY2UgX3N2YzsKKwkKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSBfdmY7CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIiVzLyVzIiwgZ2V0Q2xhc3MoKS5nZXROYW1lKCksIF9zdmMgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIHRvIHNlbmQgdXNpbmcge0BsaW5rICNfc2VuZChNZXNzYWdlKX0gb3IKKwkgKiB7QGxpbmsgI19iZWdpbmNhbGwoTWVzc2FnZSl9OworCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLgorCSAqIEByZXR1cm4gYSBuZXcgbWVzc2FnZQorCSAqLworCXB1YmxpYyBmaW5hbCBNZXNzYWdlIF9uZXdNZXNzYWdlKCBUeXBlIHR5cGUgKQorCXsKKwkJcmV0dXJuIG5ldyBNZXNzYWdlKCB0eXBlLCBfdmYgKTsKKwl9CisJCisJLyoqCisJICogU2VuZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIHJlY2lwaWVudCwgYnV0IGRvZXMgbm90IHdhaXQgZm9yIGFueSByZXNwb25zZS4KKwkgKiAKKwkgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHRvIHNlbmQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2VuZGluZworCSAqLworCXB1YmxpYyB2b2lkIF9zZW5kKCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCV9zdmMudHJhbnNwb3J0TWVzc2FnZSggbnVsbCwgbXNnICk7CisJfQorCQorCS8qKgorCSAqIFNlbmRzIHRoZSBtZXNzYWdlIHdoaWNoIGJlZ2lucyBhIGNhbGwgc2VxdWVuY2UuCisJICogCisJICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB0byBzZW5kLgorCSAqIEByZXR1cm4gYSBtYWlsYm94IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIHJlc3BvbnNlLCB1c2luZworCSAqIHtAbGluayAjX2VuZGNhbGwoTWFpbGJveCwgVHlwZSl9LgorCSAqLworCXB1YmxpYyBNYWlsYm94IF9iZWdpbmNhbGwoIE1lc3NhZ2UgbXNnICkKKwl7CisJCXRyeQorCQl7CisJCQlyZXR1cm4gX3N2Yy5iZWdpbmNhbGwoIG1zZyApOworCQl9CisJCWNhdGNoICggUnVudGltZUV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgZTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEZpbmlzaGVzIGEgY2FsbCBzZXF1ZW5jZSBieSB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWIgYSBtYWlsYm94IHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZWFkIHRoZSByZXNwb25zZSwgcmV0dXJuZWQgYnkKKwkgKiB7QGxpbmsgI19iZWdpbmNhbGwoTWVzc2FnZSl9LgorCSAqIEBwYXJhbSByZXNwb25zZVR5cGUgdGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHJlc3BvbnNlLgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZXNwb25zZSBmaWVsZCBpZiBpdCBpc24ndCBhbiBleGNlcHRpb24uCisJICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNlbmRpbmcgb3IgYSB0aW1lb3V0IHdhaXRpbmcgb3IKKwkgKiBpZiB0aGUgcmVzdWx0IHZhbHVlIHdhcyBhbiBleGNlcHRpb24uCisJICovCisJcHVibGljIE9iamVjdCBfZW5kY2FsbCggTWFpbGJveCBtYiwgVHlwZSByZXNwb25zZVR5cGUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gX3N2Yy5lbmRjYWxsKCBtYiwgcmVzcG9uc2VUeXBlICk7CisJfQorCisJLyoqCisJICogR2V0cyBhIGNvbmZpZ3VyYXRpb24gb3Igb3BlcmF0aW9uYWwgdmFsdWUgZnJvbSB0aGUgc291cmNlLiBUaGUKKwkgKiByZXF1ZXN0IGlzIHBhc3NlZCBkb3duIHRoZSBjaGFpbiBvZiBzb3VyY2VzIHVudGlsIHNvbWUgc291cmNlCisJICogcmVjb2duaXplcyB0aGUgcXVlcnksIHdoZXJldXBvbiBpdCByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgdmFsdWUuCisJICogCisJICogQHBhcmFtIHF1ZXJ5IGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBxdWVyeSwgd2hpY2ggY291bGQgYmUgYXMKKwkgKiBzaW1wbGUgYXMgYSBzdHJpbmcsIGludGVnZXIsIG9yIGVudW0sIG9yIG1vcmUgY29tcGxleCBzdWNoIGFzCisJICogYSBjbGFzcyB3aXRoIGluc3RhbmNlIHZhcmlhYmxlcyBmb3IgcXVlcnkgdGVybXMuCisJICogCisJICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHZhbHVlLCBvciBudWxsIGlmIG5vdCBkZWZpbmVkLgorCSAqIAorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGlzIG5vdCByZWNvZ25pemVkCisJICogYnkgYW55IHNvdXJjZSAod2hpY2ggaXMgdG8gc2F5LCBpZiB0aGUgbGFzdCBzb3VyY2UgaW4gdGhlIHNvdXJjZQorCSAqIGNoYWluIGRvZXMgbm90IHJlY29nbml6ZSBpdCwgaXQgc2hvdWxkIHRocm93IHRoaXMgZXhjZXB0aW9uKS4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPYmplY3QgX3RyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gX3N2Yy50cmFuc3BvcnRRdWVyeSggcXVlcnkgKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGEgY29uZmlndXJhdGlvbiBvciBvcGVyYXRpb25hbCB2YWx1ZSBpbiB0aGUgc291cmNlLiBUaGUKKwkgKiByZXF1ZXN0IGlzIHBhc3NlZCBkb3duIHRoZSBjaGFpbiBvZiBzb3VyY2VzIHVudGlsIHNvbWUgc291cmNlCisJICogcmVjb2duaXplcyB0aGUgY29udHJvbCwgd2hlcmV1cG9uIGl0IHN0b3JlcyB0aGUgc3BlY2lmaWVkIHZhbHVlCisJICogYW5kIHJldHVybnMuCisJICogCisJICogQHBhcmFtIGNvbnRyb2wgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbnRyb2wsIHdoaWNoIGNvdWxkIGJlIGFzCisJICogc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworCSAqIGEgY2xhc3Mgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMgZm9yIGNvbnRyb2wgdGVybXMuCisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCisJICogCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQKKwkgKiB0eXBlIG9yIGlmIHRoZSB2YWx1ZSBpcyBpbmFwcHJvcHJpYXRlLgorCSAqIAorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIGNvbnRyb2wgaXMgbm90IHJlY29nbml6ZWQKKwkgKiBieSBhbnkgc291cmNlICh3aGljaCBpcyB0byBzYXksIGlmIHRoZSBsYXN0IHNvdXJjZSBpbiB0aGUgc291cmNlCisJICogY2hhaW4gZG9lcyBub3QgcmVjb2duaXplIGl0LCBpdCBzaG91bGQgdGhyb3cgdGhpcyBleGNlcHRpb24pLgorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgX3RyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlfc3ZjLnRyYW5zcG9ydENvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJfQorCisJLyoqCisJICogTm90aWZpZXMgdGhlIGNoYWluIG9mIHNvdXJjZXMgb2YgdGhlIHNwZWNpZmllZCBldmVudC4gVW5saWtlIHF1ZXJ5CisJICogYW5kIGNvbnRyb2wgb3BlcmF0aW9ucyBhYm92ZSwgZXZlbnRzIGFyZSBhbHdheXMgcGFzc2VkIGRvd24gdG8gdGhlCisJICogYm90dG9tIHRvIGFsbG93IGFsbCBzb3VyY2VzIHRvIG5vdGljZSB0aGVtLgorCSAqIAorCSAqIEBwYXJhbSBldmVudCBhIGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LCBwb3NzaWJseSB3aXRoCisJICogcGFyYW1ldGVycy4gVGhlIHNpbXBsZXN0IGV2ZW50IGNvdWxkIGJlIGEgc3RyaW5nLCBpbnRlZ2VyLAorCSAqIG9yIGVudW0sIGJ1dCBhbnkgY2xhc3MgaW5zdGFuY2Ugd2lsbCBkbyAoYXMgbG9uZyBhcyBzb21lIHNvdXJjZQorCSAqIGluIHRoZSBjaGFpbiBleHBlY3RzIGl0KS4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIF90cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCV9zdmMudHJhbnNwb3J0Tm90aWZ5KCBldmVudCApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb252ZW5pZW5jZSBvcGVyYXRpb25zIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIFN0YXJ0cyB0aGUgdHJhbnNwb3J0LgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICogQHNlZSAjX3RyYW5zcG9ydENvbnRyb2woT2JqZWN0LCBPYmplY3QpCisJICogQHNlZSBUcmFuc3BvcnQjU1RBUlQKKwkgKi8KKwlwdWJsaWMgdm9pZCBfc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlfdHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJULCBudWxsICk7CisJfQorCQorCS8qKgorCSAqIFdhaXRzIGZvciB0aGUgdHJhbnNwb3J0IHRvIGNvbWUgdXAuCisJICogQHBhcmFtIG1heERlbGF5IG1heCBkZWxheSBpbiBtaWxsaXNlY29uZHMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKiBAc2VlICNfdHJhbnNwb3J0UXVlcnkoT2JqZWN0KQorCSAqIEBzZWUgV2FpdFVwCisJICovCisJcHVibGljIHZvaWQgX3dhaXRVcCggaW50IG1heERlbGF5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJX3RyYW5zcG9ydFF1ZXJ5KCBuZXcgV2FpdFVwKCBtYXhEZWxheSApICk7CisJfQorCQorCS8qKgorCSAqIFN0YXJ0cyB0aGUgdHJhbnNwb3J0IGFuZCB3YWl0cyBmb3IgaXQgdG8gY29tZSB1cC4KKwkgKiBAcGFyYW0gbWF4RGVsYXkgbWF4IGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqIEBzZWUgI19zdGFydCgpCisJICogQHNlZSAjX3dhaXRVcChpbnQpCisJICovCisJcHVibGljIHZvaWQgX3N0YXJ0QW5kV2FpdFVwKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlfc3RhcnQoKTsKKwkJX3dhaXRVcCggbWF4RGVsYXkgKTsKKwl9CisJCisJLyoqCisJICogU3RvcHMgdGhlIHRyYW5zcG9ydC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqIEBzZWUgI190cmFuc3BvcnRDb250cm9sKE9iamVjdCwgT2JqZWN0KQorCSAqIEBzZWUgVHJhbnNwb3J0I1NUT1AKKwkgKi8KKwlwdWJsaWMgdm9pZCBfc3RvcCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCV90cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RPUCwgbnVsbCApOworCX0KKwkKKwkvKioKKwkgKiBXYWl0cyBmb3IgdGhlIHRyYW5zcG9ydCB0byBnbyBkb3duLgorCSAqIEBwYXJhbSBtYXhEZWxheSBtYXggZGVsYXkgaW4gbWlsbGlzZWNvbmRzLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICogQHNlZSAjX3RyYW5zcG9ydFF1ZXJ5KE9iamVjdCkKKwkgKiBAc2VlIFdhaXREb3duCisJICovCisJcHVibGljIHZvaWQgX3dhaXREb3duKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlfdHJhbnNwb3J0UXVlcnkoIG5ldyBXYWl0RG93biggbWF4RGVsYXkgKSApOworCX0KKwkKKwkvKioKKwkgKiBTdG9wcyB0aGUgdHJhbnNwb3J0IGFuZCB3YWl0cyBmb3IgaXQgdG8gZ28gZG93bi4KKwkgKiBAcGFyYW0gbWF4RGVsYXkgbWF4IGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqIEBzZWUgI19zdGFydCgpCisJICogQHNlZSAjX3dhaXREb3duKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfc3RvcEFuZFdhaXREb3duKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlfc3RvcCgpOworCQlfd2FpdERvd24oIG1heERlbGF5ICk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9SdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1J1bnRpbWVFeGNlcHRpb25TZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0ZDVlYwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9SdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5JbXBvcnRFeHBvcnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CisKKy8qKgorICogU2VyaWFsaXplciBmb3IgUnVudGltZUV4Y2VwdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVFeGNlcHRpb25TZXJpYWxpemVyIGltcGxlbWVudHMgSW1wb3J0RXhwb3J0SGVscGVyCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAibXNnIjsKKworCS8qKgorCSAqIERlZmluZXMgY3VzdG9tIGZpZWxkcyBpbiB0aGUgdmFsdWUgZmFjdG9yeSBzbyB0aGF0IHRoZSBpbXBvcnRlcgorCSAqIGNhbiBmaW5kIHRoZW0uCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcGFyYW0gY2xhc3MydHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCBUeXBlIHR5cGUsIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSApCisJeworCQlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIEZJRUxEX05BTUUgKTsKKwkJY2xhc3MydHlwZS5wdXQoIF9FdGNoX1J1bnRpbWVFeGNlcHRpb24uY2xhc3MsIHR5cGUgKTsKKwkJdHlwZS5zZXRDb21wb25lbnRUeXBlKCBfRXRjaF9SdW50aW1lRXhjZXB0aW9uLmNsYXNzICk7CisJCXR5cGUuc2V0SW1wb3J0RXhwb3J0SGVscGVyKCBuZXcgUnVudGltZUV4Y2VwdGlvblNlcmlhbGl6ZXIoIHR5cGUsIGZpZWxkICkgKTsKKwkJdHlwZS5wdXRWYWxpZGF0b3IoIGZpZWxkLCBWYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApICk7CisJCXR5cGUubG9jaygpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFJ1bnRpbWVFeGNlcHRpb25TZXJpYWxpemVyLgorCSAqCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcGFyYW0gZmllbGQKKwkgKi8KKwlwdWJsaWMgUnVudGltZUV4Y2VwdGlvblNlcmlhbGl6ZXIoIFR5cGUgdHlwZSwgRmllbGQgZmllbGQgKQorCXsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5maWVsZCA9IGZpZWxkOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKwkKKwlwcml2YXRlIGZpbmFsIEZpZWxkIGZpZWxkOworCisJcHVibGljIFN0cnVjdFZhbHVlIGV4cG9ydFZhbHVlKCBWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSApCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggdHlwZSwgdmYgKTsKKwkJc3YucHV0KCBmaWVsZCwgdmFsdWUudG9TdHJpbmcoKSApOworCQlyZXR1cm4gc3Y7CisJfQorCisJcHVibGljIE9iamVjdCBpbXBvcnRWYWx1ZSggU3RydWN0VmFsdWUgc3RydWN0ICkKKwl7CisJCXN0cnVjdC5jaGVja1R5cGUoIHR5cGUgKTsKKwkJcmV0dXJuIG5ldyBfRXRjaF9SdW50aW1lRXhjZXB0aW9uKCAoU3RyaW5nKSBzdHJ1Y3QuZ2V0KCBmaWVsZCApICk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9TZXJ2ZXJGYWN0b3J5LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvU2VydmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmY2UzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvU2VydmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisKKy8qKgorICogSW50ZXJmYWNlIHRvIHVzZSBmb3IgY29uc3RydWN0aW5nIG5ldyBzZXJ2ZXIgaW5zdGFuY2VzIGJ5CisgKiBUcmFuc3BvcnRIZWxwZXIuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VydmVyRmFjdG9yeSBleHRlbmRzIFNlc3Npb24sIFRyYW5zcG9ydDxTZXNzaW9uPgoreworCS8qKgorCSAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIFRyYW5zcG9ydE1lc3NhZ2UgdG8gdXNlIHdpdGggdGhlIG5ldyBzZXJ2ZXIgaW5zdGFuY2UuCisJICogQHBhcmFtIHVyaSB0aGUgdXJpIHRvIHVzZSB0byBjb25maWd1cmUgdGhlIG5ldyBzZXJ2ZXIgaW5zdGFuY2UuCisJICogQHBhcmFtIHJlc291cmNlcyB0aGUgcmVzb3VyY2VzIHRvIHVzZSBmb3IgdGhlIG5ldyBzZXJ2ZXIgaW5zdGFuY2UuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBuZXdTZXJ2ZXIoIFRyYW5zcG9ydE1lc3NhZ2UgdHJhbnNwb3J0LCBTdHJpbmcgdXJpLAorCQlSZXNvdXJjZXMgcmVzb3VyY2VzICkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdG8gdXNlIHRvIGNvbmZpZ3VyZSB0aGUgbmV3IHZhbHVlIGZhY3RvcnkuCisJICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB2YWx1ZSBmYWN0b3J5IGZvciB0aGlzIGNvbm5lY3Rpb24uCisJICovCisJcHVibGljIFZhbHVlRmFjdG9yeSBuZXdWYWx1ZUZhY3RvcnkoIFN0cmluZyB1cmkgKTsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9TdHViQmFzZS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1N0dWJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4ZDhlZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9TdHViQmFzZS5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuUG9vbC5Qb29sUnVubmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlNlc3Npb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisKKy8qKgorICogQmFzZSBjbGFzcyBvZiBzdHViIGltcGxlbWVudGF0aW9ucy4KKyAqIEBwYXJhbSA8VD4gVGhlIHR5cGUgb2Ygb2JqZWN0IHVzZWQgdG8gaW1wbGVtZW50IHN0dWIuCisgKi8KK3B1YmxpYyBjbGFzcyBTdHViQmFzZTxUPiBpbXBsZW1lbnRzIFNlc3Npb25NZXNzYWdlCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgU3R1YkJhc2UuCisJICogQHBhcmFtIHN2YyB0aGUgbWVzc2FnZSBzb3VyY2UuCisJICogQHBhcmFtIG9iaiB0aGUgdGFyZ2V0IG9mIGRlY29kZWQgbWVzc2FnZXMuCisJICogQHBhcmFtIHF1ZXVlZCB0aHJlYWQgcG9vbCB1c2VkIHRvIHJ1biBBc3luY01vZGUuUVVFVUVEIG1ldGhvZHMuCisJICogQHBhcmFtIGZyZWUgdGhyZWFkIHBvb2wgdXNlZCB0byBydW4gQXN5bmNNb2RlLkZSRUUgbWV0aG9kcy4KKwkgKi8KKwlwdWJsaWMgU3R1YkJhc2UoIERlbGl2ZXJ5U2VydmljZSBzdmMsIFQgb2JqLCBQb29sIHF1ZXVlZCwgUG9vbCBmcmVlICkKKwl7CisJCWlmIChzdmMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbiggInN2YyA9PSBudWxsIiApOworCQkKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAib2JqID09IG51bGwiICk7CisJCQorCQl0aGlzLl9zdmMgPSBzdmM7CisJCXRoaXMuX29iaiA9IG9iajsKKwkJdGhpcy5fcXVldWVkID0gcXVldWVkOworCQl0aGlzLl9mcmVlID0gZnJlZTsKKwkJCisJCXN2Yy5zZXRTZXNzaW9uKCB0aGlzICk7CisJfQorCQorCS8qKgorCSAqIFRoZSBtZXNzYWdlIHNvdXJjZS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgRGVsaXZlcnlTZXJ2aWNlIF9zdmM7CisJCisJLyoqCisJICogVGhlIG9iamVjdCB1c2VkIHRvIGltcGxlbWVudCBzdHViLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUIF9vYmo7CisJCisJLyoqCisJICogVGhlIHRocmVhZCBwb29sIHVzZWQgdG8gcnVuIEFzeW5jTW9kZS5RVUVVRUQgbWV0aG9kcy4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgUG9vbCBfcXVldWVkOworCQorCS8qKgorCSAqIFRoZSB0aHJlYWQgcG9vbCB1c2VkIHRvIHJ1biBBc3luY01vZGUuRlJFRSBtZXRob2RzLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBQb29sIF9mcmVlOworCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIGZpbmFsIGJvb2xlYW4gc2Vzc2lvbk1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVHlwZSB0eXBlID0gbXNnLnR5cGUoKTsKKwkJCisJCVN0dWJIZWxwZXI8VD4gaGVscGVyID0gKFN0dWJIZWxwZXI8VD4pIHR5cGUuZ2V0U3R1YkhlbHBlcigpOworCQlpZiAoaGVscGVyID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlzd2l0Y2ggKHR5cGUuZ2V0QXN5bmNNb2RlKCkpCisJCXsKKwkJCWNhc2UgUVVFVUVEOgorCQkJCXRyeQorCQkJCXsKKwkJCQkJX3F1ZXVlZC5ydW4oIG5ldyBTdHViUG9vbFJ1bm5hYmxlKCBzZW5kZXIsIG1zZywgaGVscGVyICkgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQlzZXNzaW9uTm90aWZ5KCBfb2JqLCBlICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBGUkVFOgorCQkJCXRyeQorCQkJCXsKKwkJCQkJX2ZyZWUucnVuKCBuZXcgU3R1YlBvb2xSdW5uYWJsZSggc2VuZGVyLCBtc2csIGhlbHBlciApICk7CisJCQkJfQorCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJc2Vzc2lvbk5vdGlmeSggX29iaiwgZSApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgTk9ORToKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWhlbHBlci5ydW4oIF9zdmMsIF9vYmosIHNlbmRlciwgbXNnICk7CisJCQkJfQorCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJc2Vzc2lvbk5vdGlmeSggX29iaiwgZSApOworCQkJCX0KKwkJCQlicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhc3luYyBtb2RlICIrdHlwZS5nZXRBc3luY01vZGUoKSk7CisJCX0KKwkJCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoX29iaiBpbnN0YW5jZW9mIE9ialNlc3Npb24pCisJCQlyZXR1cm4gKChPYmpTZXNzaW9uKSBfb2JqKS5fc2Vzc2lvblF1ZXJ5KCBxdWVyeSApOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIHF1ZXJ5ICIrcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChfb2JqIGluc3RhbmNlb2YgT2JqU2Vzc2lvbikKKwkJCSgoT2JqU2Vzc2lvbikgX29iaikuX3Nlc3Npb25Db250cm9sKCBjb250cm9sLCB2YWx1ZSApOworCQllbHNlCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc2Vzc2lvbk5vdGlmeSggX29iaiwgZXZlbnQgKTsKKwl9CisJCisJLyoqCisJICogTm90aWZpZXMgdGhlIHNlc3Npb24gb2YgZXZlbnRzIGdvaW5nIG9uICJiZWxvdyB0aGUgaG9vZCIuIEFtb25nCisJICogb3RoZXIgdGhpbmdzLCB1c2VkIHRvIHJlcG9ydCBleGNlcHRpb25zIGZyb20gdGhlIHRyYW5zcG9ydCBzdGFjaywKKwkgKiBpbmNsdWRpbmcgZXhjZXB0aW9ucyBjYXVnaHQgYnkgdGhlIHN0dWIgd2hpY2ggd2VyZSB0aHJvd24gYnkgb2JqLgorCSAqIEBwYXJhbSBvYmogdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24sIGNsaWVudCBvciBzZXJ2ZXIuCisJICogQHBhcmFtIGV2ZW50IGFuIGV2ZW50IHdoaWNoIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBhbiBleGNlcHRpb24uCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IG9iaiwgT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIE9ialNlc3Npb24pCisJCQkoKE9ialNlc3Npb24pIG9iaikuX3Nlc3Npb25Ob3RpZnkoIGV2ZW50ICk7CisJCWVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgVGhyb3dhYmxlKQorCQkJKChUaHJvd2FibGUpIGV2ZW50KS5wcmludFN0YWNrVHJhY2UoKTsKKwl9CisJCisJLyoqCisJICogQSBQb29sUnVubmFibGUgdXNlZCBieSB0aGUgc3R1YiB0byBkaXNwYXRjaCBhc3luY2hyb25vdXMKKwkgKiByZWNlaXZlciBtZXRob2RzIGZyb20gbWVzc2FnZXMuCisJICovCisJcHJpdmF0ZSBmaW5hbCBjbGFzcyBTdHViUG9vbFJ1bm5hYmxlIGltcGxlbWVudHMgUG9vbFJ1bm5hYmxlCisJeworCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgU3R1YlBvb2xSdW5uYWJsZS4KKwkJICogQHBhcmFtIHNlbmRlciB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLgorCQkgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlLgorCQkgKiBAcGFyYW0gaGVscGVyIHRoZSBTdHViSGVscGVyIHdoaWNoIHdpbGwgZGlzcGF0Y2ggdGhlIG1lc3NhZ2UuCisJCSAqLworCQlwdWJsaWMgU3R1YlBvb2xSdW5uYWJsZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2csIFN0dWJIZWxwZXI8VD4gaGVscGVyICkKKwkJeworCQkJdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisJCQl0aGlzLm1zZyA9IG1zZzsKKwkJCXRoaXMuaGVscGVyID0gaGVscGVyOworCQl9CisJCQorCQlwcml2YXRlIGZpbmFsIFdobyBzZW5kZXI7CisJCQorCQlwcml2YXRlIGZpbmFsIE1lc3NhZ2UgbXNnOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBTdHViSGVscGVyPFQ+IGhlbHBlcjsKKworCQlwdWJsaWMgdm9pZCBleGNlcHRpb24oIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJc2Vzc2lvbk5vdGlmeSggZSApOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZTEgKQorCQkJeworCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQloZWxwZXIucnVuKCBfc3ZjLCBfb2JqLCBzZW5kZXIsIG1zZyApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1N0dWJIZWxwZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9TdHViSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkMGMwNwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9TdHViSGVscGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKKworCisvKioKKyAqIEdlbmVyYXRlZCBjb2RlIHRvIGRpc3BhdGNoIG1ldGhvZCBmcm9tIG1lc3NhZ2UuCisgKiBAcGFyYW0gPFQ+IHRoZSBzZXJ2aWNlIGludGVyZmFjZSB0eXBlLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgU3R1YkhlbHBlcjxUPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBTdHViSGVscGVyIHdoaWNoIHVzZXMgc3luY2hyb25vdXMgbW9kZSB0byBkaXNwYXRjaAorCSAqIG1ldGhvZCBmcm9tIG1lc3NhZ2UuCisJICovCisJcHVibGljIFN0dWJIZWxwZXIoKQorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisJCisJLyoqCisJICogRGlzcGF0Y2hlcyB0aGUgbWV0aG9kIGZyb20gbWVzc2FnZS4KKwkgKiBAcGFyYW0gc3ZjCisJICogQHBhcmFtIG9iagorCSAqIEBwYXJhbSBzZW5kZXIKKwkgKiBAcGFyYW0gbXNnCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBydW4oIERlbGl2ZXJ5U2VydmljZSBzdmMsIFQgb2JqLCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApCisJCXRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1RyYW5zcG9ydEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDBlMTFmCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1RyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVGNwVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisKKy8qKgorICogSW50ZXJmYWNlIHRvIHRyYW5zcG9ydCBmYWN0b3J5LgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVHJhbnNwb3J0RmFjdG9yeQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgVHJhbnNwb3J0IHN0YWNrIHRvcHBlZCBieSBhIFRyYW5zcG9ydE1lc3NhZ2UKKwkgKiB3aGljaCBpcyB1c2VkIGJ5IHRoZSByZW1vdGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMgdG8gc2VuZAorCSAqIG1lc3NhZ2VzLgorCSAqIEBwYXJhbSB1cmkgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKiBAcGFyYW0gcmVzb3VyY2VzIGFkZGl0aW9uYWwgcmVzb3VyY2VzIG5lZWRlZCBieSB0aGUgc3RhY2suCisJICogQHJldHVybiB0aGUgVHJhbnNwb3J0TWVzc2FnZSB0b3BwaW5nIHRoZSB0cmFuc3BvcnQgc3RhY2suCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgVHJhbnNwb3J0TWVzc2FnZSBuZXdUcmFuc3BvcnQoIFN0cmluZyB1cmksCisJCVJlc291cmNlcyByZXNvdXJjZXMgKSB0aHJvd3MgRXhjZXB0aW9uOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBUcmFuc3BvcnQgc3RhY2sgdG9wcGVkIGJ5IGEgVHJhbnNwb3J0TWVzc2FnZQorCSAqIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlbW90ZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucyB0byBzZW5kCisJICogbWVzc2FnZXMuCisJICogQHBhcmFtIHVyaSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqIEBwYXJhbSByZXNvdXJjZXMgYWRkaXRpb25hbCByZXNvdXJjZXMgbmVlZGVkIGJ5IHRoZSBzdGFjay4KKwkgKiBAcmV0dXJuIHRoZSBUcmFuc3BvcnRNZXNzYWdlIHRvcHBpbmcgdGhlIHRyYW5zcG9ydCBzdGFjay4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXN0YXRpYyBwdWJsaWMgVHJhbnNwb3J0TWVzc2FnZSBnZXRUcmFuc3BvcnQoIFN0cmluZyB1cmksCisJCVJlc291cmNlcyByZXNvdXJjZXMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdSA9IG5ldyBVUkwoIHVyaSApOworCQlUcmFuc3BvcnRGYWN0b3J5IGYgPSBnZXRUcmFuc3BvcnRGYWN0b3J5KCB1LmdldFNjaGVtZSgpICk7CisJCXJldHVybiBmLm5ld1RyYW5zcG9ydCggdXJpLCByZXNvdXJjZXMgKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFRyYW5zcG9ydCBMaXN0ZW5lciB3aGljaCBpcyB1c2VkIHRvIGNvbnN0cnVjdAorCSAqIHNlcnZlciBzZXNzaW9ucy4KKwkgKiBAcGFyYW0gdXJpIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKiBAcGFyYW0gcmVzb3VyY2VzIGFkZGl0aW9uYWwgcmVzb3VyY2VzIG5lZWRlZCBieSB0aGUgbGlzdGVuZXIuCisJICogQHJldHVybiBhbiBvdXQtb2YtYmFuZCBzb3VyY2Ugd2hpY2ggbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgbGlzdGVuZXIuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+IG5ld0xpc3RlbmVyKCBTdHJpbmcgdXJpLAorCQlSZXNvdXJjZXMgcmVzb3VyY2VzICkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgVHJhbnNwb3J0IExpc3RlbmVyIHdoaWNoIGlzIHVzZWQgdG8gY29uc3RydWN0CisJICogc2VydmVyIHNlc3Npb25zLgorCSAqIEBwYXJhbSB1cmkgbGlzdGVuZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqIEBwYXJhbSByZXNvdXJjZXMgYWRkaXRpb25hbCByZXNvdXJjZXMgbmVlZGVkIGJ5IHRoZSBsaXN0ZW5lci4KKwkgKiBAcmV0dXJuIGFuIG91dC1vZi1iYW5kIHNvdXJjZSB3aGljaCBtYXkgYmUgdXNlZCB0byBjb250cm9sIHRoZSBsaXN0ZW5lci4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXN0YXRpYyBwdWJsaWMgVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+IGdldExpc3RlbmVyKCBTdHJpbmcgdXJpLAorCQlSZXNvdXJjZXMgcmVzb3VyY2VzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHUgPSBuZXcgVVJMKCB1cmkgKTsKKwkJVHJhbnNwb3J0RmFjdG9yeSBmID0gZ2V0VHJhbnNwb3J0RmFjdG9yeSggdS5nZXRTY2hlbWUoKSApOworCQlyZXR1cm4gZi5uZXdMaXN0ZW5lciggdXJpLCByZXNvdXJjZXMgKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGFueSBtZXNzYWdlIGZpbHRlcnMgc3BlY2lmaWVkIG9uIHRoZSB1cmkuIFRoZXkgYXJlIGFkZGVkIGluIG9yZGVyCisJICogZnJvbSB0cmFuc3BvcnQgdG8gc2Vzc2lvbi4gVGhlIGZpcnN0IGZpbHRlciBpcyB0aGUgc2Vzc2lvbiBmb3IgTWVzc2FnaXplciwKKwkgKiB0aGUgc2Vjb25kIGlzIHRoZSBzZXNzaW9uIGZvciB0aGUgZmlyc3QsIGV0Yy4gVGhlIGxhc3QgZmlsdGVyIGFkZGVkIGlzCisJICogcmV0dXJuZWQsIGFuZCBiZWNvbWVzIHRoZSBUcmFuc3BvcnRNZXNzYWdlIGZvciB3aGF0IGZvbGxvd3MuCisJICogQHBhcmFtIHRyYW5zcG9ydAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICogQHJldHVybiB0aGUgbmV3bHkgYWRkZWQgZmlsdGVyCisJICovCisJcHJvdGVjdGVkIFRyYW5zcG9ydE1lc3NhZ2UgYWRkRmlsdGVycyggVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksCisJCVJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJU3RyaW5nIHMgPSB1cmkuZ2V0VGVybSggRklMVEVSICk7CisJCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIHRyYW5zcG9ydDsKKwkJCisJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHMsICIsOjt8IFx0XHJcbiIgKTsKKwkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJeworCQkJU3RyaW5nIHQgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCXRyYW5zcG9ydCA9IGFkZEZpbHRlciggdHJhbnNwb3J0LCB0LCB1cmksIHJlc291cmNlcyApOworCQl9CisJCQorCQlyZXR1cm4gdHJhbnNwb3J0OworCX0KKwkKKwkvKioKKwkgKiBRdWVyeSB0ZXJtIG9uIHRoZSB0cmFuc3BvcnQgdXJpIHdoaWNoIGRlZmluZXMgYSBzZXQgb2YgZmlsdGVycyB3aGljaAorCSAqIHByb2Nlc3MgbWVzc2FnZXMgYXMgdGhleSBtb3ZlIHVwIGFuZCBkb3duIHRoZSB0cmFuc3BvcnQgc3RhY2suIEZpbHRlcgorCSAqIG5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlc2UgY2hhcmFjdGVyczogIiw6O3wgXHRcclxuIi4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxURVIgPSAiZmlsdGVyIjsKKworCXByaXZhdGUgVHJhbnNwb3J0TWVzc2FnZSBhZGRGaWx0ZXIoIFRyYW5zcG9ydE1lc3NhZ2UgdHJhbnNwb3J0LCBTdHJpbmcgbmFtZSwKKwkJVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0RmlsdGVyKCBuYW1lICk7CisJCQorCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCVN0cmluZy5mb3JtYXQoICJGaWx0ZXIgbmFtZSAnJXMnIG5vdCBkZWZpbmVkIiwgbmFtZSApICk7CisJCQorCQlDbGFzczw/PiBjbHNzOworCQkKKwkJdHJ5CisJCXsKKwkJCWNsc3MgPSBDbGFzcy5mb3JOYW1lKCBjbGFzc05hbWUgKTsKKwkJfQorCQljYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSApCisJCXsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJU3RyaW5nLmZvcm1hdCggIkNsYXNzICclcycgZm9yIGZpbHRlciBuYW1lICclcycgbm90IGRlZmluZWQiLAorCQkJCQljbGFzc05hbWUsIG5hbWUgKSApOworCQl9CisJCQorCQlpZiAoIVRyYW5zcG9ydE1lc3NhZ2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggY2xzcyApKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQlTdHJpbmcuZm9ybWF0KCAiQ2xhc3MgJyVzJyBmb3IgZmlsdGVyIG5hbWUgJyVzJyBkb2VzIG5vdCBpbXBsZW1lbnQgVHJhbnNwb3J0TWVzc2FnZSIsCisJCQkJCWNsYXNzTmFtZSwgbmFtZSApICk7CisJCQorCQlpZiAoIVNlc3Npb25NZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIGNsc3MgKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJU3RyaW5nLmZvcm1hdCggIkNsYXNzICclcycgZm9yIGZpbHRlciBuYW1lICclcycgZG9lcyBub3QgaW1wbGVtZW50IFNlc3Npb25NZXNzYWdlIiwKKwkJCQkJY2xhc3NOYW1lLCBuYW1lICkgKTsKKwkJCisJCUNvbnN0cnVjdG9yPD8+IGM7CisJCQorCQl0cnkKKwkJeworCQkJYyA9IGNsc3MuZ2V0Q29uc3RydWN0b3IoIFBBUkFNUyApOworCQl9CisJCWNhdGNoICggU2VjdXJpdHlFeGNlcHRpb24gZSApCisJCXsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJU3RyaW5nLmZvcm1hdCggIkNvbnN0cnVjdG9yICVzKFRyYW5zcG9ydE1lc3NhZ2UsIFVSTCwgUmVzb3VyY2VzKSBmb3IgZmlsdGVyIG5hbWUgJyVzJyBjYW5ub3QgYmUgYWNjZXNzZWQiLAorCQkJCQljbGFzc05hbWUsIG5hbWUgKSApOworCQl9CisJCWNhdGNoICggTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCVN0cmluZy5mb3JtYXQoICJDb25zdHJ1Y3RvciAlcyhUcmFuc3BvcnRNZXNzYWdlLCBVUkwsIFJlc291cmNlcykgZm9yIGZpbHRlciBuYW1lICclcycgbm90IGRlZmluZWQiLAorCQkJCQljbGFzc05hbWUsIG5hbWUgKSApOworCQl9CisJCQorCQl0cnkKKwkJeworCQkJcmV0dXJuIChUcmFuc3BvcnRNZXNzYWdlKSBjLm5ld0luc3RhbmNlKCBuZXcgT2JqZWN0W10geyB0cmFuc3BvcnQsIHVyaSwgcmVzb3VyY2VzIH0gKTsKKwkJfQorCQljYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQlTdHJpbmcuZm9ybWF0KCAiQ29uc3RydWN0b3IgJXMoVHJhbnNwb3J0TWVzc2FnZSwgVVJMLCBSZXNvdXJjZXMpIGZvciBmaWx0ZXIgbmFtZSAnJXMnIGZhaWxlZCIsCisJCQkJCWNsYXNzTmFtZSwgbmFtZSApLCBlICk7CisJCX0KKwkJY2F0Y2ggKCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCVN0cmluZy5mb3JtYXQoICJDb25zdHJ1Y3RvciAlcyhUcmFuc3BvcnRNZXNzYWdlLCBVUkwsIFJlc291cmNlcykgZm9yIGZpbHRlciBuYW1lICclcycgZmFpbGVkIiwKKwkJCQkJY2xhc3NOYW1lLCBuYW1lICksIGUgKTsKKwkJfQorCQljYXRjaCAoIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSApCisJCXsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJU3RyaW5nLmZvcm1hdCggIkNvbnN0cnVjdG9yICVzKFRyYW5zcG9ydE1lc3NhZ2UsIFVSTCwgUmVzb3VyY2VzKSBmb3IgZmlsdGVyIG5hbWUgJyVzJyBmYWlsZWQiLAorCQkJCQljbGFzc05hbWUsIG5hbWUgKSwgZSApOworCQl9CisJCWNhdGNoICggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQlTdHJpbmcuZm9ybWF0KCAiQ29uc3RydWN0b3IgJXMoVHJhbnNwb3J0TWVzc2FnZSwgVVJMLCBSZXNvdXJjZXMpIGZvciBmaWx0ZXIgbmFtZSAnJXMnIGZhaWxlZCIsCisJCQkJCWNsYXNzTmFtZSwgbmFtZSApLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpICk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUgdGhlIGZpbHRlciBuYW1lLgorCSAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBmaWx0ZXIuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsdGVyKCBTdHJpbmcgbmFtZSApCisJeworCQlyZXR1cm4gZmlsdGVycy5nZXQoIG5hbWUgKTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGZpbHRlci4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgZmlsdGVyIG5hbWUuCisJICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGZpbHRlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lRmlsdGVyKCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSApCisJeworCQlmaWx0ZXJzLnB1dCggbmFtZSwgY2xhc3NOYW1lICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZmlsdGVycyA9CisJCUNvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcCggbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkgKTsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFBBUkFNUyA9IHsgVHJhbnNwb3J0TWVzc2FnZS5jbGFzcywgVVJMLmNsYXNzLCBSZXNvdXJjZXMuY2xhc3MgfTsKKwkKKwlzdGF0aWMKKwl7CisJCWRlZmluZUZpbHRlciggIktlZXBBbGl2ZSIsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZmlsdGVycy5LZWVwQWxpdmUiICk7CisJCWRlZmluZUZpbHRlciggIlB3QXV0aCIsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZmlsdGVycy5Qd0F1dGgiICk7CisJCWRlZmluZUZpbHRlciggIkxvZ2dlciIsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZmlsdGVycy5Mb2dnZXIiICk7CisJfQorCQorCS8qKgorCSAqIEdldHMgdGhlIG5hbWVkIHRyYW5zcG9ydCBmYWN0b3J5LgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgY29uZmlndXJlZCB0cmFuc3BvcnQgZmFjdG9yeS4KKwkgKiBAcmV0dXJuIHRoZSBuYW1lZCB0cmFuc3BvcnQgZmFjdG9yeS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGRlZmluZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNwb3J0RmFjdG9yeSBnZXRUcmFuc3BvcnRGYWN0b3J5KCBTdHJpbmcgbmFtZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCB0ZnNwZWMgPSBnZXQoIG5hbWUgKTsKKwkJCisJCWlmICh0ZnNwZWMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggInRyYW5zcG9ydCBmYWN0b3J5IHNjaGVtZSAnIituYW1lKyInIHVua25vd24iICk7CisJCQorCQlpZiAodGZzcGVjIGluc3RhbmNlb2YgU3RyaW5nKQorCQkJdGZzcGVjID0gQ2xhc3MuZm9yTmFtZSggKFN0cmluZykgdGZzcGVjICk7CisJCQorCQlpZiAodGZzcGVjIGluc3RhbmNlb2YgQ2xhc3M8Pz4pCisJCQl0ZnNwZWMgPSAoKENsYXNzPD8+KSB0ZnNwZWMpLm5ld0luc3RhbmNlKCk7CisJCQorCQlpZiAodGZzcGVjIGluc3RhbmNlb2YgVHJhbnNwb3J0RmFjdG9yeSkKKwkJCXJldHVybiAoVHJhbnNwb3J0RmFjdG9yeSkgdGZzcGVjOworCQkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorCQkJIkNhbm5vdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVHJhbnNwb3J0RmFjdG9yeSBmcm9tIHRyYW5zcG9ydCBmYWN0b3J5IG5hbWUgJyVzJyIsIG5hbWUgKSApOworCX0KKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBuYW1lZCB0cmFuc3BvcnQgZmFjdG9yeSBzcGVjLgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3BlYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXQoU3RyaW5nIG5hbWUpCisJeworCQlyZXR1cm4gdHJhbnNwb3J0RmFjdG9yaWVzLmdldCggbmFtZSApOworCX0KKwkKKwkvKioKKwkgKiBEZWZpbmVzIGEgdHJhbnNwb3J0IGZhY3RvcnkuCisJICogQHBhcmFtIG5hbWUgdGhlIHVyaSBzY2hlbWUgb2YgdGhpcyB0cmFuc3BvcnQgZmFjdG9yeS4KKwkgKiBAcGFyYW0gdGZzcGVjIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmFtZS4gVGhpcyBtYXkKKwkgKiBlaXRoZXIgYmUgYW4gaW5zdGFuY2Ugb2YgVHJhbnNwb3J0RmFjdG9yeSBvciBhIGNsYXNzIHdoaWNoIGlzIGEgc3ViY2xhc3MKKwkgKiBvZiBUcmFuc3BvcnRGYWN0b3J5IG9yIGEgc3RyaW5nIHdoaWNoIGlzIGEgbmFtZSBvZiBhIGNsYXNzIHdoaWNoIGlzIGEKKwkgKiBzdWJjbGFzcyBvZiB0cmFuc3BvcnQgZmFjdG9yeS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lKCBTdHJpbmcgbmFtZSwgT2JqZWN0IHRmc3BlYyApCisJeworCQl0cmFuc3BvcnRGYWN0b3JpZXMucHV0KCBuYW1lLCB0ZnNwZWMgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc3BvcnRGYWN0b3JpZXMgPQorCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpICk7CisJCisJc3RhdGljCisJeworCQlkZWZpbmUoICJ0Y3AiLCBuZXcgVGNwVHJhbnNwb3J0RmFjdG9yeSggZmFsc2UgKSApOworCQlkZWZpbmUoICJ0bHMiLCBuZXcgVGNwVHJhbnNwb3J0RmFjdG9yeSggdHJ1ZSApICk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UcmFuc3BvcnRIZWxwZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UcmFuc3BvcnRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFkNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1RyYW5zcG9ydEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworCisvKioKKyAqIENsYXNzIHRvIGhlbHAgY29uc3RydWN0IHRyYW5zcG9ydCBzdGFja3MuCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc3BvcnRIZWxwZXIKK3sKKwkvLy8vLy8vLy8vLy8vLy8KKwkvLyBSRVNPVVJDRVMgLy8KKwkvLy8vLy8vLy8vLy8vLy8KKworCS8qKiBUaGUgUG9vbCB0byB1c2UgdG8gZXhlY3V0ZSBxdWV1ZWQgYXN5bmMgcmVjZWl2ZXIgbWVzc2FnZXMuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFVUVEX1BPT0wgPSAiUVVFVUVEX1BPT0wiOworCQorCS8qKiBUaGUgUG9vbCB0byB1c2UgdG8gZXhlY3V0ZSBmcmVlIGFzeW5jIHJlY2VpdmVyIG1lc3NhZ2VzLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSRUVfUE9PTCA9ICJGUkVFX1BPT0wiOworCQorCS8qKiBCaW5hcnkgdHJhbnNwb3J0IGZvcm1hdCAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJJTkFSWSA9ICJiaW5hcnkiOworCQorCS8qKiBYbWwgdHJhbnNwb3J0IGZvcm1hdCAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTCA9ICJ4bWwiOworCisJLy8vLy8vLy8vLy8vLy8vCisJLy8gVVRJTElUSUVTIC8vCisJLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogSW5pdGlhbGl6ZXMgc3RhbmRhcmQgcmVzb3VyY2VzLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMgc29tZSBpbml0aWFsIHZhbHVlcyBmb3IgcmVzb3VyY2VzLiBNYXkgYmUgbnVsbCB0byBhY2NlcHQKKwkgKiBhbGwgdGhlIGRlZmF1bHRzLgorCSAqIEByZXR1cm4gY29weSBvZiByZXNvdXJjZXMgaW5pdGlhbGl6ZWQgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3Igc3RhbmRhcmQKKwkgKiBpdGVtcy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VzIGluaXRSZXNvdXJjZXMoIFJlc291cmNlcyByZXNvdXJjZXMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAocmVzb3VyY2VzID09IG51bGwpCisJCQlyZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzKCk7CisJCWVsc2UKKwkJCXJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMoIHJlc291cmNlcyApOworCQkKKwkJaWYgKCFyZXNvdXJjZXMuY29udGFpbnNLZXkoIFFVRVVFRF9QT09MICkpCisJCQlyZXNvdXJjZXMucHV0KCBRVUVVRURfUE9PTCwgbmV3IFF1ZXVlZFBvb2woKSApOworCQkKKwkJaWYgKCFyZXNvdXJjZXMuY29udGFpbnNLZXkoIEZSRUVfUE9PTCApKQorCQkJcmVzb3VyY2VzLnB1dCggRlJFRV9QT09MLCBuZXcgRnJlZVBvb2woKSApOworCQkKKwkJcmV0dXJuIHJlc291cmNlczsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UeXBlVmFsaWRhdG9yLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVHlwZVZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjk0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVHlwZVZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKKworCisvKioKKyAqIEJhc2UgY2xhc3Mgb2YgdmFsaWRhdG9ycyB3aGljaCB2YWxpZGF0ZSBiYXNlZCBvbiBleGFjdCB0eXBlLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVHlwZVZhbGlkYXRvciBpbXBsZW1lbnRzIFZhbGlkYXRvcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFR5cGVWYWxpZGF0b3IuCisJICoKKwkgKiBAcGFyYW0gc2NhbGFyQ2xhc3MgY2xhc3MgdG8gdXNlIGlmIG5EaW1zID09IDAKKwkgKiBAcGFyYW0gYXJyYXlDbGFzcyBjbGFzcyB0byB1c2UgaWYgbkRpbXMgPiAwCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICogQHBhcmFtIGRlc2NyIGEgZGVzY3JpcHRpb24gb2YgdGhlIGV4cGVjdGVkIHZhbHVlLgorCSAqLworCXB1YmxpYyBUeXBlVmFsaWRhdG9yKCBDbGFzczw/PiBzY2FsYXJDbGFzcywgQ2xhc3M8Pz4gYXJyYXlDbGFzcywgaW50IG5EaW1zLAorCQlTdHJpbmcgZGVzY3IgKQorCXsKKwkJdGhpcyggc2NhbGFyQ2xhc3MsIGFycmF5Q2xhc3MsIG5EaW1zLCBkZXNjciwgZmFsc2UgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVHlwZVZhbGlkYXRvci4KKwkgKgorCSAqIEBwYXJhbSBzY2FsYXJDbGFzcyBjbGFzcyB0byB1c2UgaWYgbkRpbXMgPT0gMAorCSAqIEBwYXJhbSBhcnJheUNsYXNzIGNsYXNzIHRvIHVzZSBpZiBuRGltcyA+IDAKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKiBAcGFyYW0gZGVzY3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXhwZWN0ZWQgdmFsdWUuCisJICogQHBhcmFtIHN1YmNsYXNzT2sgdHJ1ZSBvZiBhIHN1YmNsYXNzIG9mIHRoZSBleHBlY3RlZCBjbGFzcyBpcyBvay4KKwkgKi8KKwlwdWJsaWMgVHlwZVZhbGlkYXRvciggQ2xhc3M8Pz4gc2NhbGFyQ2xhc3MsIENsYXNzPD8+IGFycmF5Q2xhc3MsIGludCBuRGltcywKKwkJU3RyaW5nIGRlc2NyLCBib29sZWFuIHN1YmNsYXNzT2sgKQorCXsKKwkJY2hlY2tEaW1zKCBuRGltcyApOworCQlleHBlY3RlZENsYXNzID0gbWtFeHBlY3RlZENsYXNzKCBzY2FsYXJDbGFzcywgYXJyYXlDbGFzcywgbkRpbXMgKTsKKwkJdGhpcy5uRGltcyA9IG5EaW1zOworCQl0aGlzLmRlc2NyID0gZGVzY3I7CisJCXRoaXMuc3ViY2xhc3NPayA9IHN1YmNsYXNzT2s7CisJfQorCQorCXByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gZXhwZWN0ZWRDbGFzczsKKwkKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaWYgdGhpcyBpcyBhbiBhcnJheS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgaW50IG5EaW1zOworCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyOworCQorCS8qKgorCSAqIEFsbG93IHN1YmNsYXNzaW5nIG9mIHRoaXMgdHlwZS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzdWJjbGFzc09rOworCQorCS8qKgorCSAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIHN0YW5kYXJkIHZhbGlkYXRvcnMuCisJICogQHBhcmFtIG5EaW1zCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbkRpbXMgPCAwIHx8IG5EaW1zID4gTUFYX05ESU1TCisJICogQHNlZSAjTUFYX05ESU1TCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyB2b2lkIGNoZWNrRGltcyggaW50IG5EaW1zICkKKwkJdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCXsKKwkJaWYgKG5EaW1zIDwgMCB8fCBuRGltcyA+IE1BWF9ORElNUykKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJuRGltcyA8IDAgfHwgbkRpbXMgPiBNQVhfTkRJTVMiICk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZXhwZWN0ZWQgY2xhc3Mgb2YgdGhpcyB2YWxpZGF0b3IuCisJICovCisJcHVibGljIENsYXNzPD8+IGdldEV4cGVjdGVkQ2xhc3MoKQorCXsKKwkJcmV0dXJuIGV4cGVjdGVkQ2xhc3M7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGV4cGVjdGVkIG51bWJlciBvZiBkaW1lbnNpb25zLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TkRpbXMoKQorCXsKKwkJcmV0dXJuIG5EaW1zOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlmaW5hbCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBkZXNjcjsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoIE9iamVjdCB2YWx1ZSApCisJeworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCUNsYXNzPD8+IGNsc3MgPSB2YWx1ZS5nZXRDbGFzcygpOworCQkKKwkJaWYgKGNsc3MgPT0gZXhwZWN0ZWRDbGFzcykKKwkJCXJldHVybiB0cnVlOworCQkKKwkJLy8gaWYgY2xzcyBpcyBhIHN1YmNsYXNzIG9mIGV4cGVjdGVkQ2xhc3MsIHRoYXQncyBvay4KKwkJCisJCXJldHVybiBzdWJjbGFzc09rICYmIGV4cGVjdGVkQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggY2xzcyApOworCX0KKworCXB1YmxpYyBPYmplY3QgdmFsaWRhdGVWYWx1ZSggT2JqZWN0IHZhbHVlICkKKwl7CisJCWlmICh2YWxpZGF0ZSggdmFsdWUgKSkKKwkJCXJldHVybiB2YWx1ZTsKKwkJCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJ2YWx1ZSBub3QgYXBwcm9wcmlhdGUgZm9yICIrZGVzY3IrIjogIit2YWx1ZSApOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gc2NhbGFyQ2xhc3MgY2xhc3MgdG8gdXNlIGlmIG5EaW1zID09IDAKKwkgKiBAcGFyYW0gYXJyYXlDbGFzcyBjbGFzcyB0byB1c2UgaWYgbkRpbXMgPiAwCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICogQHJldHVybiBhbiBhcHByb3ByaWF0ZSBjbGFzcyBnaXZlbiBuRGltcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBta0V4cGVjdGVkQ2xhc3MoIENsYXNzPD8+IHNjYWxhckNsYXNzLAorCQlDbGFzczw/PiBhcnJheUNsYXNzLCBpbnQgbkRpbXMgKQorCXsKKwkJaWYgKG5EaW1zID09IDApCisJCQlyZXR1cm4gc2NhbGFyQ2xhc3M7CisJCQorCQlyZXR1cm4gQXJyYXkubmV3SW5zdGFuY2UoIGFycmF5Q2xhc3MsIG5ldyBpbnRbbkRpbXNdICkuZ2V0Q2xhc3MoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTRlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CisKKy8qKgorICogVmFsaWRhdG9yIGZvciBSdW50aW1lRXhjZXB0aW9uLgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IuCisJICovCisJcHVibGljIHN0YXRpYyBWYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbiBnZXQoKQorCXsKKwkJaWYgKHZhbGlkYXRvciA9PSBudWxsKQorCQkJdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uKCk7CisJCQorCQlyZXR1cm4gdmFsaWRhdG9yOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbiB2YWxpZGF0b3I7CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqLworCXByaXZhdGUgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24oKQorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisKKwlwdWJsaWMgVmFsaWRhdG9yIGVsZW1lbnRWYWxpZGF0b3IoKQorCXsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm5vdCBhbiBhcnJheSIgKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoIE9iamVjdCB2YWx1ZSApCisJeworCQlyZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uOworCX0KKworCXB1YmxpYyBPYmplY3QgdmFsaWRhdGVWYWx1ZSggT2JqZWN0IHZhbHVlICkKKwl7CisJCWlmICh2YWxpZGF0ZSggdmFsdWUgKSkKKwkJCXJldHVybiB2YWx1ZTsKKwkJCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJ2YWx1ZSBub3QgYXBwcm9wcmlhdGUgZm9yIFJ1bnRpbWVFeGNlcHRpb246ICIrdmFsdWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZTU5YQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfU3RydWN0VmFsdWUuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3IgU3RydWN0VmFsdWUuCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0b3JfU3RydWN0VmFsdWUgZXh0ZW5kcyBUeXBlVmFsaWRhdG9yCit7CisJLyoqCisJICogQHBhcmFtIHR5cGUgdGhlIGV4cGVjdGVkIHR5cGUgb2YgYSBzY2FsYXIgU3RydWN0VmFsdWUuCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yX1N0cnVjdFZhbHVlIGdldCggVHlwZSB0eXBlLCBpbnQgbkRpbXMgKQorCXsKKwkJY2hlY2tEaW1zKCBuRGltcyApOworCQkKKy8vCQlpZiAobkRpbXMgPj0gdmFsaWRhdG9ycy5sZW5ndGgpCisJCQlyZXR1cm4gbmV3IFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSggdHlwZSwgbkRpbXMgKTsKKwkJCisvLwkJVmFsaWRhdG9yX1N0cnVjdFZhbHVlIHYgPSB2YWxpZGF0b3JzW25EaW1zXTsKKy8vCisvLwkJaWYgKHYgPT0gbnVsbCkKKy8vCQkJdiA9IHZhbGlkYXRvcnNbbkRpbXNdID0gbmV3IFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSggdHlwZSwgbkRpbXMgKTsKKy8vCisvLwkJcmV0dXJuIHY7CisJfQorCQorLy8JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yX1N0cnVjdFZhbHVlW10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JfU3RydWN0VmFsdWVbTUFYX0NBQ0hFRF07CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3JfU3RydWN0VmFsdWUoIFR5cGUgdHlwZSwgaW50IG5EaW1zICkKKwl7CisJCXN1cGVyKCBTdHJ1Y3RWYWx1ZS5jbGFzcywgU3RydWN0VmFsdWUuY2xhc3MsIG5EaW1zLCAiU3RydWN0VmFsdWVbIit0eXBlKyIsICIrbkRpbXMrIl0iICk7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCQorCXByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworCisJLyoqCisJICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHZhbGlkYXRvci4KKwkgKi8KKwlwdWJsaWMgVHlwZSBnZXRUeXBlKCkKKwl7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gZ2V0KCB0eXBlLCBuRGltcy0xICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoIE9iamVjdCB2YWx1ZSApCisJeworCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUoIHZhbHVlICkgJiYKKwkJCSh2YWx1ZS5nZXRDbGFzcygpICE9IFN0cnVjdFZhbHVlLmNsYXNzIHx8CisJCQkJdHlwZS5pc0Fzc2lnbmFibGVGcm9tKCAoKFN0cnVjdFZhbHVlKSB2YWx1ZSkudHlwZSgpICkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX2Jvb2xlYW4uamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfYm9vbGVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWNmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX2Jvb2xlYW4uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CisKKy8qKgorICogVmFsaWRhdG9yIGZvciBib29sZWFuLgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX2Jvb2xlYW4gZXh0ZW5kcyBUeXBlVmFsaWRhdG9yCit7CisJLyoqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yX2Jvb2xlYW4gZ2V0KCBpbnQgbkRpbXMgKQorCXsKKwkJY2hlY2tEaW1zKCBuRGltcyApOworCQkKKwkJaWYgKG5EaW1zID49IHZhbGlkYXRvcnMubGVuZ3RoKQorCQkJcmV0dXJuIG5ldyBWYWxpZGF0b3JfYm9vbGVhbiggbkRpbXMgKTsKKwkJCisJCVZhbGlkYXRvcl9ib29sZWFuIHYgPSB2YWxpZGF0b3JzW25EaW1zXTsKKwkJCisJCWlmICh2ID09IG51bGwpCisJCQl2ID0gdmFsaWRhdG9yc1tuRGltc10gPSBuZXcgVmFsaWRhdG9yX2Jvb2xlYW4oIG5EaW1zICk7CisJCQorCQlyZXR1cm4gdjsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yX2Jvb2xlYW5bXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvcl9ib29sZWFuW01BWF9DQUNIRURdOworCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFZhbGlkYXRvci4KKwkgKgorCSAqIEBwYXJhbSBuRGltcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLgorCSAqLworCXByaXZhdGUgVmFsaWRhdG9yX2Jvb2xlYW4oIGludCBuRGltcyApCisJeworCQlzdXBlciggQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgbkRpbXMsICJib29sZWFuWyIrbkRpbXMrIl0iICk7CisJfQorCisJcHVibGljIFZhbGlkYXRvciBlbGVtZW50VmFsaWRhdG9yKCkKKwl7CisJCXJldHVybiBnZXQoIG5EaW1zLTEgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX2J5dGUuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfYnl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Nzc2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX2J5dGUuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3IgYnl0ZS4KKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRvcl9ieXRlIGV4dGVuZHMgVHlwZVZhbGlkYXRvcgoreworCS8qKgorCSAqIEBwYXJhbSBuRGltcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLgorCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHZhbGlkYXRvci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9ieXRlIGdldCggaW50IG5EaW1zICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+PSB2YWxpZGF0b3JzLmxlbmd0aCkKKwkJCXJldHVybiBuZXcgVmFsaWRhdG9yX2J5dGUoIG5EaW1zICk7CisJCQorCQlWYWxpZGF0b3JfYnl0ZSB2ID0gdmFsaWRhdG9yc1tuRGltc107CisJCQorCQlpZiAodiA9PSBudWxsKQorCQkJdiA9IHZhbGlkYXRvcnNbbkRpbXNdID0gbmV3IFZhbGlkYXRvcl9ieXRlKCBuRGltcyApOworCQkKKwkJcmV0dXJuIHY7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9ieXRlW10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JfYnl0ZVtNQVhfQ0FDSEVEXTsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBWYWxpZGF0b3IuCisJICoKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKi8KKwlwcml2YXRlIFZhbGlkYXRvcl9ieXRlKCBpbnQgbkRpbXMgKQorCXsKKwkJc3VwZXIoIEJ5dGUuY2xhc3MsIGJ5dGUuY2xhc3MsIG5EaW1zLCAiYnl0ZVsiK25EaW1zKyJdIiApOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gZ2V0KCBuRGltcy0xICk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJaWYgKG5EaW1zID4gMCkKKwkJCXJldHVybiBzdXBlci52YWxpZGF0ZSggdmFsdWUgKTsKKwkJCisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJQ2xhc3M8Pz4gYyA9IHZhbHVlLmdldENsYXNzKCk7CisJCQorCQlpZiAoYyA9PSBCeXRlLmNsYXNzKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlpZiAoYyA9PSBTaG9ydC5jbGFzcykKKwkJeworCQkJc2hvcnQgdiA9IChTaG9ydCkgdmFsdWU7CisJCQlyZXR1cm4gdiA+PSBCeXRlLk1JTl9WQUxVRSAmJiB2IDw9IEJ5dGUuTUFYX1ZBTFVFOworCQl9CisJCQorCQlpZiAoYyA9PSBJbnRlZ2VyLmNsYXNzKQorCQl7CisJCQlpbnQgdiA9IChJbnRlZ2VyKSB2YWx1ZTsKKwkJCXJldHVybiB2ID49IEJ5dGUuTUlOX1ZBTFVFICYmIHYgPD0gQnl0ZS5NQVhfVkFMVUU7CisJCX0KKwkJCisJCWlmIChjID09IExvbmcuY2xhc3MpCisJCXsKKwkJCWxvbmcgdiA9IChMb25nKSB2YWx1ZTsKKwkJCXJldHVybiB2ID49IEJ5dGUuTUlOX1ZBTFVFICYmIHYgPD0gQnl0ZS5NQVhfVkFMVUU7CisJCX0KKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCB2YWxpZGF0ZVZhbHVlKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJdmFsdWUgPSBzdXBlci52YWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQkKKwkJaWYgKHZhbHVlLmdldENsYXNzKCkgPT0gQnl0ZS5jbGFzcyB8fCBuRGltcyA+IDApCisJCQlyZXR1cm4gdmFsdWU7CisJCQorCQlyZXR1cm4gKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX2N1c3RvbS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9jdXN0b20uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzBkNDhmCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9jdXN0b20uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CisKKworLyoqCisgKiBWYWxpZGF0b3IgZm9yIGN1c3RvbSB0eXBlLgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX2N1c3RvbSBleHRlbmRzIFR5cGVWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBAcGFyYW0gY2xzcyB0aGUgY2xhc3Mgb2YgdGhlIGN1c3RvbSB0eXBlLgorCSAqIEBwYXJhbSBuRGltcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLgorCSAqIEBwYXJhbSBzdWJjbGFzc09rIGlmIHRydWUgYWxsb3cgc3ViY2xhc3NlcyBvZiB0aGUKKwkgKiBjbGFzcy4KKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIFZhbGlkYXRvci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFZhbGlkYXRvciBnZXQoIENsYXNzPD8+IGNsc3MsIGludCBuRGltcywgYm9vbGVhbiBzdWJjbGFzc09rICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+IE1BWF9DQUNIRUQpCisJCQlyZXR1cm4gbmV3IFZhbGlkYXRvcl9jdXN0b20oIGNsc3MsIG5EaW1zLCBzdWJjbGFzc09rICk7CisJCQorCQlLZXkga2V5ID0gbmV3IEtleSggY2xzcywgbkRpbXMsIHN1YmNsYXNzT2sgKTsKKwkJVmFsaWRhdG9yIHYgPSB2YWxpZGF0b3JzLmdldCgga2V5ICk7CisJCQorCQlpZiAodiA9PSBudWxsKQorCQl7CisJCQl2ID0gbmV3IFZhbGlkYXRvcl9jdXN0b20oIGNsc3MsIG5EaW1zLCBzdWJjbGFzc09rICk7CisJCQl2YWxpZGF0b3JzLnB1dCgga2V5LCB2ICk7CisJCX0KKwkJCisJCXJldHVybiB2OworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBLZXkKKwl7CisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIHRoZSBrZXkKKwkJICogQHBhcmFtIGNsc3MKKwkJICogQHBhcmFtIGRpbXMKKwkJICogQHBhcmFtIHN1YmNsYXNzT2sKKwkJICovCisJCXB1YmxpYyBLZXkoIENsYXNzPD8+IGNsc3MsIGludCBkaW1zLCBib29sZWFuIHN1YmNsYXNzT2sgKQorCQl7CisJCQl0aGlzLmNsc3MgPSBjbHNzOworCQkJdGhpcy5kaW1zID0gZGltczsKKwkJCXRoaXMuc3ViY2xhc3NPayA9IHN1YmNsYXNzT2s7CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gY2xzczsKKwkJCisJCXByaXZhdGUgZmluYWwgaW50IGRpbXM7CisJCQorCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3ViY2xhc3NPazsKKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkKKwkJeworCQkJcmV0dXJuIGNsc3MuaGFzaENvZGUoKSBeIGRpbXMgKiA5MTMxIF4gKHN1YmNsYXNzT2sgPyAyMTM1NyA6IDg1NDcpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKCBPYmplY3Qgb2JqICkKKwkJeworCQkJaWYgKG9iaiA9PSB0aGlzKQorCQkJCXJldHVybiB0cnVlOworCQkJCisJCQlpZiAob2JqID09IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlpZiAob2JqLmdldENsYXNzKCkgIT0gZ2V0Q2xhc3MoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJCUtleSBvdGhlciA9IChLZXkpIG9iajsKKwkJCQorCQkJcmV0dXJuIG90aGVyLmNsc3MuZXF1YWxzKCBjbHNzKQorCQkJCSYmIG90aGVyLmRpbXMgPT0gZGltcworCQkJCSYmIG90aGVyLnN1YmNsYXNzT2sgPT0gc3ViY2xhc3NPazsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXA8S2V5LCBWYWxpZGF0b3I+IHZhbGlkYXRvcnMgPQorCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwPEtleSwgVmFsaWRhdG9yPigpICk7CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIGNsc3MgdGhlIGNsYXNzIG9mIHRoZSBjdXN0b20gdHlwZS4KKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKi8KKwlwcml2YXRlIFZhbGlkYXRvcl9jdXN0b20oIENsYXNzPD8+IGNsc3MsIGludCBuRGltcywgYm9vbGVhbiBzdWJjbGFzc09rICkKKwl7CisJCXN1cGVyKCBjbHNzLCBjbHNzLCBuRGltcywKKwkJCXN1YmNsYXNzT2sKKwkJCQk/IGNsc3MudG9TdHJpbmcoKSsiWyIrbkRpbXMrIl0qIgorCQkJCTogY2xzcy50b1N0cmluZygpKyJbIituRGltcysiXSIsCisJCQlzdWJjbGFzc09rICk7CisJCXRoaXMuY2xzcyA9IGNsc3M7CisJfQorCQorCXByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gY2xzczsKKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gZ2V0KCBjbHNzLCBuRGltcy0xLCBzdWJjbGFzc09rICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9kb3VibGUuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfZG91YmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzMDU5MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfZG91YmxlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3IgZG91YmxlLgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX2RvdWJsZSBleHRlbmRzIFR5cGVWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IuCisJICovCisJcHVibGljIHN0YXRpYyBWYWxpZGF0b3JfZG91YmxlIGdldCggaW50IG5EaW1zICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+PSB2YWxpZGF0b3JzLmxlbmd0aCkKKwkJCXJldHVybiBuZXcgVmFsaWRhdG9yX2RvdWJsZSggbkRpbXMgKTsKKwkJCisJCVZhbGlkYXRvcl9kb3VibGUgdiA9IHZhbGlkYXRvcnNbbkRpbXNdOworCQkKKwkJaWYgKHYgPT0gbnVsbCkKKwkJCXYgPSB2YWxpZGF0b3JzW25EaW1zXSA9IG5ldyBWYWxpZGF0b3JfZG91YmxlKCBuRGltcyApOworCQkKKwkJcmV0dXJuIHY7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9kb3VibGVbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvcl9kb3VibGVbTUFYX0NBQ0hFRF07CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3JfZG91YmxlKCBpbnQgbkRpbXMgKQorCXsKKwkJc3VwZXIoIERvdWJsZS5jbGFzcywgZG91YmxlLmNsYXNzLCBuRGltcywgImRvdWJsZVsiK25EaW1zKyJdIiApOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gZ2V0KCBuRGltcy0xICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9mbG9hdC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9mbG9hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2E3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX2Zsb2F0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3IgZmxvYXQuCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0b3JfZmxvYXQgZXh0ZW5kcyBUeXBlVmFsaWRhdG9yCit7CisJLyoqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yX2Zsb2F0IGdldCggaW50IG5EaW1zICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+PSB2YWxpZGF0b3JzLmxlbmd0aCkKKwkJCXJldHVybiBuZXcgVmFsaWRhdG9yX2Zsb2F0KCBuRGltcyApOworCQkKKwkJVmFsaWRhdG9yX2Zsb2F0IHYgPSB2YWxpZGF0b3JzW25EaW1zXTsKKwkJCisJCWlmICh2ID09IG51bGwpCisJCQl2ID0gdmFsaWRhdG9yc1tuRGltc10gPSBuZXcgVmFsaWRhdG9yX2Zsb2F0KCBuRGltcyApOworCQkKKwkJcmV0dXJuIHY7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9mbG9hdFtdIHZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdG9yX2Zsb2F0W01BWF9DQUNIRURdOworCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFZhbGlkYXRvci4KKwkgKgorCSAqIEBwYXJhbSBuRGltcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLgorCSAqLworCXByaXZhdGUgVmFsaWRhdG9yX2Zsb2F0KCBpbnQgbkRpbXMgKQorCXsKKwkJc3VwZXIoIEZsb2F0LmNsYXNzLCBmbG9hdC5jbGFzcywgbkRpbXMsICJmbG9hdFsiK25EaW1zKyJdIiApOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gZ2V0KCBuRGltcy0xICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9pbnQuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZTAxNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3JfaW50LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3IgaW50LgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX2ludCBleHRlbmRzIFR5cGVWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IuCisJICovCisJcHVibGljIHN0YXRpYyBWYWxpZGF0b3JfaW50IGdldCggaW50IG5EaW1zICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+PSB2YWxpZGF0b3JzLmxlbmd0aCkKKwkJCXJldHVybiBuZXcgVmFsaWRhdG9yX2ludCggbkRpbXMgKTsKKwkJCisJCVZhbGlkYXRvcl9pbnQgdiA9IHZhbGlkYXRvcnNbbkRpbXNdOworCQkKKwkJaWYgKHYgPT0gbnVsbCkKKwkJCXYgPSB2YWxpZGF0b3JzW25EaW1zXSA9IG5ldyBWYWxpZGF0b3JfaW50KCBuRGltcyApOworCQkKKwkJcmV0dXJuIHY7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9pbnRbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvcl9pbnRbTUFYX0NBQ0hFRF07CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3JfaW50KCBpbnQgbkRpbXMgKQorCXsKKwkJc3VwZXIoIEludGVnZXIuY2xhc3MsIGludC5jbGFzcywgbkRpbXMsICJpbnRbIituRGltcysiXSIgKTsKKwl9CisKKwlwdWJsaWMgVmFsaWRhdG9yIGVsZW1lbnRWYWxpZGF0b3IoKQorCXsKKwkJcmV0dXJuIGdldCggbkRpbXMtMSApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSggT2JqZWN0IHZhbHVlICkKKwl7CisJCWlmIChuRGltcyA+IDApCisJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUoIHZhbHVlICk7CisJCQorCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCUNsYXNzPD8+IGMgPSB2YWx1ZS5nZXRDbGFzcygpOworCQkKKwkJaWYgKGMgPT0gSW50ZWdlci5jbGFzcyB8fCBjID09IFNob3J0LmNsYXNzIHx8IGMgPT0gQnl0ZS5jbGFzcykKKwkJCXJldHVybiB0cnVlOworCQkKKwkJaWYgKGMgPT0gTG9uZy5jbGFzcykKKwkJeworCQkJbG9uZyB2ID0gKExvbmcpIHZhbHVlOworCQkJcmV0dXJuIHYgPj0gSW50ZWdlci5NSU5fVkFMVUUgJiYgdiA8PSBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IHZhbGlkYXRlVmFsdWUoIE9iamVjdCB2YWx1ZSApCisJeworCQl2YWx1ZSA9IHN1cGVyLnZhbGlkYXRlVmFsdWUoIHZhbHVlICk7CisJCQorCQlpZiAodmFsdWUuZ2V0Q2xhc3MoKSA9PSBJbnRlZ2VyLmNsYXNzIHx8IG5EaW1zID4gMCkKKwkJCXJldHVybiB2YWx1ZTsKKwkJCisJCXJldHVybiAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9sb25nLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX2xvbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODM2Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9sb25nLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3IgbG9uZy4KKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRvcl9sb25nIGV4dGVuZHMgVHlwZVZhbGlkYXRvcgoreworCS8qKgorCSAqIEBwYXJhbSBuRGltcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuIDAgZm9yIGEgc2NhbGFyLgorCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHZhbGlkYXRvci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFZhbGlkYXRvcl9sb25nIGdldCggaW50IG5EaW1zICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+PSB2YWxpZGF0b3JzLmxlbmd0aCkKKwkJCXJldHVybiBuZXcgVmFsaWRhdG9yX2xvbmcoIG5EaW1zICk7CisJCQorCQlWYWxpZGF0b3JfbG9uZyB2ID0gdmFsaWRhdG9yc1tuRGltc107CisJCQorCQlpZiAodiA9PSBudWxsKQorCQkJdiA9IHZhbGlkYXRvcnNbbkRpbXNdID0gbmV3IFZhbGlkYXRvcl9sb25nKCBuRGltcyApOworCQkKKwkJcmV0dXJuIHY7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9sb25nW10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JfbG9uZ1tNQVhfQ0FDSEVEXTsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBWYWxpZGF0b3IuCisJICoKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKi8KKwlwcml2YXRlIFZhbGlkYXRvcl9sb25nKCBpbnQgbkRpbXMgKQorCXsKKwkJc3VwZXIoIExvbmcuY2xhc3MsIGxvbmcuY2xhc3MsIG5EaW1zLCAibG9uZ1siK25EaW1zKyJdIiApOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gZ2V0KCBuRGltcy0xICk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJaWYgKG5EaW1zID4gMCkKKwkJCXJldHVybiBzdXBlci52YWxpZGF0ZSggdmFsdWUgKTsKKwkJCisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJQ2xhc3M8Pz4gYyA9IHZhbHVlLmdldENsYXNzKCk7CisJCQorCQlyZXR1cm4gYyA9PSBMb25nLmNsYXNzIHx8IGMgPT0gSW50ZWdlci5jbGFzcyB8fAorCQkJYyA9PSBTaG9ydC5jbGFzcyB8fCBjID09IEJ5dGUuY2xhc3M7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgdmFsaWRhdGVWYWx1ZSggT2JqZWN0IHZhbHVlICkKKwl7CisJCXZhbHVlID0gc3VwZXIudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCisJCWlmICh2YWx1ZS5nZXRDbGFzcygpID09IExvbmcuY2xhc3MgfHwgbkRpbXMgPiAwKQorCQkJcmV0dXJuIHZhbHVlOworCQkKKwkJcmV0dXJuICgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9vYmplY3QuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3Jfb2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0NDRiNgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3Jfb2JqZWN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3Igb2JqZWN0LgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX29iamVjdCBleHRlbmRzIFR5cGVWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IuCisJICovCisJcHVibGljIHN0YXRpYyBWYWxpZGF0b3Jfb2JqZWN0IGdldCggaW50IG5EaW1zICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+PSB2YWxpZGF0b3JzLmxlbmd0aCkKKwkJCXJldHVybiBuZXcgVmFsaWRhdG9yX29iamVjdCggbkRpbXMgKTsKKwkJCisJCVZhbGlkYXRvcl9vYmplY3QgdiA9IHZhbGlkYXRvcnNbbkRpbXNdOworCQkKKwkJaWYgKHYgPT0gbnVsbCkKKwkJCXYgPSB2YWxpZGF0b3JzW25EaW1zXSA9IG5ldyBWYWxpZGF0b3Jfb2JqZWN0KCBuRGltcyApOworCQkKKwkJcmV0dXJuIHY7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9vYmplY3RbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvcl9vYmplY3RbTUFYX0NBQ0hFRF07CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3Jfb2JqZWN0KCBpbnQgbkRpbXMgKQorCXsKKwkJc3VwZXIoIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBuRGltcywgIm9iamVjdFsiK25EaW1zKyJdIiwgdHJ1ZSApOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gbkRpbXMgPiAwID8gZ2V0KCBuRGltcy0xICkgOiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3Jfc2hvcnQuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3Jfc2hvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODAzMTIzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9zaG9ydC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CisKKy8qKgorICogVmFsaWRhdG9yIGZvciBzaG9ydC4KKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRvcl9zaG9ydCBleHRlbmRzIFR5cGVWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IuCisJICovCisJcHVibGljIHN0YXRpYyBWYWxpZGF0b3Jfc2hvcnQgZ2V0KCBpbnQgbkRpbXMgKQorCXsKKwkJY2hlY2tEaW1zKCBuRGltcyApOworCQkKKwkJaWYgKG5EaW1zID49IHZhbGlkYXRvcnMubGVuZ3RoKQorCQkJcmV0dXJuIG5ldyBWYWxpZGF0b3Jfc2hvcnQoIG5EaW1zICk7CisJCQorCQlWYWxpZGF0b3Jfc2hvcnQgdiA9IHZhbGlkYXRvcnNbbkRpbXNdOworCQkKKwkJaWYgKHYgPT0gbnVsbCkKKwkJCXYgPSB2YWxpZGF0b3JzW25EaW1zXSA9IG5ldyBWYWxpZGF0b3Jfc2hvcnQoIG5EaW1zICk7CisJCQorCQlyZXR1cm4gdjsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yX3Nob3J0W10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3Jfc2hvcnRbTUFYX0NBQ0hFRF07CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3Jfc2hvcnQoIGludCBuRGltcyApCisJeworCQlzdXBlciggU2hvcnQuY2xhc3MsIHNob3J0LmNsYXNzLCBuRGltcywgInNob3J0WyIrbkRpbXMrIl0iICk7CisJfQorCisJcHVibGljIFZhbGlkYXRvciBlbGVtZW50VmFsaWRhdG9yKCkKKwl7CisJCXJldHVybiBnZXQoIG5EaW1zLTEgKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoIE9iamVjdCB2YWx1ZSApCisJeworCQlpZiAobkRpbXMgPiAwKQorCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKCB2YWx1ZSApOworCQkKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlDbGFzczw/PiBjID0gdmFsdWUuZ2V0Q2xhc3MoKTsKKwkJCisJCWlmIChjID09IFNob3J0LmNsYXNzIHx8IGMgPT0gQnl0ZS5jbGFzcykKKwkJCXJldHVybiB0cnVlOworCQkKKwkJaWYgKGMgPT0gSW50ZWdlci5jbGFzcykKKwkJeworCQkJaW50IHYgPSAoSW50ZWdlcikgdmFsdWU7CisJCQlyZXR1cm4gdiA+PSBTaG9ydC5NSU5fVkFMVUUgJiYgdiA8PSBTaG9ydC5NQVhfVkFMVUU7CisJCX0KKwkJCisJCWlmIChjID09IExvbmcuY2xhc3MpCisJCXsKKwkJCWxvbmcgdiA9IChMb25nKSB2YWx1ZTsKKwkJCXJldHVybiB2ID49IFNob3J0Lk1JTl9WQUxVRSAmJiB2IDw9IFNob3J0Lk1BWF9WQUxVRTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IHZhbGlkYXRlVmFsdWUoIE9iamVjdCB2YWx1ZSApCisJeworCQl2YWx1ZSA9IHN1cGVyLnZhbGlkYXRlVmFsdWUoIHZhbHVlICk7CisJCQorCQlpZiAodmFsdWUuZ2V0Q2xhc3MoKSA9PSBTaG9ydC5jbGFzcyB8fCBuRGltcyA+IDApCisJCQlyZXR1cm4gdmFsdWU7CisJCQorCQlyZXR1cm4gKChOdW1iZXIpIHZhbHVlKS5zaG9ydFZhbHVlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl9zdHJpbmcuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3Jfc3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2NmNjMwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9WYWxpZGF0b3Jfc3RyaW5nLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3Igc3RyaW5nLgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yX3N0cmluZyBleHRlbmRzIFR5cGVWYWxpZGF0b3IKK3sKKwkvKioKKwkgKiBAcGFyYW0gbkRpbXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLiAwIGZvciBhIHNjYWxhci4KKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IuCisJICovCisJcHVibGljIHN0YXRpYyBWYWxpZGF0b3Jfc3RyaW5nIGdldCggaW50IG5EaW1zICkKKwl7CisJCWNoZWNrRGltcyggbkRpbXMgKTsKKwkJCisJCWlmIChuRGltcyA+PSB2YWxpZGF0b3JzLmxlbmd0aCkKKwkJCXJldHVybiBuZXcgVmFsaWRhdG9yX3N0cmluZyggbkRpbXMgKTsKKwkJCisJCVZhbGlkYXRvcl9zdHJpbmcgdiA9IHZhbGlkYXRvcnNbbkRpbXNdOworCQkKKwkJaWYgKHYgPT0gbnVsbCkKKwkJCXYgPSB2YWxpZGF0b3JzW25EaW1zXSA9IG5ldyBWYWxpZGF0b3Jfc3RyaW5nKCBuRGltcyApOworCQkKKwkJcmV0dXJuIHY7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvcl9zdHJpbmdbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvcl9zdHJpbmdbTUFYX0NBQ0hFRF07CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVmFsaWRhdG9yLgorCSAqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3Jfc3RyaW5nKCBpbnQgbkRpbXMgKQorCXsKKwkJc3VwZXIoIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBuRGltcywgInN0cmluZ1siK25EaW1zKyJdIiApOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisJeworCQlyZXR1cm4gZ2V0KCBuRGltcy0xICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl92b2lkLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVmFsaWRhdG9yX3ZvaWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc1OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1ZhbGlkYXRvcl92b2lkLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIFZhbGlkYXRvciBmb3Igdm9pZC4KKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRvcl92b2lkIGltcGxlbWVudHMgVmFsaWRhdG9yCit7CisJLyoqCisJICogQHBhcmFtIG5EaW1zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4gMCBmb3IgYSBzY2FsYXIuCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yX3ZvaWQgZ2V0KCBpbnQgbkRpbXMgKQorICAgIHsKKwkJaWYgKG5EaW1zICE9IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibkRpbXMgIT0gMCIgKTsKKwkJCisJCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkKKwkJCXZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3Jfdm9pZCgpOworCQkKKwkJcmV0dXJuIHZhbGlkYXRvcjsKKyAgICB9CisJCisJcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yX3ZvaWQgdmFsaWRhdG9yOworCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFZhbGlkYXRvci4KKwkgKi8KKwlwcml2YXRlIFZhbGlkYXRvcl92b2lkKCkKKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorCisgICAgcHVibGljIFZhbGlkYXRvciBlbGVtZW50VmFsaWRhdG9yKCkKKyAgICB7CisJICAgIHJldHVybiBudWxsOworICAgIH0KKworCWZpbmFsIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJcmV0dXJuIHZhbHVlID09IG51bGw7CisJfQorCisJcHVibGljIE9iamVjdCB2YWxpZGF0ZVZhbHVlKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJaWYgKHZhbGlkYXRlKCB2YWx1ZSApKQorCQkJcmV0dXJuIHZhbHVlOworCQkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInZhbHVlIG5vdCBhcHByb3ByaWF0ZSBmb3Igdm9pZDogIit2YWx1ZSApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9fRXRjaF9BdXRoRXhjZXB0aW9uLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvX0V0Y2hfQXV0aEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTU4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvX0V0Y2hfQXV0aEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBtZXNzYWdlcyBtYXJrZWQgd2l0aCBAQXV0aG9yaXplIGZhaWwuCisgKi8KK3B1YmxpYyBjbGFzcyBfRXRjaF9BdXRoRXhjZXB0aW9uIGV4dGVuZHMgX0V0Y2hfUnVudGltZUV4Y2VwdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NTQxOTMxMjY1OTY4MTQ1NzUwTDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIF9FdGNoX0F1dGhFeGNlcHRpb24uCisJICovCisJcHVibGljIF9FdGNoX0F1dGhFeGNlcHRpb24oKQorCXsKKwkJLy8gZG9uJ3QgaW5pdCBhbnl0aGluZy4KKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBfRXRjaF9BdXRoRXhjZXB0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBtc2cgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUuCisJICovCisJcHVibGljIF9FdGNoX0F1dGhFeGNlcHRpb24oIFN0cmluZyBtc2cgKQorCXsKKwkJc3VwZXIoIG1zZyApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9fRXRjaF9SdW50aW1lRXhjZXB0aW9uLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvX0V0Y2hfUnVudGltZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZGFmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvX0V0Y2hfUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCisvKioKKyAqIEEgUnVudGltZUV4Y2VwdGlvbiB3aGljaCBleHBvc2VzIGl0cyBtc2cgZmllbGQuIFJldHVybmVkIGJ5IHRoZSBzdHViCisgKiB0byB0aGUgcmVtb3RlIHdoZW4gdGhlIHN0dWIgY2F0Y2hlcyBhIFJ1bnRpbWVFeGNlcHRpb24uCisgKiAKKyAqIFNvbWUgY29tbW9uIHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmU6CisgKiAKKyAqIHtAbGluayBBcml0aG1ldGljRXhjZXB0aW9ufQorICoge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0KKyAqIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259CisgKiB7QGxpbmsgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0KKyAqIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0KKyAqIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0KKyAqLworcHVibGljIGNsYXNzIF9FdGNoX1J1bnRpbWVFeGNlcHRpb24KKwlleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMDUxNTE1NTQxOTIzODc3MDYzTDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEV0Y2hSdW50aW1lRXhjZXB0aW9uLiBEb24ndCBpbml0IGFueXRoaW5nLgorCSAqLworCXB1YmxpYyBfRXRjaF9SdW50aW1lRXhjZXB0aW9uKCkKKwl7CisJCS8vIGRvbid0IGluaXQgYW55dGhpbmcuCisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEV0Y2hSdW50aW1lRXhjZXB0aW9uLgorCSAqIEBwYXJhbSBtc2cgZGVzY3JpcHRpb24gb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQgYnkgdGhlIHN0dWIKKwkgKiBvbiB0aGUgcmVtb3RlIHNpZGUuCisJICovCisJcHVibGljIF9FdGNoX1J1bnRpbWVFeGNlcHRpb24oIFN0cmluZyBtc2cgKQorCXsKKwkJdGhpcy5tc2cgPSBtc2c7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKKwl7CisJCXJldHVybiBtc2c7CisJfQorCisJLyoqCisJICogRGVzY3JpcHRpb24gb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQgYnkgdGhlIHN0dWIKKwkgKiBvbiB0aGUgcmVtb3RlIHNpZGUuCisJICovCisJcHVibGljIFN0cmluZyBtc2c7CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gIlJlbW90ZSBzaWRlIHRocmV3IHRoaXMgcnVudGltZSBleGNlcHRpb246ICIrZ2V0TWVzc2FnZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L0FycmF5VmFsdWUuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L0FycmF5VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjMxMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvQXJyYXlWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXJyYXlJdGVyYXRvcjsKKworCisvKioKKyAqIEFuIGFycmF5IG9mIHZhbHVlcywgd2hlcmUgZWFjaCB2YWx1ZSBpcyBvZiBhcmJpdHJhcnkgdHlwZQorICogY2hvc2VuIGZyb20gdGhlIGJhc2ljIGphdmEgdHlwZXMgYm9vbGVhbiwgYnl0ZSwgc2hvcnQsIGludCwKKyAqIGxvbmcsIGZsb2F0LCBkb3VibGUsIFN0cmluZywgYW4gYXJyYXkgb2YgdGhvc2UsIHRoZSBleHRlbmRlZAorICogdHlwZXMgQXJyYXlWYWx1ZSBhbmQgU3RydWN0VmFsdWUsIGFuZCBzcGVjaWZpYyB0eXBlcyBzdXBwb3J0ZWQKKyAqIGJ5IFZhbHVlRmFjdG9yeS4KKyAqIAorICogQXJyYXlWYWx1ZSBpcyBub3QgcHJvdGVjdGVkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBcnJheVZhbHVlIGltcGxlbWVudHMgSXRlcmFibGU8T2JqZWN0PgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEFycmF5VmFsdWUuCisJICogQHBhcmFtIGFycmF5CisJICogQHBhcmFtIGRpbQorCSAqIEBwYXJhbSBjdXN0b21TdHJ1Y3RUeXBlCisJICogQHBhcmFtIHR5cGVDb2RlCisJICovCisJcHVibGljIEFycmF5VmFsdWUoIE9iamVjdCBhcnJheSwgYnl0ZSB0eXBlQ29kZSwgVHlwZSBjdXN0b21TdHJ1Y3RUeXBlLCBpbnQgZGltICkKKwl7CisJCWlmIChhcnJheSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAiYXJyYXkgPT0gbnVsbCIgKTsKKwkJCisJCWlmICghYXJyYXkuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiIWFycmF5LmdldENsYXNzKCkuaXNBcnJheSgpIiApOworCQkKKwkJdGhpcy5hcnJheSA9IGFycmF5OworCQl0aGlzLnR5cGVDb2RlID0gdHlwZUNvZGU7CisJCXRoaXMuY3VzdG9tU3RydWN0VHlwZSA9IGN1c3RvbVN0cnVjdFR5cGU7CisJCXRoaXMuZGltID0gZGltOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIGFycmF5IHZhbHVlIHdpdGggbm8gdHlwZSBpbmZvLiBUaGlzIGlzIHVzZWQgcGVyaGFwcworCSAqIGJ5IGV4dGVybiBzdHJ1Y3Qgc2VyaWFsaXplcnMuCisJICogQHBhcmFtIGFycmF5CisJICovCisJcHVibGljIEFycmF5VmFsdWUoIE9iamVjdCBhcnJheSApCisJeworCQl0aGlzKCBhcnJheSwgKGJ5dGUpIDAsIG51bGwsIDAgKTsKKwl9CisJCisJcHJpdmF0ZSBPYmplY3QgYXJyYXk7CisJCisJcHJpdmF0ZSBmaW5hbCBieXRlIHR5cGVDb2RlOworCQorCXByaXZhdGUgZmluYWwgVHlwZSBjdXN0b21TdHJ1Y3RUeXBlOworCQorCXByaXZhdGUgZmluYWwgaW50IGRpbTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBUeXBlQ29kZSBmb3IgdGhpcyBhcnJheSB2YWx1ZS4KKwkgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFycmF5IGlzIGludFtdW10sIHRoZW4KKwkgKiB0aGUgdHlwZSB3b3VsZCBiZSBUeXBlQ29kZS5JTlQ0LgorCSAqLworCXB1YmxpYyBieXRlIHR5cGVDb2RlKCkKKwl7CisJCXJldHVybiB0eXBlQ29kZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiBhIHN0cnVjdCB0eXBlIGlmIGEgY3VzdG9tIHR5cGUgY29kZS4KKwkgKi8KKwlwdWJsaWMgVHlwZSBjdXN0b21TdHJ1Y3RUeXBlKCkKKwl7CisJCXJldHVybiBjdXN0b21TdHJ1Y3RUeXBlOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkaW1zaW9uYWxpdHkgb2YgdGhlIGFycmF5LgorCSAqIEZvciBleGFtcGxlLCBpZiB0aGUgYXJyYXkgaXMgaW50W11bXSwgdGhlCisJICogZGltZW5zaW9uYWxpdHkgd291bGQgYmUgMi4KKwkgKi8KKwlwdWJsaWMgaW50IGRpbSgpCisJeworCQlyZXR1cm4gZGltOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yKCkKKwl7CisJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvciggYXJyYXkgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorCSAqLworCXB1YmxpYyBpbnQgc2l6ZSgpCisJeworCQlyZXR1cm4gQXJyYXkuZ2V0TGVuZ3RoKCBhcnJheSApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleAorCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldCggaW50IGluZGV4ICkKKwl7CisJCXJldHVybiBBcnJheS5nZXQoIGFycmF5LCBpbmRleCApOworCX0KKworCS8qKgorCSAqIFJlYWxsb2NhdGVzIHRoZSBhcnJheSBzbyB0aGF0IGl0IGlzIG9ubHkgYXMgbG9uZyBhcyBuZWVkZWQuCisJICovCisJcHVibGljIHZvaWQgY29tcGFjdCgpCisJeworCQlpZiAoYWRkSW5kZXggPT0gc2l6ZSgpKQorCQkJcmV0dXJuOworCQkKKwkJT2JqZWN0IG5hcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKCBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgYWRkSW5kZXggKTsKKwkJU3lzdGVtLmFycmF5Y29weSggYXJyYXksIDAsIG5hcnJheSwgMCwgYWRkSW5kZXggKTsKKwkJYXJyYXkgPSBuYXJyYXk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgdmFsdWUgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXksIG1ha2luZyBtb3JlIHNwYWNlCisJICogYXZhaWxhYmxlIGlmIG5lZWRlZC4KKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGQoIE9iamVjdCB2YWx1ZSApCisJeworCQlpbnQgbiA9IHNpemUoKTsKKwkJaWYgKGFkZEluZGV4ID49IG4pCisJCXsKKwkJCWlmIChuID09IDApCisJCQkJbiA9IDg7CisJCQllbHNlCisJCQkJbiAqPSAyOworCQkJT2JqZWN0IG5hcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKCBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgbiApOworCQkJU3lzdGVtLmFycmF5Y29weSggYXJyYXksIDAsIG5hcnJheSwgMCwgYWRkSW5kZXggKTsKKwkJCWFycmF5ID0gbmFycmF5OworCQl9CisJCUFycmF5LnNldCggYXJyYXksIGFkZEluZGV4KyssIHZhbHVlICk7CisJfQorCQorCXByaXZhdGUgaW50IGFkZEluZGV4OworCisJLyoqCisJICogQHJldHVybiB0aGUgYXJyYXkgdmFsdWUuCisJICovCisJcHVibGljIE9iamVjdCBnZXRBcnJheSgpCisJeworCQlyZXR1cm4gYXJyYXk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L0RlZmF1bHREZWxpdmVyeVNlcnZpY2UuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L0RlZmF1bHREZWxpdmVyeVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU5OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvRGVmYXVsdERlbGl2ZXJ5U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWxpdmVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLk1vbml0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBEZWxpdmVyeVNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlIGltcGxlbWVudHMgRGVsaXZlcnlTZXJ2aWNlCit7CisJCisJLyoqCisJICogUGFyYW1ldGVyIHRvIEdsb2JhbGx5IERpc2FibGUgVGltZW91dC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESVNBQkxFX1RJTUVPVVQgPSAiRGVmYXVsdERlbGl2ZXJ5U2VydmljZS5kaXNhYmxlVGltZW91dCI7CisJCisJCisJcHJpdmF0ZSBib29sZWFuIGRpc2FibGVUaW1lb3V0ID0gZmFsc2U7CisJCisJLyoqCisJICogQHBhcmFtIHRyYW5zcG9ydAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICovCisJcHVibGljIERlZmF1bHREZWxpdmVyeVNlcnZpY2UoIE1haWxib3hNYW5hZ2VyIHRyYW5zcG9ydCwgU3RyaW5nIHVyaSwKKwkJUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCB0cmFuc3BvcnQsIG5ldyBVUkwoIHVyaSApLCByZXNvdXJjZXMgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdHJhbnNwb3J0CisJICogQHBhcmFtIHVyaQorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdERlbGl2ZXJ5U2VydmljZSggTWFpbGJveE1hbmFnZXIgdHJhbnNwb3J0LCBVUkwgdXJpLAorCQlSZXNvdXJjZXMgcmVzb3VyY2VzICkKKwl7CisJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworCQl0cmFuc3BvcnQuc2V0U2Vzc2lvbiggdGhpcyApOworCQlkaXNhYmxlVGltZW91dCA9IHVyaS5nZXRCb29sZWFuVGVybSggRElTQUJMRV9USU1FT1VUICwgZmFsc2UgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBNYWlsYm94TWFuYWdlciB0cmFuc3BvcnQ7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgdHJhbnNwb3J0LgorCSAqLworCXB1YmxpYyBNYWlsYm94TWFuYWdlciBnZXRUcmFuc3BvcnQoKQorCXsKKwkJcmV0dXJuIHRyYW5zcG9ydDsKKwl9CisJCisJcHVibGljIFNlc3Npb25NZXNzYWdlIGdldFNlc3Npb24oKQorCXsKKwkJcmV0dXJuIHNlc3Npb247CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25NZXNzYWdlIHNlc3Npb24gKQorCXsKKwkJaWYgKHRoaXMuc2Vzc2lvbiAhPSBudWxsKQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAib25seSBvbmUgc3R1YiBmb3Igbm93IiApOworCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCX0KKwkKKwlwcml2YXRlIFNlc3Npb25NZXNzYWdlIHNlc3Npb247CisKKwlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHNlc3Npb24uc2Vzc2lvblF1ZXJ5KCBxdWVyeSApOworCX0KKworCXB1YmxpYyB2b2lkIHNlc3Npb25Db250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc2Vzc2lvbi5zZXNzaW9uQ29udHJvbCggY29udHJvbCwgdmFsdWUgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoZXZlbnQgPT0gVVApCisJCQlzdGF0dXMuc2V0KCBVUCApOworCQllbHNlIGlmIChldmVudCA9PSBET1dOKQorCQkJc3RhdHVzLnNldCggRE9XTiApOworCQkKKwkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBldmVudCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1vbml0b3I8U3RyaW5nPiBzdGF0dXMgPSBuZXcgTW9uaXRvcjxTdHJpbmc+KCAic2Vzc2lvbiBzdGF0dXMiICk7CisKKwlwdWJsaWMgYm9vbGVhbiBzZXNzaW9uTWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gc2Vzc2lvbi5zZXNzaW9uTWVzc2FnZSggc2VuZGVyLCBtc2cgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiB0cmFuc3BvcnQudG9TdHJpbmcoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHdhaXRVcCggaW50IG1heERlbGF5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3RhdHVzLndhaXRVbnRpbEVxKCBVUCwgbWF4RGVsYXkgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHdhaXREb3duKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdGF0dXMud2FpdFVudGlsRXEoIERPV04sIG1heERlbGF5ICk7CisJfQorCisJcHVibGljIHZvaWQgdHJhbnNwb3J0TWVzc2FnZSggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQudHJhbnNwb3J0TWVzc2FnZSggcmVjaXBpZW50LCBtc2cgKTsKKwl9CisJCisJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHF1ZXJ5LmdldENsYXNzKCkgPT0gV2FpdFVwLmNsYXNzKQorCQl7CisJCQl3YWl0VXAoICgoV2FpdFVwKSBxdWVyeSkubWF4RGVsYXkgKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWVsc2UgaWYgKHF1ZXJ5LmdldENsYXNzKCkgPT0gV2FpdERvd24uY2xhc3MpCisJCXsKKwkJCXdhaXREb3duKCAoKFdhaXREb3duKSBxdWVyeSkubWF4RGVsYXkgKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIHRyYW5zcG9ydC50cmFuc3BvcnRRdWVyeSggcXVlcnkgKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGNvbnRyb2wgPT0gU1RBUlRfQU5EX1dBSVRfVVApCisJCXsKKwkJCXRyYW5zcG9ydC50cmFuc3BvcnRDb250cm9sKCBTVEFSVCwgbnVsbCApOworCQkJd2FpdFVwKCAoSW50ZWdlcikgdmFsdWUgKTsKKwkJfQorCQllbHNlIGlmIChjb250cm9sID09IFNUT1BfQU5EX1dBSVRfRE9XTikKKwkJeworCQkJdHJhbnNwb3J0LnRyYW5zcG9ydENvbnRyb2woIFNUT1AsIG51bGwgKTsKKwkJCXdhaXREb3duKCAoSW50ZWdlcikgdmFsdWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRyYW5zcG9ydC50cmFuc3BvcnRDb250cm9sKCBjb250cm9sLCB2YWx1ZSApOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdHJhbnNwb3J0Tm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQudHJhbnNwb3J0Tm90aWZ5KCBldmVudCApOworCX0KKworCXB1YmxpYyBNYWlsYm94IGJlZ2luY2FsbCggTWVzc2FnZSBtc2cgKQorCXsKKwkJdHJ5CisJCXsKKwkJCXJldHVybiB0cmFuc3BvcnQudHJhbnNwb3J0Q2FsbCggbnVsbCwgbXNnICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAidW5leHBlY3RlZCBleGNlcHRpb24gc2VuZGluZyBtZXNzYWdlIiwgZSApOworCQl9CisJfQorCisJcHVibGljIE9iamVjdCBlbmRjYWxsKCBNYWlsYm94IG1iLCBUeXBlIHJlc3BvbnNlVHlwZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlpbnQgdGltZW91dCA9IGRpc2FibGVUaW1lb3V0ID8gMCA6IHJlc3BvbnNlVHlwZS5nZXRUaW1lb3V0KCk7CisJCQlNYWlsYm94LkVsZW1lbnQgbWJlID0gbWIucmVhZCggdGltZW91dCk7CisJCQlpZiAobWJlID09IG51bGwpCisJCQkJdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oICJ0aW1lb3V0IHdhaXRpbmcgZm9yICIrcmVzcG9uc2VUeXBlICk7CisJCQlNZXNzYWdlIHJtc2cgPSBtYmUubXNnOworCQkJcm1zZy5jaGVja1R5cGUoIHJlc3BvbnNlVHlwZSApOworCQkJT2JqZWN0IHIgPSBybXNnLmdldCggcmVzcG9uc2VUeXBlLmdldFJlc3BvbnNlRmllbGQoKSApOworCQkJaWYgKHIgaW5zdGFuY2VvZiBFeGNlcHRpb24pCisJCQl7CisJCQkJRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKSByOworCQkJCWUuZmlsbEluU3RhY2tUcmFjZSgpOworCQkJCXRocm93IGU7CisJCQl9CisJCQlyZXR1cm4gcjsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCW1iLmNsb3NlUmVhZCgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvRm9ybWF0RmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvRm9ybWF0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmI0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9Gb3JtYXRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CisKKworLyoqCisgKiBBIGZhY3RvcnkgdXNlZCB0byBjb25zdHJ1Y3QgdGFnZ2VkIGRhdGEgcHJvY2Vzc29ycyBmb3IgTWVzc2FnaXplci4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIEZvcm1hdEZhY3RvcnkKK3sKKwkvKioKKwkgKiBTdGFuZGFyZCBuYW1lIGZvciBldGNoIGJpbmFyeSB0YWdnZWQgZGF0YSBmb3JtYXQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklOQVJZID0gImJpbmFyeSI7CisJCisJLyoqCisJICogU3RhbmRhcmQgbmFtZSBmb3IgZXRjaCB4bWwgdGFnZ2VkIGRhdGEgZm9ybWF0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTCA9ICJ4bWwiOworCQorCS8qKgorCSAqIEBwYXJhbSB2ZgorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcmV0dXJuIHRoZSB0YWdnZWQgZGF0YSBpbnB1dCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgZmFjdG9yeSBhbmQKKwkgKiBpbml0aWFsaXplZCBieSB0ZXJtcyBmcm9tIHRoZSB1cmkuCisJICovCisJYWJzdHJhY3QgcHVibGljIFRhZ2dlZERhdGFJbnB1dCBuZXdUYWdnZWREYXRhSW5wdXQoIFZhbHVlRmFjdG9yeSB2ZiwKKwkJU3RyaW5nIHVyaSApOworCisJLyoqCisJICogQHBhcmFtIHZmCisJICogQHBhcmFtIHVyaQorCSAqIEByZXR1cm4gdGhlIHRhZ2dlZCBkYXRhIG91dHB1dCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgZmFjdG9yeSBhbmQKKwkgKiBpbml0aWFsaXplZCBieSB0ZXJtcyBmcm9tIHRoZSB1cmkuCisJICovCisJYWJzdHJhY3QgcHVibGljIFRhZ2dlZERhdGFPdXRwdXQgbmV3VGFnZ2VkRGF0YU91dHB1dCggVmFsdWVGYWN0b3J5IHZmLAorCQlTdHJpbmcgdXJpICk7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBmb3JtYXRGYWN0b3JpZXMgPQorCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpICk7CisJCisJLyoqCisJICogR2V0cyB0aGUgbmFtZWQgZm9ybWF0IGZhY3RvcnkuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBjb25maWd1cmVkIGZvcm1hdCBmYWN0b3J5LgorCSAqIEByZXR1cm4gdGhlIG5hbWVkIGZvcm1hdCBmYWN0b3J5LCBvciBudWxsIGlmIGl0IGlzbid0IGRlZmluZWQuCisJICovCisJcHVibGljIHN0YXRpYyBGb3JtYXRGYWN0b3J5IGdldCggU3RyaW5nIG5hbWUgKQorCXsKKwkJT2JqZWN0IGZhY3RvcnkgPSBmb3JtYXRGYWN0b3JpZXMuZ2V0KCBuYW1lICk7CisJCQorCQlpZiAoZmFjdG9yeSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIFN0cmluZykKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJQ2xhc3M8Pz4gYyA9IENsYXNzLmZvck5hbWUoIChTdHJpbmcpIGZhY3RvcnkgKTsKKwkJCQlmYWN0b3J5ID0gYy5uZXdJbnN0YW5jZSgpOworCQkJCWlmICghKGZhY3RvcnkgaW5zdGFuY2VvZiBGb3JtYXRGYWN0b3J5KSkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCSJpbnN0YW5jZSBmb3IgZm9ybWF0IG5hbWUgIituYW1lKyIgKCIrCisJCQkJCQlmYWN0b3J5KyIpIGRvZXMgbm90IGltcGxlbWVudCBGb3JtYXRGYWN0b3J5IiApOworCQkJCWZvcm1hdEZhY3Rvcmllcy5wdXQoIG5hbWUsIGZhY3RvcnkgKTsKKwkJCQlyZXR1cm4gKEZvcm1hdEZhY3RvcnkpIGZhY3Rvcnk7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiY291bGQgbm90IGNyZWF0ZSBpbnN0YW5jZSBvZiBmb3JtYXQgbmFtZSAiK25hbWUsIGUgKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIChGb3JtYXRGYWN0b3J5KSBmYWN0b3J5OworCX0KKwkKKwkvKioKKwkgKiBQdXRzIGEgbmFtZWQgZm9ybWF0IGZhY3RvcnkuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhpcyBmb3JtYXQgZmFjdG9yeSAoZS5nLiwgImJpbmFyeSIpLgorCSAqIEBwYXJhbSBmYWN0b3J5IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciBpbnN0YW5jZQorCSAqIG9mIHRoZSBGb3JtYXRGYWN0b3J5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBwdXQoIFN0cmluZyBuYW1lLCBPYmplY3QgZmFjdG9yeSApCisJeworCQlmb3JtYXRGYWN0b3JpZXMucHV0KCBuYW1lLCBmYWN0b3J5ICk7CisJfQorCQorCXN0YXRpYworCXsKKwkJcHV0KCBCSU5BUlksCisJCQkib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LmZtdC5iaW5hcnkuQmluYXJ5VGFnZ2VkRGF0YUZvcm1hdEZhY3RvcnkiICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvTWFpbGJveE1hbmFnZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L01haWxib3hNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZGRmZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L01haWxib3hNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuRGVsaXZlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuTWFpbGJveDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKKworCisvKioKKyAqIEludGVyZmFjZSB0byB0aGUgbWFpbGJveCBtYW5hZ2VyIGFzIG5lZWRlZCBieSB7QGxpbmsgRGVsaXZlcnlTZXJ2aWNlfSBhbmQKKyAqIHtAbGluayBNYWlsYm94fSBpbXBsZW1lbnRvcnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWFpbGJveE1hbmFnZXIgZXh0ZW5kcyBTZXNzaW9uTWVzc2FnZSwgVHJhbnNwb3J0TWVzc2FnZQoreworCS8qKgorCSAqIFNlbmRzIGEgbWVzc2FnZSB3aGljaCBiZWdpbnMgYSBjYWxsIGFmdGVyIGFsbG9jYXRpbmcgYSBNYWlsYm94IHRvCisJICogcmVjZWl2ZSBhbnkgcmVzcG9uc2VzLgorCSAqIEBwYXJhbSByZWNpcGllbnQgc3BlY2lmaWVzIHRoZSByZWNpcGllbnQgd2hlbiB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkKKwkgKiBvZiBtb3JlIHRoYW4gb25lLgorCSAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2Ugd2hpY2ggYmVnaW5zIHRoZSBjYWxsLgorCSAqIEByZXR1cm4gdGhlIG1haWxib3ggd2hpY2ggd2lsbCByZWNlaXZlIHJlc3BvbnNlcyB0byB0aGlzIGNhbGwuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTWFpbGJveCB0cmFuc3BvcnRDYWxsKCBXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogUmVtb3ZlcyB0aGUgbWFpbGJveCBmcm9tIHRoZSBzZXQgb2YgbWFpbGJveGVzIHJlY2VpdmluZyByZXNwb25zZXMgdG8KKwkgKiBtZXNzYWdlcy4KKwkgKiBAcGFyYW0gbWIgYSBtYWlsYm94IGFzIHJldHVybmVkIGJ5IHtAbGluayAjdHJhbnNwb3J0Q2FsbChXaG8sIE1lc3NhZ2UpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKCBNYWlsYm94IG1iICk7CisKKwkvKioKKwkgKiBSZS1kZWxpdmVycyBkZWFkIGxldHRlciBtZXNzYWdlcyBmcm9tIGEgY2xvc2VkIG1haWxib3guCisJICogQHBhcmFtIHNlbmRlcgorCSAqIEBwYXJhbSBtc2cKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHJlZGVsaXZlciggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvTWVzc2FnaXplci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvTWVzc2FnaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YzA1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9NZXNzYWdpemVyLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb25QYWNrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnRQYWNrZXQ7CisKKworLyoqCisgKiBNZXNzYWdpemVyIGlzIGEgUGFja2V0SGFuZGxlciB3aGljaCBhY2NlcHRzIHBhY2tldHMgZnJvbQorICogYSBQYWNrZXRTb3VyY2UgYW5kIHR1cm5zIHRoZW0gaW50byBtZXNzYWdlcyBmb3IgZGVsaXZlcnkKKyAqIHRvIGEgTWVzc2FnZUhhbmRsZXIuIE1lc3NhZ2l6ZXIgaXMgYWxzbyBhIE1lc3NhZ2VTb3VyY2UsCisgKiBhY2NlcHRpbmcgbWVzc2FnZXMgYW5kIHR1cm5pbmcgdGhlbSBpbnRvIHBhY2tldHMgZm9yIGRlbGl2ZXJ5CisgKiB0byBhIFBhY2tldFNvdXJjZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2l6ZXIgaW1wbGVtZW50cyBTZXNzaW9uUGFja2V0LCBUcmFuc3BvcnRNZXNzYWdlCit7CisJLyoqCisJICogTmFtZSBvZiBmb3JtYXQgbmFtZSBpbiB1cmkgb3IgcmVzb3VyY2VzLiBUaGUgdmFsdWUgaXMgIk1lc3NhZ2l6ZXIuZm9ybWF0Ii4KKwkgKiBUaGUgcmVzdWx0IG9mIGxvb2tpbmcgdXAgdGhpcyBuYW1lIHNob3VsZCBiZSBhIFN0cmluZy4KKwkgKiAKKwkgKiBAc2VlICNNZXNzYWdpemVyKFRyYW5zcG9ydFBhY2tldCwgU3RyaW5nLCBSZXNvdXJjZXMpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUID0gIk1lc3NhZ2l6ZXIuZm9ybWF0IjsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBNZXNzYWdpemVyIHdpdGggbnVsbCBoYW5kbGVyIGFuZCB0YWdnZWQgZGF0YSBmb3JtYXQKKwkgKiBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBmb3JtYXQgZmFjdG9yeS4KKwkgKiBAcGFyYW0gdHJhbnNwb3J0IHVzZWQgdG8gZGVsaXZlciBwYWNrZXRzIHRvIHRoZSBwZWVyCisJICogQHBhcmFtIHVyaSB0aGUgdXJpIGJlaW5nIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc3BvcnQgc3RhY2suCisJICogQHBhcmFtIHJlc291cmNlcyB0aGUgYXNzb2NpYXRlZCBzZXQgb2YgcmVzb3VyY2VzIGZvciB0aGlzIHNlcnZpY2UuCisJICovCisJcHVibGljIE1lc3NhZ2l6ZXIoIFRyYW5zcG9ydFBhY2tldCB0cmFuc3BvcnQsIFN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJdGhpcyggdHJhbnNwb3J0LCBuZXcgVVJMKCB1cmkgKSwgcmVzb3VyY2VzICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIE1lc3NhZ2l6ZXIgd2l0aCBudWxsIGhhbmRsZXIgYW5kIHRhZ2dlZCBkYXRhIGZvcm1hdAorCSAqIGNvbnN0cnVjdGVkIGZyb20gdGhlIGZvcm1hdCBmYWN0b3J5LgorCSAqIEBwYXJhbSB0cmFuc3BvcnQgdXNlZCB0byBkZWxpdmVyIHBhY2tldHMgdG8gdGhlIHBlZXIKKwkgKiBAcGFyYW0gdXJpIHRoZSB1cmkgYmVpbmcgdXNlZCB0byBjb25maWd1cmUgdGhlIHRyYW5zcG9ydCBzdGFjay4KKwkgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSBhc3NvY2lhdGVkIHNldCBvZiByZXNvdXJjZXMgZm9yIHRoaXMgc2VydmljZS4KKwkgKi8KKwlwdWJsaWMgTWVzc2FnaXplciggVHJhbnNwb3J0UGFja2V0IHRyYW5zcG9ydCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQkvLyBmaW5kIHRoZSBmb3JtYXQuCisJCQorCQlTdHJpbmcgZm9ybWF0ID0gdXJpLmdldFRlcm0oIEZPUk1BVCwgRm9ybWF0RmFjdG9yeS5CSU5BUlkgKTsKKwkJCisJCS8vIGZpbmQgdGhlIGZvcm1hdCBmYWN0b3J5LgorCQkKKwkJRm9ybWF0RmFjdG9yeSBmZiA9IEZvcm1hdEZhY3RvcnkuZ2V0KCBmb3JtYXQgKTsKKwkJaWYgKGZmID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCVN0cmluZy5mb3JtYXQoICJmb3JtYXQgZmFjdG9yeSBpcyBub3QgZGVmaW5lZCBhcyAnJXMnIGluIGZvcm1hdCBmYWN0b3JpZXMiLCBmb3JtYXQgKSApOworCQkKKwkJLy8gZmluZCB0aGUgdmFsdWUgZmFjdG9yeS4KKwkJCisJCVZhbHVlRmFjdG9yeSB2ZiA9IChWYWx1ZUZhY3RvcnkpIHJlc291cmNlcy5nZXQoIFRyYW5zcG9ydC5WQUxVRV9GQUNUT1JZICk7CisJCWlmICh2ZiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQlTdHJpbmcuZm9ybWF0KCAidmFsdWUgZmFjdG9yeSBpcyBub3QgZGVmaW5lZCBhcyAnJXMnIGluIHJlc291cmNlcyIsIFRyYW5zcG9ydC5WQUxVRV9GQUNUT1JZICkgKTsKKwkJCisJCS8vIGNvbnN0cnVjdCB0aGUgbWVzc2FnZSBmb3JtYXR0ZXJzLgorCQkKKwkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisJCXRkaSA9IGZmLm5ld1RhZ2dlZERhdGFJbnB1dCggdmYsIHVyaS50b1N0cmluZygpICk7CisJCXRkbyA9IGZmLm5ld1RhZ2dlZERhdGFPdXRwdXQoIHZmLCB1cmkudG9TdHJpbmcoKSApOworCQkKKwkJdHJhbnNwb3J0LnNldFNlc3Npb24oIHRoaXMgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBUcmFuc3BvcnRQYWNrZXQgdHJhbnNwb3J0OworCQorCXByaXZhdGUgZmluYWwgVGFnZ2VkRGF0YUlucHV0IHRkaTsKKwkKKwlwcml2YXRlIGZpbmFsIFRhZ2dlZERhdGFPdXRwdXQgdGRvOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHRyYW5zcG9ydC4KKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0UGFja2V0IGdldFRyYW5zcG9ydCgpCisJeworCQlyZXR1cm4gdHJhbnNwb3J0OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiTWVzc2FnaXplci8lcyIsIHRyYW5zcG9ydCApOworCX0KKworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25QYWNrZXQoIFdobyBzZW5kZXIsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbWVzc2FnaXplIHRoZSBwYWNrZXQuCisJCQorCQlNZXNzYWdlIG1zZyA9IHRkaS5yZWFkTWVzc2FnZSggYnVmICk7CisvLwkJTG9nLnJlcG9ydCggIk1lc3NhZ2l6ZXIucGFja2V0IiwgIndobyIsIHRoaXMsICJyZWN2IiwgbXNnICk7CisJCWJvb2xlYW4gaGFuZGxlZCA9IHNlc3Npb24uc2Vzc2lvbk1lc3NhZ2UoIHNlbmRlciwgbXNnICk7CisJCWlmICghaGFuZGxlZCkKKwkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggbmV3IFVud2FudGVkTWVzc2FnZSggc2VuZGVyLCBtc2cgKSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTWVzc2FnZSBTb3VyY2UgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE1lc3NhZ2UoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gcGFja2V0aXplIHRoZSBtZXNzYWdlLgorCQkKKwkJc3luY2hyb25pemVkIChtc2dCdWYpCisJCXsKKwkJCXRyeQorCQkJeworLy8JCQkJTG9nLnJlcG9ydCggIk1lc3NhZ2l6ZXIucGFja2V0IiwgIndobyIsIHRoaXMsICJzZW5kIiwgbXNnICk7CisJCQkJLy8gYXNzZXJ0IHRoYXQgbXNnQnVmIGlzIHJlc2V0LgorCQkJCS8vIGxlYXZlIHNwYWNlIGZvciB0aGUgcGFja2V0IGhlYWRlcgorCQkJCW1zZ0J1Zi5za2lwKCB0cmFuc3BvcnQuaGVhZGVyU2l6ZSgpLCB0cnVlICk7CisJCQkJdGRvLndyaXRlTWVzc2FnZSggbXNnLCBtc2dCdWYgKTsKKwkJCQltc2dCdWYuc2V0SW5kZXgoIDAgKTsKKwkJCQl0cmFuc3BvcnQudHJhbnNwb3J0UGFja2V0KCByZWNpcGllbnQsIG1zZ0J1ZiApOworCQkJfQorCQkJZmluYWxseQorCQkJeworCQkJCW1zZ0J1Zi5yZXNldCgpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgZmluYWwgRmxleEJ1ZmZlciBtc2dCdWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNvdXJjZUhhbmRsZXIgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBzZXNzaW9uLnNlc3Npb25RdWVyeSggcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlc3Npb24uc2Vzc2lvbkNvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBldmVudCApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU291cmNlIG1ldGhvZHMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHRyYW5zcG9ydC50cmFuc3BvcnRRdWVyeSggcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdHJhbnNwb3J0LnRyYW5zcG9ydENvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJfQorCisJcHVibGljIHZvaWQgdHJhbnNwb3J0Tm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQudHJhbnNwb3J0Tm90aWZ5KCBldmVudCApOworCX0KKworCXB1YmxpYyBTZXNzaW9uTWVzc2FnZSBnZXRTZXNzaW9uKCkKKwl7CisJCXJldHVybiBzZXNzaW9uOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKCBTZXNzaW9uTWVzc2FnZSBzZXNzaW9uICkKKwl7CisJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisJfQorCQorCXByaXZhdGUgU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1BsYWluTWFpbGJveC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvUGxhaW5NYWlsYm94LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmNGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1BsYWluTWFpbGJveC5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFsYXJtTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQWxhcm1NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkNpcmN1bGFyUXVldWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CisKKworLyoqCisgKiBBIHBsYWluIGltcGxlbWVudGF0aW9uIG9mIGEgbWFpbGJveCB1c2luZyBhIGZpeGVkIHNpemUgY2lyY3VsYXIgcXVldWUuCisgKi8KK3B1YmxpYyBjbGFzcyBQbGFpbk1haWxib3ggaW1wbGVtZW50cyBNYWlsYm94LCBBbGFybUxpc3RlbmVyCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgTWFpbGJveC4KKwkgKgorCSAqIEBwYXJhbSBtYWlsYm94TWFuYWdlciB0aGUgbWFpbGJveCBtYW5hZ2VyIHRvIHVzZSB0byB1bnJlZ2lzdGVyIHRoaXMgbWFpbGJveAorCSAqIGFuZCB0byBkZWxpdmVyIHVuZGVsaXZlcmVkIG1lc3NhZ2VzLgorCSAqIEBwYXJhbSBtZXNzYWdlSWQgbWVzc2FnZSBpZCBvZiB0aGUgbWVzc2FnZSB3aG9zZSByZXBseSB3aWxsIGNvbWUgdG8gdGhpcworCSAqIG1haWxib3guCisJICovCisJcHVibGljIFBsYWluTWFpbGJveCggTWFpbGJveE1hbmFnZXIgbWFpbGJveE1hbmFnZXIsIExvbmcgbWVzc2FnZUlkICkKKwl7CisJCWlmIChtYWlsYm94TWFuYWdlciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAibWFpbGJveE1hbmFnZXIgPT0gbnVsbCIgKTsKKwkJCisJCWlmIChtZXNzYWdlSWQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbiggIm1lc3NhZ2VJZCA9PSBudWxsIiApOworCQkKKwkJdGhpcy5tYWlsYm94TWFuYWdlciA9IG1haWxib3hNYW5hZ2VyOworCQl0aGlzLm1lc3NhZ2VJZCA9IG1lc3NhZ2VJZDsKKwkJCisJCXF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8TWFpbGJveC5FbGVtZW50PiggMSApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1haWxib3hNYW5hZ2VyIG1haWxib3hNYW5hZ2VyOworCQorCXByaXZhdGUgZmluYWwgTG9uZyBtZXNzYWdlSWQ7CisJCisJcHJpdmF0ZSBib29sZWFuIGFsYXJtU2V0OworCQorCXByaXZhdGUgZmluYWwgQ2lyY3VsYXJRdWV1ZTxNYWlsYm94LkVsZW1lbnQ+IHF1ZXVlOworCisJLyoqCisJICogQHJldHVybiB0aGUgbWFpbGJveE1hbmFnZXIgb2YgdGhpcyBtYWlsYm94LgorCSAqLworCXB1YmxpYyBNYWlsYm94TWFuYWdlciBnZXRNYWlsYm94TWFuYWdlcigpCisJeworCQlyZXR1cm4gbWFpbGJveE1hbmFnZXI7CisJfQorCisJcHVibGljIExvbmcgZ2V0TWVzc2FnZUlkKCkKKwl7CisJCXJldHVybiBtZXNzYWdlSWQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gbWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlib29sZWFuIG9rID0gcXVldWUucHV0KCBuZXcgTWFpbGJveC5FbGVtZW50KCBzZW5kZXIsIG1zZyApLCAtMSApOworCQlpZiAob2spCisJCQlmaXJlTm90aWZ5KCk7CisJCXJldHVybiBvazsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGZpcmVOb3RpZnkoKQorCXsKKwkJTm90aWZ5IG47CisJCU9iamVjdCBzOworCQlib29sZWFuIGM7CisJCQorCQlzeW5jaHJvbml6ZWQgKHF1ZXVlKQorCQl7CisJCQluID0gbm90aWZ5OworCQkJcyA9IHN0YXRlOworCQkJYyA9IHF1ZXVlLmlzQ2xvc2VkKCk7CisJCX0KKwkJCisJCWlmIChuICE9IG51bGwpCisJCQluLm1haWxib3hTdGF0dXMoIHRoaXMsIHMsIGMgKTsKKwl9CisKKwlwdWJsaWMgTWFpbGJveC5FbGVtZW50IHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwl7CisJCXJldHVybiBxdWV1ZS5nZXQoKTsKKwl9CisJCisJcHVibGljIE1haWxib3guRWxlbWVudCByZWFkKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwl7CisJCXJldHVybiBxdWV1ZS5nZXQoIG1heERlbGF5ICk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNsb3NlRGVsaXZlcnkoKQorCXsKKwkJc3luY2hyb25pemVkIChxdWV1ZSkKKwkJeworCQkJaWYgKHF1ZXVlLmlzQ2xvc2VkKCkpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQlpZiAoYWxhcm1TZXQpCisJCQl7CisJCQkJYWxhcm1TZXQgPSBmYWxzZTsKKwkJCQlBbGFybU1hbmFnZXIuc3RhdGljUmVtb3ZlKCB0aGlzICk7CisJCQl9CisJCQkKKwkJCW1haWxib3hNYW5hZ2VyLnVucmVnaXN0ZXIoIHRoaXMgKTsKKwkJCXF1ZXVlLmNsb3NlKCk7CisJCX0KKwkJCisJCWZpcmVOb3RpZnkoKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2xvc2VSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGNsb3NlRGVsaXZlcnkoKSkKKwkJeworCQkJTWFpbGJveC5FbGVtZW50IG1iZTsKKwkJCXdoaWxlICgobWJlID0gcmVhZCgpKSAhPSBudWxsKQorCQkJCW1haWxib3hNYW5hZ2VyLnJlZGVsaXZlciggbWJlLnNlbmRlciwgbWJlLm1zZyApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBpbnQgd2FrZXVwKCBBbGFybU1hbmFnZXIgbWFuYWdlciwgT2JqZWN0IHhzdGF0ZSwgbG9uZyBkdWUgKQorCXsKKwkJY2xvc2VEZWxpdmVyeSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWdpc3Rlck5vdGlmeSggTm90aWZ5IG5ld05vdGlmeSwgT2JqZWN0IG5ld1N0YXRlLCBpbnQgbWF4RGVsYXkgKQorCXsKKwkJaWYgKG5ld05vdGlmeSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAibmV3Tm90aWZ5ID09IG51bGwiICk7CisJCQorCQlpZiAobWF4RGVsYXkgPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm1heERlbGF5IDwgMCIgKTsKKwkJCisJCWJvb2xlYW4gaXNOb3RFbXB0eU9ySXNDbG9zZWQ7CisJCQorCQlzeW5jaHJvbml6ZWQgKHF1ZXVlKQorCQl7CisJCQlpZiAobm90aWZ5ICE9IG51bGwpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggInRoaXMubm90aWZ5ICE9IG51bGwiICk7CisJCQkKKwkJCW5vdGlmeSA9IG5ld05vdGlmeTsKKwkJCXN0YXRlID0gbmV3U3RhdGU7CisJCQkKKwkJCWlmIChtYXhEZWxheSA+IDApCisJCQl7CisJCQkJYWxhcm1TZXQgPSB0cnVlOworCQkJCUFsYXJtTWFuYWdlci5zdGF0aWNBZGQoIHRoaXMsIG51bGwsIG1heERlbGF5ICk7CisJCQl9CisJCQkKKwkJCWlzTm90RW1wdHlPcklzQ2xvc2VkID0gIXF1ZXVlLmlzRW1wdHkoKSB8fCBxdWV1ZS5pc0Nsb3NlZCgpOworCQl9CisJCQorCQlpZiAoaXNOb3RFbXB0eU9ySXNDbG9zZWQpCisJCQlmaXJlTm90aWZ5KCk7CisJfQorCisJcHVibGljIHZvaWQgdW5yZWdpc3Rlck5vdGlmeSggTm90aWZ5IG9sZE5vdGlmeSApCisJeworCQlpZiAob2xkTm90aWZ5ID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJvbGROb3RpZnkgPT0gbnVsbCIgKTsKKwkJCisJCWlmIChub3RpZnkgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCXN5bmNocm9uaXplZCAocXVldWUpCisJCXsKKwkJCWlmIChvbGROb3RpZnkgIT0gbm90aWZ5KQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJvbGROb3RpZnkgIT0gdGhpcy5ub3RpZnkiICk7CisJCQkKKwkJCWlmIChhbGFybVNldCkKKwkJCXsKKwkJCQlhbGFybVNldCA9IGZhbHNlOworCQkJCUFsYXJtTWFuYWdlci5zdGF0aWNSZW1vdmUoIHRoaXMgKTsKKwkJCX0KKwkJCQorCQkJbm90aWZ5ID0gbnVsbDsKKwkJCXN0YXRlID0gbnVsbDsKKwkJfQorCX0KKwkKKwlwcml2YXRlIE5vdGlmeSBub3RpZnk7CisJCisJcHJpdmF0ZSBPYmplY3Qgc3RhdGU7CisKKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKwl7CisJCXJldHVybiBxdWV1ZS5pc0VtcHR5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKKwl7CisJCXJldHVybiBxdWV1ZS5pc0Nsb3NlZCgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRnVsbCgpCisJeworCQlyZXR1cm4gcXVldWUuaXNGdWxsKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvUGxhaW5NYWlsYm94TWFuYWdlci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvUGxhaW5NYWlsYm94TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzlkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9QbGFpbk1haWxib3hNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyODUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuTWFpbGJveDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5JZEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvbjsKKworCisvKioKKyAqIE1haWxib3hNYW5hZ2VyIGlzIGEgTWVzc2FnZUhhbmRsZXIgd2hpY2ggYWNjZXB0cyBwYWNrZXRzIGZvcgorICogcG9zc2libGUgZGVsaXZlcnkgdG8gYSBtYWlsYm94LCBvciB0byBhbm90aGVyIG1lc3NhZ2UgaGFuZGxlcgorICogaWYgYW4gYXBwcm9wcmlhdGUgbWFpbGJveCBjYW5ub3QgYmUgZm91bmQuIE1haWxib3hNYW5hZ2VyIGlzCisgKiBhbHNvIGEgTWVzc2FnZVNvdXJjZSwgdGFnZ2luZyBtZXNzYWdlcyB3aXRoIG1zZ2lkcyBhbmQgdGhlbgorICogZm9yd2FyZGluZyB0aGVtIHRvIGFub3RoZXIgTWVzc2FnZVNvdXJjZS4gSWYgcmVxdWVzdGVkLCBhCisgKiBtYWlsYm94IGlzIGNyZWF0ZWQgd2l0aCBhIG1lc3NhZ2UncyBtc2dpZCBhbmQgYWRkZWQgdG8gdGhlCisgKiBzZXQgb2YgbWFpbGJveGVzIHdhaXRpbmcgZm9yIG1lc3NhZ2VzLgorICovCitwdWJsaWMgY2xhc3MgUGxhaW5NYWlsYm94TWFuYWdlciBpbXBsZW1lbnRzIE1haWxib3hNYW5hZ2VyCit7CisJLyoqCisJICogQHBhcmFtIHRyYW5zcG9ydCB1c2VkIHRvIGRlbGl2ZXIgbWVzc2FnZXMgdG8gb3VyIHBlZXIuCisJICogQHBhcmFtIHVyaQorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKi8KKwlwdWJsaWMgUGxhaW5NYWlsYm94TWFuYWdlciggVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFN0cmluZyB1cmksCisJCVJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJdGhpcyggdHJhbnNwb3J0LCBuZXcgVVJMKCB1cmkgKSwgcmVzb3VyY2VzICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHRyYW5zcG9ydCB1c2VkIHRvIGRlbGl2ZXIgbWVzc2FnZXMgdG8gb3VyIHBlZXIuCisJICogQHBhcmFtIHVyaQorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKi8KKwlwdWJsaWMgUGxhaW5NYWlsYm94TWFuYWdlciggVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksCisJCVJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisJCXRyYW5zcG9ydC5zZXRTZXNzaW9uKCB0aGlzICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQ7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgdHJhbnNwb3J0LgorCSAqLworCXB1YmxpYyBUcmFuc3BvcnRNZXNzYWdlIGdldFRyYW5zcG9ydCgpCisJeworCQlyZXR1cm4gdHJhbnNwb3J0OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiUGxhaW5NYWlsYm94TWFuYWdlci8lcyIsIHRyYW5zcG9ydCApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBNZXNzYWdlSGFuZGxlciBtZXRob2RzIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vTG9nLnJlcG9ydCggIk1haWxib3hNYW5hZ2VyLnJlY3YiLCAibXNnIiwgbXNnICk7CisJCUxvbmcgbXNnaWQgPSBtc2cuZ2V0SW5SZXBseVRvKCk7CisJCWlmIChtc2dpZCAhPSBudWxsKQorCQl7CisJCQlNYWlsYm94IG1iID0gZ2V0TWFpbGJveCggbXNnaWQgKTsKKwkJCS8vTG9nLnJlcG9ydCggIk1haWxib3hNYW5hZ2VyLnJlY3YiLCAibXNnIiwgbXNnLCAibWIiLCBtYiApOworCQkJaWYgKG1iICE9IG51bGwpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlyZXR1cm4gbWIubWVzc2FnZSggc2VuZGVyLCBtc2cgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCS8vIHRpbWVvdXQgb3IgbWFpbGJveCBjbG9zZWQgLSBmYWxsIHRocm91Z2gKKwkJCQl9CisJCQl9CisJCQkvLyBubyBzdWNoIG1haWxib3ggLSByZWplY3QKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvLyBubyBtc2dpZCAtIHBhc3Mgb2ZmIHRvIHNlc3Npb24KKwkJcmV0dXJuIHNlc3Npb24uc2Vzc2lvbk1lc3NhZ2UoIHNlbmRlciwgbXNnICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTWVzc2FnZVNvdXJjZSBtZXRob2RzIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRNZXNzYWdlKCBXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChtc2cuZ2V0TWVzc2FnZUlkKCkgIT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gc2VudCIgKTsKKwkJCisJCW1zZy5zZXRNZXNzYWdlSWQoIGlkR2VuLm5leHQoKSApOworCQkKKwkJLy9Mb2cucmVwb3J0KCAiTWFpbGJveE1hbmFnZXIuc2VuZCIsICJtc2ciLCBtc2cgKTsKKwkJCisJCXRyYW5zcG9ydC50cmFuc3BvcnRNZXNzYWdlKCByZWNpcGllbnQsIG1zZyApOworCX0KKworCXB1YmxpYyBNYWlsYm94IHRyYW5zcG9ydENhbGwoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKG1zZy5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIm1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBzZW50IiApOworCQkKKwkJaWYgKG1zZy5nZXRJblJlcGx5VG8oKSAhPSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIm1lc3NhZ2UgaXMgbWFya2VkIGFzIGEgcmVwbHkiICk7CisJCQorCQlMb25nIG1zZ2lkID0gaWRHZW4ubmV4dCgpOworCQltc2cuc2V0TWVzc2FnZUlkKCBtc2dpZCApOworCQkKKwkJTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIHRoaXMsIG1zZ2lkICk7CisJCXJlZ2lzdGVyKCBtYiApOworCQkKKwkJLy9Mb2cucmVwb3J0KCAiTWFpbGJveE1hbmFnZXIuc2VuZCIsICJtc2ciLCBtc2cgKTsKKworCQl0cnkKKwkJeworCQkJdHJhbnNwb3J0LnRyYW5zcG9ydE1lc3NhZ2UoIHJlY2lwaWVudCwgbXNnICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXVucmVnaXN0ZXIoIG1iICk7CisJCQl0aHJvdyBlOworCQl9CisJCQorCQlyZXR1cm4gbWI7CisJfQorCQorCXByaXZhdGUgZmluYWwgSWRHZW5lcmF0b3IgaWRHZW4gPSBuZXcgSWRHZW5lcmF0b3IoIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCAzNyApOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTWFpbGJveCBtZXRob2RzIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQWRkcyBhIG1haWxib3ggdG8gdGhlIHNldCBvZiBtYWlsYm94IHJlY2VpdmluZyByZXNwb25zZXMKKwkgKiB0byBtZXNzYWdlcy4KKwkgKiBAcGFyYW0gbWIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWdpc3RlciggTWFpbGJveCBtYiApCisJeworCQlMb25nIG1zZ2lkID0gbWIuZ2V0TWVzc2FnZUlkKCk7CisJCXN5bmNocm9uaXplZCAobWFpbGJveGVzKQorCQl7CisJCQlpZiAoIXVwKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJjb25uZWN0aW9uIGRvd24iICk7CisJCQkKKwkJCWlmIChtYWlsYm94ZXMuY29udGFpbnNLZXkoIG1zZ2lkICkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImR1cCBtc2dpZCBpbiBtYWlsYm94ZXMiICk7CisJCQkKKwkJCW1haWxib3hlcy5wdXQoIG1zZ2lkLCBtYiApOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdW5yZWdpc3RlciggTWFpbGJveCBtYiApCisJeworCQltYWlsYm94ZXMucmVtb3ZlKCBtYi5nZXRNZXNzYWdlSWQoKSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdW5yZWdpc3RlckFsbCgpCisJeworCQlmb3IgKE1haWxib3ggbWI6IG1haWxib3hlcy52YWx1ZXMoKS50b0FycmF5KCBuZXcgTWFpbGJveFswXSApKQorCQkJbWIuY2xvc2VEZWxpdmVyeSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtYWlsYm94IGZvciB0aGUgc3BlY2lmaWVkIG1zZ2lkLiBUaGlzIGlzIGEgdGVzdGluZyBhcGkuCisJICogQHBhcmFtIG1zZ2lkCisJICogQHJldHVybiB0aGUgbWFpbGJveCBmb3IgdGhlIHNwZWNpZmllZCBtc2dpZC4KKwkgKi8KKwlwdWJsaWMgTWFpbGJveCBnZXRNYWlsYm94KCBMb25nIG1zZ2lkICkKKwl7CisJCXJldHVybiBtYWlsYm94ZXMuZ2V0KCBtc2dpZCApOworCX0KKwkKKwlwcml2YXRlIE1hcDxMb25nLCBNYWlsYm94PiBtYWlsYm94ZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoCisJCW5ldyBIYXNoTWFwPExvbmcsIE1haWxib3g+KCkgKTsKKworCXB1YmxpYyB2b2lkIHJlZGVsaXZlciggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzZXNzaW9uLnNlc3Npb25NZXNzYWdlKCBzZW5kZXIsIG1zZyApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtYWlsYm94ZXMKKwkgKi8KKwlwdWJsaWMgaW50IHNpemUoKQorCXsKKwkJcmV0dXJuIG1haWxib3hlcy5zaXplKCk7CisJfQorCQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNvdXJjZUhhbmRsZXIgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBzZXNzaW9uLnNlc3Npb25RdWVyeSggcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlc3Npb24uc2Vzc2lvbkNvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGV2ZW50ID09IFNlc3Npb24uVVApCisJCXsKKwkJCXVwID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmIChldmVudCA9PSBTZXNzaW9uLkRPV04pCisJCXsKKwkJCXVwID0gZmFsc2U7CisJCQl1bnJlZ2lzdGVyQWxsKCk7CisJCX0KKwkJCisJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggZXZlbnQgKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIHVwOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTb3VyY2UgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gdHJhbnNwb3J0LnRyYW5zcG9ydFF1ZXJ5KCBxdWVyeSApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQudHJhbnNwb3J0Q29udHJvbCggY29udHJvbCwgdmFsdWUgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyYW5zcG9ydC50cmFuc3BvcnROb3RpZnkoIGV2ZW50ICk7CisJfQorCisJcHVibGljIFNlc3Npb25NZXNzYWdlIGdldFNlc3Npb24oKQorCXsKKwkJcmV0dXJuIHNlc3Npb247CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25NZXNzYWdlIHNlc3Npb24gKQorCXsKKwkJdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKwl9CisJCisJcHJpdmF0ZSBTZXNzaW9uTWVzc2FnZSBzZXNzaW9uOworfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvU2Vzc2lvbk1lc3NhZ2UuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Nlc3Npb25NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViYzFkNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Nlc3Npb25NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvbjsKKworCisvKioKKyAqIEludGVyZmFjZSB1c2VkIHRvIGRlbGl2ZXIgbWVzc2FnZXMgdG8gdGhlIHNlc3Npb24gZnJvbSB0aGUgdHJhbnNwb3J0LgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlc3Npb25NZXNzYWdlIGV4dGVuZHMgU2Vzc2lvbgoreworCS8qKgorCSAqIERlbGl2ZXJzIGRhdGEgdG8gdGhlIHNlc3Npb24gZnJvbSB0aGUgdHJhbnNwb3J0LgorCSAqIEBwYXJhbSBzZW5kZXIgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZSwgZm9yIHRyYW5zcG9ydHMgd2hpY2ggYWxsb3cKKwkgKiBtdWx0aXBsZSBzZW5kZXJzLiBUaGlzIGlzIHdobyB0byByZXR1cm4gYW55IHJlc3BvbnNlIHRvLgorCSAqIEBwYXJhbSBtc2cgYSBNZXNzYWdlLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgY29uc3VtZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UYWdnZWREYXRhSW5wdXQuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RhZ2dlZERhdGFJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTg0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UYWdnZWREYXRhSW5wdXQuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CisKKworLyoqCisgKiBBIFRhZ2dlZERhdGFJbnB1dCByZWFkcyB0eXBlIHRhZ2dlZCB2YWx1ZXMgZnJvbSBhbiBpbnB1dCBidWYuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFnZ2VkRGF0YUlucHV0Cit7CisJLyoqCisJICogUmVhZHMgYSBtZXNzYWdlIGZyb20gdGhlIGJ1Zi4KKwkgKiBAcGFyYW0gYnVmIHRoZSBmbGV4IGJ1ZmZlciBjb250YWluaW5nIHRoZSBtZXNzYWdlLgorCSAqIEByZXR1cm4gYSBtZXNzYWdlIHJlYWQgZnJvbSB0aGUgYnVmLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTWVzc2FnZSByZWFkTWVzc2FnZSggRmxleEJ1ZmZlciBidWYgKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UYWdnZWREYXRhT3V0cHV0LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UYWdnZWREYXRhT3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyZjUxNgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RhZ2dlZERhdGFPdXRwdXQuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CisKKworLyoqCisgKiBBIFRhZ2dlZERhdGFPdXRwdXQgd3JpdGVzIHR5cGUgdGFnZ2VkIGRhdGEgdmFsdWVzIHRvIGFuIG91dHB1dCBidWYuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFnZ2VkRGF0YU91dHB1dAoreworCS8qKgorCSAqIFdyaXRlcyB0aGUgbWVzc2FnZSB0byB0aGUgYnVmLgorCSAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbi4KKwkgKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZSggTWVzc2FnZSBtc2csIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGNwMlRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RjcDJUcmFuc3BvcnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzZTk3YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RjcDJUcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5UcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5QYWNrZXRpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0RGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydFBhY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pby5UY3AyQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pby5UY3AyTGlzdGVuZXI7CisKKworLyoqCisgKiBTZWxlY3RvciBiYXNlZCB0cmFuc3BvcnQgZmFjdG9yeSBmb3IgdGNwIG9yIHRscyBjb25uZWN0aW9ucy4KKyAqIAorICogVHJhbnNwb3J0RmFjdG9yeS5kZWZpbmUoICJ0Y3AyIiwgIm9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5UY3AyVHJhbnNwb3J0RmFjdG9yeSIgKTsKKyAqLworcHVibGljIGNsYXNzIFRjcDJUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgVHJhbnNwb3J0RmFjdG9yeQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBUY3BUcmFuc3BvcnRGYWN0b3J5IHdoaWNoIGRlbGl2ZXJzIFRjcENvbm5lY3Rpb24uCisJICovCisJcHVibGljIFRjcDJUcmFuc3BvcnRGYWN0b3J5KCkKKwl7CisJCXRoaXMoIGZhbHNlICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgYSBUY3BUcmFuc3BvcnRGYWN0b3J5IHdoaWNoIGRlbGl2ZXJzIFRjcENvbm5lY3Rpb24gb3IgYQorCSAqIFRsc0Nvbm5lY3Rpb24gZGVwZW5kaW5nIHVwb24gdGhlIGlzU2VjdXJlIHBhcmFtZXRlci4KKwkgKiBAcGFyYW0gaXNTZWN1cmUgdHJ1ZSBpZiBUbHNDb25uZWN0aW9uIGlzIGRlc2lyZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgVGNwMlRyYW5zcG9ydEZhY3RvcnkoIGJvb2xlYW4gaXNTZWN1cmUgKQorCXsKKwkJaWYgKGlzU2VjdXJlKQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiaXNTZWN1cmUiICk7CisJCS8vIHRoaXMuaXNTZWN1cmUgPSBpc1NlY3VyZTsKKwl9CisJCisJLy8gcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2VjdXJlOworCQorCS8vIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT05ORUNUSU9OID0gIlRjcDJUcmFuc3BvcnRGYWN0b3J5LmNvbm5lY3Rpb24iOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBUcmFuc3BvcnRNZXNzYWdlIG5ld1RyYW5zcG9ydCggU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1ID0gbmV3IFVSTCggdXJpICk7CisJCQorCQlUcmFuc3BvcnREYXRhIGMgPSBuZXcgVGNwMkNvbm5lY3Rpb24oIHUsIHJlc291cmNlcyApOworCQkKKwkJVHJhbnNwb3J0UGFja2V0IHAgPSBuZXcgUGFja2V0aXplciggYywgdSwgcmVzb3VyY2VzICk7CisJCQorCQlUcmFuc3BvcnRNZXNzYWdlIG0gPSBuZXcgTWVzc2FnaXplciggcCwgdSwgcmVzb3VyY2VzICk7CisJCQorCQltID0gYWRkRmlsdGVycyggbSwgdSwgcmVzb3VyY2VzICk7CisJCQorCQlWYWx1ZUZhY3RvcnkgdmYgPSAoVmFsdWVGYWN0b3J5KSByZXNvdXJjZXMuZ2V0KCBUcmFuc3BvcnQuVkFMVUVfRkFDVE9SWSApOworCQl2Zi5sb2NrRHluYW1pY1R5cGVzKCk7CisJCQorCQlyZXR1cm4gbTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+IG5ld0xpc3RlbmVyKCBmaW5hbCBTdHJpbmcgdXJpLAorCQlmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHUgPSBuZXcgVVJMKCB1cmkgKTsKKwkJCisJCVRyYW5zcG9ydDxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Q2hhbm5lbD4+IGwgPSBuZXcgVGNwMkxpc3RlbmVyKCB1LAorCQkJcmVzb3VyY2VzICk7CisJCQorCQlyZXR1cm4gbmV3IE15U2Vzc2lvbkxpc3RlbmVyKCBsLCB1cmksIHJlc291cmNlcyApOworCX0KKwkKKwlwcml2YXRlIGNsYXNzIE15U2Vzc2lvbkxpc3RlbmVyIGltcGxlbWVudHMgVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+LAorCQlTZXNzaW9uTGlzdGVuZXI8U29ja2V0Q2hhbm5lbD4KKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gdHJhbnNwb3J0CisJCSAqIEBwYXJhbSB1cmkKKwkJICogQHBhcmFtIHJlc291cmNlcworCQkgKi8KKwkJcHVibGljIE15U2Vzc2lvbkxpc3RlbmVyKAorCQkJVHJhbnNwb3J0PFNlc3Npb25MaXN0ZW5lcjxTb2NrZXRDaGFubmVsPj4gdHJhbnNwb3J0LCBTdHJpbmcgdXJpLAorCQkJUmVzb3VyY2VzIHJlc291cmNlcyApCisJCXsKKwkJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworCQkJdGhpcy51cmkgPSB1cmk7CisJCQl0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKKwkJCQorCQkJdHJhbnNwb3J0LnNldFNlc3Npb24oIHRoaXMgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBUcmFuc3BvcnQ8U2Vzc2lvbkxpc3RlbmVyPFNvY2tldENoYW5uZWw+PiB0cmFuc3BvcnQ7CisJCQorCQlwcml2YXRlIGZpbmFsIFN0cmluZyB1cmk7CisJCQorCQlwcml2YXRlIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXM7CisKKwkJcHVibGljIFNlcnZlckZhY3RvcnkgZ2V0U2Vzc2lvbigpCisJCXsKKwkJCXJldHVybiBzZXNzaW9uOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2Vzc2lvbiggU2VydmVyRmFjdG9yeSBzZXNzaW9uICkKKwkJeworCQkJdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKwkJfQorCQkKKwkJcHJpdmF0ZSBTZXJ2ZXJGYWN0b3J5IHNlc3Npb247CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJCXsKKwkJCXJldHVybiAiVGNwMlRyYW5zcG9ydEZhY3RvcnkuTXlTZXNzaW9uTGlzdGVuZXIvIit0cmFuc3BvcnQ7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXJldHVybiB0cmFuc3BvcnQudHJhbnNwb3J0UXVlcnkoIHF1ZXJ5ICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdHJhbnNwb3J0LnRyYW5zcG9ydENvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdHJhbnNwb3J0LnRyYW5zcG9ydE5vdGlmeSggZXZlbnQgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25BY2NlcHRlZCggU29ja2V0Q2hhbm5lbCBjb25uZWN0aW9uICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJUmVzb3VyY2VzIHIgPSBuZXcgUmVzb3VyY2VzKCByZXNvdXJjZXMgKTsKKwkJCXIucHV0KCAiY29ubmVjdGlvbiIsIGNvbm5lY3Rpb24gKTsKKwkJCQorCQkJVmFsdWVGYWN0b3J5IHZmID0gc2Vzc2lvbi5uZXdWYWx1ZUZhY3RvcnkoIHVyaSApOworCQkJci5wdXQoIFRyYW5zcG9ydC5WQUxVRV9GQUNUT1JZLCB2ZiApOworCQkJCisJCQlUcmFuc3BvcnRNZXNzYWdlIHQgPSBuZXdUcmFuc3BvcnQoIHVyaSwgciApOworCQkJCisJCQlzZXNzaW9uLm5ld1NlcnZlciggdCwgdXJpLCByICk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlyZXR1cm4gc2Vzc2lvbi5zZXNzaW9uUXVlcnkoIHF1ZXJ5ICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXNlc3Npb24uc2Vzc2lvbkNvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggZXZlbnQgKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RjcFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RjcFRyYW5zcG9ydEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U3NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGNwVHJhbnNwb3J0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlBhY2tldGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UY3BDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVGNwTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UbHNDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVGxzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnREYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0UGFja2V0OworCisKKy8qKgorICogVHJhbnNwb3J0IGZhY3RvcnkgZm9yIHRjcCBvciB0bHMgY29ubmVjdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBUY3BUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgVHJhbnNwb3J0RmFjdG9yeQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBUY3BUcmFuc3BvcnRGYWN0b3J5IHdoaWNoIGRlbGl2ZXJzIFRjcENvbm5lY3Rpb24uCisJICovCisJcHVibGljIFRjcFRyYW5zcG9ydEZhY3RvcnkoKQorCXsKKwkJdGhpcyggZmFsc2UgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIFRjcFRyYW5zcG9ydEZhY3Rvcnkgd2hpY2ggZGVsaXZlcnMgVGNwQ29ubmVjdGlvbiBvciBhCisJICogVGxzQ29ubmVjdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgaXNTZWN1cmUgcGFyYW1ldGVyLgorCSAqIEBwYXJhbSBpc1NlY3VyZSB0cnVlIGlmIFRsc0Nvbm5lY3Rpb24gaXMgZGVzaXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBUY3BUcmFuc3BvcnRGYWN0b3J5KCBib29sZWFuIGlzU2VjdXJlICkKKwl7CisJCXRoaXMuaXNTZWN1cmUgPSBpc1NlY3VyZTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2VjdXJlOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTT0NLRVQgPSAiVGNwVHJhbnNwb3J0RmFjdG9yeS5zb2NrZXQiOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBUcmFuc3BvcnRNZXNzYWdlIG5ld1RyYW5zcG9ydCggU3RyaW5nIHVyaSwKKwkJUmVzb3VyY2VzIHJlc291cmNlcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1ID0gbmV3IFVSTCggdXJpICk7CisJCQorCQlPYmplY3Qgc29ja2V0ID0gcmVzb3VyY2VzLmdldCggU09DS0VUICk7CisJCQorCQlUcmFuc3BvcnREYXRhIGMgPSBudWxsOworCQkKKwkJaWYgKGlzU2VjdXJlKQorCQkJYyA9IG5ldyBUbHNDb25uZWN0aW9uKCAoU1NMU29ja2V0KSBzb2NrZXQsIHUsIHJlc291cmNlcyApOworCQllbHNlCisJCQljID0gbmV3IFRjcENvbm5lY3Rpb24oIChTb2NrZXQpIHNvY2tldCwgdSwgcmVzb3VyY2VzICk7CisJCQorCQlUcmFuc3BvcnRQYWNrZXQgcCA9IG5ldyBQYWNrZXRpemVyKCBjLCB1LCByZXNvdXJjZXMgKTsKKwkJCisJCVRyYW5zcG9ydE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdpemVyKCBwLCB1LCByZXNvdXJjZXMgKTsKKwkJCisJCW0gPSBhZGRGaWx0ZXJzKCBtLCB1LCByZXNvdXJjZXMgKTsKKwkJCisJCVZhbHVlRmFjdG9yeSB2ZiA9IChWYWx1ZUZhY3RvcnkpIHJlc291cmNlcy5nZXQoIFRyYW5zcG9ydC5WQUxVRV9GQUNUT1JZICk7CisJCXZmLmxvY2tEeW5hbWljVHlwZXMoKTsKKwkJCisJCXJldHVybiBtOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUcmFuc3BvcnQ8U2VydmVyRmFjdG9yeT4gbmV3TGlzdGVuZXIoIGZpbmFsIFN0cmluZyB1cmksCisJCWZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdSA9IG5ldyBVUkwoIHVyaSApOworCQkKKwkJVHJhbnNwb3J0PFNlc3Npb25MaXN0ZW5lcjxTb2NrZXQ+PiBsOworCisJCWlmIChpc1NlY3VyZSkKKwkJCWwgPSBuZXcgVGxzTGlzdGVuZXIoIHUsIHJlc291cmNlcyApOworCQllbHNlCisJCQlsID0gbmV3IFRjcExpc3RlbmVyKCB1LCByZXNvdXJjZXMgKTsKKwkJCisJCXJldHVybiBuZXcgTXlTZXNzaW9uTGlzdGVuZXIoIGwsIHVyaSwgcmVzb3VyY2VzICk7CisJfQorCQorCXByaXZhdGUgY2xhc3MgTXlTZXNzaW9uTGlzdGVuZXIgaW1wbGVtZW50cyBUcmFuc3BvcnQ8U2VydmVyRmFjdG9yeT4sIFNlc3Npb25MaXN0ZW5lcjxTb2NrZXQ+CisJeworCQkvKioKKwkJICogQHBhcmFtIHRyYW5zcG9ydAorCQkgKiBAcGFyYW0gdXJpCisJCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkJICovCisJCXB1YmxpYyBNeVNlc3Npb25MaXN0ZW5lciggVHJhbnNwb3J0PFNlc3Npb25MaXN0ZW5lcjxTb2NrZXQ+PiB0cmFuc3BvcnQsCisJCQlTdHJpbmcgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzICkKKwkJeworCQkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisJCQl0aGlzLnVyaSA9IHVyaTsKKwkJCXRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCQkJCisJCQl0cmFuc3BvcnQuc2V0U2Vzc2lvbiggdGhpcyApOworCQl9CisJCQorCQlwcml2YXRlIGZpbmFsIFRyYW5zcG9ydDxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Pj4gdHJhbnNwb3J0OworCQkKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXJpOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzOworCisJCXB1YmxpYyBTZXJ2ZXJGYWN0b3J5IGdldFNlc3Npb24oKQorCQl7CisJCQlyZXR1cm4gc2Vzc2lvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlcnZlckZhY3Rvcnkgc2Vzc2lvbiApCisJCXsKKwkJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisJCX0KKwkJCisJCXByaXZhdGUgU2VydmVyRmFjdG9yeSBzZXNzaW9uOworCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCQl7CisJCQlyZXR1cm4gIlRjcFRyYW5zcG9ydEZhY3RvcnkuTXlTZXNzaW9uTGlzdGVuZXIvIit0cmFuc3BvcnQ7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXJldHVybiB0cmFuc3BvcnQudHJhbnNwb3J0UXVlcnkoIHF1ZXJ5ICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdHJhbnNwb3J0LnRyYW5zcG9ydENvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdHJhbnNwb3J0LnRyYW5zcG9ydE5vdGlmeSggZXZlbnQgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25BY2NlcHRlZCggU29ja2V0IHNvY2tldCApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCVJlc291cmNlcyByID0gbmV3IFJlc291cmNlcyggcmVzb3VyY2VzICk7CisJCQlyLnB1dCggU09DS0VULCBzb2NrZXQgKTsKKwkJCQorCQkJVmFsdWVGYWN0b3J5IHZmID0gc2Vzc2lvbi5uZXdWYWx1ZUZhY3RvcnkoIHVyaSApOworCQkJci5wdXQoIFRyYW5zcG9ydC5WQUxVRV9GQUNUT1JZLCB2ZiApOworCQkJCisJCQlUcmFuc3BvcnRNZXNzYWdlIHQgPSBuZXdUcmFuc3BvcnQoIHVyaSwgciApOworCQkJCisJCQlzZXNzaW9uLm5ld1NlcnZlciggdCwgdXJpLCByICk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlyZXR1cm4gc2Vzc2lvbi5zZXNzaW9uUXVlcnkoIHF1ZXJ5ICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXNlc3Npb24uc2Vzc2lvbkNvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggZXZlbnQgKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RyYW5zcG9ydE1lc3NhZ2UuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1RyYW5zcG9ydE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Y1ZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVHJhbnNwb3J0TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKKworCisvKioKKyAqIEludGVyZmFjZSB1c2VkIHRvIGRlbGl2ZXIgbWVzc2FnZXMgdG8gdGhlIHRyYW5zcG9ydCBmcm9tIHRoZSBzZXNzaW9uLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zcG9ydE1lc3NhZ2UgZXh0ZW5kcyBUcmFuc3BvcnQ8U2Vzc2lvbk1lc3NhZ2U+Cit7CisJLyoqCisJICogRGVsaXZlcnMgdGhlIGRhdGEgdG8gdGhlIHRyYW5zcG9ydC4KKwkgKiBAcGFyYW0gcmVjaXBpZW50IHNwZWNpZmllcyB0aGUgcmVjaXBpZW50IHdoZW4gdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5CisJICogb2YgbW9yZSB0aGFuIG9uZS4KKwkgKiBAcGFyYW0gbXNnIHRoZSBNZXNzYWdlLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgdHJhbnNwb3J0TWVzc2FnZSggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVW53YW50ZWRNZXNzYWdlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9VbndhbnRlZE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzgzYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVW53YW50ZWRNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisKKy8qKgorICogRXZlbnQgY2xhc3MgdXNlZCB3aXRoIHNlc3Npb25Ob3RpZnkgdG8gcmVwb3J0IHVud2FudGVkIG1lc3NhZ2VzLgorICovCitwdWJsaWMgY2xhc3MgVW53YW50ZWRNZXNzYWdlCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVW53YW50ZWRNZXNzYWdlLgorCSAqIEBwYXJhbSBzZW5kZXIKKwkgKiBAcGFyYW0gbXNnCisJICovCisJcHVibGljIFVud2FudGVkTWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKQorCXsKKwkJdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisJCXRoaXMubXNnID0gbXNnOworCX0KKwkKKwkvKiogdGhlIHNlbmRlciBvZiB0aGlzIHVud2FudGVkIG1lc3NhZ2UuICovCisJcHVibGljIGZpbmFsIFdobyBzZW5kZXI7CisJCisJLyoqIHRoZSB1bndhbnRlZCBtZXNzYWdlLiAqLworCXB1YmxpYyBmaW5hbCBNZXNzYWdlIG1zZzsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVW53YW50ZWQgbWVzc2FnZSBmcm9tICVzOiAlcyIsIHNlbmRlciwgbXNnICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9BYnN0cmFjdE1lc3NhZ2VGaWx0ZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZpbHRlcnMvQWJzdHJhY3RNZXNzYWdlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiYjMwZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZpbHRlcnMvQWJzdHJhY3RNZXNzYWdlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZmlsdGVyczsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvbjsKKworCisvKioKKyAqIEFic3RyYWN0TWVzc2FnZUZpbHRlciBpcyBhIHVzZWZ1bCBiYXNlIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IG1lc3NhZ2UgZmlsdGVycy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0TWVzc2FnZUZpbHRlciBpbXBsZW1lbnRzIFRyYW5zcG9ydE1lc3NhZ2UsIFNlc3Npb25NZXNzYWdlCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQWJzdHJhY3RNZXNzYWdlRmlsdGVyLgorCSAqIEBwYXJhbSB0cmFuc3BvcnQKKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdE1lc3NhZ2VGaWx0ZXIoIFRyYW5zcG9ydE1lc3NhZ2UgdHJhbnNwb3J0LCBVUkwgdXJpLAorCQlSZXNvdXJjZXMgcmVzb3VyY2VzICkKKwl7CisJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworCQl0cmFuc3BvcnQuc2V0U2Vzc2lvbiggdGhpcyApOworCX0KKworCS8qKgorCSAqIE91ciB0cmFuc3BvcnQuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRyYW5zcG9ydE1lc3NhZ2UgdHJhbnNwb3J0OworCQorCUBPdmVycmlkZQorCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE1lc3NhZ2UoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdHJhbnNwb3J0LnRyYW5zcG9ydE1lc3NhZ2UoIHJlY2lwaWVudCwgbXNnICk7CisJfQorCisJcHVibGljIFNlc3Npb25NZXNzYWdlIGdldFNlc3Npb24oKQorCXsKKwkJcmV0dXJuIHNlc3Npb247CisJfQorCisJcHVibGljIHZvaWQgc2V0U2Vzc2lvbiggU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbiApCisJeworCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCX0KKworCS8qKgorCSAqIE91ciBzZXNzaW9uCisJICovCisJcHJvdGVjdGVkIFNlc3Npb25NZXNzYWdlIHNlc3Npb247CisKKwlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gdHJhbnNwb3J0LnRyYW5zcG9ydFF1ZXJ5KCBxdWVyeSApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQudHJhbnNwb3J0Q29udHJvbCggY29udHJvbCwgdmFsdWUgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyYW5zcG9ydC50cmFuc3BvcnROb3RpZnkoIGV2ZW50ICk7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2Vzc2lvbk1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHNlc3Npb24uc2Vzc2lvbk1lc3NhZ2UoIHNlbmRlciwgbXNnICk7CisJfQorCisJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBzZXNzaW9uLnNlc3Npb25RdWVyeSggcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlc3Npb24uc2Vzc2lvbkNvbnRyb2woIGNvbnRyb2wsIHZhbHVlICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGV2ZW50ID09IFNlc3Npb24uVVApCisJCQlpZiAoIXNlc3Npb25VcCgpKQorCQkJCXJldHVybjsKKworCQlpZiAoZXZlbnQgPT0gU2Vzc2lvbi5ET1dOKQorCQkJaWYgKCFzZXNzaW9uRG93bigpKQorCQkJCXJldHVybjsKKworCQlzZXNzaW9uLnNlc3Npb25Ob3RpZnkoIGV2ZW50ICk7CisJfQorCisJLyoqCisJICogVGVsbHMgdGhlIGZpbHRlciB0aGF0IHRoZSBzZXNzaW9uIGlzIHVwLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgc2hvdWxkIGJlIHBhc3NlZCBvbiB0byBvdXIgc2Vzc2lvbiwgZmFsc2UKKwkgKiBpZiBpdCBzaG91bGQgYmUgc3dhbGxvd2VkLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2Vzc2lvblVwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGVsbHMgdGhlIGZpbHRlciB0aGF0IHRoZSBzZXNzaW9uIGlzIGRvd24uCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIG91ciBzZXNzaW9uLCBmYWxzZQorCSAqIGlmIGl0IHNob3VsZCBiZSBzd2FsbG93ZWQuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uRG93bigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZpbHRlcnMvS2VlcEFsaXZlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9maWx0ZXJzL0tlZXBBbGl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGQ0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9maWx0ZXJzL0tlZXBBbGl2ZS5qYXZhCkBAIC0wLDAgKzEsMzQ5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LmZpbHRlcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9pbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlRyYW5zcG9ydE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQWxhcm1MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5BbGFybU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRpbWVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRvZG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVG9kb01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisKKy8qKgorICogS2VlcEFsaXZlIGlzIGEgbWVzc2FnZSBmaWx0ZXIgd2hpY2ggcGVyaW9kaWNhbGx5IHNlbmRzIG1lc3NhZ2VzIHRvIHRoZSBzZXJ2ZXIKKyAqIGZyb20gYSBjbGllbnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgYWxpdmUuIEJvdGggc2lkZXMKKyAqIHBlcmlvZGljYWxseSBjaGVjayBmb3IgdGhlIG1lc3NhZ2VzIGZyb20gdGhlIG90aGVyIHNpZGUsIG5vdGluZyB3aGVuIHRoZXkKKyAqIGFycml2ZSBhbmQgaG93IGxvbmcgc2luY2UgdGhlIGxhc3Qgb25lIGhhcyBhcnJpdmVkLiBJZiBpdCBoYXMgYmVlbiB0b28gbG9uZworICogc2luY2UgYSBtZXNzYWdlIGFycml2ZWQgZnJvbSB0aGUgb3RoZXIgc2lkZSwgZWl0aGVyIHNpZGUgd2lsbCByZXNldCB0aGUKKyAqIGNvbm5lY3Rpb24uCisgKiAKKyAqIFR3byBwYXJhbWV0ZXJzIGNvbnRyb2wgS2VlcEFsaXZlIGFjdGl2aXR5OiBkZWxheSBhbmQgY291bnQuIERlbGF5IGlzIHRoZQorICogbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBzZW5kaW5nIC8gY2hlY2tpbmcuIENvdW50IGlzIHRoZSBudW1iZXIgb2YgZGVsYXkKKyAqIGludGVydmFscyB3aXRoIG5vIGtlZXAgYWxpdmUgcmVxdWVzdCBvciByZXNwb25zZSBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMKKyAqIHJlc2V0LgorICogCisgKiBLZWVwQWxpdmUgaXMgYWRkZWQgdG8gdGhlIHRyYW5zcG9ydCBzdGFjayAoZ2VuZXJhbGx5IGZpcnN0KSBsaWtlIHRoaXM6CisgKiAKKyAqIHRjcDovL2hvc3Q6cG9ydD9maWx0ZXI9S2VlcEFsaXZlJktlZXBBbGl2ZS5kZWxheT0xNSZLZWVwQWxpdmUuY291bnQ9NAorICogCisgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGRlbGF5IGFuZCBjb3VudCBhcmUgc2hvd24sIDE1IHNlY29uZHMgYW5kIDQgbWVzc2FnZXMKKyAqIG1pc3NlZCwgcmVzcGVjdGl2ZWx5LiBJZiB5b3UgbGlrZSB0aGUgZGVmYXVsdHMsIHlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkKKyAqIGRlbGF5IGFuZCAvIG9yIGNvdW50LgorICogCisgKiBVc2luZyB0aGUgYWJvdmUgZGVmYXVsdHMsIHRoZSBjbGllbnQgd2lsbCBzZW5kIHRoZSBzZXJ2ZXIgYSBrZWVwIGFsaXZlCisgKiByZXF1ZXN0IGV2ZXJ5IDE1IHNlY29uZHMuIFRoZSBjbGllbnQgYWxzbyBzZW5kcyBpdHMgZGVsYXkgdmFsdWUgYW5kIGNvdW50IHRvCisgKiB0aGUgc2VydmVyLiBXaGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSBrZWVwIGFsaXZlIHJlcXVlc3QsIGl0IHJlc2V0cyBpdHMKKyAqIGRlbGF5IGFuZCBjb3VudCB2YWx1ZXMgdG8gdGhvc2Ugb2YgdGhlIGNsaWVudCwgdXBkYXRlcyB0aGUgbGFzdCBtZXNzYWdlIHRpbWUsCisgKiBhbmQgdGhlbiBzZW5kcyBhIGtlZXAgYWxpdmUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gV2hlbiB0aGUgY2xpZW50IHJlY2VpdmVzCisgKiB0aGUga2VlcCBhbGl2ZSByZXNwb25zZSwgaXQgdXBkYXRlcyBpdHMgbGFzdCBtZXNzYWdlIHRpbWUuCisgKiAKKyAqIEJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgd2FrZSB1cCBldmVyeSAxNSBzZWNvbmRzIGFuZCBjaGVjayB0aGUgbGFzdCBtZXNzYWdlCisgKiB0aW1lLiBJZiBpdCBpcyBtb3JlIHRoYW4gNjAgc2Vjb25kcyBpbiB0aGUgcGFzdCAoY291bnQgKiBkZWxheSksIHRoZW4gdGhlCisgKiBjb25uZWN0aW9uIGlzIHJlc2V0LgorICovCitwdWJsaWMgY2xhc3MgS2VlcEFsaXZlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlRmlsdGVyIGltcGxlbWVudHMgQWxhcm1MaXN0ZW5lcgoreworCS8qKiBUaW1lIGluIHNlY29uZHMgYmV0d2VlbiBzZW5kaW5nIG1lc3NhZ2UgYW5kIGNoZWNraW5nIGZvciByZXNwb25zZS4KKwkgKiBEZWZhdWx0IGlzIDE1IHNlY29uZHMuICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVMQVkgPSAiS2VlcEFsaXZlLmRlbGF5IjsKKwkKKwkvKiogQ291bnQgb2YgaG93IG1hbnkgREVMQVkgaW50ZXJ2YWxzIGNhbiBiZSBtaXNzZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uCisJICogaXMgcmVzZXQuIERlZmF1bHQgaXMgNC4gKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT1VOVCA9ICJLZWVwQWxpdmUuY291bnQiOworCQorCS8qKgorCSAqIEBwYXJhbSB0cmFuc3BvcnQKKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIEtlZXBBbGl2ZSggVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdXBlciggdHJhbnNwb3J0LCB1cmksIHJlc291cmNlcyApOworCQkKKwkJZGVsYXkgPSB1cmkuZ2V0SW50ZWdlclRlcm0oIERFTEFZLCAxNSApOworCQlpZiAoZGVsYXkgPD0gMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJkZWxheSA8PSAwIiApOworCQkKKwkJY291bnQgPSB1cmkuZ2V0SW50ZWdlclRlcm0oIENPVU5ULCA0ICk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNvdW50IDw9IDAiICk7CisJCQorCQlzZXJ2ZXIgPSAoQm9vbGVhbikgdHJhbnNwb3J0LnRyYW5zcG9ydFF1ZXJ5KCBUcmFuc3BvcnQuSVNfU0VSVkVSICk7CisJCQorLy8JCUxvZy5yZXBvcnQoICJLZWVwQWxpdmVJbnN0YWxsZWQiLAorLy8JCQkiZGVsYXkiLCBkZWxheSwgImNvdW50IiwgY291bnQsICJzZXJ2ZXIiLCBzZXJ2ZXIgKTsKKwkJCisJCXZmID0gKFZhbHVlRmFjdG9yeSkgcmVzb3VyY2VzLmdldCggVHJhbnNwb3J0LlZBTFVFX0ZBQ1RPUlkgKTsKKworCQltZl9kZWxheSA9IG5ldyBGaWVsZCggImRlbGF5IiApOworCQltZl9jb3VudCA9IG5ldyBGaWVsZCggImNvdW50IiApOworCQkKKwkJbXRfcmVxdWVzdCA9IG5ldyBUeXBlKCAiX0V0Y2hfS2VlcEFsaXZlUmVxIiApOworCQltdF9yZXF1ZXN0LnB1dFZhbGlkYXRvciggbWZfZGVsYXksIFZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJbXRfcmVxdWVzdC5wdXRWYWxpZGF0b3IoIG1mX2NvdW50LCBWYWxpZGF0b3JfaW50LmdldCggMCApICk7CisJCXZmLmFkZFR5cGUoIG10X3JlcXVlc3QgKTsKKworCQltdF9yZXNwb25zZSA9IG5ldyBUeXBlKCAiX0V0Y2hfS2VlcEFsaXZlUmVzcCIgKTsKKwkJdmYuYWRkVHlwZSggbXRfcmVzcG9uc2UgKTsKKwkJCisJCW10X3JlcXVlc3Quc2V0UmVzdWx0KCBtdF9yZXNwb25zZSApOworCX0KKwkKKwlwcml2YXRlIGludCBkZWxheTsKKwkKKwlwcml2YXRlIGludCBjb3VudDsKKwkKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2VydmVyOworCQorCXByaXZhdGUgZmluYWwgVmFsdWVGYWN0b3J5IHZmOworCQorCXByaXZhdGUgZmluYWwgRmllbGQgbWZfZGVsYXk7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBtZl9jb3VudDsKKwkKKwlwcml2YXRlIGZpbmFsIFR5cGUgbXRfcmVxdWVzdDsKKwkKKwlwcml2YXRlIGZpbmFsIFR5cGUgbXRfcmVzcG9uc2U7CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gIktlZXBBbGl2ZS8iK3RyYW5zcG9ydDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgc2VydmVyIG9wZXJhdGluZyBtb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFNlcnZlcigpCisJeworCQlyZXR1cm4gc2VydmVyOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzZXNzaW9uTWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAobXNnLmlzVHlwZSggbXRfcmVxdWVzdCApICkKKwkJeworCQkJaGFuZGxlUmVxdWVzdCggbXNnICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJaWYgKG1zZy5pc1R5cGUoIG10X3Jlc3BvbnNlICkpCisJCXsKKwkJCWhhbmRsZVJlc3BvbnNlKCBtc2cgKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlyZXR1cm4gc3VwZXIuc2Vzc2lvbk1lc3NhZ2UoIHNlbmRlciwgbXNnICk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gc2Vzc2lvblVwKCkKKwl7CisvLwkJTG9nLnJlcG9ydCggIktlZXBBbGl2ZVNlc3Npb25VcCIsICJzZXJ2ZXIiLCBzZXJ2ZXIgKTsKKwkJdXAgPSB0cnVlOworCQlBbGFybU1hbmFnZXIuc3RhdGljQWRkKCB0aGlzLCBudWxsLCBkZWxheSoxMDAwICk7CisJCXRpY2tsZSgpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gc2Vzc2lvbkRvd24oKQorCXsKKy8vCQlMb2cucmVwb3J0KCAiS2VlcEFsaXZlU2Vzc2lvbkRvd24iLCAic2VydmVyIiwgc2VydmVyICk7CisJCXVwID0gZmFsc2U7CisJCUFsYXJtTWFuYWdlci5zdGF0aWNSZW1vdmUoIHRoaXMgKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiB1cDsKKwkKKwlwcml2YXRlIHZvaWQgaGFuZGxlUmVxdWVzdCggTWVzc2FnZSBtc2cgKQorCXsKKwkJaWYgKCFzZXJ2ZXIpCisJCXsKKwkJCS8vIHdlJ3JlIGEgY2xpZW50IHRoYXQgZ290IGEgcmVxdWVzdCwgbGlrZWx5IHdlJ3JlIHRhbGtpbmcgdG8gYQorCQkJLy8gc2VydmVyIHRoYXQgaXMgY29uZnVzZWQuCisJCQlyZXR1cm47CisJCX0KKwkJCisvLwkJTG9nLnJlcG9ydCggIkdvdEtlZXBBbGl2ZVJlcSIsICJtc2ciLCBtc2cgKTsKKwkJCisJCU51bWJlciBkID0gKE51bWJlcikgbXNnLmdldCggbWZfZGVsYXkgKTsKKwkJaWYgKGQgIT0gbnVsbCAmJiBkLmludFZhbHVlKCkgPiAwKQorCQl7CisvLwkJCUxvZy5yZXBvcnQoICJLZWVwQWxpdmVSZXNldERlbGF5IiwgImRlbGF5IiwgZCApOworCQkJZGVsYXkgPSBkLmludFZhbHVlKCk7CisJCX0KKwkJCisJCU51bWJlciBjID0gKE51bWJlcikgbXNnLmdldCggbWZfY291bnQgKTsKKwkJaWYgKGMgIT0gbnVsbCAmJiBjLmludFZhbHVlKCkgPiAwKQorCQl7CisvLwkJCUxvZy5yZXBvcnQoICJLZWVwQWxpdmVSZXNldENvdW50IiwgImNvdW50IiwgYyApOworCQkJY291bnQgPSBjLmludFZhbHVlKCk7CisJCX0KKwkJCisJCXRpY2tsZSgpOworCQkKKwkJc2VuZEtlZXBBbGl2ZVJlc3AoIG1zZyApOworCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVSZXNwb25zZSggTWVzc2FnZSBtc2cgKQorCXsKKwkJaWYgKHNlcnZlcikKKwkJeworCQkJLy8gd2UncmUgYSBzZXJ2ZXIgdGhhdCBnb3QgYSByZXNwb25zZSwgd2hpY2ggbWVhbnMgZWl0aGVyIHdlIHNlbnQKKwkJCS8vIGEgcmVxdWVzdCAoYnV0IHdlIHNob3VsZG4ndCBkbyB0aGF0IGlmIHdlJ3JlIGEgc2VydmVyKSBvciB0aGUKKwkJCS8vIGNsaWVudCBpcyBjb25mdXNlZC4KKwkJCXJldHVybjsKKwkJfQorCQkKKy8vCQlMb2cucmVwb3J0KCAiR290S2VlcEFsaXZlUmVzcCIsICJtc2ciLCBtc2cgKTsKKwkJCisJCXRpY2tsZSgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGlja2xlKCkKKwl7CisJCWxhc3RUaWNrbGUgPSBUaW1lci5nZXROYW5vcygpOworCX0KKwkKKwlwcml2YXRlIGxvbmcgbGFzdFRpY2tsZTsKKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tUaWNrbGUoKQorCXsKKwkJbG9uZyBtcyA9IFRpbWVyLmdldE1pbGxpc1NpbmNlKCBsYXN0VGlja2xlICk7CisvLwkJTG9nLnJlcG9ydCggIktlZXBBbGl2ZUlkbGUiLCAibXMiLCBtcywgInNlcnZlciIsIHNlcnZlciApOworCQlpZiAobXMgPj0gY291bnQgKiBkZWxheSAqIDEwMDApCisJCXsKKwkJCXRyeQorCQkJeworLy8JCQkJTG9nLnJlcG9ydCggIktlZXBBbGl2ZVJlc2V0IiwgInNlcnZlciIsIHNlcnZlciApOworCQkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggIktlZXBBbGl2ZSByZXNldHRpbmcgZGVhZCBjb25uZWN0aW9uIiApOworCQkJCXRyYW5zcG9ydC50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuUkVTRVQsIDAgKTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCXJlcG9ydEVycm9yKCBlICk7CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlcG9ydEVycm9yKCBFeGNlcHRpb24gZSApCisJeworCQl0cnkKKwkJeworCQkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBlICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZTEgKQorCQl7CisJCQkvLyB3aGF0IGVsc2UgY2FuIHlvdSBkbz8KKwkJCWUxLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBzZW5kS2VlcEFsaXZlUmVxKCkKKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10X3JlcXVlc3QsIHZmICk7CisJCW1zZy5wdXQoIG1mX2RlbGF5LCBkZWxheSApOworCQltc2cucHV0KCBtZl9jb3VudCwgY291bnQgKTsKKwkJdHJ5CisJCXsKKy8vCQkJTG9nLnJlcG9ydCggIlNlbmRLZWVwQWxpdmVSZXEiLCAibXNnIiwgbXNnICk7CisJCQl0cmFuc3BvcnQudHJhbnNwb3J0TWVzc2FnZSggbnVsbCwgbXNnICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXJlcG9ydEVycm9yKCBlICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNlbmRLZWVwQWxpdmVSZXNwKCBNZXNzYWdlIG1zZyApCisJeworCQlNZXNzYWdlIHJtc2cgPSBtc2cucmVwbHkoKTsKKwkJdHJ5CisJCXsKKy8vCQkJTG9nLnJlcG9ydCggIlNlbmRLZWVwQWxpdmVSZXNwIiwgInJtc2ciLCBybXNnICk7CisJCQl0cmFuc3BvcnQudHJhbnNwb3J0TWVzc2FnZSggbnVsbCwgcm1zZyApOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXBvcnRFcnJvciggZSApOworCQl9CisJfQorCisJcHVibGljIGludCB3YWtldXAoIEFsYXJtTWFuYWdlciBtYW5hZ2VyLCBPYmplY3Qgc3RhdGUsIGxvbmcgZHVlICkKKwl7CisvLwkJTG9nLnJlcG9ydCggIktlZXBBbGl2ZVdha2V1cCIsICJzZXJ2ZXIiLCBzZXJ2ZXIgKTsKKwkJCisJCWlmICghdXApCisJCQlyZXR1cm4gMDsKKwkJCisJCWlmICghc2VydmVyKQorCQl7CisJCQkvLyB1c2UgYSBUb2RvIHNvIGFzIHRvIG5vdCB1bm5lY2Vzc2FyaWx5IGJsb2NrIEFsYXJtTWFuYWdlci4KKwkJCVRvZG9NYW5hZ2VyLmFkZFRvZG8oIG5ldyBUb2RvKCkKKwkJCXsKKwkJCQlwdWJsaWMgdm9pZCBkb2l0KCBUb2RvTWFuYWdlciBtZ3IgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQkJeworCQkJCQlzZW5kS2VlcEFsaXZlUmVxKCk7CisJCQkJfQorCisJCQkJcHVibGljIHZvaWQgZXhjZXB0aW9uKCBUb2RvTWFuYWdlciBtZ3IsIEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCXJlcG9ydEVycm9yKCBlICk7CisJCQkJfQorCQkJfSApOworCQl9CisJCQorCQljaGVja1RpY2tsZSgpOworCQkKKwkJcmV0dXJuIGRlbGF5ICogMTAwMDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIGRlbGF5LgorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVsYXkoKQorCXsKKwkJcmV0dXJuIGRlbGF5OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgY291bnQuCisJICovCisJcHVibGljIGludCBnZXRDb3VudCgpCisJeworCQlyZXR1cm4gY291bnQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9Mb2dnZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZpbHRlcnMvTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3OWY1YQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZpbHRlcnMvTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5UcmFuc3BvcnRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CisKKworLyoqCisgKiBBIE1lc3NhZ2UgRmlsdGVyIHdoaWNoIGxvZ3MgdGhlIG1lc3NhZ2VzIHNlZW4gdG8gYSBmaWxlLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBMb2dnZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VGaWx0ZXIKK3sKKworCXByaXZhdGUgQnVmZmVyZWRXcml0ZXIgd3JpdGVyOworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEZJTEVfUEFUSCA9ICJMb2dnZXIuZmlsZVBhdGgiOworCisJcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCQorCXByaXZhdGUgU3RyaW5nIHRlc3RSZW5hbWVkRmlsZU5hbWUgPSBudWxsOworCisJcHJpdmF0ZSBEYXRlRm9ybWF0IGRmID0gIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCAiSEg6bW06c3MuU1NTIiApOworCisJcHJpdmF0ZSBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApOworCQorCXByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCBmaWxlTmFtZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAorCSJ5eXl5Lk1NLmRkLkhILm1tLnNzIiApOworCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0RmxhZyA9IGZhbHNlOworCisJZW51bSBEaXJlY3Rpb24KKwl7CisJCVVQLCBET1dOCisJfQorCisJcHVibGljIExvZ2dlciggVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCXRocm93cyBFeGNlcHRpb24KKwl7CisJCXN1cGVyKCB0cmFuc3BvcnQsIHVyaSwgcmVzb3VyY2VzICk7CisKKwkJaW5pdGlhbGl6ZUxvZ2dlcih1cmkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxvZ2dlcihVUkwgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCWZpbGVOYW1lID0gdXJpLmdldFRlcm0oIEZJTEVfUEFUSCApOworCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKKwkJeworCQkJLy8gdXNlIGRlZmF1bHQgbmFtZQorCQkJZmlsZU5hbWUgPSAiTG9nLnR4dCI7CisJCX0KKwkJCisJCWlmICghdGVzdEZsYWcpCisJCXsKKwkJCUZpbGUgZiA9IG5ldyBGaWxlKCBmaWxlTmFtZSApOworCQkJaWYgKGYuZXhpc3RzKCkpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpLnN1YnN0cmluZyggMCwgZi5nZXROYW1lKCkuaW5kZXhPZigKKwkJCQkgKiAiLiIgKSApOyBTdHJpbmcgbmV3RmlsZU5hbWUgPSBmLmdldFBhcmVudCgpICsKKwkJCQkgKiBGaWxlLnNlcGFyYXRvckNoYXIgKyBuYW1lICsgZmlsZU5hbWVGb3JtYXQuZm9ybWF0KCBuZXcgRGF0ZSgpICkgKworCQkJCSAqICIudHh0IjsKKwkJCQkgKi8KKwkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBnZW5lcmF0ZU5ld0ZpbGVOYW1lKCBmLmdldE5hbWUoKSwgZgorCQkJCQkuZ2V0UGFyZW50KCkgKTsKKwkJCQlib29sZWFuIHN0YXR1cyA9IGYucmVuYW1lVG8oIG5ldyBGaWxlKCBuZXdGaWxlTmFtZSApICk7CisJCQl9CisJCQl3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIoIG5ldyBGaWxlV3JpdGVyKCBmLCB0cnVlICkgKTsKKwkJfQorCQllbHNlIHsKKwkJCXRlc3RSZW5hbWVkRmlsZU5hbWUgPSBnZW5lcmF0ZU5ld0ZpbGVOYW1lKGZpbGVOYW1lLG51bGwpOworCQl9CisJCisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlTmV3RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgcGF0aE5hbWUpIHRocm93cworCQlFeGNlcHRpb24KKwl7CisJCWlmIChwYXRoTmFtZSA9PSBudWxsKQorCQkJcGF0aE5hbWU9IiI7CisJCVN0cmluZyBuYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKCAwLAorCQkJZmlsZU5hbWUuaW5kZXhPZiggIi4iICkgKTsKKwkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gcGF0aE5hbWUgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBuYW1lCisJCSsgZmlsZU5hbWVGb3JtYXQuZm9ybWF0KCBuZXcgRGF0ZSgpICkgKyAiLnR4dCI7CisJCXJldHVybiBuZXdGaWxlTmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiAiTG9nZ2VyLyIgKyB0cmFuc3BvcnQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2Vzc2lvbk1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEaXJlY3Rpb246IFVQLCBNZXNzYWdlOiAiICsgbXNnLnRvU3RyaW5nKCkpOworCQl3cml0ZVRvRmlsZSggRGlyZWN0aW9uLlVQLCBzZW5kZXIsIG1zZy50b1N0cmluZygpICk7CisJCXJldHVybiBzdXBlci5zZXNzaW9uTWVzc2FnZSggc2VuZGVyLCBtc2cgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRNZXNzYWdlKCBXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGlyZWN0aW9uOiBET1dOLCBNZXNzYWdlOiAiICsgbXNnLnRvU3RyaW5nKCkpOworCQl3cml0ZVRvRmlsZSggRGlyZWN0aW9uLkRPV04sIHJlY2lwaWVudCwgbXNnLnRvU3RyaW5nKCkgKTsKKwkJc3VwZXIudHJhbnNwb3J0TWVzc2FnZSggcmVjaXBpZW50LCBtc2cgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVXAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl3cml0ZVRvRmlsZSggRGlyZWN0aW9uLlVQLCBudWxsLCB0cmFuc3BvcnQudG9TdHJpbmcoKSApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uRG93bigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXdyaXRlVG9GaWxlKCBEaXJlY3Rpb24uRE9XTiwgbnVsbCwgdHJhbnNwb3J0LnRvU3RyaW5nKCkgKTsKKwkJLy8gd3JpdGVyLmNsb3NlKCk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlVG9GaWxlKCBEaXJlY3Rpb24gZGlyZWN0aW9uLCBXaG8gbXNnT3JpZ2luLCBTdHJpbmcgbXNnICkKKwl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAod3JpdGVyID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQl0cnkKKwkJeworCQkJc3luY2hyb25pemVkICh3cml0ZXIpCisJCQl7CisJCQkJd3JpdGVyLndyaXRlKCBkZi5mb3JtYXQoIG5ldyBEYXRlKCkgKSApOworCQkJCXdyaXRlci53cml0ZSggIjogIiApOworCQkJCXdyaXRlci53cml0ZSggY29udmVydERpclRvU3RyaW5nKCBkaXJlY3Rpb24gKSApOworCQkJCXdyaXRlci53cml0ZSggIjogIiApOworCQkJCWlmIChtc2dPcmlnaW4gIT0gbnVsbCkKKwkJCQl7CisJCQkJCXdyaXRlci53cml0ZSggbXNnT3JpZ2luLnRvU3RyaW5nKCkgKTsKKwkJCQkJd3JpdGVyLndyaXRlKCAiOiAiICk7CisJCQkJfQorCQkJCXdyaXRlci53cml0ZSggbXNnICk7CisJCQkJd3JpdGVyLndyaXRlKCBuZXdMaW5lICk7CisJCQkJd3JpdGVyLmZsdXNoKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXdyaXRlci5jbG9zZSgpOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGNvbnZlcnREaXJUb1N0cmluZyggRGlyZWN0aW9uIGRpciApCisJeworCQlpZiAoZGlyLm9yZGluYWwoKSA9PSBEaXJlY3Rpb24uRE9XTi5vcmRpbmFsKCkpCisJCXsKKwkJCXJldHVybiAiT3V0Z29pbmciOworCQl9CisJCXJldHVybiAiSW5jb21pbmciOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQorCXsKKwkJcmV0dXJuIGZpbGVOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdFJlbmFtZWRGaWxlTmFtZSgpCisJeworCQlyZXR1cm4gdGVzdFJlbmFtZWRGaWxlTmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9maWx0ZXJzL1B3QXV0aC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9Qd0F1dGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTExZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9Qd0F1dGguamF2YQpAQCAtMCwwICsxLDM4MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5maWx0ZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfYm9vbGVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9zdHJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlRyYW5zcG9ydE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworLyoqCisgKiBQd0F1dGggaXMgYSBtZXNzYWdlIGZpbHRlciB3aGljaCB3YXRjaGVzIGZvciBTZXNzaW9uLlVQIGFuZCBhdHRlbXB0cyB0bworICogYXV0aGVudGljYXRlIHRoZSB1c2VyIGJ5IHNlbmRpbmcgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgbmFtZSBhbmQKKyAqIHBhc3N3b3JkIGluIGl0LiBJZiB0aGUgc2VydmVyIHJlc3BvbmRzLCB0aGUgc2Vzc2lvbiBpcyBub3RpZmllZCB3aXRoIHRoZQorICogdXNlciBuYW1lLiBJZiB0aGUgc2VydmVyIHJlc3BvbmRzIG5lZ2F0aXZlbHksIHRoZSBzZXNzaW9uIGlzIG5vdGlmaWVkIG9mIHRoZQorICogZmFpbHVyZSAodXNpbmcgYSBQd0F1dGhGYWlsIGV2ZW50KS4gQSB0cmFuc3BvcnQgY29udHJvbCBtYXkgYWxzbyBiZSBzZW50IHRvCisgKiBmb3JjZSBhIGxvZ2luIG9yIGxvZ291dCBvciB0byBzZXQgdGhlIG5hbWUgb3IgcGFzc3dvcmQuIFRoZSBuYW1lIGFuZCBwYXNzd29yZAorICogYXJlIGluaXRpYWxpemVkIGZyb20gdGhlIHVyaSwgb3IgcHJvbXB0ZWQgZm9yIGlmIG5vdCBzcGVjaWZpZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQd0F1dGggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VGaWx0ZXIKK3sKKwkvKioKKwkgKiBjbGllbnQgc2Vzc2lvblF1ZXJ5OiByZXR1cm4gdXNlciBuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uCisJICogdHJhbnNwb3J0UXVlcnk6IHJldHVybiB0aGUgY3VycmVudCB1c2VyIG5hbWUgKG9uIHNlcnZlciBpdCBoYXMgYmVlbiB2YWxpZGF0ZWQpLgorCSAqIGNsaWVudCB0cmFuc3BvcnRDb250cm9sOiBzZXQgdXNlciBuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJQd0F1dGgudXNlciI7CisKKwkvKioKKwkgKiBjbGllbnQgc2Vzc2lvblF1ZXJ5OiByZXR1cm4gcGFzc3dvcmQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbi4KKwkgKiB0cmFuc3BvcnRRdWVyeTogcmV0dXJuIHRoZSBjdXJyZW50IHBhc3N3b3JkIChvbiBzZXJ2ZXIgaXQgaGFzIGJlZW4gdmFsaWRhdGVkKS4KKwkgKiBjbGllbnQgdHJhbnNwb3J0Q29udHJvbDogc2V0IHBhc3N3b3JkIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAiUHdBdXRoLnBhc3N3b3JkIjsKKworCS8qKgorCSAqIGNsaWVudCB0cmFuc3BvcnRDb250cm9sOiBzZW5kIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSEVOVElDQVRFID0gIlB3QXV0aC5hdXRoZW50aWNhdGUiOworCQorCS8qKgorCSAqIEBwYXJhbSB0cmFuc3BvcnQKKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIFB3QXV0aCggVHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdXBlciggdHJhbnNwb3J0LCB1cmksIHJlc291cmNlcyApOworCQlzZXJ2ZXIgPSAoQm9vbGVhbikgdHJhbnNwb3J0LnRyYW5zcG9ydFF1ZXJ5KCBUcmFuc3BvcnQuSVNfU0VSVkVSICk7CisJCQorCQlpZiAoIXNlcnZlcikKKwkJeworCQkJdXNlciA9IHVyaS5nZXRVc2VyKCk7CisJCQlwYXNzd29yZCA9IHVyaS5nZXRQYXNzd29yZCgpOworCQl9CisJCQorLy8JCUxvZy5yZXBvcnQoICJLZWVwQWxpdmVJbnN0YWxsZWQiLAorLy8JCQkiZGVsYXkiLCBkZWxheSwgImNvdW50IiwgY291bnQsICJzZXJ2ZXIiLCBzZXJ2ZXIgKTsKKwkJCisJCXZmID0gKFZhbHVlRmFjdG9yeSkgcmVzb3VyY2VzLmdldCggVHJhbnNwb3J0LlZBTFVFX0ZBQ1RPUlkgKTsKKworCQltdF9yZXF1ZXN0ID0gbmV3IFR5cGUoICJfRXRjaF9Qd0F1dGhSZXEiICk7CisJCW10X3Jlc3BvbnNlID0gbmV3IFR5cGUoICJfRXRjaF9Qd0F1dGhSZXNwIiApOworCQkKKwkJdmYuYWRkVHlwZSggbXRfcmVxdWVzdCApOworCQl2Zi5hZGRUeXBlKCBtdF9yZXNwb25zZSApOworCQkKKwkJbWZfdXNlciA9IG5ldyBGaWVsZCggInVzZXIiICk7CisJCW1mX3Bhc3N3b3JkID0gbmV3IEZpZWxkKCAicGFzc3dvcmQiICk7CisJCW1mX29rID0gbmV3IEZpZWxkKCAib2siICk7CisJCW1mX3N0YXR1cyA9IG5ldyBGaWVsZCggInN0YXR1cyIgKTsKKwkJCisJCW10X3JlcXVlc3QucHV0VmFsaWRhdG9yKCBtZl91c2VyLCBWYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApICk7CisJCW10X3JlcXVlc3QucHV0VmFsaWRhdG9yKCBtZl9wYXNzd29yZCwgVmFsaWRhdG9yX3N0cmluZy5nZXQoIDAgKSApOworCQltdF9yZXF1ZXN0LnNldFJlc3VsdCggbXRfcmVzcG9uc2UgKTsKKwkJbXRfcmVxdWVzdC5sb2NrKCk7CisJCQorCQltdF9yZXNwb25zZS5wdXRWYWxpZGF0b3IoIG1mX29rLCBWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIDAgKSApOworCQltdF9yZXNwb25zZS5wdXRWYWxpZGF0b3IoIG1mX3N0YXR1cywgVmFsaWRhdG9yX3N0cmluZy5nZXQoIDAgKSApOworCQltdF9yZXNwb25zZS5sb2NrKCk7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIHVzZXI7CisJCisJcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7CisJCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNlcnZlcjsKKwkKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZjsKKwkKKwlwcml2YXRlIGZpbmFsIEZpZWxkIG1mX3VzZXI7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBtZl9wYXNzd29yZDsKKwkKKwlwcml2YXRlIGZpbmFsIEZpZWxkIG1mX29rOworCQorCXByaXZhdGUgZmluYWwgRmllbGQgbWZfc3RhdHVzOworCQorCXByaXZhdGUgZmluYWwgVHlwZSBtdF9yZXF1ZXN0OworCQorCXByaXZhdGUgZmluYWwgVHlwZSBtdF9yZXNwb25zZTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiAiUHdBdXRoLyIrdHJhbnNwb3J0OworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgb3BlcmF0aW5nIG1vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gZ2V0U2VydmVyKCkKKwl7CisJCXJldHVybiBzZXJ2ZXI7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChtc2cuaXNUeXBlKCBtdF9yZXF1ZXN0ICkgKQorCQl7CisJCQloYW5kbGVQd0F1dGhSZXEoIHNlbmRlciwgbXNnICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJaWYgKG1zZy5pc1R5cGUoIG10X3Jlc3BvbnNlICkpCisJCXsKKwkJCWhhbmRsZVB3QXV0aFJlc3AoIHNlbmRlciwgbXNnICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJcmV0dXJuIHN1cGVyLnNlc3Npb25NZXNzYWdlKCBzZW5kZXIsIG1zZyApOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHNlc3Npb25VcCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmICghc2VydmVyKQorCQl7CisJCQkvLyBjbGllbnQ6IHNlbmQgYXV0aGVudGljYXRpb24gcmVxdWVzdC4KKwkJCXNlbmRQd0F1dGhSZXEoKTsKKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gc2Vzc2lvbkRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoc2VydmVyKQorCQl7CisJCQkvLyBtYWtlIHN1cmUgdGhhdCBzZXJ2ZXIgc2Vzc2lvbidzIGlkZWEgb2YgdXNlciBpcyBjbGVhcmVkLgorCQkJc2Vzc2lvbk5vdGlmeVVzZXIoIG51bGwsIG51bGwgKTsKKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNlbmRQd0F1dGhSZXEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAodXNlciA9PSBudWxsKQorCQl7CisJCQl1c2VyID0gKFN0cmluZykgc2Vzc2lvbi5zZXNzaW9uUXVlcnkoIFVTRVIgKTsKKwkJCWlmICh1c2VyID09IG51bGwpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIlB3QXV0aDogdXNlciA9PSBudWxsIiApOworCQl9CisJCQorCQlpZiAocGFzc3dvcmQgPT0gbnVsbCkKKwkJeworCQkJcGFzc3dvcmQgPSAoU3RyaW5nKSBzZXNzaW9uLnNlc3Npb25RdWVyeSggUEFTU1dPUkQgKTsKKwkJCWlmIChwYXNzd29yZCA9PSBudWxsKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJQd0F1dGg6IHBhc3N3b3JkID09IG51bGwiICk7CisJCX0KKwkJCisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10X3JlcXVlc3QsIHZmICk7CisJCW1zZy5wdXQoIG1mX3VzZXIsIHVzZXIgKTsKKwkJbXNnLnB1dCggbWZfcGFzc3dvcmQsIHBhc3N3b3JkICk7CisJCXRyYW5zcG9ydC50cmFuc3BvcnRNZXNzYWdlKCBudWxsLCBtc2cgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVB3QXV0aFJlcSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoIXNlcnZlcikKKwkJeworCQkJLy8gd2UncmUgYSBjbGllbnQgdGhhdCBnb3QgYSByZXF1ZXN0LCBsaWtlbHkgd2UncmUgdGFsa2luZyB0byBhCisJCQkvLyBzZXJ2ZXIgdGhhdCBpcyBjb25mdXNlZC4KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJTG9nLnJlcG9ydCggIkdvdFB3QXV0aFJlcSIsICJzZW5kZXIiLCBzZW5kZXIsICJtc2ciLCBtc2cgKTsKKwkJCisJCVN0cmluZyB1ID0gKFN0cmluZykgbXNnLmdldCggbWZfdXNlciApOworCQlTdHJpbmcgcCA9IChTdHJpbmcpIG1zZy5nZXQoIG1mX3Bhc3N3b3JkICk7CisJCQorCQl0cnkKKwkJeworCQkJT2tTdGF0dXMgYXMgPSAoT2tTdGF0dXMpIHNlc3Npb25RdWVyeSggbmV3IFVzZXJQYXNzd29yZCggdSwgcCApICk7CisJCQkKKwkJCWlmIChhcy5vaykKKwkJCQlzZXNzaW9uTm90aWZ5VXNlciggdSwgcCApOworCQkJZWxzZQorCQkJCXNlc3Npb25Ob3RpZnlVc2VyKCBudWxsLCBudWxsICk7CisJCQkKKwkJCXNlbmRQd0F1dGhSZXNwKCBzZW5kZXIsIG1zZywgYXMub2ssIGFzLnN0YXR1cyApOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlzZXNzaW9uTm90aWZ5VXNlciggbnVsbCwgbnVsbCApOworCQkJc2VuZFB3QXV0aFJlc3AoIHNlbmRlciwgbXNnLCBmYWxzZSwgZS50b1N0cmluZygpICk7CisJCQl0aHJvdyBlOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBzZW5kUHdBdXRoUmVzcCggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2csIGJvb2xlYW4gcmVzdWx0LCBTdHJpbmcgc3RhdHVzICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBybXNnID0gbXNnLnJlcGx5KCk7CisJCXJtc2cucHV0KCBtZl9vaywgcmVzdWx0ICk7CisJCXJtc2cucHV0KCBtZl9zdGF0dXMsIHN0YXR1cyApOworCQl0cmFuc3BvcnQudHJhbnNwb3J0TWVzc2FnZSggcmVjaXBpZW50LCBybXNnICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVB3QXV0aFJlc3AoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHNlcnZlcikKKwkJeworCQkJLy8gd2UncmUgYSBzZXJ2ZXIgdGhhdCBnb3QgYSByZXNwb25zZSwgbGlrZWx5IHdlJ3JlIHRhbGtpbmcgdG8gYQorCQkJLy8gY2xpZW50IHRoYXQgaXMgY29uZnVzZWQuCisJCQlyZXR1cm47CisJCX0KKwkJCisJCUxvZy5yZXBvcnQoICJHb3RQd0F1dGhSZXNwIiwgInNlbmRlciIsIHNlbmRlciwgIm1zZyIsIG1zZyApOworCQkKKwkJYm9vbGVhbiByZXN1bHQgPSAoQm9vbGVhbikgbXNnLmdldCggbWZfb2sgKTsKKwkJU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpIG1zZy5nZXQoIG1mX3N0YXR1cyApOworCQkKKwkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBuZXcgT2tTdGF0dXMoIHJlc3VsdCwgc3RhdHVzICkgKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHF1ZXJ5ID09IFVTRVIpCisJCQlyZXR1cm4gdXNlcjsKKwkJCisJCWlmIChxdWVyeSA9PSBQQVNTV09SRCkKKwkJCXJldHVybiBwYXNzd29yZDsKKwkJCisJCXJldHVybiBzdXBlci50cmFuc3BvcnRRdWVyeSggcXVlcnkgKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChjb250cm9sID09IFVTRVIpCisJCXsKKwkJCWNoZWNrTm90U2VydmVyKCk7CisJCQl1c2VyID0gKFN0cmluZykgdmFsdWU7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChjb250cm9sID09IFBBU1NXT1JEKQorCQl7CisJCQljaGVja05vdFNlcnZlcigpOworCQkJcGFzc3dvcmQgPSAoU3RyaW5nKSB2YWx1ZTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKGNvbnRyb2wgPT0gQVVUSEVOVElDQVRFKQorCQl7CisJCQljaGVja05vdFNlcnZlcigpOworCQkJc2VuZFB3QXV0aFJlcSgpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlzdXBlci50cmFuc3BvcnRDb250cm9sKCBjb250cm9sLCB2YWx1ZSApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja05vdFNlcnZlcigpCisJeworCQlpZiAoc2VydmVyKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggImNvbnRyb2wgbm90IHBlcm1pdHRlZCBieSBzZXJ2ZXIiICk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorCXByaXZhdGUgdm9pZCBzZXNzaW9uTm90aWZ5VXNlciggU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCXRoaXMudXNlciA9IHVzZXI7CisJCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKwkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBuZXcgVXNlclBhc3N3b3JkKCB1c2VyLCBwYXNzd29yZCApICk7CisJfQorCisJLyoqCisJICogU2VydmVyIHNlc3Npb24gcXVlcnkgdG8gZ2V0IEF1dGhPa1N0YXR1cywgYWxzbyBzZXJ2ZXIgc2Vzc2lvbiBldmVudAorCSAqIHRvIHJlcG9ydCBjaGFuZ2VzIGluIGF1dGhlbnRpY2F0aW9uIHN0YXR1cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFVzZXJQYXNzd29yZAorCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIENoZWNrQXV0aC4KKwkJICoKKwkJICogQHBhcmFtIHVzZXIgbmFtZSB0byBjaGVjay4KKwkJICogQHBhcmFtIHBhc3N3b3JkIG9mIHRoZSB1c2VyLgorCQkgKi8KKwkJcHVibGljIFVzZXJQYXNzd29yZCggU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCApCisJCXsKKwkJCXRoaXMudXNlciA9IHVzZXI7CisJCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwkJeworCQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJBdXRoVXNlclBhc3N3b3JkKCAlcyApIiwgdXNlciApOworCQl9CisJCQorCQkvKiogVGhlIHVzZXIgbmFtZSB0byBjaGVjayAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIHVzZXI7CisJCQorCQkvKiogVGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyICovCisJCXB1YmxpYyBmaW5hbCBTdHJpbmcgcGFzc3dvcmQ7CisJfQorCQorCS8qKgorCSAqIFNlcnZlciBzZXNzaW9uIHF1ZXJ5IHJlc3BvbnNlIHRvIEF1dGhVc2VyUGFzc3dvcmQuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBPa1N0YXR1cworCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIEF1dGhPa1N0YXR1cy4KKwkJICoKKwkJICogQHBhcmFtIG9rIHRydWUgaWYgdXNlciAvIHBhc3N3b3JkIHZhbGlkLgorCQkgKiBAcGFyYW0gc3RhdHVzIG1lc3NhZ2UgcmVsYXRlZCB0byBvay4KKwkJICovCisJCXB1YmxpYyBPa1N0YXR1cyggYm9vbGVhbiBvaywgU3RyaW5nIHN0YXR1cyApCisJCXsKKwkJCXRoaXMub2sgPSBvazsKKwkJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJCXsKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiQXV0aE9rU3RhdHVzKCAlcywgJXMgKSIsIG9rLCBzdGF0dXMgKTsKKwkJfQorCQkKKwkJLyoqIHRydWUgaWYgdGhlIHVzZXIgLyBwYXNzd29yZCBtYXRjaGVkICovCisJCXB1YmxpYyBmaW5hbCBib29sZWFuIG9rOworCQkKKwkJLyoqIG1lc3NhZ2UgcmVsYXRlZCB0byBvayAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIHN0YXR1czsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvVGFnZ2VkRGF0YS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L1RhZ2dlZERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjYxMGJjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L1RhZ2dlZERhdGEuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5Db21ib1ZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX1N0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5BcnJheVZhbHVlOworCisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgdmFyaW91cyB0eXBlcyBvZiB0YWdnZWQgZGF0YSBpbnB1dCBhbmQgb3V0cHV0LgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVGFnZ2VkRGF0YQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFRhZ2dlZERhdGEuCisJICoKKwkgKiBAcGFyYW0gdmYKKwkgKi8KKwlwdWJsaWMgVGFnZ2VkRGF0YSggVmFsdWVGYWN0b3J5IHZmICkKKwl7CisJCXRoaXMudmYgPSB2ZjsKKwl9CisJCisJLyoqCisJICogVGhlIHZhbHVlIGZhY3RvcnkgdG8gdXNlIGZvciB0YWdnZWQgaW5wdXQgYW5kIG91dHB1dC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVmFsdWVGYWN0b3J5IHZmOworCisJLyoqCisJICogQHJldHVybiB0aGUgdmFsdWUgZmFjdG9yeSB0byB1c2UgZm9yIHRhZ2dlZCBpbnB1dCBhbmQgb3V0cHV0LgorCSAqLworCXB1YmxpYyBWYWx1ZUZhY3RvcnkgZ2V0VmFsdWVGYWN0b3J5KCkKKwl7CisJCXJldHVybiB2ZjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcGFyYW0gdgorCSAqIEByZXR1cm4gYW4gQXJyYXlWYWx1ZSB3aGljaCBtb2RlbHMgdGhlIGdpdmVuIGFycmF5LgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisJcHJvdGVjdGVkIEFycmF5VmFsdWUgdG9BcnJheVZhbHVlKCBPYmplY3QgdmFsdWUsIFZhbGlkYXRvciB2ICkKKwl7CisJCUNsYXNzPD8+IGMgPSB2YWx1ZS5nZXRDbGFzcygpOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAidG9BcnJheVZhbHVlOiBjbGFzcyBpcyAlc1xuIiwgYyApOworCQlpbnQgZGltID0gMDsKKwkJd2hpbGUgKGMuaXNBcnJheSgpKQorCQl7CisJCQlkaW0rKzsKKwkJCWMgPSBjLmdldENvbXBvbmVudFR5cGUoKTsKKwkJfQorLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAidG9BcnJheVZhbHVlOiBiYXNlIGNsYXNzIGlzICVzIGRpbSAlZFxuIiwgYywgZGltICk7CisJCQorCQkvLyBub3cgd2Ugd2FudCB0aGUgdHlwZSBjb2RlIGZvciBjLCBhbmQgaWYgdGhlIHR5cGUgY29kZSBpcyBjdXN0b20sCisJCS8vIHdlJ2xsIGFsc28gd2FudCB0aGUgc3RydWN0IHR5cGUgY29kZS4KKwkJCisJCWJ5dGUgdHlwZUNvZGUgPSBnZXROYXRpdmVUeXBlQ29kZSggYyApOworCQkKKwkJVHlwZSBjdXN0b21TdHJ1Y3RUeXBlOworCQlpZiAodHlwZUNvZGUgPT0gVHlwZUNvZGUuQ1VTVE9NIHx8IHR5cGVDb2RlID09IFR5cGVDb2RlLlNUUlVDVCkKKwkJeworCQkJY3VzdG9tU3RydWN0VHlwZSA9IGdldEN1c3RvbVN0cnVjdFR5cGUoIGMgKTsKKwkJCQorCQkJaWYgKGN1c3RvbVN0cnVjdFR5cGUgPT0gbnVsbCAmJiBjID09IFN0cnVjdFZhbHVlLmNsYXNzKQorCQkJeworCQkJCVZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSB4ID0gZmluZFN0cnVjdFZhbHVlVmFsaWRhdG9yKCB2ICk7CisJCQkJaWYgKHggIT0gbnVsbCkKKwkJCQkJY3VzdG9tU3RydWN0VHlwZSA9IHguZ2V0VHlwZSgpOworCQkJfQorCQkJCisJCQlpZiAoY3VzdG9tU3RydWN0VHlwZSA9PSBudWxsICkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiY3VzdG9tU3RydWN0VHlwZSA9PSBudWxsIiApOworCQl9CisJCWVsc2UKKwkJCWN1c3RvbVN0cnVjdFR5cGUgPSBudWxsOworCisvLwkJU3lzdGVtLm91dC5wcmludGYoICJ0b0FycmF5VmFsdWU6IHR5cGUgJWQgY3VzdG9tU3RydWN0VHlwZSAlZCBkaW0gJWRcbiIsIHR5cGUsIGN1c3RvbVN0cnVjdFR5cGUsIGRpbSApOworCQlyZXR1cm4gbmV3IEFycmF5VmFsdWUoIHZhbHVlLCB0eXBlQ29kZSwgY3VzdG9tU3RydWN0VHlwZSwgZGltICk7CisJfQorCQorCXByaXZhdGUgVmFsaWRhdG9yX1N0cnVjdFZhbHVlIGZpbmRTdHJ1Y3RWYWx1ZVZhbGlkYXRvciggVmFsaWRhdG9yIHYgKQorCXsKKwkJaWYgKHYgaW5zdGFuY2VvZiBWYWxpZGF0b3JfU3RydWN0VmFsdWUpCisJCQlyZXR1cm4gKFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSkgdjsKKwkJCisJCWlmICh2IGluc3RhbmNlb2YgQ29tYm9WYWxpZGF0b3IpCisJCXsKKwkJCUNvbWJvVmFsaWRhdG9yIHggPSAoQ29tYm9WYWxpZGF0b3IpIHY7CisJCQlWYWxpZGF0b3JfU3RydWN0VmFsdWUgeSA9IGZpbmRTdHJ1Y3RWYWx1ZVZhbGlkYXRvciggeC5hKCkgKTsKKwkJCQorCQkJaWYgKHkgIT0gbnVsbCkKKwkJCQlyZXR1cm4geTsKKwkJCQorCQkJcmV0dXJuIGZpbmRTdHJ1Y3RWYWx1ZVZhbGlkYXRvciggeC5iKCkgKTsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHBhcmFtIGF2CisJICogQHJldHVybiBhIG5hdGl2ZSBhcnJheSBjb252ZXJ0ZWQgZnJvbSBhbiBhcnJheSB2YWx1ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGZyb21BcnJheVZhbHVlKCBBcnJheVZhbHVlIGF2ICkKKwl7CisJCXJldHVybiBhdi5nZXRBcnJheSgpOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gdHlwZUNvZGUKKwkgKiBAcGFyYW0gY3VzdG9tU3RydWN0VHlwZQorCSAqIEBwYXJhbSBkaW0KKwkgKiBAcGFyYW0gbGVuZ3RoCisJICogQHJldHVybiB0aGUgYWxsb2NhdGVkIGFycmF5IHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBPYmplY3QgYWxsb2NBcnJheVZhbHVlKCBieXRlIHR5cGVDb2RlLCBUeXBlIGN1c3RvbVN0cnVjdFR5cGUsCisJCWludCBkaW0sIGludCBsZW5ndGggKQorCXsKKwkJQ2xhc3M8Pz4gY2xzcyA9IGdldENvbXBvbmVudFR5cGUoIHR5cGVDb2RlLCBjdXN0b21TdHJ1Y3RUeXBlLCBkaW0tMSApOworCQkKKwkJaWYgKGNsc3MgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJImNvdWxkIG5vdCBnZXQgYXJyYXkgZm9yICVzLCAlcywgJWQiLAorCQkJCXR5cGVDb2RlLCBjdXN0b21TdHJ1Y3RUeXBlLCBkaW0tMSApICk7CisKKwkJcmV0dXJuIEFycmF5Lm5ld0luc3RhbmNlKCBjbHNzLCBsZW5ndGggKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKwlwcml2YXRlIENsYXNzPD8+IGdldENvbXBvbmVudFR5cGUoIGJ5dGUgdHlwZUNvZGUsIFR5cGUgY3VzdG9tU3RydWN0VHlwZSwKKwkJaW50IGRpbSApCisJeworCQlDbGFzczw/PiBjOworCQlpZiAodHlwZUNvZGUgPT0gVHlwZUNvZGUuQ1VTVE9NIHx8IHR5cGVDb2RlID09IFR5cGVDb2RlLlNUUlVDVCkKKwkJeworCQkJYyA9IGN1c3RvbVN0cnVjdFR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworCQkJaWYgKGMgPT0gbnVsbCkKKwkJCQljID0gU3RydWN0VmFsdWUuY2xhc3M7CisJCX0KKwkJZWxzZQorCQl7CisJCQljID0gZ2V0TmF0aXZlVHlwZSggdHlwZUNvZGUgKTsKKwkJfQorCQkKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggImdldENvbXBvbmVudFR5cGUgY2xhc3MgJXNcbiIsIGMgKTsKKwkJCisJCWlmIChjID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCWlmIChkaW0gPT0gMCkKKwkJCXJldHVybiBjOworCQkKKwkJLy8gVE9ETyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZ2V0IHRoZSBjbGFzcyBvZiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5PworCQlpbnRbXSBkaW1zID0gbmV3IGludFtkaW1dOworCQlPYmplY3QgbyA9IEFycmF5Lm5ld0luc3RhbmNlKCBjLCBkaW1zICk7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJvYmplY3QgPSAlc1xuIiwgbyApOworCQljID0gby5nZXRDbGFzcygpOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAiY2xhc3MgPSAlc1xuIiwgYyApOworCQlyZXR1cm4gYzsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHJldHVybiBhIHR5cGUgY29kZSBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgYnl0ZSBjaGVja1ZhbHVlKCBPYmplY3QgdmFsdWUgKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuIFRoaXMKKwkgKiBpcyBuZWVkZWQgd2hlbiB3ZSBoYXZlIGFuIGFycmF5IGFuZCB3ZSBoYXZlIGRldGVybWluZQorCSAqIHRoZSBiYXNlIHR5cGUgYW5kIG5vdyB3ZSdyZSBmaXhpbmcgdG8gc2VyaWFsaXplIGl0LgorCSAqIFdlIHVzZSB0aGUgYmFzZSB0eXBlIGNvZGUgdG8gcmVjb25zdGl0dXRlIGl0IG9uIHRoZQorCSAqIG90aGVyIHNpZGUuIFNvIHdlIGRvbid0IHJldHVybiBhIHBlcmZlY3QgY29kZSB0aGUgd2F5CisJICogY2hlY2tWYWx1ZSBkb2VzLCBidXQgcmF0aGVyIGp1c3Qgc29tZXRoaW5nIHRoYXQgbGV0J3MKKwkgKiB1cyByZWNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgYXJyYXkgdHlwZSBvbiBpbXBvcnQuCisJICogQHBhcmFtIGMKKwkgKiBAcmV0dXJuIGEgdHlwZSBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBieXRlIGdldE5hdGl2ZVR5cGVDb2RlKCBDbGFzczw/PiBjICk7CisJCisJLyoqCisJICogQHBhcmFtIGMKKwkgKiBAcmV0dXJuIGEgc3RydWN0IHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY3VzdG9tIGNsYXNzLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBUeXBlIGdldEN1c3RvbVN0cnVjdFR5cGUoIENsYXNzPD8+IGMgKTsKKworCS8qKgorCSAqIEBwYXJhbSB0eXBlCisJICogQHJldHVybiB0aGUgY2xhc3MgZm9yIGEgc3BlY2lmaWVkIChuYXRpdmUpIHR5cGUgY29kZS4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgQ2xhc3M8Pz4gZ2V0TmF0aXZlVHlwZSggYnl0ZSB0eXBlICk7Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvVHlwZUNvZGUuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC9UeXBlQ29kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDgzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvVHlwZUNvZGUuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQ7CisKKy8qKgorICogVmFsdWVzIGRlbm90aW5nIHR5cGVzIG9mIGVuY29kZWQgdmFsdWVzLiBUaGVyZSBhcmUgdHdvIHZhbHVlIHJhbmdlczoKKyAqIAorICogLTEyOCB0byAtNjU6IGNvZGVzIGZvciBkZWZpbmVkIHR5cGVzLgorICogLTY0IHRvIDEyNzogdGlueSBpbnRlZ2VyIHZhbHVlcy4KKyAqIAorICogVGlueSBpbnRlZ2VycyBhcmUgY29tcGxldGVseSBlbmNvZGVkIHdpdGhpbiB0aGUgdHlwZSBieXRlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVDb2RlCit7CisJLyoqCisJICogQSBjb2RlIGRlbm90aW5nIGEgbnVsbCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgYnl0ZSBOVUxMID0gLTEyODsKKwkKKwkvKioKKwkgKiBBIGNvZGUgZGVub3Rpbmcgbm8gdmFsdWUsIHdoaWNoIGlzIGRpZmZlcmVudCB0aGFuIE5VTEwuIEZvcgorCSAqIGV4YW1wbGUsIGFuIGFycmF5IGlzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIChzb21lIG9mIHdoaWNoIG1heQorCSAqIGJlIE5VTEwpLCB0ZXJtaW5hdGVkIGJ5IGEgTk9ORS4KKwkgKi8KKwlwdWJsaWMgYnl0ZSBOT05FID0gLTEyNzsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gc2NhbGFyIHZhbHVlcyAoYnV0LCBhbHNvIHNlZSB0aW55IGludCBiZWxvdykgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEEgY29kZSBkZW5vdGluZyBhIGZhbHNlIGJvb2xlYW4gdmFsdWUuCisJICovCisJcHVibGljIGJ5dGUgQk9PTEVBTl9GQUxTRSA9IC0xMjY7CisJCisJLyoqCisJICogQSBjb2RlIGRlbm90aW5nIGEgdHJ1ZSBib29sZWFuIHZhbHVlLgorCSAqLworCXB1YmxpYyBieXRlIEJPT0xFQU5fVFJVRSA9IC0xMjU7CisJCisJLyoqCisJICogQSBjb2RlIGRlbm90aW5nIGEgc2lnbmVkIGJ5dGUuCisJICovCisJcHVibGljIGJ5dGUgQllURSA9IC0xMjQ7CisJCisJLyoqCisJICogQSBjb2RlIGRlbm90aW5nIGEgdHdvIGJ5dGUgc2lnbmVkIHNob3J0LCBtc2IgZmlyc3QuCisJICovCisJcHVibGljIGJ5dGUgU0hPUlQgPSAtMTIzOworCQorCS8qKgorCSAqIEEgY29kZSBkZW5vdGluZyBhIGZvdXIgYnl0ZSBzaWduZWQgaW50ZWdlciwgbXNiIGZpcnN0LgorCSAqLworCXB1YmxpYyBieXRlIElOVCA9IC0xMjI7CisJCisJLyoqCisJICogQSBjb2RlIGRlbm90aW5nIGFuIGVpZ2h0IGJ5dGUgc2lnbmVkIGxvbmcsIG1zYiBmaXJzdC4KKwkgKi8KKwlwdWJsaWMgYnl0ZSBMT05HID0gLTEyMTsKKwkKKwkvKioKKwkgKiBBIGNvZGUgZGVub3RpbmcgYSBmb3VyIGJ5dGUgaWVlZSBmbG9hdGluZyBmb3JtYXQgbnVtYmVyIChzaW5nbGUsCisJICogd3JpdHRlbiBhcyBhbiBJTlQpLgorCSAqLworCXB1YmxpYyBieXRlIEZMT0FUID0gLTEyMDsKKwkKKwkvKioKKwkgKiBBIGNvZGUgZGVub3RpbmcgYW4gZWlnaHQgYnl0ZSBpZWVlIGZsb2F0aW5nIGZvcm1hdCBudW1iZXIgKGRvdWJsZSwKKwkgKiB3cml0dGVuIGFzIGEgTE9ORykuCisJICovCisJcHVibGljIGJ5dGUgRE9VQkxFID0gLTExOTsKKworCS8vLy8vLy8vLy8vLworCS8vIGFycmF5cyAvLworCS8vLy8vLy8vLy8vLworCQorCS8vIEJPT0xTLCBTSE9SVFMsIElOVFMsIExPTkdTLCBGTE9BVFMsIGFuZCBET1VCTEVTIGFyZQorCS8vIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorCisvLwkvKioKKy8vCSAqIEEgY29kZSBkZW5vdGluZyBhbiBhcnJheSBvZiBib29sZWFucy4KKy8vCSAqLworLy8JcHVibGljIGJ5dGUgQk9PTFMgPSAtMTE4OworCQorCS8qKgorCSAqIEEgY29kZSBkZW5vdGluZyBhbiBhcnJheSBvZiBieXRlcy4KKwkgKi8KKwlwdWJsaWMgYnl0ZSBCWVRFUyA9IC0xMTc7CisKKy8vCS8qKgorLy8JICogQSBjb2RlIGRlbm90aW5nIGFuIGFycmF5IG9mIHNob3J0cy4KKy8vCSAqLworLy8JcHVibGljIGJ5dGUgU0hPUlRTID0gLTExNjsKKworLy8JLyoqCisvLwkgKiBBIGNvZGUgZGVub3RpbmcgYW4gYXJyYXkgb2YgaW50cy4KKy8vCSAqLworLy8JcHVibGljIGJ5dGUgSU5UUyA9IC0xMTU7CisKKy8vCS8qKgorLy8JICogQSBjb2RlIGRlbm90aW5nIGFuIGFycmF5IG9mIGxvbmdzLgorLy8JICovCisvLwlwdWJsaWMgYnl0ZSBMT05HUyA9IC0xMTQ7CisKKy8vCS8qKgorLy8JICogQSBjb2RlIGRlbm90aW5nIGFuIGFycmF5IG9mIGllZWUgZm9ybWF0IHNpbmdsZXMuCisvLwkgKi8KKy8vCXB1YmxpYyBieXRlIEZMT0FUUyA9IC0xMTM7CisKKy8vCS8qKgorLy8JICogQSBjb2RlIGRlbm90aW5nIGFuIGFycmF5IG9mIGllZWUgZm9ybWF0IGRvdWJsZXMuCisvLwkgKi8KKy8vCXB1YmxpYyBieXRlIERPVUJMRVMgPSAtMTEyOworCQorCS8qKgorCSAqIEEgY29kZSBkZW5vdGluZyBhIHNlcXVlbmNlIG9mIHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgYnl0ZSBBUlJBWSA9IC0xMTE7CisJCisJLy8vLy8vLy8vLy8vLworCS8vIHN0cmluZ3MgLy8KKwkvLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQSBjb2RlIGRlbm90aW5nIGFuIGVtcHR5IHN0cmluZy4KKwkgKi8KKwlwdWJsaWMgYnl0ZSBFTVBUWV9TVFJJTkcgPSAtMTEwOworCQorCS8qKgorCSAqIEEgY29kZSBkZW5vdGluZyBhIHV0Zi04IGVuY29kZWQgc3RyaW5nLgorCSAqLworCXB1YmxpYyBieXRlIFNUUklORyA9IC0xMDk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBzdHJ1Y3R1cmVkIGRhdGEgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBBIGNvZGUgZGVub3RpbmcgYSBjdXN0b20gdmFsdWUgKHN0cnVjdCwgZXhjZXB0aW9uLCBlbnVtLCBleHRlcm4pCisJICogZnJvbSBhIHZhbHVlIGZhY3RvcnkuIEFuIGFzc29jaWF0ZWQgdmFsdWUgaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMKKwkgKiB0eXBlLiBUaGUgZm9ybWF0IG9uIHRoZSB3aXJlIG9mIFNUUlVDVCBhbmQgQ1VTVE9NIGFyZSB0aGUgc2FtZS4KKwkgKiBFbWl0IENVU1RPTSBpbnN0ZWFkIG9mIFNUUlVDVCwgYW5kIGFjY2VwdCBTVFJVQ1QgYXMgaWYgaXQgd2VyZQorCSAqIENVU1RPTS4KKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBieXRlIFNUUlVDVCA9IC0xMDg7CisJCisJLyoqCisJICogQSBjb2RlIGRlbm90aW5nIGEgY3VzdG9tIHZhbHVlIChzdHJ1Y3QsIGV4Y2VwdGlvbiwgZW51bSwgZXh0ZXJuKQorCSAqIGZyb20gYSB2YWx1ZSBmYWN0b3J5LiBBbiBhc3NvY2lhdGVkIHZhbHVlIGlkZW50aWZpZXMgdGhlIHNwZWNpZmljCisJICogdHlwZS4gVGhlIGZvcm1hdCBvbiB0aGUgd2lyZSBvZiBTVFJVQ1QgYW5kIENVU1RPTSBhcmUgdGhlIHNhbWUuCisJICogRW1pdCBDVVNUT00gaW5zdGVhZCBvZiBTVFJVQ1QsIGFuZCBhY2NlcHQgU1RSVUNUIGFzIGlmIGl0IHdlcmUKKwkgKiBDVVNUT00uCisJICovCisJcHVibGljIGJ5dGUgQ1VTVE9NID0gLTEwNzsKKworCS8vLy8vLy8vLy8KKwkvLyBtaXNjIC8vCisJLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEEgY29kZSBkZW5vdGluZyB0aGF0IGFueSB2YWx1ZSBpcyBvayAoYXMgbG9uZyBhcyB3ZSBrbm93IGhvdworCSAqIHRvIHNlcmlhbGl6ZSBpdCkuIER5bmFtaWMgbWV0aG9kcyBzaG91bGQgYmUgYXBwbGllZCB0byBkZXRlcm1pbmUKKwkgKiB0aGUgdHlwZS4gVGhpcyB0eXBlIG5ldmVyIGFwcGVhcnMgb24gdGhlIHdpcmUuCisJICovCisJcHVibGljIGJ5dGUgQU5ZID0gLTEwNjsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyB0aW55IGludGVnZXJzIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIE1pbmltdW0gInRpbnkiIGludGVnZXIuCisJICovCisJcHVibGljIGJ5dGUgTUlOX1RJTllfSU5UID0gLTY0OworCQorCS8qKgorCSAqIE1heGltdW0gInRpbnkiIGludGVnZXIuCisJICovCisJcHVibGljIGJ5dGUgTUFYX1RJTllfSU5UID0gMTI3OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC9iaW5hcnkvQmluYXJ5VGFnZ2VkRGF0YS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L2JpbmFyeS9CaW5hcnlUYWdnZWREYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3NDZlNwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC9iaW5hcnkvQmluYXJ5VGFnZ2VkRGF0YS5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LmZtdC5iaW5hcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZm10LlRhZ2dlZERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LmZtdC5UeXBlQ29kZTsKKworLyoqCisgKiBDb21tb24gZWxlbWVudHMgZm9yIGJpbmFyeSB0YWdnZWQgZGF0YSBpbnB1dCBhbmQgb3V0cHV0LgorICovCitwdWJsaWMgY2xhc3MgQmluYXJ5VGFnZ2VkRGF0YSBleHRlbmRzIFRhZ2dlZERhdGEKK3sKKwkvKioKKwkgKiBTZW50aW5lbCB3aGljaCBtYXJrcyB0aGUgZW5kIG9mIGEgc3RydWN0IG9yIGFycmF5IGl0ZW0gbGlzdAorCSAqIGluIGEgYmluYXJ5IGlucHV0IG9yIG91dHB1dCBzdHJlYW0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9ORSA9IG5ldyBPYmplY3QoKQorCXsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCQl7CisJCQlyZXR1cm4gIk5PTkUiOworCQl9CisJfTsKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHByb3RvY29sLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSBWRVJTSU9OID0gMzsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEJpbmFyeVRhZ2dlZERhdGEuCisJICoKKwkgKiBAcGFyYW0gdmYKKwkgKi8KKwlwdWJsaWMgQmluYXJ5VGFnZ2VkRGF0YSggVmFsdWVGYWN0b3J5IHZmICkKKwl7CisJCXN1cGVyKCB2ZiApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBieXRlIGNoZWNrVmFsdWUoIGZpbmFsIE9iamVjdCB2YWx1ZSApCisJeworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiBUeXBlQ29kZS5OVUxMOworCQkKKwkJaWYgKHZhbHVlID09IE5PTkUpCisJCQlyZXR1cm4gVHlwZUNvZGUuTk9ORTsKKwkJCisJCWZpbmFsIENsYXNzPD8+IGMgPSB2YWx1ZS5nZXRDbGFzcygpOworCQkKKwkJaWYgKGMgPT0gQm9vbGVhbi5jbGFzcykKKwkJCXJldHVybiAoQm9vbGVhbikgdmFsdWUgPyBUeXBlQ29kZS5CT09MRUFOX1RSVUUgOiBUeXBlQ29kZS5CT09MRUFOX0ZBTFNFOworCQkKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKQorCQl7CisJCQlpZiAoYyA9PSBCeXRlLmNsYXNzKQorCQkJCXJldHVybiBjaGVja0J5dGUoIChCeXRlKSB2YWx1ZSApOworCQkJCisJCQlpZiAoYyA9PSBTaG9ydC5jbGFzcykKKwkJCQlyZXR1cm4gY2hlY2tTaG9ydCggKFNob3J0KSB2YWx1ZSApOworCQkJCQorCQkJaWYgKGMgPT0gSW50ZWdlci5jbGFzcykKKwkJCQlyZXR1cm4gY2hlY2tJbnRlZ2VyKCAoSW50ZWdlcikgdmFsdWUgKTsKKwkJCQorCQkJaWYgKGMgPT0gTG9uZy5jbGFzcykKKwkJCQlyZXR1cm4gY2hlY2tMb25nKCAoTG9uZykgdmFsdWUgKTsKKwkJCQorCQkJaWYgKGMgPT0gRmxvYXQuY2xhc3MpCisJCQkJcmV0dXJuIFR5cGVDb2RlLkZMT0FUOworCQkJCisJCQlpZiAoYyA9PSBEb3VibGUuY2xhc3MpCisJCQkJcmV0dXJuIFR5cGVDb2RlLkRPVUJMRTsKKwkJCQorCQkJcmV0dXJuIFR5cGVDb2RlLkNVU1RPTTsKKwkJfQorCQkKKwkJaWYgKGMgPT0gU3RyaW5nLmNsYXNzKQorCQl7CisJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOworCQkJCisJCQlpZiAocy5sZW5ndGgoKSA9PSAwKQorCQkJCXJldHVybiBUeXBlQ29kZS5FTVBUWV9TVFJJTkc7CisJCQkKKwkJCXJldHVybiBUeXBlQ29kZS5TVFJJTkc7CisJCX0KKwkJCisJCWlmIChjID09IFN0cnVjdFZhbHVlLmNsYXNzKQorCQkJcmV0dXJuIFR5cGVDb2RlLkNVU1RPTTsKKwkJCisJCWlmIChjLmlzQXJyYXkoKSkKKwkJeworLy8JCQlpZiAoYyA9PSBib29sZWFuW10uY2xhc3MpIHJldHVybiBUeXBlQ29kZS5CT09MUzsKKwkJCWlmIChjID09IGJ5dGVbXS5jbGFzcykgcmV0dXJuIFR5cGVDb2RlLkJZVEVTOworLy8JCQlpZiAoYyA9PSBzaG9ydFtdLmNsYXNzKSByZXR1cm4gVHlwZUNvZGUuU0hPUlRTOworLy8JCQlpZiAoYyA9PSBpbnRbXS5jbGFzcykgcmV0dXJuIFR5cGVDb2RlLklOVFM7CisvLwkJCWlmIChjID09IGxvbmdbXS5jbGFzcykgcmV0dXJuIFR5cGVDb2RlLkxPTkdTOworLy8JCQlpZiAoYyA9PSBmbG9hdFtdLmNsYXNzKSByZXR1cm4gVHlwZUNvZGUuRkxPQVRTOworLy8JCQlpZiAoYyA9PSBkb3VibGVbXS5jbGFzcykgcmV0dXJuIFR5cGVDb2RlLkRPVUJMRVM7CisJCQlyZXR1cm4gVHlwZUNvZGUuQVJSQVk7CisJCX0KKwkJCisJCXJldHVybiBUeXBlQ29kZS5DVVNUT007CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJ5dGUgZ2V0TmF0aXZlVHlwZUNvZGUoIENsYXNzPD8+IGMgKQorCXsKKwkJaWYgKGMgPT0gYm9vbGVhbi5jbGFzcykKKwkJCXJldHVybiBUeXBlQ29kZS5CT09MRUFOX1RSVUU7CisJCQorCQlpZiAoYyA9PSBieXRlLmNsYXNzKQorCQkJcmV0dXJuIFR5cGVDb2RlLkJZVEU7CisJCQorCQlpZiAoYyA9PSBzaG9ydC5jbGFzcykKKwkJCXJldHVybiBUeXBlQ29kZS5TSE9SVDsKKwkJCQorCQlpZiAoYyA9PSBpbnQuY2xhc3MpCisJCQlyZXR1cm4gVHlwZUNvZGUuSU5UOworCQkKKwkJaWYgKGMgPT0gbG9uZy5jbGFzcykKKwkJCXJldHVybiBUeXBlQ29kZS5MT05HOworCQkKKwkJaWYgKGMgPT0gZmxvYXQuY2xhc3MpCisJCQlyZXR1cm4gVHlwZUNvZGUuRkxPQVQ7CisJCQorCQlpZiAoYyA9PSBkb3VibGUuY2xhc3MpCisJCQlyZXR1cm4gVHlwZUNvZGUuRE9VQkxFOworCQkKKwkJaWYgKGMgPT0gU3RyaW5nLmNsYXNzKQorCQkJcmV0dXJuIFR5cGVDb2RlLlNUUklORzsKKwkJCisJCWlmIChjID09IE9iamVjdC5jbGFzcykKKwkJCXJldHVybiBUeXBlQ29kZS5BTlk7CisJCQorCQlyZXR1cm4gVHlwZUNvZGUuQ1VTVE9NOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUeXBlIGdldEN1c3RvbVN0cnVjdFR5cGUoIENsYXNzPD8+IGMgKQorCXsKKwkJcmV0dXJuIHZmLmdldEN1c3RvbVN0cnVjdFR5cGUoIGMgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2xhc3M8Pz4gZ2V0TmF0aXZlVHlwZSggYnl0ZSB0eXBlICkKKwl7CisJCXN3aXRjaCAodHlwZSkKKwkJeworCQkJY2FzZSBUeXBlQ29kZS5CT09MRUFOX1RSVUU6CisJCQljYXNlIFR5cGVDb2RlLkJPT0xFQU5fRkFMU0U6CisJCQkJcmV0dXJuIGJvb2xlYW4uY2xhc3M7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuQllURToKKwkJCQlyZXR1cm4gYnl0ZS5jbGFzczsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5TSE9SVDoKKwkJCQlyZXR1cm4gc2hvcnQuY2xhc3M7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuSU5UOgorCQkJCXJldHVybiBpbnQuY2xhc3M7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuTE9ORzoKKwkJCQlyZXR1cm4gbG9uZy5jbGFzczsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5GTE9BVDoKKwkJCQlyZXR1cm4gZmxvYXQuY2xhc3M7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuRE9VQkxFOgorCQkJCXJldHVybiBkb3VibGUuY2xhc3M7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuRU1QVFlfU1RSSU5HOgorCQkJY2FzZSBUeXBlQ29kZS5TVFJJTkc6CisJCQkJcmV0dXJuIFN0cmluZy5jbGFzczsKKwkJCQkKKwkJCWNhc2UgVHlwZUNvZGUuQU5ZOgorCQkJCXJldHVybiBPYmplY3QuY2xhc3M7CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInVuc3VwcG9ydGVkIG5hdGl2ZSB0eXBlICIrdHlwZSApOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZSBjaGVja0J5dGUoIGJ5dGUgdiApCisJeworCQlpZiAodiA+PSBUeXBlQ29kZS5NSU5fVElOWV9JTlQgJiYgdiA8PSBUeXBlQ29kZS5NQVhfVElOWV9JTlQpCisJCQlyZXR1cm4gdjsKKwkJCisJCXJldHVybiBUeXBlQ29kZS5CWVRFOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBieXRlIGNoZWNrU2hvcnQoIHNob3J0IHYgKQorCXsKKwkJaWYgKHYgPj0gQnl0ZS5NSU5fVkFMVUUgJiYgdiA8PSBCeXRlLk1BWF9WQUxVRSkKKwkJCXJldHVybiBjaGVja0J5dGUoIChieXRlKSB2ICk7CisJCQorCQlyZXR1cm4gVHlwZUNvZGUuU0hPUlQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZSBjaGVja0ludGVnZXIoIGludCB2ICkKKwl7CisJCWlmICh2ID49IFNob3J0Lk1JTl9WQUxVRSAmJiB2IDw9IFNob3J0Lk1BWF9WQUxVRSkKKwkJCXJldHVybiBjaGVja1Nob3J0KCAoc2hvcnQpIHYgKTsKKwkJCisJCXJldHVybiBUeXBlQ29kZS5JTlQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZSBjaGVja0xvbmcoIGxvbmcgdiApCisJeworCQlpZiAodiA+PSBJbnRlZ2VyLk1JTl9WQUxVRSAmJiB2IDw9IEludGVnZXIuTUFYX1ZBTFVFKQorCQkJcmV0dXJuIGNoZWNrSW50ZWdlciggKGludCkgdiApOworCQkKKwkJcmV0dXJuIFR5cGVDb2RlLkxPTkc7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L2JpbmFyeS9CaW5hcnlUYWdnZWREYXRhRm9ybWF0RmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L2JpbmFyeS9CaW5hcnlUYWdnZWREYXRhRm9ybWF0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTc4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvYmluYXJ5L0JpbmFyeVRhZ2dlZERhdGFGb3JtYXRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQuYmluYXJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuRm9ybWF0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVGFnZ2VkRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5UYWdnZWREYXRhT3V0cHV0OworCisvKioKKyAqIEZvcm1hdCBmYWN0b3J5IGZvciBiaW5hcnkgdGFnZ2VkIGRhdGEuCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlUYWdnZWREYXRhRm9ybWF0RmFjdG9yeSBleHRlbmRzIEZvcm1hdEZhY3RvcnkKK3sKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGFnZ2VkRGF0YUlucHV0IG5ld1RhZ2dlZERhdGFJbnB1dCggVmFsdWVGYWN0b3J5IHZmLCBTdHJpbmcgdXJpICkKKwl7CisJCXJldHVybiBuZXcgQmluYXJ5VGFnZ2VkRGF0YUlucHV0KCB2ZiwgdXJpICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRhZ2dlZERhdGFPdXRwdXQgbmV3VGFnZ2VkRGF0YU91dHB1dCggVmFsdWVGYWN0b3J5IHZmLCBTdHJpbmcgdXJpICkKKwl7CisJCXJldHVybiBuZXcgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCggdmYsIHVyaSApOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvYmluYXJ5L0JpbmFyeVRhZ2dlZERhdGFJbnB1dC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L2JpbmFyeS9CaW5hcnlUYWdnZWREYXRhSW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTIzN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L2JpbmFyeS9CaW5hcnlUYWdnZWREYXRhSW5wdXQuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQuYmluYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5Db21ib1ZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9pbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3Jfb2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX3N0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuQXJyYXlWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVGFnZ2VkRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQuVHlwZUNvZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CisKKworLyoqCisgKiBCaW5hcnlUYWdnZWREYXRhSW5wdXQgaGFzIG1ldGhvZHMgdG8gc3VwcG9ydCByZWFkaW5nIHRhZ2dlZAorICogdmFsdWVzIGZyb20gYW4gaW5wdXQgYnVmZmVyLgorICovCitmaW5hbCBwdWJsaWMgY2xhc3MgQmluYXJ5VGFnZ2VkRGF0YUlucHV0IGV4dGVuZHMgQmluYXJ5VGFnZ2VkRGF0YQorCWltcGxlbWVudHMgVGFnZ2VkRGF0YUlucHV0Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQmluYXJ5VGFnZ2VkRGF0YUlucHV0IHdpdGggYSBudWxsIGJ1ZmZlci4KKwkgKiAKKwkgKiBAcGFyYW0gdmYgdGhlIHZhbHVlIGZhY3RvcnkgZm9yIHRoZSBzZXJ2aWNlLgorCSAqIEBwYXJhbSB1cmkgdGhlIHVyaSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgdHJhbnNwb3J0IHN0YWNrLgorCSAqLworCXB1YmxpYyBCaW5hcnlUYWdnZWREYXRhSW5wdXQoIFZhbHVlRmFjdG9yeSB2ZiwgU3RyaW5nIHVyaSApCisJeworCQlzdXBlciggdmYgKTsKKwkJLy8gZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHVyaSB5ZXQuCisJfQorCisJcHJpdmF0ZSBGbGV4QnVmZmVyIGJ1ZjsKKwkKKwlwcml2YXRlIGludCBsZW5ndGhCdWRnZXQ7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRhZ2dlZERhdGFJbnB1dCBtZXRob2RzIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwlwdWJsaWMgTWVzc2FnZSByZWFkTWVzc2FnZSggRmxleEJ1ZmZlciBidWYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXRoaXMuYnVmID0gYnVmOworCQkKKwkJLy8gbGVuZ3RoQnVkZ2V0IGlzIGhvdyBtYW55IGFycmF5IGVsZW1lbnRzIHRvdGFsIGFyZSByZWFzb25hYmxlIHRvCisJCS8vIGFsbG9jYXRlIHdoaWxlIHBhcnNpbmcgdGhpcyBtZXNzYWdlLiB0aGUgbGFyZ2VzdCB2YWx1ZSBjb21lcyBhcyBlYWNoCisJCS8vIGJ5dGUgb2YgdGhlIGluY29taW5nIG1lc3NhZ2UgdHVybmVkIGludG8gYW4gYXJyYXkgZWxlbWVudC4gdGhlIHRvdGFsCisJCS8vIHdpbGwgYWx3YXlzIGJlIGxvd2VyIHRoYW4gdGhpcyBhcyBvZnRlbiBpdCB0YWtlcyBtdWx0aXBsZSBieXRlcyB0bworCQkvLyBtYWtlIGEgc2luZ2xlIGFycmF5IGVsZW1lbnQuIHNvLCBlYWNoIHRpbWUgd2UgbWFrZSBhbiBhcnJheSwgd2UKKwkJLy8gZGVkdWN0IHRoZSBzcGVjaWZpZWQgbGVuZ3RoIGZyb20gbGVuZ3RoQnVkZ2V0LiBpZiB0aGUgcmVzdWx0IGlzCisJCS8vIG5lZ2F0aXZlLCB0aGVuIGVpdGhlciB0aGUgaW5jb21pbmcgbWVzc2FnZSBpcyBtaXNmb3JtZWQgb3Igc29tZW9uZSBpcworCQkvLyB0cnlpbmcgdG8gc3Bvb2YgdXMuCisJCQorCQlsZW5ndGhCdWRnZXQgPSBidWYuYXZhaWwoKTsKKwkJCisJCXRyeQorCQl7CisJCQlNZXNzYWdlIG1zZyA9IHN0YXJ0TWVzc2FnZSgpOworCQkJcmVhZEtleXNBbmRWYWx1ZXMoIG1zZyApOworCQkJZW5kTWVzc2FnZSggbXNnICk7CisJCQlyZXR1cm4gbXNnOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJdGhpcy5idWYgPSBudWxsOworCQkJbGVuZ3RoQnVkZ2V0ID0gMDsKKwkJfQorCX0KKworCXByaXZhdGUgU3RydWN0VmFsdWUgcmVhZFN0cnVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBzdGFydFN0cnVjdCgpOworCQlyZWFkS2V5c0FuZFZhbHVlcyggc3YgKTsKKwkJZW5kU3RydWN0KCBzdiApOworCQlyZXR1cm4gc3Y7CisJfQorCQorCXByaXZhdGUgQXJyYXlWYWx1ZSByZWFkQXJyYXkoIFZhbGlkYXRvciB2ICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlBcnJheVZhbHVlIGF2ID0gc3RhcnRBcnJheSgpOworCQlyZWFkVmFsdWVzKCBhdiwgdiApOworCQllbmRBcnJheSggYXYgKTsKKwkJcmV0dXJuIGF2OworCX0KKworCXByaXZhdGUgdm9pZCByZWFkS2V5c0FuZFZhbHVlcyggU3RydWN0VmFsdWUgc3YgKQorCQl0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVR5cGUgdCA9IHN2LnR5cGUoKTsKKwkJd2hpbGUgKHRydWUpCisJCXsKKwkJCUZpZWxkIGtleSA9IHJlYWRGaWVsZCggdCApOworCQkJaWYgKGtleSA9PSBudWxsKQorCQkJCWJyZWFrOworCQkJCisJCQlWYWxpZGF0b3IgdiA9IHQuZ2V0VmFsaWRhdG9yKCBrZXkgKTsKKwkJCWlmICh2ICE9IG51bGwpCisJCQl7CisJCQkJc3YucHV0KCBrZXksIHJlYWRWYWx1ZSggdiApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gcmVhZCB0aGUgdmFsdWUgYnV0IGlnbm9yZSBpdC4KKwkJCQlPYmplY3Qgb2JqID0gcmVhZFZhbHVlKCBWYWxpZGF0b3Jfb2JqZWN0LmdldCggMCApICk7CisJCQkJaWYgKGZhbHNlKQorCQkJCQlzdi5wdXQoIGtleSwgb2JqICk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVhZFZhbHVlcyggQXJyYXlWYWx1ZSBhdiwgVmFsaWRhdG9yIHYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvciBldiA9IHYuZWxlbWVudFZhbGlkYXRvcigpOworCQl3aGlsZSAodHJ1ZSkKKwkJeworCQkJT2JqZWN0IHZhbHVlID0gcmVhZFZhbHVlKCBldiwgdHJ1ZSApOworCQkJaWYgKHZhbHVlID09IE5PTkUpCisJCQkJYnJlYWs7CisJCQkKKwkJCWF2LmFkZCggdmFsdWUgKTsKKwkJfQorCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE1haW4gaW5wdXQgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHJpdmF0ZSBNZXNzYWdlIHN0YXJ0TWVzc2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJYnl0ZSB2ZXJzaW9uID0gYnVmLmdldEJ5dGUoKTsKKwkJCisJCWlmICh2ZXJzaW9uICE9IFZFUlNJT04pCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisJCQkJU3RyaW5nLmZvcm1hdCgKKwkJCQkJImJpbmFyeSB0YWdnZWQgZGF0YSB2ZXJzaW9uIG1pc21hdGNoOiBnb3QgJWQgZXhwZWN0ZWQgJWQiLAorCQkJCQl2ZXJzaW9uLCBWRVJTSU9OICkgKTsKKwkJCisJCVR5cGUgdCA9IHJlYWRUeXBlKCk7CisJCWludCBsZW5ndGggPSByZWFkTGVuZ3RoKCk7CisJCQorCQlyZXR1cm4gbmV3IE1lc3NhZ2UoIHQsIHZmLCBsZW5ndGggKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZW5kTWVzc2FnZSggTWVzc2FnZSBtc2cgKQorCXsKKwkJLy8gbm90aGluZyB0byBkbywgcmVhZEtleXNBbmRWYWx1ZXMgc3dhbGxvd2VkIHRoZSBOT05FLgorCX0KKworCXByaXZhdGUgU3RydWN0VmFsdWUgc3RhcnRTdHJ1Y3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVR5cGUgdCA9IHJlYWRUeXBlKCk7CisJCWludCBsZW5ndGggPSByZWFkTGVuZ3RoKCk7CisJCQorCQlyZXR1cm4gbmV3IFN0cnVjdFZhbHVlKCB0LCB2ZiwgbGVuZ3RoICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGVuZFN0cnVjdCggU3RydWN0VmFsdWUgc3RydWN0ICkKKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8sIHJlYWRLZXlzQW5kVmFsdWVzIHN3YWxsb3dlZCB0aGUgTk9ORS4KKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCXByaXZhdGUgQXJyYXlWYWx1ZSBzdGFydEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlieXRlIHR5cGUgPSBidWYuZ2V0Qnl0ZSgpOworCQkKKwkJVHlwZSBjdXN0b21TdHJ1Y3RUeXBlOworCQlpZiAodHlwZSA9PSBUeXBlQ29kZS5DVVNUT00gfHwgdHlwZSA9PSBUeXBlQ29kZS5TVFJVQ1QpCisJCQljdXN0b21TdHJ1Y3RUeXBlID0gcmVhZFR5cGUoKTsKKwkJZWxzZQorCQkJY3VzdG9tU3RydWN0VHlwZSA9IG51bGw7CisJCQorCQlpbnQgZGltID0gcmVhZEludGVnZXJWYWx1ZSgpOworCQlpZiAoZGltIDw9IDAgfHwgZGltID4gVmFsaWRhdG9yLk1BWF9ORElNUykKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJImRpbSA8PSAwIHx8IGRpbSA+IFZhbGlkYXRvci5NQVhfTkRJTVMiICk7CisJCQorCQlpbnQgbGVuZ3RoID0gcmVhZExlbmd0aCgpOworCQkKKwkJT2JqZWN0IGFycmF5ID0gYWxsb2NBcnJheVZhbHVlKCB0eXBlLCBjdXN0b21TdHJ1Y3RUeXBlLCBkaW0sIGxlbmd0aCApOworCQkKKwkJcmV0dXJuIG5ldyBBcnJheVZhbHVlKCBhcnJheSwgdHlwZSwgY3VzdG9tU3RydWN0VHlwZSwgZGltICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGVuZEFycmF5KCBBcnJheVZhbHVlIGFycmF5ICkKKwl7CisJCWFycmF5LmNvbXBhY3QoKTsKKwl9CisJCisJcHJpdmF0ZSBUeXBlIHJlYWRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlPYmplY3Qgb2JqID0gcmVhZFZhbHVlKCBpbnRPclN0clZhbGlkYXRvciwgZmFsc2UgKTsKKwkJCisJCWlmIChvYmogaW5zdGFuY2VvZiBJbnRlZ2VyKQorCQl7CisJCQlJbnRlZ2VyIGlkID0gKEludGVnZXIpIG9iajsKKwkJCVR5cGUgdHlwZSA9IHZmLmdldFR5cGUoIGlkICk7CisJCQkKKwkJCWlmICh0eXBlID09IG51bGwpCisJCQkJdHlwZSA9IG5ldyBUeXBlKCBpZCwgaWQudG9TdHJpbmcoKSApOworCQkJCisJCQlyZXR1cm4gdHlwZTsKKwkJfQorCQkKKwkJQXNzZXJ0aW9uLmNoZWNrKCBvYmogaW5zdGFuY2VvZiBTdHJpbmcsICJvYmogaW5zdGFuY2VvZiBTdHJpbmciICk7CisJCVN0cmluZyBuYW1lID0gKFN0cmluZykgb2JqOworCQlUeXBlIHR5cGUgPSB2Zi5nZXRUeXBlKCBuYW1lICk7CisJCQorCQlpZiAodHlwZSA9PSBudWxsKQorCQkJdHlwZSA9IG5ldyBUeXBlKCBuYW1lICk7CisJCQorCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwcml2YXRlIEZpZWxkIHJlYWRGaWVsZCggVHlwZSB0eXBlICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlPYmplY3Qgb2JqID0gcmVhZFZhbHVlKCBpbnRPclN0clZhbGlkYXRvciwgdHJ1ZSApOworCQkKKwkJaWYgKG9iaiA9PSBOT05FKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikKKwkJeworCQkJSW50ZWdlciBpZCA9IChJbnRlZ2VyKSBvYmo7CisJCQlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIGlkICk7CisJCQkKKwkJCWlmIChmaWVsZCA9PSBudWxsKQorCQkJCWZpZWxkID0gbmV3IEZpZWxkKCBpZCwgaWQudG9TdHJpbmcoKSApOworCQkJCisJCQlyZXR1cm4gZmllbGQ7CisJCX0KKwkJCisJCUFzc2VydGlvbi5jaGVjayggb2JqIGluc3RhbmNlb2YgU3RyaW5nLCAib2JqIGluc3RhbmNlb2YgU3RyaW5nIiApOworCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG9iajsKKwkJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCBuYW1lICk7CisJCQorCQlpZiAoZmllbGQgPT0gbnVsbCkKKwkJCWZpZWxkID0gbmV3IEZpZWxkKCBuYW1lICk7CisJCQorCQlyZXR1cm4gZmllbGQ7CisJfQorCQorCXByaXZhdGUgZmluYWwgVmFsaWRhdG9yIGludE9yU3RyVmFsaWRhdG9yID0KKwkJbmV3IENvbWJvVmFsaWRhdG9yKCBWYWxpZGF0b3JfaW50LmdldCggMCApLCBWYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApICk7CisJCisJcHJpdmF0ZSBpbnQgcmVhZExlbmd0aCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaW50IGxlbmd0aCA9IHJlYWRJbnRlZ2VyVmFsdWUoKTsKKwkJCisJCWlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+IGxlbmd0aEJ1ZGdldCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJImxlbmd0aCA8IDAgfHwgbGVuZ3RoID4gbGVuZ3RoQnVkZ2V0IiApOworCQkKKwkJbGVuZ3RoQnVkZ2V0IC09IGxlbmd0aDsKKwkJCisJCXJldHVybiBsZW5ndGg7CisJfQorCQorCXByaXZhdGUgSW50ZWdlciByZWFkSW50ZWdlclZhbHVlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZXR1cm4gKEludGVnZXIpIHJlYWRWYWx1ZSggaW50VmFsaWRhdG9yICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgVmFsaWRhdG9yIGludFZhbGlkYXRvciA9IFZhbGlkYXRvcl9pbnQuZ2V0KCAwICk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBMT0NBTCBVVElMSVRZIE1FVEhPRFMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwlwcml2YXRlIE9iamVjdCB2YWxpZGF0ZVZhbHVlKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCS8vIHYgPT0gbnVsbCBtb3JlIG9yIGxlc3MgaW1wbGllcyB0aGF0IGEgZmllbGQgaXMgbm90IGtub3duCisJCS8vIGZvciBhIHR5cGUuIHRodXMgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZmllbGQgdmFsdWUgYXMKKwkJLy8gd2UgYXJlIGdvaW5nIHRvIGlnbm9yZSBpdC4gdGhlcmVmb3JlLCByZXR1cm4gbnVsbC4KKwkJaWYgKHYgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiB2LnZhbGlkYXRlVmFsdWUoIHZhbHVlICk7CisJfQorCQorCXByaXZhdGUgT2JqZWN0IHZhbGlkYXRlVmFsdWUoIFZhbGlkYXRvciB2LCBib29sZWFuIG5vbmVPaywgT2JqZWN0IHZhbHVlICkKKwl7CisJCWlmIChub25lT2sgJiYgdmFsdWUgPT0gTk9ORSkKKwkJCXJldHVybiB2YWx1ZTsKKwkJCisJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCB2YWx1ZSApOworCX0KKwkKKwlwcml2YXRlIE9iamVjdCByZWFkVmFsdWUoIFZhbGlkYXRvciB2ICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZXR1cm4gcmVhZFZhbHVlKCB2LCBmYWxzZSApOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCXByaXZhdGUgT2JqZWN0IHJlYWRWYWx1ZSggVmFsaWRhdG9yIHYsIGJvb2xlYW4gbm9uZU9rICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlieXRlIHR5cGUgPSBidWYuZ2V0Qnl0ZSgpOworCQkKKwkJc3dpdGNoICh0eXBlKQorCQl7CisJCQljYXNlIFR5cGVDb2RlLk5VTEw6CisJCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoIHYsIG51bGwgKTsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5OT05FOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBub25lT2ssIE5PTkUgKTsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5CT09MRUFOX0ZBTFNFOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBCb29sZWFuLkZBTFNFICk7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuQk9PTEVBTl9UUlVFOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBCb29sZWFuLlRSVUUgKTsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5CWVRFOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBidWYuZ2V0Qnl0ZSgpICk7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuU0hPUlQ6CisJCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoIHYsIGJ1Zi5nZXRTaG9ydCgpICk7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuSU5UOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBidWYuZ2V0SW50KCkgKTsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5MT05HOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBidWYuZ2V0TG9uZygpICk7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuRkxPQVQ6CisJCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoIHYsIGJ1Zi5nZXRGbG9hdCgpICk7CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuRE9VQkxFOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBidWYuZ2V0RG91YmxlKCkgKTsKKwkJCQkKKwkJCWNhc2UgVHlwZUNvZGUuQllURVM6CisJCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoIHYsIHJlYWRCeXRlcygpICk7CisKKy8vCQkJcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6CisvLwkJCWNhc2UgVHlwZUNvZGUuQk9PTFM6CisvLwkJCWNhc2UgVHlwZUNvZGUuU0hPUlRTOgorLy8JCQljYXNlIFR5cGVDb2RlLklOVFM6CisvLwkJCWNhc2UgVHlwZUNvZGUuTE9OR1M6CisvLwkJCWNhc2UgVHlwZUNvZGUuRkxPQVRTOgorLy8JCQljYXNlIFR5cGVDb2RlLkRPVUJMRVM6CisvLwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bnN1cHBvcnRlZCB0eXBlIGNvZGUgIit0eXBlICk7CisJCQkJCisJCQljYXNlIFR5cGVDb2RlLkFSUkFZOgorCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlKCB2LCBmcm9tQXJyYXlWYWx1ZSggcmVhZEFycmF5KCB2ICkgKSApOworCQkJCisJCQljYXNlIFR5cGVDb2RlLkVNUFRZX1NUUklORzoKKwkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZSggdiwgIiIgKTsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5TVFJJTkc6CisJCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoIHYsIG5ldyBTdHJpbmcoIHJlYWRCeXRlcygpLCB2Zi5nZXRTdHJpbmdFbmNvZGluZygpICkgKTsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5TVFJVQ1Q6CisJCQljYXNlIFR5cGVDb2RlLkNVU1RPTToKKwkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZSggdiwgdmYuaW1wb3J0Q3VzdG9tVmFsdWUoIHJlYWRTdHJ1Y3QoKSApICk7CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKHR5cGUgPj0gVHlwZUNvZGUuTUlOX1RJTllfSU5UICYmIHR5cGUgPD0gVHlwZUNvZGUuTUFYX1RJTllfSU5UKQorCQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZSggdiwgdHlwZSApOworCQkJCisJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5zdXBwb3J0ZWQgdHlwZSBjb2RlICIrdHlwZSApOworCQl9CisJfQorCQorCXByaXZhdGUgYnl0ZVtdIHJlYWRCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaW50IGxlbmd0aCA9IHJlYWRMZW5ndGgoKTsKKwkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtsZW5ndGhdOworCQlidWYuZ2V0RnVsbHkoIGIgKTsKKwkJcmV0dXJuIGI7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L2JpbmFyeS9CaW5hcnlUYWdnZWREYXRhT3V0cHV0LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvYmluYXJ5L0JpbmFyeVRhZ2dlZERhdGFPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU4NThkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L2JpbmFyeS9CaW5hcnlUYWdnZWREYXRhT3V0cHV0LmphdmEKQEAgLTAsMCArMSwzMzAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZm10LmJpbmFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3IuTGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfaW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX3N0cmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuQXJyYXlWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVGFnZ2VkRGF0YU91dHB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZm10LlR5cGVDb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworCisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgVGFnZ2VkRGF0YU91dHB1dCB3aGljaCB1c2VzIGEgYmluYXJ5IGVuY29kaW5nLgorICovCitmaW5hbCBwdWJsaWMgY2xhc3MgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCBleHRlbmRzIEJpbmFyeVRhZ2dlZERhdGEKKwlpbXBsZW1lbnRzIFRhZ2dlZERhdGFPdXRwdXQKK3sKKwkvKioKKwkgKiBOYW1lIG9mIHVyaSBwYXJhbWV0ZXIgd2hpY2ggY29udHJvbHMgd2hldGhlciB3ZSB3cml0ZSBpbnRzIG9yIHN0cmluZ3MKKwkgKiBmb3IgdHlwZXMgYW5kIGZpZWxkcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVFlQRV9BTkRfRklFTEQgPQorCQkiQmluYXJ5VGFnZ2VkRGF0YU91dHB1dC5zdHJpbmdUeXBlQW5kRmllbGQiOworCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQmluYXJ5VGFnZ2VkRGF0YU91dHB1dC4KKwkgKiAKKwkgKiBAcGFyYW0gdmYgdGhlIHZhbHVlIGZhY3RvcnkgZm9yIHRoZSBzZXJ2aWNlLgorCSAqIEBwYXJhbSB1cmkgdGhlIHVyaSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgdHJhbnNwb3J0IHN0YWNrLgorCSAqLworCXB1YmxpYyBCaW5hcnlUYWdnZWREYXRhT3V0cHV0KCBWYWx1ZUZhY3RvcnkgdmYsIFN0cmluZyB1cmkgKQorCXsKKwkJc3VwZXIoIHZmICk7CisJCWxldmVsID0gdmYuZ2V0TGV2ZWwoKTsKKwkJVVJMIHUgPSBuZXcgVVJMKCB1cmkgKTsKKwkJc3RyaW5nVHlwZUFuZEZpZWxkID0gdS5nZXRCb29sZWFuVGVybSggU1RSSU5HX1RZUEVfQU5EX0ZJRUxELCBmYWxzZSApOworCX0KKworCXByaXZhdGUgZmluYWwgTGV2ZWwgbGV2ZWw7CisJCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN0cmluZ1R5cGVBbmRGaWVsZDsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRhZ2dlZERhdGFPdXRwdXQgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlKCBNZXNzYWdlIG1zZywgRmxleEJ1ZmZlciBidWYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQl0aGlzLmJ1ZiA9IGJ1ZjsKKwkJCXN0YXJ0TWVzc2FnZSggbXNnICk7CisJCQl3cml0ZUtleXNBbmRWYWx1ZXMoIG1zZyApOworCQkJZW5kTWVzc2FnZSggbXNnICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0aGlzLmJ1ZiA9IG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIEZsZXhCdWZmZXIgYnVmOworCisJcHJpdmF0ZSB2b2lkIHdyaXRlU3RydWN0KCBTdHJ1Y3RWYWx1ZSBzdiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJc3RhcnRTdHJ1Y3QoIHN2ICk7CisJCXdyaXRlS2V5c0FuZFZhbHVlcyggc3YgKTsKKwkJZW5kU3RydWN0KCBzdiApOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUFycmF5KCBBcnJheVZhbHVlIGF2LCBWYWxpZGF0b3IgdiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJc3RhcnRBcnJheSggYXYgKTsKKwkJd3JpdGVWYWx1ZXMoIGF2LCB2ICk7CisJCWVuZEFycmF5KCBhdiApOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUtleXNBbmRWYWx1ZXMoIFN0cnVjdFZhbHVlIHN2ICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlUeXBlIHQgPSBzdi50eXBlKCk7CisJCWZvciAoTWFwLkVudHJ5PEZpZWxkLCBPYmplY3Q+IG1lOiBzdikKKwkJeworCQkJRmllbGQgZiA9IG1lLmdldEtleSgpOworCQkJd3JpdGVGaWVsZCggZiApOworCQkJd3JpdGVWYWx1ZSggdC5nZXRWYWxpZGF0b3IoIGYgKSwgbWUuZ2V0VmFsdWUoKSApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlVmFsdWVzKCBBcnJheVZhbHVlIGF2LCBWYWxpZGF0b3IgdiApCisJCXRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yIGV2ID0gdi5lbGVtZW50VmFsaWRhdG9yKCk7CisJCWZvciAoT2JqZWN0IHZhbHVlOiBhdikKKwkJCXdyaXRlVmFsdWUoIGV2LCB2YWx1ZSApOworCX0KKwkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTWFpbiBvdXRwdXQgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXByaXZhdGUgdm9pZCBzdGFydE1lc3NhZ2UoIE1lc3NhZ2UgbXNnICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQkvLyBzaW5jZSBtZXNzYWdlIGlzIHRvcC1sZXZlbCwgbm8gdHlwZSBjb2RlIGlzIHdyaXR0ZW4gdG8KKwkJLy8gaW5kaWNhdGUgYSBtZXNzYWdlIGlzIHN0YXJ0aW5nLiB3ZSBkbyB3cml0ZSBhIHZlcnNpb24KKwkJLy8gbnVtYmVyIHRvIGluZGljYXRlIHRoaXMgdmVyc2lvbiBvZiB0aGUgYmluYXJ5IHRhZ2dlZAorCQkvLyBkYXRhIG91dHB1dCBmb3JtYXQuCisJCWJ1Zi5wdXRCeXRlKCBWRVJTSU9OICk7CisJCXN0YXJ0U3RydWN0KCBtc2cgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZW5kTWVzc2FnZSggTWVzc2FnZSBtc2cgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWVuZFN0cnVjdCggbXNnICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHN0YXJ0U3RydWN0KCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgd3JpdHRlbiBhIHR5cGUgY29kZSB0byBpbmRpY2F0ZSBhCisJCS8vIHN0cnVjdCBpcyBzdGFydGluZy4gdGhpcyBjb2RlIGlzIHNoYXJlZCBieSBzdGFydE1lc3NhZ2UoKS4KKwkJd3JpdGVUeXBlKCBzdHJ1Y3QudHlwZSgpICk7CisJCXdyaXRlSW50VmFsdWUoIHN0cnVjdC5zaXplKCkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZW5kU3RydWN0KCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIHRoaXMgY29kZSBpcyBzaGFyZWQgYnkgZW5kTWVzc2FnZS4KKwkJd3JpdGVOb25lVmFsdWUoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc3RhcnRBcnJheSggQXJyYXlWYWx1ZSBhcnJheSApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJLy8gdGhlIGNhbGxlciBoYXMgYWxyZWFkeSB3cml0dGVuIGEgdHlwZSBjb2RlIHRvIGluZGljYXRlIGFuCisJCS8vIGFycmF5IGlzIHN0YXJ0aW5nLgorCQlieXRlIHR5cGUgPSBhcnJheS50eXBlQ29kZSgpOworCQlidWYucHV0Qnl0ZSggdHlwZSApOworCQlpZiAodHlwZSA9PSBUeXBlQ29kZS5DVVNUT00pCisJCQl3cml0ZVR5cGUoIGFycmF5LmN1c3RvbVN0cnVjdFR5cGUoKSApOworCQl3cml0ZUludFZhbHVlKCBhcnJheS5kaW0oKSApOworCQl3cml0ZUludFZhbHVlKCBhcnJheS5zaXplKCkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZW5kQXJyYXkoIEFycmF5VmFsdWUgYXJyYXkgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXdyaXRlTm9uZVZhbHVlKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCB3cml0ZVR5cGUoIFR5cGUgdHlwZSApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaWYgKHN0cmluZ1R5cGVBbmRGaWVsZCkKKwkJCXdyaXRlU3RyaW5nVmFsdWUoIHR5cGUuZ2V0TmFtZSgpICk7CisJCWVsc2UKKwkJCXdyaXRlSW50VmFsdWUoIHR5cGUuZ2V0SWQoKSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgd3JpdGVGaWVsZCggRmllbGQgZmllbGQgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWlmIChzdHJpbmdUeXBlQW5kRmllbGQpCisJCQl3cml0ZVN0cmluZ1ZhbHVlKCBmaWVsZC5nZXROYW1lKCkgKTsKKwkJZWxzZQorCQkJd3JpdGVJbnRWYWx1ZSggZmllbGQuZ2V0SWQoKSApOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUludFZhbHVlKCBJbnRlZ2VyIHZhbHVlICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQl3cml0ZVZhbHVlKCBpbnRWYWxpZGF0b3IsIHZhbHVlICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgVmFsaWRhdG9yIGludFZhbGlkYXRvciA9IFZhbGlkYXRvcl9pbnQuZ2V0KCAwICk7CisJCisJcHJpdmF0ZSB2b2lkIHdyaXRlU3RyaW5nVmFsdWUoIFN0cmluZyB2YWx1ZSApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJd3JpdGVWYWx1ZSggc3RyaW5nVmFsaWRhdG9yLCB2YWx1ZSApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFZhbGlkYXRvciBzdHJpbmdWYWxpZGF0b3IgPSBWYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApOworCQorCXByaXZhdGUgdm9pZCB3cml0ZU5vbmVWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJd3JpdGVWYWx1ZSggbm9uZVZhbGlkYXRvciwgTk9ORSApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFZhbGlkYXRvciBub25lVmFsaWRhdG9yID0gVmFsaWRhdG9yX25vbmUuZ2V0KCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBMT0NBTCBVVElMSVRZIE1FVEhPRFMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEBwYXJhbSB2IHRoZSB2YWxpZGF0b3IgZm9yIHRoaXMgdmFsdWUsIG9yIG5vbmUgaWYgdGhlcmUKKwkgKiBvciBub25lIGlmIHRoZXJlIGlzbid0IG9uZS4KKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHdyaXRlVmFsdWUoIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJ3cml0ZVZhbHVlICVzOiAlc1xuIiwgdmFsdWUsIHYgKTsKKwkJCisJCWJ5dGUgdHlwZUNvZGUgPSBjaGVja1ZhbHVlKCB2YWx1ZSApOworCQkKKwkJaWYgKGxldmVsICE9IExldmVsLk5PTkUgJiYgdmFsdWUgIT0gbnVsbCkKKwkJeworCQkgICAgaWYgKGxldmVsID09IExldmVsLkZVTEwgJiYgdiA9PSBudWxsKQorCQkgICAgCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCSAgICAJCSJ2YWxpZGF0b3IgbWlzc2luZyIgKTsKKwkJCQkKKwkJCWlmICh2ICE9IG51bGwgJiYgIXYudmFsaWRhdGUoIHZhbHVlICkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJInZhbGlkYXRvciAlcyBmYWlsZWQgZm9yIHZhbHVlICVzIiwKKwkJICAgIAkJdiwgdmFsdWUgKSApOworCQl9CisJCQorCQlidWYucHV0Qnl0ZSggdHlwZUNvZGUgKTsKKworCQlzd2l0Y2ggKHR5cGVDb2RlKQorCQl7CisJCQljYXNlIFR5cGVDb2RlLk5VTEw6CisJCQljYXNlIFR5cGVDb2RlLk5PTkU6CisJCQljYXNlIFR5cGVDb2RlLkJPT0xFQU5fRkFMU0U6CisJCQljYXNlIFR5cGVDb2RlLkJPT0xFQU5fVFJVRToKKwkJCWNhc2UgVHlwZUNvZGUuRU1QVFlfU1RSSU5HOgorCQkJCXJldHVybjsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5CWVRFOgorCQkJCWJ1Zi5wdXRCeXRlKCAoKE51bWJlcikgdmFsdWUpLmJ5dGVWYWx1ZSgpICk7CisJCQkJcmV0dXJuOworCQkJCisJCQljYXNlIFR5cGVDb2RlLlNIT1JUOgorCQkJCWJ1Zi5wdXRTaG9ydCggKChOdW1iZXIpIHZhbHVlKS5zaG9ydFZhbHVlKCkgKTsKKwkJCQlyZXR1cm47CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuSU5UOgorCQkJCWJ1Zi5wdXRJbnQoICgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKSApOworCQkJCXJldHVybjsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5MT05HOgorCQkJCWJ1Zi5wdXRMb25nKCAoKE51bWJlcikgdmFsdWUpLmxvbmdWYWx1ZSgpICk7CisJCQkJcmV0dXJuOworCQkJCisJCQljYXNlIFR5cGVDb2RlLkZMT0FUOgorCQkJCWJ1Zi5wdXRGbG9hdCggKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCkgKTsKKwkJCQlyZXR1cm47CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuRE9VQkxFOgorCQkJCWJ1Zi5wdXREb3VibGUoICgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKSApOworCQkJCXJldHVybjsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5CWVRFUzoKKwkJCQl3cml0ZUJ5dGVzKCAoYnl0ZVtdKSB2YWx1ZSApOworCQkJCXJldHVybjsKKworLy8JCQlyZXNlcnZlZCBmb3IgZnV0dXJlIHVzZToKKy8vCQkJY2FzZSBUeXBlQ29kZS5CT09MUzoKKy8vCQkJY2FzZSBUeXBlQ29kZS5TSE9SVFM6CisvLwkJCWNhc2UgVHlwZUNvZGUuSU5UUzoKKy8vCQkJY2FzZSBUeXBlQ29kZS5MT05HUzoKKy8vCQkJY2FzZSBUeXBlQ29kZS5GTE9BVFM6CisvLwkJCWNhc2UgVHlwZUNvZGUuRE9VQkxFUzoKKy8vCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVuc3VwcG9ydGVkIHR5cGUgY29kZSAiK3R5cGUgKTsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5BUlJBWToKKwkJCQl3cml0ZUFycmF5KCB0b0FycmF5VmFsdWUoIHZhbHVlLCB2ICksIHYgKTsKKwkJCQlyZXR1cm47CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuU1RSSU5HOgorCQkJCXdyaXRlQnl0ZXMoICgoU3RyaW5nKSB2YWx1ZSkuZ2V0Qnl0ZXMoIHZmLmdldFN0cmluZ0VuY29kaW5nKCkgKSApOworCQkJCXJldHVybjsKKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5DVVNUT006CisJCQl7CisJCQkJU3RydWN0VmFsdWUgc3RydWN0ID0gdmYuZXhwb3J0Q3VzdG9tVmFsdWUoIHZhbHVlICk7CisJCQkJCisJCQkJaWYgKHN0cnVjdCA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bnN1cHBvcnRlZCB0eXBlICIrdmFsdWUuZ2V0Q2xhc3MoKSApOworCQkJCQorCQkJCXdyaXRlU3RydWN0KCBzdHJ1Y3QgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJLy8gdHlwZSBpcyBlaXRoZXIgInRpbnkiIGludGVnZXIgb3IgdW51c2VkLi4uCisJCQkJCisJCQkJaWYgKHR5cGVDb2RlID49IFR5cGVDb2RlLk1JTl9USU5ZX0lOVCAmJiB0eXBlQ29kZSA8PSBUeXBlQ29kZS5NQVhfVElOWV9JTlQpCisJCQkJCXJldHVybjsKKwkJCQorCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVuc3VwcG9ydGVkIHR5cGUgY29kZSAiK3R5cGVDb2RlICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBXcml0ZXMgYSB2YWx1ZSAoc2lnbmVkIG9yIHVuc2lnbmVkKSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIG91dHB1dCBzdHJlYW0uCisJICovCisJcHJpdmF0ZSB2b2lkIHdyaXRlQnl0ZXMoIGJ5dGVbXSB2YWx1ZSApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaW50IG4gPSB2YWx1ZS5sZW5ndGg7CisJCXdyaXRlSW50VmFsdWUoIG4gKTsKKwkJYnVmLnB1dCggdmFsdWUsIDAsIG4gKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvYmluYXJ5L1ZhbGlkYXRvcl9ub25lLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvYmluYXJ5L1ZhbGlkYXRvcl9ub25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2M2Y2NQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC9iaW5hcnkvVmFsaWRhdG9yX25vbmUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LmZtdC5iaW5hcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworCisvKioKKyAqIEEgdmFsaWRhdG9yIGZvciB0aGUgc3BlY2lhbCBlbmQgb2YgbGlzdCBtYXJrZXIsCisgKiB7QGxpbmsgQmluYXJ5VGFnZ2VkRGF0YSNOT05FfS4KKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRvcl9ub25lIGltcGxlbWVudHMgVmFsaWRhdG9yCit7CisJLyoqCisJICogQHJldHVybiB0aGUgdmFsaWRhdG9yIGZvciBCaW5hcnlUYWdnZWREYXRhLk5PTkUuCisJICovCisJcHVibGljIHN0YXRpYyBWYWxpZGF0b3Jfbm9uZSBnZXQoKQorICAgIHsKKwkJaWYgKHZhbGlkYXRvciA9PSBudWxsKQorCQkJdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcl9ub25lKCk7CisJICAgIAorCQlyZXR1cm4gdmFsaWRhdG9yOworICAgIH0KKwkKKwlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3Jfbm9uZSB2YWxpZGF0b3I7CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgdmFsaWRhdG9yLgorCSAqLworCXB1YmxpYyBWYWxpZGF0b3Jfbm9uZSgpCisgICAgeworCSAgICAvLyBub3RoaW5nIHRvIGRvLgorICAgIH0KKworICAgIHB1YmxpYyBWYWxpZGF0b3IgZWxlbWVudFZhbGlkYXRvcigpCisgICAgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibm90IGFuIGFycmF5IiApOworICAgIH0KKwkKKwlmaW5hbCBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSggT2JqZWN0IHZhbHVlICkKKwl7CisJICAgIHJldHVybiB2YWx1ZSA9PSBCaW5hcnlUYWdnZWREYXRhLk5PTkU7CisJfQorCisJcHVibGljIE9iamVjdCB2YWxpZGF0ZVZhbHVlKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJaWYgKHZhbGlkYXRlKCB2YWx1ZSApKQorCQkJcmV0dXJuIHZhbHVlOworCQkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInZhbHVlIG5vdCBhcHByb3ByaWF0ZSBmb3Igbm9uZTogIit2YWx1ZSApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC94bWwvWG1sVGFnZ2VkRGF0YS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L3htbC9YbWxUYWdnZWREYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMWNhNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC94bWwvWG1sVGFnZ2VkRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LmZtdC54bWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuQXJyYXlWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZm10LlRhZ2dlZERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LmZtdC5UeXBlQ29kZTsKKworLyoqCisgKiBYTUwgdGFnZ2VkIGRhdGEgaW1wbGVtZW50YXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxUYWdnZWREYXRhIGV4dGVuZHMgVGFnZ2VkRGF0YQoreworCS8qKgorCSAqIEBwYXJhbSB2ZgorCSAqLworCXB1YmxpYyBYbWxUYWdnZWREYXRhKCBWYWx1ZUZhY3RvcnkgdmYgKQorCXsKKwkJc3VwZXIoIHZmICk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBieXRlIGNoZWNrVmFsdWUoIE9iamVjdCB2YWx1ZSApCisJeworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiBUeXBlQ29kZS5OVUxMOworCQkKKwkJQ2xhc3M8Pz4gY2xzcyA9IHZhbHVlLmdldENsYXNzKCk7CisJCQorCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpCisJCXsKKwkJCWlmIChjbHNzID09IEJ5dGUuY2xhc3MpCisJCQkJcmV0dXJuIFR5cGVDb2RlLkJZVEU7CisJCQkKKwkJCWlmIChjbHNzID09IFNob3J0LmNsYXNzKQorCQkJCXJldHVybiBUeXBlQ29kZS5TSE9SVDsKKwkJCQkKKwkJCWlmIChjbHNzID09IEludGVnZXIuY2xhc3MpCisJCQkJcmV0dXJuIFR5cGVDb2RlLklOVDsKKwkJCQorCQkJaWYgKGNsc3MgPT0gTG9uZy5jbGFzcykKKwkJCQlyZXR1cm4gVHlwZUNvZGUuTE9ORzsKKwkJCQorCQkJaWYgKGNsc3MgPT0gRmxvYXQuY2xhc3MpCisJCQkJcmV0dXJuIFR5cGVDb2RlLkZMT0FUOworCQkJCQorCQkJaWYgKGNsc3MgPT0gRG91YmxlLmNsYXNzKQorCQkJCXJldHVybiBUeXBlQ29kZS5ET1VCTEU7CisJCX0KKwkJZWxzZSBpZiAoY2xzcyA9PSBTdHJpbmcuY2xhc3MpCisJCXsKKwkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7CisJCQkKKwkJCWlmIChzLmxlbmd0aCgpID09IDApCisJCQkJcmV0dXJuIFR5cGVDb2RlLkVNUFRZX1NUUklORzsKKwkJCQorCQkJcmV0dXJuIFR5cGVDb2RlLlNUUklORzsKKwkJfQorCQllbHNlIGlmIChjbHNzID09IEJvb2xlYW4uY2xhc3MpCisJCXsKKwkJCWlmICgoQm9vbGVhbikgdmFsdWUpCisJCQkJcmV0dXJuIFR5cGVDb2RlLkJPT0xFQU5fVFJVRTsKKwkJCQorCQkJcmV0dXJuIFR5cGVDb2RlLkJPT0xFQU5fRkFMU0U7CisJCX0KKwkJZWxzZSBpZiAoY2xzcyA9PSBTdHJ1Y3RWYWx1ZS5jbGFzcykKKwkJeworCQkJcmV0dXJuIFR5cGVDb2RlLkNVU1RPTTsKKwkJfQorCQllbHNlIGlmIChjbHNzID09IEFycmF5VmFsdWUuY2xhc3MpCisJCXsKKwkJCXJldHVybiBUeXBlQ29kZS5BUlJBWTsKKwkJfQorCQllbHNlIGlmIChjbHNzID09IGJ5dGVbXS5jbGFzcykKKwkJeworCQkJcmV0dXJuIFR5cGVDb2RlLkJZVEVTOworCQl9CisJCWVsc2UgaWYgKGNsc3MuaXNBcnJheSgpKQorCQl7CisJCQlyZXR1cm4gVHlwZUNvZGUuQVJSQVk7CisJCX0KKwkJCisJCXJldHVybiBUeXBlQ29kZS5DVVNUT007CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFR5cGUgZ2V0Q3VzdG9tU3RydWN0VHlwZSggQ2xhc3M8Pz4gYyApCisJeworCQkvLyBUT0RPIGltcGxlbWVudCBnZXRDdXN0b21TdHJ1Y3RUeXBlIGZ1bmN0aW9uCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/PiBnZXROYXRpdmVUeXBlKCBieXRlIHR5cGUgKQorCXsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgZ2V0TmF0aXZlVHlwZSBmdW5jdGlvbgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYnl0ZSBnZXROYXRpdmVUeXBlQ29kZSggQ2xhc3M8Pz4gYyApCisJeworCQkvLyBUT0RPIGltcGxlbWVudCBnZXROYXRpdmVUeXBlQ29kZSBmdW5jdGlvbgorCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQveG1sL1htbFRhZ2dlZERhdGFJbnB1dC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L3htbC9YbWxUYWdnZWREYXRhSW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDNmYzEwCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZm10L3htbC9YbWxUYWdnZWREYXRhSW5wdXQuamF2YQpAQCAtMCwwICsxLDI5NCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQueG1sOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuQXJyYXlWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVGFnZ2VkRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5DZGF0YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLlRhZ0VsZW1lbnQ7CisKKworLyoqCisgKiBYbWxUYWdnZWREYXRhSW5wdXQgaGFzIG1ldGhvZHMgdG8gc3VwcG9ydCByZWFkaW5nIHhtbCBkYXRhIGZyb20gYW4KKyAqIGlucHV0IHN0cmVhbS4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitmaW5hbCBwdWJsaWMgY2xhc3MgWG1sVGFnZ2VkRGF0YUlucHV0IGV4dGVuZHMgWG1sVGFnZ2VkRGF0YQorCWltcGxlbWVudHMgVGFnZ2VkRGF0YUlucHV0LCBYbWxUYWdzCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgWG1sVGFnZ2VkRGF0YUlucHV0LgorCSAqIEBwYXJhbSB2ZiB0aGUgdmFsdWUgZmFjdG9yeQorCSAqIEBwYXJhbSByZHIgdGhlIHJlYWRlcgorCSAqLworCXB1YmxpYyBYbWxUYWdnZWREYXRhSW5wdXQoIFZhbHVlRmFjdG9yeSB2ZiwgUmVhZGVyIHJkciApCisJeworCQlzdXBlciggdmYgKTsKKwkJdGhpcy5yZHIgPSByZHI7CisJfQorCQorCXByaXZhdGUgUmVhZGVyIHJkcjsKKwkKKwkvKioKKwkgKiBAcGFyYW0gcmRyCisJICovCisJcHVibGljIHZvaWQgc2V0UmVhZGVyKCBSZWFkZXIgcmRyICkKKwl7CisJCXRoaXMucmRyID0gcmRyOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFN0YWNrPFRhZ0VsZW1lbnQ+IHN0YWNrID0gbmV3IFN0YWNrPFRhZ0VsZW1lbnQ+KCk7CisJCisJcHJpdmF0ZSBmaW5hbCBTdGFjazxJdGVyYXRvcjxFbGVtZW50Pj4gZWxlbWVudExpc3QgPSBuZXcgU3RhY2s8SXRlcmF0b3I8RWxlbWVudD4+KCk7CisKKwlwdWJsaWMgTWVzc2FnZSBzdGFydE1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXN0YWNrLmNsZWFyKCk7CisJCQorCQlUYWdFbGVtZW50IHRlID0gbmV3IFhtbFBhcnNlcigpLnBhcnNlT25lKCByZHIsIG51bGwsIE1FU1NBR0VfVEFHICk7CisJCXN0YWNrLnB1c2goIHRlICk7CisJCWVsZW1lbnRMaXN0LnB1c2goIHRlLmdldENoaWxkcmVuKCkgKTsKKwkJCisJCUludGVnZXIgaWQgPSB0ZS5nZXRJbnRBdHRyKCBudWxsLCBTVFJVQ1RfVFlQRV9BVFRSICk7CisJCVR5cGUgdHlwZSA9IHZmLmdldFR5cGUoIGlkICk7CisJCXJldHVybiBuZXcgTWVzc2FnZSggdHlwZSwgdmYgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlbmRNZXNzYWdlKCBNZXNzYWdlIG1zZyApCisJeworCQllbGVtZW50TGlzdC5wb3AoKTsKKwkJaWYgKCFlbGVtZW50TGlzdC5pc0VtcHR5KCkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiIWVsZW1lbnRMaXN0LmlzRW1wdHkoKSIgKTsKKwkJCisJCXN0YWNrLnBvcCgpOworCQlpZiAoIXN0YWNrLmlzRW1wdHkoKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICIhc3RhY2suaXNFbXB0eSgpIiApOworCQkJCisJfQorCisJcHVibGljIFN0cnVjdFZhbHVlIHN0YXJ0U3RydWN0KCkKKwl7CisJCVRhZ0VsZW1lbnQgdGUgPSBzdGFjay5wZWVrKCk7CisJCWVsZW1lbnRMaXN0LnB1c2goIHRlLmdldENoaWxkcmVuKCkgKTsKKwkJCisJCUludGVnZXIgaWQgPSB0ZS5nZXRJbnRBdHRyKCBudWxsLCBTVFJVQ1RfVFlQRV9BVFRSICk7CisJCVR5cGUgdHlwZSA9IHZmLmdldFR5cGUoIGlkICk7CisJCXJldHVybiBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisJfQorCisJcHVibGljIGJvb2xlYW4gcmVhZFN0cnVjdEVsZW1lbnQoIFN0cnVjdEVsZW1lbnQgc2UgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVRhZ0VsZW1lbnQgdGUgPSByZWFkTmV4dFRhZ0VsZW1lbnQoKTsKKwkJaWYgKHRlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlUeXBlIHQgPSBudWxsOyAvLyBUT0RPIHRoaXMgbmVlZHMgdG8gY29tZSBmcm9tIHNvbWV3aGVyZS4KKwkJSW50ZWdlciBpZCA9IHRlLmdldEludEF0dHIoIG51bGwsIEtFWV9BVFRSICk7CisJCXNlLmtleSA9IHQuZ2V0RmllbGQoIGlkICk7CisJCQorCQlzdGFjay5wdXNoKCB0ZSApOworCQlzZS52YWx1ZSA9IGludFJlYWRWYWx1ZSgpOworCQlzdGFjay5wb3AoKTsKKwkJCisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cnVjdEVsZW1lbnQKKwl7CisJCXB1YmxpYyBGaWVsZCBrZXk7CisJCXB1YmxpYyBPYmplY3QgdmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgZW5kU3RydWN0KCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCXsKKwkJZWxlbWVudExpc3QucG9wKCk7CisJfQorCisJcHVibGljIEFycmF5VmFsdWUgc3RhcnRBcnJheSgpCisJeworCQlUYWdFbGVtZW50IHRlID0gc3RhY2sucGVlaygpOworCQllbGVtZW50TGlzdC5wdXNoKCB0ZS5nZXRDaGlsZHJlbigpICk7CisJCXJldHVybiBuZXcgQXJyYXlWYWx1ZSggbnVsbCApOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEFycmF5RWxlbWVudAorCXsKKwkJcHVibGljIE9iamVjdCB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiByZWFkQXJyYXlFbGVtZW50KCBBcnJheUVsZW1lbnQgYWUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVRhZ0VsZW1lbnQgdGUgPSByZWFkTmV4dFRhZ0VsZW1lbnQoKTsKKwkJaWYgKHRlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlzdGFjay5wdXNoKCB0ZSApOworCQlhZS52YWx1ZSA9IGludFJlYWRWYWx1ZSgpOworCQlzdGFjay5wb3AoKTsKKwkJCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIGVuZEFycmF5KCBBcnJheVZhbHVlIGFycmF5ICkKKwl7CisJCWVsZW1lbnRMaXN0LnBvcCgpOworCX0KKworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZHIuY2xvc2UoKTsKKwl9CisJCisJcHJpdmF0ZSBUYWdFbGVtZW50IHJlYWROZXh0VGFnRWxlbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaWYgKCFlbGVtZW50TGlzdC5wZWVrKCkuaGFzTmV4dCgpKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlFbGVtZW50IGUgPSBlbGVtZW50TGlzdC5wZWVrKCkubmV4dCgpOworCQl3aGlsZSAoIShlIGluc3RhbmNlb2YgVGFnRWxlbWVudCkpCisJCXsKKwkJCUNkYXRhRWxlbWVudCBjZSA9IChDZGF0YUVsZW1lbnQpIGU7CisJCQlTdHJpbmcgcyA9IGNlLmdldENkYXRhKCk7CisJCQlpZiAocy50cmltKCkubGVuZ3RoKCkgIT0gMCkKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJ1bmV4cGVjdGVkIGNkYXRhIGluIGVsZW1lbnQ6ICIrcyApOworCQkJCisJCQlpZiAoIWVsZW1lbnRMaXN0LnBlZWsoKS5oYXNOZXh0KCkpCisJCQkJcmV0dXJuIG51bGw7CisJCQkKKwkJCWUgPSBlbGVtZW50TGlzdC5wZWVrKCkubmV4dCgpOworCQl9CisJCQorCQlyZXR1cm4gKFRhZ0VsZW1lbnQpIGU7CisJfQorCQorCXByaXZhdGUgT2JqZWN0IGludFJlYWRWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJVGFnRWxlbWVudCB0ZSA9IHN0YWNrLnBlZWsoKTsKKwkJU3lzdGVtLm91dC5wcmludGYoICJyZWFkVmFsdWU6ICVzXG4iLCB0ZSApOworCQlTdHJpbmcgdHlwZSA9IHRlLmdldEF0dHIoIG51bGwsIEVMRU1FTlRfVFlQRV9BVFRSICk7CisJCQorCQlpZiAodHlwZS5lcXVhbHMoIE5VTExfVFlQRSApKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAodHlwZS5lcXVhbHMoIEJPT0xFQU5fVFlQRSApKQorCQkJcmV0dXJuIG5ldyBCb29sZWFuKCB0ZS5nZXRDZGF0YVZhbHVlKCkgKTsKKwkJCisJCWlmICh0eXBlLmVxdWFscyggSU5URUdFUl9UWVBFICkpCisJCQlyZXR1cm4gbmV3IEludGVnZXIoIHRlLmdldENkYXRhVmFsdWUoKSApOworCQkKKwkJaWYgKHR5cGUuZXF1YWxzKCBMT05HX1RZUEUgKSkKKwkJCXJldHVybiBuZXcgTG9uZyggdGUuZ2V0Q2RhdGFWYWx1ZSgpICk7CisJCQorCQlpZiAodHlwZS5lcXVhbHMoIEZMT0FUX1RZUEUgKSkKKwkJCXJldHVybiBuZXcgRmxvYXQoIHRlLmdldENkYXRhVmFsdWUoKSApOworCQkKKwkJaWYgKHR5cGUuZXF1YWxzKCBET1VCTEVfVFlQRSApKQorCQkJcmV0dXJuIG5ldyBEb3VibGUoIHRlLmdldENkYXRhVmFsdWUoKSApOworCisJCWlmICh0eXBlLmVxdWFscyggQllURVNfVFlQRSApKQorCQkJcmV0dXJuIHN0cmluZzJieXRlcyggdGUuZ2V0Q2RhdGFWYWx1ZSgpICk7CisJCQorCQlpZiAodHlwZS5lcXVhbHMoIFNUUklOR19UWVBFICkpCisJCQlyZXR1cm4gdGUuZ2V0Q2RhdGFWYWx1ZSgpOworCQkKKwkJaWYgKHR5cGUuZXF1YWxzKCBBUlJBWV9UWVBFICkpCisJCQlyZXR1cm4gcmVhZEFycmF5KG51bGwpOworCQkKKwkJaWYgKHR5cGUuZXF1YWxzKCBTVFJVQ1RfVFlQRSApKQorCQkJcmV0dXJuIHJlYWRTdHJ1Y3QoKTsKKwkJCisJCWlmICh0eXBlLmVxdWFscyggQ1VTVE9NX1RZUEUgKSkKKwkJCXJldHVybiB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggcmVhZFN0cnVjdCgpICk7CisJCQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bnN1cHBvcnRlZCB0eXBlIGNvZGUgIit0eXBlICk7CisJfQorCQorCXByaXZhdGUgYnl0ZVtdIHN0cmluZzJieXRlcyggU3RyaW5nIHMgKQorCXsKKwkJLy8gVE9ETyBieXRlIGVuY29kaW5nIGNvdWxkIGJlIGJhc2U2NCBvciBzb21ldGhpbmcgZWxzZSBtb3JlIGVmZmljaWVudC4KKworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCisJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHMsICIgXHRcclxuIiApOworCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQorCQkJYmFvcy53cml0ZSggKGJ5dGUpIEludGVnZXIucGFyc2VJbnQoIHN0Lm5leHRUb2tlbigpLCAxNiApICk7CisJCQorCQlyZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB2ZiB0aGUgdmFsdWUgZmFjdG9yeS4KKwkgKiBAcGFyYW0gcyB0aGUgbWVzc2FnZSB0ZXh0LgorCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgcmVhZCBmcm9tIHRoZSBzdHJpbmcuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgTWVzc2FnZSByZWFkTWVzc2FnZSggVmFsdWVGYWN0b3J5IHZmLCBTdHJpbmcgcyApCisJCXRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHJlYWRNZXNzYWdlKCB2ZiwgbmV3IFN0cmluZ1JlYWRlciggcyApICk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSB2ZiB0aGUgdmFsdWUgZmFjdG9yeS4KKwkgKiBAcGFyYW0gcmRyIHRoZSBzb3VyY2Ugb2YgbWVzc2FnZSB0ZXh0LgorCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgcmVhZCBmcm9tIHRoZSByZWFkZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgTWVzc2FnZSByZWFkTWVzc2FnZSggVmFsdWVGYWN0b3J5IHZmLCBSZWFkZXIgcmRyICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IFhtbFRhZ2dlZERhdGFJbnB1dCggdmYsIHJkciApLnJlYWRNZXNzYWdlKCBudWxsICk7CisJfQorCQorCXB1YmxpYyBNZXNzYWdlIHJlYWRNZXNzYWdlKCBGbGV4QnVmZmVyIGJ1ZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgcmVhZE1lc3NhZ2UgZnVuY3Rpb24KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cnVjdFZhbHVlIHJlYWRTdHJ1Y3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gaW1wbGVtZW50IHJlYWRTdHJ1Y3QgZnVuY3Rpb24KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEFycmF5VmFsdWUgcmVhZEFycmF5KFZhbGlkYXRvciB2KSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gaW1wbGVtZW50IHJlYWRBcnJheSBmdW5jdGlvbgorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQveG1sL1htbFRhZ2dlZERhdGFPdXRwdXQuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC94bWwvWG1sVGFnZ2VkRGF0YU91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTdhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQveG1sL1htbFRhZ2dlZERhdGFPdXRwdXQuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQueG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuQXJyYXlWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVGFnZ2VkRGF0YU91dHB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZm10LlR5cGVDb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLkRlZmF1bHRUYWdFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworCisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgVGFnZ2VkRGF0YU91dHB1dFN0cmVhbS4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitmaW5hbCBwdWJsaWMgY2xhc3MgWG1sVGFnZ2VkRGF0YU91dHB1dCBleHRlbmRzIFhtbFRhZ2dlZERhdGEKKwlpbXBsZW1lbnRzIFRhZ2dlZERhdGFPdXRwdXQsIFhtbFRhZ3MKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBUYWdnZWREYXRhT3V0cHV0U3RyZWFtLgorCSAqCisJICogQHBhcmFtIHd0cgorCSAqIEBwYXJhbSB2ZgorCSAqLworCXB1YmxpYyBYbWxUYWdnZWREYXRhT3V0cHV0KCBXcml0ZXIgd3RyLCBWYWx1ZUZhY3RvcnkgdmYgKQorCXsKKwkJc3VwZXIoIHZmICk7CisJCXRoaXMud3RyID0gd3RyOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFdyaXRlciB3dHI7CisJCisJcHJpdmF0ZSBmaW5hbCBTdGFjazxUYWdFbGVtZW50PiBzdGFjayA9IG5ldyBTdGFjazxUYWdFbGVtZW50PigpOworCisJcHVibGljIHZvaWQgc3RhcnRNZXNzYWdlKCBNZXNzYWdlIG1zZyApCisJeworCQlzdGFjay5jbGVhcigpOworCQlUYWdFbGVtZW50IHRlID0gbmV3IERlZmF1bHRUYWdFbGVtZW50KCBNRVNTQUdFX1RBRyApOworCQl0ZS5zZXRBdHRyKCBudWxsLCBTVFJVQ1RfVFlQRV9BVFRSLCBtc2cudHlwZSgpLmdldElkKCkgKTsKKwkJc3RhY2sucHVzaCggdGUgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlbmRNZXNzYWdlKCBNZXNzYWdlIG1zZyApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJVGFnRWxlbWVudCB0ZSA9IHN0YWNrLnBvcCgpOworCQlpZiAoIXN0YWNrLmlzRW1wdHkoKSkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggInN0YWNrIHNlcXVlbmNlIGVycm9yOiAiK3N0YWNrICk7CisJCXRlLnRvU3RyaW5nKCB3dHIgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdGFydFN0cnVjdCggU3RydWN0VmFsdWUgc3RydWN0ICkKKwl7CisJCS8vIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY3JlYXRlZCBhbiBlbGVtZW50IHRhZyBmb3IgdXMuCisJCVRhZ0VsZW1lbnQgdGUgPSBzdGFjay5wZWVrKCk7CisJCXRlLnNldEF0dHIoIG51bGwsIFNUUlVDVF9UWVBFX0FUVFIsIHN0cnVjdC50eXBlKCkuZ2V0SWQoKSApOworCX0KKworCXB1YmxpYyB2b2lkIGVuZFN0cnVjdCggU3RydWN0VmFsdWUgc3RydWN0ICkKKwl7CisJCS8vIHN0YWNrLnBvcCgpOworCX0KKworCXB1YmxpYyB2b2lkIHN0YXJ0QXJyYXkoIEFycmF5VmFsdWUgYXJyYXkgKQorCXsKKwkJLy8gdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjcmVhdGVkIGFuIGVsZW1lbnQgdGFnIGZvciB1cy4KKwkJLy8gVGFnRWxlbWVudCB0ZSA9IHN0YWNrLnBlZWsoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlbmRBcnJheSggQXJyYXlWYWx1ZSBhcnJheSApCisJeworCQkvLyBzdGFjay5wb3AoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVsZW1lbnQoIEZpZWxkIGtleSwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlUYWdFbGVtZW50IHRlID0gc3RhY2sucGVlaygpLmFkZFRhZyggRUxFTUVOVF9UQUcgKTsKKwkJdGUuc2V0QXR0ciggbnVsbCwgS0VZX0FUVFIsIGtleS5nZXRJZCgpICk7CisJCXN0YWNrLnB1c2goIHRlICk7CisJCXdyaXRlVmFsdWUoIHZhbHVlICk7CisJCXN0YWNrLnBvcCgpOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlQXJyYXlFbGVtZW50KCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVRhZ0VsZW1lbnQgdGUgPSBzdGFjay5wZWVrKCkuYWRkVGFnKCBFTEVNRU5UX1RBRyApOworCQlzdGFjay5wdXNoKCB0ZSApOworCQl3cml0ZVZhbHVlKCB2YWx1ZSApOworCQlzdGFjay5wb3AoKTsKKwl9CisJCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXd0ci5jbG9zZSgpOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCXByaXZhdGUgdm9pZCB3cml0ZVZhbHVlKCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY3JlYXRlZCBhbiBlbGVtZW50IGZvciB1cy4KKwkJCisJCVRhZ0VsZW1lbnQgdGUgPSBzdGFjay5wZWVrKCk7CisJCQorCQlpbnQgdHlwZSA9IGNoZWNrVmFsdWUoIHZhbHVlICk7CisJCQorCQlzd2l0Y2ggKHR5cGUpCisJCXsKKwkJCWNhc2UgVHlwZUNvZGUuTlVMTDoKKwkJCXsKKwkJCQl0ZS5zZXRBdHRyKCBudWxsLCBFTEVNRU5UX1RZUEVfQVRUUiwgTlVMTF9UWVBFICk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuQk9PTEVBTl9GQUxTRToKKwkJCWNhc2UgVHlwZUNvZGUuQk9PTEVBTl9UUlVFOgorCQkJeworCQkJCXRlLnNldEF0dHIoIG51bGwsIEVMRU1FTlRfVFlQRV9BVFRSLCBCT09MRUFOX1RZUEUgKTsKKwkJCQl0ZS5hZGRDZGF0YSggdmFsdWUudG9TdHJpbmcoKSApOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQljYXNlIFR5cGVDb2RlLkJZVEU6CisJCQljYXNlIFR5cGVDb2RlLlNIT1JUOgorCQkJY2FzZSBUeXBlQ29kZS5JTlQ6CisJCQl7CisJCQkJdGUuc2V0QXR0ciggbnVsbCwgRUxFTUVOVF9UWVBFX0FUVFIsIElOVEVHRVJfVFlQRSApOworCQkJCXRlLmFkZENkYXRhKCB2YWx1ZS50b1N0cmluZygpICk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuTE9ORzoKKwkJCXsKKwkJCQl0ZS5zZXRBdHRyKCBudWxsLCBFTEVNRU5UX1RZUEVfQVRUUiwgTE9OR19UWVBFICk7CisJCQkJdGUuYWRkQ2RhdGEoIHZhbHVlLnRvU3RyaW5nKCkgKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5GTE9BVDoKKwkJCXsKKwkJCQl0ZS5zZXRBdHRyKCBudWxsLCBFTEVNRU5UX1RZUEVfQVRUUiwgRkxPQVRfVFlQRSApOworCQkJCXRlLmFkZENkYXRhKCB2YWx1ZS50b1N0cmluZygpICk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuRE9VQkxFOgorCQkJeworCQkJCXRlLnNldEF0dHIoIG51bGwsIEVMRU1FTlRfVFlQRV9BVFRSLCBET1VCTEVfVFlQRSApOworCQkJCXRlLmFkZENkYXRhKCB2YWx1ZS50b1N0cmluZygpICk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgVHlwZUNvZGUuQllURVM6CisJCQl7CisJCQkJYnl0ZVtdIGIgPSAoYnl0ZVtdKSB2YWx1ZTsKKwkJCQl0ZS5zZXRBdHRyKCBudWxsLCBFTEVNRU5UX1RZUEVfQVRUUiwgQllURVNfVFlQRSApOworCQkJCXRlLmFkZENkYXRhKCBieXRlczJzdHJpbmcoIGIgKSApOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQljYXNlIFR5cGVDb2RlLkVNUFRZX1NUUklORzoKKwkJCWNhc2UgVHlwZUNvZGUuU1RSSU5HOgorCQkJeworCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7CisJCQkJdGUuc2V0QXR0ciggbnVsbCwgRUxFTUVOVF9UWVBFX0FUVFIsIFNUUklOR19UWVBFICk7CisJCQkJdGUuYWRkQ2RhdGEoIHMgKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBUeXBlQ29kZS5BUlJBWToKKwkJCQl0ZS5zZXRBdHRyKCBudWxsLCBFTEVNRU5UX1RZUEVfQVRUUiwgQVJSQVlfVFlQRSApOworCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5VmFsdWUpCisJCQkJCXdyaXRlQXJyYXkoIChBcnJheVZhbHVlKSB2YWx1ZSwgbnVsbCApOworCQkJCWVsc2UKKwkJCQkJd3JpdGVBcnJheSggdG9BcnJheVZhbHVlKCB2YWx1ZSwgbnVsbCApLCBudWxsICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFR5cGVDb2RlLlNUUlVDVDoKKwkJCWNhc2UgVHlwZUNvZGUuQ1VTVE9NOgorCQkJeworCQkJCVN0cnVjdFZhbHVlIHN0cnVjdCA9IHZmLmV4cG9ydEN1c3RvbVZhbHVlKCB2YWx1ZSApOworCQkJCQorCQkJCWlmIChzdHJ1Y3QgPT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5zdXBwb3J0ZWQgdHlwZSAiK3ZhbHVlLmdldENsYXNzKCkgKTsKKwkJCQkKKwkJCQl0ZS5zZXRBdHRyKCBudWxsLCBFTEVNRU5UX1RZUEVfQVRUUiwgQ1VTVE9NX1RZUEUgKTsKKwkJCQl3cml0ZVN0cnVjdCggc3RydWN0ICk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInVuc3VwcG9ydGVkIHR5cGUgY29kZSAiK3R5cGUgKTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGJ5dGVzMnN0cmluZyggYnl0ZVtdIGJ1ZiApCisJeworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoYnl0ZSBiOiBidWYpCisJCXsKKwkJCWlmIChzYi5sZW5ndGgoKSA+IDApCisJCQkJc2IuYXBwZW5kKCAnICcgKTsKKwkJCXNiLmFwcGVuZCggSW50ZWdlci50b1N0cmluZyggYiwgMTYgKSApOworCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtc2cKKwkgKiBAcGFyYW0gdmYKKwkgKiBAcmV0dXJuIHRoZSB4bWwgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYbWwoIE1lc3NhZ2UgbXNnLCBWYWx1ZUZhY3RvcnkgdmYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJVGFnZ2VkRGF0YU91dHB1dCB0ZG8gPSBuZXcgWG1sVGFnZ2VkRGF0YU91dHB1dCggc3csIHZmICk7CisJCXRkby53cml0ZU1lc3NhZ2UoIG1zZywgbnVsbCApOworCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoIEZsZXhCdWZmZXIgbXNnQnVmICkKKwl7CisJCS8vIFRPRE8gaW1wbGVtZW50IHNldEJ1ZmZlciBmdW5jdGlvbgorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoIE1lc3NhZ2UgbXNnLCBGbGV4QnVmZmVyIGJ1ZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgd3JpdGVNZXNzYWdlIGZ1bmN0aW9uCisJCQorCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZVN0cnVjdCggU3RydWN0VmFsdWUgc3YgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gaW1wbGVtZW50IHdyaXRlU3RydWN0IGZ1bmN0aW9uCisJCQorCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUFycmF5KCBBcnJheVZhbHVlIGF2LCBWYWxpZGF0b3IgdiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgd3JpdGVBcnJheSBmdW5jdGlvbgorCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQveG1sL1htbFRhZ3MuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC94bWwvWG1sVGFncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTJmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQveG1sL1htbFRhZ3MuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQueG1sOworCisvKioKKyAqIFRoZSB0YWcgbmFtZXMsIGV0Yy4sIHVzZWQgYnkgdGhlIGRlbW9uc3RyYXRpb24geG1sIG1lc3NhZ2UgZm9ybWF0dGVyLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbFRhZ3MKK3sKKwkvLyB0YWdzCisJCisJLyoqCisJICogVGhlIHRhZyBvZiBhIG1lc3NhZ2UuIEEgbWVzc2FnZSB0YWcgaGFzIHRoZSBhdHRyaWJ1dGVzIGFuZAorCSAqIGVsZW1lbnRzIG9mIGEgc3RydWN0IGVsZW1lbnQuCisJICovCisJcHVibGljIFN0cmluZyBNRVNTQUdFX1RBRyA9ICJtIjsKKworCS8qKgorCSAqIFRoZSB0YWcgb2YgYW4gZWxlbWVudC4gQW4gZWxlbWVudCBpcyBhbiBpdGVtIG5lc3RlZCB3aXRoaW4gYW4KKwkgKiBtZXNzYWdlLCBzdHJ1Y3QsIGFycmF5LCBvciBjdXN0b20gdHlwZS4gQW4gZWxlbWVudCBoYXMgYSBkYXRhCisJICogdHlwZSBhdHRyaWJ1dGUuIElmIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBtZXNzYWdlLAorCSAqIHN0cnVjdCwgb3IgY3VzdG9tIGVsZW1lbnQsIGl0IGhhcyBhIGtleSBhdHRyaWJ1dGUuIElmIHRoZQorCSAqIGVsZW1lbnQgaXMgYSBzdHJ1Y3Qgb3IgY3VzdG9tIGVsZW1lbnQsIGl0IGhhcyBhIHN0cnVjdCB0eXBlCisJICogYXR0cmlidXRlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgRUxFTUVOVF9UQUcgPSAiZSI7CisJCisJLy8gYXR0cmlidXRlcworCisJLyoqCisJICogVGhlIGludGVnZXIgdHlwZSBvZiB0aGUgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIFNUUlVDVF9UWVBFX0FUVFIgPSAidCI7CisKKwkvKioKKwkgKiBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIEVMRU1FTlRfVFlQRV9BVFRSID0gImQiOworCisJLyoqCisJICogVGhlIGludGVnZXIga2V5IG9mIGFuIGVsZW1lbnQgd2l0aGluIGEgbWVzc2FnZSBvciBzdHJ1Y3QgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIEtFWV9BVFRSID0gImsiOworCQorCS8vIHR5cGVzCisKKwkvKioKKwkgKiBUaGUgZWxlbWVudCByZXByZXNlbnRzIHRoZSBudWxsIHZhbHVlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgTlVMTF9UWVBFID0gIm4iOworCisJLyoqCisJICogVGhlIGVsZW1lbnQgcmVwcmVzZW50cyBhIGJvb2xlYW4gdmFsdWUsIHdpdGggY2RhdGEgdHJ1ZSBvciBmYWxzZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIEJPT0xFQU5fVFlQRSA9ICJiIjsKKworCS8qKgorCSAqIFRoZSBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW50ZWdyYWwgdHlwZSAoMzItYml0IHNpZ25lZCkuIENkYXRhIGlzCisJICogdGhlIHN0cmluZyBmb3JtYXQgb2YgdGhlIHZhbHVlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgSU5URUdFUl9UWVBFID0gImkiOworCisJLyoqCisJICogVGhlIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbnRlZ3JhbCB0eXBlICg2NC1iaXQgc2lnbmVkKS4gQ2RhdGEgaXMKKwkgKiB0aGUgc3RyaW5nIGZvcm1hdCBvZiB0aGUgdmFsdWUuCisJICovCisJcHVibGljIFN0cmluZyBMT05HX1RZUEUgPSAibCI7CisKKwkvKioKKwkgKiBUaGUgZWxlbWVudCByZXByZXNlbnRzIGEgZmxvYXRpbmcgdHlwZSAoMzItYml0IHNpZ25lZCkuIENkYXRhIGlzCisJICogdGhlIHN0cmluZyBmb3JtYXQgb2YgdGhlIHZhbHVlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgRkxPQVRfVFlQRSA9ICJmIjsKKworCS8qKgorCSAqIFRoZSBlbGVtZW50IHJlcHJlc2VudHMgYW4gZmxvYXRpbmcgdHlwZSAoNjQtYml0IHNpZ25lZCkuIENkYXRhIGlzCisJICogdGhlIHN0cmluZyBmb3JtYXQgb2YgdGhlIHZhbHVlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgRE9VQkxFX1RZUEUgPSAiZCI7CisKKwkvKioKKwkgKiBUaGUgZWxlbWVudCByZXByZXNlbnRzIGEgYnl0ZSBhcnJheSB0eXBlLiBDZGF0YSBpcyBhIHNwYWNlLXNlcGFyYXRlZAorCSAqIGxpc3Qgb2YgaGV4IHZhbHVlcyAoMDAtZmYpLgorCSAqLworCXB1YmxpYyBTdHJpbmcgQllURVNfVFlQRSA9ICJ5IjsKKworCS8qKgorCSAqIFRoZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzdHJpbmcgdHlwZS4gQ2RhdGEgaXMgdGhlIGNoYXJhY3RlciBkYXRhCisJICogb2YgdGhlIHN0cmluZy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIFNUUklOR19UWVBFID0gInMiOworCQorCS8qKgorCSAqIFRoZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzdHJ1Y3QgdHlwZS4gQSBzdHJ1Y3QgaGFzIGNoaWxkIGVsZW1lbnRzCisJICogd2l0aCBrZXkgYXR0cmlidXRlcyB3aGljaCByZXByZXNlbnQgdGhlIGtleSAvIHZhbHVlIHBhaXJzIG9mIHRoZQorCSAqIHN0cnVjdC4gVGhlIGtleXMgYXJlIGludGVnZXJzLgorCSAqLworCXB1YmxpYyBTdHJpbmcgU1RSVUNUX1RZUEUgPSAieCI7CisKKwkvKioKKwkgKiBUaGUgZWxlbWVudCByZXByZXNlbnRzIGFuIGFycmF5IHR5cGUuIEFuIGFycmF5IGhhcyBhbiBvcmRlcmVkCisJICogc2VxdWVuY2Ugb2YgY2hpbGQgZWxlbWVudHMuCisJICovCisJcHVibGljIFN0cmluZyBBUlJBWV9UWVBFID0gImEiOworCisJLyoqCisJICogVGhlIGVsZW1lbnQgcmVwcmVzZW50cyBhIGN1c3RvbSBkYXRhIHR5cGUuIEl0IGhhcyBhIGNvZGUgd2hpY2gKKwkgKiBpZGVudGlmaWVzIHRoZSB0eXBlIGFuZCBoYXMgb25lIG9yIG1vcmUgY2hpbGQgZWxlbWVudHMgd2hpY2gKKwkgKiByZXByZXNlbnQgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBkYXRhIHR5cGUuCisJICovCisJcHVibGljIFN0cmluZyBDVVNUT01fVFlQRSA9ICJjIjsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9EYXRlU2VyaWFsaXplci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL0RhdGVTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzZjJhOAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9EYXRlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkltcG9ydEV4cG9ydEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkNsYXNzMlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZzsKKworCisvKioKKyAqIEFuIGV0Y2ggc2VyaWFsaXplciBmb3IgRGF0ZS4KKyAqLworcHVibGljIGNsYXNzIERhdGVTZXJpYWxpemVyIGltcGxlbWVudHMgSW1wb3J0RXhwb3J0SGVscGVyCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAiZGF0ZVRpbWUiOworCisJLyoqCisJICogRGVmaW5lcyBjdXN0b20gZmllbGRzIGluIHRoZSB2YWx1ZSBmYWN0b3J5IHNvIHRoYXQgdGhlIGltcG9ydGVyCisJICogY2FuIGZpbmQgdGhlbS4KKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBjbGFzczJ0eXBlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGluaXQoIFR5cGUgdHlwZSwgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlICkKKwl7CisJCUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCggRklFTERfTkFNRSApOworCQljbGFzczJ0eXBlLnB1dCggRGF0ZS5jbGFzcywgdHlwZSApOworCQl0eXBlLnNldENvbXBvbmVudFR5cGUoIERhdGUuY2xhc3MgKTsKKwkJdHlwZS5zZXRJbXBvcnRFeHBvcnRIZWxwZXIoIG5ldyBEYXRlU2VyaWFsaXplciggdHlwZSwgZmllbGQgKSApOworCQl0eXBlLnB1dFZhbGlkYXRvciggZmllbGQsIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCXR5cGUubG9jaygpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIGZpZWxkCisJICovCisJcHVibGljIERhdGVTZXJpYWxpemVyKCBUeXBlIHR5cGUsIEZpZWxkIGZpZWxkICkKKwl7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuZmllbGQgPSBmaWVsZDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKKworCXB1YmxpYyBPYmplY3QgaW1wb3J0VmFsdWUoIFN0cnVjdFZhbHVlIHN0cnVjdCApCisJeworCQlyZXR1cm4gbmV3IERhdGUoIChMb25nKSBzdHJ1Y3QuZ2V0KCBmaWVsZCApICk7CisJfQorCisJcHVibGljIFN0cnVjdFZhbHVlIGV4cG9ydFZhbHVlKCBWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSApCisJeworCQlTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgPSBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisJCXN0cnVjdC5wdXQoIGZpZWxkLCAoKERhdGUpIHZhbHVlKS5nZXRUaW1lKCkgKTsKKwkJcmV0dXJuIHN0cnVjdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvTGlzdFNlcmlhbGl6ZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9MaXN0U2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmJhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvTGlzdFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkltcG9ydEV4cG9ydEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkNsYXNzMlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3Jfb2JqZWN0OworCisKKy8qKgorICogU2VyaWFsaXplciBmb3IgZ2VuZXJpYyBMaXN0PE9iamVjdD4uCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0U2VyaWFsaXplciBpbXBsZW1lbnRzIEltcG9ydEV4cG9ydEhlbHBlcgoreworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUVMRF9OQU1FID0gInZhbHVlcyI7CisKKwkvKioKKwkgKiBEZWZpbmVzIGN1c3RvbSBmaWVsZHMgaW4gdGhlIHZhbHVlIGZhY3Rvcnkgc28gdGhhdCB0aGUgaW1wb3J0ZXIKKwkgKiBjYW4gZmluZCB0aGVtLgorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIGNsYXNzMnR5cGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCggVHlwZSB0eXBlLCBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorICAgIHsKKwkJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCBGSUVMRF9OQU1FICk7CisJCWNsYXNzMnR5cGUucHV0KCBBcnJheUxpc3QuY2xhc3MsIHR5cGUgKTsKKwkJdHlwZS5zZXRDb21wb25lbnRUeXBlKCBMaXN0LmNsYXNzICk7CisJCXR5cGUuc2V0SW1wb3J0RXhwb3J0SGVscGVyKCBuZXcgTGlzdFNlcmlhbGl6ZXIoIHR5cGUsIGZpZWxkICkgKTsKKwkJdHlwZS5wdXRWYWxpZGF0b3IoIGZpZWxkLCBWYWxpZGF0b3Jfb2JqZWN0LmdldCggMSApICk7CisJCXR5cGUubG9jaygpOworICAgIH0KKworCS8qKgorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIGZpZWxkCisJICovCisJcHVibGljIExpc3RTZXJpYWxpemVyKCBUeXBlIHR5cGUsIEZpZWxkIGZpZWxkICkKKwl7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuZmllbGQgPSBmaWVsZDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKKwkKKwlwdWJsaWMgT2JqZWN0IGltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCXsKKwkJc3RydWN0LmNoZWNrVHlwZSggdHlwZSApOworCQlPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pIHN0cnVjdC5nZXQoIGZpZWxkICk7CisJCQorCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PiggdmFsdWVzLmxlbmd0aCApOworCQlmb3IoIE9iamVjdCB2YWx1ZTogdmFsdWVzKQorCQkJbGlzdC5hZGQoIHZhbHVlICk7CisJCQorCQlyZXR1cm4gbGlzdDsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCUxpc3Q8T2JqZWN0PiBsaXN0ID0gKExpc3Q8T2JqZWN0PikgdmFsdWU7CisJCQorCQlPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKKwkJbGlzdC50b0FycmF5KCB2YWx1ZXMgKTsKKwkJCisJCVN0cnVjdFZhbHVlIHN0cnVjdCA9IG5ldyBTdHJ1Y3RWYWx1ZSggdHlwZSwgdmYgKTsKKwkJc3RydWN0LnB1dCggZmllbGQsIHZhbHVlcyApOworCQlyZXR1cm4gc3RydWN0OworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9NYXBTZXJpYWxpemVyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvTWFwU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDVmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvTWFwU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkltcG9ydEV4cG9ydEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkNsYXNzMlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3Jfb2JqZWN0OworCisKKy8qKgorICogU2VyaWFsaXplciBmb3IgZ2VuZXJpYyBNYXA8T2JqZWN0LCBPYmplY3Q+LgorICovCitwdWJsaWMgY2xhc3MgTWFwU2VyaWFsaXplciBpbXBsZW1lbnRzIEltcG9ydEV4cG9ydEhlbHBlcgoreworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUVMRF9OQU1FID0gImtleXNBbmRWYWx1ZXMiOworCisJLyoqCisJICogRGVmaW5lcyBjdXN0b20gZmllbGRzIGluIHRoZSB2YWx1ZSBmYWN0b3J5IHNvIHRoYXQgdGhlIGltcG9ydGVyCisJICogY2FuIGZpbmQgdGhlbS4KKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBjbGFzczJ0eXBlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGluaXQoIFR5cGUgdHlwZSwgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlICkKKyAgICB7CisJCUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCggRklFTERfTkFNRSApOworCQkKKwkJLy8gcXVpY2sgbG9va3VwIHRvIHNlcmlhbGl6ZSB0aGlzIGNsYXNzLgorCQljbGFzczJ0eXBlLnB1dCggSGFzaE1hcC5jbGFzcywgdHlwZSApOworCQkKKwkJLy8gdHlwZSBmb3IgYXJyYXlzLgorCQl0eXBlLnNldENvbXBvbmVudFR5cGUoIE1hcC5jbGFzcyApOworCQkKKwkJdHlwZS5zZXRJbXBvcnRFeHBvcnRIZWxwZXIoIG5ldyBNYXBTZXJpYWxpemVyKCB0eXBlLCBmaWVsZCApICk7CisJCXR5cGUucHV0VmFsaWRhdG9yKCBmaWVsZCwgVmFsaWRhdG9yX29iamVjdC5nZXQoIDEgKSApOworCQl0eXBlLmxvY2soKTsKKyAgICB9CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBmaWVsZAorCSAqLworCXB1YmxpYyBNYXBTZXJpYWxpemVyKCBUeXBlIHR5cGUsIEZpZWxkIGZpZWxkICkKKwl7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuZmllbGQgPSBmaWVsZDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKKwkKKwlwdWJsaWMgT2JqZWN0IGltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCXsKKwkJc3RydWN0LmNoZWNrVHlwZSggdHlwZSApOworCQlPYmplY3RbXSBrZXlzQW5kVmFsdWVzID0gKE9iamVjdFtdKSBzdHJ1Y3QuZ2V0KCBmaWVsZCApOworCQlpbnQgbiA9IGtleXNBbmRWYWx1ZXMubGVuZ3RoOworCQkKKwkJTWFwPE9iamVjdCwgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oIChuKjIrMikvMywgMC43NWYgKTsgLy8gKG4vMikqNC8zCisJCWludCBpbmRleCA9IDA7CisJCXdoaWxlIChpbmRleCA8IG4pCisJCXsKKwkJCU9iamVjdCBrZXkgPSBrZXlzQW5kVmFsdWVzW2luZGV4KytdOworCQkJT2JqZWN0IHZhbHVlID0ga2V5c0FuZFZhbHVlc1tpbmRleCsrXTsKKwkJCW1hcC5wdXQoIGtleSwgdmFsdWUgKTsKKwkJfQorCQkKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCU1hcDxPYmplY3QsIE9iamVjdD4gbWFwID0gKE1hcDxPYmplY3QsIE9iamVjdD4pIHZhbHVlOworCQkKKwkJT2JqZWN0W10ga2V5c0FuZFZhbHVlcyA9IG5ldyBPYmplY3RbbWFwLnNpemUoKSoyXTsKKwkJaW50IGluZGV4ID0gMDsKKwkJZm9yIChqYXZhLnV0aWwuTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBtZTogbWFwLmVudHJ5U2V0KCkpCisJCXsKKwkJCWtleXNBbmRWYWx1ZXNbaW5kZXgrK10gPSBtZS5nZXRLZXkoKTsKKwkJCWtleXNBbmRWYWx1ZXNbaW5kZXgrK10gPSBtZS5nZXRWYWx1ZSgpOworCQl9CisJCQorCQlTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgPSBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisJCXN0cnVjdC5wdXQoIGZpZWxkLCBrZXlzQW5kVmFsdWVzICk7CisJCXJldHVybiBzdHJ1Y3Q7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1NldFNlcmlhbGl6ZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9TZXRTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4YmViYwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9TZXRTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5JbXBvcnRFeHBvcnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5DbGFzczJUeXBlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX29iamVjdDsKKworCisvKioKKyAqIFNlcmlhbGl6ZXIgZm9yIGdlbmVyaWMgU2V0PE9iamVjdD4uCisgKi8KK3B1YmxpYyBjbGFzcyBTZXRTZXJpYWxpemVyIGltcGxlbWVudHMgSW1wb3J0RXhwb3J0SGVscGVyCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAia2V5cyI7CisKKwkvKioKKwkgKiBEZWZpbmVzIGN1c3RvbSBmaWVsZHMgaW4gdGhlIHZhbHVlIGZhY3Rvcnkgc28gdGhhdCB0aGUgaW1wb3J0ZXIKKwkgKiBjYW4gZmluZCB0aGVtLgorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIGNsYXNzMnR5cGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCggVHlwZSB0eXBlLCBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorICAgIHsKKwkJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCBGSUVMRF9OQU1FICk7CisJCQorCQljbGFzczJ0eXBlLnB1dCggSGFzaFNldC5jbGFzcywgdHlwZSApOworCQl0eXBlLnNldENvbXBvbmVudFR5cGUoIFNldC5jbGFzcyApOworCQkKKwkJdHlwZS5zZXRJbXBvcnRFeHBvcnRIZWxwZXIoIG5ldyBTZXRTZXJpYWxpemVyKCB0eXBlLCBmaWVsZCApICk7CisJCXR5cGUucHV0VmFsaWRhdG9yKCBmaWVsZCwgVmFsaWRhdG9yX29iamVjdC5nZXQoIDEgKSApOworCQl0eXBlLmxvY2soKTsKKyAgICB9CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBmaWVsZAorCSAqLworCXB1YmxpYyBTZXRTZXJpYWxpemVyKCBUeXBlIHR5cGUsIEZpZWxkIGZpZWxkICkKKwl7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuZmllbGQgPSBmaWVsZDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKKwkKKwlwdWJsaWMgT2JqZWN0IGltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCXsKKwkJc3RydWN0LmNoZWNrVHlwZSggdHlwZSApOworCQlPYmplY3RbXSBrZXlzID0gKE9iamVjdFtdKSBzdHJ1Y3QuZ2V0KCBmaWVsZCApOworCQkKKwkJU2V0PE9iamVjdD4gc2V0ID0gbmV3IEhhc2hTZXQ8T2JqZWN0PiggKGtleXMubGVuZ3RoKjQrMikvMywgLjc1ZiApOworCQlmb3IgKE9iamVjdCBrZXk6IGtleXMpCisJCQlzZXQuYWRkKCBrZXkgKTsKKwkJCisJCXJldHVybiBzZXQ7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIFN0cnVjdFZhbHVlIGV4cG9ydFZhbHVlKCBWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSApCisJeworCQlTZXQ8T2JqZWN0PiBzZXQgPSAoU2V0PE9iamVjdD4pIHZhbHVlOworCQkKKwkJT2JqZWN0W10ga2V5cyA9IG5ldyBPYmplY3Rbc2V0LnNpemUoKV07CisJCXNldC50b0FycmF5KCBrZXlzICk7CisJCQorCQlTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgPSBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisJCXN0cnVjdC5wdXQoIGZpZWxkLCBrZXlzICk7CisJCXJldHVybiBzdHJ1Y3Q7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1N0ckludEhhc2hNYXAuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9TdHJJbnRIYXNoTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0MzEwZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9TdHJJbnRIYXNoTWFwLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBBIEhhc2hNYXAgd2hpY2ggaXMgZnJvbSBTdHJpbmcgdG8gSW50ZWdlci4KKyAqLworcHVibGljIGNsYXNzIFN0ckludEhhc2hNYXAgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTE2MjIzMTIyNzUxMjY1MjYzMEw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgU3RySW50SGFzaE1hcCBpbml0aWFsaXplZCBmcm9tIGFub3RoZXIuCisJICogQHBhcmFtIG90aGVyCisJICovCisJcHVibGljIFN0ckludEhhc2hNYXAoIFN0ckludEhhc2hNYXAgb3RoZXIgKQorCXsKKwkJc3VwZXIoIG90aGVyICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgYSBTdHJJbnRIYXNoTWFwLgorCSAqLworCXB1YmxpYyBTdHJJbnRIYXNoTWFwKCkKKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1N0ckludEhhc2hNYXBTZXJpYWxpemVyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQyZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1N0ckludEhhc2hNYXBTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuSW1wb3J0RXhwb3J0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9vYmplY3Q7CisKKworLyoqCisgKiBBbiBldGNoIHNlcmlhbGl6ZXIgZm9yIFN0ckludEhhc2hNYXAuCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJJbnRIYXNoTWFwU2VyaWFsaXplciBpbXBsZW1lbnRzIEltcG9ydEV4cG9ydEhlbHBlcgoreworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUVMRF9OQU1FID0gImtleXNBbmRWYWx1ZXMiOworCisJLyoqCisJICogRGVmaW5lcyBjdXN0b20gZmllbGRzIGluIHRoZSB2YWx1ZSBmYWN0b3J5IHNvIHRoYXQgdGhlIGltcG9ydGVyCisJICogY2FuIGZpbmQgdGhlbS4KKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBjbGFzczJ0eXBlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGluaXQoIFR5cGUgdHlwZSwgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlICkKKyAgICB7CisJCUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCggRklFTERfTkFNRSApOworCQljbGFzczJ0eXBlLnB1dCggU3RySW50SGFzaE1hcC5jbGFzcywgdHlwZSApOworCQl0eXBlLnNldENvbXBvbmVudFR5cGUoIFN0ckludEhhc2hNYXAuY2xhc3MgKTsKKwkJdHlwZS5zZXRJbXBvcnRFeHBvcnRIZWxwZXIoIG5ldyBTdHJJbnRIYXNoTWFwU2VyaWFsaXplciggdHlwZSwgZmllbGQgKSApOworCQl0eXBlLnB1dFZhbGlkYXRvciggZmllbGQsIFZhbGlkYXRvcl9vYmplY3QuZ2V0KCAxICkgKTsKKwkJdHlwZS5sb2NrKCk7CisgICAgfQorCisJLyoqCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcGFyYW0gZmllbGQKKwkgKi8KKwlwdWJsaWMgU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIoIFR5cGUgdHlwZSwgRmllbGQgZmllbGQgKQorCXsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5maWVsZCA9IGZpZWxkOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKwkKKwlwcml2YXRlIGZpbmFsIEZpZWxkIGZpZWxkOworCQorCXB1YmxpYyBPYmplY3QgaW1wb3J0VmFsdWUoIFN0cnVjdFZhbHVlIHN0cnVjdCApCisJeworCQlTdHJJbnRIYXNoTWFwIG1hcCA9IG5ldyBTdHJJbnRIYXNoTWFwKCk7CisJCQorCQlPYmplY3RbXSBrZXlzQW5kVmFsdWVzID0gKE9iamVjdFtdKSBzdHJ1Y3QuZ2V0KCBmaWVsZCApOworCQlpbnQgbiA9IGtleXNBbmRWYWx1ZXMubGVuZ3RoOworCQlpbnQgaW5kZXggPSAwOworCQl3aGlsZSAoaW5kZXggPCBuKQorCQl7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5c0FuZFZhbHVlc1tpbmRleCsrXTsKKwkJCUludGVnZXIgdmFsdWUgPSAoSW50ZWdlcikga2V5c0FuZFZhbHVlc1tpbmRleCsrXTsKKwkJCW1hcC5wdXQoIGtleSwgdmFsdWUgKTsKKwkJfQorCQkKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVN0ckludEhhc2hNYXAgbWFwID0gKFN0ckludEhhc2hNYXApIHZhbHVlOworCQkKKwkJT2JqZWN0W10ga2V5c0FuZFZhbHVlcyA9IG5ldyBPYmplY3RbbWFwLnNpemUoKSoyXTsKKwkJaW50IGluZGV4ID0gMDsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBtZTogbWFwLmVudHJ5U2V0KCkpCisJCXsKKwkJCWtleXNBbmRWYWx1ZXNbaW5kZXgrK10gPSBtZS5nZXRLZXkoKTsKKwkJCWtleXNBbmRWYWx1ZXNbaW5kZXgrK10gPSBtZS5nZXRWYWx1ZSgpOworCQl9CisJCQorCQlTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgPSBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisJCXN0cnVjdC5wdXQoIGZpZWxkLCBrZXlzQW5kVmFsdWVzICk7CisJCXJldHVybiBzdHJ1Y3Q7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1N0clN0ckhhc2hNYXAuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9TdHJTdHJIYXNoTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2YmI4YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9TdHJTdHJIYXNoTWFwLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBBIEhhc2hNYXAgd2hpY2ggaXMgZnJvbSBTdHJpbmcgdG8gU3RyaW5nLgorICogCisgKiBUbyB1c2UgU3RyU3RySGFzaE1hcCBpbiBhbiBldGNoIHNlcnZpY2UsIGRlZmluZSBhbiBleHRlcm4gdHlwZSBhbmQgcHJlZml4CisgKiBpdCB3aXRoIHRoaXMgYW5ub3RhdGlvbjoKKyAqIAorICogQEV4dGVybiggamF2YSwgIm9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuU3RyU3RySGFzaE1hcCIsICIiLAorICogICAib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJTdHJIYXNoTWFwU2VyaWFsaXplciIsICIiICkKKyAqIGV4dGVybiBTdHJTdHJIYXNoTWFwCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJTdHJIYXNoTWFwIGV4dGVuZHMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2OTEwODQ1MjkyNjI4NTg5NzcxTDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBTdHJTdHJIYXNoTWFwIGluaXRpYWxpemVkIGZyb20gYW5vdGhlci4KKwkgKiBAcGFyYW0gb3RoZXIKKwkgKi8KKwlwdWJsaWMgU3RyU3RySGFzaE1hcCggU3RyU3RySGFzaE1hcCBvdGhlciApCisJeworCQlzdXBlciggb3RoZXIgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIFN0clN0ckhhc2hNYXAuCisJICovCisJcHVibGljIFN0clN0ckhhc2hNYXAoKQorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvU3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9TdHJTdHJIYXNoTWFwU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjRlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvU3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5JbXBvcnRFeHBvcnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5DbGFzczJUeXBlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX29iamVjdDsKKworCisvKioKKyAqIEFuIGV0Y2ggc2VyaWFsaXplciBmb3IgU3RyU3RySGFzaE1hcC4KKyAqLworcHVibGljIGNsYXNzIFN0clN0ckhhc2hNYXBTZXJpYWxpemVyIGltcGxlbWVudHMgSW1wb3J0RXhwb3J0SGVscGVyCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAia2V5c0FuZFZhbHVlcyI7CisKKwkvKioKKwkgKiBEZWZpbmVzIGN1c3RvbSBmaWVsZHMgaW4gdGhlIHZhbHVlIGZhY3Rvcnkgc28gdGhhdCB0aGUgaW1wb3J0ZXIKKwkgKiBjYW4gZmluZCB0aGVtLgorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIGNsYXNzMnR5cGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCggVHlwZSB0eXBlLCBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgKQorICAgIHsKKwkJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCBGSUVMRF9OQU1FICk7CisJCWNsYXNzMnR5cGUucHV0KCBTdHJTdHJIYXNoTWFwLmNsYXNzLCB0eXBlICk7CisJCXR5cGUuc2V0Q29tcG9uZW50VHlwZSggU3RyU3RySGFzaE1hcC5jbGFzcyApOworCQl0eXBlLnNldEltcG9ydEV4cG9ydEhlbHBlciggbmV3IFN0clN0ckhhc2hNYXBTZXJpYWxpemVyKCB0eXBlLCBmaWVsZCApICk7CisJCXR5cGUucHV0VmFsaWRhdG9yKCBmaWVsZCwgVmFsaWRhdG9yX29iamVjdC5nZXQoIDEgKSApOworCQl0eXBlLmxvY2soKTsKKyAgICB9CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBmaWVsZAorCSAqLworCXB1YmxpYyBTdHJTdHJIYXNoTWFwU2VyaWFsaXplciggVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCApCisJeworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLmZpZWxkID0gZmllbGQ7CisJfQorCQorCXByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworCQorCXByaXZhdGUgZmluYWwgRmllbGQgZmllbGQ7CisJCisJcHVibGljIE9iamVjdCBpbXBvcnRWYWx1ZSggU3RydWN0VmFsdWUgc3RydWN0ICkKKwl7CisJCVN0clN0ckhhc2hNYXAgbWFwID0gbmV3IFN0clN0ckhhc2hNYXAoKTsKKwkJCisJCU9iamVjdFtdIGtleXNBbmRWYWx1ZXMgPSAoT2JqZWN0W10pIHN0cnVjdC5nZXQoIGZpZWxkICk7CisJCWludCBuID0ga2V5c0FuZFZhbHVlcy5sZW5ndGg7CisJCWludCBpbmRleCA9IDA7CisJCXdoaWxlIChpbmRleCA8IG4pCisJCXsKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzQW5kVmFsdWVzW2luZGV4KytdOworCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykga2V5c0FuZFZhbHVlc1tpbmRleCsrXTsKKwkJCW1hcC5wdXQoIGtleSwgdmFsdWUgKTsKKwkJfQorCQkKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwdWJsaWMgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVN0clN0ckhhc2hNYXAgbWFwID0gKFN0clN0ckhhc2hNYXApIHZhbHVlOworCQkKKwkJT2JqZWN0W10ga2V5c0FuZFZhbHVlcyA9IG5ldyBPYmplY3RbbWFwLnNpemUoKSoyXTsKKwkJaW50IGluZGV4ID0gMDsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1lOiBtYXAuZW50cnlTZXQoKSkKKwkJeworCQkJa2V5c0FuZFZhbHVlc1tpbmRleCsrXSA9IG1lLmdldEtleSgpOworCQkJa2V5c0FuZFZhbHVlc1tpbmRleCsrXSA9IG1lLmdldFZhbHVlKCk7CisJCX0KKwkJCisJCVN0cnVjdFZhbHVlIHN0cnVjdCA9IG5ldyBTdHJ1Y3RWYWx1ZSggdHlwZSwgdmYgKTsKKwkJc3RydWN0LnB1dCggZmllbGQsIGtleXNBbmRWYWx1ZXMgKTsKKwkJcmV0dXJuIHN0cnVjdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvVVJMU2VyaWFsaXplci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1VSTFNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzU2NzczCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1VSTFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuSW1wb3J0RXhwb3J0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9zdHJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworCisKKy8qKgorICogQW4gZXRjaCBzZXJpYWxpemVyIGZvciBVUkwuCisgKi8KK3B1YmxpYyBjbGFzcyBVUkxTZXJpYWxpemVyIGltcGxlbWVudHMgSW1wb3J0RXhwb3J0SGVscGVyCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJRUxEX05BTUUgPSAidXJsU3RyIjsKKworCS8qKgorCSAqIERlZmluZXMgY3VzdG9tIGZpZWxkcyBpbiB0aGUgdmFsdWUgZmFjdG9yeSBzbyB0aGF0IHRoZSBpbXBvcnRlcgorCSAqIGNhbiBmaW5kIHRoZW0uCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcGFyYW0gY2xhc3MydHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCBUeXBlIHR5cGUsIENsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSApCisJeworCQlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIEZJRUxEX05BTUUgKTsKKwkJY2xhc3MydHlwZS5wdXQoIFVSTC5jbGFzcywgdHlwZSApOworCQl0eXBlLnNldENvbXBvbmVudFR5cGUoIFVSTC5jbGFzcyApOworCQl0eXBlLnNldEltcG9ydEV4cG9ydEhlbHBlciggbmV3IFVSTFNlcmlhbGl6ZXIoIHR5cGUsIGZpZWxkICkgKTsKKwkJdHlwZS5wdXRWYWxpZGF0b3IoIGZpZWxkLCBWYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApICk7CisJCXR5cGUubG9jaygpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIGZpZWxkCisJICovCisJcHVibGljIFVSTFNlcmlhbGl6ZXIoIFR5cGUgdHlwZSwgRmllbGQgZmllbGQgKQorCXsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5maWVsZCA9IGZpZWxkOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKwkKKwlwcml2YXRlIGZpbmFsIEZpZWxkIGZpZWxkOworCisJcHVibGljIE9iamVjdCBpbXBvcnRWYWx1ZSggU3RydWN0VmFsdWUgc3RydWN0ICkKKwl7CisJCXJldHVybiBuZXcgVVJMKCAoU3RyaW5nKSBzdHJ1Y3QuZ2V0KCBmaWVsZCApICk7CisJfQorCisJcHVibGljIFN0cnVjdFZhbHVlIGV4cG9ydFZhbHVlKCBWYWx1ZUZhY3RvcnkgdmYsIE9iamVjdCB2YWx1ZSApCisJeworCQlTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgPSBuZXcgU3RydWN0VmFsdWUoIHR5cGUsIHZmICk7CisJCXN0cnVjdC5wdXQoIGZpZWxkLCAoKFVSTCkgdmFsdWUpLnRvU3RyaW5nKCkgKTsKKwkJcmV0dXJuIHN0cnVjdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0Q29tYm9WYWxpZGF0b3IuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RDb21ib1ZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMGIyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0Q29tYm9WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9ib29sZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2ludDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKiogVGVzdCBDb21ib1ZhbGlkYXRvciAqLworcHVibGljIGNsYXNzIFRlc3RDb21ib1ZhbGlkYXRvcgoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3QoIDAsICIoaW50WzBdIE9SIGJvb2xlYW5bMF0pIiwgdHJ1ZSwgMTIzNDU2Nzg5MDEyTCApOworCQl0ZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsIGZhbHNlLCAtMTIzNDU2Nzg5MDEyTCApOworLy8gVE9ETwkJdGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCBUeXBlQ29kZS5CWVRFMSwgMCwgKGxvbmcpIDMgKTsKKwkJdGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCAxLCAoZmxvYXQpIDQgKTsKKwkJdGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCAtMSwgKGRvdWJsZSkgNSApOworCQl0ZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsIDEyNywgImFiYyIgKTsKKwkJdGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCAtMTI4LCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdCggMCwgIihpbnRbMF0gT1IgYm9vbGVhblswXSkiLCAzMjc2NywgbmV3IGludFtdIHt9ICk7CisJCXRlc3QoIDAsICIoaW50WzBdIE9SIGJvb2xlYW5bMF0pIiwgLTMyNzY4LCBuZXcgYm9vbGVhbltdIHt9ICk7CisJCXRlc3QoIDAsICIoaW50WzBdIE9SIGJvb2xlYW5bMF0pIiwgMTAwMDAwMDAwMCwgbmV3IERhdGUoKSApOworCQl0ZXN0KCAwLCAiKGludFswXSBPUiBib29sZWFuWzBdKSIsIC0xMDAwMDAwMDAwLCBpbnQuY2xhc3MgKTsKKwkJdGVzdCggMSwgIihpbnRbMV0gT1IgYm9vbGVhblsxXSkiLCBuZXcgaW50W10ge30sIDAgKTsKKwkJdGVzdCggMSwgIihpbnRbMV0gT1IgYm9vbGVhblsxXSkiLCBuZXcgYm9vbGVhbltdIHt9LCB0cnVlICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0KCBpbnQgbiwgU3RyaW5nIHMsIE9iamVjdCBnb29kLCBPYmplY3QgYmFkICkKKwl7CisJCVZhbGlkYXRvcl9pbnQgdjEgPSBWYWxpZGF0b3JfaW50LmdldCggbiApOworCQlWYWxpZGF0b3JfYm9vbGVhbiB2MiA9IFZhbGlkYXRvcl9ib29sZWFuLmdldCggbiApOworCQlDb21ib1ZhbGlkYXRvciB2ID0gbmV3IENvbWJvVmFsaWRhdG9yKCB2MSwgdjIgKTsKKwkJCisJCWFzc2VydEVxdWFscyggcywgdi50b1N0cmluZygpICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIGdvb2QgKSApOworCQlhc3NlcnRGYWxzZSggdi52YWxpZGF0ZSggYmFkICkgKTsKKwkJaWYgKG4gPiAwKQorCQl7CisJCQl2LmVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yIHYxID0gVmFsaWRhdG9yX2ludC5nZXQoIDEgKTsKKwkJVmFsaWRhdG9yIHYyID0gVmFsaWRhdG9yX2Jvb2xlYW4uZ2V0KCAwICk7CisJCVZhbGlkYXRvciB2ID0gbmV3IENvbWJvVmFsaWRhdG9yKCB2MSwgdjIgKTsKKworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCBuZXcgaW50W10ge30gKSApOworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCB0cnVlICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggZmFsc2UgKSApOworCQlhc3NlcnRGYWxzZSggdi52YWxpZGF0ZSggMCApICk7CisJCQorCQl2ID0gdi5lbGVtZW50VmFsaWRhdG9yKCk7CisKKwkJYXNzZXJ0RmFsc2UoIHYudmFsaWRhdGUoIG5ldyBpbnRbXSB7fSApICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCB0cnVlICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHYudmFsaWRhdGUoIGZhbHNlICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggMCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3IgdjEgPSBWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIDAgKTsKKwkJVmFsaWRhdG9yIHYyID0gVmFsaWRhdG9yX2ludC5nZXQoIDEgKTsKKwkJVmFsaWRhdG9yIHYgPSBuZXcgQ29tYm9WYWxpZGF0b3IoIHYxLCB2MiApOworCisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIG5ldyBpbnRbXSB7fSApICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIHRydWUgKSApOworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCBmYWxzZSApICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCAwICkgKTsKKwkJCisJCXYgPSB2LmVsZW1lbnRWYWxpZGF0b3IoKTsKKworCQlhc3NlcnRGYWxzZSggdi52YWxpZGF0ZSggbmV3IGludFtdIHt9ICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHYudmFsaWRhdGUoIHRydWUgKSApOworCQlhc3NlcnRGYWxzZSggdi52YWxpZGF0ZSggZmFsc2UgKSApOworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCAwICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCB0ZXN0NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvciB2MSA9IFZhbGlkYXRvcl9ib29sZWFuLmdldCggMCApOworCQlWYWxpZGF0b3IgdjIgPSBWYWxpZGF0b3JfaW50LmdldCggMSApOworCQlWYWxpZGF0b3IgdiA9IG5ldyBDb21ib1ZhbGlkYXRvciggdjEsIHYyICk7CisKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggbmV3IGludFtdIHt9ICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggdHJ1ZSApICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIGZhbHNlICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHYudmFsaWRhdGUoIDAgKSApOworCQkKKwkJdiA9IHYuZWxlbWVudFZhbGlkYXRvcigpOworCisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCBuZXcgaW50W10ge30gKSApOworCQlhc3NlcnRGYWxzZSggdi52YWxpZGF0ZSggdHJ1ZSApICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCBmYWxzZSApICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIDAgKSApOworCQkKKwkJdiA9IHYuZWxlbWVudFZhbGlkYXRvcigpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3Q1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yIHYxID0gVmFsaWRhdG9yX2Jvb2xlYW4uZ2V0KCAxICk7CisJCVZhbGlkYXRvciB2MiA9IFZhbGlkYXRvcl9pbnQuZ2V0KCAxICk7CisJCVZhbGlkYXRvciB2ID0gbmV3IENvbWJvVmFsaWRhdG9yKCB2MSwgdjIgKTsKKworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCBuZXcgYm9vbGVhbltdIHt9ICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggbmV3IGludFtdIHt9ICkgKTsKKwkJCisJCXYgPSB2LmVsZW1lbnRWYWxpZGF0b3IoKTsKKworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCB0cnVlICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggZmFsc2UgKSApOworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCAwICkgKTsKKwkJCisJCXYgPSB2LmVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0RmllbGQuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjc5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0RmllbGQuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuSGFzaDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKiogVGVzdCBvZiBGaWVsZCAqLworcHVibGljIGNsYXNzIFRlc3RGaWVsZAoreworCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZmllbGRJbnRlZ2VyU3RyaW5nKCkKKwl7CisJCXRlc3RNZiggMSwgIm9uZSIgKTsKKwkJdGVzdE1mKCAyLCAidHdvIiApOworCQl0ZXN0TWYoIDMsICJ0aHJlZSIgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZpZWxkU3RyaW5nKCkKKwl7CisJCXRlc3RNZiggIm9uZSIgKTsKKwkJdGVzdE1mKCAidHdvIiApOworCQl0ZXN0TWYoICJ0aHJlZSIgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdE1mKCBpbnQgaWQsIFN0cmluZyBuYW1lICkKKwl7CisJCUZpZWxkIG1mID0gbmV3IEZpZWxkKCBpZCwgbmFtZSApOworCQlhc3NlcnRFcXVhbHMoIGlkLCBtZi5nZXRJZCgpICk7CisJCWFzc2VydEVxdWFscyggbmFtZSwgbWYuZ2V0TmFtZSgpICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RNZiggU3RyaW5nIG5hbWUgKQorCXsKKwkJRmllbGQgbWYgPSBuZXcgRmllbGQoIG5hbWUgKTsKKwkJYXNzZXJ0RXF1YWxzKCBIYXNoLmhhc2goIG5hbWUgKSwgbWYuZ2V0SWQoKSApOworCQlhc3NlcnRFcXVhbHMoIG5hbWUsIG1mLmdldE5hbWUoKSApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RGaWVsZE1hcC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVGVzdEZpZWxkTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwM2QxZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RGaWVsZE1hcC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIEZpZWxkTWFwLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEZpZWxkTWFwCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBtYWtlTmV3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmllbGRNYXAgZm0gPSBuZXcgRmllbGRNYXAoKTsKKwkJRmllbGQgZiA9IGZtLm1ha2VOZXcoICJmcmVkIiApOworCQlhc3NlcnRFcXVhbHMoIG5ldyBGaWVsZCgiZnJlZCIpLCBmICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVGVzdElkTmFtZS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVGVzdElkTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2ExZmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0SWROYW1lLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkhhc2g7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqICovCitwdWJsaWMgY2xhc3MgVGVzdElkTmFtZQoreworCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0SWQoKQorCXsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBuZXcgSWROYW1lKCAxLCAiZm9vIiApLmdldElkKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBuZXcgSWROYW1lKCAxLCAiYmFyIiApLmdldElkKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBuZXcgSWROYW1lKCAyLCAiZm9vIiApLmdldElkKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBuZXcgSWROYW1lKCAyLCAiYmFyIiApLmdldElkKCkgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldE5hbWUoKQorCXsKKwkJYXNzZXJ0RXF1YWxzKCAiZm9vIiwgbmV3IElkTmFtZSggMSwgImZvbyIgKS5nZXROYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgbmV3IElkTmFtZSggMSwgImJhciIgKS5nZXROYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZm9vIiwgbmV3IElkTmFtZSggMiwgImZvbyIgKS5nZXROYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgbmV3IElkTmFtZSggMiwgImJhciIgKS5nZXROYW1lKCkgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHh0b1N0cmluZygpCisJeworCQlhc3NlcnRFcXVhbHMoICJmb28oMSkiLCBuZXcgSWROYW1lKCAxLCAiZm9vIiApLnRvU3RyaW5nKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyKDEpIiwgbmV3IElkTmFtZSggMSwgImJhciIgKS50b1N0cmluZygpICk7CisJCWFzc2VydEVxdWFscyggImZvbygyKSIsIG5ldyBJZE5hbWUoIDIsICJmb28iICkudG9TdHJpbmcoKSApOworCQlhc3NlcnRFcXVhbHMoICJiYXIoMikiLCBuZXcgSWROYW1lKCAyLCAiYmFyIiApLnRvU3RyaW5nKCkgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGVxdWFsc09iamVjdCgpCisJeworCQlhc3NlcnRUcnVlKCBuZXcgSWROYW1lKCAxLCAiZm9vIiApLmVxdWFscyggbmV3IElkTmFtZSggMSwgImZvbyIgKSApICk7CisJCWFzc2VydFRydWUoIG5ldyBJZE5hbWUoIDEsICJiYXIiICkuZXF1YWxzKCBuZXcgSWROYW1lKCAxLCAiYmFyIiApICkgKTsKKwkJYXNzZXJ0VHJ1ZSggbmV3IElkTmFtZSggMiwgImZvbyIgKS5lcXVhbHMoIG5ldyBJZE5hbWUoIDIsICJmb28iICkgKSApOworCQlhc3NlcnRUcnVlKCBuZXcgSWROYW1lKCAyLCAiYmFyIiApLmVxdWFscyggbmV3IElkTmFtZSggMiwgImJhciIgKSApICk7CisJCQorCQlhc3NlcnRGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5lcXVhbHMoIG5ldyBJZE5hbWUoIDIsICJmb28iICkgKSApOyAvLyBpZCBjaGFuZ2VkCisJCWFzc2VydEZhbHNlKCBuZXcgSWROYW1lKCAxLCAiZm9vIiApLmVxdWFscyggbmV3IElkTmFtZSggMSwgImJhciIgKSApICk7IC8vIG5hbWUgY2hhbmdlZAorCQlhc3NlcnRGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5lcXVhbHMoIG5ldyBJZE5hbWUoIDIsICJiYXIiICkgKSApOyAvLyBpZCBhbmQgbmFtZSBjaGFuZ2VkCisJCQorCQlhc3NlcnRGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5lcXVhbHMoIG51bGwgKSApOworCQlhc3NlcnRGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5lcXVhbHMoIDEgKSApOworCQlhc3NlcnRGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKS5lcXVhbHMoIHRydWUgKSApOworCQlhc3NlcnRGYWxzZSggbmV3IElkTmFtZSggMSwgImZvbyIgKSB7fS5lcXVhbHMoIG5ldyBJZE5hbWUoIDEsICJmb28iICkge30gKSApOyAvLyBkaWZmZXJlbnQgc3ViY2xhc3NlcworCX0KKworCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgaGFzaENvZGVPYmplY3QoKQorCXsKKwkJLy8geW91IGNhbm5vdCByZWFsbHkgcHJlZGljdCB3aGVuIGhhc2hDb2RlIHdpbGwgbm90IGJlIGVxdWFsLiB0aGUKKwkJLy8gcnVsZSBpcyB0aGF0IGl0IG11c3QgYmUgZXF1YWwgd2hlbiB0aGUgb2JqZWN0cyBjb21wYXJlIGVxdWFsLgorCQlhc3NlcnRFcXVhbHMoIG5ldyBJZE5hbWUoIDEsICJmb28iICkuaGFzaENvZGUoKSwgbmV3IElkTmFtZSggMSwgImZvbyIgKS5oYXNoQ29kZSgpICk7CisJCWFzc2VydEVxdWFscyggbmV3IElkTmFtZSggMiwgImZvbyIgKS5oYXNoQ29kZSgpLCBuZXcgSWROYW1lKCAyLCAiZm9vIiApLmhhc2hDb2RlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBuZXcgSWROYW1lKCAxLCAiYmFyIiApLmhhc2hDb2RlKCksIG5ldyBJZE5hbWUoIDEsICJiYXIiICkuaGFzaENvZGUoKSApOworCQlhc3NlcnRFcXVhbHMoIG5ldyBJZE5hbWUoIDIsICJiYXIiICkuaGFzaENvZGUoKSwgbmV3IElkTmFtZSggMiwgImJhciIgKS5oYXNoQ29kZSgpICk7CisJfQorCisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBoYXNoKCkKKwl7CisJCWFzc2VydEVxdWFscyggNTM4MSwgSGFzaC5oYXNoKCAiIiApICk7CisJCWFzc2VydEVxdWFscyggMzUyOTg4MzE2LCBIYXNoLmhhc2goICJhIiApICk7CisJCWFzc2VydEVxdWFscyggMTUxMTg0ODY0NiwgSGFzaC5oYXNoKCAiYWIiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA2Njk0OTcxMTcsIEhhc2guaGFzaCggImFiYyIgKSApOworCQlhc3NlcnRFcXVhbHMoIC0xOTk0MTkwNzEzLCBIYXNoLmhhc2goICJhYmNkIiApICk7CisJCWFzc2VydEVxdWFscyggLTgwMjY4MDQxOCwgSGFzaC5oYXNoKCAiYWJjZGUiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMjY2MzA4NjgwLCBIYXNoLmhhc2goICJhYmNkZWYiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMzc5MzcyNTEzLCBIYXNoLmhhc2goICJhYmNkZWZnIiApICk7CisJCWFzc2VydEVxdWFscyggLTE0MTY5NjcxNTksIEhhc2guaGFzaCggImFiY2RlZmdoIiApICk7CisJCWFzc2VydEVxdWFscyggNTM1NTY4OTYsIEhhc2guaGFzaCggImFiY2RlZmdoaSIgKSApOworCQlhc3NlcnRFcXVhbHMoIC00NDI3MzE4LCBIYXNoLmhhc2goICJhYmNkZWZnaGlqIiApICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVGVzdElkTmFtZU1hcC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVGVzdElkTmFtZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWU4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0SWROYW1lTWFwLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKiogKi8KK3B1YmxpYyBjbGFzcyBUZXN0SWROYW1lTWFwCit7CisJLyoqICovCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGluaXQoKQorCXsKKwkJbWFwID0gbmV3IElkTmFtZU1hcDxJZE5hbWU+KCkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSWROYW1lIG1ha2VOZXcoIFN0cmluZyBuYW1lICkKKwkJCXsKKwkJCQlyZXR1cm4gbmV3IElkTmFtZSggbmFtZSApOworCQkJfQorCQl9OworCQkKKwkJYSA9IG1hcC5hZGQoIG5ldyBJZE5hbWUoIDEsICJhIiApICk7CisJCWIgPSBtYXAuYWRkKCBuZXcgSWROYW1lKCAyLCAiYiIgKSApOworCX0KKwkKKwlwcml2YXRlIElkTmFtZU1hcDxJZE5hbWU+IG1hcDsKKwkKKwlwcml2YXRlIElkTmFtZSBhOworCQorCXByaXZhdGUgSWROYW1lIGI7CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrX2EoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDIsIG1hcC5zaXplKCkgKTsKKwkJY2hlY2soICJhIiwgMSwgYSApOworCQlhc3NlcnRFcXVhbHMoIDIsIG1hcC5zaXplKCkgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrKCBTdHJpbmcgbmFtZSwgaW50IGlkLCBJZE5hbWUgaWROYW1lICkKKwl7CisJCUlkTmFtZSB4ID0gbWFwLmdldCggaWQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggeCApOworCQlhc3NlcnRTYW1lKCBpZE5hbWUsIHggKTsKKwkJYXNzZXJ0RXF1YWxzKCBpZCwgeC5nZXRJZCgpICk7CisJCWFzc2VydEVxdWFscyggbmFtZSwgeC5nZXROYW1lKCkgKTsKKwkJCisJCXggPSBtYXAuZ2V0KCBuYW1lICk7CisJCWFzc2VydE5vdE51bGwoIHggKTsKKwkJYXNzZXJ0U2FtZSggaWROYW1lLCB4ICk7CisJCWFzc2VydEVxdWFscyggaWQsIHguZ2V0SWQoKSApOworCQlhc3NlcnRFcXVhbHMoIG5hbWUsIHguZ2V0TmFtZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tfYigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMiwgbWFwLnNpemUoKSApOworCQljaGVjayggImIiLCAyLCBiICk7CisJCWFzc2VydEVxdWFscyggMiwgbWFwLnNpemUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldF8zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBtYXAuc2l6ZSgpICk7CisJCUlkTmFtZSB4ID0gbWFwLmdldCggMyApOworCQlhc3NlcnROdWxsKCB4ICk7CisJCWFzc2VydEVxdWFscyggMiwgbWFwLnNpemUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldF8zX2xvY2tlZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMiwgbWFwLnNpemUoKSApOworCQltYXAubG9jaygpOworCQlJZE5hbWUgeCA9IG1hcC5nZXQoIDMgKTsKKwkJYXNzZXJ0TnVsbCggeCApOworCQlhc3NlcnRFcXVhbHMoIDIsIG1hcC5zaXplKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRfYygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMiwgbWFwLnNpemUoKSApOworCQlJZE5hbWUgYyA9IG1hcC5nZXQoICJjIiApOworCQljaGVjayggImMiLCAzNTI5ODgzMTgsIGMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBtYXAuc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0X2RfbG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBtYXAuc2l6ZSgpICk7CisJCW1hcC5sb2NrKCk7CisJCUlkTmFtZSBkID0gbWFwLmdldCggImQiICk7CisJCWFzc2VydE51bGwoIGQgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBtYXAuc2l6ZSgpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBhZGRfM19jX2xvY2tlZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMiwgbWFwLnNpemUoKSApOworCQltYXAubG9jaygpOworCQltYXAuYWRkKCBuZXcgSWROYW1lKCAzLCAiYyIgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIG1hcC5zaXplKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkPUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgYWRkX2lkX2NvbGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDIsIG1hcC5zaXplKCkgKTsKKwkJbWFwLmFkZCggbmV3IElkTmFtZSggMSwgImMiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBtYXAuc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFkZF9uYW1lX2NvbGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDIsIG1hcC5zaXplKCkgKTsKKwkJbWFwLmFkZCggbmV3IElkTmFtZSggMywgImEiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBtYXAuc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFkZF9pZF9uYW1lX2NvbGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDIsIG1hcC5zaXplKCkgKTsKKwkJbWFwLmFkZCggbmV3IElkTmFtZSggMSwgImEiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBtYXAuc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsdWVzMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNldDxJZE5hbWU+IGFjdHVhbCA9IG1hcC52YWx1ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBhY3R1YWwuc2l6ZSgpICk7CisJCVNldDxJZE5hbWU+IGV4cGVjdGVkID0gbmV3IEhhc2hTZXQ8SWROYW1lPigpOworCQlleHBlY3RlZC5hZGQoIG5ldyBJZE5hbWUoIDEsICJhIiApICk7CisJCWV4cGVjdGVkLmFkZCggbmV3IElkTmFtZSggMiwgImIiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBleHBlY3RlZCwgYWN0dWFsICk7CisJCQorCQltYXAuZ2V0KCAiYyIgKTsKKwkJCisJCWFjdHVhbCA9IG1hcC52YWx1ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBhY3R1YWwuc2l6ZSgpICk7CisJCWV4cGVjdGVkID0gbmV3IEhhc2hTZXQ8SWROYW1lPigpOworCQlleHBlY3RlZC5hZGQoIG5ldyBJZE5hbWUoIDEsICJhIiApICk7CisJCWV4cGVjdGVkLmFkZCggbmV3IElkTmFtZSggMiwgImIiICkgKTsKKwkJZXhwZWN0ZWQuYWRkKCBuZXcgSWROYW1lKCAiYyIgKSApOworCQlhc3NlcnRFcXVhbHMoIGV4cGVjdGVkLCBhY3R1YWwgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWx1ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29kZSBpbiB2YWx1ZSBmYWN0b3J5IGRlcGVuZHMgdXBvbiB0aGUgZmFjdCB0aGF0IHRoZQorCQkvLyBzZXQgcmV0dXJuZWQgZnJvbSB2YWx1ZXMgaXMgYSBjb3B5LgorCQlhc3NlcnROb3RTYW1lKCBtYXAudmFsdWVzKCksIG1hcC52YWx1ZXMoKSApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RNZXNzYWdlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTEwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuRHVtbXlWYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfaW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmc7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0cyBNZXNzYWdlLgorICovCitwdWJsaWMgY2xhc3MgVGVzdE1lc3NhZ2UKK3sKKwlwcml2YXRlIGZpbmFsIE15VmFsdWVGYWN0b3J5IHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCk7CisJcHJpdmF0ZSBmaW5hbCBUeXBlIG10MSA9IG5ldyBUeXBlKCAxLCAibXQiICk7CisJcHJpdmF0ZSBmaW5hbCBUeXBlIHJtdCA9IG5ldyBUeXBlKCAyLCAicm10IiApOworCXByaXZhdGUgZmluYWwgRmllbGQgbWYxID0gbmV3IEZpZWxkKCAzLCAieCIgKTsKKwlwcml2YXRlIGZpbmFsIEZpZWxkIG1mMiA9IG5ldyBGaWVsZCggNCwgInkiICk7CisJCisJeworCQltdDEucHV0VmFsaWRhdG9yKCBtZjEsIFZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJbXQxLnB1dFZhbGlkYXRvciggbWYyLCBWYWxpZGF0b3JfaW50LmdldCggMCApICk7CisJCW10MS5wdXRWYWxpZGF0b3IoIHZmLm1mX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKwkJCisJCXJtdC5wdXRWYWxpZGF0b3IoIHZmLm1mX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKwkJcm10LnB1dFZhbGlkYXRvciggdmYubWZfaW5SZXBseVRvLCBWYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCX0KKwkKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFZmKCkKKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10MSwgdmYgKTsKKwkJYXNzZXJ0U2FtZSggdmYsIG1zZy52ZigpICk7CisJfQorCisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZXBseSgpCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBtdDEsIHZmICk7CisJCW1zZy5zZXRNZXNzYWdlSWQoIDEyMzQ1TCApOworCisJCU1lc3NhZ2Ugcm1zZyA9IG1zZy5yZXBseSggcm10ICk7CisJCWFzc2VydFNhbWUoIHJtdCwgcm1zZy50eXBlKCkgKTsKKwkJYXNzZXJ0U2FtZSggdmYsIHJtc2cudmYoKSApOworCQlhc3NlcnRFcXVhbHMoIDEyMzQ1TCwgcm1zZy5nZXRJblJlcGx5VG8oKSApOworCX0KKworCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0TWVzc2FnZUlkKCkKKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10MSwgdmYgKTsKKwkJYXNzZXJ0TnVsbCggbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCW1zZy5zZXRNZXNzYWdlSWQoIDIzNEwgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMzRMLCBtc2cuZ2V0TWVzc2FnZUlkKCkgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZCgpCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBtdDEsIHZmICk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRNZXNzYWdlSWQoKSApOworCQltc2cuc2V0TWVzc2FnZUlkKCAyMzRMICk7CisJCWFzc2VydEVxdWFscyggMjM0TCwgbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCW1zZy5zZXRNZXNzYWdlSWQoIDM0NUwgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzNDVMLCBtc2cuZ2V0TWVzc2FnZUlkKCkgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEluUmVwbHlUbygpCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBybXQsIHZmICk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQltc2cuc2V0SW5SZXBseVRvKCAyMzRMICk7CisJCWFzc2VydEVxdWFscyggMjM0TCwgbXNnLmdldEluUmVwbHlUbygpICk7CisJfQorCisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXRJblJlcGx5VG8oKQorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggcm10LCB2ZiApOworCQlhc3NlcnROdWxsKCBtc2cuZ2V0SW5SZXBseVRvKCkgKTsKKwkJbXNnLnNldEluUmVwbHlUbyggMjM0TCApOworCQlhc3NlcnRFcXVhbHMoIDIzNEwsIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQltc2cuc2V0SW5SZXBseVRvKCAzNDVMICk7CisJCWFzc2VydEVxdWFscyggMzQ1TCwgbXNnLmdldEluUmVwbHlUbygpICk7CisJfQorCisJLyoqICovCisJc3RhdGljIGNsYXNzIE15VmFsdWVGYWN0b3J5IGV4dGVuZHMgRHVtbXlWYWx1ZUZhY3RvcnkKKwl7CisJCS8vLy8vLy8vLy8vLy8vLworCQkvLyBNRVNTQUdFSUQgLy8KKwkJLy8vLy8vLy8vLy8vLy8vCisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIExvbmcgZ2V0TWVzc2FnZUlkKCBNZXNzYWdlIG1zZyApCisJCXsKKwkJCXJldHVybiAoTG9uZykgbXNnLmdldCggbWZfbWVzc2FnZUlkICk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2V0TWVzc2FnZUlkKCBNZXNzYWdlIG1zZywgTG9uZyBtc2dpZCApCisJCXsKKwkJCW1zZy5wdXQoIG1mX21lc3NhZ2VJZCwgbXNnaWQgKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRmllbGQgZ2V0X21mX19tZXNzYWdlSWQoKQorCQl7CisJCQlyZXR1cm4gbWZfbWVzc2FnZUlkOworCQl9CisKKwkJLyoqICovCisJCXB1YmxpYyBmaW5hbCBGaWVsZCBtZl9tZXNzYWdlSWQgPSBuZXcgRmllbGQoICJfbWVzc2FnZUlkIiApOworCisJCS8vLy8vLy8vLy8vLy8vLworCQkvLyBJTlJFUExZVE8gLy8KKwkJLy8vLy8vLy8vLy8vLy8vCisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIExvbmcgZ2V0SW5SZXBseVRvKCBNZXNzYWdlIG1zZyApCisJCXsKKwkJCXJldHVybiAoTG9uZykgbXNnLmdldCggbWZfaW5SZXBseVRvICk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2V0SW5SZXBseVRvKCBNZXNzYWdlIG1zZywgTG9uZyBtc2dpZCApCisJCXsKKwkJCW1zZy5wdXQoIG1mX2luUmVwbHlUbywgbXNnaWQgKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRmllbGQgZ2V0X21mX19pblJlcGx5VG8oKQorCQl7CisJCQlyZXR1cm4gbWZfaW5SZXBseVRvOworCQl9CisKKwkJLyoqICovCisJCXB1YmxpYyBmaW5hbCBGaWVsZCBtZl9pblJlcGx5VG8gPSBuZXcgRmllbGQoICJfaW5SZXBseVRvIiApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RTdHJ1Y3RWYWx1ZS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9tc2cvVGVzdFN0cnVjdFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5OTkyYgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RTdHJ1Y3RWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMzYzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkR1bW15VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2Jvb2xlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfaW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX3N0cmluZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKiogVGVzdHMgU3RydWN0VmFsdWUgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3RydWN0VmFsdWUKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQorCXByaXZhdGUgVHlwZSBtdDEgPSBuZXcgVHlwZSggIm9uZSIgKTsKKwlwcml2YXRlIFR5cGUgbXQyID0gbmV3IFR5cGUoICJ0d28iICk7CisJcHJpdmF0ZSBGaWVsZCBtZjEgPSBuZXcgRmllbGQoICJmMSIgKTsKKwlwcml2YXRlIEZpZWxkIG1mMiA9IG5ldyBGaWVsZCggImYyIiApOworCXByaXZhdGUgRmllbGQgbWYzID0gbmV3IEZpZWxkKCAiZjMiICk7CisJcHJpdmF0ZSBGaWVsZCBtZjQgPSBuZXcgRmllbGQoICJmNCIgKTsKKwlwcml2YXRlIEZpZWxkIG1mNSA9IG5ldyBGaWVsZCggImY1IiApOworCXByaXZhdGUgRmllbGQgbWY2ID0gbmV3IEZpZWxkKCAiZjYiICk7CisKKwl7CisJCW10MS5wdXRWYWxpZGF0b3IoIG1mMSwgVmFsaWRhdG9yX2Jvb2xlYW4uZ2V0KCAwICkgKTsKKwkJbXQxLnB1dFZhbGlkYXRvciggbWYyLCBWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIDEgKSApOworCQltdDEucHV0VmFsaWRhdG9yKCBtZjMsIFZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJbXQxLnB1dFZhbGlkYXRvciggbWY0LCBWYWxpZGF0b3JfaW50LmdldCggMSApICk7CisJCW10MS5wdXRWYWxpZGF0b3IoIG1mNSwgVmFsaWRhdG9yX3N0cmluZy5nZXQoIDAgKSApOworCQltdDEucHV0VmFsaWRhdG9yKCBtZjYsIFZhbGlkYXRvcl9zdHJpbmcuZ2V0KCAxICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3Qyc3RyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJYXNzZXJ0RXF1YWxzKCAib25lKDc4NTk0NTM3Nyk6IHt9Iiwgc3YudG9TdHJpbmcoKSApOworCisJCXN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDIsIHZmICk7CisJCWFzc2VydEVxdWFscyggInR3byg4Mjc4NDMzMDMpOiB7fSIsIHN2LnRvU3RyaW5nKCkgKTsKKworCQlzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlzdi5wdXQoIG1mMSwgdHJ1ZSApOworCQlhc3NlcnRFcXVhbHMoICJvbmUoNzg1OTQ1Mzc3KToge2YxKDE1MTIxNzY1OTIpPXRydWV9Iiwgc3YudG9TdHJpbmcoKSApOworCisJCXN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCXN2LnB1dCggbWYzLCAyMyApOworCQlhc3NlcnRFcXVhbHMoICJvbmUoNzg1OTQ1Mzc3KToge2YzKDE1MTIxNzY1OTQpPTIzfSIsIHN2LnRvU3RyaW5nKCkgKTsKKworCQlzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlzdi5wdXQoIG1mMSwgZmFsc2UgKTsKKwkJc3YucHV0KCBtZjMsIDc0ICk7CisJCWFzc2VydFRydWUoIm9uZSg3ODU5NDUzNzcpOiB7ZjEoMTUxMjE3NjU5Mik9ZmFsc2UsIGYzKDE1MTIxNzY1OTQpPTc0fSIuZXF1YWxzKHN2LnRvU3RyaW5nKCkpIHx8CisJCQkib25lKDc4NTk0NTM3Nyk6IHtmMygxNTEyMTc2NTk0KT03NCwgZjEoMTUxMjE3NjU5Mik9ZmFsc2V9Ii5lcXVhbHMoc3YudG9TdHJpbmcoKSkpOworCX0KKworCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0VHlwZSgpCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlhc3NlcnRTYW1lKCBtdDEsIHN2LnR5cGUoKSApOworCisJCXN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDIsIHZmICk7CisJCWFzc2VydFNhbWUoIG10Miwgc3YudHlwZSgpICk7CisJfQorCisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpc1R5cGUoKQorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJYXNzZXJ0VHJ1ZSggc3YuaXNUeXBlKCBtdDEgKSApOworCQlhc3NlcnRGYWxzZSggc3YuaXNUeXBlKCBtdDIgKSApOworCisJCXN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDIsIHZmICk7CisJCWFzc2VydFRydWUoIHN2LmlzVHlwZSggbXQyICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHN2LmlzVHlwZSggbXQxICkgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrVHlwZTEoKQorCXsKKwkJbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICkuY2hlY2tUeXBlKCBtdDEgKTsKKwkJbmV3IFN0cnVjdFZhbHVlKCBtdDIsIHZmICkuY2hlY2tUeXBlKCBtdDIgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNoZWNrVHlwZTIoKQorCXsKKwkJbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICkuY2hlY2tUeXBlKCBtdDIgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNoZWNrVHlwZSgpCisJeworCQluZXcgU3RydWN0VmFsdWUoIG10MiwgdmYgKS5jaGVja1R5cGUoIG10MSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJYXNzZXJ0VHJ1ZSggc3YuaXNFbXB0eSgpICk7CisJCWFzc2VydEVxdWFscyggMCwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydE51bGwoIHN2LmdldCggbWYxICkgKTsKKworCQlzdi5wdXQoIG1mMSwgdHJ1ZSApOworCQlhc3NlcnRGYWxzZSggc3YuaXNFbXB0eSgpICk7CisJCWFzc2VydEVxdWFscyggMSwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggdHJ1ZSwgc3YuZ2V0KCBtZjEgKSApOworCisJCXN2LnB1dCggbWYxLCBmYWxzZSApOworCQlhc3NlcnRGYWxzZSggc3YuaXNFbXB0eSgpICk7CisJCWFzc2VydEVxdWFscyggMSwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggZmFsc2UsIHN2LmdldCggbWYxICkgKTsKKworCQlzdi5wdXQoIG1mMSwgbnVsbCApOworCQlhc3NlcnRUcnVlKCBzdi5pc0VtcHR5KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBzdi5zaXplKCkgKTsKKwkJYXNzZXJ0TnVsbCggc3YuZ2V0KCBtZjEgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJYXNzZXJ0VHJ1ZSggc3YuaXNFbXB0eSgpICk7CisJCWFzc2VydEVxdWFscyggMCwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydE51bGwoIHN2LmdldCggbWYxICkgKTsKKworCQlzdi5yZW1vdmUoIG1mMSApOworCQlhc3NlcnRUcnVlKCBzdi5pc0VtcHR5KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBzdi5zaXplKCkgKTsKKwkJYXNzZXJ0TnVsbCggc3YuZ2V0KCBtZjEgKSApOworCisJCXN2LnB1dCggbWYxLCB0cnVlICk7CisJCWFzc2VydEZhbHNlKCBzdi5pc0VtcHR5KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzdi5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0cnVlLCBzdi5nZXQoIG1mMSApICk7CisKKwkJc3YucmVtb3ZlKCBtZjEgKTsKKwkJYXNzZXJ0VHJ1ZSggc3YuaXNFbXB0eSgpICk7CisJCWFzc2VydEVxdWFscyggMCwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydE51bGwoIHN2LmdldCggbWYxICkgKTsKKworCQlzdi5yZW1vdmUoIG1mMSApOworCQlhc3NlcnRUcnVlKCBzdi5pc0VtcHR5KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBzdi5zaXplKCkgKTsKKwkJYXNzZXJ0TnVsbCggc3YuZ2V0KCBtZjEgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCXN2LnB1dCggbWYxLCBmYWxzZSApOworCQlzdi5wdXQoIG1mMiwgbmV3IGJvb2xlYW5bXSB7IHRydWUsIGZhbHNlIH0gKTsKKwkJc3YucHV0KCBtZjMsIDEgKTsKKwkJc3YucHV0KCBtZjQsIG5ldyBpbnRbXSB7IDEsIDIgfSApOworCQlzdi5wdXQoIG1mNSwgImEiICk7CisJCXN2LnB1dCggbWY2LCBuZXcgU3RyaW5nW10geyAiYSIsICJiIiB9ICk7CisJCWFzc2VydEVxdWFscyggNiwgc3Yuc2l6ZSgpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJc3YucHV0KCBtZjEsIG51bGwgKTsKKwkJc3YucHV0KCBtZjIsIG51bGwgKTsKKwkJc3YucHV0KCBtZjMsIG51bGwgKTsKKwkJc3YucHV0KCBtZjQsIG51bGwgKTsKKwkJc3YucHV0KCBtZjUsIG51bGwgKTsKKwkJc3YucHV0KCBtZjYsIG51bGwgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBzdi5zaXplKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlzdi5wdXQoIG1mMSwgZmFsc2UgKTsKKwkJc3YucHV0KCBtZjIsIG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSB9ICk7CisJCXN2LnB1dCggbWYzLCAxICk7CisJCXN2LnB1dCggbWY0LCBuZXcgaW50W10geyAxLCAyIH0gKTsKKwkJc3YucHV0KCBtZjUsICJhIiApOworCQlzdi5wdXQoIG1mNiwgbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIgfSApOworCQlhc3NlcnRFcXVhbHMoIDYsIHN2LnNpemUoKSApOworCisJCS8vIG5vdyAicmVtb3ZlIiB0aGVtIGFsbAorCisJCXN2LnB1dCggbWYxLCBudWxsICk7CisJCXN2LnB1dCggbWYyLCBudWxsICk7CisJCXN2LnB1dCggbWYzLCBudWxsICk7CisJCXN2LnB1dCggbWY0LCBudWxsICk7CisJCXN2LnB1dCggbWY1LCBudWxsICk7CisJCXN2LnB1dCggbWY2LCBudWxsICk7CisJCWFzc2VydEVxdWFscyggMCwgc3Yuc2l6ZSgpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJc3YucHV0KCBtZjEsIChieXRlKSAxICk7IC8vIHdyb25nIHR5cGUKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlzdi5wdXQoIG1mMSwgKHNob3J0KSAxICk7IC8vIHdyb25nIHR5cGUKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlzdi5wdXQoIG1mMSwgMSApOyAvLyB3cm9uZyB0eXBlCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ4KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJc3YucHV0KCBtZjEsIChsb25nKSAxICk7IC8vIHdyb25nIHR5cGUKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlzdi5wdXQoIG1mMSwgKGZsb2F0KSAxLjIgKTsgLy8gd3JvbmcgdHlwZQorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcHV0MTAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggbXQxLCB2ZiApOworCQlzdi5wdXQoIG1mMSwgMS4yICk7IC8vIHdyb25nIHR5cGUKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIG10MSwgdmYgKTsKKwkJc3YucHV0KCBtZjEsICJhIiApOyAvLyB3cm9uZyB0eXBlCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXQxMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCXN2LnB1dCggbWYyLCBudWxsICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXQxMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCXN2LnB1dCggbWYyLCBuZXcgYm9vbGVhbltdIHt9ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQxNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCXN2LnB1dCggbWYyLCB0cnVlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQxNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCXN2LnB1dCggbWYyLCBuZXcgYm9vbGVhbltdW10ge30gKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGl0ZXJhdG9yKCkKKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBtdDEsIHZmICk7CisJCWFzc2VydEZhbHNlKCBzdi5pdGVyYXRvcigpLmhhc05leHQoKSApOworCisJCXN2LnB1dCggbWYxLCB0cnVlICk7CisKKwkJSXRlcmF0b3I8TWFwLkVudHJ5PEZpZWxkLCBPYmplY3Q+PiBpID0gc3YuaXRlcmF0b3IoKTsKKwkJYXNzZXJ0VHJ1ZSggaS5oYXNOZXh0KCkgKTsKKwkJTWFwLkVudHJ5PEZpZWxkLCBPYmplY3Q+IG1lID0gaS5uZXh0KCk7CisJCWFzc2VydFNhbWUoIG1mMSwgbWUuZ2V0S2V5KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0cnVlLCBtZS5nZXRWYWx1ZSgpICk7CisJCWFzc2VydEZhbHNlKCBpLmhhc05leHQoKSApOworCisJCU1hcDxGaWVsZCwgT2JqZWN0PiB2YWxzID0gbmV3IEhhc2hNYXA8RmllbGQsIE9iamVjdD4oKTsKKwkJdmFscy5wdXQoIG1mMSwgdHJ1ZSApOworCQl2YWxzLnB1dCggbWYzLCAyICk7CisJCXZhbHMucHV0KCBtZjUsICJhIiApOworCisJCXN2LnB1dCggbWYzLCAyICk7CisJCXN2LnB1dCggbWY1LCAiYSIgKTsKKworCQlpID0gc3YuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGkuaGFzTmV4dCgpKQorCQl7CisJCQltZSA9IGkubmV4dCgpOworCQkJRmllbGQga2V5ID0gbWUuZ2V0S2V5KCk7CisJCQlhc3NlcnRUcnVlKCB2YWxzLmNvbnRhaW5zS2V5KCBrZXkgKSApOworCQkJYXNzZXJ0RXF1YWxzKCB2YWxzLnJlbW92ZSgga2V5ICksIG1lLmdldFZhbHVlKCkgKTsKKwkJfQorCQlhc3NlcnRUcnVlKCB2YWxzLmlzRW1wdHkoKSApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RUeXBlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjI2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2ludDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5IYXNoOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiAqLworcHVibGljIGNsYXNzIFRlc3RUeXBlCit7CisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0eXBlSW50ZWdlclN0cmluZygpCisJeworCQl0ZXN0TXQoIDEsICJvbmUiICk7CisJCXRlc3RNdCggMiwgInR3byIgKTsKKwkJdGVzdE10KCAzLCAidGhyZWUiICk7CisJfQorCisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0eXBlU3RyaW5nKCkKKwl7CisJCXRlc3RNdCggIm9uZSIgKTsKKwkJdGVzdE10KCAidHdvIiApOworCQl0ZXN0TXQoICJ0aHJlZSIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWxpZGF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUeXBlIHQgPSBuZXcgVHlwZSggInQiICk7CisJCUZpZWxkIGYgPSBuZXcgRmllbGQoICJmIiApOworCQlGaWVsZCBnID0gbmV3IEZpZWxkKCAiZyIgKTsKKwkJVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfaW50LmdldCggMCApOworCQkKKwkJdC5wdXRWYWxpZGF0b3IoIGYsIHYgKTsKKwkJCisJCWFzc2VydFNhbWUoIHYsIHQuZ2V0VmFsaWRhdG9yKCBmICkgKTsKKwkJYXNzZXJ0TnVsbCggdC5nZXRWYWxpZGF0b3IoIGcgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1dFZhbGlkYXRvck51bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUeXBlIHQgPSBuZXcgVHlwZSggInQiICk7CisJCUZpZWxkIGYgPSBuZXcgRmllbGQoICJmIiApOworCQlWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9pbnQuZ2V0KCAwICk7CisKKwkJYXNzZXJ0TnVsbCggdC5nZXRWYWxpZGF0b3IoIGYgKSApOworCQkKKwkJdC5wdXRWYWxpZGF0b3IoIGYsIG51bGwgKTsKKwkJYXNzZXJ0TnVsbCggdC5nZXRWYWxpZGF0b3IoIGYgKSApOworCQkKKwkJdC5wdXRWYWxpZGF0b3IoIGYsIHYgKTsKKwkJYXNzZXJ0U2FtZSggdiwgdC5nZXRWYWxpZGF0b3IoIGYgKSApOworCQkKKwkJdC5wdXRWYWxpZGF0b3IoIGYsIHYgKTsKKwkJYXNzZXJ0U2FtZSggQ29tYm9WYWxpZGF0b3IuY2xhc3MsIHQuZ2V0VmFsaWRhdG9yKCBmICkuZ2V0Q2xhc3MoKSApOworCQkKKwkJdC5jbGVhclZhbGlkYXRvciggZiApOworCQlhc3NlcnROdWxsKCB0LmdldFZhbGlkYXRvciggZiApICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RNdCggaW50IGlkLCBTdHJpbmcgbmFtZSApCisJeworCQlUeXBlIG10ID0gbmV3IFR5cGUoIGlkLCBuYW1lICk7CisJCWFzc2VydEVxdWFscyggaWQsIG10LmdldElkKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBuYW1lLCBtdC5nZXROYW1lKCkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdE10KCBTdHJpbmcgbmFtZSApCisJeworCQlUeXBlIG10ID0gbmV3IFR5cGUoIG5hbWUgKTsKKwkJYXNzZXJ0RXF1YWxzKCBIYXNoLmhhc2goIG5hbWUgKSwgbXQuZ2V0SWQoKSApOworCQlhc3NlcnRFcXVhbHMoIG5hbWUsIG10LmdldE5hbWUoKSApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvbXNnL1Rlc3RUeXBlTWFwLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0VHlwZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYmQ2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL21zZy9UZXN0VHlwZU1hcC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2c7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIFR5cGVNYXAuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VHlwZU1hcAoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbWFrZU5ldygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVR5cGVNYXAgdG0gPSBuZXcgVHlwZU1hcCgpOworCQlUeXBlIHQgPSB0bS5tYWtlTmV3KCAibWFyeSIgKTsKKwkJYXNzZXJ0RXF1YWxzKCBuZXcgVHlwZSggIm1hcnkiICksIHQgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdEF1dGhFeGNlcHRpb25TZXJpYWxpemVyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdEF1dGhFeGNlcHRpb25TZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlZDI1MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0QXV0aEV4Y2VwdGlvblNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBBdXRoRXhjZXB0aW9uU2VyaWFsaXplcgorICovCitwdWJsaWMgY2xhc3MgVGVzdEF1dGhFeGNlcHRpb25TZXJpYWxpemVyCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlASWdub3JlCisJcHVibGljIHZvaWQgbm90aGluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gd3JpdGUgc29tZSB1bml0IHRlc3RzIGZvciBBdXRoRXhjZXB0aW9uU2VyaWFsaXplci4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdENsYXNzMlR5cGVNYXAuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0Q2xhc3MyVHlwZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OGE4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdENsYXNzMlR5cGVNYXAuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBDbGFzczJUeXBlTWFwCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q2xhc3MyVHlwZU1hcAoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIG5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBUT0RPIHdyaXRlIHNvbWUgdW5pdCB0ZXN0cyBmb3IgVGVzdENsYXNzMlR5cGUuCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3REZWZhdWx0U2VydmVyRmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3REZWZhdWx0U2VydmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDRhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdERlZmF1bHRTZXJ2ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qgb2YgRGVmYXVsdFNlcnZlckZhY3RvcnkKKyAqLworcHVibGljIGNsYXNzIFRlc3REZWZhdWx0U2VydmVyRmFjdG9yeQoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIG5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBUT0RPIHdyaXRlIHNvbWUgdW5pdCB0ZXN0cyBmb3IgRGVmYXVsdFNlcnZlckZhY3RvcnkuCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3REZWZhdWx0VmFsdWVGYWN0b3J5LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdERlZmF1bHRWYWx1ZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFmNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3REZWZhdWx0VmFsdWVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NDUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGVNYXA7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqIFRlc3QgRGVmYXVsdFZhbHVlRmFjdG9yeSAqLworcHVibGljIGNsYXNzIFRlc3REZWZhdWx0VmFsdWVGYWN0b3J5Cit7CisJcHJpdmF0ZSBNeVZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBNeVZhbHVlRmFjdG9yeSggInRjcDoiICk7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTZXQ8VHlwZT4gZVR5cGVzID0gbWtUeXBlU2V0KAorCQkJdmYuZ2V0VHlwZSggIl9FdGNoX1J1bnRpbWVFeGNlcHRpb24iICksCisJCQl2Zi5nZXRUeXBlKCAiX0V0Y2hfTGlzdCIgKSwKKwkJCXZmLmdldFR5cGUoICJfRXRjaF9NYXAiICksCisJCQl2Zi5nZXRUeXBlKCAiX0V0Y2hfU2V0IiApLAorCQkJdmYuZ2V0VHlwZSggIl9FdGNoX0RhdGV0aW1lIiApLAorCQkJdmYuZ2V0VHlwZSggIl9FdGNoX0F1dGhFeGNlcHRpb24iICksCisJCQl2Zi5nZXRUeXBlKCAiX2V4Y2VwdGlvbiIgKSwKKwkJCU15VmFsdWVGYWN0b3J5Ll9tdF94LAorCQkJTXlWYWx1ZUZhY3RvcnkuX210X3kKKwkJKTsKKwkJCisJCWFzc2VydEVxdWFscyggZVR5cGVzLCB2Zi5nZXRUeXBlcygpICk7CisJCQorCQlmb3IgKFR5cGUgdDogZVR5cGVzKQorCQkJdGVzdFR5cGUoIHQgKTsKKwl9CisJCisJcHJpdmF0ZSBTZXQ8VHlwZT4gbWtUeXBlU2V0KCBUeXBlIC4uLiB0eXBlcyApCisJeworCQlTZXQ8VHlwZT4gc2V0ID0gbmV3IEhhc2hTZXQ8VHlwZT4oKTsKKwkJZm9yIChUeXBlIHQ6IHR5cGVzKQorCQkJc2V0LmFkZCggdCApOworCQlyZXR1cm4gc2V0OworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFR5cGUoIFR5cGUgdHlwZSApCisJeworCQlhc3NlcnRTYW1lKCB0eXBlLCB2Zi5nZXRUeXBlKCB0eXBlLmdldElkKCkgKSApOworCQlhc3NlcnRTYW1lKCB0eXBlLCB2Zi5nZXRUeXBlKCB0eXBlLmdldE5hbWUoKSApICk7CisJfQorCQorCXByaXZhdGUgU2V0PEZpZWxkPiBta0ZpZWxkU2V0KCBGaWVsZCAuLi4gZmllbGRzICkKKwl7CisJCVNldDxGaWVsZD4gc2V0ID0gbmV3IEhhc2hTZXQ8RmllbGQ+KCk7CisJCWZvciAoRmllbGQgZjogZmllbGRzICkKKwkJCXNldC5hZGQoIGYgKTsKKwkJcmV0dXJuIHNldDsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X0V0Y2hfUnVudGltZUV4Y2VwdGlvbl9maWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0VHlwZUZpZWxkcygKKwkJCXZmLmdldFR5cGUoICJfRXRjaF9SdW50aW1lRXhjZXB0aW9uIiApLAorCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfbXNnCisJCSk7CisJCQorCQl0ZXN0VHlwZUZpZWxkKAorCQkJdmYuZ2V0VHlwZSggIl9FdGNoX1J1bnRpbWVFeGNlcHRpb24iICksCisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9tc2csCisJCQkiYWJjIgorCQkpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RfRXRjaF9SdW50aW1lRXhjZXB0aW9uX21zZ19iYWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RUeXBlRmllbGQoCisJCQl2Zi5nZXRUeXBlKCAiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIgKSwKKwkJCURlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZywKKwkJCTEyMworCQkpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RfRXRjaF9SdW50aW1lRXhjZXB0aW9uX2JhZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFR5cGVGaWVsZCgKKwkJCXZmLmdldFR5cGUoICJfRXRjaF9SdW50aW1lRXhjZXB0aW9uIiApLAorCQkJTXlWYWx1ZUZhY3RvcnkuX21mX2EsCisJCQkiYWJjIgorCQkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFR5cGVGaWVsZCggVHlwZSB0eXBlLCBGaWVsZCBmaWVsZCwgT2JqZWN0IHZhbHVlICkKKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIHR5cGUsIHZmICk7CisJCW1zZy5wdXQoIGZpZWxkLCB2YWx1ZSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFR5cGVGaWVsZHMoIFR5cGUgdHlwZSwgRmllbGQgLi4uIGZpZWxkcyApCisJeworCQlTZXQ8RmllbGQ+IGFGaWVsZHMgPSB0eXBlLmdldEZpZWxkcygpOworCQlTZXQ8RmllbGQ+IGVGaWVsZHMgPSBta0ZpZWxkU2V0KCBmaWVsZHMgKTsKKwkJYXNzZXJ0RXF1YWxzKCBlRmllbGRzLCBhRmllbGRzICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdF9FdGNoX0F1dGhFeGNlcHRpb25fZmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFR5cGVGaWVsZHMoCisJCQl2Zi5nZXRUeXBlKCAiX0V0Y2hfQXV0aEV4Y2VwdGlvbiIgKSwKKwkJCURlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZworCQkpOworCQkKKwkJdGVzdFR5cGVGaWVsZCgKKwkJCXZmLmdldFR5cGUoICJfRXRjaF9BdXRoRXhjZXB0aW9uIiApLAorCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfbXNnLAorCQkJImFiYyIKKwkJKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCB0ZXN0X0V0Y2hfQXV0aEV4Y2VwdGlvbl9tc2dfYmFkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0VHlwZUZpZWxkKAorCQkJdmYuZ2V0VHlwZSggIl9FdGNoX0F1dGhFeGNlcHRpb24iICksCisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9tc2csCisJCQkxMjMKKwkJKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X2V4Y2VwdGlvbl9maWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0VHlwZUZpZWxkcygKKwkJCXZmLmdldFR5cGUoICJfZXhjZXB0aW9uIiApLAorCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfcmVzdWx0LAorCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwKKwkJCURlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19pblJlcGx5VG8KKwkJKTsKKwkJCisJCXRlc3RUeXBlRmllbGQoCisJCQl2Zi5nZXRUeXBlKCAiX2V4Y2VwdGlvbiIgKSwKKwkJCURlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX3Jlc3VsdCwKKwkJCW5ldyBSdW50aW1lRXhjZXB0aW9uKCkKKwkJKTsKKwkJCisJCXRlc3RUeXBlRmllbGQoCisJCQl2Zi5nZXRUeXBlKCAiX2V4Y2VwdGlvbiIgKSwKKwkJCURlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQsCisJCQkxMjNMCisJCSk7CisJCQorCQl0ZXN0VHlwZUZpZWxkKAorCQkJdmYuZ2V0VHlwZSggIl9leGNlcHRpb24iICksCisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9faW5SZXBseVRvLAorCQkJMTIzTAorCQkpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RfZXhjZXB0aW9uX3Jlc3VsdF9iYWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RUeXBlRmllbGQoCisJCQl2Zi5nZXRUeXBlKCAiX2V4Y2VwdGlvbiIgKSwKKwkJCURlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX3Jlc3VsdCwKKwkJCTEyMworCQkpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RfZXhjZXB0aW9uX21lc3NhZ2VJZF9iYWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RUeXBlRmllbGQoCisJCQl2Zi5nZXRUeXBlKCAiX2V4Y2VwdGlvbiIgKSwKKwkJCURlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQsCisJCQl0cnVlCisJCSk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgdGVzdF9leGNlcHRpb25faW5SZXBseVRvX2JhZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFR5cGVGaWVsZCgKKwkJCXZmLmdldFR5cGUoICJfZXhjZXB0aW9uIiApLAorCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX2luUmVwbHlUbywKKwkJCSJhYmMiCisJCSk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRUeXBlX2xvY2tlZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydE5vdE51bGwoIHZmLmdldFR5cGUoICJ4IiApICk7CisJCWFzc2VydE5vdE51bGwoIHZmLmdldFR5cGUoICJ5IiApICk7CisJCWFzc2VydE5vdE51bGwoIHZmLmdldFR5cGUoICJhIiApICk7CisJCXZmLmxvY2tEeW5hbWljVHlwZXMoKTsKKwkJYXNzZXJ0TnVsbCggdmYuZ2V0VHlwZSggImIiICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEZpZWxkX2xvY2tlZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVR5cGUgdHlwZSA9IG5ldyBUeXBlKCAiYmxhaCIgKTsKKwkJYXNzZXJ0Tm90TnVsbCggdHlwZS5nZXRGaWVsZCggImEiICkgKTsKKwkJYXNzZXJ0Tm90TnVsbCggdHlwZS5nZXRGaWVsZCggImIiICkgKTsKKwkJdHlwZS5sb2NrKCk7CisJCWFzc2VydE5vdE51bGwoIHR5cGUuZ2V0RmllbGQoICJhIiApICk7CisJCWFzc2VydE5vdE51bGwoIHR5cGUuZ2V0RmllbGQoICJiIiApICk7CisJCWFzc2VydE51bGwoIHR5cGUuZ2V0RmllbGQoICJ4IiApICk7CisJCWFzc2VydE51bGwoIHR5cGUuZ2V0RmllbGQoICJ5IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0RmllbGRfaWRfbWVzc2FnZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAiX21lc3NhZ2VJZCIsIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQuZ2V0TmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggMTY2MTM4Mzc4NCwgRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZC5nZXRJZCgpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRGaWVsZF9pZF9pblJlcGx5VG8oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoICJfaW5SZXBseVRvIiwgRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX2luUmVwbHlUby5nZXROYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMzA3NzA1NDM0LCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9faW5SZXBseVRvLmdldElkKCkgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTVFJJTkcgRU5DT0RJTkcgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFN0cmluZ0VuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGVuYyA9IHZmLmdldFN0cmluZ0VuY29kaW5nKCk7CisJCVN0cmluZyBzID0gbmV3IFN0cmluZyggbmV3IGJ5dGVbXSB7ICdhJywgJ2InLCAnYycgfSwgZW5jICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHMgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vCisJLy8gTUVTU0FHRSBJRCAvLworCS8vLy8vLy8vLy8vLy8vLy8KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1lc3NhZ2VJZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVR5cGUgbXRfZm9vID0gbmV3IFR5cGUoICJmb28iICk7CisJCW10X2Zvby5wdXRWYWxpZGF0b3IoIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBtdF9mb28sIHZmICk7CisJCQorCQlhc3NlcnROdWxsKCB2Zi5nZXRNZXNzYWdlSWQoIG1zZyApICk7CisJCQorCQl2Zi5zZXRNZXNzYWdlSWQoIG1zZywgMjM0TCApOworCQkKKwkJTG9uZyBtc2dpZCA9IHZmLmdldE1lc3NhZ2VJZCggbXNnICk7CisJCWFzc2VydE5vdE51bGwoIG1zZ2lkICk7CisJCWFzc2VydEVxdWFscyggMjM0TCwgbXNnaWQgKTsKKwkJCisJCXZmLnNldE1lc3NhZ2VJZCggbXNnLCBudWxsICk7CisJCQorCQlhc3NlcnROdWxsKCB2Zi5nZXRNZXNzYWdlSWQoIG1zZyApICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTiBSRVBMWSBUTyAvLworCS8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpblJlcGx5VG8oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUeXBlIG10X2ZvbyA9IG5ldyBUeXBlKCAiZm9vIiApOworCQltdF9mb28ucHV0VmFsaWRhdG9yKCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9faW5SZXBseVRvLCBWYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCQkKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggbXRfZm9vLCB2ZiApOworCQkKKwkJYXNzZXJ0TnVsbCggdmYuZ2V0SW5SZXBseVRvKCBtc2cgKSApOworCQkKKwkJdmYuc2V0SW5SZXBseVRvKCBtc2csIDIzNEwgKTsKKwkJCisJCUxvbmcgbXNnaWQgPSB2Zi5nZXRJblJlcGx5VG8oIG1zZyApOworCQlhc3NlcnROb3ROdWxsKCBtc2dpZCApOworCQlhc3NlcnRFcXVhbHMoIDIzNEwsIG1zZ2lkICk7CisJCQorCQl2Zi5zZXRJblJlcGx5VG8oIG1zZywgbnVsbCApOworCQkKKwkJYXNzZXJ0TnVsbCggdmYuZ2V0SW5SZXBseVRvKCBtc2cgKSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBWQUxVRSBDT05WRVJTSU9OIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZXhwb3J0Q3VzdG9tVmFsdWVfUnVudGltZUV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUV4Y2VwdGlvbiB2YWx1ZSA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQlTdHJ1Y3RWYWx1ZSBzdiA9IHZmLmV4cG9ydEN1c3RvbVZhbHVlKCB2YWx1ZSApOworCQlzdi5jaGVja1R5cGUoIHZmLmdldFR5cGUoICJfRXRjaF9SdW50aW1lRXhjZXB0aW9uIiApICk7CisJCWFzc2VydEVxdWFscyggMSwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsCisJCQlzdi5nZXQoIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX21zZyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZXhwb3J0Q3VzdG9tVmFsdWVfUnVudGltZUV4Y2VwdGlvbl9tc2coKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlFeGNlcHRpb24gdmFsdWUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJmb28gIT0gbnVsbCIgKTsKKwkJU3RydWN0VmFsdWUgc3YgPSB2Zi5leHBvcnRDdXN0b21WYWx1ZSggdmFsdWUgKTsKKwkJc3YuY2hlY2tUeXBlKCB2Zi5nZXRUeXBlKCAiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIgKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHN2LnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoICJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb246IGZvbyAhPSBudWxsIiwKKwkJCXN2LmdldCggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfbXNnICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBleHBvcnRDdXN0b21WYWx1ZV9PYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7CisJCWFzc2VydE51bGwoIHZmLmV4cG9ydEN1c3RvbVZhbHVlKCB2YWx1ZSApICk7CisJCS8vIGNhbm5vdCBleHBvcnQgdW5zdXBwb3J0ZWQgdHlwZQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEN1c3RvbVZhbHVlX0V0Y2hfUnVudGltZUV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCB2Zi5nZXRUeXBlKCAiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIgKSwgdmYgKTsKKwkJX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiBlID0gKF9FdGNoX1J1bnRpbWVFeGNlcHRpb24pIHZmLmltcG9ydEN1c3RvbVZhbHVlKCBzdiApOworCQlhc3NlcnROb3ROdWxsKCBlICk7CisJCWFzc2VydE51bGwoIGUubXNnICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0Q3VzdG9tVmFsdWVfRXRjaF9SdW50aW1lRXhjZXB0aW9uX21zZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCB2Zi5nZXRUeXBlKCAiX0V0Y2hfUnVudGltZUV4Y2VwdGlvbiIgKSwgdmYgKTsKKwkJc3YucHV0KCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9tc2csICJmb28iICk7CisJCV9FdGNoX1J1bnRpbWVFeGNlcHRpb24gZSA9IChfRXRjaF9SdW50aW1lRXhjZXB0aW9uKSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0Tm90TnVsbCggZSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBlLm1zZyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEN1c3RvbVZhbHVlX1Vua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggdmYuZ2V0VHlwZSggIngiICksIHZmICk7CisJCWFzc2VydE51bGwoIHZmLmltcG9ydEN1c3RvbVZhbHVlKCBzdiApICk7CisJCS8vIGNhbm5vdCBpbXBvcnQgdW5zdXBwb3J0ZWQgdHlwZQorCX0KKwkKKwkvKioKKwkgKiBBIGZha2UgaW1wbGVtZW50YXRpb24gb2YgRGVmYXVsdFZhbHVlRmFjdG9yeSBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15VmFsdWVGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbHVlRmFjdG9yeQorCXsKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisJCQorCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisJCXN0YXRpYworCQl7CisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5LmluaXQoIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKwkJCisJCS8vIGRlZmluZSBvdXIgdHlwZXMgYW5kIGZpZWxkcyBoZXJlOgorCQkKKwkJLyoqIHR5cGUgeCAqLworCQlwdWJsaWMgZmluYWwgc3RhdGljIFR5cGUgX210X3ggPSB0eXBlcy5nZXQoICJ4IiApOworCQkKKwkJLyoqIHR5cGUgeSAqLworCQlwdWJsaWMgZmluYWwgc3RhdGljIFR5cGUgX210X3kgPSB0eXBlcy5nZXQoICJ5IiApOworCQkKKwkJLyoqIGZpZWxkIGEgKi8KKwkJcHVibGljIGZpbmFsIHN0YXRpYyBGaWVsZCBfbWZfYSA9IG5ldyBGaWVsZCggImEiICk7CisJCQorCQkvKiogZmllbGQgYiAqLworCQlwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIF9tZl9iID0gbmV3IEZpZWxkKCAiYiIgKTsKKwkJCisJCXN0YXRpYworCQl7CisJCQl0eXBlcy5sb2NrKCk7CisJCQljbGFzczJ0eXBlLmxvY2soKTsKKwkJfQorCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIHRoZSBWYWx1ZUZhY3RvcnlGYWtlLgorCQkgKiBAcGFyYW0gdXJpIAorCQkgKi8KKwkJcHVibGljIE15VmFsdWVGYWN0b3J5KCBTdHJpbmcgdXJpICkKKwkJeworCQkJc3VwZXIoIHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0RHVtbXlWYWx1ZUZhY3RvcnkuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0RHVtbXlWYWx1ZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzEwMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3REdW1teVZhbHVlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIER1bW15VmFsdWVGYWN0b3J5CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RHVtbXlWYWx1ZUZhY3RvcnkKK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCUBJZ25vcmUKKwlwdWJsaWMgdm9pZCBub3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyB3cml0ZSBzb21lIHRlc3RzIGZvciBEdW1teVZhbHVlRmFjdG9yeS4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdEZyZWVQb29sLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdEZyZWVQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxNzAzNwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0RnJlZVBvb2wuamF2YQpAQCAtMCwwICsxLDMyMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuUG9vbC5Qb29sUnVubmFibGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0IG9mIEZyZWVQb29sCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RnJlZVBvb2wKK3sKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUTEgPSAzMDsgLy8gMSBxdWFudGEgb2YgZGVwZW5kYWJsZSBjbG9jayB0aWNrCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFEyID0gNjA7IC8vIDIgcXVhbnRhIG9mIGRlcGVuZGFibGUgY2xvY2sgdGljaworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBRMyA9IDkwOyAvLyAzIHF1YW50YSBvZiBkZXBlbmRhYmxlIGNsb2NrIHRpY2sKKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsb3NlMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woIDIgKTsKKwkJcC5jbG9zZSgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY2xvc2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gZnJlZSBwb29sIHRocmVhZCBjb3VudCBleGNlZWRlZCBvciBwb29sIGNsb3NlZAorCQlGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKCAyICk7CisJCXAuY2xvc2UoKTsKKwkJCisJCU15UG9vbFJ1bm5hYmxlIHIgPSBuZXcgTXlQb29sUnVubmFibGUoIDAsIGZhbHNlICk7CisJCXAucnVuKCByICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2xvc2UzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRnJlZVBvb2wgcCA9IG5ldyBGcmVlUG9vbCggMiApOworCQlwLmNsb3NlKCk7CisJCXAuY2xvc2UoKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGpvaW4xKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gZnJlZSBwb29sIHRocmVhZCBjb3VudCBleGNlZWRlZCBvciBwb29sIGNsb3NlZAorCQlGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKCAyICk7CisJCXAuam9pbigpOworCQkKKwkJTXlQb29sUnVubmFibGUgciA9IG5ldyBNeVBvb2xSdW5uYWJsZSggMCwgZmFsc2UgKTsKKwkJcC5ydW4oIHIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGpvaW4yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRnJlZVBvb2wgcCA9IG5ldyBGcmVlUG9vbCggMiApOworCQkKKwkJTXlQb29sUnVubmFibGUgciA9IG5ldyBNeVBvb2xSdW5uYWJsZSggMCwgZmFsc2UgKTsKKwkJYXNzZXJ0RmFsc2UoIHIuZG9uZSApOworCQlhc3NlcnROdWxsKCByLmV4ICk7CisJCQorCQlwLnJ1biggciApOworCQkKKwkJVGhyZWFkLnNsZWVwKCBRMSApOworCQlhc3NlcnRUcnVlKCByLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggci5leCApOworCQkKKwkJcC5qb2luKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBqb2luMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woIDIgKTsKKwkJCisJCU15UG9vbFJ1bm5hYmxlIHIgPSBuZXcgTXlQb29sUnVubmFibGUoIFExLCBmYWxzZSApOworCQlhc3NlcnRGYWxzZSggci5kb25lICk7CisJCWFzc2VydE51bGwoIHIuZXggKTsKKwkJCisJCXAucnVuKCByICk7CisJCWFzc2VydEZhbHNlKCByLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggci5leCApOworCQkKKwkJcC5qb2luKCk7CisJCWFzc2VydFRydWUoIHIuZG9uZSApOworCQlhc3NlcnROdWxsKCByLmV4ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcnVuMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woIDIgKTsKKwkJCisJCU15UG9vbFJ1bm5hYmxlIHIgPSBuZXcgTXlQb29sUnVubmFibGUoIDAsIGZhbHNlICk7CisJCWFzc2VydEZhbHNlKCByLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggci5leCApOworCQkKKwkJcC5ydW4oIHIgKTsKKwkJCisJCVRocmVhZC5zbGVlcCggUTEgKTsKKwkJYXNzZXJ0VHJ1ZSggci5kb25lICk7CisJCWFzc2VydE51bGwoIHIuZXggKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBydW4yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRnJlZVBvb2wgcCA9IG5ldyBGcmVlUG9vbCggMiApOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQl7CisJCQlNeVBvb2xSdW5uYWJsZSByID0gbmV3IE15UG9vbFJ1bm5hYmxlKCAwLCBmYWxzZSApOworCQkJYXNzZXJ0RmFsc2UoIHIuZG9uZSApOworCQkJYXNzZXJ0TnVsbCggci5leCApOworCQkJCisJCQlwLnJ1biggciApOworCQkJCisJCQlUaHJlYWQuc2xlZXAoIFExICk7CisJCQlhc3NlcnRUcnVlKCByLmRvbmUgKTsKKwkJCWFzc2VydE51bGwoIHIuZXggKTsKKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJ1bjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKCAyICk7CisJCQorCQlNeVBvb2xSdW5uYWJsZSByID0gbmV3IE15UG9vbFJ1bm5hYmxlKCAwLCB0cnVlICk7CisJCWFzc2VydEZhbHNlKCByLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggci5leCApOworCQkKKwkJcC5ydW4oIHIgKTsKKwkJCisJCVRocmVhZC5zbGVlcCggUTEgKTsKKwkJYXNzZXJ0RmFsc2UoIHIuZG9uZSApOworCQlhc3NlcnROb3ROdWxsKCByLmV4ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcnVuNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woIDIgKTsKKwkJCisJCU15UG9vbFJ1bm5hYmxlIHIgPSBuZXcgTXlQb29sUnVubmFibGUoIFEyLCBmYWxzZSApOworCQlhc3NlcnRGYWxzZSggci5kb25lICk7CisJCWFzc2VydE51bGwoIHIuZXggKTsKKwkJCisJCXAucnVuKCByICk7CisJCQorCQlUaHJlYWQuc2xlZXAoIFExICk7CisJCWFzc2VydEZhbHNlKCByLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggci5leCApOworCQkKKwkJVGhyZWFkLnNsZWVwKCBRMyApOworCQlhc3NlcnRUcnVlKCByLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggci5leCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJ1bjUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKCAyICk7CisJCQorCQlNeVBvb2xSdW5uYWJsZSByMSA9IG5ldyBNeVBvb2xSdW5uYWJsZSggUTIsIGZhbHNlICk7CisJCWFzc2VydEZhbHNlKCByMS5kb25lICk7CisJCWFzc2VydE51bGwoIHIxLmV4ICk7CisJCQorCQlNeVBvb2xSdW5uYWJsZSByMiA9IG5ldyBNeVBvb2xSdW5uYWJsZSggUTIsIGZhbHNlICk7CisJCWFzc2VydEZhbHNlKCByMi5kb25lICk7CisJCWFzc2VydE51bGwoIHIyLmV4ICk7CisKKwkJcC5ydW4oIHIxICk7CisJCXAucnVuKCByMiApOworCQkKKwkJVGhyZWFkLnNsZWVwKCBRMSApOworCQlhc3NlcnRGYWxzZSggcjEuZG9uZSApOworCQlhc3NlcnROdWxsKCByMS5leCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIHIyLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggcjIuZXggKTsKKwkJCisJCVRocmVhZC5zbGVlcCggUTMgKTsKKwkJYXNzZXJ0VHJ1ZSggcjEuZG9uZSApOworCQlhc3NlcnROdWxsKCByMS5leCApOworCQkKKwkJYXNzZXJ0VHJ1ZSggcjIuZG9uZSApOworCQlhc3NlcnROdWxsKCByMi5leCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHJ1bjYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBmcmVlIHBvb2wgdGhyZWFkIGNvdW50IGV4Y2VlZGVkCisJCUZyZWVQb29sIHAgPSBuZXcgRnJlZVBvb2woIDIgKTsKKwkJCisJCU15UG9vbFJ1bm5hYmxlIHIxID0gbmV3IE15UG9vbFJ1bm5hYmxlKCBRMiwgZmFsc2UgKTsKKwkJYXNzZXJ0RmFsc2UoIHIxLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggcjEuZXggKTsKKwkJCisJCU15UG9vbFJ1bm5hYmxlIHIyID0gbmV3IE15UG9vbFJ1bm5hYmxlKCBRMiwgZmFsc2UgKTsKKwkJYXNzZXJ0RmFsc2UoIHIyLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggcjIuZXggKTsKKwkJCisJCU15UG9vbFJ1bm5hYmxlIHIzID0gbmV3IE15UG9vbFJ1bm5hYmxlKCBRMiwgZmFsc2UgKTsKKwkJYXNzZXJ0RmFsc2UoIHIzLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggcjMuZXggKTsKKworCQlwLnJ1biggcjEgKTsKKwkJcC5ydW4oIHIyICk7CisJCXAucnVuKCByMyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJ1bjcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGcmVlUG9vbCBwID0gbmV3IEZyZWVQb29sKCAyICk7CisJCQorCQlNeVBvb2xSdW5uYWJsZSByMSA9IG5ldyBNeVBvb2xSdW5uYWJsZSggUTIsIGZhbHNlICk7CisJCWFzc2VydEZhbHNlKCByMS5kb25lICk7CisJCWFzc2VydE51bGwoIHIxLmV4ICk7CisJCQorCQlNeVBvb2xSdW5uYWJsZSByMiA9IG5ldyBNeVBvb2xSdW5uYWJsZSggUTIsIGZhbHNlICk7CisJCWFzc2VydEZhbHNlKCByMi5kb25lICk7CisJCWFzc2VydE51bGwoIHIyLmV4ICk7CisJCQorCQlNeVBvb2xSdW5uYWJsZSByMyA9IG5ldyBNeVBvb2xSdW5uYWJsZSggUTIsIGZhbHNlICk7CisJCWFzc2VydEZhbHNlKCByMy5kb25lICk7CisJCWFzc2VydE51bGwoIHIzLmV4ICk7CisKKwkJcC5ydW4oIHIxICk7CisJCXAucnVuKCByMiApOworCQl0cnkgeyBwLnJ1biggcjMgKTsgfSBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkge30KKwkJCisJCVRocmVhZC5zbGVlcCggUTEgKTsKKwkJYXNzZXJ0RmFsc2UoIHIxLmRvbmUgKTsKKwkJYXNzZXJ0TnVsbCggcjEuZXggKTsKKwkJCisJCWFzc2VydEZhbHNlKCByMi5kb25lICk7CisJCWFzc2VydE51bGwoIHIyLmV4ICk7CisJCQorCQlhc3NlcnRGYWxzZSggcjMuZG9uZSApOworCQlhc3NlcnROdWxsKCByMy5leCApOworCQkKKwkJVGhyZWFkLnNsZWVwKCBRMyApOworCQlhc3NlcnRUcnVlKCByMS5kb25lICk7CisJCWFzc2VydE51bGwoIHIxLmV4ICk7CisJCQorCQlhc3NlcnRUcnVlKCByMi5kb25lICk7CisJCWFzc2VydE51bGwoIHIyLmV4ICk7CisJCQorCQlhc3NlcnRGYWxzZSggcjMuZG9uZSApOworCQlhc3NlcnROdWxsKCByMy5leCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIGNsYXNzIE15UG9vbFJ1bm5hYmxlIGltcGxlbWVudHMgUG9vbFJ1bm5hYmxlCisJeworCQlwdWJsaWMgTXlQb29sUnVubmFibGUoIGludCBkZWxheSwgYm9vbGVhbiBleGNwICkKKwkJeworCQkJdGhpcy5kZWxheSA9IGRlbGF5OworCQkJdGhpcy5leGNwID0gZXhjcDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgZGVsYXk7CisJCQorCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZXhjcDsKKwkJCisJCXB1YmxpYyBib29sZWFuIGRvbmU7CisJCQorCQlwdWJsaWMgRXhjZXB0aW9uIGV4OworCisJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJaWYgKGRlbGF5ID4gMCkKKwkJCQlUaHJlYWQuc2xlZXAoIGRlbGF5ICk7CisJCQlpZiAoZXhjcCkKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJZG9uZSA9IHRydWU7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGV4Y2VwdGlvbiggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlleCA9IGU7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdE51bGxQb29sLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdE51bGxQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyZDAwZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0TnVsbFBvb2wuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBOdWxsUG9vbAorICovCitwdWJsaWMgY2xhc3MgVGVzdE51bGxQb29sCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlASWdub3JlCisJcHVibGljIHZvaWQgbm90aGluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gd3JpdGUgc29tZSB0ZXN0IGZvciBOdWxsUG9vbC4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFF1ZXVlZFBvb2wuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0UXVldWVkUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2QxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFF1ZXVlZFBvb2wuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBRdWV1ZWRQb29sCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UXVldWVkUG9vbAoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIG5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBUT0RPIHdyaXRlIHNvbWUgdGVzdCBmb3IgUXVldWVkUG9vbC4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFJlbW90ZUJhc2UuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0UmVtb3RlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2RiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFJlbW90ZUJhc2UuamF2YQpAQCAtMCwwICsxLDQ4NCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydC5XYWl0RG93bjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydC5XYWl0VXA7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0IG9mIFJlbW90ZUJhc2UuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UmVtb3RlQmFzZQoreworCXByaXZhdGUgZmluYWwgTXlEZWxpdmVyeVNlcnZpY2UgdHJhbnNwb3J0ID0gbmV3IE15RGVsaXZlcnlTZXJ2aWNlKCk7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgTXlEZWZhdWx0VmFsdWVGYWN0b3J5KCAidGNwOiIgKTsKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUJhc2UgcmVtb3RlID0gbmV3IFJlbW90ZUJhc2UoIHRyYW5zcG9ydCwgdmYgKTsKKwlwcml2YXRlIGZpbmFsIFR5cGUgbXQgPSBuZXcgVHlwZSggImZvbyIgKTsKKwlwcml2YXRlIGZpbmFsIFR5cGUgcm10ID0gbmV3IFR5cGUoICJiYXIiICk7CisJcHJpdmF0ZSBmaW5hbCBNYWlsYm94IG1iID0gbmV3IE15TWFpbGJveCgpOworCQorCS8qKgorCSAqIENvbnN0cnVjdHMgVGVzdFJlbW90ZUJhc2UuCisJICovCisJcHVibGljIFRlc3RSZW1vdGVCYXNlKCkKKwl7CisvLwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0LmdldFNlc3Npb24oKSwgcmVtb3RlICk7CisJCQorLy8JCW10LnB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKy8vCQltdC5zZXRSZXN1bHQoIHJtdCApOworCQkKKy8vCQlybXQuc2V0UmVzcG9uc2VGaWVsZCggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfcmVzdWx0ICk7CisvLwkJcm10LnB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfcmVzdWx0LCBldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfaW50LmdldCggMCApICk7CisvLwkJcm10LnB1dFZhbGlkYXRvciggRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKy8vCQlybXQucHV0VmFsaWRhdG9yKCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9faW5SZXBseVRvLCBWYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbmV3TWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgbXNnID0gcmVtb3RlLl9uZXdNZXNzYWdlKCBtdCApOworCQltc2cuY2hlY2tUeXBlKCBtdCApOworCQlhc3NlcnRTYW1lKCB2ZiwgbXNnLnZmKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlbmQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IHJlbW90ZS5fbmV3TWVzc2FnZSggbXQgKTsKKwkJCisJCXJlbW90ZS5fc2VuZCggbXNnICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQucmVjaXBpZW50ICk7CisJCWFzc2VydFNhbWUoIG1zZywgdHJhbnNwb3J0Lm1zZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmVnaW5jYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSByZW1vdGUuX25ld01lc3NhZ2UoIG10ICk7CisJCQorCQl0cmFuc3BvcnQubWIgPSBtYjsKKwkJCisJCU1haWxib3ggcm1iID0gcmVtb3RlLl9iZWdpbmNhbGwoIG1zZyApOworCQkKKwkJYXNzZXJ0U2FtZSggV2hhdC5CRUdJTl9DQUxMLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnRTYW1lKCBtc2csIHRyYW5zcG9ydC5tc2cgKTsKKwkJYXNzZXJ0U2FtZSggbWIsIHJtYiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGVuZGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3Qgb2JqID0gbmV3IE9iamVjdCgpOworCQkKKwkJdHJhbnNwb3J0LnJlc3VsdCA9IG9iajsKKwkJCisJCU9iamVjdCByb2JqID0gcmVtb3RlLl9lbmRjYWxsKCBtYiwgcm10ICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LkVORF9DQUxMLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnRTYW1lKCBtYiwgdHJhbnNwb3J0Lm1iICk7CisJCWFzc2VydFNhbWUoIHJtdCwgdHJhbnNwb3J0LnJlc3BvbnNlVHlwZSApOworCQlhc3NlcnRTYW1lKCBvYmosIHJvYmogKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IFFVRVJZID0gImZvbyI7CisJCU9iamVjdCBSRVNVTFQgPSAiYmFyIjsKKwkJCisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5xdWVyeSApOworCQl0cmFuc3BvcnQucXVlcnlfcmVzdWx0ID0gUkVTVUxUOworCQkKKwkJT2JqZWN0IHJlc3VsdCA9IHJlbW90ZS5fdHJhbnNwb3J0UXVlcnkoIFFVRVJZICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfUVVFUlksIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydFNhbWUoIFFVRVJZLCB0cmFuc3BvcnQucXVlcnkgKTsKKwkJYXNzZXJ0U2FtZSggUkVTVUxULCByZXN1bHQgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgQ09OVFJPTCA9ICJmb28iOworCQlPYmplY3QgVkFMVUUgPSAiYmFyIjsKKwkJCisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5jb250cm9sICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC52YWx1ZSApOworCQkKKwkJcmVtb3RlLl90cmFuc3BvcnRDb250cm9sKCBDT05UUk9MLCBWQUxVRSApOworCisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX0NPTlRST0wsIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydFNhbWUoIENPTlRST0wsIHRyYW5zcG9ydC5jb250cm9sICk7CisJCWFzc2VydFNhbWUoIFZBTFVFLCB0cmFuc3BvcnQudmFsdWUgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBFVkVOVCA9ICJmb28iOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmV2ZW50ICk7CisJCQorCQlyZW1vdGUuX3RyYW5zcG9ydE5vdGlmeSggRVZFTlQgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9OT1RJRlksIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydFNhbWUoIEVWRU5ULCB0cmFuc3BvcnQuZXZlbnQgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5xdWVyeSApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQudmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmV2ZW50ICk7CisJCQorCQlyZW1vdGUuX3N0YXJ0KCk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9DT05UUk9MLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQucXVlcnkgKTsKKwkJYXNzZXJ0U2FtZSggVHJhbnNwb3J0LlNUQVJULCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQudmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmV2ZW50ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5jb250cm9sICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC52YWx1ZSApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuZXZlbnQgKTsKKwkJCisJCXJlbW90ZS5fd2FpdFVwKCAxMjM0ICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9RVUVSWSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5jb250cm9sICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC52YWx1ZSApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuZXZlbnQgKTsKKwkJCisJCWFzc2VydFNhbWUoIFdhaXRVcC5jbGFzcywgdHJhbnNwb3J0LnF1ZXJ5LmdldENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMjM0LCAoKFdhaXRVcCkgdHJhbnNwb3J0LnF1ZXJ5KS5tYXhEZWxheSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN0YXJ0QW5kV2FpdFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5jb250cm9sICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC52YWx1ZSApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuZXZlbnQgKTsKKwkJCisJCXJlbW90ZS5fc3RhcnRBbmRXYWl0VXAoIDIzNDUgKTsKKwkJCisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX1FVRVJZLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROb3ROdWxsKCB0cmFuc3BvcnQucXVlcnkgKTsKKwkJYXNzZXJ0U2FtZSggVHJhbnNwb3J0LlNUQVJULCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQudmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmV2ZW50ICk7CisJCQorCQlhc3NlcnRTYW1lKCBXYWl0VXAuY2xhc3MsIHRyYW5zcG9ydC5xdWVyeS5nZXRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggMjM0NSwgKChXYWl0VXApIHRyYW5zcG9ydC5xdWVyeSkubWF4RGVsYXkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5jb250cm9sICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC52YWx1ZSApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuZXZlbnQgKTsKKwkJCisJCXJlbW90ZS5fc3RvcCgpOworCQkKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfQ09OVFJPTCwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydFNhbWUoIFRyYW5zcG9ydC5TVE9QLCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQudmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmV2ZW50ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdERvd24oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQucXVlcnkgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmNvbnRyb2wgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnZhbHVlICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5ldmVudCApOworCQkKKwkJcmVtb3RlLl93YWl0RG93biggMzQ1NiApOworCQkKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfUVVFUlksIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE5vdE51bGwoIHRyYW5zcG9ydC5xdWVyeSApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQudmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmV2ZW50ICk7CisJCQorCQlhc3NlcnRTYW1lKCBXYWl0RG93bi5jbGFzcywgdHJhbnNwb3J0LnF1ZXJ5LmdldENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzNDU2LCAoKFdhaXREb3duKSB0cmFuc3BvcnQucXVlcnkpLm1heERlbGF5ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RvcEFuZFdhaXREb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5jb250cm9sICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC52YWx1ZSApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuZXZlbnQgKTsKKwkJCisJCXJlbW90ZS5fc3RvcEFuZFdhaXREb3duKCA0NTY3ICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9RVUVSWSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydFNhbWUoIFRyYW5zcG9ydC5TVE9QLCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQudmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmV2ZW50ICk7CisJCQorCQlhc3NlcnRTYW1lKCBXYWl0RG93bi5jbGFzcywgdHJhbnNwb3J0LnF1ZXJ5LmdldENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA0NTY3LCAoKFdhaXREb3duKSB0cmFuc3BvcnQucXVlcnkpLm1heERlbGF5ICk7CisJfQorCisJLyoqICovCisJcHVibGljIGVudW0gV2hhdAorCXsKKwkJLyoqICovIFRSQU5TUE9SVF9NRVNTQUdFLAorCQkvKiogKi8gVFJBTlNQT1JUX1FVRVJZLAorCQkvKiogKi8gVFJBTlNQT1JUX0NPTlRST0wsCisJCS8qKiAqLyBUUkFOU1BPUlRfTk9USUZZLAorCQkvKiogKi8gQkVHSU5fQ0FMTCwKKwkJLyoqICovIEVORF9DQUxMCisJfQorCQorCS8qKgorCSAqIERlbGl2ZXJ5U2VydmljZSBmb3IgdGVzdGluZy4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgTXlEZWxpdmVyeVNlcnZpY2UgaW1wbGVtZW50cyBEZWxpdmVyeVNlcnZpY2UKKwl7CisJCS8qKiAqLyBwdWJsaWMgV2hhdCB3aGF0OworCQkvKiogKi8gcHVibGljIFdobyByZWNpcGllbnQ7CisJCS8qKiAqLyBwdWJsaWMgTWVzc2FnZSBtc2c7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IHF1ZXJ5OworCQkvKiogKi8gcHVibGljIE9iamVjdCBxdWVyeV9yZXN1bHQ7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGNvbnRyb2w7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IHZhbHVlOworCQkvKiogKi8gcHVibGljIE9iamVjdCBldmVudDsKKwkJLyoqICovIHB1YmxpYyBNYWlsYm94IG1iOworCQkvKiogKi8gcHVibGljIFR5cGUgcmVzcG9uc2VUeXBlOworCQkvKiogKi8gcHVibGljIE9iamVjdCByZXN1bHQ7CisJCQorCQlwdWJsaWMgTWFpbGJveCBiZWdpbmNhbGwoIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5CRUdJTl9DQUxMOworCQkJdGhpcy5tc2cgPSBtc2c7CisJCQlyZXR1cm4gbWI7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGVuZGNhbGwoIE1haWxib3ggbWIsIFR5cGUgcmVzcG9uc2VUeXBlICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5FTkRfQ0FMTDsKKwkJCXRoaXMubWIgPSBtYjsKKwkJCXRoaXMucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0TWVzc2FnZSggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfTUVTU0FHRTsKKwkJCXRoaXMucmVjaXBpZW50ID0gcmVjaXBpZW50OworCQkJdGhpcy5tc2cgPSBtc2c7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlRSQU5TUE9SVF9RVUVSWTsKKwkJCXRoaXMucXVlcnkgPSBxdWVyeTsKKwkJCXJldHVybiBxdWVyeV9yZXN1bHQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJd2hhdCA9IFdoYXQuVFJBTlNQT1JUX0NPTlRST0w7CisJCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0Tm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlRSQU5TUE9SVF9OT1RJRlk7CisJCQl0aGlzLmV2ZW50ID0gZXZlbnQ7CisJCX0KKworCQlwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgZ2V0U2Vzc2lvbigpCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2Vzc2lvbiggU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbiApCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisJfQorCisJLyoqCisJICogQSBmYWtlIGltcGxlbWVudGF0aW9uIG9mIERlZmF1bHRWYWx1ZUZhY3RvcnkgZm9yIHRlc3RpbmcuCisJICovCisJc3RhdGljIGNsYXNzIE15RGVmYXVsdFZhbHVlRmFjdG9yeSBleHRlbmRzIERlZmF1bHRWYWx1ZUZhY3RvcnkKKwl7CisJCXByaXZhdGUgZmluYWwgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlID0gbmV3IENsYXNzMlR5cGVNYXAoKTsKKworCQlzdGF0aWMKKwkJeworCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5pbml0KCB0eXBlcywgY2xhc3MydHlwZSApOworCQl9CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIFZhbHVlRmFjdG9yeUZha2UuCisJCSAqIEBwYXJhbSB1cmkgCisJCSAqLworCQlwdWJsaWMgTXlEZWZhdWx0VmFsdWVGYWN0b3J5KCBTdHJpbmcgdXJpICkKKwkJeworCQkJc3VwZXIoIHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkJfQorCX0KKwkKKwlzdGF0aWMgY2xhc3MgTXlNYWlsYm94IGltcGxlbWVudHMgTWFpbGJveAorCXsKKwkJcHVibGljIGJvb2xlYW4gY2xvc2VEZWxpdmVyeSgpCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gY2xvc2VSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBMb25nIGdldE1lc3NhZ2VJZCgpCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gbWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIEVsZW1lbnQgcmVhZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBFbGVtZW50IHJlYWQoIGludCBtYXhEZWxheSApIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJlZ2lzdGVyTm90aWZ5KCBOb3RpZnkgbm90aWZ5LCBPYmplY3Qgc3RhdGUsIGludCBtYXhEZWxheSApCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgdW5yZWdpc3Rlck5vdGlmeSggTm90aWZ5IG5vdGlmeSApCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzRnVsbCgpCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RSdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RSdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTBhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFJ1bnRpbWVFeGNlcHRpb25TZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qgb2YgUnVudGltZUV4Y2VwdGlvblNlcmlhbGl6ZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RSdW50aW1lRXhjZXB0aW9uU2VyaWFsaXplcgoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIG5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBUT0RPIHdyaXRlIHNvbWUgdGVzdCBmb3IgUnVudGltZUV4Y2VwdGlvblNlcmlhbGl6ZXIuCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RTdHViQmFzZS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RTdHViQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGExMzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFN0dWJCYXNlLmphdmEKQEAgLTAsMCArMSwzNzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuQXN5bmNNb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlNlc3Npb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqIFRlc3QgU3R1YkJhc2UgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3R1YkJhc2UKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCXByaXZhdGUgZmluYWwgTXlEZWxpdmVyeVNlcnZpY2UgdHJhbnNwb3J0ID0gbmV3IE15RGVsaXZlcnlTZXJ2aWNlKCk7CisJcHJpdmF0ZSBmaW5hbCBNeU9iamVjdCBzZXNzaW9uID0gbmV3IE15T2JqZWN0KCk7CisJcHJpdmF0ZSBmaW5hbCBNeVBvb2wgcXVldWVkID0gbmV3IE15UG9vbCgpOworCXByaXZhdGUgZmluYWwgTXlQb29sIGZyZWUgPSBuZXcgTXlQb29sKCk7CisJcHJpdmF0ZSBmaW5hbCBNeVN0dWIgc3R1YiA9IG5ldyBNeVN0dWIoIHRyYW5zcG9ydCwgc2Vzc2lvbiwgcXVldWVkLCBmcmVlICk7CisJcHJpdmF0ZSBmaW5hbCBXaG8gd2hvID0gbmV3IFdobygpIHsgLyogKi8gfTsKKwlwcml2YXRlIGZpbmFsIFR5cGUgaG93ZHkgPSBuZXcgVHlwZSggImhvd2R5IiApOworCXByaXZhdGUgZmluYWwgVHlwZSBub2dvb2QgPSBuZXcgVHlwZSggIm5vZ29vZCIgKTsKKwkKKwkvKiogKi8KKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKQorCXsKKwkJaG93ZHkuc2V0U3R1YkhlbHBlcigKKwkJCW5ldyBTdHViSGVscGVyPE15T2JqZWN0PigpCisJCQl7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgcnVuKCBEZWxpdmVyeVNlcnZpY2Ugc3ZjLCBNeU9iamVjdCBvYmosIFdobyBzZW5kZXIsCisJCQkJCU1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJCXsKKwkJCQkJb2JqLmhvd2R5KCBzdmMsIHNlbmRlciwgbXNnICk7CisJCQkJfQorCQkJfSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdGlvbigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydFNhbWUoIHN0dWIsIHRyYW5zcG9ydC5nZXRTZXNzaW9uKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTWVzc2FnZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlob3dkeS5zZXRBc3luY01vZGUoIEFzeW5jTW9kZS5OT05FICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBob3dkeSwgdmYgKTsKKwkJYm9vbGVhbiBtc2dfaGFuZGxlZCA9IHN0dWIuc2Vzc2lvbk1lc3NhZ2UoIHdobywgbXNnICk7CisJCWFzc2VydFRydWUoIG1zZ19oYW5kbGVkICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LkhPV0RZLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0LCBzZXNzaW9uLnN2YyApOworCQlhc3NlcnRTYW1lKCB3aG8sIHNlc3Npb24uc2VuZGVyICk7CisJCWFzc2VydFNhbWUoIG1zZywgc2Vzc2lvbi5tc2cgKTsKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlZC5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGZyZWUucnVuICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2Vzc2lvbk1lc3NhZ2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaG93ZHkuc2V0QXN5bmNNb2RlKCBBc3luY01vZGUuUVVFVUVEICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBob3dkeSwgdmYgKTsKKwkJYm9vbGVhbiBtc2dfaGFuZGxlZCA9IHN0dWIuc2Vzc2lvbk1lc3NhZ2UoIHdobywgbXNnICk7CisJCWFzc2VydFRydWUoIG1zZ19oYW5kbGVkICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LkhPV0RZLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0LCBzZXNzaW9uLnN2YyApOworCQlhc3NlcnRTYW1lKCB3aG8sIHNlc3Npb24uc2VuZGVyICk7CisJCWFzc2VydFNhbWUoIG1zZywgc2Vzc2lvbi5tc2cgKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWVkLnJ1biApOworCQlhc3NlcnRGYWxzZSggZnJlZS5ydW4gKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTWVzc2FnZTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlob3dkeS5zZXRBc3luY01vZGUoIEFzeW5jTW9kZS5GUkVFICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBob3dkeSwgdmYgKTsKKwkJYm9vbGVhbiBtc2dfaGFuZGxlZCA9IHN0dWIuc2Vzc2lvbk1lc3NhZ2UoIHdobywgbXNnICk7CisJCWFzc2VydFRydWUoIG1zZ19oYW5kbGVkICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LkhPV0RZLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0LCBzZXNzaW9uLnN2YyApOworCQlhc3NlcnRTYW1lKCB3aG8sIHNlc3Npb24uc2VuZGVyICk7CisJCWFzc2VydFNhbWUoIG1zZywgc2Vzc2lvbi5tc2cgKTsKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlZC5ydW4gKTsKKwkJYXNzZXJ0VHJ1ZSggZnJlZS5ydW4gKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTWVzc2FnZTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlob3dkeS5zZXRBc3luY01vZGUoIEFzeW5jTW9kZS5OT05FICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBub2dvb2QsIHZmICk7CisJCWJvb2xlYW4gbXNnX2hhbmRsZWQgPSBzdHViLnNlc3Npb25NZXNzYWdlKCB3aG8sIG1zZyApOworCQlhc3NlcnRGYWxzZSggbXNnX2hhbmRsZWQgKTsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnN2YyApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLm1zZyApOworCQlhc3NlcnRGYWxzZSggcXVldWVkLnJ1biApOworCQlhc3NlcnRGYWxzZSggZnJlZS5ydW4gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlc3Npb25RdWVyeSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBRVUVSWSA9ICJmb28iOworCQlPYmplY3QgUkVTVUxUID0gImJhciI7CisJCQorCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5xdWVyeSApOworCQlzZXNzaW9uLnF1ZXJ5X3Jlc3VsdCA9IFJFU1VMVDsKKwkJCisJCU9iamVjdCByZXN1bHQgPSBzdHViLnNlc3Npb25RdWVyeSggUVVFUlkgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlNFU1NJT05fUVVFUlksIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRTYW1lKCBRVUVSWSwgc2Vzc2lvbi5xdWVyeSApOworCQlhc3NlcnRTYW1lKCBSRVNVTFQsIHJlc3VsdCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgQ09OVFJPTCA9ICJmb28iOworCQlPYmplY3QgVkFMVUUgPSAiYmFyIjsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLmNvbnRyb2wgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi52YWx1ZSApOworCQkKKwkJc3R1Yi5zZXNzaW9uQ29udHJvbCggQ09OVFJPTCwgVkFMVUUgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlNFU1NJT05fQ09OVFJPTCwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFNhbWUoIENPTlRST0wsIHNlc3Npb24uY29udHJvbCApOworCQlhc3NlcnRTYW1lKCBWQUxVRSwgc2Vzc2lvbi52YWx1ZSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBFVkVOVCA9ICJmb28iOworCQkKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uZXZlbnQgKTsKKwkJCisJCXN0dWIuc2Vzc2lvbk5vdGlmeSggRVZFTlQgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlNFU1NJT05fTk9USUZZLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggRVZFTlQsIHNlc3Npb24uZXZlbnQgKTsKKwl9CisJCisJLyoqICovCisJZW51bSBXaGF0CisJeworCQkvKiogKi8gVFJBTlNQT1JUX01FU1NBR0UsCisJCS8qKiAqLyBUUkFOU1BPUlRfUVVFUlksCisJCS8qKiAqLyBUUkFOU1BPUlRfQ09OVFJPTCwKKwkJLyoqICovIFRSQU5TUE9SVF9OT1RJRlksCisJCS8qKiAqLyBTRVNTSU9OX1FVRVJZLAorCQkvKiogKi8gU0VTU0lPTl9DT05UUk9MLAorCQkvKiogKi8gU0VTU0lPTl9OT1RJRlksCisJCS8qKiAqLyBIT1dEWQorCX0KKwkKKwkvKioKKwkgKiBNeURlbGl2ZXJ5U2VydmljZSAoZmFrZSBmb3IgdGVzdGluZykuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCisJc3RhdGljIGNsYXNzIE15RGVsaXZlcnlTZXJ2aWNlIGltcGxlbWVudHMgRGVsaXZlcnlTZXJ2aWNlCisJeworCQkvKiogKi8gcHVibGljIFdoYXQgd2hhdDsKKwkJLyoqICovIHB1YmxpYyBNZXNzYWdlIG1zZzsKKwkJLyoqICovIHB1YmxpYyBXaG8gcmVjaXBpZW50OworCQkvKiogKi8gcHVibGljIE9iamVjdCBxdWVyeTsKKwkJLyoqICovIHB1YmxpYyBib29sZWFuIHF1ZXJ5X3Jlc3VsdDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgY29udHJvbDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgdmFsdWU7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGV2ZW50OworCQkKKwkJcHVibGljIE1haWxib3ggYmVnaW5jYWxsKCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGVuZGNhbGwoIE1haWxib3ggbWIsIFR5cGUgcmVzcG9uc2VUeXBlICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE1lc3NhZ2UoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJd2hhdCA9IFdoYXQuVFJBTlNQT1JUX01FU1NBR0U7CisJCQl0aGlzLnJlY2lwaWVudCA9IHJlY2lwaWVudDsKKwkJCXRoaXMubXNnID0gbXNnOworCQl9CisKKwkJcHVibGljIFNlc3Npb25NZXNzYWdlIGdldFNlc3Npb24oKQorCQl7CisJCQlyZXR1cm4gc2Vzc2lvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25NZXNzYWdlIHNlc3Npb24gKQorCQl7CisJCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCQl9CisJCQorCQlwcml2YXRlIFNlc3Npb25NZXNzYWdlIHNlc3Npb247CisKKwkJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfUVVFUlk7CisJCQl0aGlzLnF1ZXJ5ID0gcXVlcnk7CisJCQlyZXR1cm4gcXVlcnlfcmVzdWx0OworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlRSQU5TUE9SVF9DT05UUk9MOworCQkJdGhpcy5jb250cm9sID0gY29udHJvbDsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfTk9USUZZOworCQkJdGhpcy5ldmVudCA9IGV2ZW50OworCQl9CisJfQorCQorCS8qKgorCSAqIE15U3R1YiAoZmFrZSBmb3IgdGVzdGluZykuCisJICovCisJc3RhdGljIGNsYXNzIE15U3R1YiBleHRlbmRzIFN0dWJCYXNlPE15T2JqZWN0PgorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBzdmMKKwkJICogQHBhcmFtIG9iagorCQkgKiBAcGFyYW0gcXVldWVkCisJCSAqIEBwYXJhbSBmcmVlCisJCSAqLworCQlwdWJsaWMgTXlTdHViKCBEZWxpdmVyeVNlcnZpY2Ugc3ZjLCBNeU9iamVjdCBvYmosIFBvb2wgcXVldWVkLCBQb29sIGZyZWUgKQorCQl7CisJCQlzdXBlciggc3ZjLCBvYmosIHF1ZXVlZCwgZnJlZSApOworCQl9CisJfQorCQorCS8qKgorCSAqIE15T2JqZWN0IChmYWtlIGZvciB0ZXN0aW5nKS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKKwlzdGF0aWMgY2xhc3MgTXlPYmplY3QgaW1wbGVtZW50cyBPYmpTZXNzaW9uCisJeworCQkvKiogKi8gcHVibGljIFdoYXQgd2hhdDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgcXVlcnk7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IHF1ZXJ5X3Jlc3VsdDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgY29udHJvbDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgdmFsdWU7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGV2ZW50OworCQkvKiogKi8gcHVibGljIERlbGl2ZXJ5U2VydmljZSBzdmM7CisJCS8qKiAqLyBwdWJsaWMgV2hvIHNlbmRlcjsKKwkJLyoqICovIHB1YmxpYyBNZXNzYWdlIG1zZzsKKwkJCisJCXB1YmxpYyBPYmplY3QgX3Nlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5TRVNTSU9OX1FVRVJZOworCQkJdGhpcy5xdWVyeSA9IHF1ZXJ5OworCQkJcmV0dXJuIHF1ZXJ5X3Jlc3VsdDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBzdmMKKwkJICogQHBhcmFtIHNlbmRlcgorCQkgKiBAcGFyYW0gbXNnCisJCSAqLworCQlwdWJsaWMgdm9pZCBob3dkeSggRGVsaXZlcnlTZXJ2aWNlIHN2YywgV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKQorCQl7CisJCQl3aGF0ID0gV2hhdC5IT1dEWTsKKwkJCXRoaXMuc3ZjID0gc3ZjOworCQkJdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisJCQl0aGlzLm1zZyA9IG1zZzsKKwkJfQorCisJCXB1YmxpYyB2b2lkIF9zZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlNFU1NJT05fQ09OVFJPTDsKKwkJCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBfc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5TRVNTSU9OX05PVElGWTsKKwkJCXRoaXMuZXZlbnQgPSBldmVudDsKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlzdGF0aWMgY2xhc3MgTXlQb29sIGltcGxlbWVudHMgUG9vbAorCXsKKwkJLyoqICovIHB1YmxpYyBib29sZWFuIHJ1bjsKKwkJCisJCXB1YmxpYyB2b2lkIHJ1biggUG9vbFJ1bm5hYmxlIHJ1bm5hYmxlICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlydW4gPSB0cnVlOworCQkJcnVubmFibGUucnVuKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFN0dWJIZWxwZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0U3R1YkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzE5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFN0dWJIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBTdHViSGVscGVyCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3R1YkhlbHBlcgoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIG5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBUT0RPIHdyaXRlIHNvbWUgdGVzdCBmb3IgU3R1YkhlbHBlci4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VHJhbnNwb3J0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OWEyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBUcmFuc3BvcnRGYWN0b3J5CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VHJhbnNwb3J0RmFjdG9yeQoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIG5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBUT0RPIHdyaXRlIHNvbWUgdGVzdCBmb3IgVHJhbnNwb3J0RmFjdG9yeS4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFRyYW5zcG9ydEhlbHBlci5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RUcmFuc3BvcnRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjViZTUwCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RUcmFuc3BvcnRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBUcmFuc3BvcnRIZWxwZXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RUcmFuc3BvcnRIZWxwZXIKK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCUBJZ25vcmUKKwlwdWJsaWMgdm9pZCBub3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyB3cml0ZSBzb21lIHRlc3QgZm9yIFRyYW5zcG9ydEhlbHBlci4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFR5cGVWYWxpZGF0b3IuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VHlwZVZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjVmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFR5cGVWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqICovCitwdWJsaWMgY2xhc3MgVGVzdFR5cGVWYWxpZGF0b3IKK3sKKwkvKiogKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpCisJeworCQluZXcgTXlUeXBlVmFsaWRhdG9yKCBpbnQuY2xhc3MsIGludC5jbGFzcywgLTEsICJienp0IiApOworCX0KKworCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFR5cGVWYWxpZGF0b3IxKCkKKwl7CisJCU15VHlwZVZhbGlkYXRvciB2ID0gbmV3IE15VHlwZVZhbGlkYXRvciggaW50LmNsYXNzLCBudWxsLCAwLCAiYWJjIiApOworCQlhc3NlcnRTYW1lKCBpbnQuY2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggMCwgdi5nZXRORGltcygpICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHYudG9TdHJpbmcoKSApOworCX0KKworCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFR5cGVWYWxpZGF0b3IyKCkKKwl7CisJCU15VHlwZVZhbGlkYXRvciB2ID0gbmV3IE15VHlwZVZhbGlkYXRvciggYm9vbGVhbi5jbGFzcywgbnVsbCwgMCwgImRlZiIgKTsKKwkJYXNzZXJ0U2FtZSggYm9vbGVhbi5jbGFzcywgdi5nZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCB2LmdldE5EaW1zKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZGVmIiwgdi50b1N0cmluZygpICk7CisJfQorCisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VHlwZVZhbGlkYXRvcjMoKQorCXsKKwkJTXlUeXBlVmFsaWRhdG9yIHYgPSBuZXcgTXlUeXBlVmFsaWRhdG9yKCBudWxsLCBpbnQuY2xhc3MsIDEsICJnaGkiICk7CisJCWFzc2VydFNhbWUoIGludFtdLmNsYXNzLCB2LmdldEV4cGVjdGVkQ2xhc3MoKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHYuZ2V0TkRpbXMoKSApOworCQlhc3NlcnRFcXVhbHMoICJnaGkiLCB2LnRvU3RyaW5nKCkgKTsKKwl9CisKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUeXBlVmFsaWRhdG9yNCgpCisJeworCQlNeVR5cGVWYWxpZGF0b3IgdiA9IG5ldyBNeVR5cGVWYWxpZGF0b3IoIG51bGwsIGJvb2xlYW4uY2xhc3MsIDEsICJqa2wiICk7CisJCWFzc2VydFNhbWUoIGJvb2xlYW5bXS5jbGFzcywgdi5nZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCB2LmdldE5EaW1zKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiamtsIiwgdi50b1N0cmluZygpICk7CisJfQorCisJLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKQorCXsKKwkJTXlUeXBlVmFsaWRhdG9yIHYgPSBuZXcgTXlUeXBlVmFsaWRhdG9yKCBpbnQuY2xhc3MsIGludC5jbGFzcywgMCwgImFiYyIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYWJjIiwgdi50b1N0cmluZygpICk7CisJCQorCQl2ID0gbmV3IE15VHlwZVZhbGlkYXRvciggaW50LmNsYXNzLCBpbnQuY2xhc3MsIDAsICJkZWYiICk7CisJCWFzc2VydEVxdWFscyggImRlZiIsIHYudG9TdHJpbmcoKSApOworCQkKKwkJdiA9IG5ldyBNeVR5cGVWYWxpZGF0b3IoIGludC5jbGFzcywgaW50LmNsYXNzLCAwLCAiZ2hpIiApOworCQlhc3NlcnRFcXVhbHMoICJnaGkiLCB2LnRvU3RyaW5nKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTaWxseSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW5ldyBNeVR5cGVWYWxpZGF0b3IoIGludC5jbGFzcywgaW50LmNsYXNzLCAwLCAiZ2hpIiApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9CisKKwkvKiogKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15VHlwZVZhbGlkYXRvciBleHRlbmRzIFR5cGVWYWxpZGF0b3IKKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gc2NhbGFyQ2xhc3MKKwkJICogQHBhcmFtIGFycmF5Q2xhc3MKKwkJICogQHBhcmFtIG5EaW1zCisJCSAqIEBwYXJhbSBkZXNjcgorCQkgKi8KKwkJcHVibGljIE15VHlwZVZhbGlkYXRvciggQ2xhc3M8Pz4gc2NhbGFyQ2xhc3MsIENsYXNzPD8+IGFycmF5Q2xhc3MsCisJCQlpbnQgbkRpbXMsIFN0cmluZyBkZXNjciApCisJCXsKKwkJCXN1cGVyKCBzY2FsYXJDbGFzcywgYXJyYXlDbGFzcywgbkRpbXMsIGRlc2NyICk7CisJCX0KKworCQlwdWJsaWMgVmFsaWRhdG9yIGVsZW1lbnRWYWxpZGF0b3IoKQorCQl7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk0ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RWYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIFZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24KK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCUBJZ25vcmUKKwlwdWJsaWMgdm9pZCBub3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyB3cml0ZSBzb21lIHRlc3QgZm9yIFZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uLgorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX1N0cnVjdFZhbHVlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OGY2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0IFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS4KKyAqLworcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfU3RydWN0VmFsdWUKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCXByaXZhdGUgZmluYWwgVHlwZSBhYmMgPSBuZXcgVHlwZSggImFiYyIgKTsKKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rjb25zdHJ1Y3RvciggMCwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLCAwXSIsIFN0cnVjdFZhbHVlLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMSwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLCAxXSIsIFN0cnVjdFZhbHVlW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAyLCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDJdIiwgU3RydWN0VmFsdWVbXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMywgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLCAzXSIsIFN0cnVjdFZhbHVlW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNCwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLCA0XSIsIFN0cnVjdFZhbHVlW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA1LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDVdIiwgU3RydWN0VmFsdWVbXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNiwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLCA2XSIsIFN0cnVjdFZhbHVlW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLCA3XSIsIFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA4LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDhdIiwgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOSwgIlN0cnVjdFZhbHVlW2FiYyg2Njk0OTcxMTcpLCA5XSIsIFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZSB2ID0gVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmdldCggYWJjLCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCQlhc3NlcnRFcXVhbHMoIGFiYywgdi5nZXRUeXBlKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3JfU3RydWN0VmFsdWUuZ2V0KCBhYmMsIC0xICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmdldCggYWJjLCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDBdIiwgU3RydWN0VmFsdWUuY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDIsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSwgMV0iLCBTdHJ1Y3RWYWx1ZVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAzLCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDJdIiwgU3RydWN0VmFsdWVbXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDNdIiwgU3RydWN0VmFsdWVbXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDUsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSwgNF0iLCBTdHJ1Y3RWYWx1ZVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA2LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDVdIiwgU3RydWN0VmFsdWVbXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDZdIiwgU3RydWN0VmFsdWVbXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDgsICJTdHJ1Y3RWYWx1ZVthYmMoNjY5NDk3MTE3KSwgN10iLCBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA5LCAiU3RydWN0VmFsdWVbYWJjKDY2OTQ5NzExNyksIDhdIiwgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIGludCBuLCBTdHJpbmcgZGVzY3IsIENsYXNzPD8+IGV4cGVjdGVkQ2xhc3MgKQorCXsKKwkJVmFsaWRhdG9yX1N0cnVjdFZhbHVlIHYgPSAoVmFsaWRhdG9yX1N0cnVjdFZhbHVlKSBWYWxpZGF0b3JfU3RydWN0VmFsdWUuZ2V0KCBhYmMsIG4gKS5lbGVtZW50VmFsaWRhdG9yKCk7CisJCWFzc2VydEVxdWFscyggbi0xLCB2LmdldE5EaW1zKCkgKTsKKwkJYXNzZXJ0U2FtZSggZXhwZWN0ZWRDbGFzcywgdi5nZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBkZXNjciwgdi50b1N0cmluZygpICk7CisJCWFzc2VydEVxdWFscyggYWJjLCB2LmdldFR5cGUoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3JfU3RydWN0VmFsdWUuZ2V0KCBhYmMsIDAgKS5lbGVtZW50VmFsaWRhdG9yKCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIGFiYywgdmYgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvb2RfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgU3RydWN0VmFsdWVbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAyLCBuZXcgU3RydWN0VmFsdWVbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDMsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA0LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA1LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDYsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA3LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA4LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDksIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rnb29kdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmdldCggYWJjLCBuICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkX3NjYWxhcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgdHJ1ZSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIChieXRlKSAxICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgMzMzMzMzMzMgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDUuNWYgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA2LjYgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAiIiApOworCQl0ZXN0YmFkdmFsdWUoIDAsICJhYmMiICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IE9iamVjdCgpICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IFN0cnVjdFZhbHVlKCBuZXcgVHlwZSggImRlZiIgKSwgdmYgKSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBEYXRlKCkgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDEsIG51bGwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIHRydWUgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoYnl0ZSkgMSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgU3RydWN0VmFsdWUoIGFiYywgdmYgKSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBTdHJ1Y3RWYWx1ZVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IFN0cnVjdFZhbHVlW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBTdHJ1Y3RWYWx1ZVtdW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IFN0cnVjdFZhbHVlW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgU3RydWN0VmFsdWVbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IFN0cnVjdFZhbHVlW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IFN0cnVjdFZhbHVlW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IFN0cnVjdFZhbHVlW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgU3RydWN0VmFsdWVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0YmFkdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmdldCggYWJjLCBuICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydEZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9ib29sZWFuLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9ib29sZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1OGI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2Jvb2xlYW4uamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdCBWYWxpZGF0b3JfYm9vbGVhbi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfYm9vbGVhbgoreworCXByaXZhdGUgZmluYWwgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Y29uc3RydWN0b3IoIDAsICJib29sZWFuWzBdIiwgQm9vbGVhbi5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDEsICJib29sZWFuWzFdIiwgYm9vbGVhbltdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgImJvb2xlYW5bMl0iLCBib29sZWFuW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDMsICJib29sZWFuWzNdIiwgYm9vbGVhbltdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDQsICJib29sZWFuWzRdIiwgYm9vbGVhbltdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNSwgImJvb2xlYW5bNV0iLCBib29sZWFuW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDYsICJib29sZWFuWzZdIiwgYm9vbGVhbltdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDcsICJib29sZWFuWzddIiwgYm9vbGVhbltdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOCwgImJvb2xlYW5bOF0iLCBib29sZWFuW11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDksICJib29sZWFuWzldIiwgYm9vbGVhbltdW11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3RvciggaW50IG4sIFN0cmluZyBkZXNjciwgQ2xhc3M8Pz4gZXhwZWN0ZWRDbGFzcyApCisJeworCQlWYWxpZGF0b3JfYm9vbGVhbiB2ID0gVmFsaWRhdG9yX2Jvb2xlYW4uZ2V0KCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9ib29sZWFuLmdldCggLTEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIFZhbGlkYXRvci5NQVhfTkRJTVMrMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGVsZW1lbnR2YWxpZGF0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDEsICJib29sZWFuWzBdIiwgQm9vbGVhbi5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMiwgImJvb2xlYW5bMV0iLCBib29sZWFuW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJib29sZWFuWzJdIiwgYm9vbGVhbltdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDQsICJib29sZWFuWzNdIiwgYm9vbGVhbltdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNSwgImJvb2xlYW5bNF0iLCBib29sZWFuW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJib29sZWFuWzVdIiwgYm9vbGVhbltdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDcsICJib29sZWFuWzZdIiwgYm9vbGVhbltdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggOCwgImJvb2xlYW5bN10iLCBib29sZWFuW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJib29sZWFuWzhdIiwgYm9vbGVhbltdW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0ZWxlbWVudHZhbGlkYXRvciggaW50IG4sIFN0cmluZyBkZXNjciwgQ2xhc3M8Pz4gZXhwZWN0ZWRDbGFzcyApCisJeworCQlWYWxpZGF0b3JfYm9vbGVhbiB2ID0gKFZhbGlkYXRvcl9ib29sZWFuKSBWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIG4gKS5lbGVtZW50VmFsaWRhdG9yKCk7CisJCWFzc2VydEVxdWFscyggbi0xLCB2LmdldE5EaW1zKCkgKTsKKwkJYXNzZXJ0U2FtZSggZXhwZWN0ZWRDbGFzcywgdi5nZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBkZXNjciwgdi50b1N0cmluZygpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9ib29sZWFuLmdldCggMCApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb29kX3NjYWxhcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rnb29kdmFsdWUoIDAsIGZhbHNlICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIHRydWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb29kX2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IGJvb2xlYW5bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAyLCBuZXcgYm9vbGVhbltdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMywgbmV3IGJvb2xlYW5bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNCwgbmV3IGJvb2xlYW5bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA1LCBuZXcgYm9vbGVhbltdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNiwgbmV3IGJvb2xlYW5bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNywgbmV3IGJvb2xlYW5bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA4LCBuZXcgYm9vbGVhbltdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOSwgbmV3IGJvb2xlYW5bXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0Z29vZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9ib29sZWFuLmdldCggbiApOworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydFRydWUoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGJhZF9zY2FsYXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0YmFkdmFsdWUoIDAsIG51bGwgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAoYnl0ZSkgMSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJhYmMiICksIHZmICkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgRGF0ZSgpICk7CisKKwkJdGVzdGJhZHZhbHVlKCAxLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKGJ5dGUpIDEgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoc2hvcnQpIDIyMjIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IERhdGUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGJhZF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IGJvb2xlYW5bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBib29sZWFuW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBib29sZWFuW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMywgbmV3IGJvb2xlYW5bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBib29sZWFuW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBib29sZWFuW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNiwgbmV3IGJvb2xlYW5bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBib29sZWFuW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBib29sZWFuW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOSwgbmV3IGJvb2xlYW5bXVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBib29sZWFuW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgYm9vbGVhbltdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgYm9vbGVhbltdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBib29sZWFuW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgYm9vbGVhbltdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgYm9vbGVhbltdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBib29sZWFuW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgYm9vbGVhbltdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RiYWR2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIG4gKTsKKwkJYXNzZXJ0RmFsc2UoIHYudmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlT2soIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKQorCXsKKwkJdHJ5CisJCXsKKwkJCU9iamVjdCB4ID0gdi52YWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQkJYXNzZXJ0RXF1YWxzKCB2YWx1ZSwgeCApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2J5dGUuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2J5dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzcxNGIxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RWYWxpZGF0b3JfYnl0ZS5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0IFZhbGlkYXRvcl9ieXRlLgorICovCitwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl9ieXRlCit7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRHVtbXlWYWx1ZUZhY3RvcnkoKTsKKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rjb25zdHJ1Y3RvciggMCwgImJ5dGVbMF0iLCBCeXRlLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMSwgImJ5dGVbMV0iLCBieXRlW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAyLCAiYnl0ZVsyXSIsIGJ5dGVbXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMywgImJ5dGVbM10iLCBieXRlW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNCwgImJ5dGVbNF0iLCBieXRlW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA1LCAiYnl0ZVs1XSIsIGJ5dGVbXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNiwgImJ5dGVbNl0iLCBieXRlW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgImJ5dGVbN10iLCBieXRlW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA4LCAiYnl0ZVs4XSIsIGJ5dGVbXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOSwgImJ5dGVbOV0iLCBieXRlW11bXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9ieXRlLmdldCggbiApOworCQlhc3NlcnRFcXVhbHMoIG4sIHYuZ2V0TkRpbXMoKSApOworCQlhc3NlcnRTYW1lKCBleHBlY3RlZENsYXNzLCB2LmdldEV4cGVjdGVkQ2xhc3MoKSApOworCQlhc3NlcnRFcXVhbHMoIGRlc2NyLCB2LnRvU3RyaW5nKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3JfYnl0ZS5nZXQoIC0xICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yX2J5dGUuZ2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAiYnl0ZVswXSIsIEJ5dGUuY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDIsICJieXRlWzFdIiwgYnl0ZVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAzLCAiYnl0ZVsyXSIsIGJ5dGVbXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAiYnl0ZVszXSIsIGJ5dGVbXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDUsICJieXRlWzRdIiwgYnl0ZVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA2LCAiYnl0ZVs1XSIsIGJ5dGVbXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCAiYnl0ZVs2XSIsIGJ5dGVbXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDgsICJieXRlWzddIiwgYnl0ZVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA5LCAiYnl0ZVs4XSIsIGJ5dGVbXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIGludCBuLCBTdHJpbmcgZGVzY3IsIENsYXNzPD8+IGV4cGVjdGVkQ2xhc3MgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gKFR5cGVWYWxpZGF0b3IpIFZhbGlkYXRvcl9ieXRlLmdldCggbiApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJYXNzZXJ0RXF1YWxzKCBuLTEsIHYuZ2V0TkRpbXMoKSApOworCQlhc3NlcnRTYW1lKCBleHBlY3RlZENsYXNzLCB2LmdldEV4cGVjdGVkQ2xhc3MoKSApOworCQlhc3NlcnRFcXVhbHMoIGRlc2NyLCB2LnRvU3RyaW5nKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGVsZW1lbnR2YWxpZGF0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yX2J5dGUuZ2V0KCAwICkuZWxlbWVudFZhbGlkYXRvcigpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvb2Rfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQllURVMKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSAwICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgQnl0ZS5NQVhfVkFMVUUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSAtMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgLTY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIEJ5dGUuTUlOX1ZBTFVFICk7CisKKwkJLy8gU0hPUlRTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIDAgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgQnl0ZS5NQVhfVkFMVUUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgLTEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAtNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSBCeXRlLk1JTl9WQUxVRSApOworCisJCS8vIElOVFMKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIDAgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGludCkgQnl0ZS5NQVhfVkFMVUUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoaW50KSBCeXRlLk1JTl9WQUxVRSApOworCisJCS8vIExPTkdTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBCeXRlLk1BWF9WQUxVRSApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAtNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIEJ5dGUuTUlOX1ZBTFVFICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ29vZF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBieXRlW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMiwgbmV3IGJ5dGVbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDMsIG5ldyBieXRlW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDQsIG5ldyBieXRlW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNSwgbmV3IGJ5dGVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDYsIG5ldyBieXRlW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDcsIG5ldyBieXRlW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOCwgbmV3IGJ5dGVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDksIG5ldyBieXRlW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGdvb2R2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfYnl0ZS5nZXQoIG4gKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggdmFsdWUgKSApOworCQlhc3NlcnRUcnVlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCAoYnl0ZSkgMSApOyBnb29kIQorCQl0ZXN0YmFkdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJhYmMiICksIHZmICkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgRGF0ZSgpICk7CisKKwkJdGVzdGJhZHZhbHVlKCAxLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKGJ5dGUpIDEgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoc2hvcnQpIDIyMjIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDUuNWYgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA2LjYgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAiIiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICJhYmMiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IE9iamVjdCgpICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IFN0cnVjdFZhbHVlKCBuZXcgVHlwZSggImFiYyIgKSwgdmYgKSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBieXRlW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgYnl0ZVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgYnl0ZVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBieXRlW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgYnl0ZVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgYnl0ZVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBieXRlW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgYnl0ZVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgYnl0ZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBieXRlW11bXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgYnl0ZVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMywgbmV3IGJ5dGVbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IGJ5dGVbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgYnl0ZVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNiwgbmV3IGJ5dGVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IGJ5dGVbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgYnl0ZVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOSwgbmV3IGJ5dGVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0YmFkdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2J5dGUuZ2V0KCBuICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydEZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9jdXN0b20uamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2N1c3RvbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmVjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9jdXN0b20uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBWYWxpZGF0b3JfY3VzdG9tCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yX2N1c3RvbQoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIG5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBUT0RPIHdyaXRlIHNvbWUgdGVzdCBmb3IgVmFsaWRhdG9yX2N1c3RvbS4KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9kb3VibGUuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2RvdWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmFhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9kb3VibGUuamF2YQpAQCAtMCwwICsxLDIyOCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdCBWYWxpZGF0b3JfZG91YmxlLgorICovCitwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl9kb3VibGUKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGNvbnN0cnVjdG9yKCAwLCAiZG91YmxlWzBdIiwgRG91YmxlLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMSwgImRvdWJsZVsxXSIsIGRvdWJsZVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgImRvdWJsZVsyXSIsIGRvdWJsZVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAzLCAiZG91YmxlWzNdIiwgZG91YmxlW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNCwgImRvdWJsZVs0XSIsIGRvdWJsZVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNSwgImRvdWJsZVs1XSIsIGRvdWJsZVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA2LCAiZG91YmxlWzZdIiwgZG91YmxlW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgImRvdWJsZVs3XSIsIGRvdWJsZVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOCwgImRvdWJsZVs4XSIsIGRvdWJsZVtdW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA5LCAiZG91YmxlWzldIiwgZG91YmxlW11bXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9kb3VibGUuZ2V0KCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9kb3VibGUuZ2V0KCAtMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9kb3VibGUuZ2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAiZG91YmxlWzBdIiwgRG91YmxlLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAiZG91YmxlWzFdIiwgZG91YmxlW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJkb3VibGVbMl0iLCBkb3VibGVbXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAiZG91YmxlWzNdIiwgZG91YmxlW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAiZG91YmxlWzRdIiwgZG91YmxlW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJkb3VibGVbNV0iLCBkb3VibGVbXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCAiZG91YmxlWzZdIiwgZG91YmxlW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAiZG91YmxlWzddIiwgZG91YmxlW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJkb3VibGVbOF0iLCBkb3VibGVbXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIGludCBuLCBTdHJpbmcgZGVzY3IsIENsYXNzPD8+IGV4cGVjdGVkQ2xhc3MgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gKFR5cGVWYWxpZGF0b3IpIFZhbGlkYXRvcl9kb3VibGUuZ2V0KCBuICkuZWxlbWVudFZhbGlkYXRvcigpOworCQlhc3NlcnRFcXVhbHMoIG4tMSwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3JfZG91YmxlLmdldCggMCApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb29kX3NjYWxhcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rnb29kdmFsdWUoIDAsIDAuMCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAxLjEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgLTEuMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvb2RfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgZG91YmxlW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMiwgbmV3IGRvdWJsZVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMywgbmV3IGRvdWJsZVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA0LCBuZXcgZG91YmxlW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNSwgbmV3IGRvdWJsZVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNiwgbmV3IGRvdWJsZVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA3LCBuZXcgZG91YmxlW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOCwgbmV3IGRvdWJsZVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOSwgbmV3IGRvdWJsZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rnb29kdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2RvdWJsZS5nZXQoIG4gKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggdmFsdWUgKSApOworCQlhc3NlcnRUcnVlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAoc2hvcnQpIDIyMjIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAzMzMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgNi42ICk7IGdvb2QhCisJCXRlc3RiYWR2YWx1ZSggMCwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJhYmMiICksIHZmICkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgRGF0ZSgpICk7CisKKwkJdGVzdGJhZHZhbHVlKCAxLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCB0cnVlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKGJ5dGUpIDEgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoc2hvcnQpIDIyMjIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAzMzMzMzMgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDUuNWYgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA2LjYgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAiIiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICJhYmMiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IE9iamVjdCgpICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IFN0cnVjdFZhbHVlKCBuZXcgVHlwZSggImFiYyIgKSwgdmYgKSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBEYXRlKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBkb3VibGVbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBkb3VibGVbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IGRvdWJsZVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBkb3VibGVbXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBkb3VibGVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IGRvdWJsZVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IGRvdWJsZVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBkb3VibGVbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBkb3VibGVbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IGRvdWJsZVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBkb3VibGVbXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBkb3VibGVbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IGRvdWJsZVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBkb3VibGVbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0YmFkdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2RvdWJsZS5nZXQoIG4gKTsKKwkJYXNzZXJ0RmFsc2UoIHYudmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlT2soIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKQorCXsKKwkJdHJ5CisJCXsKKwkJCU9iamVjdCB4ID0gdi52YWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQkJYXNzZXJ0RXF1YWxzKCB2YWx1ZSwgeCApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2Zsb2F0LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9mbG9hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWYzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9mbG9hdC5qYXZhCkBAIC0wLDAgKzEsMjI4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0IFZhbGlkYXRvcl9mbG9hdC4KKyAqLworcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfZmxvYXQKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGNvbnN0cnVjdG9yKCAwLCAiZmxvYXRbMF0iLCBGbG9hdC5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDEsICJmbG9hdFsxXSIsIGZsb2F0W10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAyLCAiZmxvYXRbMl0iLCBmbG9hdFtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAzLCAiZmxvYXRbM10iLCBmbG9hdFtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDQsICJmbG9hdFs0XSIsIGZsb2F0W11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA1LCAiZmxvYXRbNV0iLCBmbG9hdFtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA2LCAiZmxvYXRbNl0iLCBmbG9hdFtdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDcsICJmbG9hdFs3XSIsIGZsb2F0W11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA4LCAiZmxvYXRbOF0iLCBmbG9hdFtdW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA5LCAiZmxvYXRbOV0iLCBmbG9hdFtdW11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3RvciggaW50IG4sIFN0cmluZyBkZXNjciwgQ2xhc3M8Pz4gZXhwZWN0ZWRDbGFzcyApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfZmxvYXQuZ2V0KCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9mbG9hdC5nZXQoIC0xICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yX2Zsb2F0LmdldCggVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMSwgImZsb2F0WzBdIiwgRmxvYXQuY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDIsICJmbG9hdFsxXSIsIGZsb2F0W10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJmbG9hdFsyXSIsIGZsb2F0W11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNCwgImZsb2F0WzNdIiwgZmxvYXRbXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDUsICJmbG9hdFs0XSIsIGZsb2F0W11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJmbG9hdFs1XSIsIGZsb2F0W11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNywgImZsb2F0WzZdIiwgZmxvYXRbXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDgsICJmbG9hdFs3XSIsIGZsb2F0W11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJmbG9hdFs4XSIsIGZsb2F0W11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3RlbGVtZW50dmFsaWRhdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IChUeXBlVmFsaWRhdG9yKSBWYWxpZGF0b3JfZmxvYXQuZ2V0KCBuICkuZWxlbWVudFZhbGlkYXRvcigpOworCQlhc3NlcnRFcXVhbHMoIG4tMSwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3JfZmxvYXQuZ2V0KCAwICkuZWxlbWVudFZhbGlkYXRvcigpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvb2Rfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgMC4wZiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAxLjFmICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIC0xLjFmICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ29vZF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBmbG9hdFtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDIsIG5ldyBmbG9hdFtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMywgbmV3IGZsb2F0W11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDQsIG5ldyBmbG9hdFtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDUsIG5ldyBmbG9hdFtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNiwgbmV3IGZsb2F0W11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDcsIG5ldyBmbG9hdFtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDgsIG5ldyBmbG9hdFtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOSwgbmV3IGZsb2F0W11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGdvb2R2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfZmxvYXQuZ2V0KCBuICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkX3NjYWxhcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgdHJ1ZSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIChieXRlKSAxICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgMzMzMzMzMzMgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOyBnb29kIQorCQl0ZXN0YmFkdmFsdWUoIDAsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IERhdGUoKSApOworCisJCXRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDEsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgdHJ1ZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKHNob3J0KSAyMjIyICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJhYmMiICksIHZmICkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgRGF0ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkX2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgZmxvYXRbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBmbG9hdFtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgZmxvYXRbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgZmxvYXRbXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBmbG9hdFtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgZmxvYXRbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgZmxvYXRbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBmbG9hdFtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgZmxvYXRbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgZmxvYXRbXVtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBmbG9hdFtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMywgbmV3IGZsb2F0W11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBmbG9hdFtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBmbG9hdFtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNiwgbmV3IGZsb2F0W11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBmbG9hdFtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBmbG9hdFtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOSwgbmV3IGZsb2F0W11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9mbG9hdC5nZXQoIG4gKTsKKwkJYXNzZXJ0RmFsc2UoIHYudmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlT2soIFZhbGlkYXRvciB2LCBPYmplY3QgdmFsdWUgKQorCXsKKwkJdHJ5CisJCXsKKwkJCU9iamVjdCB4ID0gdi52YWxpZGF0ZVZhbHVlKCB2YWx1ZSApOworCQkJYXNzZXJ0RXF1YWxzKCB2YWx1ZSwgeCApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2ludC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RWYWxpZGF0b3JfaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1YjhhYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2ludC5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0IFZhbGlkYXRvcl9pbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yX2ludAoreworCXByaXZhdGUgZmluYWwgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Y29uc3RydWN0b3IoIDAsICJpbnRbMF0iLCBJbnRlZ2VyLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMSwgImludFsxXSIsIGludFtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgImludFsyXSIsIGludFtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAzLCAiaW50WzNdIiwgaW50W11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNCwgImludFs0XSIsIGludFtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNSwgImludFs1XSIsIGludFtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA2LCAiaW50WzZdIiwgaW50W11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgImludFs3XSIsIGludFtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOCwgImludFs4XSIsIGludFtdW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA5LCAiaW50WzldIiwgaW50W11bXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9pbnQuZ2V0KCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9pbnQuZ2V0KCAtMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9pbnQuZ2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAiaW50WzBdIiwgSW50ZWdlci5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMiwgImludFsxXSIsIGludFtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAzLCAiaW50WzJdIiwgaW50W11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNCwgImludFszXSIsIGludFtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNSwgImludFs0XSIsIGludFtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA2LCAiaW50WzVdIiwgaW50W11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNywgImludFs2XSIsIGludFtdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggOCwgImludFs3XSIsIGludFtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA5LCAiaW50WzhdIiwgaW50W11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3RlbGVtZW50dmFsaWRhdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IChUeXBlVmFsaWRhdG9yKSBWYWxpZGF0b3JfaW50LmdldCggbiApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJYXNzZXJ0RXF1YWxzKCBuLTEsIHYuZ2V0TkRpbXMoKSApOworCQlhc3NlcnRTYW1lKCBleHBlY3RlZENsYXNzLCB2LmdldEV4cGVjdGVkQ2xhc3MoKSApOworCQlhc3NlcnRFcXVhbHMoIGRlc2NyLCB2LnRvU3RyaW5nKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGVsZW1lbnR2YWxpZGF0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yX2ludC5nZXQoIDAgKS5lbGVtZW50VmFsaWRhdG9yKCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBCWVRFUworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGJ5dGUpIDAgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSAxICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSA2NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBCeXRlLk1BWF9WQUxVRSApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGJ5dGUpIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSAtNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgQnl0ZS5NSU5fVkFMVUUgKTsKKworCQkvLyBTSE9SVFMKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAxICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSBCeXRlLk1BWF9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIDIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgU2hvcnQuTUFYX1ZBTFVFICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgLTY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgQnl0ZS5NSU5fVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAtMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBTaG9ydC5NSU5fVkFMVUUgKTsKKworCQkvLyBJTlRTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAwICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAxICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChpbnQpIEJ5dGUuTUFYX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIDIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGludCkgU2hvcnQuTUFYX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIEludGVnZXIuTUFYX1ZBTFVFICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAtMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAtNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGludCkgQnl0ZS5NSU5fVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgLTIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGludCkgU2hvcnQuTUlOX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIC0zMzMzMzMzMyApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBJbnRlZ2VyLk1JTl9WQUxVRSApOworCisJCS8vIExPTkdTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBCeXRlLk1BWF9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgU2hvcnQuTUFYX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAzMzMzMzMzMyApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgSW50ZWdlci5NQVhfVkFMVUUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAtMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgLTY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBCeXRlLk1JTl9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgLTIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIFNob3J0Lk1JTl9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgLTMzMzMzMzMzICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBJbnRlZ2VyLk1JTl9WQUxVRSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvb2RfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgaW50W10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMiwgbmV3IGludFtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMywgbmV3IGludFtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA0LCBuZXcgaW50W11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNSwgbmV3IGludFtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNiwgbmV3IGludFtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA3LCBuZXcgaW50W11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOCwgbmV3IGludFtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOSwgbmV3IGludFtdW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rnb29kdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2ludC5nZXQoIG4gKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggdmFsdWUgKSApOworCQlhc3NlcnRUcnVlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCAoYnl0ZSkgMSApOyBnb29kIQorLy8JCXRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7IGdvb2QhCisvLwkJdGVzdGJhZHZhbHVlKCAwLCAzMzMzMzMzMyApOyBnb29kIQorCQl0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IERhdGUoKSApOworCisJCXRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDEsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgdHJ1ZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKHNob3J0KSAyMjIyICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJhYmMiICksIHZmICkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgRGF0ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkX2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgaW50W10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgaW50W11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBpbnRbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgaW50W11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgaW50W11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBpbnRbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgaW50W11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgaW50W11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBpbnRbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgaW50W11bXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgaW50W10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgaW50W11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBpbnRbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgaW50W11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgaW50W11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBpbnRbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgaW50W11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgaW50W11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9pbnQuZ2V0KCBuICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydEZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9sb25nLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9sb25nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlNGVlZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX2xvbmcuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdCBWYWxpZGF0b3JfbG9uZy4KKyAqLworcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JfbG9uZworeworCXByaXZhdGUgZmluYWwgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Y29uc3RydWN0b3IoIDAsICJsb25nWzBdIiwgTG9uZy5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDEsICJsb25nWzFdIiwgbG9uZ1tdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgImxvbmdbMl0iLCBsb25nW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDMsICJsb25nWzNdIiwgbG9uZ1tdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDQsICJsb25nWzRdIiwgbG9uZ1tdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNSwgImxvbmdbNV0iLCBsb25nW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDYsICJsb25nWzZdIiwgbG9uZ1tdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDcsICJsb25nWzddIiwgbG9uZ1tdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOCwgImxvbmdbOF0iLCBsb25nW11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDksICJsb25nWzldIiwgbG9uZ1tdW11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3RvciggaW50IG4sIFN0cmluZyBkZXNjciwgQ2xhc3M8Pz4gZXhwZWN0ZWRDbGFzcyApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3JfbG9uZy5nZXQoIG4gKTsKKwkJYXNzZXJ0RXF1YWxzKCBuLCB2LmdldE5EaW1zKCkgKTsKKwkJYXNzZXJ0U2FtZSggZXhwZWN0ZWRDbGFzcywgdi5nZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBkZXNjciwgdi50b1N0cmluZygpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yX2xvbmcuZ2V0KCAtMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9sb25nLmdldCggVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMSwgImxvbmdbMF0iLCBMb25nLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAibG9uZ1sxXSIsIGxvbmdbXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMywgImxvbmdbMl0iLCBsb25nW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNCwgImxvbmdbM10iLCBsb25nW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAibG9uZ1s0XSIsIGxvbmdbXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNiwgImxvbmdbNV0iLCBsb25nW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNywgImxvbmdbNl0iLCBsb25nW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAibG9uZ1s3XSIsIGxvbmdbXVtdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggOSwgImxvbmdbOF0iLCBsb25nW11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3RlbGVtZW50dmFsaWRhdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IChUeXBlVmFsaWRhdG9yKSBWYWxpZGF0b3JfbG9uZy5nZXQoIG4gKS5lbGVtZW50VmFsaWRhdG9yKCk7CisJCWFzc2VydEVxdWFscyggbi0xLCB2LmdldE5EaW1zKCkgKTsKKwkJYXNzZXJ0U2FtZSggZXhwZWN0ZWRDbGFzcywgdi5nZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBkZXNjciwgdi50b1N0cmluZygpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9sb25nLmdldCggMCApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb29kX3NjYWxhcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIEJZVEVTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGJ5dGUpIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGJ5dGUpIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIEJ5dGUuTUFYX1ZBTFVFICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgLTEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGJ5dGUpIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBCeXRlLk1JTl9WQUxVRSApOworCisJCS8vIFNIT1JUUworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAwICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSA2NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIEJ5dGUuTUFYX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBTaG9ydC5NQVhfVkFMVUUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgLTEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAtNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSBCeXRlLk1JTl9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIC0yMjIyICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIFNob3J0Lk1JTl9WQUxVRSApOworCisJCS8vIElOVFMKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIDAgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGludCkgQnl0ZS5NQVhfVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoaW50KSBTaG9ydC5NQVhfVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgMzMzMzMzMzMgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgSW50ZWdlci5NQVhfVkFMVUUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoaW50KSBCeXRlLk1JTl9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAtMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoaW50KSBTaG9ydC5NSU5fVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgLTMzMzMzMzMzICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIEludGVnZXIuTUlOX1ZBTFVFICk7CisKKwkJLy8gTE9OR1MKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAwICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIEJ5dGUuTUFYX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAyMjIyICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBTaG9ydC5NQVhfVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIDMzMzMzMzMzICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBMb25nLk1BWF9WQUxVRSApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIC0xICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAtNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIEJ5dGUuTUlOX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAtMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgU2hvcnQuTUlOX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSAtMzMzMzMzMzMgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIEludGVnZXIuTUlOX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIC00NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBMb25nLk1JTl9WQUxVRSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvb2RfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgbG9uZ1tdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDIsIG5ldyBsb25nW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAzLCBuZXcgbG9uZ1tdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA0LCBuZXcgbG9uZ1tdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDUsIG5ldyBsb25nW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA2LCBuZXcgbG9uZ1tdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA3LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDgsIG5ldyBsb25nW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA5LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rnb29kdmFsdWUoIGludCBuLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yX2xvbmcuZ2V0KCBuICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkX3NjYWxhcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgdHJ1ZSApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsgZ29vZCEKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOyBnb29kIQorLy8JCXRlc3RiYWR2YWx1ZSggMCwgMzMzMzMzMzMgKTsgZ29vZCEKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7IGdvb2QhCisJCXRlc3RiYWR2YWx1ZSggMCwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IERhdGUoKSApOworCisJCXRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDEsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgdHJ1ZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKHNob3J0KSAyMjIyICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJhYmMiICksIHZmICkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgRGF0ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkX2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgbG9uZ1tdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IGxvbmdbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IGxvbmdbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgbG9uZ1tdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNCwgbmV3IGxvbmdbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IGxvbmdbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNywgbmV3IGxvbmdbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IGxvbmdbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgbG9uZ1tdW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IGxvbmdbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBsb25nW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBsb25nW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IGxvbmdbXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBsb25nW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBsb25nW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IGxvbmdbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBsb25nW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9sb25nLmdldCggbiApOworCQlhc3NlcnRGYWxzZSggdi52YWxpZGF0ZSggdmFsdWUgKSApOworCQlhc3NlcnRGYWxzZSggdmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlVmFsdWVPayggVmFsaWRhdG9yIHYsIE9iamVjdCB2YWx1ZSApCisJeworCQl0cnkKKwkJeworCQkJT2JqZWN0IHggPSB2LnZhbGlkYXRlVmFsdWUoIHZhbHVlICk7CisJCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCB4ICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfb2JqZWN0LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9vYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmMwOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfb2JqZWN0LmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdCBWYWxpZGF0b3Jfb2JqZWN0LgorICovCitwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl9vYmplY3QKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGNvbnN0cnVjdG9yKCAwLCAib2JqZWN0WzBdIiwgT2JqZWN0LmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMSwgIm9iamVjdFsxXSIsIE9iamVjdFtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgIm9iamVjdFsyXSIsIE9iamVjdFtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAzLCAib2JqZWN0WzNdIiwgT2JqZWN0W11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNCwgIm9iamVjdFs0XSIsIE9iamVjdFtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNSwgIm9iamVjdFs1XSIsIE9iamVjdFtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA2LCAib2JqZWN0WzZdIiwgT2JqZWN0W11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgIm9iamVjdFs3XSIsIE9iamVjdFtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOCwgIm9iamVjdFs4XSIsIE9iamVjdFtdW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA5LCAib2JqZWN0WzldIiwgT2JqZWN0W11bXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9vYmplY3QuZ2V0KCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9vYmplY3QuZ2V0KCAtMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9vYmplY3QuZ2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAwLCAwLCAib2JqZWN0WzBdIiwgT2JqZWN0LmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAwLCAib2JqZWN0WzBdIiwgT2JqZWN0LmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAxLCAib2JqZWN0WzFdIiwgT2JqZWN0W10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsIDIsICJvYmplY3RbMl0iLCBPYmplY3RbXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAzLCAib2JqZWN0WzNdIiwgT2JqZWN0W11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCA0LCAib2JqZWN0WzRdIiwgT2JqZWN0W11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsIDUsICJvYmplY3RbNV0iLCBPYmplY3RbXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCA2LCAib2JqZWN0WzZdIiwgT2JqZWN0W11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCA3LCAib2JqZWN0WzddIiwgT2JqZWN0W11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksIDgsICJvYmplY3RbOF0iLCBPYmplY3RbXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIGludCBuLCBpbnQgaywgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IChUeXBlVmFsaWRhdG9yKSBWYWxpZGF0b3Jfb2JqZWN0LmdldCggbiApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwkJYXNzZXJ0RXF1YWxzKCBrLCB2LmdldE5EaW1zKCkgKTsKKwkJYXNzZXJ0U2FtZSggZXhwZWN0ZWRDbGFzcywgdi5nZXRFeHBlY3RlZENsYXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBkZXNjciwgdi50b1N0cmluZygpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ29vZF9zY2FsYXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Z29vZHZhbHVlKCAwLCBmYWxzZSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCB0cnVlICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSAxICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAzMzMzMzMzMyApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCA1LjVmICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIDYuNiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAiIiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAiYWJjIiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgbmV3IFN0cnVjdFZhbHVlKCBuZXcgVHlwZSggImFiYyIgKSwgdmYgKSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgRGF0ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ29vZF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHByaW1pdGl2ZSBhcnJheSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG9iamVjdC4KKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIG5ldyBib29sZWFuW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgbmV3IGJ5dGVbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgc2hvcnRbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgaW50W10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgbmV3IGxvbmdbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgZmxvYXRbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgZG91YmxlW10ge30gKTsKKwkJCisJCS8vIHJlZiBhcnJheSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG9iamVjdC4KKworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgQm9vbGVhbltdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIG5ldyBCeXRlW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgbmV3IFNob3J0W10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgbmV3IEludGVnZXJbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgTG9uZ1tdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIG5ldyBGbG9hdFtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIG5ldyBEb3VibGVbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCBuZXcgU3RyaW5nW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgbmV3IE9iamVjdFtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIG5ldyBTdHJ1Y3RWYWx1ZVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIG5ldyBEYXRlW10ge30gKTsKKwkJCisJCS8vIHJlZiBhcnJheSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG9iamVjdCBhcnJheSAoc2FtZSBzaXplKS4KKwkJCisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBCb29sZWFuW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IEJ5dGVbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgU2hvcnRbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgSW50ZWdlcltdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBMb25nW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IEZsb2F0W10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IERvdWJsZVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBTdHJpbmdbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgT2JqZWN0W10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IFN0cnVjdFZhbHVlW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IERhdGVbXSB7fSApOworCQkKKwkJLy8gcmVmIGFycmF5IHR5cGVzIGFyZSBjb21wYXRpYmxlIHdpdGggb2JqZWN0IGFycmF5IChsYXJnZXIgc2l6ZSkuCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgQm9vbGVhbltdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IEJ5dGVbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBTaG9ydFtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IEludGVnZXJbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBMb25nW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAxLCBuZXcgRmxvYXRbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBEb3VibGVbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBTdHJpbmdbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBPYmplY3RbXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBTdHJ1Y3RWYWx1ZVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IERhdGVbXVtdIHt9ICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0Z29vZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9vYmplY3QuZ2V0KCBuICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIHZhbHVlICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdmFsaWRhdGVWYWx1ZU9rKCB2LCB2YWx1ZSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzaWduYWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgeDsKKwkJCisJCXggPSBuZXcgT2JqZWN0KCk7CisJCWFzc2VydFRydWUoIHgoIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzICkgKTsKKworCQl4ID0gbmV3IE9iamVjdFtdIHt9OworCQlhc3NlcnRUcnVlKCB4KCBPYmplY3QuY2xhc3MsIE9iamVjdFtdLmNsYXNzICkgKTsKKwkJCisJCXggPSBuZXcgT2JqZWN0W11bXSB7fTsKKwkJYXNzZXJ0VHJ1ZSggeCggT2JqZWN0LmNsYXNzLCBPYmplY3RbXVtdLmNsYXNzICkgKTsKKworCQl4ID0gbmV3IEludGVnZXIoIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggeCggT2JqZWN0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzICkgKTsKKwkJCisJCXggPSBuZXcgSW50ZWdlcltdIHt9OworCQlhc3NlcnRUcnVlKCB4KCBPYmplY3QuY2xhc3MsIEludGVnZXJbXS5jbGFzcyApICk7CisKKwkJeCA9IG5ldyBpbnRbXSB7fTsKKwkJYXNzZXJ0VHJ1ZSggeCggT2JqZWN0LmNsYXNzLCBpbnRbXS5jbGFzcyApICk7CisJCQorCQlhc3NlcnROb3ROdWxsKCB4ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzaWduYWJsZTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3RbXSB5OworCQkKKy8vCQl5ID0gbmV3IE9iamVjdCgpOworCQlhc3NlcnRGYWxzZSggeCggT2JqZWN0W10uY2xhc3MsIE9iamVjdC5jbGFzcyApICk7CisKKwkJeSA9IG5ldyBPYmplY3RbXSB7fTsKKwkJYXNzZXJ0VHJ1ZSggeCggT2JqZWN0W10uY2xhc3MsIE9iamVjdFtdLmNsYXNzICkgKTsKKwkJCisJCXkgPSBuZXcgT2JqZWN0W11bXSB7fTsKKwkJYXNzZXJ0VHJ1ZSggeCggT2JqZWN0W10uY2xhc3MsIE9iamVjdFtdW10uY2xhc3MgKSApOworCisvLwkJeSA9IG5ldyBJbnRlZ2VyKCAwICk7CisJCWFzc2VydEZhbHNlKCB4KCBPYmplY3RbXS5jbGFzcywgSW50ZWdlci5jbGFzcyApICk7CisJCQorCQl5ID0gbmV3IEludGVnZXJbXSB7IDEsIDIsIDMgfTsKKwkJeVswXSA9IDE7CisJCWFzc2VydFRydWUoIHgoIE9iamVjdFtdLmNsYXNzLCBJbnRlZ2VyW10uY2xhc3MgKSApOworCisvLwkJeSA9IG5ldyBpbnRbXSB7fTsKKwkJYXNzZXJ0RmFsc2UoIHgoIE9iamVjdFtdLmNsYXNzLCBpbnRbXS5jbGFzcyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEFycmF5U3RvcmVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFzc2lnbmFibGUzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0W10geCA9IG5ldyBJbnRlZ2VyW10geyAxLCAyLCAzIH07CisJCXhbMF0gPSB0cnVlOyAvLyB3cm9uZyB0eXBlIQorCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4geCggQ2xhc3M8Pz4gYSwgQ2xhc3M8Pz4gYiApCisJeworCQlyZXR1cm4gYS5pc0Fzc2lnbmFibGVGcm9tKCBiICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCBmYWxzZSApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgdHJ1ZSApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgKGJ5dGUpIDEgKTsKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgMzMzMzMzMzMgKTsKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCA1LjVmICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCA2LjYgKTsKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsICIiICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCAiYWJjIiApOworLy8JCXRlc3RiYWR2YWx1ZSggMCwgbmV3IE9iamVjdCgpICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApICkgKTsKKy8vCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBEYXRlKCkgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDEsIG51bGwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIHRydWUgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoYnl0ZSkgMSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IERhdGUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGJhZF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHByaW1pdGl2ZSBhcnJheXMgY2Fubm90IG1hcCBpbnRvIG9iamVjdCBhcnJheXMuLi4KKwkJCisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IGJvb2xlYW5bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBieXRlW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgc2hvcnRbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBpbnRbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBsb25nW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgZmxvYXRbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBkb3VibGVbXSB7fSApOworCisJCS8vIHRvbyBzaG9ydC4uLgorCQkKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgT2JqZWN0W10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgT2JqZWN0W11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBPYmplY3RbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgT2JqZWN0W11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgT2JqZWN0W11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBPYmplY3RbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgT2JqZWN0W11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgT2JqZWN0W11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9vYmplY3QuZ2V0KCBuICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydEZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9zaG9ydC5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfc2hvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY2ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RWYWxpZGF0b3Jfc2hvcnQuamF2YQpAQCAtMCwwICsxLDI4NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogQGF1dGhvciBNYW5vagorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3Jfc2hvcnQKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGNvbnN0cnVjdG9yKCAwLCAic2hvcnRbMF0iLCBTaG9ydC5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDEsICJzaG9ydFsxXSIsIHNob3J0W10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAyLCAic2hvcnRbMl0iLCBzaG9ydFtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAzLCAic2hvcnRbM10iLCBzaG9ydFtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDQsICJzaG9ydFs0XSIsIHNob3J0W11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA1LCAic2hvcnRbNV0iLCBzaG9ydFtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA2LCAic2hvcnRbNl0iLCBzaG9ydFtdW11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0Y29uc3RydWN0b3IoIDcsICJzaG9ydFs3XSIsIHNob3J0W11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA4LCAic2hvcnRbOF0iLCBzaG9ydFtdW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA5LCAic2hvcnRbOV0iLCBzaG9ydFtdW11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3RvciggaW50IG4sIFN0cmluZyBkZXNjciwgQ2xhc3M8Pz4gZXhwZWN0ZWRDbGFzcyApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3Jfc2hvcnQuZ2V0KCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9zaG9ydC5nZXQoIC0xICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmFsaWRhdG9yX3Nob3J0LmdldCggVmFsaWRhdG9yLk1BWF9ORElNUysxICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggMSwgInNob3J0WzBdIiwgU2hvcnQuY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDIsICJzaG9ydFsxXSIsIHNob3J0W10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJzaG9ydFsyXSIsIHNob3J0W11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNCwgInNob3J0WzNdIiwgc2hvcnRbXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDUsICJzaG9ydFs0XSIsIHNob3J0W11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJzaG9ydFs1XSIsIHNob3J0W11bXVtdW11bXS5jbGFzcyApOworCQl0ZXN0ZWxlbWVudHZhbGlkYXRvciggNywgInNob3J0WzZdIiwgc2hvcnRbXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDgsICJzaG9ydFs3XSIsIHNob3J0W11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJzaG9ydFs4XSIsIHNob3J0W11bXVtdW11bXVtdW11bXS5jbGFzcyApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3RlbGVtZW50dmFsaWRhdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IChUeXBlVmFsaWRhdG9yKSBWYWxpZGF0b3Jfc2hvcnQuZ2V0KCBuICkuZWxlbWVudFZhbGlkYXRvcigpOworCQlhc3NlcnRFcXVhbHMoIG4tMSwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3Jfc2hvcnQuZ2V0KCAwICkuZWxlbWVudFZhbGlkYXRvcigpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvb2Rfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQllURVMKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSAwICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgNjQgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgQnl0ZS5NQVhfVkFMVUUgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChieXRlKSAtMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoYnl0ZSkgLTY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIEJ5dGUuTUlOX1ZBTFVFICk7CisKKwkJLy8gU0hPUlRTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIDAgKTsKKwkJCisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgQnl0ZS5NQVhfVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIFNob3J0Lk1BWF9WQUxVRSApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKHNob3J0KSAtMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoc2hvcnQpIEJ5dGUuTUlOX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChzaG9ydCkgLTIyMjIgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgU2hvcnQuTUlOX1ZBTFVFICk7CisKKwkJLy8gSU5UUworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgMSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCA2NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAoaW50KSBCeXRlLk1BWF9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAyMjIyICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChpbnQpIFNob3J0Lk1BWF9WQUxVRSApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgLTEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgLTY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChpbnQpIEJ5dGUuTUlOX1ZBTFVFICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIC0yMjIyICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChpbnQpIFNob3J0Lk1JTl9WQUxVRSApOworCisJCS8vIExPTkdTCisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgMCApOworCQkKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIDEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIDY0ICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBCeXRlLk1BWF9WQUxVRSApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgMjIyMiApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgU2hvcnQuTUFYX1ZBTFVFICk7CisJCQorCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgLTEgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIC02NCApOworCQl0ZXN0Z29vZHZhbHVlKCAwLCAobG9uZykgQnl0ZS5NSU5fVkFMVUUgKTsKKwkJdGVzdGdvb2R2YWx1ZSggMCwgKGxvbmcpIC0yMjIyICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsIChsb25nKSBTaG9ydC5NSU5fVkFMVUUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb29kX2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGdvb2R2YWx1ZSggMSwgbmV3IHNob3J0W10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggMiwgbmV3IHNob3J0W11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAzLCBuZXcgc2hvcnRbXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNCwgbmV3IHNob3J0W11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNSwgbmV3IHNob3J0W11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA2LCBuZXcgc2hvcnRbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggNywgbmV3IHNob3J0W11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGdvb2R2YWx1ZSggOCwgbmV3IHNob3J0W11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA5LCBuZXcgc2hvcnRbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0Z29vZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9zaG9ydC5nZXQoIG4gKTsKKwkJYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggdmFsdWUgKSApOworCQlhc3NlcnRUcnVlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBiYWRfc2NhbGFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBudWxsICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgZmFsc2UgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCB0cnVlICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCAoYnl0ZSkgMSApOyBnb29kIQorLy8JCXRlc3RiYWR2YWx1ZSggMCwgKHNob3J0KSAyMjIyICk7IGdvb2QhCisJCXRlc3RiYWR2YWx1ZSggMCwgMzMzMzMzMzMgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA0NDQ0NDQ0NDQ0NDQ0NDQ0TCApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDUuNWYgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA2LjYgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAiIiApOworCQl0ZXN0YmFkdmFsdWUoIDAsICJhYmMiICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IE9iamVjdCgpICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IFN0cnVjdFZhbHVlKCBuZXcgVHlwZSggImFiYyIgKSwgdmYgKSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIG5ldyBEYXRlKCkgKTsKKworCQl0ZXN0YmFkdmFsdWUoIDEsIG51bGwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBmYWxzZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIHRydWUgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAoYnl0ZSkgMSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDMzMzMzMyApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDQ0NDQ0NDQ0NDQ0NDQ0NDRMICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNS41ZiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIDYuNiApOworCQl0ZXN0YmFkdmFsdWUoIDEsICIiICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgImFiYyIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgbmV3IERhdGUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGJhZF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IHNob3J0W10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgc2hvcnRbXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMiwgbmV3IHNob3J0W11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggMywgbmV3IHNob3J0W11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgc2hvcnRbXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNSwgbmV3IHNob3J0W11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggNiwgbmV3IHNob3J0W11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgc2hvcnRbXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOCwgbmV3IHNob3J0W11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3RiYWR2YWx1ZSggOSwgbmV3IHNob3J0W11bXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgc2hvcnRbXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDMsIG5ldyBzaG9ydFtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgc2hvcnRbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgc2hvcnRbXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDYsIG5ldyBzaG9ydFtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgc2hvcnRbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgc2hvcnRbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDksIG5ldyBzaG9ydFtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RiYWR2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3Jfc2hvcnQuZ2V0KCBuICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydEZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9zdHJpbmcuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX3N0cmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmIxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl9zdHJpbmcuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdCBWYWxpZGF0b3Jfc3RyaW5nLgorICovCitwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl9zdHJpbmcKK3sKKwlwcml2YXRlIGZpbmFsIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGNvbnN0cnVjdG9yKCAwLCAic3RyaW5nWzBdIiwgU3RyaW5nLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMSwgInN0cmluZ1sxXSIsIFN0cmluZ1tdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggMiwgInN0cmluZ1syXSIsIFN0cmluZ1tdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCAzLCAic3RyaW5nWzNdIiwgU3RyaW5nW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNCwgInN0cmluZ1s0XSIsIFN0cmluZ1tdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNSwgInN0cmluZ1s1XSIsIFN0cmluZ1tdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA2LCAic3RyaW5nWzZdIiwgU3RyaW5nW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggNywgInN0cmluZ1s3XSIsIFN0cmluZ1tdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3Rjb25zdHJ1Y3RvciggOCwgInN0cmluZ1s4XSIsIFN0cmluZ1tdW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGNvbnN0cnVjdG9yKCA5LCAic3RyaW5nWzldIiwgU3RyaW5nW11bXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdG9yKCBpbnQgbiwgU3RyaW5nIGRlc2NyLCBDbGFzczw/PiBleHBlY3RlZENsYXNzICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9zdHJpbmcuZ2V0KCBuICk7CisJCWFzc2VydEVxdWFscyggbiwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9zdHJpbmcuZ2V0KCAtMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVZhbGlkYXRvcl9zdHJpbmcuZ2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlbGVtZW50dmFsaWRhdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAxLCAic3RyaW5nWzBdIiwgU3RyaW5nLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCAyLCAic3RyaW5nWzFdIiwgU3RyaW5nW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDMsICJzdHJpbmdbMl0iLCBTdHJpbmdbXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA0LCAic3RyaW5nWzNdIiwgU3RyaW5nW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA1LCAic3RyaW5nWzRdIiwgU3RyaW5nW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDYsICJzdHJpbmdbNV0iLCBTdHJpbmdbXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA3LCAic3RyaW5nWzZdIiwgU3RyaW5nW11bXVtdW11bXVtdLmNsYXNzICk7CisJCXRlc3RlbGVtZW50dmFsaWRhdG9yKCA4LCAic3RyaW5nWzddIiwgU3RyaW5nW11bXVtdW11bXVtdW10uY2xhc3MgKTsKKwkJdGVzdGVsZW1lbnR2YWxpZGF0b3IoIDksICJzdHJpbmdbOF0iLCBTdHJpbmdbXVtdW11bXVtdW11bXVtdLmNsYXNzICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGVsZW1lbnR2YWxpZGF0b3IoIGludCBuLCBTdHJpbmcgZGVzY3IsIENsYXNzPD8+IGV4cGVjdGVkQ2xhc3MgKQorCXsKKwkJVHlwZVZhbGlkYXRvciB2ID0gKFR5cGVWYWxpZGF0b3IpIFZhbGlkYXRvcl9zdHJpbmcuZ2V0KCBuICkuZWxlbWVudFZhbGlkYXRvcigpOworCQlhc3NlcnRFcXVhbHMoIG4tMSwgdi5nZXRORGltcygpICk7CisJCWFzc2VydFNhbWUoIGV4cGVjdGVkQ2xhc3MsIHYuZ2V0RXhwZWN0ZWRDbGFzcygpICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIHYudG9TdHJpbmcoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZWxlbWVudHZhbGlkYXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlWYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApLmVsZW1lbnRWYWxpZGF0b3IoKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb29kX3NjYWxhcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rnb29kdmFsdWUoIDAsICIiICk7CisJCXRlc3Rnb29kdmFsdWUoIDAsICJhYmMiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ29vZF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rnb29kdmFsdWUoIDEsIG5ldyBTdHJpbmdbXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAyLCBuZXcgU3RyaW5nW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCAzLCBuZXcgU3RyaW5nW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDQsIG5ldyBTdHJpbmdbXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA1LCBuZXcgU3RyaW5nW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA2LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdIHt9ICk7CisJCXRlc3Rnb29kdmFsdWUoIDcsIG5ldyBTdHJpbmdbXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA4LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0Z29vZHZhbHVlKCA5LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdW11bXVtdIHt9ICk7CisJCWFzc2VydEVxdWFscyggOSwgVmFsaWRhdG9yLk1BWF9ORElNUyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGdvb2R2YWx1ZSggaW50IG4sIE9iamVjdCB2YWx1ZSApCisJeworCQlUeXBlVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3Jfc3RyaW5nLmdldCggbiApOworCQlhc3NlcnRUcnVlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydFRydWUoIHZhbGlkYXRlVmFsdWVPayggdiwgdmFsdWUgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGJhZF9zY2FsYXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0YmFkdmFsdWUoIDAsIG51bGwgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBmYWxzZSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIHRydWUgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCAoYnl0ZSkgMSApOworCQl0ZXN0YmFkdmFsdWUoIDAsIChzaG9ydCkgMjIyMiApOworCQl0ZXN0YmFkdmFsdWUoIDAsIDMzMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgNi42ICk7CisvLwkJdGVzdGJhZHZhbHVlKCAwLCAiIiApOyAvLyBnb29kIQorLy8JCXRlc3RiYWR2YWx1ZSggMCwgImFiYyIgKTsgLy8gZ29vZCEKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgT2JqZWN0KCkgKTsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RydWN0VmFsdWUoIG5ldyBUeXBlKCAiYWJjIiApLCB2ZiApICk7CisJCXRlc3RiYWR2YWx1ZSggMCwgbmV3IERhdGUoKSApOworCisJCXRlc3RiYWR2YWx1ZSggMSwgbnVsbCApOworCQl0ZXN0YmFkdmFsdWUoIDEsIGZhbHNlICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgdHJ1ZSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIChieXRlKSAxICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgKHNob3J0KSAyMjIyICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgMzMzMzMzICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNDQ0NDQ0NDQ0NDQ0NDQ0NEwgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCA1LjVmICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgNi42ICk7CisJCXRlc3RiYWR2YWx1ZSggMSwgIiIgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCAiYWJjIiApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBPYmplY3QoKSApOworCQl0ZXN0YmFkdmFsdWUoIDEsIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJhYmMiICksIHZmICkgKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgRGF0ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkX2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdGJhZHZhbHVlKCAwLCBuZXcgU3RyaW5nW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAxLCBuZXcgU3RyaW5nW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDIsIG5ldyBTdHJpbmdbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgU3RyaW5nW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA0LCBuZXcgU3RyaW5nW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDUsIG5ldyBTdHJpbmdbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA3LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDgsIG5ldyBTdHJpbmdbXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdW11bXVtdW10ge30gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBWYWxpZGF0b3IuTUFYX05ESU1TICk7CisKKwkJdGVzdGJhZHZhbHVlKCAyLCBuZXcgU3RyaW5nW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCAzLCBuZXcgU3RyaW5nW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDQsIG5ldyBTdHJpbmdbXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA1LCBuZXcgU3RyaW5nW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA2LCBuZXcgU3RyaW5nW11bXVtdW11bXSB7fSApOworCQl0ZXN0YmFkdmFsdWUoIDcsIG5ldyBTdHJpbmdbXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA4LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdW10ge30gKTsKKwkJdGVzdGJhZHZhbHVlKCA5LCBuZXcgU3RyaW5nW11bXVtdW11bXVtdW11bXSB7fSApOworCQlhc3NlcnRFcXVhbHMoIDksIFZhbGlkYXRvci5NQVhfTkRJTVMgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdGJhZHZhbHVlKCBpbnQgbiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCVR5cGVWYWxpZGF0b3IgdiA9IFZhbGlkYXRvcl9zdHJpbmcuZ2V0KCBuICk7CisJCWFzc2VydEZhbHNlKCB2LnZhbGlkYXRlKCB2YWx1ZSApICk7CisJCWFzc2VydEZhbHNlKCB2YWxpZGF0ZVZhbHVlT2soIHYsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZU9rKCBWYWxpZGF0b3IgdiwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgeCA9IHYudmFsaWRhdGVWYWx1ZSggdmFsdWUgKTsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl92b2lkLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcl92b2lkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzYTIzNgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9yX3ZvaWQuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0IFZhbGlkYXRvcl92b2lkLgorICovCitwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcl92b2lkCit7CisgICAgLyoqICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0KCkKKwl7CisJCXRlc3QoIDAsICJ2b2lkWzBdIiwgbnVsbCwgMSApOworCQl0ZXN0KCAwLCAidm9pZFswXSIsIG51bGwsIChmbG9hdCkgMiApOworCQl0ZXN0KCAwLCAidm9pZFswXSIsIG51bGwsIChkb3VibGUpIDMgKTsKKwkJdGVzdCggMCwgInZvaWRbMF0iLCBudWxsLCAoYnl0ZSkgNCApOworCQl0ZXN0KCAwLCAidm9pZFswXSIsIG51bGwsIChsb25nKSA1ICk7CisJCXRlc3QoIDAsICJ2b2lkWzBdIiwgbnVsbCwgKHNob3J0KSA2ICk7CisJCQorCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdCggaW50IG4sIFN0cmluZyBzLCBPYmplY3QgZ29vZCwgT2JqZWN0IGJhZCApCisJeworCQlWYWxpZGF0b3Jfdm9pZCB2ID0gVmFsaWRhdG9yX3ZvaWQuZ2V0KCBuICk7CisJCWFzc2VydFRydWUoIHYudmFsaWRhdGUoIGdvb2QgKSApOworCQlhc3NlcnRGYWxzZSggdi52YWxpZGF0ZSggYmFkICkgKTsKKwl9CisKKyAgICAvKiogKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RHZXROZWcxKCkKKwl7CisJCVZhbGlkYXRvcl92b2lkLmdldCggLTEgKTsKKwl9CisKKyAgICAvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXROZWcyKCkKKwl7CisJCWFzc2VydE51bGwoIFZhbGlkYXRvcl92b2lkLmdldCggMCApLmVsZW1lbnRWYWxpZGF0b3IoKSApOworCX0KKworICAgIC8qKiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgdGVzdEdldE1heFBsdXNPbmUoKQorCXsKKwkJVmFsaWRhdG9yX3ZvaWQuZ2V0KCBWYWxpZGF0b3IuTUFYX05ESU1TKzEgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcnMuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0VmFsaWRhdG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTVmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdFZhbGlkYXRvcnMuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKiogVGVzdHMgdmFyaW91cyB2YWxpZGF0b3JzICovCitwdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcnMKK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfYm9vbGVhbigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3QoIFZhbGlkYXRvcl9ib29sZWFuLmdldCggMiApLCAyLAorCQkJbmV3IGJvb2xlYW5bXVtdIHsgeyBmYWxzZSwgZmFsc2UgfSwgeyBmYWxzZSwgZmFsc2UgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIDIgKSwgMiwKKwkJCW5ldyBib29sZWFuW11bXSB7IHsgdHJ1ZSwgdHJ1ZSB9LCB7IHRydWUsIHRydWUgfSB9ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X2J5dGUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0KCBWYWxpZGF0b3JfYnl0ZS5nZXQoIDIgKSwgMiwKKwkJCW5ldyBieXRlW11bXSB7IHsgMCwgMCB9LCB7IDAsIDAgfSB9ICk7CisKKwkJdGVzdCggVmFsaWRhdG9yX2J5dGUuZ2V0KCAyICksIDIsCisJCQluZXcgYnl0ZVtdW10geyB7IDEsIDEgfSwgeyAxLCAxIH0gfSApOworCisJCXRlc3QoIFZhbGlkYXRvcl9ieXRlLmdldCggMiApLCAyLAorCQkJbmV3IGJ5dGVbXVtdIHsgeyAtMSwgLTEgfSwgeyAtMSwgLTEgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfYnl0ZS5nZXQoIDIgKSwgMiwKKwkJCW5ldyBieXRlW11bXSB7IHsgQnl0ZS5NQVhfVkFMVUUsIEJ5dGUuTUFYX1ZBTFVFIH0sIHsgQnl0ZS5NQVhfVkFMVUUsIEJ5dGUuTUFYX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2J5dGUuZ2V0KCAyICksIDIsCisJCQluZXcgYnl0ZVtdW10geyB7IEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1JTl9WQUxVRSB9LCB7IEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1JTl9WQUxVRSB9IH0gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3Rfc2hvcnQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0KCBWYWxpZGF0b3Jfc2hvcnQuZ2V0KCAyICksIDIsCisJCQluZXcgc2hvcnRbXVtdIHsgeyAwLCAwIH0sIHsgMCwgMCB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9zaG9ydC5nZXQoIDIgKSwgMiwKKwkJCW5ldyBzaG9ydFtdW10geyB7IDEsIDEgfSwgeyAxLCAxIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX3Nob3J0LmdldCggMiApLCAyLAorCQkJbmV3IHNob3J0W11bXSB7IHsgLTEsIC0xIH0sIHsgLTEsIC0xIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX3Nob3J0LmdldCggMiApLCAyLAorCQkJbmV3IHNob3J0W11bXSB7IHsgQnl0ZS5NQVhfVkFMVUUsIEJ5dGUuTUFYX1ZBTFVFIH0sIHsgQnl0ZS5NQVhfVkFMVUUsIEJ5dGUuTUFYX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX3Nob3J0LmdldCggMiApLCAyLAorCQkJbmV3IHNob3J0W11bXSB7IHsgQnl0ZS5NSU5fVkFMVUUsIEJ5dGUuTUlOX1ZBTFVFIH0sIHsgQnl0ZS5NSU5fVkFMVUUsIEJ5dGUuTUlOX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX3Nob3J0LmdldCggMiApLCAyLAorCQkJbmV3IHNob3J0W11bXSB7IHsgU2hvcnQuTUFYX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUgfSwgeyBTaG9ydC5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9zaG9ydC5nZXQoIDIgKSwgMiwKKwkJCW5ldyBzaG9ydFtdW10geyB7IFNob3J0Lk1JTl9WQUxVRSwgU2hvcnQuTUlOX1ZBTFVFIH0sIHsgU2hvcnQuTUlOX1ZBTFVFLCBTaG9ydC5NSU5fVkFMVUUgfSB9ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X2ludCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3QoIFZhbGlkYXRvcl9pbnQuZ2V0KCAyICksIDIsCisJCQluZXcgaW50W11bXSB7IHsgMCwgMCB9LCB7IDAsIDAgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfaW50LmdldCggMiApLCAyLAorCQkJbmV3IGludFtdW10geyB7IDEsIDEgfSwgeyAxLCAxIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2ludC5nZXQoIDIgKSwgMiwKKwkJCW5ldyBpbnRbXVtdIHsgeyAtMSwgLTEgfSwgeyAtMSwgLTEgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfaW50LmdldCggMiApLCAyLAorCQkJbmV3IGludFtdW10geyB7IEJ5dGUuTUFYX1ZBTFVFLCBCeXRlLk1BWF9WQUxVRSB9LCB7IEJ5dGUuTUFYX1ZBTFVFLCBCeXRlLk1BWF9WQUxVRSB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9pbnQuZ2V0KCAyICksIDIsCisJCQluZXcgaW50W11bXSB7IHsgQnl0ZS5NSU5fVkFMVUUsIEJ5dGUuTUlOX1ZBTFVFIH0sIHsgQnl0ZS5NSU5fVkFMVUUsIEJ5dGUuTUlOX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2ludC5nZXQoIDIgKSwgMiwKKwkJCW5ldyBpbnRbXVtdIHsgeyBTaG9ydC5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSB9LCB7IFNob3J0Lk1BWF9WQUxVRSwgU2hvcnQuTUFYX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2ludC5nZXQoIDIgKSwgMiwKKwkJCW5ldyBpbnRbXVtdIHsgeyBTaG9ydC5NSU5fVkFMVUUsIFNob3J0Lk1JTl9WQUxVRSB9LCB7IFNob3J0Lk1JTl9WQUxVRSwgU2hvcnQuTUlOX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2ludC5nZXQoIDIgKSwgMiwKKwkJCW5ldyBpbnRbXVtdIHsgeyBJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUgfSwgeyBJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfaW50LmdldCggMiApLCAyLAorCQkJbmV3IGludFtdW10geyB7IEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSB9LCB7IEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSB9IH0gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbG9uZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3QoIFZhbGlkYXRvcl9sb25nLmdldCggMiApLCAyLAorCQkJbmV3IGxvbmdbXVtdIHsgeyAwLCAwIH0sIHsgMCwgMCB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9sb25nLmdldCggMiApLCAyLAorCQkJbmV3IGxvbmdbXVtdIHsgeyAxLCAxIH0sIHsgMSwgMSB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9sb25nLmdldCggMiApLCAyLAorCQkJbmV3IGxvbmdbXVtdIHsgeyAtMSwgLTEgfSwgeyAtMSwgLTEgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfbG9uZy5nZXQoIDIgKSwgMiwKKwkJCW5ldyBsb25nW11bXSB7IHsgQnl0ZS5NQVhfVkFMVUUsIEJ5dGUuTUFYX1ZBTFVFIH0sIHsgQnl0ZS5NQVhfVkFMVUUsIEJ5dGUuTUFYX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2xvbmcuZ2V0KCAyICksIDIsCisJCQluZXcgbG9uZ1tdW10geyB7IEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1JTl9WQUxVRSB9LCB7IEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1JTl9WQUxVRSB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9sb25nLmdldCggMiApLCAyLAorCQkJbmV3IGxvbmdbXVtdIHsgeyBTaG9ydC5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSB9LCB7IFNob3J0Lk1BWF9WQUxVRSwgU2hvcnQuTUFYX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2xvbmcuZ2V0KCAyICksIDIsCisJCQluZXcgbG9uZ1tdW10geyB7IFNob3J0Lk1JTl9WQUxVRSwgU2hvcnQuTUlOX1ZBTFVFIH0sIHsgU2hvcnQuTUlOX1ZBTFVFLCBTaG9ydC5NSU5fVkFMVUUgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfbG9uZy5nZXQoIDIgKSwgMiwKKwkJCW5ldyBsb25nW11bXSB7IHsgSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFIH0sIHsgSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2xvbmcuZ2V0KCAyICksIDIsCisJCQluZXcgbG9uZ1tdW10geyB7IEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSB9LCB7IEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9sb25nLmdldCggMiApLCAyLAorCQkJbmV3IGxvbmdbXVtdIHsgeyBMb25nLk1BWF9WQUxVRSwgTG9uZy5NQVhfVkFMVUUgfSwgeyBMb25nLk1BWF9WQUxVRSwgTG9uZy5NQVhfVkFMVUUgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfbG9uZy5nZXQoIDIgKSwgMiwKKwkJCW5ldyBsb25nW11bXSB7IHsgTG9uZy5NSU5fVkFMVUUsIExvbmcuTUlOX1ZBTFVFIH0sIHsgTG9uZy5NSU5fVkFMVUUsIExvbmcuTUlOX1ZBTFVFIH0gfSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdF9mbG9hdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3QoIFZhbGlkYXRvcl9mbG9hdC5nZXQoIDIgKSwgMiwKKwkJCW5ldyBmbG9hdFtdW10geyB7IDAsIDAgfSwgeyAwLCAwIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2Zsb2F0LmdldCggMiApLCAyLAorCQkJbmV3IGZsb2F0W11bXSB7IHsgMSwgMSB9LCB7IDEsIDEgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfZmxvYXQuZ2V0KCAyICksIDIsCisJCQluZXcgZmxvYXRbXVtdIHsgeyAtMSwgLTEgfSwgeyAtMSwgLTEgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfZmxvYXQuZ2V0KCAyICksIDIsCisJCQluZXcgZmxvYXRbXVtdIHsgeyBGbG9hdC5NQVhfVkFMVUUsIEZsb2F0Lk1BWF9WQUxVRSB9LCB7IEZsb2F0Lk1BWF9WQUxVRSwgRmxvYXQuTUFYX1ZBTFVFIH0gfSApOworCQkKKwkJdGVzdCggVmFsaWRhdG9yX2Zsb2F0LmdldCggMiApLCAyLAorCQkJbmV3IGZsb2F0W11bXSB7IHsgRmxvYXQuTUlOX1ZBTFVFLCBGbG9hdC5NSU5fVkFMVUUgfSwgeyBGbG9hdC5NSU5fVkFMVUUsIEZsb2F0Lk1JTl9WQUxVRSB9IH0gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfZG91YmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdCggVmFsaWRhdG9yX2RvdWJsZS5nZXQoIDIgKSwgMiwKKwkJCW5ldyBkb3VibGVbXVtdIHsgeyAwLCAwIH0sIHsgMCwgMCB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9kb3VibGUuZ2V0KCAyICksIDIsCisJCQluZXcgZG91YmxlW11bXSB7IHsgMSwgMSB9LCB7IDEsIDEgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfZG91YmxlLmdldCggMiApLCAyLAorCQkJbmV3IGRvdWJsZVtdW10geyB7IC0xLCAtMSB9LCB7IC0xLCAtMSB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9kb3VibGUuZ2V0KCAyICksIDIsCisJCQluZXcgZG91YmxlW11bXSB7IHsgRG91YmxlLk1BWF9WQUxVRSwgRG91YmxlLk1BWF9WQUxVRSB9LCB7IERvdWJsZS5NQVhfVkFMVUUsIERvdWJsZS5NQVhfVkFMVUUgfSB9ICk7CisJCQorCQl0ZXN0KCBWYWxpZGF0b3JfZG91YmxlLmdldCggMiApLCAyLAorCQkJbmV3IGRvdWJsZVtdW10geyB7IERvdWJsZS5NSU5fVkFMVUUsIERvdWJsZS5NSU5fVkFMVUUgfSwgeyBEb3VibGUuTUlOX1ZBTFVFLCBEb3VibGUuTUlOX1ZBTFVFIH0gfSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdF9zdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0KCBWYWxpZGF0b3Jfc3RyaW5nLmdldCggMiApLCAyLAorCQkJbmV3IFN0cmluZ1tdW10geyB7ICIiLCAiIiB9LCB7ICIiLCAiIiB9IH0gKTsKKwkJCisJCXRlc3QoIFZhbGlkYXRvcl9zdHJpbmcuZ2V0KCAyICksIDIsCisJCQluZXcgU3RyaW5nW11bXSB7IHsgImFiYyIsICJhYmMiIH0sIHsgImFiYyIsICJhYmMiIH0gfSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdF9jdXN0b20oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0KCBWYWxpZGF0b3JfY3VzdG9tLmdldCggRGF0ZS5jbGFzcywgMiwgZmFsc2UgKSwgMiwKKwkJCW5ldyBEYXRlW11bXSB7IHsgbmV3IERhdGUoKSwgbmV3IERhdGUoKSB9LCB7IG5ldyBEYXRlKCksIG5ldyBEYXRlKCkgfSB9ICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0KCBWYWxpZGF0b3IgdiwgaW50IG4sIE9iamVjdCBvICkKKwl7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJ0ZXN0aW5nIHdpdGggJXNcbiIsIHYgKTsKKy8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuLCB2LmdldERpbSgpICk7CisJCQorCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggdi52YWxpZGF0ZSggbyApICk7CisJCQorCQlpZiAobiA+IDApCisJCXsKKwkJCQorCQkJCisJCQlpbnQgayA9IEFycmF5LmdldExlbmd0aCggbyApOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpKyspCisJCQkJdGVzdCggdi5lbGVtZW50VmFsaWRhdG9yKCksIG4tMSwgQXJyYXkuZ2V0KCBvLCBpICkgKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0X0V0Y2hfQXV0aEV4Y2VwdGlvbi5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RfRXRjaF9BdXRoRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhYmU0OQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvc3VwcG9ydC9UZXN0X0V0Y2hfQXV0aEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIF9FdGNoX0F1dGhFeGNlcHRpb24KKyAqLworcHVibGljIGNsYXNzIFRlc3RfRXRjaF9BdXRoRXhjZXB0aW9uCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlASWdub3JlCisJcHVibGljIHZvaWQgbm90aGluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gd3JpdGUgc29tZSB1bml0IHRlc3RzIGZvciBfRXRjaF9BdXRoRXhjZXB0aW9uCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RfRXRjaF9SdW50aW1lRXhjZXB0aW9uLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3N1cHBvcnQvVGVzdF9FdGNoX1J1bnRpbWVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RjNDkyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS9zdXBwb3J0L1Rlc3RfRXRjaF9SdW50aW1lRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qgb2YgX0V0Y2hfUnVudGltZUV4Y2VwdGlvbgorICovCitwdWJsaWMgY2xhc3MgVGVzdF9FdGNoX1J1bnRpbWVFeGNlcHRpb24KK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCUBJZ25vcmUKKwlwdWJsaWMgdm9pZCBub3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyB3cml0ZSBzb21lIHVuaXQgdGVzdHMgZm9yIF9FdGNoX1J1bnRpbWVFeGNlcHRpb24uCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdEFycmF5VmFsdWUuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RBcnJheVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwMTQyZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RBcnJheVZhbHVlLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0cyBBcnJheVZhbHVlLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEFycmF5VmFsdWUKK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFycmF5VmFsdWUgYXYgPSBuZXcgQXJyYXlWYWx1ZSggbmV3IGJ5dGVbMF0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMCwgYXYudHlwZUNvZGUoKSApOworCQlhc3NlcnROdWxsKCBhdi5jdXN0b21TdHJ1Y3RUeXBlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBhdi5kaW0oKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVR5cGUgdDEgPSBuZXcgVHlwZSggInQxIiApOworCQlBcnJheVZhbHVlIGF2ID0gbmV3IEFycmF5VmFsdWUoIG5ldyBieXRlWzBdLCAoYnl0ZSkgMSwgdDEsIDIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMSwgYXYudHlwZUNvZGUoKSApOworCQlhc3NlcnRFcXVhbHMoIHQxLCBhdi5jdXN0b21TdHJ1Y3RUeXBlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBhdi5kaW0oKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVR5cGUgdDIgPSBuZXcgVHlwZSggInQyIiApOworCQlBcnJheVZhbHVlIGF2ID0gbmV3IEFycmF5VmFsdWUoIG5ldyBieXRlWzBdLCAoYnl0ZSkgMywgdDIsIDQgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMywgYXYudHlwZUNvZGUoKSApOworCQlhc3NlcnRFcXVhbHMoIHQyLCBhdi5jdXN0b21TdHJ1Y3RUeXBlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA0LCBhdi5kaW0oKSApOworCX0KKwkKKwkvKiogKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZE1hbnkxKCkKKwl7CisJCURhdGUgZHQgPSBuZXcgRGF0ZSgpOworCQlBcnJheVZhbHVlIGF2ID0gbmV3IEFycmF5VmFsdWUoIG5ldyBPYmplY3RbXSB7IGZhbHNlLCAoYnl0ZSkgMSwgKHNob3J0KSAyLCAzLCAobG9uZykgNCwgKGZsb2F0KSAxLjUsIDEuNiwgImFiYyIsIG51bGwsIGR0IH0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMCwgYXYuc2l6ZSgpICk7CisJCWludCBpbmRleCA9IDA7CisJCWFzc2VydEVxdWFscyggZmFsc2UsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDEsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggKHNob3J0KSAyLCBhdi5nZXQoIGluZGV4KysgKSApOworCQlhc3NlcnRFcXVhbHMoIDMsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggKGxvbmcpIDQsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggKGZsb2F0KSAxLjUsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggMS42LCBhdi5nZXQoIGluZGV4KysgKSApOworCQlhc3NlcnRFcXVhbHMoICJhYmMiLCBhdi5nZXQoIGluZGV4KysgKSApOworCQlhc3NlcnRFcXVhbHMoIG51bGwsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggZHQsIGF2LmdldCggaW5kZXgrKyApICk7CisJfQorCQorCS8qKiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkTWFueTIoKQorCXsKKwkJRGF0ZSBkdCA9IG5ldyBEYXRlKCk7CisJCUFycmF5VmFsdWUgYXYgPSBuZXcgQXJyYXlWYWx1ZSggbmV3IE9iamVjdFtdIHsgKGZsb2F0KSAxLjUsIDEuNiwgImFiYyIsIG51bGwsIGR0LCBmYWxzZSwgKGJ5dGUpIDEsIChzaG9ydCkgMiwgMywgKGxvbmcpIDQgfSApOworCQlhc3NlcnRFcXVhbHMoIDEwLCBhdi5zaXplKCkgKTsKKwkJaW50IGluZGV4ID0gMDsKKwkJYXNzZXJ0RXF1YWxzKCAoZmxvYXQpIDEuNSwgYXYuZ2V0KCBpbmRleCsrICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLjYsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggbnVsbCwgYXYuZ2V0KCBpbmRleCsrICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBkdCwgYXYuZ2V0KCBpbmRleCsrICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBmYWxzZSwgYXYuZ2V0KCBpbmRleCsrICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMSwgYXYuZ2V0KCBpbmRleCsrICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoc2hvcnQpIDIsIGF2LmdldCggaW5kZXgrKyApICk7CisJCWFzc2VydEVxdWFscyggMywgYXYuZ2V0KCBpbmRleCsrICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAobG9uZykgNCwgYXYuZ2V0KCBpbmRleCsrICkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0RGVmYXVsdERlbGl2ZXJ5U2VydmljZS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdERlZmF1bHREZWxpdmVyeVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVjMGFkCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdERlZmF1bHREZWxpdmVyeVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIERlZmF1bHREZWxpdmVyeVNlcnZpY2UKKyAqLworcHVibGljIGNsYXNzIFRlc3REZWZhdWx0RGVsaXZlcnlTZXJ2aWNlCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlASWdub3JlCisJcHVibGljIHZvaWQgbm90aGluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gd3JpdGUgc29tZSB1bml0IHRlc3RzIGZvciBEZWZhdWx0RGVsaXZlcnlTZXJ2aWNlLgorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RGb3JtYXRGYWN0b3J5LmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0Rm9ybWF0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmFkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0Rm9ybWF0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qgb2YgRm9ybWF0RmFjdG9yeQorICovCitwdWJsaWMgY2xhc3MgVGVzdEZvcm1hdEZhY3RvcnkKK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCUBJZ25vcmUKKwlwdWJsaWMgdm9pZCBub3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyB3cml0ZSBzb21lIHVuaXQgdGVzdHMgZm9yIEZvcm1hdEZhY3RvcnkuCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdE1lc3NhZ2l6ZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RNZXNzYWdpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzMjI2YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RNZXNzYWdpemVyLmphdmEKQEAgLTAsMCArMSw1MDggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkNsYXNzMlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWZhdWx0VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2ludDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9sb25nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvblBhY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydFBhY2tldDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKiogKi8KK3B1YmxpYyBjbGFzcyBUZXN0TWVzc2FnaXplcgoreworCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgVkVSU0lPTiA9IDM7IC8vIEJpbmFyeVRhZ2dlZERhdGEuVkVSU0lPTjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIE5PTkUgPSAtMTI3OyAvLyBUeXBlQ29kZS5OT05FOworCQorCS8qKiAqLworCXB1YmxpYyBUZXN0TWVzc2FnaXplcigpCisJeworCQl0cmFuc3BvcnQgPSBuZXcgTXlUcmFuc3BvcnRQYWNrZXQoKTsKKwkJc2Vzc2lvbiA9IG5ldyBNeVNlc3Npb25NZXNzYWdlKCk7CisJCQorCQlSZXNvdXJjZXMgcmVzID0gbmV3IFJlc291cmNlcygpOworCQlyZXMucHV0KCBUcmFuc3BvcnQuVkFMVUVfRkFDVE9SWSwgdmYgKTsKKwkJCisJCW0gPSBuZXcgTWVzc2FnaXplciggdHJhbnNwb3J0LCAiZm9vOj9NZXNzYWdpemVyLmZvcm1hdD1iaW5hcnkiLCByZXMgKTsKKwkJbS5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgTXlWYWx1ZUZhY3RvcnkoICJ0Y3A6IiApOworCisJcHJpdmF0ZSBmaW5hbCBNeVRyYW5zcG9ydFBhY2tldCB0cmFuc3BvcnQ7CisKKwlwcml2YXRlIGZpbmFsIE15U2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKKworCXByaXZhdGUgZmluYWwgTWVzc2FnaXplciBtOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydCwgbS5nZXRUcmFuc3BvcnQoKSApOworCQlhc3NlcnRTYW1lKCBzZXNzaW9uLCBtLmdldFNlc3Npb24oKSApOworCQlhc3NlcnRTYW1lKCBtLCB0cmFuc3BvcnQuZ2V0U2Vzc2lvbigpICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUZXN0IFBhY2tldEhhbmRsZXIgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworLy8JQFRlc3QKKy8vCXB1YmxpYyB2b2lkIHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgorLy8JeworLy8JCVBhY2tldEhhbmRsZXIgcGggPSBtOworLy8KKy8vCQlhc3NlcnROdWxsKCBtaC53aGF0ICk7CisvLwkJYXNzZXJ0TnVsbCggbWguc3JjICk7CisvLworLy8JCXBoLnVwKCBwcyApOworLy8KKy8vCQlhc3NlcnRTYW1lKCBXaGF0LlRFU1RNRVNTQUdFSEFORExFUlVQLCBtaC53aGF0ICk7CisvLwkJYXNzZXJ0U2FtZSggbSwgbWguc3JjICk7CisvLwkJYXNzZXJ0U2FtZSggcHMsIG0uZ2V0U291cmNlKCkgKTsKKy8vCX0KKwkKKwlwcml2YXRlIGZpbmFsIFdobyB3aG8gPSBuZXcgV2hvKCkgeyAvKiBub3RoaW5nICovIH07CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhY2tldDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsgVkVSU0lPTiwgMSwgMCwgTk9ORSB9ICk7CisJCQorCQlzZXNzaW9uLm1zZ19oYW5kbGVkID0gdHJ1ZTsKKwkJCisJCW0uc2Vzc2lvblBhY2tldCggd2hvLCBidWYgKTsKKwkJCisJCWFzc2VydFNhbWUoIFdoYXQuU0VTU0lPTl9NRVNTQUdFLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggd2hvLCBzZXNzaW9uLnNlbmRlciApOworCQlhc3NlcnRTYW1lKCBNeVZhbHVlRmFjdG9yeS5tdF9hZGQsIHNlc3Npb24ubXNnLnR5cGUoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHNlc3Npb24ubXNnLnNpemUoKSApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLmV2ZW50ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYWNrZXQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7IFZFUlNJT04sIDEsIDAsIE5PTkUgfSApOworCQkKKwkJc2Vzc2lvbi5tc2dfaGFuZGxlZCA9IGZhbHNlOworCQkKKwkJbS5zZXNzaW9uUGFja2V0KCB3aG8sIGJ1ZiApOworCQkKKwkJYXNzZXJ0U2FtZSggV2hhdC5TRVNTSU9OX05PVElGWSwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFNhbWUoIHdobywgc2Vzc2lvbi5zZW5kZXIgKTsKKwkJYXNzZXJ0U2FtZSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkLCBzZXNzaW9uLm1zZy50eXBlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBzZXNzaW9uLm1zZy5zaXplKCkgKTsKKwkJYXNzZXJ0Tm90TnVsbCggc2Vzc2lvbi5ldmVudCApOworCQkKKwkJVW53YW50ZWRNZXNzYWdlIHVtID0gKFVud2FudGVkTWVzc2FnZSkgc2Vzc2lvbi5ldmVudDsKKwkJYXNzZXJ0U2FtZSggc2Vzc2lvbi5zZW5kZXIsIHVtLnNlbmRlciApOworCQlhc3NlcnRTYW1lKCBzZXNzaW9uLm1zZywgdW0ubXNnICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYWNrZXQzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7IFZFUlNJT04sIDIsIDAsIE5PTkUgfSApOworCQkKKwkJc2Vzc2lvbi5tc2dfaGFuZGxlZCA9IHRydWU7CisJCQorCQltLnNlc3Npb25QYWNrZXQoIHdobywgYnVmICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlNFU1NJT05fTUVTU0FHRSwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFNhbWUoIHdobywgc2Vzc2lvbi5zZW5kZXIgKTsKKwkJYXNzZXJ0Tm90TnVsbCggc2Vzc2lvbi5tc2cgKTsKKwkJYXNzZXJ0U2FtZSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkX3Jlc3VsdCwgc2Vzc2lvbi5tc2cudHlwZSgpICk7CisJCWFzc2VydEVxdWFscyggMCwgc2Vzc2lvbi5tc2cuc2l6ZSgpICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uZXZlbnQgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhY2tldDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsgVkVSU0lPTiwgMiwgMCwgTk9ORSB9ICk7CisJCQorCQlzZXNzaW9uLm1zZ19oYW5kbGVkID0gZmFsc2U7CisJCQorCQltLnNlc3Npb25QYWNrZXQoIHdobywgYnVmICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlNFU1NJT05fTk9USUZZLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggd2hvLCBzZXNzaW9uLnNlbmRlciApOworCQlhc3NlcnRTYW1lKCBNeVZhbHVlRmFjdG9yeS5tdF9hZGRfcmVzdWx0LCBzZXNzaW9uLm1zZy50eXBlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBzZXNzaW9uLm1zZy5zaXplKCkgKTsKKwkJYXNzZXJ0Tm90TnVsbCggc2Vzc2lvbi5ldmVudCApOworCQkKKwkJVW53YW50ZWRNZXNzYWdlIHVtID0gKFVud2FudGVkTWVzc2FnZSkgc2Vzc2lvbi5ldmVudDsKKwkJYXNzZXJ0U2FtZSggc2Vzc2lvbi5zZW5kZXIsIHVtLnNlbmRlciApOworCQlhc3NlcnRTYW1lKCBzZXNzaW9uLm1zZywgdW0ubXNnICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBtZXNzYWdlMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIE15VmFsdWVGYWN0b3J5Lm10X2FkZCwgdmYgKTsKKwkJdHJhbnNwb3J0LmhlYWRlcl9zaXplID0gMDsKKwkJCisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCQorCQltLnRyYW5zcG9ydE1lc3NhZ2UoIHdobywgbXNnICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfUEFDS0VULCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnRTYW1lKCB3aG8sIHRyYW5zcG9ydC5yZWNpcGllbnQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggdHJhbnNwb3J0LmJ1ZiApOworCQlhc3NlcnRFcXVhbHMoIDQsIHRyYW5zcG9ydC5idWYubGVuZ3RoICk7CisJCWFzc2VydEVxdWFscyggVkVSU0lPTiwgdHJhbnNwb3J0LmJ1ZlswXSApOyAvLyB2ZXJzaW9uCisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDEsIHRyYW5zcG9ydC5idWZbMV0gKTsgLy8gbWVzc2FnZSB0eXBlCisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDAsIHRyYW5zcG9ydC5idWZbMl0gKTsgLy8gbGVuZ3RoCisJCWFzc2VydEVxdWFscyggTk9ORSwgdHJhbnNwb3J0LmJ1ZlszXSApOyAvLyBub25lCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBtZXNzYWdlMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIE15VmFsdWVGYWN0b3J5Lm10X2FkZF9yZXN1bHQsIHZmICk7CisJCXRyYW5zcG9ydC5oZWFkZXJfc2l6ZSA9IDg7CisJCQorCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQkKKwkJbS50cmFuc3BvcnRNZXNzYWdlKCB3aG8sIG1zZyApOworCisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX1BBQ0tFVCwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggd2hvLCB0cmFuc3BvcnQucmVjaXBpZW50ICk7CisJCWFzc2VydE5vdE51bGwoIHRyYW5zcG9ydC5idWYgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMiwgdHJhbnNwb3J0LmJ1Zi5sZW5ndGggKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMCwgdHJhbnNwb3J0LmJ1ZlswXSApOyAvLyBwYWNrZXQgaGVhZGVyLi4uCisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDAsIHRyYW5zcG9ydC5idWZbMV0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMCwgdHJhbnNwb3J0LmJ1ZlsyXSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAwLCB0cmFuc3BvcnQuYnVmWzNdICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDAsIHRyYW5zcG9ydC5idWZbNF0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMCwgdHJhbnNwb3J0LmJ1Zls1XSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAwLCB0cmFuc3BvcnQuYnVmWzZdICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDAsIHRyYW5zcG9ydC5idWZbN10gKTsKKwkJYXNzZXJ0RXF1YWxzKCBWRVJTSU9OLCB0cmFuc3BvcnQuYnVmWzhdICk7IC8vIHZlcnNpb24KKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMiwgdHJhbnNwb3J0LmJ1Zls5XSApOyAvLyBtZXNzYWdlIHR5cGUKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMCwgdHJhbnNwb3J0LmJ1ZlsxMF0gKTsgLy8gbGVuZ3RoCisJCWFzc2VydEVxdWFscyggTk9ORSwgdHJhbnNwb3J0LmJ1ZlsxMV0gKTsgLy8gbm9uZQorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2Vzc2lvblF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IFFVRVJZID0gImZvbyI7CisJCU9iamVjdCBSRVNVTFQgPSAiYmFyIjsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnF1ZXJ5ICk7CisJCXNlc3Npb24ucXVlcnlfcmVzdWx0ID0gUkVTVUxUOworCQkKKwkJT2JqZWN0IHJlc3VsdCA9IG0uc2Vzc2lvblF1ZXJ5KCBRVUVSWSApOworCisJCWFzc2VydFNhbWUoIFdoYXQuU0VTU0lPTl9RVUVSWSwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFNhbWUoIFFVRVJZLCBzZXNzaW9uLnF1ZXJ5ICk7CisJCWFzc2VydFNhbWUoIFJFU1VMVCwgcmVzdWx0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBDT05UUk9MID0gImZvbyI7CisJCU9iamVjdCBWQUxVRSA9ICJiYXIiOworCQkKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uY29udHJvbCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnZhbHVlICk7CisJCQorCQltLnNlc3Npb25Db250cm9sKCBDT05UUk9MLCBWQUxVRSApOworCisJCWFzc2VydFNhbWUoIFdoYXQuU0VTU0lPTl9DT05UUk9MLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggQ09OVFJPTCwgc2Vzc2lvbi5jb250cm9sICk7CisJCWFzc2VydFNhbWUoIFZBTFVFLCBzZXNzaW9uLnZhbHVlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IEVWRU5UID0gImZvbyI7CisJCQorCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5ldmVudCApOworCQkKKwkJbS5zZXNzaW9uTm90aWZ5KCBFVkVOVCApOworCisJCWFzc2VydFNhbWUoIFdoYXQuU0VTU0lPTl9OT1RJRlksIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRTYW1lKCBFVkVOVCwgc2Vzc2lvbi5ldmVudCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgUVVFUlkgPSAiZm9vIjsKKwkJT2JqZWN0IFJFU1VMVCA9ICJiYXIiOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCXRyYW5zcG9ydC5xdWVyeV9yZXN1bHQgPSBSRVNVTFQ7CisJCQorCQlPYmplY3QgcmVzdWx0ID0gbS50cmFuc3BvcnRRdWVyeSggUVVFUlkgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9RVUVSWSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggUVVFUlksIHRyYW5zcG9ydC5xdWVyeSApOworCQlhc3NlcnRTYW1lKCBSRVNVTFQsIHJlc3VsdCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBDT05UUk9MID0gImZvbyI7CisJCU9iamVjdCBWQUxVRSA9ICJiYXIiOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmNvbnRyb2wgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnZhbHVlICk7CisJCQorCQltLnRyYW5zcG9ydENvbnRyb2woIENPTlRST0wsIFZBTFVFICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfQ09OVFJPTCwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggQ09OVFJPTCwgdHJhbnNwb3J0LmNvbnRyb2wgKTsKKwkJYXNzZXJ0U2FtZSggVkFMVUUsIHRyYW5zcG9ydC52YWx1ZSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0Tm90aWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IEVWRU5UID0gImZvbyI7CisJCQorCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuZXZlbnQgKTsKKwkJCisJCW0udHJhbnNwb3J0Tm90aWZ5KCBFVkVOVCApOworCisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX05PVElGWSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggRVZFTlQsIHRyYW5zcG9ydC5ldmVudCApOworCX0KKworCS8qKgorCSAqIFJlcG9ydHMgYWN0aXZpdGllcyB3aGljaCBvY2N1ci4KKwkgKi8KKwlwdWJsaWMgZW51bSBXaGF0CisJeworCQkvKiogKi8gVFJBTlNQT1JUX1BBQ0tFVCwKKwkJLyoqICovIFRSQU5TUE9SVF9RVUVSWSwKKwkJLyoqICovIFRSQU5TUE9SVF9DT05UUk9MLAorCQkvKiogKi8gVFJBTlNQT1JUX05PVElGWSwKKwkJLyoqICovIFNFU1NJT05fTUVTU0FHRSwKKwkJLyoqICovIFNFU1NJT05fUVVFUlksCisJCS8qKiAqLyBTRVNTSU9OX0NPTlRST0wsCisJCS8qKiAqLyBTRVNTSU9OX05PVElGWQorCX07CisKKwkvKiogKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15VHJhbnNwb3J0UGFja2V0IGltcGxlbWVudHMgVHJhbnNwb3J0UGFja2V0CisJeworCQkvKiogKi8gcHVibGljIGludCBoZWFkZXJfc2l6ZTsKKwkJLyoqICovIHB1YmxpYyBXaGF0IHdoYXQ7CisJCS8qKiAqLyBwdWJsaWMgV2hvIHJlY2lwaWVudDsKKwkJLyoqICovIHB1YmxpYyBieXRlW10gYnVmOworCQkvKiogKi8gcHVibGljIE9iamVjdCBxdWVyeTsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgcXVlcnlfcmVzdWx0OworCQkvKiogKi8gcHVibGljIE9iamVjdCBjb250cm9sOworCQkvKiogKi8gcHVibGljIE9iamVjdCB2YWx1ZTsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgZXZlbnQ7CisJCQorCQlwdWJsaWMgaW50IGhlYWRlclNpemUoKQorICAgICAgICB7CisJICAgICAgICByZXR1cm4gaGVhZGVyX3NpemU7CisgICAgICAgIH0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRQYWNrZXQoIFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisJICAgICAgICB3aGF0ID0gV2hhdC5UUkFOU1BPUlRfUEFDS0VUOworCSAgICAgICAgdGhpcy5yZWNpcGllbnQgPSByZWNpcGllbnQ7CisJICAgICAgICB0aGlzLmJ1ZiA9IGJ1Zi5nZXRBdmFpbEJ5dGVzKCk7CisgICAgICAgIH0KKworCQlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlRSQU5TUE9SVF9RVUVSWTsKKwkJCXRoaXMucXVlcnkgPSBxdWVyeTsKKwkJCXJldHVybiBxdWVyeV9yZXN1bHQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfQ09OVFJPTDsKKwkJCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJd2hhdCA9IFdoYXQuVFJBTlNQT1JUX05PVElGWTsKKwkJCXRoaXMuZXZlbnQgPSBldmVudDsKKwkJfQorCisJCXB1YmxpYyBTZXNzaW9uUGFja2V0IGdldFNlc3Npb24oKQorCQl7CisJCQlyZXR1cm4gc2Vzc2lvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25QYWNrZXQgc2Vzc2lvbiApCisJCXsKKwkJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisJCX0KKwkJCisJCXByaXZhdGUgU2Vzc2lvblBhY2tldCBzZXNzaW9uOworCX0KKworCS8qKiAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXNzaW9uTWVzc2FnZSBpbXBsZW1lbnRzIFNlc3Npb25NZXNzYWdlCisJeworCQkvKiogKi8KKwkJcHVibGljIFdoYXQgd2hhdDsKKwkJLyoqICovCisJCXB1YmxpYyBXaG8gc2VuZGVyOworCQkvKiogKi8KKwkJcHVibGljIE1lc3NhZ2UgbXNnOworCQkvKiogKi8KKwkJcHVibGljIGJvb2xlYW4gbXNnX2hhbmRsZWQ7CisJCS8qKiAqLworCQlwdWJsaWMgT2JqZWN0IHF1ZXJ5OworCQkvKiogKi8KKwkJcHVibGljIE9iamVjdCBxdWVyeV9yZXN1bHQ7CisJCS8qKiAqLworCQlwdWJsaWMgT2JqZWN0IGNvbnRyb2w7CisJCS8qKiAqLworCQlwdWJsaWMgT2JqZWN0IHZhbHVlOworCQkvKiogKi8KKwkJcHVibGljIE9iamVjdCBldmVudDsKKworCQlwdWJsaWMgYm9vbGVhbiBzZXNzaW9uTWVzc2FnZSggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlNFU1NJT05fTUVTU0FHRTsKKwkJCXRoaXMuc2VuZGVyID0gc2VuZGVyOworCQkJdGhpcy5tc2cgPSBtc2c7CisJCQlyZXR1cm4gbXNnX2hhbmRsZWQ7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkKKwkJeworCQkJd2hhdCA9IFdoYXQuU0VTU0lPTl9RVUVSWTsKKwkJCXRoaXMucXVlcnkgPSBxdWVyeTsKKwkJCXJldHVybiBxdWVyeV9yZXN1bHQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCXsKKwkJCXdoYXQgPSBXaGF0LlNFU1NJT05fQ09OVFJPTDsKKwkJCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKQorCQl7CisJCQl3aGF0ID0gV2hhdC5TRVNTSU9OX05PVElGWTsKKwkJCXRoaXMuZXZlbnQgPSBldmVudDsKKwkJfQorCX0KKwkKKwkvKiogUHJpdmF0ZSB2YWx1ZSBmYWN0b3J5IGZvciB0ZXN0aW5nLiAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlWYWx1ZUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0VmFsdWVGYWN0b3J5CisJeworCQkvKioKKwkJICogQ29uc3RydWN0IE15VmFsdWVGYWN0b3J5LgorCQkgKiBAcGFyYW0gdXJpIAorCQkgKi8KKwkJcHVibGljIE15VmFsdWVGYWN0b3J5KCBTdHJpbmcgdXJpICkKKwkJeworCQkJc3VwZXIoIHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisJCQorCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisJCXN0YXRpYworCQl7CisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5LmluaXQoIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKworCQkvKiogKi8KKwkJcHVibGljIGZpbmFsIHN0YXRpYyBUeXBlIG10X2FkZCA9IHR5cGVzLmFkZCggbmV3IFR5cGUoIDEsICJhZGQiICkgKTsKKworCQkvKiogKi8KKwkJcHVibGljIGZpbmFsIHN0YXRpYyBUeXBlIG10X2FkZF9yZXN1bHQgPSB0eXBlcy5hZGQoIG5ldyBUeXBlKCAyLCAiYWRkX3Jlc3VsdCIgKSApOworCisJCS8qKiAqLworCQlwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIG1mX3ggPSBuZXcgRmllbGQoIDMsICJ4IiApOworCisJCS8qKiAqLworCQlwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIG1mX3kgPSBuZXcgRmllbGQoIDQsICJ5IiApOworCisJCS8qKiAqLworCQlwdWJsaWMgZmluYWwgc3RhdGljIEZpZWxkIG1mX3Jlc3VsdCA9IG5ldyBGaWVsZCggNSwgInhyZXN1bHQiICk7CisJCQorCQlzdGF0aWMKKwkJeworCQkJbXRfYWRkLnB1dFZhbGlkYXRvciggbWZfeCwgVmFsaWRhdG9yX2ludC5nZXQoIDAgKSApOworCQkJbXRfYWRkLnB1dFZhbGlkYXRvciggbWZfeSwgVmFsaWRhdG9yX2ludC5nZXQoIDAgKSApOworCQkJbXRfYWRkLnB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisKKwkJCW10X2FkZF9yZXN1bHQucHV0VmFsaWRhdG9yKCBtZl9yZXN1bHQsIFZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJCW10X2FkZF9yZXN1bHQucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKwkJCW10X2FkZF9yZXN1bHQucHV0VmFsaWRhdG9yKCBfbWZfX2luUmVwbHlUbywgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RQbGFpbk1haWxib3guamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RQbGFpbk1haWxib3guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU2OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdFBsYWluTWFpbGJveC5qYXZhCkBAIC0wLDAgKzEsNzExIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EdW1teVZhbHVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0Lk1haWxib3g7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94LkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94Lk5vdGlmeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiBUZXN0IG9mIFBsYWluTWFpbGJveCAqLworcHVibGljIGNsYXNzIFRlc3RQbGFpbk1haWxib3gKK3sKKwlwcml2YXRlIGZpbmFsIE15TWFpbGJveE1hbmFnZXIgbW1nciA9IG5ldyBNeU1haWxib3hNYW5hZ2VyKCk7CisKKwlwcml2YXRlIGZpbmFsIE15Tm90aWZ5IG5vdGlmeSA9IG5ldyBNeU5vdGlmeSgpOworCXByaXZhdGUgZmluYWwgTXlOb3RpZnkgbm90aWZ5MSA9IG5ldyBNeU5vdGlmeSgpOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RDb25zdHJ1Y3QoIDFMICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQluZXcgUGxhaW5NYWlsYm94KCBudWxsLCAxTCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW5ldyBQbGFpbk1haWxib3goIG1tZ3IsIG51bGwgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbG9zZURlbGl2ZXJ5MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG9wZW4gbWFpbGJveCBhbmQgY2xvc2UgaXQgZm9yIGRlbGl2ZXJ5IHdoaWxlIGVtcHR5LgorCQkKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCApOworCQkKKwkJY2hlY2tDbG9zZURlbGl2ZXJ5KCBtYiwgdHJ1ZSApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsb3NlRGVsaXZlcnkyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gb3BlbiBtYWlsYm94IGFuZCBjbG9zZSBpdCBmb3IgZGVsaXZlcnkgd2hpbGUgbm90IGVtcHR5LgorCQkKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCApOworCQkKKwkJY2hlY2tEZWxpdmVyKCBtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBmb29fbXNnICk7CisJCWNoZWNrTWFpbGJveCggbWIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrQ2xvc2VEZWxpdmVyeSggbWIsIHRydWUgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbG9zZURlbGl2ZXJ5MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG9wZW4gbWFpbGJveCBhbmQgY2xvc2UgaXQgZm9yIGRlbGl2ZXJ5IHR3aWNlLgorCQkKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCApOworCQkKKwkJY2hlY2tDbG9zZURlbGl2ZXJ5KCBtYiwgdHJ1ZSApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMCApOworCQkKKwkJY2hlY2tDbG9zZURlbGl2ZXJ5KCBtYiwgZmFsc2UgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbG9zZVJlYWQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gb3BlbiBtYWlsYm94IGFuZCBjbG9zZSBpdCBmb3IgcmVhZGluZyB3aGlsZSBlbXB0eS4KKwkJCisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrQ2xvc2VSZWFkKCBtYiwgdHJ1ZSApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsb3NlUmVhZDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBvcGVuIG1haWxib3ggYW5kIGNsb3NlIGl0IGZvciByZWFkaW5nIHdoaWxlIG5vdCBlbXB0eS4KKwkJCisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrRGVsaXZlciggbWIsIHRydWUsIGFsaWNlX3dobywgZm9vX21zZyApOworCQljaGVja01haWxib3goIG1iLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0Nsb3NlUmVhZCggbWIsIHRydWUgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDEgKTsKKwkJY2hlY2tSZWRlbGl2ZXJlZCggMCwgYWxpY2Vfd2hvLCBmb29fbXNnICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2xvc2VSZWFkMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG9wZW4gbWFpbGJveCBhbmQgY2xvc2UgaXQgZm9yIHJlYWRpbmcgdHdpY2Ugd2hpbGUgZW1wdHkuCisJCQorCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0Nsb3NlUmVhZCggbWIsIHRydWUgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDAgKTsKKwkJCisJCWNoZWNrQ2xvc2VSZWFkKCBtYiwgZmFsc2UgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbG9zZVJlYWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gb3BlbiBtYWlsYm94IGFuZCBjbG9zZSBpdCBmb3IgcmVhZGluZyB0d2ljZSB3aGlsZSBub3QgZW1wdHkuCisJCQorCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0RlbGl2ZXIoIG1iLCB0cnVlLCBhbGljZV93aG8sIGZvb19tc2cgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCApOworCQkKKwkJY2hlY2tDbG9zZVJlYWQoIG1iLCB0cnVlICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAxICk7CisJCWNoZWNrUmVkZWxpdmVyZWQoIDAsIGFsaWNlX3dobywgZm9vX21zZyApOworCQkKKwkJY2hlY2tDbG9zZVJlYWQoIG1iLCBmYWxzZSApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMSApOworCQljaGVja1JlZGVsaXZlcmVkKCAwLCBhbGljZV93aG8sIGZvb19tc2cgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmdWxsMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrRGVsaXZlciggbWIsIHRydWUsIGZyZWRfd2hvLCBmb29fbXNnICk7CisJCWNoZWNrTWFpbGJveCggbWIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrRGVsaXZlciggbWIsIGZhbHNlLCBhbGljZV93aG8sIGJhcl9tc2cgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZ1bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCApOworCQkKKwkJY2hlY2tEZWxpdmVyKCBtYiwgdHJ1ZSwgZnJlZF93aG8sIGZvb19tc2cgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCApOworCQkKKwkJY2hlY2tEZWxpdmVyKCBtYiwgZmFsc2UsIGFsaWNlX3dobywgYmFyX21zZyApOworCQljaGVja01haWxib3goIG1iLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0RlbGl2ZXIoIG1iLCBmYWxzZSwgbWFya193aG8sIGJhel9tc2cgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcmVhZDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0RlbGl2ZXIoIG1iLCB0cnVlLCBhbGljZV93aG8sIGJhcl9tc2cgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgMCApOworCisJCWNoZWNrUmVhZCggbWIsIHRydWUsIGFsaWNlX3dobywgYmFyX21zZyApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0Nsb3NlRGVsaXZlcnkoIG1iLCB0cnVlICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWFkMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrRGVsaXZlciggbWIsIHRydWUsIGFsaWNlX3dobywgYmFyX21zZyApOworCQljaGVja01haWxib3goIG1iLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0Nsb3NlRGVsaXZlcnkoIG1iLCB0cnVlICk7CisJCWNoZWNrTWFpbGJveCggbWIsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCAwICk7CisKKwkJY2hlY2tSZWFkKCBtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBiYXJfbXNnICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWFkMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrRGVsaXZlciggbWIsIHRydWUsIGFsaWNlX3dobywgYmFyX21zZyApOworCQljaGVja01haWxib3goIG1iLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0Nsb3NlRGVsaXZlcnkoIG1iLCB0cnVlICk7CisJCWNoZWNrTWFpbGJveCggbWIsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCAwICk7CisKKwkJY2hlY2tSZWFkKCBtYiwgdHJ1ZSwgYWxpY2Vfd2hvLCBiYXJfbXNnICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWFkNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCWNoZWNrQ2xvc2VEZWxpdmVyeSggbWIsIHRydWUgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDAgKTsKKworCQljaGVja1JlYWQoIG1iLCBmYWxzZSwgbnVsbCwgbnVsbCApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0IEBJZ25vcmUKKwlwdWJsaWMgdm9pZCByZWFkNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKwkJCisJCVRocmVhZC5zbGVlcCggMTAwMCApOworCisJCWNoZWNrUmVhZCggbWIsIGZhbHNlLCBudWxsLCBudWxsICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QgQElnbm9yZQorCXB1YmxpYyB2b2lkIHJlYWQ2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCApOworCisJCWNoZWNrUmVhZCggbWIsIGZhbHNlLCBudWxsLCBudWxsICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWFkNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAgKTsKKworCQljaGVja1JlYWQoIG1iLCAtMSwgZmFsc2UsIG51bGwsIG51bGwgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcmVhZDgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwICk7CisKKwkJY2hlY2tSZWFkKCBtYiwgMSwgZmFsc2UsIG51bGwsIG51bGwgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsaXZlcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQljaGVja01haWxib3goIG1iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwICk7CisJCQorCQljaGVja0Nsb3NlRGVsaXZlcnkoIG1iLCB0cnVlICk7CisJCWNoZWNrTWFpbGJveCggbWIsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCAwICk7CisJCQorCQljaGVja0RlbGl2ZXIoIG1iLCBmYWxzZSwgZnJlZF93aG8sIGJhcl9tc2cgKTsKKwkJY2hlY2tNYWlsYm94KCBtYiwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBub3RpZnkxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlICk7CisJCQorCQlPYmplY3Qgc3RhdGUgPSBuZXcgT2JqZWN0KCk7CisJCQorCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5LCBzdGF0ZSwgMCApOworCQlub3RpZnkuY2hlY2tNYWlsYm94U3RhdHVzKCBmYWxzZSwgbnVsbCwgbnVsbCwgZmFsc2UgKTsKKwkJCisJCWNoZWNrQ2xvc2VEZWxpdmVyeSggbWIsIHRydWUgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggdHJ1ZSwgbWIsIHN0YXRlLCB0cnVlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbm90aWZ5MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW5vdGlmeS5jaGVja01haWxib3hTdGF0dXMoIGZhbHNlLCBudWxsLCBudWxsLCBmYWxzZSApOworCQkKKwkJT2JqZWN0IHN0YXRlID0gbmV3IE9iamVjdCgpOworCQkKKwkJbWIucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSwgc3RhdGUsIDEwMDAgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlICk7CisJCQorCQlUaHJlYWQuc2xlZXAoIDIwMDAgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggdHJ1ZSwgbWIsIHN0YXRlLCB0cnVlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbm90aWZ5MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW5vdGlmeS5jaGVja01haWxib3hTdGF0dXMoIGZhbHNlLCBudWxsLCBudWxsLCBmYWxzZSApOworCQkKKwkJT2JqZWN0IHN0YXRlID0gbmV3IE9iamVjdCgpOworCQkKKwkJbWIucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSwgc3RhdGUsIDAgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlICk7CisJCQorCQlUaHJlYWQuc2xlZXAoIDIwMDAgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbm90aWZ5NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW5vdGlmeS5jaGVja01haWxib3hTdGF0dXMoIGZhbHNlLCBudWxsLCBudWxsLCBmYWxzZSApOworCQkKKwkJT2JqZWN0IHN0YXRlID0gbmV3IE9iamVjdCgpOworCQkKKwkJbWIucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSwgc3RhdGUsIDAgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggZmFsc2UsIG51bGwsIG51bGwsIGZhbHNlICk7CisJCQorCQltYi5tZXNzYWdlKCBhbGljZV93aG8sIGZvb19tc2cgKTsKKwkJbm90aWZ5LmNoZWNrTWFpbGJveFN0YXR1cyggdHJ1ZSwgbWIsIHN0YXRlLCBmYWxzZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcmVnMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5vdGlmeSA9PSBudWxsCisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW1iLnJlZ2lzdGVyTm90aWZ5KCBudWxsLCBudWxsLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcmVnMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG1heERlbGF5IDwgMAorCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5LCBudWxsLCAtMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlZzMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5LCBudWxsLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcmVnNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRoaXMubm90aWZ5ICE9IG51bGwKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJbWIucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSwgbnVsbCwgMCApOworCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5LCBudWxsLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcmVnNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRoaXMubm90aWZ5ICE9IG51bGwKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJbWIucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSwgbnVsbCwgMCApOworCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5MSwgbnVsbCwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVucmVnMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW1iLnVucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVucmVnMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW1iLnJlZ2lzdGVyTm90aWZ5KCBub3RpZnksIG51bGwsIDAgKTsKKwkJbWIudW5yZWdpc3Rlck5vdGlmeSggbm90aWZ5ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdW5yZWczKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUGxhaW5NYWlsYm94IG1iID0gbmV3IFBsYWluTWFpbGJveCggbW1nciwgMUwgKTsKKwkJbWIucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSwgbnVsbCwgMCApOworCQltYi51bnJlZ2lzdGVyTm90aWZ5KCBub3RpZnkgKTsKKwkJbWIudW5yZWdpc3Rlck5vdGlmeSggbm90aWZ5ICk7CisJCW1iLnVucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeTEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1bnJlZzQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQbGFpbk1haWxib3ggbWIgPSBuZXcgUGxhaW5NYWlsYm94KCBtbWdyLCAxTCApOworCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5LCBudWxsLCAwICk7CisJCW1iLnVucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSApOworCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5LCBudWxsLCAwICk7CisJCW1iLnVucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSApOworCQltYi5yZWdpc3Rlck5vdGlmeSggbm90aWZ5MSwgbnVsbCwgMCApOworCQltYi51bnJlZ2lzdGVyTm90aWZ5KCBub3RpZnkxICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgdW5yZWc1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm90aWZ5ICE9IHRoaXMubm90aWZ5CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW1iLnJlZ2lzdGVyTm90aWZ5KCBub3RpZnksIG51bGwsIDAgKTsKKwkJbWIudW5yZWdpc3Rlck5vdGlmeSggbm90aWZ5MSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVucmVnNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIDFMICk7CisJCW1iLnJlZ2lzdGVyTm90aWZ5KCBub3RpZnksIG51bGwsIDMwICk7CisJCW1iLnVucmVnaXN0ZXJOb3RpZnkoIG5vdGlmeSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBIRUxQRlVMIFNUVUZGIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCXByaXZhdGUgZmluYWwgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIG10X2ZvbyA9IG5ldyBUeXBlKCAiZm9vIiApOworCXByaXZhdGUgZmluYWwgTWVzc2FnZSBmb29fbXNnID0gbmV3IE1lc3NhZ2UoIG10X2ZvbywgdmYgKTsKKwlwcml2YXRlIGZpbmFsIFdobyBmcmVkX3dobyA9IG5ldyBXaG8oKSB7IC8qICovIH07CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIG10X2JhciA9IG5ldyBUeXBlKCAiYmFyIiApOworCXByaXZhdGUgZmluYWwgTWVzc2FnZSBiYXJfbXNnID0gbmV3IE1lc3NhZ2UoIG10X2JhciwgdmYgKTsKKwlwcml2YXRlIGZpbmFsIFdobyBhbGljZV93aG8gPSBuZXcgV2hvKCkgeyAvKiAqLyB9OworCQorCXByaXZhdGUgZmluYWwgVHlwZSBtdF9iYXogPSBuZXcgVHlwZSggImJheiIgKTsKKwlwcml2YXRlIGZpbmFsIE1lc3NhZ2UgYmF6X21zZyA9IG5ldyBNZXNzYWdlKCBtdF9iYXosIHZmICk7CisJcHJpdmF0ZSBmaW5hbCBXaG8gbWFya193aG8gPSBuZXcgV2hvKCkgeyAvKiAqLyB9OworCisJcHJpdmF0ZSB2b2lkIHRlc3RDb25zdHJ1Y3QoIExvbmcgbWVzc2FnZUlkICkKKwl7CisJCVBsYWluTWFpbGJveCBtYiA9IG5ldyBQbGFpbk1haWxib3goIG1tZ3IsIG1lc3NhZ2VJZCApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBtbWdyLCBtYi5nZXRNYWlsYm94TWFuYWdlcigpICk7CisJCWFzc2VydEVxdWFscyggbWVzc2FnZUlkLCBtYi5nZXRNZXNzYWdlSWQoKSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tEZWxpdmVyKCBQbGFpbk1haWxib3ggbWIsIGJvb2xlYW4gaGFuZGxlZCwgV2hvIHdobywKKwkJTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIGhhbmRsZWQsIG1iLm1lc3NhZ2UoIHdobywgbXNnICkgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrUmVhZCggUGxhaW5NYWlsYm94IG1iLCBib29sZWFuIHByZXNlbnQsIFdobyB3aG8sIE1lc3NhZ2UgbXNnICkKKwkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQlFbGVtZW50IGUgPSBtYi5yZWFkKCk7CisJCWlmIChwcmVzZW50KQorCQkJY2hlY2tFbGVtZW50KCBlLCB3aG8sIG1zZyApOworCQllbHNlCisJCQlhc3NlcnROdWxsKCBlICk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja1JlYWQoIFBsYWluTWFpbGJveCBtYiwgaW50IG1heERlbGF5LCBib29sZWFuIHByZXNlbnQsCisJCVdobyB3aG8sIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQlFbGVtZW50IGUgPSBtYi5yZWFkKCBtYXhEZWxheSApOworCQlpZiAocHJlc2VudCkKKwkJCWNoZWNrRWxlbWVudCggZSwgd2hvLCBtc2cgKTsKKwkJZWxzZQorCQkJYXNzZXJ0TnVsbCggZSApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja1JlZGVsaXZlcmVkKCBpbnQgaW5kZXgsIFdobyB3aG8sIE1lc3NhZ2UgbXNnICkKKwl7CisJCUVsZW1lbnQgZSA9IG1tZ3IucmVkZWxpdmVyZWQuZ2V0KCBpbmRleCApOworCQljaGVja0VsZW1lbnQoIGUsIHdobywgbXNnICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrRWxlbWVudCggRWxlbWVudCBlLCBXaG8gd2hvLCBNZXNzYWdlIG1zZyApCisJeworCQlhc3NlcnROb3ROdWxsKCBlICk7CisJCWFzc2VydFNhbWUoIHdobywgZS5zZW5kZXIgKTsKKwkJYXNzZXJ0U2FtZSggbXNnLCBlLm1zZyApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja01haWxib3goIFBsYWluTWFpbGJveCBtYiwgYm9vbGVhbiBlbXB0eSwgYm9vbGVhbiBmdWxsLAorCQlib29sZWFuIGNsb3NlZCwgYm9vbGVhbiB1bnJlZywgaW50IHNpemUgKQorCXsKKwkJYXNzZXJ0RXF1YWxzKCBlbXB0eSwgbWIuaXNFbXB0eSgpICk7CisJCWFzc2VydEVxdWFscyggZnVsbCwgbWIuaXNGdWxsKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBjbG9zZWQsIG1iLmlzQ2xvc2VkKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB1bnJlZywgbW1nci51bnJlZ2lzdGVyZWQgKTsKKwkJYXNzZXJ0RXF1YWxzKCBzaXplLCBtbWdyLnJlZGVsaXZlcmVkLnNpemUoKSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tDbG9zZVJlYWQoIFBsYWluTWFpbGJveCBtYiwgYm9vbGVhbiBjbG9zZWQgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIGNsb3NlZCwgbWIuY2xvc2VSZWFkKCkgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VEZWxpdmVyeSggUGxhaW5NYWlsYm94IG1iLCBib29sZWFuIGNsb3NlZCApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggY2xvc2VkLCBtYi5jbG9zZURlbGl2ZXJ5KCkgKTsKKwl9CisJCisJLyoqICovCisJc3RhdGljIGNsYXNzIE15Tm90aWZ5IGltcGxlbWVudHMgTm90aWZ5CisJeworCQlwdWJsaWMgdm9pZCBtYWlsYm94U3RhdHVzKCBNYWlsYm94IG1iLCBPYmplY3Qgc3RhdGUsIGJvb2xlYW4gY2xvc2VkICkKKwkJeworCQkJbWFpbGJveFN0YXR1cyA9IHRydWU7CisJCQltYWlsYm94ID0gbWI7CisJCQl0aGlzLnN0YXRlID0gc3RhdGU7CisJCQl0aGlzLmNsb3NlZCA9IGNsb3NlZDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBtYWlsYm94U3RhdHVzCisJCSAqIEBwYXJhbSBtYWlsYm94CisJCSAqIEBwYXJhbSBzdGF0ZQorCQkgKiBAcGFyYW0gY2xvc2VkCisJCSAqLworCQlwdWJsaWMgdm9pZCBjaGVja01haWxib3hTdGF0dXMoIGJvb2xlYW4gbWFpbGJveFN0YXR1cywgTWFpbGJveCBtYWlsYm94LAorCQkJT2JqZWN0IHN0YXRlLCBib29sZWFuIGNsb3NlZCApCisJCXsKKwkJCWFzc2VydEVxdWFscyggbWFpbGJveFN0YXR1cywgdGhpcy5tYWlsYm94U3RhdHVzICk7CisJCQlhc3NlcnRTYW1lKCBtYWlsYm94LCB0aGlzLm1haWxib3ggKTsKKwkJCWFzc2VydFNhbWUoIHN0YXRlLCB0aGlzLnN0YXRlICk7CisJCQlhc3NlcnRFcXVhbHMoIGNsb3NlZCwgdGhpcy5jbG9zZWQgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBib29sZWFuIG1haWxib3hTdGF0dXM7CisJCQorCQlwcml2YXRlIE1haWxib3ggbWFpbGJveDsKKwkJCisJCXByaXZhdGUgT2JqZWN0IHN0YXRlOworCQkKKwkJcHJpdmF0ZSBib29sZWFuIGNsb3NlZDsKKwl9CisJCisJLyoqICovCisJc3RhdGljIGNsYXNzIE15TWFpbGJveE1hbmFnZXIgaW1wbGVtZW50cyBNYWlsYm94TWFuYWdlcgorCXsKKwkJLyoqICovCisJCXB1YmxpYyBmaW5hbCBMaXN0PEVsZW1lbnQ+IHJlZGVsaXZlcmVkID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOworCQkKKwkJLyoqICovCisJCXB1YmxpYyBib29sZWFuIHVucmVnaXN0ZXJlZDsKKwkJCisJCXB1YmxpYyB2b2lkIHJlZGVsaXZlciggV2hvIHNlbmRlciwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXJlZGVsaXZlcmVkLmFkZCggbmV3IEVsZW1lbnQoIHNlbmRlciwgbXNnICkgKTsKKwkJfQorCisJCXB1YmxpYyBNYWlsYm94IHRyYW5zcG9ydENhbGwoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKCBNYWlsYm94IG1iICkKKwkJeworCQkJdW5yZWdpc3RlcmVkID0gdHJ1ZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE1lc3NhZ2UoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgZ2V0U2Vzc2lvbigpCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2Vzc2lvbiggU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbiApCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0Tm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RQbGFpbk1haWxib3hNYW5hZ2VyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0UGxhaW5NYWlsYm94TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzhhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0UGxhaW5NYWlsYm94TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNjk4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlZmF1bHRWYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiBUZXN0cyBNYWlsYm94TWFuYWdlciAqLworcHVibGljIGNsYXNzIFRlc3RQbGFpbk1haWxib3hNYW5hZ2VyCit7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgTXlWYWx1ZUZhY3RvcnkoICJ0Y3A6IiApOworCXByaXZhdGUgZmluYWwgV2hvIHdobyA9IG5ldyBXaG8oKSB7fTsKKwlwcml2YXRlIGZpbmFsIE15VHJhbnNwb3J0TWVzc2FnZSB0cmFuc3BvcnQgPSBuZXcgTXlUcmFuc3BvcnRNZXNzYWdlKCk7CisJcHJpdmF0ZSBmaW5hbCBNeVNlc3Npb25NZXNzYWdlIHNlc3Npb24gPSBuZXcgTXlTZXNzaW9uTWVzc2FnZSgpOworCXByaXZhdGUgZmluYWwgUGxhaW5NYWlsYm94TWFuYWdlciBtbWdyID0gbmV3IFBsYWluTWFpbGJveE1hbmFnZXIoIHRyYW5zcG9ydCwgIiIsIG51bGwgKTsKKwl7CisJCW1tZ3Iuc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCX0KKwkKKwlwcml2YXRlIE1lc3NhZ2UgY29uc3RydWN0QWRkTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkLCB2ZiApOworCX0KKwkKKwlwcml2YXRlIE1lc3NhZ2UgY29uc3RydWN0QWRkUmVzdWx0TWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkX3Jlc3VsdCwgdmYgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRTYW1lKCBtbWdyLCB0cmFuc3BvcnQuZ2V0U2Vzc2lvbigpICk7CisJCWFzc2VydFNhbWUoIHNlc3Npb24sIG1tZ3IuZ2V0U2Vzc2lvbigpICk7CisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydCwgbW1nci5nZXRUcmFuc3BvcnQoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0TWVzc2FnZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB0ZXN0IHNlbmRpbmcgYW4gZXZlbnQgbWVzc2FnZQorCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnJlY2lwaWVudCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQubXNnICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IGNvbnN0cnVjdEFkZE1lc3NhZ2UoKTsKKwkJYXNzZXJ0TnVsbCggbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQkKKwkJbW1nci50cmFuc3BvcnRNZXNzYWdlKCB3aG8sIG1zZyApOworCQkKKwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0LndoYXQsIFdoYXQuVFJBTlNQT1JUX01FU1NBR0UgKTsKKwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0LnJlY2lwaWVudCwgd2hvICk7CisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC5tc2csIG1zZyApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCAwLCBtbWdyLnNpemUoKSApOworCQlhc3NlcnROb3ROdWxsKCBtc2cuZ2V0TWVzc2FnZUlkKCkgKTsKKwkJYXNzZXJ0TnVsbCggbXNnLmdldEluUmVwbHlUbygpICk7CisJCWFzc2VydE51bGwoIG1tZ3IuZ2V0TWFpbGJveCggbXNnLmdldE1lc3NhZ2VJZCgpICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE1lc3NhZ2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGVzdCBzZW5kaW5nIGEgcmVzdWx0IG1lc3NhZ2UKKwkJCisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5yZWNpcGllbnQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0Lm1zZyApOworCQkKKwkJTWVzc2FnZSBtc2cgPSBjb25zdHJ1Y3RBZGRSZXN1bHRNZXNzYWdlKCk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRNZXNzYWdlSWQoKSApOworCQlhc3NlcnROdWxsKCBtc2cuZ2V0SW5SZXBseVRvKCkgKTsKKwkJbXNnLnNldEluUmVwbHlUbyggMUwgKTsKKwkJCisJCW1tZ3IudHJhbnNwb3J0TWVzc2FnZSggd2hvLCBtc2cgKTsKKwkJCisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC53aGF0LCBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFICk7CisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC5yZWNpcGllbnQsIHdobyApOworCQlhc3NlcnRTYW1lKCB0cmFuc3BvcnQubXNnLCBtc2cgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMCwgbW1nci5zaXplKCkgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCWFzc2VydEVxdWFscyggMUwsIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQlhc3NlcnROdWxsKCBtbWdyLmdldE1haWxib3goIG1zZy5nZXRNZXNzYWdlSWQoKSApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRNZXNzYWdlMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRlc3Qgc2VuZGluZyBhIG1lc3NhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgKGhhcyBhIG1lc3NhZ2UgaWQpCisJCQorCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQucmVjaXBpZW50ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5tc2cgKTsKKwkJCisJCU1lc3NhZ2UgbXNnID0gY29uc3RydWN0QWRkTWVzc2FnZSgpOworCQlhc3NlcnROdWxsKCBtc2cuZ2V0TWVzc2FnZUlkKCkgKTsKKwkJbXNnLnNldE1lc3NhZ2VJZCggMUwgKTsKKworCQkvLyB0aGlzIHNob3VsZCB0cmlnZ2VyIG1zZyBhbHJlYWR5IHNlbnQKKwkJbW1nci50cmFuc3BvcnRNZXNzYWdlKCB3aG8sIG1zZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0Q2FsbDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB0ZXN0IHNlbmRpbmcgYSBjYWxsIG1lc3NhZ2UKKwkJCisJCW1tZ3Iuc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5VUCApOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnJlY2lwaWVudCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQubXNnICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IGNvbnN0cnVjdEFkZE1lc3NhZ2UoKTsKKwkJYXNzZXJ0TnVsbCggbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQkKKwkJTWFpbGJveCBtYiA9IG1tZ3IudHJhbnNwb3J0Q2FsbCggd2hvLCBtc2cgKTsKKwkJCisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC53aGF0LCBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFICk7CisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC5yZWNpcGllbnQsIHdobyApOworCQlhc3NlcnRTYW1lKCB0cmFuc3BvcnQubXNnLCBtc2cgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbWIgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMSwgbW1nci5zaXplKCkgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQlhc3NlcnRTYW1lKCBtYiwgbW1nci5nZXRNYWlsYm94KCBtc2cuZ2V0TWVzc2FnZUlkKCkgKSApOworCQkKKwkJbWIuY2xvc2VSZWFkKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIDAsIG1tZ3Iuc2l6ZSgpICk7CisJCWFzc2VydE51bGwoIG1tZ3IuZ2V0TWFpbGJveCggbXNnLmdldE1lc3NhZ2VJZCgpICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENhbGwyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGVzdCBzZW5kaW5nIGEgY2FsbCBtZXNzYWdlCisJCQorCQltbWdyLnNlc3Npb25Ob3RpZnkoIFNlc3Npb24uVVAgKTsKKwkJCisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5yZWNpcGllbnQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0Lm1zZyApOworCQkKKwkJTWVzc2FnZSBtc2cgPSBjb25zdHJ1Y3RBZGRNZXNzYWdlKCk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRNZXNzYWdlSWQoKSApOworCQlhc3NlcnROdWxsKCBtc2cuZ2V0SW5SZXBseVRvKCkgKTsKKwkJCisJCU1haWxib3ggbWIgPSBtbWdyLnRyYW5zcG9ydENhbGwoIHdobywgbXNnICk7CisJCQorCQlhc3NlcnRTYW1lKCB0cmFuc3BvcnQud2hhdCwgV2hhdC5UUkFOU1BPUlRfTUVTU0FHRSApOworCQlhc3NlcnRTYW1lKCB0cmFuc3BvcnQucmVjaXBpZW50LCB3aG8gKTsKKwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0Lm1zZywgbXNnICk7CisJCWFzc2VydE5vdE51bGwoIG1iICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIDEsIG1tZ3Iuc2l6ZSgpICk7CisJCWFzc2VydE5vdE51bGwoIG1zZy5nZXRNZXNzYWdlSWQoKSApOworCQlhc3NlcnROdWxsKCBtc2cuZ2V0SW5SZXBseVRvKCkgKTsKKwkJYXNzZXJ0U2FtZSggbWIsIG1tZ3IuZ2V0TWFpbGJveCggbXNnLmdldE1lc3NhZ2VJZCgpICkgKTsKKwkJCisJCW1iLmNsb3NlRGVsaXZlcnkoKTsKKwkJCisJCWFzc2VydEVxdWFscyggMCwgbW1nci5zaXplKCkgKTsKKwkJYXNzZXJ0TnVsbCggbW1nci5nZXRNYWlsYm94KCBtc2cuZ2V0TWVzc2FnZUlkKCkgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgdHJhbnNwb3J0Q2FsbDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB0ZXN0IHNlbmRpbmcgYSBjYWxsIG1lc3NhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgKGhhcyBhIG1lc3NhZ2UgaWQpCisJCQorCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQucmVjaXBpZW50ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5tc2cgKTsKKwkJCisJCU1lc3NhZ2UgbXNnID0gY29uc3RydWN0QWRkTWVzc2FnZSgpOworCQlhc3NlcnROdWxsKCBtc2cuZ2V0TWVzc2FnZUlkKCkgKTsKKwkJYXNzZXJ0TnVsbCggbXNnLmdldEluUmVwbHlUbygpICk7CisJCW1zZy5zZXRNZXNzYWdlSWQoIDFMICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIHRoaXMgc2hvdWxkIHRyaWdnZXIgbXNnIGFscmVhZHkgc2VudAorCQkJbW1nci50cmFuc3BvcnRDYWxsKCB3aG8sIG1zZyApOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKCAwLCBtbWdyLnNpemUoKSApOworCQkJYXNzZXJ0TnVsbCggbW1nci5nZXRNYWlsYm94KCBtc2cuZ2V0TWVzc2FnZUlkKCkgKSApOworCQl9CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDYWxsNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5yZWNpcGllbnQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0Lm1zZyApOworCQkKKwkJTWVzc2FnZSBtc2cgPSBjb25zdHJ1Y3RBZGRSZXN1bHRNZXNzYWdlKCk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRNZXNzYWdlSWQoKSApOworCQlhc3NlcnROdWxsKCBtc2cuZ2V0SW5SZXBseVRvKCkgKTsKKwkJbXNnLnNldEluUmVwbHlUbyggMUwgKTsKKwkJCisJCXRyeQorCQl7CisJCQkvLyB0aGlzIHNob3VsZCB0cmlnZ2VyIG1lc3NhZ2UgaXMgbWFya2VkIGFzIGEgcmVwbHkKKwkJCW1tZ3IudHJhbnNwb3J0Q2FsbCggd2hvLCBtc2cgKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWFzc2VydEVxdWFscyggMCwgbW1nci5zaXplKCkgKTsKKwkJCWFzc2VydE51bGwoIG1tZ3IuZ2V0TWFpbGJveCggbXNnLmdldE1lc3NhZ2VJZCgpICkgKTsKKwkJfQorCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gdGVzdHMgb2Ygc2Vzc2lvbk1lc3NhZ2UgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2Vzc2lvbk1lc3NhZ2UxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbWVzc2FnZSB3aXRob3V0IGFuIGluUmVwbHlUbywgc2Vzc2lvbiB3YW50cyBpdC4KKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLm1zZyApOworCQkKKwkJTWVzc2FnZSBtc2cgPSBjb25zdHJ1Y3RBZGRNZXNzYWdlKCk7CisJCQorCQlzZXNzaW9uLm1zZ19oYW5kbGVkID0gdHJ1ZTsKKwkJYm9vbGVhbiBtc2dfaGFuZGxlZCA9IG1tZ3Iuc2Vzc2lvbk1lc3NhZ2UoIHdobywgbXNnICk7CisJCWFzc2VydFRydWUoIG1zZ19oYW5kbGVkICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlNFU1NJT05fTUVTU0FHRSwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFNhbWUoIHdobywgc2Vzc2lvbi5zZW5kZXIgKTsKKwkJYXNzZXJ0U2FtZSggbXNnLCBzZXNzaW9uLm1zZyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlc3Npb25NZXNzYWdlMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG1lc3NhZ2Ugd2l0aG91dCBhbiBpblJlcGx5VG8sIHNlc3Npb24gZG9lc24ndCB3YW50IGl0LgorCQkKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uc2VuZGVyICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24ubXNnICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IGNvbnN0cnVjdEFkZE1lc3NhZ2UoKTsKKwkJCisJCXNlc3Npb24ubXNnX2hhbmRsZWQgPSBmYWxzZTsKKwkJYm9vbGVhbiBtc2dfaGFuZGxlZCA9IG1tZ3Iuc2Vzc2lvbk1lc3NhZ2UoIHdobywgbXNnICk7CisJCWFzc2VydEZhbHNlKCBtc2dfaGFuZGxlZCApOworCQkKKwkJYXNzZXJ0U2FtZSggV2hhdC5TRVNTSU9OX01FU1NBR0UsIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRTYW1lKCB3aG8sIHNlc3Npb24uc2VuZGVyICk7CisJCWFzc2VydFNhbWUoIG1zZywgc2Vzc2lvbi5tc2cgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTWVzc2FnZTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBtZXNzYWdlIHdpdGggYW4gaW5SZXBseVRvIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggYSBtYWlsYm94CisJCQorCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5tc2cgKTsKKwkJCisJCU1lc3NhZ2UgbXNnID0gY29uc3RydWN0QWRkUmVzdWx0TWVzc2FnZSgpOworCQltc2cuc2V0SW5SZXBseVRvKCAxTCApOworCQkKKwkJc2Vzc2lvbi5tc2dfaGFuZGxlZCA9IHRydWU7CisJCWJvb2xlYW4gbXNnX2hhbmRsZWQgPSBtbWdyLnNlc3Npb25NZXNzYWdlKCB3aG8sIG1zZyApOworCQlhc3NlcnRGYWxzZSggbXNnX2hhbmRsZWQgKTsKKworCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5tc2cgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTWVzc2FnZTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBtZXNzYWdlIHdpdGggYW4gaW5SZXBseVRvIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggYSBtYWlsYm94CisJCQorCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5tc2cgKTsKKwkJCisJCU1lc3NhZ2UgbXNnID0gY29uc3RydWN0QWRkUmVzdWx0TWVzc2FnZSgpOworCQltc2cuc2V0SW5SZXBseVRvKCAxTCApOworCQkKKwkJc2Vzc2lvbi5tc2dfaGFuZGxlZCA9IGZhbHNlOworCQlib29sZWFuIG1zZ19oYW5kbGVkID0gbW1nci5zZXNzaW9uTWVzc2FnZSggd2hvLCBtc2cgKTsKKwkJYXNzZXJ0RmFsc2UoIG1zZ19oYW5kbGVkICk7CisKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uc2VuZGVyICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24ubXNnICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTWVzc2FnZTUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBtZXNzYWdlIHdpdGggYW4gaW5SZXBseVRvIHdoaWNoIG1hdGNoZXMgYSBtYWlsYm94IHdoaWNoIGlzIG9wZW4KKwkJCisJCW1tZ3Iuc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5VUCApOworCQlzZXNzaW9uLndoYXQgPSBudWxsOworCQlzZXNzaW9uLmV2ZW50ID0gbnVsbDsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLm1zZyApOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnJlY2lwaWVudCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQubXNnICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IGNvbnN0cnVjdEFkZE1lc3NhZ2UoKTsKKwkJTWFpbGJveCBtYiA9IG1tZ3IudHJhbnNwb3J0Q2FsbCggd2hvLCBtc2cgKTsKKwkJCisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC53aGF0LCBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFICk7CisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC5yZWNpcGllbnQsIHdobyApOworCQlhc3NlcnRTYW1lKCB0cmFuc3BvcnQubXNnLCBtc2cgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbWIgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMSwgbW1nci5zaXplKCkgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQlhc3NlcnRTYW1lKCBtYiwgbW1nci5nZXRNYWlsYm94KCBtc2cuZ2V0TWVzc2FnZUlkKCkgKSApOworCQkKKwkJTWVzc2FnZSBybXNnID0gbXNnLnJlcGx5KCBNeVZhbHVlRmFjdG9yeS5tdF9hZGRfcmVzdWx0ICk7CisJCWJvb2xlYW4gbXNnX2hhbmRsZWQgPSBtbWdyLnNlc3Npb25NZXNzYWdlKCB3aG8sIHJtc2cgKTsKKwkJYXNzZXJ0VHJ1ZSggbXNnX2hhbmRsZWQgKTsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLm1zZyApOworCQkKKwkJTWFpbGJveC5FbGVtZW50IHggPSBtYi5yZWFkKCk7CisJCWFzc2VydFNhbWUoIHdobywgeC5zZW5kZXIgKTsKKwkJYXNzZXJ0U2FtZSggcm1zZywgeC5tc2cgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMSwgbW1nci5zaXplKCkgKTsKKwkJYXNzZXJ0U2FtZSggbWIsIG1tZ3IuZ2V0TWFpbGJveCggbXNnLmdldE1lc3NhZ2VJZCgpICkgKTsKKwkJCisJCW1iLmNsb3NlUmVhZCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCAwLCBtbWdyLnNpemUoKSApOworCQlhc3NlcnROdWxsKCBtbWdyLmdldE1haWxib3goIG1zZy5nZXRNZXNzYWdlSWQoKSApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTWVzc2FnZTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBtZXNzYWdlIHdpdGggYW4gaW5SZXBseVRvIHdoaWNoIG1hdGNoZXMgYSBtYWlsYm94IHdoaWNoIGlzIG9wZW4KKwkJCisJCW1tZ3Iuc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5VUCApOworCQlzZXNzaW9uLndoYXQgPSBudWxsOworCQlzZXNzaW9uLmV2ZW50ID0gbnVsbDsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLm1zZyApOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnJlY2lwaWVudCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQubXNnICk7CisJCQorCQlNZXNzYWdlIG1zZyA9IGNvbnN0cnVjdEFkZE1lc3NhZ2UoKTsKKwkJTWFpbGJveCBtYiA9IG1tZ3IudHJhbnNwb3J0Q2FsbCggd2hvLCBtc2cgKTsKKwkJCisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC53aGF0LCBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFICk7CisJCWFzc2VydFNhbWUoIHRyYW5zcG9ydC5yZWNpcGllbnQsIHdobyApOworCQlhc3NlcnRTYW1lKCB0cmFuc3BvcnQubXNnLCBtc2cgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbWIgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMSwgbW1nci5zaXplKCkgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbXNnLmdldE1lc3NhZ2VJZCgpICk7CisJCWFzc2VydE51bGwoIG1zZy5nZXRJblJlcGx5VG8oKSApOworCQlhc3NlcnRTYW1lKCBtYiwgbW1nci5nZXRNYWlsYm94KCBtc2cuZ2V0TWVzc2FnZUlkKCkgKSApOworCQkKKwkJbWIuY2xvc2VSZWFkKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIDAsIG1tZ3Iuc2l6ZSgpICk7CisJCWFzc2VydE51bGwoIG1tZ3IuZ2V0TWFpbGJveCggbXNnLmdldE1lc3NhZ2VJZCgpICkgKTsKKwkJCisJCU1lc3NhZ2Ugcm1zZyA9IG1zZy5yZXBseSggTXlWYWx1ZUZhY3RvcnkubXRfYWRkX3Jlc3VsdCApOworCQlib29sZWFuIG1zZ19oYW5kbGVkID0gbW1nci5zZXNzaW9uTWVzc2FnZSggd2hvLCBybXNnICk7CisJCWFzc2VydEZhbHNlKCBtc2dfaGFuZGxlZCApOworCQkKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uc2VuZGVyICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24ubXNnICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgUVVFUlkgPSAiZm9vIjsKKwkJT2JqZWN0IFJFU1VMVCA9ICJiYXIiOworCQkKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24ucXVlcnkgKTsKKwkJc2Vzc2lvbi5xdWVyeV9yZXN1bHQgPSBSRVNVTFQ7CisJCQorCQlPYmplY3QgcmVzdWx0ID0gbW1nci5zZXNzaW9uUXVlcnkoIFFVRVJZICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5TRVNTSU9OX1FVRVJZLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggUVVFUlksIHNlc3Npb24ucXVlcnkgKTsKKwkJYXNzZXJ0U2FtZSggUkVTVUxULCByZXN1bHQgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlc3Npb25Db250cm9sKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IENPTlRST0wgPSAiZm9vIjsKKwkJT2JqZWN0IFZBTFVFID0gImJhciI7CisJCQorCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5jb250cm9sICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24udmFsdWUgKTsKKwkJCisJCW1tZ3Iuc2Vzc2lvbkNvbnRyb2woIENPTlRST0wsIFZBTFVFICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5TRVNTSU9OX0NPTlRST0wsIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRTYW1lKCBDT05UUk9MLCBzZXNzaW9uLmNvbnRyb2wgKTsKKwkJYXNzZXJ0U2FtZSggVkFMVUUsIHNlc3Npb24udmFsdWUgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgRVZFTlQgPSAiZm9vIjsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLmV2ZW50ICk7CisJCQorCQltbWdyLnNlc3Npb25Ob3RpZnkoIEVWRU5UICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5TRVNTSU9OX05PVElGWSwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFNhbWUoIEVWRU5ULCBzZXNzaW9uLmV2ZW50ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBRVUVSWSA9ICJmb28iOworCQlPYmplY3QgUkVTVUxUID0gImJhciI7CisJCQorCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQucXVlcnkgKTsKKwkJdHJhbnNwb3J0LnF1ZXJ5X3Jlc3VsdCA9IFJFU1VMVDsKKwkJCisJCU9iamVjdCByZXN1bHQgPSBtbWdyLnRyYW5zcG9ydFF1ZXJ5KCBRVUVSWSApOworCisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX1FVRVJZLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnRTYW1lKCBRVUVSWSwgdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCWFzc2VydFNhbWUoIFJFU1VMVCwgcmVzdWx0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IENPTlRST0wgPSAiZm9vIjsKKwkJT2JqZWN0IFZBTFVFID0gImJhciI7CisJCQorCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQudmFsdWUgKTsKKwkJCisJCW1tZ3IudHJhbnNwb3J0Q29udHJvbCggQ09OVFJPTCwgVkFMVUUgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9DT05UUk9MLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnRTYW1lKCBDT05UUk9MLCB0cmFuc3BvcnQuY29udHJvbCApOworCQlhc3NlcnRTYW1lKCBWQUxVRSwgdHJhbnNwb3J0LnZhbHVlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgRVZFTlQgPSAiZm9vIjsKKwkJCisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydE51bGwoIHRyYW5zcG9ydC5ldmVudCApOworCQkKKwkJbW1nci50cmFuc3BvcnROb3RpZnkoIEVWRU5UICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfTk9USUZZLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnRTYW1lKCBFVkVOVCwgdHJhbnNwb3J0LmV2ZW50ICk7CisJfQorCisJLyoqICovCisJcHVibGljIGVudW0gV2hhdAorCXsKKwkJLyoqICovIFNFU1NJT05fTUVTU0FHRSwKKwkJLyoqICovIFNFU1NJT05fUVVFUlksCisJCS8qKiAqLyBTRVNTSU9OX0NPTlRST0wsCisJCS8qKiAqLyBTRVNTSU9OX05PVElGWSwKKwkJLyoqICovIFRSQU5TUE9SVF9NRVNTQUdFLAorCQkvKiogKi8gVFJBTlNQT1JUX1FVRVJZLAorCQkvKiogKi8gVFJBTlNQT1JUX0NPTlRST0wsCisJCS8qKiAqLyBUUkFOU1BPUlRfTk9USUZZCisJfQorCQorCS8qKiAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUcmFuc3BvcnRNZXNzYWdlIGltcGxlbWVudHMgVHJhbnNwb3J0TWVzc2FnZQorCXsKKwkJLyoqICovIHB1YmxpYyBXaGF0IHdoYXQ7CisJCS8qKiAqLyBwdWJsaWMgV2hvIHJlY2lwaWVudDsKKwkJLyoqICovIHB1YmxpYyBNZXNzYWdlIG1zZzsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgcXVlcnk7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IHF1ZXJ5X3Jlc3VsdDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgY29udHJvbDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgdmFsdWU7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGV2ZW50OworCQkKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0TWVzc2FnZSggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfTUVTU0FHRTsKKwkJCXRoaXMucmVjaXBpZW50ID0gcmVjaXBpZW50OworCQkJdGhpcy5tc2cgPSBtc2c7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlRSQU5TUE9SVF9RVUVSWTsKKwkJCXRoaXMucXVlcnkgPSBxdWVyeTsKKwkJCXJldHVybiBxdWVyeV9yZXN1bHQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJd2hhdCA9IFdoYXQuVFJBTlNQT1JUX0NPTlRST0w7CisJCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0Tm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlRSQU5TUE9SVF9OT1RJRlk7CisJCQl0aGlzLmV2ZW50ID0gZXZlbnQ7CisJCX0KKworCQlwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgZ2V0U2Vzc2lvbigpCisJCXsKKwkJCXJldHVybiBzZXNzaW9uOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2Vzc2lvbiggU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbiApCisJCXsKKwkJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisJCX0KKwkJCisJCXByaXZhdGUgU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKKwl9CisJCisJLyoqICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlc3Npb25NZXNzYWdlIGltcGxlbWVudHMgU2Vzc2lvbk1lc3NhZ2UKKwl7CisJCS8qKiAqLyBwdWJsaWMgV2hhdCB3aGF0OworCQkvKiogKi8gcHVibGljIFdobyBzZW5kZXI7CisJCS8qKiAqLyBwdWJsaWMgTWVzc2FnZSBtc2c7CisJCS8qKiAqLyBwdWJsaWMgYm9vbGVhbiBtc2dfaGFuZGxlZDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgcXVlcnk7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IHF1ZXJ5X3Jlc3VsdDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgY29udHJvbDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgdmFsdWU7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGV2ZW50OworCQkKKwkJcHVibGljIGJvb2xlYW4gc2Vzc2lvbk1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5TRVNTSU9OX01FU1NBR0U7CisJCQl0aGlzLnNlbmRlciA9IHNlbmRlcjsKKwkJCXRoaXMubXNnID0gbXNnOworCQkJcmV0dXJuIG1zZ19oYW5kbGVkOworCQl9CisKKwkJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApCisJCXsKKwkJCXdoYXQgPSBXaGF0LlNFU1NJT05fUVVFUlk7CisJCQl0aGlzLnF1ZXJ5ID0gcXVlcnk7CisJCQlyZXR1cm4gcXVlcnlfcmVzdWx0OworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQl7CisJCQl3aGF0ID0gV2hhdC5TRVNTSU9OX0NPTlRST0w7CisJCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkKKwkJeworCQkJd2hhdCA9IFdoYXQuU0VTU0lPTl9OT1RJRlk7CisJCQl0aGlzLmV2ZW50ID0gZXZlbnQ7CisJCX0KKwl9CisJCisJLyoqIFByaXZhdGUgdmFsdWUgZmFjdG9yeSBmb3IgdGVzdGluZy4gKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15VmFsdWVGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbHVlRmFjdG9yeQorCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdCBNeVZhbHVlRmFjdG9yeS4KKwkJICogQHBhcmFtIHVyaSAKKwkJICovCisJCXB1YmxpYyBNeVZhbHVlRmFjdG9yeSggU3RyaW5nIHVyaSApCisJCXsKKwkJCXN1cGVyKCB1cmksIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlID0gbmV3IENsYXNzMlR5cGVNYXAoKTsKKworCQlzdGF0aWMKKwkJeworCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5pbml0KCB0eXBlcywgY2xhc3MydHlwZSApOworCQl9CisKKwkJLyoqICovCisJCXB1YmxpYyBmaW5hbCBzdGF0aWMgVHlwZSBtdF9hZGQgPSB0eXBlcy5nZXQoICJhZGQiICk7CisJCQorCQkvKiogKi8KKwkJcHVibGljIGZpbmFsIHN0YXRpYyBUeXBlIG10X2FkZF9yZXN1bHQgPSB0eXBlcy5nZXQoICJhZGRfcmVzdWx0IiApOworCQkKKwkJc3RhdGljCisJCXsKKwkJCW10X2FkZC5wdXRWYWxpZGF0b3IoIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCQkKKwkJCW10X2FkZF9yZXN1bHQucHV0VmFsaWRhdG9yKCBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCQkJbXRfYWRkX3Jlc3VsdC5wdXRWYWxpZGF0b3IoIERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0VGNwMlRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RUY3AyVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmJkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0VGNwMlRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKiBUZXN0IG9mIFRjcDJUcmFuc3BvcnRGYWN0b3J5ICovCitwdWJsaWMgY2xhc3MgVGVzdFRjcDJUcmFuc3BvcnRGYWN0b3J5Cit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsaXN0ZW5lcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9UZXN0VGNwVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdFRjcFRyYW5zcG9ydEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzVkYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdFRjcFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIFRjcFRyYW5zcG9ydEZhY3RvcnkKKyAqLworcHVibGljIGNsYXNzIFRlc3RUY3BUcmFuc3BvcnRGYWN0b3J5Cit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlASWdub3JlCisJcHVibGljIHZvaWQgbm90aGluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gd3JpdGUgc29tZSB1bml0IHRlc3RzIGZvciBUY3BUcmFuc3BvcnRGYWN0b3J5LgorCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RVbndhbnRlZE1lc3NhZ2UuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L1Rlc3RVbndhbnRlZE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTZkNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvVGVzdFVud2FudGVkTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qgb2YgVW53YW50ZWRNZXNzYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VW53YW50ZWRNZXNzYWdlCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlASWdub3JlCisJcHVibGljIHZvaWQgbm90aGluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gd3JpdGUgc29tZSB1bml0IHRlc3RzIGZvciBVbndhbnRlZE1lc3NhZ2UuCisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9UZXN0S2VlcEFsaXZlLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9maWx0ZXJzL1Rlc3RLZWVwQWxpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmEyNTlmCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9UZXN0S2VlcEFsaXZlLmphdmEKQEAgLTAsMCArMSw0MTMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZmlsdGVyczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlZmF1bHRWYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfaW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqICovCitwdWJsaWMgY2xhc3MgVGVzdEtlZXBBbGl2ZQoreworCXByaXZhdGUgZmluYWwgTXlUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IE15VHJhbnNwb3J0KCk7CisJcHJpdmF0ZSBmaW5hbCBNeVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBNeVNlc3Npb24oKTsKKwlwcml2YXRlIGZpbmFsIE15VmFsdWVGYWN0b3J5IHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCAidGNwOiIgKTsKKwlwcml2YXRlIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzKCk7CisJeworCQlyZXNvdXJjZXMucHV0KCBUcmFuc3BvcnQuVkFMVUVfRkFDVE9SWSwgdmYgKTsKKwkJTG9nLmFkZFNpbmsoIG51bGwgKTsKKwl9CisJCisJcHJpdmF0ZSBLZWVwQWxpdmUgbmV3S2VlcEFsaXZlKFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgS2VlcEFsaXZlKHRyYW5zcG9ydCxuZXcgVVJMKHVyaSkscmVzb3VyY2VzKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gdHJ1ZTsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDgwMT9maWx0ZXI9S2VlcEFsaXZlIjsKKwkJS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworCQlmaWx0ZXIuc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCQkKKwkJYXNzZXJ0U2FtZSh0cmFuc3BvcnQuZ2V0U2Vzc2lvbigpLGZpbHRlcik7CisJCWFzc2VydFNhbWUoZmlsdGVyLmdldFNlc3Npb24oKSxzZXNzaW9uKTsKKwkJYXNzZXJ0U2FtZShmaWx0ZXIuZ2V0U2VydmVyKCksdHJ1ZSk7CisJCWFzc2VydEVxdWFscyhmaWx0ZXIuZ2V0Q291bnQoKSw0KTsKKwkJYXNzZXJ0RXF1YWxzKGZpbHRlci5nZXREZWxheSgpLDE1KTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gdHJ1ZTsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDgwMT9maWx0ZXI9S2VlcEFsaXZlJktlZXBBbGl2ZS5kZWxheT0yMCZLZWVwQWxpdmUuY291bnQ9NSI7CisJCUtlZXBBbGl2ZSBmaWx0ZXIgPSBuZXdLZWVwQWxpdmUodXJpKTsKKwkJZmlsdGVyLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJCisJCWFzc2VydFNhbWUodHJhbnNwb3J0LmdldFNlc3Npb24oKSxmaWx0ZXIpOworCQlhc3NlcnRTYW1lKGZpbHRlci5nZXRTZXNzaW9uKCksc2Vzc2lvbik7CisJCWFzc2VydFNhbWUoZmlsdGVyLmdldFNlcnZlcigpLHRydWUpOworCQlhc3NlcnRFcXVhbHMoZmlsdGVyLmdldENvdW50KCksNSk7CisJCWFzc2VydEVxdWFscyhmaWx0ZXIuZ2V0RGVsYXkoKSwyMCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworCQlTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0ODAxP2ZpbHRlcj1LZWVwQWxpdmUiOworCQlLZWVwQWxpdmUgZmlsdGVyID0gbmV3S2VlcEFsaXZlKHVyaSk7CisJCWZpbHRlci5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CisJCQorCQlhc3NlcnRTYW1lKHRyYW5zcG9ydC5nZXRTZXNzaW9uKCksZmlsdGVyKTsKKwkJYXNzZXJ0U2FtZShmaWx0ZXIuZ2V0U2Vzc2lvbigpLHNlc3Npb24pOworCQlhc3NlcnRTYW1lKGZpbHRlci5nZXRTZXJ2ZXIoKSxmYWxzZSk7CisJCWFzc2VydEVxdWFscyhmaWx0ZXIuZ2V0Q291bnQoKSw0KTsKKwkJYXNzZXJ0RXF1YWxzKGZpbHRlci5nZXREZWxheSgpLDE1KTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbGllbnR1cCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDgwMT9maWx0ZXI9S2VlcEFsaXZlJktlZXBBbGl2ZS5kZWxheT0zIjsKKwkJS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworCQlmaWx0ZXIuc2V0U2Vzc2lvbiggc2Vzc2lvbiApOwkJCisJCWZpbHRlci5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLlVQICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJTbGVlcGluZyBmb3IgNSBzZWNvbmRzIik7CisJCVRocmVhZC5zbGVlcCggNTAwMCApOwkJIAorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiT3V0IG9mIHNsZWVwIik7CisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX01FU1NBR0UsIHRyYW5zcG9ydC53aGF0ICk7CisJCU1lc3NhZ2UgbXNnID0gdHJhbnNwb3J0Lm1zZzsKKwkJYXNzZXJ0RXF1YWxzKCAiX0V0Y2hfS2VlcEFsaXZlUmVxIiwgbXNnLnR5cGUoKS5nZXROYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA0LCBtc2cuZ2V0KCBuZXcgRmllbGQoICJjb3VudCIgKSApICk7CisJCWFzc2VydEVxdWFscyggMywgbXNnLmdldCggbmV3IEZpZWxkKCAiZGVsYXkiICkgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsaWVudHVwMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDgwMT9maWx0ZXI9S2VlcEFsaXZlJktlZXBBbGl2ZS5kZWxheT0yIjsKKwkJS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworCQlmaWx0ZXIuc2V0U2Vzc2lvbiggc2Vzc2lvbiApOwkJCisJCWZpbHRlci5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLlVQICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJTbGVlcGluZyBmb3IgNCBzZWNvbmRzIik7CisJCVRocmVhZC5zbGVlcCggNDAwMCApOwkJIAorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiT3V0IG9mIHNsZWVwIik7CisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX01FU1NBR0UsIHRyYW5zcG9ydC53aGF0ICk7CisJCU1lc3NhZ2UgbXNnID0gdHJhbnNwb3J0Lm1zZzsKKwkJYXNzZXJ0RXF1YWxzKCAiX0V0Y2hfS2VlcEFsaXZlUmVxIiwgbXNnLnR5cGUoKS5nZXROYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA0LCBtc2cuZ2V0KCBuZXcgRmllbGQoICJjb3VudCIgKSApICk7CisJCWFzc2VydEVxdWFscyggMiwgbXNnLmdldCggbmV3IEZpZWxkKCAiZGVsYXkiICkgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsaWVudGRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiLS1jbGllbnRkb3duIiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworCQkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDgwMT9maWx0ZXI9S2VlcEFsaXZlIjsgCisJCQorCQlLZWVwQWxpdmUgZmlsdGVyID0gbmV3S2VlcEFsaXZlKHVyaSk7CisJCWZpbHRlci5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CQkKKwkJZmlsdGVyLnNlc3Npb25Ob3RpZnkoIFNlc3Npb24uRE9XTiApOworCQkKKwkJYXNzZXJ0RmFsc2UoIHNlc3Npb24udXAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2ZXJVcCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyYW5zcG9ydC5pc19zZXJ2ZXIgPSB0cnVlOworCQlTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0ODAxP2ZpbHRlcj1LZWVwQWxpdmUiOyAJCQorCQlLZWVwQWxpdmUgZmlsdGVyID0gbmV3S2VlcEFsaXZlKHVyaSk7CisJCWZpbHRlci5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CQkKKwkJZmlsdGVyLnNlc3Npb25Ob3RpZnkoIFNlc3Npb24uVVAgKTsJCisJCQorCQlNZXNzYWdlIHJlcSA9IGNvbnN0cnVjdE1lc3NhZ2UoKTsKKwkJCisJCWZpbHRlci5zZXNzaW9uTWVzc2FnZSggbnVsbCwgcmVxICk7CisJCQorCQlhc3NlcnRFcXVhbHMocmVxLnJlcGx5KCksdHJhbnNwb3J0Lm1zZyk7CisJCQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZlcmRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiLS1jbGllbnRkb3duIiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IHRydWU7CisJCQorCQlTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0ODAxP2ZpbHRlcj1LZWVwQWxpdmUiOyAKKwkJCisJCUtlZXBBbGl2ZSBmaWx0ZXIgPSBuZXdLZWVwQWxpdmUodXJpKTsKKwkJZmlsdGVyLnNldFNlc3Npb24oIHNlc3Npb24gKTsJCQorCQlmaWx0ZXIuc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5ET1dOICk7CisJCQorCQlhc3NlcnRGYWxzZSggc2Vzc2lvbi51cCApOworCX0KKwkKKy8qCUBUZXN0CisJcHVibGljIHZvaWQgcmVzZXRDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQ4MDE/ZmlsdGVyPUtlZXBBbGl2ZSZLZWVwQWxpdmUuZGVsYXk9MiZLZWVwQWxpdmUuY291bnQ9NCI7IAkKKwkJS2VlcEFsaXZlIGZpbHRlciA9IG5ld0tlZXBBbGl2ZSh1cmkpOworCQlmaWx0ZXIuc2V0U2Vzc2lvbiggc2Vzc2lvbiApOwkJCisJCWZpbHRlci5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLlVQICk7CQorCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCJTbGVlcGluZyBmb3IgMTAgc2Vjb25kcyIpOworCQlUaHJlYWQuc2xlZXAoIDIwMDAwICk7CQkgCisJCVN5c3RlbS5vdXQucHJpbnRsbigiT3V0IG9mIHNsZWVwIik7CisJCWFzc2VydFRydWUodHJhbnNwb3J0LmlzUmVzZXQpOwkJCisJfSAqLworCQorCQorCXByaXZhdGUgTWVzc2FnZSBjb25zdHJ1Y3RNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IGRlbGF5ID0gMTU7CisJCWludCBjb3VudCA9IDQ7CisJCQorCQlNeVZhbHVlRmFjdG9yeSB2ZjEgPSBuZXcgTXlWYWx1ZUZhY3RvcnkoICJ0Y3A6IiApOworCQkKKwkJRmllbGQgbWZfZGVsYXkgPSBuZXcgRmllbGQoICJkZWxheSIgKTsKKwkJRmllbGQgbWZfY291bnQgPSBuZXcgRmllbGQoICJjb3VudCIgKTsKKwkJCisJCVR5cGUgbXRfcmVxdWVzdCA9IG5ldyBUeXBlKCAiX0V0Y2hfS2VlcEFsaXZlUmVxIiApOworCQltdF9yZXF1ZXN0LnB1dFZhbGlkYXRvciggbWZfZGVsYXksIFZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJbXRfcmVxdWVzdC5wdXRWYWxpZGF0b3IoIG1mX2NvdW50LCBWYWxpZGF0b3JfaW50LmdldCggMCApICk7CisJCXZmMS5hZGRUeXBlKCBtdF9yZXF1ZXN0ICk7CisKKwkJVHlwZSBtdF9yZXNwb25zZSA9IG5ldyBUeXBlKCAiX0V0Y2hfS2VlcEFsaXZlUmVzcCIgKTsKKwkJdmYxLmFkZFR5cGUoIG10X3Jlc3BvbnNlICk7CisJCQorCQltdF9yZXF1ZXN0LnNldFJlc3VsdCggbXRfcmVzcG9uc2UgKTsKKwkJCisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIG10X3JlcXVlc3QsIHZmMSApOworCQltc2cucHV0KCBtZl9kZWxheSwgZGVsYXkgKTsKKwkJbXNnLnB1dCggbWZfY291bnQsIGNvdW50ICk7CisJCQorCQlyZXR1cm4gbXNnOworCX0KKworCQorCQorCQorCQorCQorCS8qKiAqLworCWVudW0gV2hhdAorCXsKKwkJLyoqICovIFRSQU5TUE9SVF9NRVNTQUdFLAorCQkvKiogKi8gU0VTU0lPTl9NRVNTQUdFCisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBvCisJICogQHJldHVybiBvCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlzdGF0aWMgT2JqZWN0IGNvb2soIE9iamVjdCBvICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKG8gaW5zdGFuY2VvZiBFeGNlcHRpb24pCisJCXsKKwkJCUV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbikgbzsKKwkJCWUuZmlsbEluU3RhY2tUcmFjZSgpOworCQkJdGhyb3cgZTsKKwkJfQorCQlyZXR1cm4gbzsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnRNZXNzYWdlCisJeworCQkvKiogKi8KKwkJcHVibGljIE15VHJhbnNwb3J0KCkKKwkJeworCQkJLy8gbm90aGluZyB0byBkby4KKwkJfQorCisJCS8qKiAqLyBwdWJsaWMgV2hhdCB3aGF0OworCQkvKiogKi8gcHVibGljIFdobyByZWNpcGllbnQ7CisJCS8qKiAqLyBwdWJsaWMgTWVzc2FnZSBtc2c7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGlzX3NlcnZlcjsKKwkJLyoqICovIHB1YmxpYyBib29sZWFuIGlzUmVzZXQgPSBmYWxzZTsKKwkJCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE1lc3NhZ2UoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInRyYW5zcG9ydE1lc3NhZ2UiLCAicmVjaXBpZW50IiwgcmVjaXBpZW50LCAibXNnIiwgbXNnICk7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfTUVTU0FHRTsKKwkJCXRoaXMucmVjaXBpZW50ID0gcmVjaXBpZW50OworCQkJCisJCQl0aGlzLm1zZyA9IG1zZzsKKwkJfQorCisJCXB1YmxpYyBTZXNzaW9uTWVzc2FnZSBnZXRTZXNzaW9uKCkKKwkJeworCQkJcmV0dXJuIHNlc3Npb247CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKCBTZXNzaW9uTWVzc2FnZSBzZXNzaW9uICkKKwkJeworCQkJdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKwkJfQorCQkKKwkJcHJpdmF0ZSBTZXNzaW9uTWVzc2FnZSBzZXNzaW9uOworCisJCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInRyYW5zcG9ydFF1ZXJ5IiwgInF1ZXJ5IiwgcXVlcnkgKTsKKwkJCQorCQkJaWYgKHF1ZXJ5ID09IFRyYW5zcG9ydC5JU19TRVJWRVIpCisJCQkJcmV0dXJuIGNvb2soIGlzX3NlcnZlciApOworCQkJCisJLy8JCXJldHVybiBxdWVyeTsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnkgIitxdWVyeSApOworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCUxvZy5yZXBvcnQoICJ0cmFuc3BvcnRDb250cm9sMSIsICJjb250cm9sIiwgY29udHJvbCwgInZhbHVlIiwgdmFsdWUgKTsKKwkJCQorCQkJaWYgKGNvbnRyb2wgPT0gVHJhbnNwb3J0LlJFU0VUKSB7CisJCQkJTG9nLnJlcG9ydCgiQ29udHJvbCBWYXJpYWJsZSBpcyBSZXNldCwgY2hhbmdpbmcgdGhlIHJlc2V0IGZsYWciLGNvbnRyb2wpOworCQkJCWlzUmVzZXQgPSB0cnVlOworCQkJfQorCQkJCisJLy8JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gY29udHJvbCAiK2NvbnRyb2wgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIG5vdGlmeSAiK2V2ZW50ICk7CisJCX0KKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlTZXNzaW9uIGltcGxlbWVudHMgU2Vzc2lvbk1lc3NhZ2UKKwl7CisJCS8qKiAqLworCQlwdWJsaWMgTXlTZXNzaW9uKCkKKwkJeworCQkJLy8gbm90aGluZyB0byBkby4KKwkJfQorCisJCS8qKiAqLyBwdWJsaWMgV2hhdCB3aGF0OworCQkvKiogKi8gcHVibGljIFdobyBzZW5kZXI7CisJCS8qKiAqLyBwdWJsaWMgTWVzc2FnZSBtc2c7CisJCS8qKiAqLyBwdWJsaWMgYm9vbGVhbiBoYW5kbGVkOworCQkvKiogKi8gcHVibGljIE9iamVjdCB1c2VyOworCQkvKiogKi8gcHVibGljIE9iamVjdCBwYXNzd29yZDsKKwkJLyoqICovIHB1YmxpYyBCb29sZWFuIHVwOworCQkKKwkJCisJCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCUxvZy5yZXBvcnQoICJzZXNzaW9uTWVzc2FnZSIsICJzZW5kZXIiLCBzZW5kZXIsICJtc2ciLCBtc2cgKTsKKwkJCXdoYXQgPSBXaGF0LlNFU1NJT05fTUVTU0FHRTsKKwkJCXRoaXMuc2VuZGVyID0gc2VuZGVyOworCQkJdGhpcy5tc2cgPSBtc2c7CisJCQlyZXR1cm4gaGFuZGxlZDsKKwkJfQorCisJCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXJldHVybiBxdWVyeTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Db250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInNlc3Npb25Db250cm9sIiwgImNvbnRyb2wiLCBjb250cm9sLCAidmFsdWUiLCB2YWx1ZSApOworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sICIrY29udHJvbCApOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlpZiAoZXZlbnQgPT0gU2Vzc2lvbi5VUCkKKwkJCXsKKwkJCQl1cCA9IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQlpZiAoZXZlbnQgPT0gU2Vzc2lvbi5ET1dOKQorCQkJeworCQkJCXVwID0gZmFsc2U7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIE15VmFsdWVGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbHVlRmFjdG9yeQorCXsKKwkJLyoqIAorCQkgKiBAcGFyYW0gdXJpCisJCSAqLwkJCisJCXB1YmxpYyBNeVZhbHVlRmFjdG9yeSggU3RyaW5nIHVyaSApCisJCXsKKwkJCXN1cGVyKCB1cmksIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlID0gbmV3IENsYXNzMlR5cGVNYXAoKTsKKworCQlzdGF0aWMKKwkJeworCQkJRGVmYXVsdFZhbHVlRmFjdG9yeS5pbml0KCB0eXBlcywgY2xhc3MydHlwZSApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9UZXN0TG9nZ2VyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9maWx0ZXJzL1Rlc3RMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM2MjYyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS90cmFuc3BvcnQvZmlsdGVycy9UZXN0TG9nZ2VyLmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuZmlsdGVyczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkNsYXNzMlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWZhdWx0VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVHJhbnNwb3J0TWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqICovCitwdWJsaWMgY2xhc3MgVGVzdExvZ2dlcgoreworCQorCXByaXZhdGUgZmluYWwgTXlUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IE15VHJhbnNwb3J0KCk7CisJcHJpdmF0ZSBmaW5hbCBNeVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBNeVNlc3Npb24oKTsKKwlwcml2YXRlIGZpbmFsIE15VmFsdWVGYWN0b3J5IHZmID0gbmV3IE15VmFsdWVGYWN0b3J5KCJ0Y3A6IiApOworCXByaXZhdGUgZmluYWwgUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMoKTsKKwl7CisJCXJlc291cmNlcy5wdXQoIFRyYW5zcG9ydC5WQUxVRV9GQUNUT1JZLCB2ZiApOworCQlMb2cuYWRkU2luayggbnVsbCApOworCX0KKworCQorCXByaXZhdGUgTG9nZ2VyIG5ld0xvZ2dlcihTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IExvZ2dlcih0cmFuc3BvcnQsbmV3IFVSTCh1cmkpLG51bGwpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0ODAyP2ZpbHRlcj1Mb2dnZXIiOworCQlMb2dnZXIudGVzdEZsYWcgPSB0cnVlOworCQlMb2dnZXIgbG9nZ2VyID0gbmV3TG9nZ2VyKHVyaSk7CisJCWFzc2VydEVxdWFscyhsb2dnZXIuZ2V0RmlsZU5hbWUoKSwiTG9nLnR4dCIpOworCQlhc3NlcnROb3RTYW1lKCBsb2dnZXIuZ2V0RmlsZU5hbWUoKSxsb2dnZXIuZ2V0VGVzdFJlbmFtZWRGaWxlTmFtZSgpKTsKKwkJCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQ4MDI/ZmlsdGVyPUxvZ2dlciZMb2dnZXIuZmlsZVBhdGg9VGVzdC50eHQiOworCQlMb2dnZXIudGVzdEZsYWcgPSB0cnVlOworCQlMb2dnZXIgbG9nZ2VyID0gbmV3TG9nZ2VyKHVyaSk7CisJCWFzc2VydEVxdWFscyhsb2dnZXIuZ2V0RmlsZU5hbWUoKSwiVGVzdC50eHQiKTsKKwkJYXNzZXJ0Tm90U2FtZSggbG9nZ2VyLmdldEZpbGVOYW1lKCksbG9nZ2VyLmdldFRlc3RSZW5hbWVkRmlsZU5hbWUoKSk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbG9nZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQ4MDI/ZmlsdGVyPUxvZ2dlciI7CisJCUxvZ2dlci50ZXN0RmxhZyA9IHRydWU7CisJCUxvZ2dlciBsb2dnZXIgPSBuZXdMb2dnZXIodXJpKTsKKwkJbG9nZ2VyLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJYXNzZXJ0U2FtZSh0cmFuc3BvcnQuZ2V0U2Vzc2lvbigpLGxvZ2dlcik7CisJCWFzc2VydFNhbWUobG9nZ2VyLmdldFNlc3Npb24oKSxzZXNzaW9uKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsb2dnZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQ4MDI/ZmlsdGVyPUxvZ2dlciI7CisJCUxvZ2dlci50ZXN0RmxhZyA9IHRydWU7CisJCUxvZ2dlciBsb2dnZXIgPSBuZXdMb2dnZXIodXJpKTsKKwkJbG9nZ2VyLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJYXNzZXJ0U2FtZSh0cmFuc3BvcnQuZ2V0U2Vzc2lvbigpLGxvZ2dlcik7CisJCWFzc2VydFNhbWUobG9nZ2VyLmdldFNlc3Npb24oKSxzZXNzaW9uKTsKKwkJTWVzc2FnZSBtID0gY29uc3RydWN0TWVzc2FnZSgpOworCQlsb2dnZXIudHJhbnNwb3J0TWVzc2FnZSggbnVsbCwgbSApOworCQlhc3NlcnRFcXVhbHMobS50b1N0cmluZygpLHRyYW5zcG9ydC5tc2cudG9TdHJpbmcoKSk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbG9nZ2VyMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0ODAyP2ZpbHRlcj1Mb2dnZXIiOworCQlMb2dnZXIudGVzdEZsYWcgPSB0cnVlOworCQlMb2dnZXIgbG9nZ2VyID0gbmV3TG9nZ2VyKHVyaSk7CisJCWxvZ2dlci5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CisJCWFzc2VydFNhbWUodHJhbnNwb3J0LmdldFNlc3Npb24oKSxsb2dnZXIpOworCQlhc3NlcnRTYW1lKGxvZ2dlci5nZXRTZXNzaW9uKCksc2Vzc2lvbik7CisJCU1lc3NhZ2UgbSA9IGNvbnN0cnVjdE1lc3NhZ2UoKTsKKwkJbG9nZ2VyLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtICk7CisJCWFzc2VydEVxdWFscyhtLnRvU3RyaW5nKCksc2Vzc2lvbi5tc2cudG9TdHJpbmcoKSk7CisJfQorCQorCQorCQorCXByaXZhdGUgTWVzc2FnZSBjb25zdHJ1Y3RNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJCisJCVR5cGUgbXRfcmVxdWVzdCA9IG5ldyBUeXBlKCAiX0V0Y2hfTG9nZ2VyX1Rlc3QiICk7CisJCQorCQkKKwkJVHlwZSBtdF9yZXNwb25zZSA9IG5ldyBUeXBlKCAiX0V0Y2hfTG9nZ2VyX1Rlc3RfUmVzcCIgKTsKKwkJCQorCQltdF9yZXF1ZXN0LnNldFJlc3VsdCggbXRfcmVzcG9uc2UgKTsKKwkJCisJCXZmLmFkZFR5cGUoIG10X3JlcXVlc3QpOworCQkKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggbXRfcmVxdWVzdCwgdmYgKTsKKwkKKwkJcmV0dXJuIG1zZzsKKwl9CisKKwkvKiogKi8KKwllbnVtIFdoYXQKKwl7CisJCS8qKiAqLyBUUkFOU1BPUlRfTUVTU0FHRSwKKwkJLyoqICovIFNFU1NJT05fTUVTU0FHRQorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorCXByaXZhdGUgc3RhdGljIGNsYXNzIE15VHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0TWVzc2FnZQorCXsKKwkJLyoqICovCisJCXB1YmxpYyBNeVRyYW5zcG9ydCgpCisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8uCisJCX0KKworCQkvKiogKi8gcHVibGljIFdoYXQgd2hhdDsKKwkJLyoqICovIHB1YmxpYyBXaG8gcmVjaXBpZW50OworCQkvKiogKi8gcHVibGljIE1lc3NhZ2UgbXNnOworCQkKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0TWVzc2FnZSggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlMb2cucmVwb3J0KCAidHJhbnNwb3J0TWVzc2FnZSIsICJyZWNpcGllbnQiLCByZWNpcGllbnQsICJtc2ciLCBtc2cgKTsKKwkJCXdoYXQgPSBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFOworCQkJdGhpcy5yZWNpcGllbnQgPSByZWNpcGllbnQ7CisJCQkKKwkJCXRoaXMubXNnID0gbXNnOworCQl9CisKKwkJcHVibGljIFNlc3Npb25NZXNzYWdlIGdldFNlc3Npb24oKQorCQl7CisJCQlyZXR1cm4gc2Vzc2lvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25NZXNzYWdlIHNlc3Npb24gKQorCQl7CisJCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCQl9CisJCQorCQlwcml2YXRlIFNlc3Npb25NZXNzYWdlIHNlc3Npb247CisKKwkJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnkgIitxdWVyeSApOworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCQorCQkJCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBub3RpZnkgIitldmVudCApOworCQl9CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorCXByaXZhdGUgc3RhdGljIGNsYXNzIE15U2Vzc2lvbiBpbXBsZW1lbnRzIFNlc3Npb25NZXNzYWdlCisJeworCQkvKiogKi8KKwkJcHVibGljIE15U2Vzc2lvbigpCisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8uCisJCX0KKworCQkvKiogKi8gcHVibGljIFdoYXQgd2hhdDsKKwkJLyoqICovIHB1YmxpYyBXaG8gc2VuZGVyOworCQkvKiogKi8gcHVibGljIE1lc3NhZ2UgbXNnOworCQkvKiogKi8gcHVibGljIEJvb2xlYW4gdXA7CisJCQorCQkKKwkJcHVibGljIGJvb2xlYW4gc2Vzc2lvbk1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInNlc3Npb25NZXNzYWdlIiwgInNlbmRlciIsIHNlbmRlciwgIm1zZyIsIG1zZyApOworCQkJd2hhdCA9IFdoYXQuU0VTU0lPTl9NRVNTQUdFOworCQkJdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisJCQl0aGlzLm1zZyA9IG1zZzsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJcmV0dXJuIHF1ZXJ5OworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlMb2cucmVwb3J0KCAic2Vzc2lvbkNvbnRyb2wiLCAiY29udHJvbCIsIGNvbnRyb2wsICJ2YWx1ZSIsIHZhbHVlICk7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCWlmIChldmVudCA9PSBTZXNzaW9uLlVQKQorCQkJeworCQkJCXVwID0gdHJ1ZTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCWlmIChldmVudCA9PSBTZXNzaW9uLkRPV04pCisJCQl7CisJCQkJdXAgPSBmYWxzZTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlWYWx1ZUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0VmFsdWVGYWN0b3J5CisJeworCQkvKioKKwkJICogQHBhcmFtIHVyaQorCQkgKi8KKwkJcHVibGljIE15VmFsdWVGYWN0b3J5KCBTdHJpbmcgdXJpICkKKwkJeworCQkJc3VwZXIoIHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisJCQorCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisJCXN0YXRpYworCQl7CisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5LmluaXQoIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKwl9CisJCit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9maWx0ZXJzL1Rlc3RQd0F1dGguamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZpbHRlcnMvVGVzdFB3QXV0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjhjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9maWx0ZXJzL1Rlc3RQd0F1dGguamF2YQpAQCAtMCwwICsxLDUyOSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5maWx0ZXJzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlZmF1bHRWYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlNlc3Npb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5UcmFuc3BvcnRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5maWx0ZXJzLlB3QXV0aC5Vc2VyUGFzc3dvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiAqLworcHVibGljIGNsYXNzIFRlc3RQd0F1dGgKK3sKKwlwcml2YXRlIGZpbmFsIE15VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBNeVRyYW5zcG9ydCgpOworCXByaXZhdGUgZmluYWwgTXlTZXNzaW9uIHNlc3Npb24gPSBuZXcgTXlTZXNzaW9uKCk7CisJcHJpdmF0ZSBmaW5hbCBNeVZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBNeVZhbHVlRmFjdG9yeSggInRjcDoiICk7CisJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpOworCXsKKwkJcmVzb3VyY2VzLnB1dCggVHJhbnNwb3J0LlZBTFVFX0ZBQ1RPUlksIHZmICk7CisJCUxvZy5hZGRTaW5rKCBudWxsICk7CisJfQorCQorCXByaXZhdGUgUHdBdXRoIG5ld1B3QXV0aCggU3RyaW5nIHVyaSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgUHdBdXRoKCB0cmFuc3BvcnQsIG5ldyBVUkwoIHVyaSApLCByZXNvdXJjZXMgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiLS1jb25zdHJ1Y3RvcjEiICk7CisJCQorCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gdHJ1ZTsKKwkJCisJCWZpbmFsIFB3QXV0aCBwd0F1dGggPSBuZXdQd0F1dGgoICJ0Y3A6Ly9mcmVkOjEyMzRAaG9zdDo5OTk5IiApOworCQlwd0F1dGguc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCQkKKwkJYXNzZXJ0U2FtZSggcHdBdXRoLCB0cmFuc3BvcnQuZ2V0U2Vzc2lvbigpICk7CisJCWFzc2VydFNhbWUoIHNlc3Npb24sIHB3QXV0aC5nZXRTZXNzaW9uKCkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggdHJ1ZSwgcHdBdXRoLmdldFNlcnZlcigpICk7CisJCWFzc2VydE51bGwoIHB3QXV0aC50cmFuc3BvcnRRdWVyeSggUHdBdXRoLlVTRVIgKSApOworCQlhc3NlcnROdWxsKCBwd0F1dGgudHJhbnNwb3J0UXVlcnkoIFB3QXV0aC5QQVNTV09SRCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLnJlcG9ydCggIi0tY29uc3RydWN0b3IyIiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworCQkKKwkJZmluYWwgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCggInRjcDovL2ZyZWQ6MTIzNEBob3N0Ojk5OTkiICk7CisJCXB3QXV0aC5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CisJCQorCQlhc3NlcnRTYW1lKCBwd0F1dGgsIHRyYW5zcG9ydC5nZXRTZXNzaW9uKCkgKTsKKwkJYXNzZXJ0U2FtZSggc2Vzc2lvbiwgcHdBdXRoLmdldFNlc3Npb24oKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBmYWxzZSwgcHdBdXRoLmdldFNlcnZlcigpICk7CisJCWFzc2VydEVxdWFscyggImZyZWQiLCBwd0F1dGgudHJhbnNwb3J0UXVlcnkoIFB3QXV0aC5VU0VSICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMTIzNCIsIHB3QXV0aC50cmFuc3BvcnRRdWVyeSggUHdBdXRoLlBBU1NXT1JEICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiLS1jb25zdHJ1Y3RvcjMiICk7CisJCQorCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisJCQorCQlmaW5hbCBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCAidGNwOi8vbWFyeToyMzQ1QGhvc3Q6OTk5OSIgKTsKKwkJcHdBdXRoLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJCisJCWFzc2VydFNhbWUoIHB3QXV0aCwgdHJhbnNwb3J0LmdldFNlc3Npb24oKSApOworCQlhc3NlcnRTYW1lKCBzZXNzaW9uLCBwd0F1dGguZ2V0U2Vzc2lvbigpICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGZhbHNlLCBwd0F1dGguZ2V0U2VydmVyKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAibWFyeSIsIHB3QXV0aC50cmFuc3BvcnRRdWVyeSggUHdBdXRoLlVTRVIgKSApOworCQlhc3NlcnRFcXVhbHMoICIyMzQ1IiwgcHdBdXRoLnRyYW5zcG9ydFF1ZXJ5KCBQd0F1dGguUEFTU1dPUkQgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLWNvbnN0cnVjdG9yNCIgKTsKKwkJCisJCXRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKwkJCisJCWZpbmFsIFB3QXV0aCBwd0F1dGggPSBuZXdQd0F1dGgoICJ0Y3A6Ly9hbGljZUBob3N0Ojk5OTkiICk7CisJCXB3QXV0aC5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CisJCQorCQlhc3NlcnRTYW1lKCBwd0F1dGgsIHRyYW5zcG9ydC5nZXRTZXNzaW9uKCkgKTsKKwkJYXNzZXJ0U2FtZSggc2Vzc2lvbiwgcHdBdXRoLmdldFNlc3Npb24oKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBmYWxzZSwgcHdBdXRoLmdldFNlcnZlcigpICk7CisJCWFzc2VydEVxdWFscyggImFsaWNlIiwgcHdBdXRoLnRyYW5zcG9ydFF1ZXJ5KCBQd0F1dGguVVNFUiApICk7CisJCWFzc2VydE51bGwoIHB3QXV0aC50cmFuc3BvcnRRdWVyeSggUHdBdXRoLlBBU1NXT1JEICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiLS1jb25zdHJ1Y3RvcjUiICk7CisJCQorCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7IC8vIElTX1NFUlZFUgorCQkKKwkJZmluYWwgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCggInRjcDovL2hvc3Q6OTk5OSIgKTsKKwkJcHdBdXRoLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJCisJCWFzc2VydFNhbWUoIHB3QXV0aCwgdHJhbnNwb3J0LmdldFNlc3Npb24oKSApOworCQlhc3NlcnRTYW1lKCBzZXNzaW9uLCBwd0F1dGguZ2V0U2Vzc2lvbigpICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGZhbHNlLCBwd0F1dGguZ2V0U2VydmVyKCkgKTsKKwkJYXNzZXJ0TnVsbCggcHdBdXRoLnRyYW5zcG9ydFF1ZXJ5KCBQd0F1dGguVVNFUiApICk7CisJCWFzc2VydE51bGwoIHB3QXV0aC50cmFuc3BvcnRRdWVyeSggUHdBdXRoLlBBU1NXT1JEICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiLS1jb25zdHJ1Y3RvcjYiICk7CisJCQorCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gbmV3IEV4Y2VwdGlvbiggImlzX3NlcnZlciBmYWlsZWQiICk7CisJCQorCQluZXdQd0F1dGgoICJ0Y3A6Ly9mcmVkOjEyMzRAaG9zdDo5OTk5IiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsaWVudHVwMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLWNsaWVudHVwMSIgKTsKKwkJCisJCXRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsgLy8gSVNfU0VSVkVSCisJCQorCQlmaW5hbCBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCAidGNwOi8vZnJlZDoxMjM0QGhvc3Q6OTk5OSIgKTsKKwkJcHdBdXRoLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJCisJCXB3QXV0aC5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLlVQICk7CisJCQorCQlhc3NlcnRUcnVlKCBzZXNzaW9uLnVwICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9NRVNTQUdFLCB0cmFuc3BvcnQud2hhdCApOworCQlNZXNzYWdlIG1zZyA9IHRyYW5zcG9ydC5tc2c7CisJCWFzc2VydEVxdWFscyggIl9FdGNoX1B3QXV0aFJlcSIsIG1zZy50eXBlKCkuZ2V0TmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggImZyZWQiLCBtc2cuZ2V0KCBuZXcgRmllbGQoICJ1c2VyIiApICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMTIzNCIsIG1zZy5nZXQoIG5ldyBGaWVsZCggInBhc3N3b3JkIiApICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbGllbnR1cDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiLS1jbGllbnR1cDIiICk7CisJCQorCQl0cmFuc3BvcnQuaXNfc2VydmVyID0gZmFsc2U7CisJCXNlc3Npb24ucGFzc3dvcmQgPSAiMjM0NSI7CisJCQorCQlmaW5hbCBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCAidGNwOi8vZnJlZEBob3N0Ojk5OTkiICk7CisJCXB3QXV0aC5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CisJCQorCQlwd0F1dGguc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5VUCApOworCQkKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi51cCApOworCQkKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfTUVTU0FHRSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJTWVzc2FnZSBtc2cgPSB0cmFuc3BvcnQubXNnOworCQlhc3NlcnRFcXVhbHMoICJfRXRjaF9Qd0F1dGhSZXEiLCBtc2cudHlwZSgpLmdldE5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICJmcmVkIiwgbXNnLmdldCggbmV3IEZpZWxkKCAidXNlciIgKSApICk7CisJCWFzc2VydEVxdWFscyggIjIzNDUiLCBtc2cuZ2V0KCBuZXcgRmllbGQoICJwYXNzd29yZCIgKSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2xpZW50dXAzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLnJlcG9ydCggIi0tY2xpZW50dXAzIiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworCQlzZXNzaW9uLnVzZXIgPSAibWFyeSI7CisJCXNlc3Npb24ucGFzc3dvcmQgPSAiMzQ1NiI7CisJCQorCQlmaW5hbCBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCAidGNwOi8vaG9zdDo5OTk5IiApOworCQlwd0F1dGguc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCQkKKwkJcHdBdXRoLnNlc3Npb25Ob3RpZnkoIFNlc3Npb24uVVAgKTsKKwkJCisJCWFzc2VydFRydWUoIHNlc3Npb24udXAgKTsKKwkJCisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX01FU1NBR0UsIHRyYW5zcG9ydC53aGF0ICk7CisJCU1lc3NhZ2UgbXNnID0gdHJhbnNwb3J0Lm1zZzsKKwkJYXNzZXJ0RXF1YWxzKCAiX0V0Y2hfUHdBdXRoUmVxIiwgbXNnLnR5cGUoKS5nZXROYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAibWFyeSIsIG1zZy5nZXQoIG5ldyBGaWVsZCggInVzZXIiICkgKSApOworCQlhc3NlcnRFcXVhbHMoICIzNDU2IiwgbXNnLmdldCggbmV3IEZpZWxkKCAicGFzc3dvcmQiICkgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNsaWVudHVwNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLWNsaWVudHVwNCIgKTsKKwkJCisJCXRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKwkJLy8gc2Vzc2lvbi51c2VyID0gbnVsbDsKKwkJc2Vzc2lvbi5wYXNzd29yZCA9ICIxMjM0IjsKKwkJCisJCWZpbmFsIFB3QXV0aCBwd0F1dGggPSBuZXdQd0F1dGgoICJ0Y3A6Ly9ob3N0Ojk5OTkiICk7CisJCXB3QXV0aC5zZXRTZXNzaW9uKCBzZXNzaW9uICk7CisJCQorCQlwd0F1dGguc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5VUCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNsaWVudHVwNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLWNsaWVudHVwNSIgKTsKKwkJCisJCXRyYW5zcG9ydC5pc19zZXJ2ZXIgPSBmYWxzZTsKKwkJc2Vzc2lvbi51c2VyID0gImZyZWQiOworLy8JCXNlc3Npb24ucGFzc3dvcmQgPSBudWxsOworCQkKKwkJZmluYWwgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCggInRjcDovL2hvc3Q6OTk5OSIgKTsKKwkJcHdBdXRoLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJCisJCXB3QXV0aC5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLlVQICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY2xpZW50dXA2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLnJlcG9ydCggIi0tY2xpZW50dXA2IiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworCQlzZXNzaW9uLnVzZXIgPSAiZnJlZCI7CisJCXNlc3Npb24ucGFzc3dvcmQgPSBuZXcgRXhjZXB0aW9uKCAicGFzc3dvcmQgZmFpbGVkIiApOworCQkKKwkJZmluYWwgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCggInRjcDovL2hvc3Q6OTk5OSIgKTsKKwkJcHdBdXRoLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJCisJCXB3QXV0aC5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLlVQICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY2xpZW50dXA3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLnJlcG9ydCggIi0tY2xpZW50dXA3IiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworCQlzZXNzaW9uLnVzZXIgPSBuZXcgRXhjZXB0aW9uKCAidXNlciBmYWlsZWQiICk7CisJCXNlc3Npb24ucGFzc3dvcmQgPSAiMTIzNCI7CisJCQorCQlmaW5hbCBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCAidGNwOi8vaG9zdDo5OTk5IiApOworCQlwd0F1dGguc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCQkKKwkJcHdBdXRoLnNlc3Npb25Ob3RpZnkoIFNlc3Npb24uVVAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbGllbnRkb3duMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLWNsaWVudGRvd24xIiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IGZhbHNlOworCQkKKwkJZmluYWwgUHdBdXRoIHB3QXV0aCA9IG5ld1B3QXV0aCggInRjcDovL2hvc3Q6OTk5OSIgKTsKKwkJcHdBdXRoLnNldFNlc3Npb24oIHNlc3Npb24gKTsKKwkJCisJCXB3QXV0aC5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLkRPV04gKTsKKwkJCisJCWFzc2VydEZhbHNlKCBzZXNzaW9uLnVwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmVydXAxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLnJlcG9ydCggIi0tc2VydmVydXAxIiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IHRydWU7CisJCQorCQlmaW5hbCBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCAidGNwOi8vaG9zdDo5OTk5IiApOworCQlwd0F1dGguc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCQkKKwkJcHdBdXRoLnNlc3Npb25Ob3RpZnkoIFNlc3Npb24uVVAgKTsKKwkJCisJCWFzc2VydFRydWUoIHNlc3Npb24udXAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2ZXJkb3duMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLXNlcnZlcmRvd24xIiApOworCQkKKwkJdHJhbnNwb3J0LmlzX3NlcnZlciA9IHRydWU7CisJCQorCQlmaW5hbCBQd0F1dGggcHdBdXRoID0gbmV3UHdBdXRoKCAidGNwOi8vaG9zdDo5OTk5IiApOworCQlwd0F1dGguc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCQkKKwkJcHdBdXRoLnNlc3Npb25Ob3RpZnkoIFNlc3Npb24uRE9XTiApOworCQkKKwkJYXNzZXJ0RmFsc2UoIHNlc3Npb24udXAgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi51c2VyUGFzc3dvcmQudXNlciApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnVzZXJQYXNzd29yZC5wYXNzd29yZCApOworCX0KKwkKKwkvLyBzZXNzaW9uTWVzc2FnZSwgc2VydmVyLCByZXEKKwkvLyBzZXNzaW9uTWVzc2FnZSwgc2VydmVyLCByZXNwCisJLy8gc2Vzc2lvbk1lc3NhZ2UsIGNsaWVudCwgcmVxCisJLy8gc2Vzc2lvbk1lc3NhZ2UsIGNsaWVudCwgcmVzcAorCQorCS8qKgorCSAqIEBwYXJhbSBvCisJICogQHJldHVybiBvCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlzdGF0aWMgT2JqZWN0IGNvb2soIE9iamVjdCBvICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKG8gaW5zdGFuY2VvZiBFeGNlcHRpb24pCisJCXsKKwkJCUV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbikgbzsKKwkJCWUuZmlsbEluU3RhY2tUcmFjZSgpOworCQkJdGhyb3cgZTsKKwkJfQorCQlyZXR1cm4gbzsKKwl9CisJCisJLyoqICovCisJZW51bSBXaGF0CisJeworCQkvKiogKi8gVFJBTlNQT1JUX01FU1NBR0UsCisJCS8qKiAqLyBTRVNTSU9OX01FU1NBR0UKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnRNZXNzYWdlCisJeworCQkvKiogKi8KKwkJcHVibGljIE15VHJhbnNwb3J0KCkKKwkJeworCQkJLy8gbm90aGluZyB0byBkby4KKwkJfQorCisJCS8qKiAqLyBwdWJsaWMgV2hhdCB3aGF0OworCQkvKiogKi8gcHVibGljIFdobyByZWNpcGllbnQ7CisJCS8qKiAqLyBwdWJsaWMgTWVzc2FnZSBtc2c7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGlzX3NlcnZlcjsKKwkJCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE1lc3NhZ2UoIFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInRyYW5zcG9ydE1lc3NhZ2UiLCAicmVjaXBpZW50IiwgcmVjaXBpZW50LCAibXNnIiwgbXNnICk7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfTUVTU0FHRTsKKwkJCXRoaXMucmVjaXBpZW50ID0gcmVjaXBpZW50OworCQkJdGhpcy5tc2cgPSBtc2c7CisJCX0KKworCQlwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgZ2V0U2Vzc2lvbigpCisJCXsKKwkJCXJldHVybiBzZXNzaW9uOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2Vzc2lvbiggU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbiApCisJCXsKKwkJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisJCX0KKwkJCisJCXByaXZhdGUgU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKKworCQlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCUxvZy5yZXBvcnQoICJ0cmFuc3BvcnRRdWVyeSIsICJxdWVyeSIsIHF1ZXJ5ICk7CisJCQkKKwkJCWlmIChxdWVyeSA9PSBUcmFuc3BvcnQuSVNfU0VSVkVSKQorCQkJCXJldHVybiBjb29rKCBpc19zZXJ2ZXIgKTsKKwkJCQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBxdWVyeSAiK3F1ZXJ5ICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInRyYW5zcG9ydENvbnRyb2wiLCAiY29udHJvbCIsIGNvbnRyb2wsICJ2YWx1ZSIsIHZhbHVlICk7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBub3RpZnkgIitldmVudCApOworCQl9CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorCXByaXZhdGUgc3RhdGljIGNsYXNzIE15U2Vzc2lvbiBpbXBsZW1lbnRzIFNlc3Npb25NZXNzYWdlCisJeworCQkvKiogKi8KKwkJcHVibGljIE15U2Vzc2lvbigpCisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8uCisJCX0KKworCQkvKiogKi8gcHVibGljIFdoYXQgd2hhdDsKKwkJLyoqICovIHB1YmxpYyBXaG8gc2VuZGVyOworCQkvKiogKi8gcHVibGljIE1lc3NhZ2UgbXNnOworCQkvKiogKi8gcHVibGljIGJvb2xlYW4gaGFuZGxlZDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgdXNlcjsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgcGFzc3dvcmQ7CisJCS8qKiAqLyBwdWJsaWMgQm9vbGVhbiB1cDsKKwkJLyoqICovIHB1YmxpYyBVc2VyUGFzc3dvcmQgdXNlclBhc3N3b3JkOworCQkKKwkJcHVibGljIGJvb2xlYW4gc2Vzc2lvbk1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInNlc3Npb25NZXNzYWdlIiwgInNlbmRlciIsIHNlbmRlciwgIm1zZyIsIG1zZyApOworCQkJd2hhdCA9IFdoYXQuU0VTU0lPTl9NRVNTQUdFOworCQkJdGhpcy5zZW5kZXIgPSBzZW5kZXI7CisJCQl0aGlzLm1zZyA9IG1zZzsKKwkJCXJldHVybiBoYW5kbGVkOworCQl9CisKKwkJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInNlc3Npb25RdWVyeSIsICJxdWVyeSIsIHF1ZXJ5ICk7CisJCQkKKwkJCWlmIChxdWVyeSA9PSBQd0F1dGguVVNFUikKKwkJCQlyZXR1cm4gY29vayggdXNlciApOworCQkJCisJCQlpZiAocXVlcnkgPT0gUHdBdXRoLlBBU1NXT1JEKQorCQkJCXJldHVybiBjb29rKCBwYXNzd29yZCApOworCQkJCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIHF1ZXJ5ICIrcXVlcnkgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Db250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJTG9nLnJlcG9ydCggInNlc3Npb25Db250cm9sIiwgImNvbnRyb2wiLCBjb250cm9sLCAidmFsdWUiLCB2YWx1ZSApOworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sICIrY29udHJvbCApOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlpZiAoZXZlbnQgPT0gU2Vzc2lvbi5VUCkKKwkJCXsKKwkJCQl1cCA9IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQlpZiAoZXZlbnQgPT0gU2Vzc2lvbi5ET1dOKQorCQkJeworCQkJCXVwID0gZmFsc2U7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBVc2VyUGFzc3dvcmQpCisJCQl7CisJCQkJdXNlclBhc3N3b3JkID0gKFVzZXJQYXNzd29yZCkgZXZlbnQ7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIG5vdGlmeSAiK2V2ZW50ICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlWYWx1ZUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0VmFsdWVGYWN0b3J5CisJeworCQkvKioKKwkJICogQHBhcmFtIHVyaQorCQkgKi8KKwkJcHVibGljIE15VmFsdWVGYWN0b3J5KCBTdHJpbmcgdXJpICkKKwkJeworCQkJc3VwZXIoIHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisJCQorCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisJCXN0YXRpYworCQl7CisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5LmluaXQoIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvYmluYXJ5L1Rlc3RCaW5hcnlUYWdnZWREYXRhSW5PdXQuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdHJhbnNwb3J0L2ZtdC9iaW5hcnkvVGVzdEJpbmFyeVRhZ2dlZERhdGFJbk91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NGE5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3RyYW5zcG9ydC9mbXQvYmluYXJ5L1Rlc3RCaW5hcnlUYWdnZWREYXRhSW5PdXQuamF2YQpAQCAtMCwwICsxLDkwOCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQuYmluYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGVNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsaWRhdG9yLkxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlZmF1bHRWYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfYm9vbGVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9ieXRlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2RvdWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9mbG9hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9pbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9vYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3Jfc2hvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3Jfc3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5NZXNzYWdpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5mbXQuVHlwZUNvZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb25QYWNrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnRQYWNrZXQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKioKKyAqIFRlc3QgYmluYXJ5IGlucHV0IGFuZCBvdXRwdXQuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QmluYXJ5VGFnZ2VkRGF0YUluT3V0Cit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIERPVUJMRV9NSU5fTk9STUFMID0gMHgxLjBwLTEwMjI7IC8vIERvdWJsZS5NSU5fTk9STUFMOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEZMT0FUX01JTl9OT1JNQUwgPSAweDEuMHAtMTI2ZjsgLy8gRmxvYXQuTUlOX05PUk1BTDsKKwkKKwlzdGF0aWMKKwl7CisJCUxvZy5hZGRTaW5rKCBudWxsICk7CisJfQorCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9jaGVja192YWx1ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGknbSB0ZXN0aW5nIHdpdGggaGFyZCBjb2RlZCBjb25zdGFudHMgb24gdGhlIGxlZnQgaGFuZAorCQkvLyBzaWRlIGhlcmUgYmVjYXVzZSB0aGlzIHJlcHJlc2VudHMgb3VyIGV4dGVybmFsIGludGVyZmFjZQorCQkvLyBmb3IgbWVzc2FnZXMuIGlmIHRoZXNlIHZhbHVlcyBjaGFuZ2UsIGl0IGNvdWxkIGJyaW5nIGFib3V0CisJCS8vIGFjY2lkZW50YWwgbWlzc2lsZSBsYXVuY2hlcywgaW5hZHZlcnRhbnQgYmFuayBiYWxhbmNlIHRyYW5zZmVycworCQkvLyB0byB1bmZyaWVuZGx5IGZvcmVpZ24gbmF0aW9ucywgb3IgdGhlIGRyb3BwaW5nIG9mIGEgc21hbGwKKwkJLy8gY2hpbGQncyBsb2xsaXBvcCBpbnRvIHRoZSBzYW5kLiBsaWtlIGEgcGl6emEgZmFjZSBkb3duIGluCisJCS8vIHRoZSBwYXJraW5nIGxvdCwgeW91IGRvbid0IHdhbm5hIGdvIHRoZXJlLgorCQkKKy8vCQlWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgRHVtbXlWYWx1ZUZhY3RvcnkoKTsKKwkJQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCBidGRvID0gbmV3IEJpbmFyeVRhZ2dlZERhdGFPdXRwdXQoIHZmLCAibm9uZToiICk7CisJCQorCQkvLyBieXRlIHZhbHVlcworCQlmb3IgKGJ5dGUgaTogZ2V0Qnl0ZXMoIEJ5dGUuTUlOX1ZBTFVFLCAyNTYgKSkKKwkJCWlmIChpID49IFR5cGVDb2RlLk1JTl9USU5ZX0lOVCAmJiBpIDw9IFR5cGVDb2RlLk1BWF9USU5ZX0lOVCkKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpLCBidGRvLmNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZQorCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLkJZVEUsIGJ0ZG8uY2hlY2tWYWx1ZSggaSApICk7CisJCQorCQkvLyBzaG9ydCB2YWx1ZXMKKwkJZm9yIChzaG9ydCBpOiBnZXRTaG9ydHMoIFNob3J0Lk1JTl9WQUxVRSwgNjU1MzYgKSkKKwkJCWlmIChpID49IFR5cGVDb2RlLk1JTl9USU5ZX0lOVCAmJiBpIDw9IFR5cGVDb2RlLk1BWF9USU5ZX0lOVCkKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgaSwgYnRkby5jaGVja1ZhbHVlKCBpICkgKTsKKwkJCWVsc2UgaWYgKGkgPj0gQnl0ZS5NSU5fVkFMVUUgJiYgaSA8PSBCeXRlLk1BWF9WQUxVRSkKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBUeXBlQ29kZS5CWVRFLCBidGRvLmNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZQorCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLlNIT1JULCBidGRvLmNoZWNrVmFsdWUoIGkgKSApOworCQkKKwkJLy8gaW50IHZhbHVlcworCQlmb3IgKGludCBpOiBnZXRUZXN0SW50cygpKQorCQkJaWYgKGkgPj0gVHlwZUNvZGUuTUlOX1RJTllfSU5UICYmIGkgPD0gVHlwZUNvZGUuTUFYX1RJTllfSU5UKQorCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoIChieXRlKSBpLCBidGRvLmNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZSBpZiAoaSA+PSBCeXRlLk1JTl9WQUxVRSAmJiBpIDw9IEJ5dGUuTUFYX1ZBTFVFKQorCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLkJZVEUsIGJ0ZG8uY2hlY2tWYWx1ZSggaSApICk7CisJCQllbHNlIGlmIChpID49IFNob3J0Lk1JTl9WQUxVRSAmJiBpIDw9IFNob3J0Lk1BWF9WQUxVRSkKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBUeXBlQ29kZS5TSE9SVCwgYnRkby5jaGVja1ZhbHVlKCBpICkgKTsKKwkJCWVsc2UKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBUeXBlQ29kZS5JTlQsIGJ0ZG8uY2hlY2tWYWx1ZSggaSApICk7CisJCQorCQkvLyBsb25nIHZhbHVlcworCQlmb3IgKGxvbmcgaTogZ2V0VGVzdExvbmdzKCkpCisJCQlpZiAoaSA+PSBUeXBlQ29kZS5NSU5fVElOWV9JTlQgJiYgaSA8PSBUeXBlQ29kZS5NQVhfVElOWV9JTlQpCisJCQkJQXNzZXJ0LmFzc2VydEVxdWFscyggKGJ5dGUpIGksIGJ0ZG8uY2hlY2tWYWx1ZSggaSApICk7CisJCQllbHNlIGlmIChpID49IEJ5dGUuTUlOX1ZBTFVFICYmIGkgPD0gQnl0ZS5NQVhfVkFMVUUpCisJCQkJQXNzZXJ0LmFzc2VydEVxdWFscyggVHlwZUNvZGUuQllURSwgYnRkby5jaGVja1ZhbHVlKCBpICkgKTsKKwkJCWVsc2UgaWYgKGkgPj0gU2hvcnQuTUlOX1ZBTFVFICYmIGkgPD0gU2hvcnQuTUFYX1ZBTFVFKQorCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLlNIT1JULCBidGRvLmNoZWNrVmFsdWUoIGkgKSApOworCQkJZWxzZSBpZiAoaSA+PSBJbnRlZ2VyLk1JTl9WQUxVRSAmJiBpIDw9IEludGVnZXIuTUFYX1ZBTFVFKQorCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLklOVCwgYnRkby5jaGVja1ZhbHVlKCBpICkgKTsKKwkJCWVsc2UKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBUeXBlQ29kZS5MT05HLCBidGRvLmNoZWNrVmFsdWUoIGkgKSApOworCQkKKwkJLy8gbnVsbCB2YWx1ZQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBUeXBlQ29kZS5OVUxMLCBidGRvLmNoZWNrVmFsdWUoIG51bGwgKSApOworCQkKKwkJLy8gYm9vbGVhbiB2YWx1ZXMKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggVHlwZUNvZGUuQk9PTEVBTl9GQUxTRSwgYnRkby5jaGVja1ZhbHVlKCBmYWxzZSApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLkJPT0xFQU5fVFJVRSwgYnRkby5jaGVja1ZhbHVlKCB0cnVlICkgKTsKKwkJCisJCS8vIGZsb2F0CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLkZMT0FULCBidGRvLmNoZWNrVmFsdWUoIDMuMTQxNTlmICkgKTsKKwkJCisJCS8vIGRvdWJsZQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBUeXBlQ29kZS5ET1VCTEUsIGJ0ZG8uY2hlY2tWYWx1ZSggMy4xNDE1OSApICk7CisJCQorCQkvLyBieXRlIGFycmF5CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLkJZVEVTLCBidGRvLmNoZWNrVmFsdWUoIG5ldyBieXRlWzBdICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggVHlwZUNvZGUuQllURVMsIGJ0ZG8uY2hlY2tWYWx1ZSggbmV3IGJ5dGVbMV0gKSApOworCQkKKwkJLy8gc3RyaW5nCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLkVNUFRZX1NUUklORywgYnRkby5jaGVja1ZhbHVlKCAiIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLlNUUklORywgYnRkby5jaGVja1ZhbHVlKCAiYWJjIiApICk7CisJCQorCQkvLyBzdHJ1Y3QKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggVHlwZUNvZGUuQ1VTVE9NLCBidGRvLmNoZWNrVmFsdWUoIG5ldyBTdHJ1Y3RWYWx1ZSggbmV3IFR5cGUoICJmb28iICksIHZmICkgKSApOworCQkKKwkJLy8gY3VzdG9tCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIFR5cGVDb2RlLkNVU1RPTSwgYnRkby5jaGVja1ZhbHVlKCBuZXcgRGF0ZSgpICkgKTsKKwkJCisJCS8vIG5vbmUKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggVHlwZUNvZGUuTk9ORSwgYnRkby5jaGVja1ZhbHVlKCBCaW5hcnlUYWdnZWREYXRhLk5PTkUgKSApOworCX0KKwkKKwlwcml2YXRlIGxvbmdbXSBnZXRUZXN0TG9uZ3MoKQorCXsKKwkJaW50IG4gPSA2NTUzNisyKzY7CisJCWludCBrID0gNjU1MzYrMjsKKwkJaW50IG1pbiA9IFNob3J0Lk1JTl9WQUxVRS0xOworCQlsb25nW10gdmFscyA9IG5ldyBsb25nW25dOworCQlpbnQgaSA9IDA7CisJCXdoaWxlIChrLS0gPiAwKQorCQkJdmFsc1tpKytdID0gbWluKys7CisJCXZhbHNbaSsrXSA9IEludGVnZXIuTUlOX1ZBTFVFOworCQl2YWxzW2krK10gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJdmFsc1tpKytdID0gSW50ZWdlci5NSU5fVkFMVUUtMUw7CisJCXZhbHNbaSsrXSA9IEludGVnZXIuTUFYX1ZBTFVFKzFMOworCQl2YWxzW2krK10gPSBMb25nLk1JTl9WQUxVRTsKKwkJdmFsc1tpKytdID0gTG9uZy5NQVhfVkFMVUU7CisJCXJldHVybiB2YWxzOworCX0KKworCXByaXZhdGUgaW50W10gZ2V0VGVzdEludHMoKQorCXsKKwkJaW50IG4gPSA2NTUzNisyKzI7CisJCWludCBrID0gNjU1MzYrMjsKKwkJaW50IG1pbiA9IFNob3J0Lk1JTl9WQUxVRS0xOworCQlpbnRbXSB2YWxzID0gbmV3IGludFtuXTsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAoay0tID4gMCkKKwkJCXZhbHNbaSsrXSA9IG1pbisrOworCQl2YWxzW2krK10gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKwkJdmFsc1tpKytdID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCXJldHVybiB2YWxzOworCX0KKworCXByaXZhdGUgc2hvcnRbXSBnZXRTaG9ydHMoIHNob3J0IG1pbiwgaW50IG4gKQorCXsKKwkJc2hvcnRbXSB2YWxzID0gbmV3IHNob3J0W25dOworCQlpbnQgaSA9IDA7CisJCXdoaWxlIChuLS0gPiAwKQorCQkJdmFsc1tpKytdID0gbWluKys7CisJCXJldHVybiB2YWxzOworCX0KKworCXByaXZhdGUgYnl0ZVtdIGdldEJ5dGVzKCBieXRlIG1pbiwgaW50IG4gKQorCXsKKwkJYnl0ZVtdIHZhbHMgPSBuZXcgYnl0ZVtuXTsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAobi0tID4gMCkKKwkJCXZhbHNbaSsrXSA9IG1pbisrOworCQlyZXR1cm4gdmFsczsKKwl9CisKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RfYm9vbGVhbigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3R4KCBuZXcgYm9vbGVhbltdW10geyB7IGZhbHNlLCB0cnVlIH0sIHsgdHJ1ZSwgZmFsc2UgfSB9LAorCQkJVmFsaWRhdG9yX2Jvb2xlYW4uZ2V0KCAyICkgKTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X2J5dGUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0eCggbmV3IGJ5dGVbXVtdIHsgeyBCeXRlLk1JTl9WQUxVRSwgLTEsIDAsIDEsIEJ5dGUuTUFYX1ZBTFVFIH0sIHsgMjMgfSB9LAorCQkJVmFsaWRhdG9yX2J5dGUuZ2V0KCAyICkgKTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X3Nob3J0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdHgoIG5ldyBzaG9ydFtdW10geyB7IFNob3J0Lk1JTl9WQUxVRSwgQnl0ZS5NSU5fVkFMVUUsIC0xLCAwLCAxLAorCQkJQnl0ZS5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSB9LCB7IDIzIH0gfSwKKwkJCVZhbGlkYXRvcl9zaG9ydC5nZXQoIDIgKSApOworCX0KKwkKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RfaW50KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdHgoIG5ldyBpbnRbXVtdIHsgeyBJbnRlZ2VyLk1JTl9WQUxVRSwgU2hvcnQuTUlOX1ZBTFVFLCBCeXRlLk1JTl9WQUxVRSwKKwkJCS0xLCAwLCAxLCBCeXRlLk1BWF9WQUxVRSwgU2hvcnQuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSB9LCB7IDIzIH0gfSwKKwkJCVZhbGlkYXRvcl9pbnQuZ2V0KCAyICkgKTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X2xvbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0eCggbmV3IGxvbmdbXVtdIHsgeyBMb25nLk1JTl9WQUxVRSwgSW50ZWdlci5NSU5fVkFMVUUsIFNob3J0Lk1JTl9WQUxVRSwKKwkJCUJ5dGUuTUlOX1ZBTFVFLCAtMSwgMCwgMSwgQnl0ZS5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSwKKwkJCUludGVnZXIuTUFYX1ZBTFVFLCBMb25nLk1BWF9WQUxVRSB9LCB7IDIzIH0gfSwKKwkJCVZhbGlkYXRvcl9sb25nLmdldCggMiApICk7CisJfQorCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9mbG9hdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3R4KCBuZXcgZmxvYXRbXVtdIHsgeyAtMSwgMCwgMSwgRmxvYXQuTUlOX1ZBTFVFLCBGTE9BVF9NSU5fTk9STUFMLAorCQkJRmxvYXQuTUFYX1ZBTFVFLCBGbG9hdC5OYU4sIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZLAorCQkJRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFksIC0wLjBmLCAxLjFmLAorCQkJMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzlmIH0sIHsgMjMgfSB9LAorCQkJVmFsaWRhdG9yX2Zsb2F0LmdldCggMiApICk7CisJfQorCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdF9kb3VibGUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0eCggbmV3IGRvdWJsZVtdW10geyB7IC0xLCAwLCAxLCBEb3VibGUuTUlOX1ZBTFVFLCBET1VCTEVfTUlOX05PUk1BTCwKKwkJCURvdWJsZS5NQVhfVkFMVUUsIERvdWJsZS5OYU4sIERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSwKKwkJCURvdWJsZS5QT1NJVElWRV9JTkZJTklUWSwgLTAuMGYsIDEuMWYsCisJCQkzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OSB9LCB7IDIzIH0gfSwKKwkJCVZhbGlkYXRvcl9kb3VibGUuZ2V0KCAyICkgKTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X1N0cmluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3R4KCBuZXcgU3RyaW5nW11bXSB7IHsgIiIsICJhIiwgImFiIiwgImFiYyIgfSwgeyAiMjMiIH0gfSwKKwkJCVZhbGlkYXRvcl9zdHJpbmcuZ2V0KCAyICkgKTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0X2FkZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVR5cGUgYWRkID0gdmYuZ2V0VHlwZSggImFkZCIgKTsKKwkJCisJCUZpZWxkIHggPSBuZXcgRmllbGQoICJ4IiApOworCQlhZGQucHV0VmFsaWRhdG9yKCB4LCBWYWxpZGF0b3JfaW50LmdldCggMCApICk7CisJCQorCQlGaWVsZCB5ID0gbmV3IEZpZWxkKCAieSIgKTsKKwkJYWRkLnB1dFZhbGlkYXRvciggeSwgVmFsaWRhdG9yX2ludC5nZXQoIDAgKSApOworCQkKKwkJRmllbGQgX21mX19tZXNzYWdlSWQgPSBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkOworCQlhZGQucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKwkJCisJCWxvbmcgbXNnaWQgPSAweDAxMDIwMzA0MDUwNjA3MDhMOworCQkKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggImFkZC5pZCgpID0gJTA0eFxuIiwgYWRkLmdldElkKCkgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggInguaWQoKSA9ICUwNHhcbiIsIHguZ2V0SWQoKSApOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAieS5pZCgpID0gJTA0eFxuIiwgeS5nZXRJZCgpICk7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJfbWZfX21lc3NhZ2VJZC5pZCgpID0gJTA0eFxuIiwgX21mX19tZXNzYWdlSWQuZ2V0SWQoKSApOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAibXNnaWQgPSAlMDh4XG4iLCBtc2dpZCApOworCQkKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggYWRkLCB2ZiApOworCQltc2cucHV0KCB4LCAxICk7CisJCW1zZy5wdXQoIHksIDIgKTsKKwkJbXNnLnB1dCggX21mX19tZXNzYWdlSWQsIG1zZ2lkICk7CisJCXRlc3Rtc2cyYnl0ZXMoIG1zZywgbnVsbCwgIG5ldyBieXRlW10geyAzLCAtMTIyLCAzOSwgLTIzLCAtNzMsIC0xMDAsIDMsIC0xMjIsIDIxLCAxMCwgNDQsIC03NywgMSwgLTEyMiwgOTksIDYsIC03NiwgMTA0LCAtMTIxLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAtMTIyLCAyMSwgMTAsIDQ0LCAtNzYsIDIsIC0xMjcgfSApOworCQl0ZXN0bXNnMmJ5dGVzKCBtc2csIGZhbHNlLCBuZXcgYnl0ZVtdIHsgMywgLTEyMiwgMzksIC0yMywgLTczLCAtMTAwLCAzLCAtMTIyLCAyMSwgMTAsIDQ0LCAtNzcsIDEsIC0xMjIsIDk5LCA2LCAtNzYsIDEwNCwgLTEyMSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgLTEyMiwgMjEsIDEwLCA0NCwgLTc2LCAyLCAtMTI3IH0gKTsKKwkJdGVzdG1zZzJieXRlcyggbXNnLCB0cnVlLCAgbmV3IGJ5dGVbXSB7IDMsIC0xMDksIDMsIDk3LCAxMDAsIDEwMCwgMywgLTEwOSwgMSwgMTIwLCAxLCAtMTA5LCAxMCwgOTUsIDEwOSwgMTAxLCAxMTUsIDExNSwgOTcsIDEwMywgMTAxLCA3MywgMTAwLCAtMTIxLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAtMTA5LCAxLCAxMjEsIDIsIC0xMjcgfSApOworCQkKKwkJbXNnID0gbmV3IE1lc3NhZ2UoIGFkZCwgdmYgKTsKKwkJbXNnLnB1dCggeCwgMTAwMDAwMDAwMCApOworCQltc2cucHV0KCB5LCAyMDAwMDAwMDAwICk7CisJCW1zZy5wdXQoIF9tZl9fbWVzc2FnZUlkLCBtc2dpZCApOworCQl0ZXN0bXNnMmJ5dGVzKCBtc2csIG51bGwsICBuZXcgYnl0ZVtdIHsgMywgLTEyMiwgMzksIC0yMywgLTczLCAtMTAwLCAzLCAtMTIyLCAyMSwgMTAsIDQ0LCAtNzcsIC0xMjIsIDU5LCAtMTAyLCAtNTQsIDAsIC0xMjIsIDk5LCA2LCAtNzYsIDEwNCwgLTEyMSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgLTEyMiwgMjEsIDEwLCA0NCwgLTc2LCAtMTIyLCAxMTksIDUzLCAtMTA4LCAwLCAtMTI3IH0gKTsKKwkJdGVzdG1zZzJieXRlcyggbXNnLCBmYWxzZSwgbmV3IGJ5dGVbXSB7IDMsIC0xMjIsIDM5LCAtMjMsIC03MywgLTEwMCwgMywgLTEyMiwgMjEsIDEwLCA0NCwgLTc3LCAtMTIyLCA1OSwgLTEwMiwgLTU0LCAwLCAtMTIyLCA5OSwgNiwgLTc2LCAxMDQsIC0xMjEsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIC0xMjIsIDIxLCAxMCwgNDQsIC03NiwgLTEyMiwgMTE5LCA1MywgLTEwOCwgMCwgLTEyNyB9ICk7CisJCXRlc3Rtc2cyYnl0ZXMoIG1zZywgdHJ1ZSwgIG5ldyBieXRlW10geyAzLCAtMTA5LCAzLCA5NywgMTAwLCAxMDAsIDMsIC0xMDksIDEsIDEyMCwgLTEyMiwgNTksIC0xMDIsIC01NCwgMCwgLTEwOSwgMTAsIDk1LCAxMDksIDEwMSwgMTE1LCAxMTUsIDk3LCAxMDMsIDEwMSwgNzMsIDEwMCwgLTEyMSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgLTEwOSwgMSwgMTIxLCAtMTIyLCAxMTksIDUzLCAtMTA4LCAwLCAtMTI3IH0gKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rtc2cyYnl0ZXMoIE1lc3NhZ2UgbXNnLCBCb29sZWFuIHN0cmluZ1R5cGVBbmRGaWVsZCwKKwkJYnl0ZVtdIGV4cGVjdGVkICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYnl0ZVtdIGFjdHVhbCA9IG1zZzJieXRlcyggbXNnLCBzdHJpbmdUeXBlQW5kRmllbGQgKTsKKwkJdHJ5CisJCXsKKwkJCWFzc2VydEFycmF5RXF1YWxzKCBleHBlY3RlZCwgYWN0dWFsICk7CisJCX0KKwkJY2F0Y2ggKCBBc3NlcnRpb25FcnJvciBlICkKKwkJeworCQkJZHVtcCggZXhwZWN0ZWQgKTsKKwkJCWR1bXAoIGFjdHVhbCApOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKworCS8qKiBUZXN0cyByZWFkaW5nIGEgcHJlLWNhbm5lZCBhZGQgbWVzc2FnZS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RfYWRkX2luKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVHlwZSBhZGQgPSB2Zi5nZXRUeXBlKCAiYWRkIiApOworCQkKKwkJRmllbGQgeCA9IG5ldyBGaWVsZCggIngiICk7CisJCWFkZC5wdXRWYWxpZGF0b3IoIHgsIFZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJCisJCUZpZWxkIHkgPSBuZXcgRmllbGQoICJ5IiApOworCQlhZGQucHV0VmFsaWRhdG9yKCB5LCBWYWxpZGF0b3JfaW50LmdldCggMCApICk7CisJCQorCQlGaWVsZCBfbWZfX21lc3NhZ2VJZCA9IERlZmF1bHRWYWx1ZUZhY3RvcnkuX21mX19tZXNzYWdlSWQ7CisJCWFkZC5wdXRWYWxpZGF0b3IoIF9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCQkKKwkJbG9uZyBtc2dpZCA9IDB4MDEyMzQ1Njc4OWFiY2RlZkw7CisKKwkJYnl0ZVtdIGJ1ZiA9CisJCXsKKwkJCTMsIC8vIHZlcnNpb24KKwkJCS0xMjIsIC8vIElOVCAodHlwZSkKKwkJCTM5LCAtMjMsIC03MywgLTEwMCwgLy8gYWRkCisJCQkzLCAvLyBsZW5ndGgKKwkJCS0xMjIsIC8vIElOVCAoa2V5KQorCQkJOTksIDYsIC03NiwgMTA0LAorCQkJLTEyMSwgLy8gTE9ORyAodmFsdWUpCisJCQkxLCAzNSwgNjksIDEwMywgLTExOSwgLTg1LCAtNTEsIC0xNywKKwkJCS0xMjIsIC8vIElOVCAoa2V5KQorCQkJMjEsIDEwLCA0NCwgLTc2LCAvLyB5CisJCQkyLCAvLyB0aW55IGludCA9IDIgKHZhbHVlKQorCQkJLTEyMiwgLy8gSU5UIChrZXkpCisJCQkyMSwgMTAsIDQ0LCAtNzcsIC8vIHgKKwkJCTEsIC8vIHRpbnkgaW50ID0gMSAodmFsdWUpCisJCQktMTI3IC8vIE5PTkUKKwkJfTsKKwkJTWVzc2FnZSBtc2cgPSBieXRlczJtc2coIGJ1ZiApOworCQltc2cuY2hlY2tUeXBlKCBhZGQgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMywgbXNnLnNpemUoKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAxLCBtc2cuZ2V0KCB4ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgbXNnLmdldCggeSApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1zZ2lkLCBtc2cuZ2V0KCBfbWZfX21lc3NhZ2VJZCApICk7CisJCQorCQlidWYgPSBuZXcgYnl0ZVtdCisJCXsKKwkJCTMsIC8vIHZlcnNpb24KKwkJCS0xMjIsIC8vIElOVCAodHlwZSkKKwkJCTM5LCAtMjMsIC03MywgLTEwMCwgLy8gYWRkCisJCQkzLCAvLyBsZW5ndGgKKwkJCS0xMjIsIC8vIElOVCAoa2V5KQorCQkJOTksIDYsIC03NiwgMTA0LAorCQkJLTEyMSwgLy8gTE9ORyAodmFsdWUpCisJCQkxLCAzNSwgNjksIDEwMywgLTExOSwgLTg1LCAtNTEsIC0xNywKKwkJCS0xMjIsIC8vIElOVCAoa2V5KQorCQkJMjEsIDEwLCA0NCwgLTc2LCAvLyB5CisJCQktMTIyLCAvLyBJTlQgKHZhbHVlKQorCQkJMTE5LCA1MywgLTEwOCwgMCwKKwkJCS0xMjIsIC8vIElOVCAoa2V5KQorCQkJMjEsIDEwLCA0NCwgLTc3LCAvLyB4CisJCQktMTIyLCAvLyBJTlQgKHZhbHVlKQorCQkJNTksIC0xMDIsIC01NCwgMCwKKwkJCS0xMjcgLy8gTk9ORQorCQl9OworCQltc2cgPSBieXRlczJtc2coIGJ1ZiApOworCQltc2cuY2hlY2tUeXBlKCBhZGQgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMywgbXNnLnNpemUoKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAxMDAwMDAwMDAwLCBtc2cuZ2V0KCB4ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMjAwMDAwMDAwMCwgbXNnLmdldCggeSApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1zZ2lkLCBtc2cuZ2V0KCBfbWZfX21lc3NhZ2VJZCApICk7CisJfQorCisJLyoqIFRlc3RzIGFkZCBwZXJmb3JtYW5jZS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RfYWRkX3BlcmYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUeXBlIGFkZCA9IHZmLmdldFR5cGUoICJhZGQiICk7CisJCQorCQlGaWVsZCB4ID0gbmV3IEZpZWxkKCAieCIgKTsKKwkJYWRkLnB1dFZhbGlkYXRvciggeCwgVmFsaWRhdG9yX2ludC5nZXQoIDAgKSApOworCQkKKwkJRmllbGQgeSA9IG5ldyBGaWVsZCggInkiICk7CisJCWFkZC5wdXRWYWxpZGF0b3IoIHksIFZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJCisJCUZpZWxkIF9tZl9fbWVzc2FnZUlkID0gRGVmYXVsdFZhbHVlRmFjdG9yeS5fbWZfX21lc3NhZ2VJZDsKKwkJYWRkLnB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCQorCQlsb25nIG1zZ2lkID0gMHgwMTIzNDU2Nzg5YWJjZGVmTDsKKwkJCisvLwkJU3lzdGVtLm91dC5wcmludGYoICJhZGQuaWQoKSA9ICUwNHhcbiIsIGFkZC5nZXRJZCgpICk7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJ4LmlkKCkgPSAlMDR4XG4iLCB4LmdldElkKCkgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggInkuaWQoKSA9ICUwNHhcbiIsIHkuZ2V0SWQoKSApOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAiX21mX19tZXNzYWdlSWQuaWQoKSA9ICUwNHhcbiIsIF9tZl9fbWVzc2FnZUlkLmdldElkKCkgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggIm1zZ2lkID0gJTA4eFxuIiwgbXNnaWQgKTsKKwkJCisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIGFkZCwgdmYgKTsKKwkJbXNnLnB1dCggeCwgMTIzNDU2Nzg5ICk7CisJCW1zZy5wdXQoIHksIDg3NjU0MzIxMCApOworCQltc2cucHV0KCBfbWZfX21lc3NhZ2VJZCwgbXNnaWQgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJtc2cgPSAiK21zZyApOworCQkKKwkJUmVzb3VyY2VzIHJlcyA9IG5ldyBSZXNvdXJjZXMoKTsKKwkJcmVzLnB1dCggVHJhbnNwb3J0LlZBTFVFX0ZBQ1RPUlksIHZmICk7CisJCU15UGFja2V0U291cmNlIHBzID0gbmV3IE15UGFja2V0U291cmNlKCk7CisJCU1lc3NhZ2l6ZXIgbSA9IG5ldyBNZXNzYWdpemVyKCBwcywgImZvbzo/TWVzc2FnaXplci5mb3JtYXQ9YmluYXJ5IiwgcmVzICk7CisJCW0udHJhbnNwb3J0TWVzc2FnZSggbnVsbCwgbXNnICk7CisJCQorCQlpbnQgbiA9IDkwMDk3MzsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisJCQl0ZXN0UGVyZiggInRlc3RfYWRkX3BlcmYiLCBpLCBtLCBtc2csIG4gKTsKKwl9CisJCisJLyoqIFRlc3RzIHN1bSBwZXJmb3JtYW5jZS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3Rfc3VtX3BlcmYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUeXBlIHN1bSA9IHZmLmdldFR5cGUoICJzdW0iICk7CisJCQorCQlGaWVsZCB2YWx1ZXMgPSBuZXcgRmllbGQoICJ2YWx1ZXMiICk7CisJCXN1bS5wdXRWYWxpZGF0b3IoIHZhbHVlcywgVmFsaWRhdG9yX2ludC5nZXQoIDEgKSApOworCQkKKwkJRmllbGQgX21mX19tZXNzYWdlSWQgPSBEZWZhdWx0VmFsdWVGYWN0b3J5Ll9tZl9fbWVzc2FnZUlkOworCQlzdW0ucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKwkJCisJCWxvbmcgbXNnaWQgPSAweDAxMjM0NTY3ODlhYmNkZWZMOworCQkKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggImFkZC5pZCgpID0gJTA0eFxuIiwgYWRkLmdldElkKCkgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggInguaWQoKSA9ICUwNHhcbiIsIHguZ2V0SWQoKSApOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAieS5pZCgpID0gJTA0eFxuIiwgeS5nZXRJZCgpICk7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJfbWZfX21lc3NhZ2VJZC5pZCgpID0gJTA0eFxuIiwgX21mX19tZXNzYWdlSWQuZ2V0SWQoKSApOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAibXNnaWQgPSAlMDh4XG4iLCBtc2dpZCApOworCQkKKwkJaW50W10gYXJyYXkgPSBuZXcgaW50WzJdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQorCQkJYXJyYXlbaV0gPSAxMjM0NTY3ODk7CisJCQorCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBzdW0sIHZmICk7CisJCW1zZy5wdXQoIHZhbHVlcywgYXJyYXkgKTsKKwkJbXNnLnB1dCggX21mX19tZXNzYWdlSWQsIG1zZ2lkICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAibXNnID0gIittc2cgKTsKKwkJCisJCVJlc291cmNlcyByZXMgPSBuZXcgUmVzb3VyY2VzKCk7CisJCXJlcy5wdXQoIFRyYW5zcG9ydC5WQUxVRV9GQUNUT1JZLCB2ZiApOworCQlNeVBhY2tldFNvdXJjZSBwcyA9IG5ldyBNeVBhY2tldFNvdXJjZSgpOworCQlNZXNzYWdpemVyIG0gPSBuZXcgTWVzc2FnaXplciggcHMsICJmb286P01lc3NhZ2l6ZXIuZm9ybWF0PWJpbmFyeSIsIHJlcyApOworCQltLnRyYW5zcG9ydE1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkKKwkJaW50IG4gPSA1MDk1MjA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJdGVzdFBlcmYoICJ0ZXN0X3N1bV9wZXJmIiwgaSwgbSwgbXNnLCBuICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbHVlVG9CeXRlcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG51bGxzCisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIG51bGwsCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMCwgLTEyNyB9ICk7CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIG5ldyBPYmplY3RbXSB7IG51bGwgfSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTA2LCAxLCAxLCAtMTI4LCAtMTI3LCAtMTI3IH0gKTsKKwkJCisJCS8vIGJvb2xlYW5zOgorCQkKKwkJYXNzZXJ0VmFsdWVUb0J5dGVzKCBmYWxzZSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTI2LCAtMTI3IH0gKTsKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggdHJ1ZSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTI1LCAtMTI3IH0gKTsKKwkJCisJCS8vIHRpbnkgaW50czoKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggMCwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAwLCAtMTI3IH0gKTsKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggMSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAxLCAtMTI3IH0gKTsKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggLTEsCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEsIC0xMjcgfSApOworCQkKKwkJLy8gYnl0ZXM6CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIC0xMDAsCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEyNCwgLTEwMCwgLTEyNyB9ICk7CisJCQorCQkvLyBzaG9ydHM6CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIDEwMDAwLAorCQkJbmV3IGJ5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMjMsIDM5LCAxNiwgLTEyNyB9ICk7CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIC0xMDAwMCwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTIzLCAtNDAsIC0xNiwgLTEyNyB9ICk7CisJCQorCQkvLyBpbnRzOgorCQkKKwkJYXNzZXJ0VmFsdWVUb0J5dGVzKCAxMDAwMDAwMDAwLAorCQkJbmV3IGJ5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMjIsIDU5LCAtMTAyLCAtNTQsIDAsIC0xMjcgfSApOworCQkKKwkJYXNzZXJ0VmFsdWVUb0J5dGVzKCAtMTAwMDAwMDAwMCwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTIyLCAtNjAsIDEwMSwgNTQsIDAsIC0xMjcgfSApOworCQkKKwkJLy8gbG9uZ3M6CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIDEwMDAwMDAwMDAwMDAwMDAwMDBMLAorCQkJbmV3IGJ5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMjEsIDEzLCAtMzIsIC03NCwgLTc3LCAtODksIDEwMCwgMCwgMCwgLTEyNyB9ICk7CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIC0xMDAwMDAwMDAwMDAwMDAwMDAwTCwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTIxLCAtMTQsIDMxLCA3MywgNzYsIDg4LCAtMTAwLCAwLCAwLCAtMTI3IH0gKTsKKwkJCisJCS8vIGZsb2F0OgorCQkKKwkJYXNzZXJ0VmFsdWVUb0J5dGVzKCAxMjM0NWYsCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEyMCwgNzAsIDY0LCAtMjgsIDAsIC0xMjcgfSApOworCQkKKwkJLy8gZG91YmxlOgorCQkKKwkJYXNzZXJ0VmFsdWVUb0J5dGVzKCAyMzQ1NmQsCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExOSwgNjQsIC00MiwgLTI0LCAwLCAwLCAwLCAwLCAwLCAtMTI3IH0gKTsKKwkJCisJCS8vIGJvb2xlYW5bXToKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggbmV3IGJvb2xlYW5bXSB7IHRydWUsIGZhbHNlIH0sCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExMSwgLTEyNSwgMSwgMiwgLTEyNSwgLTEyNiwgLTEyNywgLTEyNyB9ICk7CisJCQorCQkvLyBieXRlW106CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIG5ldyBieXRlW10geyAxLCAyLCAzIH0sCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExNywgMywgMSwgMiwgMywgLTEyNyB9ICk7CisKKwkJLy8gYnl0ZVtdW106CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIG5ldyBieXRlW11bXSB7IG5ldyBieXRlW10geyAxLCAyLCAzIH0sIG5ldyBieXRlW10geyAyLCAzLCA0IH0gfSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTI0LCAyLCAyLCAtMTE3LCAzLCAxLCAyLCAzLCAtMTE3LCAzLCAyLCAzLCA0LCAtMTI3LCAtMTI3IH0gKTsKKworCQkvLyBzaG9ydFtdOgorCQkKKwkJYXNzZXJ0VmFsdWVUb0J5dGVzKCBuZXcgc2hvcnRbXSB7IDEsIDIsIDMgfSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTIzLCAxLCAzLCAxLCAyLCAzLCAtMTI3LCAtMTI3IH0gKTsKKworCQkvLyBpbnRbXToKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggbmV3IGludFtdIHsgMSwgMiwgMyB9LAorCQkJbmV3IGJ5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMTEsIC0xMjIsIDEsIDMsIDEsIDIsIDMsIC0xMjcsIC0xMjcgfSApOworCisJCS8vIGxvbmdbXToKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggbmV3IGxvbmdbXSB7IDEsIDIsIDMgfSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTIxLCAxLCAzLCAxLCAyLCAzLCAtMTI3LCAtMTI3IH0gKTsKKworCQkvLyBmbG9hdFtdOgorCQkKKwkJYXNzZXJ0VmFsdWVUb0J5dGVzKCBuZXcgZmxvYXRbXSB7IDEsIDIsIDMgfSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTIwLCAxLCAzLCAtMTIwLCA2MywgLTEyOCwgMCwgMCwgLTEyMCwgNjQsIDAsIDAsIDAsIC0xMjAsIDY0LCA2NCwgMCwgMCwgLTEyNywgLTEyNyB9ICk7CisKKwkJLy8gZG91YmxlW106CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIG5ldyBkb3VibGVbXSB7IDEsIDIsIDMgfSwKKwkJCW5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAtMTExLCAtMTE5LCAxLCAzLCAtMTE5LCA2MywgLTE2LCAwLCAwLCAwLCAwLCAwLCAwLCAtMTE5LCA2NCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTExOSwgNjQsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIC0xMjcsIC0xMjcgfSApOworCisJCS8vIGVtcHR5IHN0cmluZzoKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggIiIsCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTExMCwgLTEyNyB9ICk7CisJCQorCQkvLyBzdHJpbmc6CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoICJhYmMiLAorCQkJbmV3IGJ5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMDksIDMsIDk3LCA5OCwgOTksIC0xMjcgfSApOworCQkKKwkJLy8gc3RyaW5nW106CisJCQorCQlhc3NlcnRWYWx1ZVRvQnl0ZXMoIG5ldyBTdHJpbmdbXSB7ICJhIiwgIiIsICJjIiB9LAorCQkJbmV3IGJ5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMTEsIC0xMDksIDEsIDMsIC0xMDksIDEsIDk3LCAtMTEwLCAtMTA5LCAxLCA5OSwgLTEyNywgLTEyNyB9ICk7CisKKwkJLy8gRGF0ZToKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggbmV3IERhdGUoIDEyMzQ1Njc4OTBMICksCisJCQluZXcgYnl0ZVtdIHsgMywgMSwgMSwgMiwgLTEwNywgLTEyMiwgNDMsIDU3LCAxMDcsIC01MiwgMSwgLTEyMiwgMTAyLCAwLCAyNiwgNjQsIC0xMjIsIDczLCAtMTA2LCAyLCAtNDYsIC0xMjcsIC0xMjcgfSApOworCisJCS8vIERhdGVbXToKKwkJCisJCWFzc2VydFZhbHVlVG9CeXRlcyggbmV3IERhdGVbXSB7IG5ldyBEYXRlKCAxMjM0NTY3ODkwTCApLCBuZXcgRGF0ZSggMjM0NTY3ODkwMUwgKSB9LAorCQkJbmV3IGJ5dGVbXSB7IDMsIDEsIDEsIDIsIC0xMTEsIC0xMDcsIC0xMjIsIDQzLCA1NywgMTA3LCAtNTIsIDEsIDIsIC0xMDcsIC0xMjIsIDQzLCA1NywgMTA3LCAtNTIsIDEsIC0xMjIsIDEwMiwgMCwgMjYsIDY0LCAtMTIyLCA3MywgLTEwNiwgMiwgLTQ2LCAtMTI3LCAtMTA3LCAtMTIyLCA0MywgNTcsIDEwNywgLTUyLCAxLCAtMTIyLCAxMDIsIDAsIDI2LCA2NCwgLTEyMSwgMCwgMCwgMCwgMCwgLTExNywgLTQ4LCA1NiwgNTMsIC0xMjcsIC0xMjcsIC0xMjcgfSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGJhZHR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJTWVzc2FnZSBtc2cgPSBieXRlczJtc2coIG5ldyBieXRlW10geyAzLCAxLCAwLCAtMTI3IH0gKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJtc2cgPSAiK21zZyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGJhZG1zZ2xlbjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJTWVzc2FnZSBtc2cgPSBieXRlczJtc2coIG5ldyBieXRlW10geyAzLCAxLCAtMSwgLTEyNyB9ICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAibXNnID0gIittc2cgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBiYWRtc2dsZW4yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCU1lc3NhZ2UgbXNnID0gYnl0ZXMybXNnKCBuZXcgYnl0ZVtdIHsgMywgMSwgOTksIC0xMjcgfSApOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIm1zZyA9ICIrbXNnICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYmFkZmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJTWVzc2FnZSBtc2cgPSBieXRlczJtc2coIG5ldyBieXRlW10geyAzLCAxLCAxLCAyLCAyLCAtMTI3IH0sIExldmVsLk1JU1NJTkdfT0sgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJtc2cgPSAiK21zZyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgYXNzZXJ0VmFsdWVUb0J5dGVzKCBPYmplY3QgdmFsdWUsIGJ5dGVbXSBleHBlY3RlZEJ5dGVzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVHlwZSB0ID0gbmV3IFR5cGUoIDEsICJhIiApOworCQlGaWVsZCBmID0gbmV3IEZpZWxkKCAyLCAiYiIgKTsKKwkJdC5wdXRWYWxpZGF0b3IoIGYsIFZhbGlkYXRvcl9vYmplY3QuZ2V0KCAwICkgKTsKKwkJCisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIHQsIHZmICk7CisJCW1zZy5wdXQoIGYsIHZhbHVlICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAibXNnID0gIittc2cgKTsKKwkJCisJCUJpbmFyeVRhZ2dlZERhdGFPdXRwdXQgYnRkbyA9IG5ldyBCaW5hcnlUYWdnZWREYXRhT3V0cHV0KCB2ZiwgIm5vbmU6IiApOworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCQorCQlidGRvLndyaXRlTWVzc2FnZSggbXNnLCBidWYgKTsKKwkJCisJCWJ1Zi5zZXRJbmRleCggMCApOworCQlieXRlW10gYiA9IGJ1Zi5nZXRBdmFpbEJ5dGVzKCk7CisvLwkJZHVtcCggYiApOworCQlhc3NlcnRBcnJheUVxdWFscyggZXhwZWN0ZWRCeXRlcywgYiApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIHRlc3RQZXJmKCBTdHJpbmcgbmFtZSwgaW50IGl0ZXIsIE1lc3NhZ2l6ZXIgbSwKKwkJTWVzc2FnZSBtc2csIGludCBuICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbG9uZyB0MCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQltLnRyYW5zcG9ydE1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkKKwkJbG9uZyB0MSA9IFN5c3RlbS5uYW5vVGltZSgpOworCQlkb3VibGUgdCA9ICh0MS10MCkgLyAxMDAwMDAwMDAwLjA7CisJCWRvdWJsZSByID0gbiAvIHQ7CisJCUxvZy5yZXBvcnQoIG5hbWUsICJpdGVyYXRpb24iLCBpdGVyLCAidGltZSIsIHQsICJjb3VudCIsIG4sICJyYXRlIiwgciApOworCX0KKwkKKwkvKioKKwkgKiBUZXN0IGppZyBmb3IgcGVyZiB0ZXN0cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15UGFja2V0U291cmNlIGltcGxlbWVudHMgVHJhbnNwb3J0UGFja2V0CisJeworCQlwdWJsaWMgaW50IGhlYWRlclNpemUoKQorICAgICAgICB7CisJICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydFBhY2tldCggV2hvIHJlY2lwaWVudCwgRmxleEJ1ZmZlciBidWYgKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKwkgICAgICAgIC8vIGlnbm9yZS4KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCBidWYuYXZhaWwoKSApOworICAgICAgICB9CisKKwkJcHVibGljIFNlc3Npb25QYWNrZXQgZ2V0U2Vzc2lvbigpCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKCBTZXNzaW9uUGFja2V0IHNlc3Npb24gKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJLy8gaWdub3JlCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGJ5dGVbXSBtc2cyYnl0ZXMoIE1lc3NhZ2UgbXNnLCBCb29sZWFuIHN0cmluZ1R5cGVBbmRGaWVsZCApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQkKKwkJVVJMIHUgPSBuZXcgVVJMKCAibm9uZToiICk7CisJCWlmIChzdHJpbmdUeXBlQW5kRmllbGQgIT0gbnVsbCkKKwkJCXUuYWRkVGVybSggQmluYXJ5VGFnZ2VkRGF0YU91dHB1dC5TVFJJTkdfVFlQRV9BTkRfRklFTEQsIHN0cmluZ1R5cGVBbmRGaWVsZCApOworCQkKKwkJQmluYXJ5VGFnZ2VkRGF0YU91dHB1dCBidGRvID0gbmV3IEJpbmFyeVRhZ2dlZERhdGFPdXRwdXQoIHZmLCB1LnRvU3RyaW5nKCkgKTsKKwkJYnRkby53cml0ZU1lc3NhZ2UoIG1zZywgYnVmICk7CisJCWJ1Zi5zZXRJbmRleCggMCApOworCQlyZXR1cm4gYnVmLmdldEF2YWlsQnl0ZXMoKTsKKwl9CisJCisJcHJpdmF0ZSBNZXNzYWdlIGJ5dGVzMm1zZyggYnl0ZVtdIGJ1ZiApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBieXRlczJtc2coIGJ1ZiwgTGV2ZWwuRlVMTCApOworCX0KKwkKKwlwcml2YXRlIE1lc3NhZ2UgYnl0ZXMybXNnKCBieXRlW10gYnVmLCBMZXZlbCBsZXZlbCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxldmVsIG9sZExldmVsID0gdmYuc2V0TGV2ZWwoIGxldmVsICk7CisJCXRyeQorCQl7CisJCQlCaW5hcnlUYWdnZWREYXRhSW5wdXQgYnRkaSA9IG5ldyBCaW5hcnlUYWdnZWREYXRhSW5wdXQoIHZmLCAibm9uZToiICk7CisJCQlyZXR1cm4gYnRkaS5yZWFkTWVzc2FnZSggbmV3IEZsZXhCdWZmZXIoIGJ1ZiApICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl2Zi5zZXRMZXZlbCggb2xkTGV2ZWwgKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdHgoIE9iamVjdCB4LCBWYWxpZGF0b3IgdiApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCUNsYXNzPD8+IGMgPSB4LmdldENsYXNzKCk7CisJCWlmIChjLmlzQXJyYXkoKSkKKwkJeworCQkJaW50IG4gPSBBcnJheS5nZXRMZW5ndGgoIHggKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJeworCQkJCXRlc3R4KCBBcnJheS5nZXQoIHgsIGkgKSwgdi5lbGVtZW50VmFsaWRhdG9yKCkgKTsKKwkJCX0KKwkJfQorCQl0ZXN0KCB4LCB2LCBudWxsICk7CisJCXRlc3QoIHgsIHYsIGZhbHNlICk7CisJCXRlc3QoIHgsIHYsIHRydWUgKTsKKwl9CisJCisJLyoqCisJICogdmFsdWUgZmFjdG9yeSBmb3IgdGVzdHMuIGl0IGlzIG9rIHRoYXQgaXQgaXMgc2hhcmVkIGJldHdlZW4gdGVzdHMuCisJICovCisJCisJZmluYWwgRGVmYXVsdFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBNeVZhbHVlRmFjdG9yeSggInRjcDoiICk7CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlIG10X2ZvbyA9IHZmLmdldFR5cGUoICJmb28iICk7CisJCisJcHJpdmF0ZSBmaW5hbCBGaWVsZCBtZl94ID0gbmV3IEZpZWxkKCAieCIgKTsKKwkKKwlwcml2YXRlIHZvaWQgdGVzdCggT2JqZWN0IHgsIFZhbGlkYXRvciB2LCBCb29sZWFuIHN0cmluZ1R5cGVBbmRGaWVsZCApIHRocm93cyBFeGNlcHRpb24KKwl7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICk7CisJCQorCQltdF9mb28uY2xlYXJWYWxpZGF0b3IoIG1mX3ggKTsKKwkJbXRfZm9vLnB1dFZhbGlkYXRvciggbWZfeCwgdiApOworCQkKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggbXRfZm9vLCB2ZiApOworCQltc2cucHV0KCBtZl94LCB4ICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAibXNnID0gIittc2cgKTsKKwkJCisJCWJ5dGVbXSBidWZ4ID0gbXNnMmJ5dGVzKCBtc2csIHN0cmluZ1R5cGVBbmRGaWVsZCApOworLy8JCWR1bXAoIGJ1ZnggKTsKKwkJTWVzc2FnZSBtc2cyID0gYnl0ZXMybXNnKCBidWZ4ICk7CisJCQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIm1zZzIgPSAiK21zZzIgKTsKKwkJbXNnMi5jaGVja1R5cGUoIG10X2ZvbyApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAxLCBtc2cyLnNpemUoKSApOworCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggbXNnLmNvbnRhaW5zS2V5KCBtZl94ICkgKTsKKwkJT2JqZWN0IHkgPSBtc2cyLmdldCggbWZfeCApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCB4LCB5ICk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgdm9pZCBkdW1wKCBieXRlW10gYnVmICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnQoICJieXRlWy8qIitidWYubGVuZ3RoKyIqL10gYnVmID0geyIgKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmIChpID4gMCkKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCAiLCAiICk7CisJCQllbHNlCisJCQkJU3lzdGVtLm91dC5wcmludCggIiAiICk7CisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVkIiwgYnVmW2ldICk7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCAiIH0iICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFscyggT2JqZWN0IGEsIE9iamVjdCBiICkKKwl7CisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQorCQl7CisJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBhLCBiICk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUNsYXNzPD8+IGFDbGFzcyA9IGEuZ2V0Q2xhc3MoKTsKKwkJQ2xhc3M8Pz4gYkNsYXNzID0gYi5nZXRDbGFzcygpOworCQkKKwkJaWYgKGFDbGFzcyA9PSBiQ2xhc3MpCisJCXsKKwkJCWlmIChhQ2xhc3MuaXNBcnJheSgpICYmIGJDbGFzcy5pc0FycmF5KCkpCisJCQkJYXNzZXJ0QXJyYXlFcXVhbHMoIGEsIGIgKTsKKwkJCWVsc2UKKwkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBhLCBiICk7CisJCX0KKwkJLy9lbHNlIGlmIChhIGluc3RhbmNlb2YgTnVtYmVyICYmIGIgaW5zdGFuY2VvZiBOdW1iZXIpCisJCWVsc2UKKwkJeworLy8JCQlTeXN0ZW0ub3V0LnByaW50ZiggImEgJXMsIGIgJXNcbiIsIGFDbGFzcywgYkNsYXNzICk7CisJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBhLCBiICk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoIE9iamVjdCBhLCBPYmplY3QgYiApCisJeworCQlpbnQgYW4gPSBBcnJheS5nZXRMZW5ndGgoIGEgKTsKKwkJaW50IGJuID0gQXJyYXkuZ2V0TGVuZ3RoKCBiICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGFuLCBibiApOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbjsgaSsrKQorCQkJYXNzZXJ0RXF1YWxzKCBBcnJheS5nZXQoIGEsIGkgKSwgQXJyYXkuZ2V0KCBiLCBpICkgKTsKKwl9CisJCisJLyoqICovCisJc3RhdGljIGNsYXNzIE15VmFsdWVGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbHVlRmFjdG9yeQorCXsKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisJCQorCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCisJCXN0YXRpYworCQl7CisJCQlEZWZhdWx0VmFsdWVGYWN0b3J5LmluaXQoIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKworCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgTXlWYWx1ZUZhY3RvcnkuCisJCSAqIEBwYXJhbSB1cmkKKwkJICovCisJCXB1YmxpYyBNeVZhbHVlRmFjdG9yeSggU3RyaW5nIHVyaSApCisJCXsKKwkJCXN1cGVyKCB1cmksIHR5cGVzLCBjbGFzczJ0eXBlICk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9UZXN0RGF0ZVNlcmlhbGl6ZXIuamF2YSBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9UZXN0RGF0ZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTczNmQzCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1Rlc3REYXRlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuSW1wb3J0RXhwb3J0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkR1bW15VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiBUZXN0cyBEYXRlU2VyaWFsaXplciAqLworcHVibGljIGNsYXNzIFRlc3REYXRlU2VyaWFsaXplcgoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEltcG9ydCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCURhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7CisJCXRlc3REYXRlKCBkYXRlICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0RGF0ZSggRGF0ZSBkYXRlICkKKwl7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiApOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggImRhdGUgPSAiK2RhdGUgKTsKKwkJCisJCVZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQlUeXBlIHR5cGUgPSBuZXcgVHlwZSggImRhdGUiICk7CisJCUNsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSA9IG5ldyBDbGFzczJUeXBlTWFwKCk7CisJCURhdGVTZXJpYWxpemVyLmluaXQoIHR5cGUsIGNsYXNzMnR5cGUgKTsKKwkJSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlciA9IHR5cGUuZ2V0SW1wb3J0RXhwb3J0SGVscGVyKCk7CisJCQorCQlTdHJ1Y3RWYWx1ZSBzdiA9IGhlbHBlci5leHBvcnRWYWx1ZSggdmYsIGRhdGUgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJzdiA9ICIrc3YgKTsKKwkJCisJCWFzc2VydEVxdWFscyggc3YudHlwZSgpLCB0eXBlICk7CisJCQorCQlEYXRlIGRhdGUyID0gKERhdGUpIGhlbHBlci5pbXBvcnRWYWx1ZSggc3YgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJkYXRlMiA9ICIrZGF0ZTIgKTsKKwkJCisJCWFzc2VydEVxdWFscyggZGF0ZSwgZGF0ZTIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvVGVzdFN0ckludEhhc2hNYXBTZXJpYWxpemVyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvVGVzdFN0ckludEhhc2hNYXBTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhNWRjNwotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9UZXN0U3RySW50SGFzaE1hcFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuSW1wb3J0RXhwb3J0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkR1bW15VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiBUZXN0cyBTdHJJbnRIYXNoTWFwU2VyaWFsaXplciAqLworcHVibGljIGNsYXNzIFRlc3RTdHJJbnRIYXNoTWFwU2VyaWFsaXplcgoreworCXByaXZhdGUgZmluYWwgVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0MCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0ckludEhhc2hNYXAgbWFwID0gbmV3IFN0ckludEhhc2hNYXAoKTsKKwkJdGVzdE1hcCggbWFwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0ckludEhhc2hNYXAgbWFwID0gbmV3IFN0ckludEhhc2hNYXAoKTsKKwkJbWFwLnB1dCggImEiLCAxICk7CisJCXRlc3RNYXAoIG1hcCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJJbnRIYXNoTWFwIG1hcCA9IG5ldyBTdHJJbnRIYXNoTWFwKCk7CisJCW1hcC5wdXQoICJhIiwgMSApOworCQltYXAucHV0KCAiYiIsIDIgKTsKKwkJdGVzdE1hcCggbWFwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0ckludEhhc2hNYXAgbWFwID0gbmV3IFN0ckludEhhc2hNYXAoKTsKKwkJbWFwLnB1dCggImEiLCAxICk7CisJCW1hcC5wdXQoICJiIiwgMiApOworCQltYXAucHV0KCAiYyIsIDMgKTsKKwkJdGVzdE1hcCggbWFwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TnVsbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RySW50SGFzaE1hcCBtYXAgPSBuZXcgU3RySW50SGFzaE1hcCgpOworCQltYXAucHV0KCAiYSIsIDEgKTsKKwkJbWFwLnB1dCggImIiLCBudWxsICk7CisJCW1hcC5wdXQoICJjIiwgMyApOworCQl0ZXN0TWFwKCBtYXAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROdWxsS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RySW50SGFzaE1hcCBtYXAgPSBuZXcgU3RySW50SGFzaE1hcCgpOworCQltYXAucHV0KCAiYSIsIDEgKTsKKwkJbWFwLnB1dCggbnVsbCwgMiApOworCQltYXAucHV0KCAiYyIsIDMgKTsKKwkJdGVzdE1hcCggbWFwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TnVsbEtleVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RySW50SGFzaE1hcCBtYXAgPSBuZXcgU3RySW50SGFzaE1hcCgpOworCQltYXAucHV0KCAiYSIsIDEgKTsKKwkJbWFwLnB1dCggbnVsbCwgbnVsbCApOworCQltYXAucHV0KCAiYyIsIDMgKTsKKwkJdGVzdE1hcCggbWFwICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0TWFwKCBTdHJJbnRIYXNoTWFwIG1hcCApCisJeworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJtYXAgPSAiK21hcCApOworCQkKKwkJVHlwZSB0eXBlID0gbmV3IFR5cGUoICJtYXAiICk7CisJCUNsYXNzMlR5cGVNYXAgY2xhc3MydHlwZSA9IG5ldyBDbGFzczJUeXBlTWFwKCk7CisJCVN0ckludEhhc2hNYXBTZXJpYWxpemVyLmluaXQoIHR5cGUsIGNsYXNzMnR5cGUgKTsKKwkJSW1wb3J0RXhwb3J0SGVscGVyIGhlbHBlciA9IHR5cGUuZ2V0SW1wb3J0RXhwb3J0SGVscGVyKCk7CisJCQorCQlTdHJ1Y3RWYWx1ZSBzdiA9IGhlbHBlci5leHBvcnRWYWx1ZSggdmYsIG1hcCApOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggInN2ID0gIitzdiApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBzdi50eXBlKCksIHR5cGUgKTsKKwkJCisJCVN0ckludEhhc2hNYXAgbWFwMiA9IChTdHJJbnRIYXNoTWFwKSBoZWxwZXIuaW1wb3J0VmFsdWUoIHN2ICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAibWFwMiA9ICIrbWFwMiApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBtYXAsIG1hcDIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvVGVzdFN0clN0ckhhc2hNYXBTZXJpYWxpemVyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvVGVzdFN0clN0ckhhc2hNYXBTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwNmY1OQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmctamF2YS9ydW50aW1lL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL2phdmEvdXRpbC9UZXN0U3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuSW1wb3J0RXhwb3J0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkR1bW15VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiBUZXN0cyBTdHJTdHJIYXNoTWFwU2VyaWFsaXplciAqLworcHVibGljIGNsYXNzIFRlc3RTdHJTdHJIYXNoTWFwU2VyaWFsaXplcgoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisJCXRlc3RNYXAoIG1hcCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisJCW1hcC5wdXQoICJhIiwgIjEiICk7CisJCXRlc3RNYXAoIG1hcCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisJCW1hcC5wdXQoICJhIiwgIjEiICk7CisJCW1hcC5wdXQoICJiIiwgIjIiICk7CisJCXRlc3RNYXAoIG1hcCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisJCW1hcC5wdXQoICJhIiwgIjEiICk7CisJCW1hcC5wdXQoICJiIiwgIjIiICk7CisJCW1hcC5wdXQoICJjIiwgIjMiICk7CisJCXRlc3RNYXAoIG1hcCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE51bGxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0clN0ckhhc2hNYXAgbWFwID0gbmV3IFN0clN0ckhhc2hNYXAoKTsKKwkJbWFwLnB1dCggImEiLCAiMSIgKTsKKwkJbWFwLnB1dCggImIiLCBudWxsICk7CisJCW1hcC5wdXQoICJjIiwgIjMiICk7CisJCXRlc3RNYXAoIG1hcCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE51bGxLZXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisJCW1hcC5wdXQoICJhIiwgIjEiICk7CisJCW1hcC5wdXQoIG51bGwsICIyIiApOworCQltYXAucHV0KCAiYyIsICIzIiApOworCQl0ZXN0TWFwKCBtYXAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROdWxsS2V5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJTdHJIYXNoTWFwIG1hcCA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisJCW1hcC5wdXQoICJhIiwgIjEiICk7CisJCW1hcC5wdXQoIG51bGwsIG51bGwgKTsKKwkJbWFwLnB1dCggImMiLCAiMyIgKTsKKwkJdGVzdE1hcCggbWFwICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0TWFwKCBTdHJTdHJIYXNoTWFwIG1hcCApCisJeworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJtYXAgPSAiK21hcCApOworCQkKKwkJVmFsdWVGYWN0b3J5IHZmID0gbmV3IER1bW15VmFsdWVGYWN0b3J5KCk7CisJCVR5cGUgdHlwZSA9IG5ldyBUeXBlKCAibWFwIiApOworCQlDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCQlTdHJTdHJIYXNoTWFwU2VyaWFsaXplci5pbml0KCB0eXBlLCBjbGFzczJ0eXBlICk7CisJCUltcG9ydEV4cG9ydEhlbHBlciBoZWxwZXIgPSB0eXBlLmdldEltcG9ydEV4cG9ydEhlbHBlcigpOworCQkKKwkJU3RydWN0VmFsdWUgc3YgPSBoZWxwZXIuZXhwb3J0VmFsdWUoIHZmLCBtYXAgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJzdiA9ICIrc3YgKTsKKwkJCisJCWFzc2VydEVxdWFscyggc3YudHlwZSgpLCB0eXBlICk7CisJCQorCQlTdHJTdHJIYXNoTWFwIG1hcDIgPSAoU3RyU3RySGFzaE1hcCkgaGVscGVyLmltcG9ydFZhbHVlKCBzdiApOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIm1hcDIgPSAiK21hcDIgKTsKKwkJCisJCWFzc2VydEVxdWFscyggbWFwLCBtYXAyICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1Rlc3RVUkxTZXJpYWxpemVyLmphdmEgYi9iaW5kaW5nLWphdmEvcnVudGltZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL3V0aWwvVGVzdFVSTFNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTNiN2VjCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy1qYXZhL3J1bnRpbWUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MvamF2YS91dGlsL1Rlc3RVUkxTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuSW1wb3J0RXhwb3J0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5TdHJ1Y3RWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuVmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuQ2xhc3MyVHlwZU1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkR1bW15VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKiogVGVzdHMgVVJMU2VyaWFsaXplciAqLworcHVibGljIGNsYXNzIFRlc3RVUkxTZXJpYWxpemVyCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoICJzY2hlbWU6Ly91c2VyOnB3QGhvc3Q6MjMvcmVzb3VyY2U7cz0xO3Q9Mj9wPTMmcT00I2ZyYWciICk7CisJCXRlc3QoIHVybCApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdCggVVJMIHVybCApCisJeworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ1cmwgPSAiK3VybCApOworCisJCVZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCQlUeXBlIHR5cGUgPSBuZXcgVHlwZSggInVybCIgKTsKKwkJQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlID0gbmV3IENsYXNzMlR5cGVNYXAoKTsKKwkJVVJMU2VyaWFsaXplci5pbml0KCB0eXBlLCBjbGFzczJ0eXBlICk7CisJCUltcG9ydEV4cG9ydEhlbHBlciBoZWxwZXIgPSB0eXBlLmdldEltcG9ydEV4cG9ydEhlbHBlcigpOworCQkKKwkJU3RydWN0VmFsdWUgc3YgPSBoZWxwZXIuZXhwb3J0VmFsdWUoIHZmLCB1cmwgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJzdiA9ICIrc3YgKTsKKwkJCisJCWFzc2VydEVxdWFscyggc3YudHlwZSgpLCB0eXBlICk7CisJCQorCQlVUkwgdXJsMiA9IChVUkwpIGhlbHBlci5pbXBvcnRWYWx1ZSggc3YgKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ1cmwyID0gIit1cmwyICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIHVybCwgdXJsMiApOworCX0KK30KZGlmZiAtLWdpdCBhL2JpbmRpbmcteG1sL2J1aWxkLnhtbCBiL2JpbmRpbmcteG1sL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkyYWQxCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy14bWwvYnVpbGQueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLXhtbC1iaW5kaW5nIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIj4KKyAgICA8ZGVzY3JpcHRpb24+RXRjaC10by1YTUwgQmluZGluZzwvZGVzY3JpcHRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYmFzZWRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4iIC8+CisgICAgPGltcG9ydCBmaWxlPSIke0V0Y2guYmFzZWRpcn0vYnVpbGQtc3VwcG9ydC9ldGNoLmNvbW1vbi54bWwiIC8+CisKKyAgICA8IS0tIHN0YW5kYXJkLCBzdXBwb3J0ZWQgdGFyZ2V0cyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9IkRlYnVnIiAgICAgICAgIGRlcGVuZHM9ImRlYnVnIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iUmVsZWFzZSIgICAgICAgZGVwZW5kcz0icmVsZWFzZSIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9IkNsZWFuIiAgICAgICAgIGRlcGVuZHM9ImNsZWFuIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iZGVidWciICAgICAgICAgZGVwZW5kcz0iaW5pdC1kZWJ1Zyxjb21wb25lbnQtYWxsLHBvc3QtZGVidWciICAgLz4KKyAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiICAgICAgIGRlcGVuZHM9ImluaXQtcmVsZWFzZSxjb21wb25lbnQtYWxsLHBvc3QtcmVsZWFzZSIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiAgICAgICAgIGRlcGVuZHM9ImluaXQtY2xlYW4sY29tcG9uZW50LWFsbCxwb3N0LWNsZWFuIiAvPgorICAgIDx0YXJnZXQgbmFtZT0ibWF2ZW4taW5zdGFsbCIgZGVwZW5kcz0iaW5pdC1tYXZlbixyZWxlYXNlIiAvPgorCisgICAgPHRhcmdldCBuYW1lPSJpbml0LW1hdmVuIiA+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJETy5tYXZlbi5pbnN0YWxsIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtZGVwZW5kZW5jaWVzIiA+CisgICAgICAgIDxta2RpciBkaXI9IiR7RXRjaC5sb2dEaXJlY3Rvcnl9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJpbml0LWRlYnVnIiBkZXBlbmRzPSJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiID4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYnVpbGQudGFyZ2V0IiB2YWx1ZT0iRGVidWciIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLmRlYnVnIiB2YWx1ZT0ib24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLm9wdGltaXplIiB2YWx1ZT0ib2ZmIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJwb3N0LWRlYnVnIiA+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtcmVsZWFzZSIgZGVwZW5kcz0idmFsaWRhdGUtZGVwZW5kZW5jaWVzIj4KKyAgICAgICAgPCEtLSBGb3Igbm93LCBrZWVwIGRlYnVnLXN5bWJvbHMgYW5kIG5vLW9wdGltaXplLCBldmVuIGZvciByZWxlYXNlIGJ1aWxkcyAtLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYnVpbGQudGFyZ2V0IiB2YWx1ZT0iUmVsZWFzZSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMuZGVidWciICB2YWx1ZT0ib24iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLm9wdGltaXplIiB2YWx1ZT0ib2ZmIiAvPgorICAgICAgICA8IS0tCisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLmRlYnVnIiAgdmFsdWU9Im9mZiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMub3B0aW1pemUiIHZhbHVlPSJvbiIgLz4KKyAgICAgICAgLS0+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJwb3N0LXJlbGVhc2UiID4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1jbGVhbiIgZGVwZW5kcz0idmFsaWRhdGUtZGVwZW5kZW5jaWVzIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYnVpbGQudGFyZ2V0IiB2YWx1ZT0iQ2xlYW4iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InBvc3QtY2xlYW4iID4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iRXhlY3V0aW5nIGNsZWFuIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjb21wb25lbnQtYWxsIiA+CisgICAgICAgIDxidWlsZF9jb21wb25lbnQgZGlyPSJjb21waWxlciIgLz4KKyAgICAgICAgPCEtLSA8YnVpbGRfY29tcG9uZW50IGRpcj0iY29tcGlsZXIiIC8+IC0tPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9iaW5kaW5nLXhtbC9jb21waWxlci9idWlsZC54bWwgYi9iaW5kaW5nLXhtbC9jb21waWxlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkNTlhYgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmcteG1sL2NvbXBpbGVyL2J1aWxkLnhtbApAQCAtMCwwICsxLDIyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gteG1sLWNvbXBpbGVyIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIj4KKyAgICA8ZGVzY3JpcHRpb24+RXRjaC10by1YTUwgY29tcGlsZXIgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJhc2VkaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uIiAvPgorICAgIDxpbXBvcnQgZmlsZT0iJHtFdGNoLmJhc2VkaXJ9L2J1aWxkLXN1cHBvcnQvZXRjaC5pbmNsdWRlcy54bWwiIC8+CisKKyAgICA8IS0tIFN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBzdWItcHJvamVjdCAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvaiIgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke0V0Y2guYmFzZWRpcn0vYmluZGluZy14bWwvY29tcGlsZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtwcm9qfS90YXJnZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtwcm9qfS9zcmMiIC8+ICAgICAgICAKKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkU3JjIiAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vZ2VuZXJhdGVkLXNvdXJjZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNEaXJlY3RvcnkiICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlc291cmNlc0RpcmVjdG9yeSIgICBsb2NhdGlvbj0iJHt0YXJnZXR9L3Jlc291cmNlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdFJlc3VsdHNEaXJlY3RvcnkiIGxvY2F0aW9uPSIke3RhcmdldH0vdGVzdC1yZXN1bHRzIiAvPgorCisgICAgPCEtLSBNQUNSTzogaW5pdC10YXJnZXQgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImluaXQtdGFyZ2V0IiA+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iICAgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDxkZWxldGUgZGlyPSIke3Jlc291cmNlc0RpcmVjdG9yeX0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtyZXNvdXJjZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDwhLS0gTUFDUk86IGNvbXBpbGUtc291cmNlcyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iY29tcGlsZS1zb3VyY2VzIiA+CisgICAgICAgIDxzZXF1ZW50aWFsPiAgICAgICAgICAgIAorICAgICAgICAgICAgPCEtLSBjb21waWxlIGNvbXBpbGVyIHBsdWdpbiAtLT4KKyAgICAgICAgICAgIDxqYXZhYyAgZGVidWc9IiR7RXRjaC5qYXZhYy5kZWJ1Z30iCisgICAgICAgICAgICAgICAgICAgIHRhcmdldD0iMS41IgorICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtFdGNoLmphdmFjLm9wdGltaXplfSIKKyAgICAgICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiA+CisgICAgICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30vbWFpbi9qYXZhIiAvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iRXRjaC5kZXBlbmRlbmNpZXMuamFyLnBhdGhzIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLkhPTUV9L2xpYi8ke2V0Y2gtY29tcGlsZXIuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwvamF2YWM+CisKKyAgICAgICAgICAgIDwhLS0gY29tcGlsZXIgcGx1Z2luIHJlc291cmNlcyAtLT4KKyAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL3Jlc291cmNlcyI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoua3dkIiAvPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnZtIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvY29weT4KKworICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgPGphdmFjICBkZWJ1Zz0iJHtFdGNoLmphdmFjLmRlYnVnfSIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjUiCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPSIke0V0Y2guamF2YWMub3B0aW1pemV9IgorICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiID4KKyAgICAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfS90ZXN0L2phdmEiIC8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJFdGNoLmRlcGVuZGVuY2llcy5qYXIucGF0aHMiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLkhPTUV9L2xpYi8ke2V0Y2gtY29tcGlsZXIuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwvamF2YWM+CisgICAgICAgICAgICAtLT4KKworICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICAKKyAgICA8IS0tIE1BQ1JPOiBidW5kbGUtamFycyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iYnVuZGxlLWphcnMiID4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXN0IiBkZWZhdWx0PSIke0V0Y2guZGlzdH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtkaXN0fS9saWIiIC8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gQ1JFQVRFIGphcnMgLS0+CisKKyAgICAgICAgICAgIDwhLS0gUGFja2FnZSB1cCBldGNoLXhtbC1jb21waWxlciBqYXIgLS0+CisgICAgICAgICAgICA8amFyIGphcmZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC14bWwtY29tcGlsZXIuamFyfSIgPgorICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDb3B5cmlnaHQiICAgIHZhbHVlPSIke0V0Y2guY29weXJpZ2h0Tm90aWNlfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJWZXJzaW9uIiAgICAgIHZhbHVlPSIke0V0Y2gudmVyc2lvbn0iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTG9uZ1ZlcnNpb24iICB2YWx1ZT0iJHtFdGNoLmxvbmd2ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsZC1UYWciICAgIHZhbHVlPSIke0V0Y2guYnVpbGRUYWd9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNWTi1SZXZpc2lvbiIgdmFsdWU9IiR7RXRjaC5ydW50aW1lLnJldmlzaW9uTnVtYmVyfSIgLz4KKyAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxtZXRhaW5mIGRpcj0iJHtFdGNoLmJhc2VkaXJ9IiA+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgorICAgICAgICAgICAgICAgIDwvbWV0YWluZj4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy8qKiIgLz4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5jbHVkZSBuYW1lPSJyZXNvdXJjZXMvKioiIC8+IC0tPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvamFyPgorCisgICAgICAgICAgICA8IS0tIENSRUFURSBzb3VyY2UgYXJjaGl2ZXMgLS0+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gcGFja2FnZSB1cCBldGNoLXhtbC1jb21waWxlciBzcmMgLS0+CisgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gteG1sLWNvbXBpbGVyLXNyYy56aXB9IiA+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9qYXZhIiA+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy8qKi8qLmphdmEiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vcmVzb3VyY2VzIiA+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC96aXA+CisKKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgCisgICAgPCEtLSBJTklUIFRBUkdFVCAtLT4KKyAgICA8IS0tIE1vZGlmeSB0aGlzIHRhcmdldCB0byBkZWZpbmUgcHJvamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzIHRoYXQgY2FuIG9ubHkgYmUgc2V0IGF0IHJ1bnRpbWUgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1pbml0Ij4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKworICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuZXJhdGVkU3JjfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtyZXNvdXJjZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3RSZXN1bHRzRGlyZWN0b3J5fSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gQ0xFQU4gVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8tY2xlYW4iPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBCVUlMRCBUQVJHRVQgLS0+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1zb3VyY2VzIiA+CisgICAgICAgIDwhLS0gR2VuZXJhdGUgdmVyc2lvbiBpbmZvIC0tPgorICAgICAgICA8dXBkYXRlLXRva2VucyBmaWxlbmFtZT0iJHtzcmN9L21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhIiAvPiAgCisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtZm9yLWRpc3QiID4KKyAgICAgICAgPCEtLSBJbml0aWFsaXplIHRhcmdldCBkaXJlY3RvcmllcyAtLT4KKyAgICAgICAgPGluaXQtdGFyZ2V0IC8+CisKKyAgICAgICAgPCEtLSBDb21waWxlIFNvdXJjZSAtLT4KKyAgICAgICAgPGNvbXBpbGUtc291cmNlcyAvPgorCisgICAgICAgIDwhLS0gQnVuZGxlIEphcnMgLS0+CisgICAgICAgIDxidW5kbGUtamFycyBkaXN0PSIke0V0Y2guZGlzdH0iIC8+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLWZvci1jbG92ZXIiIGlmPSJDbG92ZXIuZW5hYmxlZCIgPgorCisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlJlYnVpbGRpbmcgd2l0aCBjbG92ZXIiIC8+CisKKyAgICAgICAgPCEtLSBpbml0aWFsaXplLWNsb3ZlciAtLT4KKyAgICAgICAgPGluaXRpYWxpemUtY2xvdmVyIHN1ZmZpeD0iZXRjaHhtbGNvbXBpbGVyIiA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2phdmEiPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgIDx0ZXN0c291cmNlcyBkaXI9IiR7c3JjfS90ZXN0L2phdmEiPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KKyAgICAgICAgICAgIDwvdGVzdHNvdXJjZXM+CisgICAgICAgICAgICAtLT4KKyAgICAgICAgPC9pbml0aWFsaXplLWNsb3Zlcj4KKyAgICAgICAgCisgICAgICAgIDwhLS0gSW5pdGlhbGl6ZSB0YXJnZXQgZGlyZWN0b3JpZXMgLS0+CisgICAgICAgIDxpbml0LXRhcmdldCAvPgorICAgICAgICAKKyAgICAgICAgPCEtLSBDb21waWxlIFNvdXJjZSAtLT4KKyAgICAgICAgPGNvbXBpbGUtc291cmNlcyAvPgorICAgICAgICAKKyAgICAgICAgPCEtLSBCdW5kbGUgSmFycyAtLT4KKyAgICAgICAgPGJ1bmRsZS1qYXJzIGRpc3Q9IiR7RXRjaC5jbG92ZXItZGlzdH0iIC8+CisKKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLWJ1aWxkIiBkZXBlbmRzPSJnZW5lcmF0ZS1zb3VyY2VzLGNvbXBpbGUtZm9yLWRpc3QsY29tcGlsZS1mb3ItY2xvdmVyIiAvPgorCisgICAgPCEtLSBURVNUIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXRlc3QiPgorICAgICAgICAKKyAgICAgICAgPCEtLSBSdW4gVW5pdCBUZXN0cyAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIiBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iCisgICAgICAgICAgICBlcnJvclByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIiBmYWlsdXJlUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vdGVzdCIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5Lmp1bml0Lmphcn0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guSE9NRX0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuY2xvdmVyLmphcn0iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0idHJ1ZSIgdG9kaXI9IiR7dGVzdFJlc3VsdHNEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS90ZXN0L2phdmEiPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICAgIDwvanVuaXQ+CisgICAgICAgIC0tPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBQT1NUQlVJTEQgVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8tcG9zdGJ1aWxkIj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tcHVibGlzaCIgaWY9ImJ1aWxkLnRlc3RzLmZhaWwiPgorICAgICAgICA8IS0tIFNldCBmbGFnIGZpbGUgaWYgYW55IHRlc3RzIGZhaWxlZCAtLT4KKyAgICAgICAgPHRvdWNoIGZpbGU9IiR7RXRjaC5ydW50aW1lLnRlc3RzLmZhaWx9Ii8+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2JpbmRpbmcteG1sL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL3htbC9jb21waWxlci9Db21waWxlci5qYXZhIGIvYmluZGluZy14bWwvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhMGExMgotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmcteG1sL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL3htbC9jb21waWxlci9Db21waWxlci5qYXZhCkBAIC0wLDAgKzEsNjM1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkJhY2tlbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkNtZExpbmVPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoR3JhbW1hckNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuTG9nSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuT3V0cHV0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5FeGNlcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5FeHRlcm47CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5JdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1lc3NhZ2VEaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5Nb2R1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5Nc2dEaXJIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5UaHJvd247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5UeXBlUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuVG9TdHJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdC5Ub1N0cmluZy5GaWVsZEl0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdC5Ub1N0cmluZy5GbXRJdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuVG9TdHJpbmcuU3RyaW5nSXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5IYXNoOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5leGNlcHRpb24uUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZVNlcnZpY2VzOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5sb2cuTG9nQ2h1dGU7CisKKworLyoqCisgKiBDb21waWxlciBpcyBhIGhlbHBlciBjbGFzcyBub3Qgb25seSBmb3IgQmFja2VuZCwgYnV0IGFsc28KKyAqIGZvciB0aGUgdGVtcGxhdGVzLiBUaGV5IGNhbGwgbWV0aG9kcyBoZXJlIHRvIHBlcmZvcm0KKyAqICJoYXJkIiB0YXNrcy4KKyAqLworcHVibGljIGNsYXNzIENvbXBpbGVyIGV4dGVuZHMgQmFja2VuZAoreworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyB0bXBsUGF0aDEgPSAib3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL3htbC9jb21waWxlci8iOworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyB0bXBsUGF0aDIgPSAicmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy94bWwvY29tcGlsZXIvIjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBmblN1ZmZpeCA9ICIueG1sIjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWRVJTSU9OID0gVmVyc2lvbi5WRVJTSU9OICsgIiAvICIgKyBDb21waWxlclZlcnNpb24uVkVSU0lPTjsKKwkKKwlwcml2YXRlIExvZ0hhbmRsZXIgbGg7CisJCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdXNlIG9mIHZlbG9jaXR5IGVuZ2luZSBhbmQgc2V0cyB1cAorCSAqIHJlc291cmNlIGxvYWRlcnMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdFZlbG9jaXR5KCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVmVsb2NpdHkuc2V0UHJvcGVydHkoIFZlbG9jaXR5LlJVTlRJTUVfTE9HX0xPR1NZU1RFTSwgbmV3IE15TG9nZ2VyKCkgKTsKKwkJCisJCVZlbG9jaXR5LnNldFByb3BlcnR5KCBWZWxvY2l0eS5SRVNPVVJDRV9MT0FERVIsICJmaWxlLCBjbGFzcyIgKTsKKworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLmRlc2NyaXB0aW9uIiwgIlZlbG9jaXR5IEZpbGUgUmVzb3VyY2UgTG9hZGVyIiApOworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLmNsYXNzIiwgIm9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5yZXNvdXJjZS5sb2FkZXIuRmlsZVJlc291cmNlTG9hZGVyIiApOworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLnBhdGgiLCAiLiIgKTsKKworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5kZXNjcmlwdGlvbiIsICJWZWxvY2l0eSBDbGFzc3BhdGggUmVzb3VyY2UgTG9hZGVyIiApOworCQlWZWxvY2l0eS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5jbGFzcyIsICJvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UubG9hZGVyLkNsYXNzcGF0aFJlc291cmNlTG9hZGVyIiApOworCQkKKwkJVmVsb2NpdHkuaW5pdCgpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUxvZ2dlciBpbXBsZW1lbnRzIExvZ0NodXRlCisJeworCQlwcml2YXRlIGZpbmFsIExvZ0hhbmRsZXIgbGggPSBudWxsOworCQkKKwkJcHVibGljIHZvaWQgaW5pdCggUnVudGltZVNlcnZpY2VzIHJ0cyApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJLy8gaWdub3JlLgorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNMZXZlbEVuYWJsZWQoIGludCBsZXZlbCApCisJCXsKKwkJCXJldHVybiBsZXZlbCA+PSAyOworCQl9CisKKwkJcHVibGljIHZvaWQgbG9nKCBpbnQgbGV2ZWwsIFN0cmluZyBtc2cgKQorCQl7CisJCQlpZiAobGV2ZWwgPCAyKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKGxoICE9IG51bGwpCisJCQkJbGgucmVwb3J0KCBsZXZlbCA9PSAyID8gTG9nSGFuZGxlci5MRVZFTF9XQVJOSU5HIDogTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwgbnVsbCwgbXNnICk7CisJCQllbHNlCisJCQkJU3lzdGVtLm91dC5wcmludGYoICJWZWxvY2l0eSBtc2cgKCVkKTogJXNcbiIsIGxldmVsLCBtc2cgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGxvZyggaW50IGxldmVsLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZSApCisJCXsKKwkJCWlmIChsZXZlbCA8IDIpCisJCQkJcmV0dXJuOworCQkJCisJCQlpZiAobGggIT0gbnVsbCkKKwkJCQlsaC5yZXBvcnQoIGxldmVsID09IDIgPyBMb2dIYW5kbGVyLkxFVkVMX1dBUk5JTkcgOiBMb2dIYW5kbGVyLkxFVkVMX0VSUk9SLCBudWxsLCBtc2cgKTsKKwkJCWVsc2UKKwkJCQlTeXN0ZW0ub3V0LnByaW50ZiggIlZlbG9jaXR5IG1zZyAoJWQpOiAlczogJXNcbiIsIGxldmVsLCBtc2csIGUgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXRoCisJICogQHBhcmFtIGZuCisJICogQHJldHVybiB0aGUgdmVsb2NpdHkgdGVtcGxhdGUKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgVGVtcGxhdGUgZ2V0VGVtcGxhdGUoIFN0cmluZ1tdIHBhdGgsIFN0cmluZyBmbiApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCVJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gcm5mZSA9IG51bGw7CisJCQorCQlmb3IgKFN0cmluZyBwOiBwYXRoKQorCQl7CisJCQlpZiAocCA9PSBudWxsKQorCQkJCWNvbnRpbnVlOworCQkJCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInRyeWluZyB0byBsb2FkIHRlbXBsYXRlICIrKHArZm4pICk7CisJCQl0cnkKKwkJCXsKKwkJCQlpZiAoVmVsb2NpdHkucmVzb3VyY2VFeGlzdHMoIHArZm4gKSkKKwkJCQkJcmV0dXJuIFZlbG9jaXR5LmdldFRlbXBsYXRlKCBwK2ZuICk7CisJCQl9CisJCQljYXRjaCAoIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSApCisJCQl7CisJCQkJcm5mZSA9IGU7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJpZ25vcmluZyAiK2UpOworCQkJfQorCQl9CisJCQorCQlpZiAocm5mZSAhPSBudWxsKQorCQkJdGhyb3cgcm5mZTsKKwkJCisJCXRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCJjb3VsZCBub3QgZmluZCByZXNvdXJjZTogIitmbik7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQ29tcGlsZXIuIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3Mgbm90IG9ubHkKKwkgKiBmb3IgQmFja2VuZCwgYnV0IGFsc28gZm9yIHRoZSB0ZW1wbGF0ZXMuIFRoZXkgY2FsbCBtZXRob2RzCisJICogaGVyZSB0byBwZXJmb3JtICJoYXJkIiB0YXNrcy4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIENvbXBpbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW5pdFZlbG9jaXR5KCk7CisJCQorCQlTdHJpbmdbXSBwYXRoID0geyB0bXBsUGF0aDEsIHRtcGxQYXRoMiB9OworCQl2Zl92bSA9IGdldFRlbXBsYXRlKCBwYXRoLCAidmYudm0iICk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSB2Zl92bTsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGdlbmVyYXRlKCBNb2R1bGUgbW9kdWxlLCBDbWRMaW5lT3B0aW9ucyBvcHRpb25zICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8geG1sIGFsd2F5cyB3YW50cyB0byBub3QgZmxhdHRlbiBwYWNrYWdlczoKKwkJb3B0aW9ucy5ub0ZsYXR0ZW5QYWNrYWdlcyA9IHRydWU7CisJCQorCQlsaCA9IG9wdGlvbnMubGg7CisJCQorCQlPdXRwdXQgZGlyID0gb3B0aW9ucy5vdXRwdXQ7CisJCQorCQlTdHJpbmcgbSA9IG1vZHVsZS5uYW1lKCkubmFtZTsKKwkJaWYgKG0ubGVuZ3RoKCkgPiAwKQorCQl7CisJCQlkaXIgPSBkaXIubmV3UGFja2FnZSggbSApOworCQl9CisKKwkJLy8gZ2VuZXJhdGUgY29kZSBmb3IgZWFjaCBzZXJ2aWNlLgorCisJCWZvciAoU2VydmljZSBpbnRmIDogbW9kdWxlKQorCQl7CisJCQlnZW5lcmF0ZSggaW50ZiwgZGlyICk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGUoIGZpbmFsIFNlcnZpY2UgaW50ZiwgT3V0cHV0IGRpciApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIEdlbmVyYXRlIHRoZSB2YWx1ZSBmYWN0b3J5IGZpbGUKKworCQlkb0ZpbGUoIGRpciwgZ2V0VmZOYW1lKCBpbnRmICkgKyBmblN1ZmZpeCwgbGgsIG5ldyBHZW4oKQorCQl7CisJCQlwdWJsaWMgdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCWdlbmVyYXRlVmYoIHB3LCBpbnRmICk7CisJCQl9CisJCX0gKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgdmFsdWUgZmFjdG9yeSBmb3IgdGhlIHNlcnZpY2UuCisJICogQHBhcmFtIHB3CisJICogQHBhcmFtIGludGYKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXZvaWQgZ2VuZXJhdGVWZiggUHJpbnRXcml0ZXIgcHcsIFNlcnZpY2UgaW50ZiApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHBhcmFtcyBrZWVwcyB0cmFjayBvZiB0aGUgdG90YWwgc2V0IG9mIHBhcmFtZXRlcnMKKwkJLy8gbmFtZWQgKGZvciBlbnVtcywgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIG1lc3NhZ2VzKS4KKwkJU2V0PFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKwkJY29udGV4dC5wdXQoICJub3ciLCBuZXcgRGF0ZSgpICk7CisJCWNvbnRleHQucHV0KCAidmVyc2lvbiIsIFZFUlNJT04gKTsKKwkJY29udGV4dC5wdXQoICJoZWxwZXIiLCB0aGlzICk7CisJCWNvbnRleHQucHV0KCAiaW50ZiIsIGludGYgKTsKKwkJY29udGV4dC5wdXQoICJwYXJhbXMiLCBwYXJhbXMgKTsKKwkJdmZfdm0ubWVyZ2UoIGNvbnRleHQsIHB3ICk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VmZOYW1lKCBTZXJ2aWNlIGludGYgKQorCXsKKwkJcmV0dXJuIGdldEludGZOYW1lKCBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uLkJPVEggKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRJbnRmTmFtZSggU2VydmljZSBpbnRmLCBNZXNzYWdlRGlyZWN0aW9uIG1jICkKKwl7CisJCVN0cmluZyBzdWZmaXggPSBNc2dEaXJIZWxwZXIuZ2V0U3VmZml4KCBtYyApOworCQlyZXR1cm4gaW50Zi5uYW1lKCkrc3VmZml4OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgYXN5bmNSZWNlaXZlclBvb2xOYW1lKCBNZXNzYWdlIG1zZyApCisJeworCQlyZXR1cm4gbXNnLmdldEFzeW5jUmVjZWl2ZXIoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUeXBlVmFsdWUoIFR5cGVSZWYgdHlwZSwgVG9rZW4gdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggImdldFR5cGVWYWx1ZSBjYWxsZWQgd2l0aDogIit0eXBlKyI6ICIrdmFsdWUgKTsKKwkJVG9rZW4gdCA9IHR5cGUudHlwZSgpOworCQlzd2l0Y2ggKHQua2luZCkKKwkJeworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkc6IHJldHVybiBwcm90ZWN0U3RyaW5nKCB2YWx1ZS5pbWFnZSApOworCQkJZGVmYXVsdDogcmV0dXJuIHZhbHVlLmltYWdlOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcHJvdGVjdFN0cmluZyggU3RyaW5nIHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gczsKKwkJLy9yZXR1cm4gcHJvdGVjdEF0dHIocyk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcmV0dXJuIHR5cGUgbmFtZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGFzIGEgc3RydWN0dXJlCisJICogZWxlbWVudCBvciBleGNlcHRpb24gcGFyYW1ldGVyIG9yIGZ1bmN0aW9uIHBhcmFtZXRlcgorCSAqIG9yIHJlc3VsdC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCBUeXBlUmVmIHR5cGUgKQorCXsKKwkJaWYgKHR5cGUuZGltKCkgPiAwKQorCQkJcmV0dXJuIGdldE5hdGl2ZVR5cGVOYW1lKCB0eXBlICkvKitkaW0yc3BlYyggdHlwZS5kaW0oKSApKi87CisJCXJldHVybiBnZXRSZWZUeXBlTmFtZSggdHlwZSApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0eXBlIHRoZSBldGNoIHR5cGUKKwkgKiBAcmV0dXJuIHRoZSBmdW5kYW1lbnRhbCBuYXRpdmUgdHlwZSBmb3IgamF2YS4gc28gZXRjaAorCSAqIGludCAtPiBqYXZhIGludCwgd2hpbGUgZXRjaCBzdHJpbmcgLT4gamF2YSBTdHJpbmcuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYXRpdmVUeXBlTmFtZSggVHlwZVJlZiB0eXBlICkKKwl7CisJCVRva2VuIHQgPSB0eXBlLnR5cGUoKTsKKwkJc3dpdGNoICh0LmtpbmQpCisJCXsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuVk9JRDogcmV0dXJuICJ2b2lkIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQk9PTEVBTjogcmV0dXJuICJib29sZWFuIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQllURTogcmV0dXJuICJieXRlIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuU0hPUlQ6IHJldHVybiAic2hvcnQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQ6IHJldHVybiAiaW50IjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuTE9ORzogcmV0dXJuICJsb25nIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRkxPQVQ6IHJldHVybiAiZmxvYXQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6IHJldHVybiAiZG91YmxlIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSSU5HOiByZXR1cm4gInN0cmluZyI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLk9CSkVDVDogcmV0dXJuICJvYmplY3QiOworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyB3ZSBoYXZlIHRvIHVzZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGhlcmUuCisJCQkJLy8gZmluZCB0aGUgYWN0dWFsIHR5cGUuLi4KKwkJCQlOYW1lZDw/PiBuID0gdHlwZS5pbnRmKCkuZ2V0KCB0LmltYWdlICk7CisJCQkJaWYgKG4gPT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJ1bmRlZmluZWQgb3IgYW1iaWd1b3VzIG5hbWUgYXQgbGluZSAlZDogJXMiLAorCQkJCQkJdC5iZWdpbkxpbmUsIHQuaW1hZ2UgKSApOworCQkJCVN0cmluZyBzID0gbi5lZnFuYW1lKCB0aGlzICk7CisJCQkJCisJCQkJaWYgKCBzID09IG51bGwgJiYgbiBpbnN0YW5jZW9mIEV4dGVybiApCisJCQkJCXMgPSB0LmltYWdlOworCQkJCQorCQkJCXJldHVybiBzOworCQkJfQorCQl9CisJfQorCQorCQorCS8qKgorCSAqIEBwYXJhbSB0eXBlCisJICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGFuIGV0Y2ggYnVpbHRpbiB0eXBlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQmFzaWNUeXBlKFR5cGVSZWYgdHlwZSkgeworCQkKKwkJVG9rZW4gdCA9IHR5cGUudHlwZSgpOworCQkKKwkJc3dpdGNoICh0LmtpbmQpCisJCXsKKwkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5WT0lEOgorCQkJcmV0dXJuIHRydWU7CisJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQk9PTEVBTjoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEU6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVDoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVDoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkxPTkc6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5GTE9BVDoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkRPVUJMRToKKwkJCXJldHVybiB0cnVlOworCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUklORzoKKwkJCXJldHVybiB0cnVlOworCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLk9CSkVDVDoKKwkJCXJldHVybiB0cnVlOworCisJCS8vIHBhdGNoIGhlcmUuIG1vcmUgZ2VuZXJpYyBhcHByb2FjaCBuZWVkZWQuCisJCS8vIGN1cnJlbnRseSwgb25seSB0YWtpbmcgY2FyZSBvZiBNYXAsIFNldCwgTGlzdCAmIERhdGV0aW1lCisJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuSUQ6CisJCQlpZiAoIHQudG9TdHJpbmcoKS5lcXVhbHMoIk1hcCIpIHx8IHQudG9TdHJpbmcoKS5lcXVhbHMoIkxpc3QiKSB8fAorCQkJCQl0LnRvU3RyaW5nKCkuZXF1YWxzKCJTZXQiKSB8fCB0LnRvU3RyaW5nKCkuZXF1YWxzKCJEYXRldGltZSIpICkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHBhcmFtIHR5cGUgdGhlIGV0Y2ggdHlwZQorCSAqIEByZXR1cm4gdGhlIGZ1bmRhbWVudGFsIG5hdGl2ZSByZWZlcmVuY2UgdHlwZSBmb3IgamF2YS4KKwkgKiBzbyBldGNoIGludCAtPiBqYXZhIEludGVnZXIsIHdoaWxlIGV0Y2ggc3RyaW5nIC0+IGphdmEgU3RyaW5nLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFJlZlR5cGVOYW1lKCBUeXBlUmVmIHR5cGUgKQorCXsKKwkJVG9rZW4gdCA9IHR5cGUudHlwZSgpOworCQlzd2l0Y2ggKHQua2luZCkKKwkJeworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5WT0lEOiByZXR1cm4gInZvaWQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5CT09MRUFOOiByZXR1cm4gImJvb2xlYW4iOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5CWVRFOiByZXR1cm4gImJ5dGUiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVDogcmV0dXJuICJzaG9ydCI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVDogcmV0dXJuICJpbnQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5MT05HOiByZXR1cm4gImxvbmciOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5GTE9BVDogcmV0dXJuICJmbG9hdCI7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkRPVUJMRTogcmV0dXJuICJkb3VibGUiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkc6IHJldHVybiAic3RyaW5nIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuT0JKRUNUOiByZXR1cm4gIm9iamVjdCI7CisJCQlkZWZhdWx0OgorCQkJeworCQkJCS8vIHdlIGhhdmUgdG8gdXNlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaGVyZS4KKwkJCQkvLyBmaW5kIHRoZSBhY3R1YWwgdHlwZS4uLgorCQkJCU5hbWVkPD8+IG4gPSB0eXBlLmludGYoKS5nZXQoIHQuaW1hZ2UgKTsKKwkJCQlpZiAobiA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkJInVuZGVmaW5lZCBvciBhbWJpZ3VvdXMgbmFtZSBhdCBsaW5lICVkOiAlcyIsCisJCQkJCQl0LmJlZ2luTGluZSwgdC5pbWFnZSApICk7CisJCQkJCisJCQkJCisJCQkJaWYgKCBuLmlzRXh0ZXJuKCkgKQorCQkJCQlyZXR1cm4gbi5mcW5hbWUoKTsKKwkJCQkKKwkJCQlyZXR1cm4gbi5lZnFuYW1lKCB0aGlzICk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGZvcm1hdFN0cmluZyggUGFyYW1MaXN0PFNlcnZpY2U+IG4sIGJvb2xlYW4gaXNFeGNlcHQgKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uCisJeworCQlUb1N0cmluZyB0cyA9IChUb1N0cmluZykgbi5nZXRPcHQoICJUb1N0cmluZyIgKTsKKwkJTGlzdDxGbXRJdGVtPiBsaXN0OworCQlpZiAodHMgIT0gbnVsbCkKKwkJeworCQkJbGlzdCA9IHRzLmdldEZvcm1hdCgpOworCQkJbi5jaGVja0Zvcm1hdExpc3QoIHRzLmxpbmVubygpLCBsaXN0ICk7CisJCX0KKwkJZWxzZQorCQkJbGlzdCA9IG4ubWtGb3JtYXRMaXN0KCBpc0V4Y2VwdCwgZmFsc2UgKTsKKworCQlpZiAobGlzdC5zaXplKCkgPT0gMSkKKwkJeworCQkJcmV0dXJuIGxpc3QuZ2V0KCAwICkudmFsdWUoKTsKKwkJfQorCisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJc2IuYXBwZW5kKCAiU3RyaW5nLmZvcm1hdCggIiApOworCQlzYi5hcHBlbmQoICJcIiIgKTsKKwkJZm9yIChGbXRJdGVtIGk6IGxpc3QpCisJCXsKKwkJCWlmIChpIGluc3RhbmNlb2YgRmllbGRJdGVtKQorCQkJeworCQkJCXNiLmFwcGVuZCggIiVzIiApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVzY2FwZSggc2IsICgoU3RyaW5nSXRlbSkgaSkudmFsdWUoKSApOworCQkJfQorCQl9CisJCXNiLmFwcGVuZCggIlwiIiApOworCQlmb3IgKEZtdEl0ZW0gaTogbGlzdCkKKwkJeworCQkJaWYgKGkgaW5zdGFuY2VvZiBGaWVsZEl0ZW0pCisJCQl7CisJCQkJc2IuYXBwZW5kKCAiLCAiICk7CisJCQkJc2IuYXBwZW5kKCAoKEZpZWxkSXRlbSkgaSkudmFsdWUoKSApOworCQkJfQorCQl9CisJCXNiLmFwcGVuZCggIiApIiApOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZXNjYXBlKCBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlTdHJpbmdSZWFkZXIgcmRyID0gbmV3IFN0cmluZ1JlYWRlciggcyApOworCQlpbnQgYzsKKwkJd2hpbGUgKChjID0gcmRyLnJlYWQoKSkgPj0gMCkKKwkJeworCQkJaWYgKGMgPT0gJyInKSBzYi5hcHBlbmQoICJcXFwiIiApOworCQkJZWxzZSBpZiAoYyA9PSAnXFwnKSBzYi5hcHBlbmQoICJcXFxcIiApOworCQkJZWxzZSBpZiAoYyA9PSAnXHQnKSBzYi5hcHBlbmQoICJcXHQiICk7CisJCQllbHNlIGlmIChjID09ICdccicpIHNiLmFwcGVuZCggIlxcciIgKTsKKwkJCWVsc2UgaWYgKGMgPT0gJ1xuJykgc2IuYXBwZW5kKCAiXFxuIiApOworCQkJZWxzZSBzYi5hcHBlbmQoIChjaGFyKSBjICk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIG1mdm5hbWUoIFN0cmluZyB2bmFtZSApCisJeworCQlyZXR1cm4gIl9tZl8iK3ZuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgbXR2bmFtZSggU3RyaW5nIHZuYW1lICkKKwl7CisJCXJldHVybiAiX210XyIrdm5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRMYW5nKCkKKwl7CisJCXJldHVybiAieG1sIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGVudW1fZWZxbmFtZSggU3RyaW5nIGZxbmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUsCisJCVN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGVudW1OYW1lICkKKwl7CisJCXJldHVybiBmcW5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBleGNlcHRfZWZxbmFtZShTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZXhjZXB0TmFtZSkgeworCisJCXJldHVybiBmcW5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBzdHJ1Y3RfZWZxbmFtZShTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZW51bU5hbWUpIHsKKworCQlyZXR1cm4gZnFuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgcXVhbGlmeVBhcmFtZXRlck5hbWUoIFRva2VuIG5hbWUgKQorCXsKKwkJcmV0dXJuIG5hbWUuaW1hZ2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBxdWFsaWZ5Q29uc3RhbnROYW1lKCBTZXJ2aWNlIGludGYsIFRva2VuIG5hbWUgKQorCXsKKwkJcmV0dXJuIGludGYuZnFuYW1lKCkrJy4nK25hbWUuaW1hZ2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBxdWFsaWZ5RW51bU5hbWUoIFNlcnZpY2UgaW50ZiwgVG9rZW4gbmFtZSApCisJeworCQlyZXR1cm4gaW50Zi5mcW5hbWUoKSsnLicrbmFtZS5pbWFnZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvciggTmFtZWQ8Pz4gbmFtZWQgKQorCXsKKwkJaWYgKG5hbWVkIGluc3RhbmNlb2YgUGFyYW1ldGVyKQorCQl7CisJCQlQYXJhbWV0ZXIgcGFyYW0gPSAoUGFyYW1ldGVyKSBuYW1lZDsKKwkJCVR5cGVSZWYgdHlwZSA9IHBhcmFtLnR5cGUoKTsKKworCQkJaWYgKHR5cGUuaXNCdWlsdGluKCkpCisJCQkJcmV0dXJuICJWYWxpZGF0b3JfIit0eXBlLnR5cGUoKSsiLmdldCggIit0eXBlLmRpbSgpKyIgKSI7CisKKwkJCXJldHVybiAiVmFsaWRhdG9yX2N1c3RvbS5nZXRDdXN0b20oICIrdHlwZS5nZXROYW1lZCggdHlwZS5pbnRmKCkgKS5lZnFuYW1lKCB0aGlzICkrIi5jbGFzcywgIit0eXBlLmRpbSgpKyIgKSI7CisJCX0KKworCQlpZiAobmFtZWQgaW5zdGFuY2VvZiBUaHJvd24pCisJCXsKKwkJCVRocm93biB0aHJvd24gPSAoVGhyb3duKSBuYW1lZDsKKwkJCUV4Y2VwdCBlID0gKEV4Y2VwdCkgdGhyb3duLmdldE5hbWVkKCk7CisJCQlyZXR1cm4gIlZhbGlkYXRvcl9jdXN0b20uZ2V0Q3VzdG9tKCAiK2UuZWZxbmFtZSggdGhpcyApKyIuY2xhc3MsIDAgKSI7CisJCX0KKworCQlpZiAobmFtZWQgaW5zdGFuY2VvZiBJdGVtKQorCQkJcmV0dXJuICJWYWxpZGF0b3JfYm9vbGVhbi5nZXQoIDAgKSI7CisKKwkJcmV0dXJuICJudWxsIjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb25zCisJICogQHJldHVybiBzdHJpbmcgd2l0aCBkZXNjcmlwdGlvbnMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGVtaXRYbWwoTGlzdDxTdHJpbmc+IGRlc2NyaXB0aW9ucykKKwl7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdGlvbnMuc2l6ZSgpOyBpKyspCisJCXsKKwkJCU9iamVjdCBvYmpNZXNzYWdlID0gZGVzY3JpcHRpb25zLmdldChpKTsKKwkJCVN0cmluZyBtZXNzYWdlID0gIiI7CisJCQlpZihvYmpNZXNzYWdlICE9IG51bGwpCisJCQl7CisJCQkJbWVzc2FnZSA9IG9iak1lc3NhZ2UudG9TdHJpbmcoKTsKKwkJCX0KKworCQkJYnVmZmVyLmFwcGVuZChtZXNzYWdlKTsKKworCQkJaWYoaSA8IGRlc2NyaXB0aW9ucy5zaXplKCkgLSAxKQorCQkJeworCQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdW5wcm90ZWN0ZWQKKwkgKiBAcmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZSBwcm90ZWN0ZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBTdHJpbmcgcHJvdGVjdEF0dHIoU3RyaW5nIHVucHJvdGVjdGVkKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXJldHVybiBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuUHJvdGVjdEF0dHJWYWx1ZS50b1N0cmluZyh1bnByb3RlY3RlZCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHVucHJvdGVjdGVkCisJICogQHJldHVybiBjZGF0YSB2YWx1ZSBwcm90ZWN0ZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBTdHJpbmcgcHJvdGVjdENEYXRhKFN0cmluZyB1bnByb3RlY3RlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZXR1cm4gb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLlByb3RlY3RDRGF0YS50b1N0cmluZyh1bnByb3RlY3RlZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkRGVmYXVsdHMoIFNlcnZpY2Ugc2VydmljZSApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJYWRkQnVpbHRpbiggc2VydmljZSwgbmV3TmFtZSggIkxpc3QiICksICJMaXN0IiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiTWFwIiApLCAiTWFwIiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiU2V0IiApLCAiU2V0IiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiRGF0ZXRpbWUiICksICJEYXRldGltZSIsIGZhbHNlICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG4KKwkgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgbmFtZWQgaXRlbS4KKwkgKi8KKwlwdWJsaWMgaW50IGlkKCBOYW1lZDw/PiBuICkKKwl7CisJCWlmIChuIGluc3RhbmNlb2YgSXRlbSB8fCBuIGluc3RhbmNlb2YgUGFyYW1ldGVyKQorCQkJcmV0dXJuIEhhc2guaGFzaCggbi5uYW1lKCkubmFtZSgpICk7CisJCQorCQlyZXR1cm4gSGFzaC5oYXNoKCBuLmZxbmFtZSgpICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYmluZGluZy14bWwvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhIGIvYmluZGluZy14bWwvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Y2Y1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW5kaW5nLXhtbC9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy94bWwvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXI7CisKKy8qKgorICogVGhlIHZlcnNpb24gaW5mbyBvZiB0aGlzIEV0Y2ggYmFja2VuZCAoY29tcGlsZXIpLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbXBpbGVyVmVyc2lvbgoreworCS8vIFRoaXMgZmlsZSBpcyBlZGl0ZWQgYnkgdGhlIHByb2R1Y3Rpb24gYnVpbGQgc3lzdGVtIHRvIHJlcGxhY2UgdGhlIHZhbHVlCisJLy8gb2YgVkVSU0lPTiBiZWxvdyB3aXRoIHdoYXRldmVyIGl0IHdhbnRzIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBhY3R1YWxseSBiZS4KKwkKKwkvKiogVGhlIHZlcnNpb24gb2YgdGhpcyBFdGNoIGJhY2tlbmQgKGNvbXBpbGVyKSAqLworCXB1YmxpYyBTdHJpbmcgVkVSU0lPTiA9ICJ4bWwgMS4xLjAtaW5jdWJhdGluZyAoTE9DQUwtMCkiOworfQpkaWZmIC0tZ2l0IGEvYmluZGluZy14bWwvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhLnRtcGwgYi9iaW5kaW5nLXhtbC9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy94bWwvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Y0ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvYmluZGluZy14bWwvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhLnRtcGwKQEAgLTAsMCArMSwzMCBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlcjsKKworLyoqCisgKiBUaGUgdmVyc2lvbiBpbmZvIG9mIHRoaXMgRXRjaCBiYWNrZW5kIChjb21waWxlcikuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29tcGlsZXJWZXJzaW9uCit7CisJLy8gVGhpcyBmaWxlIGlzIGVkaXRlZCBieSB0aGUgcHJvZHVjdGlvbiBidWlsZCBzeXN0ZW0gdG8gcmVwbGFjZSB0aGUgdmFsdWUKKwkvLyBvZiBWRVJTSU9OIGJlbG93IHdpdGggd2hhdGV2ZXIgaXQgd2FudHMgdGhlIHZlcnNpb24gc3RyaW5nIHRvIGFjdHVhbGx5IGJlLgorCQorCS8qKiBUaGUgdmVyc2lvbiBvZiB0aGlzIEV0Y2ggYmFja2VuZCAoY29tcGlsZXIpICovCisJcHVibGljIFN0cmluZyBWRVJTSU9OID0gInhtbCBARXRjaExvbmdWZXJzaW9uQCAoQEV0Y2hCdWlsZFRhZ0ApIjsKK30KZGlmZiAtLWdpdCBhL2JpbmRpbmcteG1sL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL3ZmLnZtIGIvYmluZGluZy14bWwvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy94bWwvY29tcGlsZXIvdmYudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyOGZhMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbmRpbmcteG1sL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvYmluZGluZ3MveG1sL2NvbXBpbGVyL3ZmLnZtCkBAIC0wLDAgKzEsMzYxIEBACisjIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyMjIG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorCis8IS0tCisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgICR2ZXJzaW9uCisvLyAgICRub3cKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgZWRpdGVkIQorLS0+CisKKzxtb2R1bGUgbmFtZT0iJGludGYucGFyZW50KCkubmFtZSgpIj4KKyNpZiAoJGludGYucGFyZW50KCkuZGVzY3IoKS5zaXplKCkgPiAwKQorCTxkZXNjcmlwdGlvbj4kaGVscGVyLmVtaXRYbWwoJGludGYucGFyZW50KCkuZGVzY3IoKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCTxzZXJ2aWNlIG5hbWU9IiRpbnRmLm5hbWUoKSI+CisjaWYgKCRpbnRmLnBhcmVudCgpLmRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkaW50Zi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorIyMgaXRlcmF0ZSB0aHJvdWdoIGV4dGVybnMsIGdyb3VwaW5nIHRoZW0gdG9nZXRoZXIKKwkJPGNvbnN0cz4KKyNmb3JlYWNoKCAkbiBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiAoJG4uaXNDb25zdGFudCgpKQorCQkJPGNvbnN0IG5hbWU9IiRuLm5hbWUoKSIgdHlwZT0iJGhlbHBlci5nZXROYXRpdmVUeXBlTmFtZSggJG4udHlwZSgpICkiIHZhbHVlPSIkaGVscGVyLnByb3RlY3RBdHRyKCRoZWxwZXIuZ2V0VHlwZVZhbHVlKCAkbi50eXBlKCksICRuLnZhbHVlKCkgKSkiPgorI2lmICgkbi5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJPC9jb25zdD4KKwkJCQorI2VuZAorI2VuZAorIyMgLS0tIGNvbnN0YW50cyBmcm9tIG1peGVkLWluIGludGVyZmFjZXMgLS0tIAorI2ZvcmVhY2goICR4IGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmKCAkeC5pc01peGluKCkgKQorI3NldCggJG0gPSAkeC5nZXRNb2R1bGUoKSApCisjc2V0KCAkeiA9ICRtLml0ZXJhdG9yKCkubmV4dCgpICkKKyNmb3JlYWNoKCAkbiBpbiAkei5jb25zdGFudHMoIHRydWUgKSApCisjaWYgKCRuLmlzQ29uc3RhbnQoKSkKKwkJCQorCQkJPGNvbnN0IG5hbWU9IiRuLm5hbWUoKSIgdHlwZT0iJGhlbHBlci5nZXROYXRpdmVUeXBlTmFtZSggJG4udHlwZSgpICkiIHZhbHVlPSIkaGVscGVyLnByb3RlY3RBdHRyKCRoZWxwZXIuZ2V0VHlwZVZhbHVlKCAkbi50eXBlKCksICRuLnZhbHVlKCkgKSkiPgorI2lmICgkbi5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJPC9jb25zdD4KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKwkJPC9jb25zdHM+CisJCQorIyMgaXRlcmF0ZSB0aHJvdWdoIGV4dGVybnMsIGdyb3VwaW5nIHRoZW0gdG9nZXRoZXIKKwkJPGV4dGVybnM+CisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzRXh0ZXJuKCkpCisJCQk8ZXh0ZXJuIG5hbWU9IiRuLm5hbWUoKSIgdHlwZUlkPSIkaGVscGVyLmlkKCAkbiApIiB0eXBlTmFtZT0iJG4uZnFuYW1lKCkiPgorI2ZvcmVhY2ggKCAkb3B0IGluICRuLm9wdHMoKSApCisJCQkJPGV4dGVybm1hcCBsYW5ndWFnZT0iJG9wdC5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkiIG5hbWU9IiRvcHQuZ2V0WG5hbWUoKS50b1N0cmluZygpIiBuSW1wb3J0PSIkb3B0LmdldFhuYW1lSW1wb3J0KCkudG9TdHJpbmcoKSIgc2VyaWFsaXplcj0iJG9wdC5nZXRTZXJpYWxpemVyKCkudG9TdHJpbmcoKSIgc0ltcG9ydD0iJG9wdC5nZXRTZXJpYWxpemVySW1wb3J0KCkudG9TdHJpbmcoKSI+CQorCQkJCTwvZXh0ZXJubWFwPgorI2VuZAorI2lmICgkbi5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJPC9leHRlcm4+CisJCQkKKyNlbmQKKyNlbmQKKyMjIC0tLSBleHRlcm5zIGZyb20gbWl4ZWQtaW4gaW50ZXJmYWNlcworI2ZvcmVhY2goICR4IGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmKCAkeC5pc01peGluKCkgKQorI3NldCggJG0gPSAkeC5nZXRNb2R1bGUoKSApCisjc2V0KCAkeiA9ICRtLml0ZXJhdG9yKCkubmV4dCgpICkKKyNmb3JlYWNoKCAkbiBpbiAkei5leHRlcm5zKCB0cnVlICkgKQorI2lmICgkbi5pc0V4dGVybigpKQorCQkJCisJCQk8ZXh0ZXJuIG5hbWU9IiRuLm5hbWUoKSIgdHlwZUlkPSIkaGVscGVyLmlkKCAkbiApIiB0eXBlTmFtZT0iJG4uZnFuYW1lKCkiPgorI2ZvcmVhY2ggKCAkb3B0IGluICRuLm9wdHMoKSApCisJCQkJPGV4dGVybm1hcCBsYW5ndWFnZT0iJG9wdC5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkiIG5hbWU9IiRvcHQuZ2V0WG5hbWUoKS50b1N0cmluZygpIiBuSW1wb3J0PSIkb3B0LmdldFhuYW1lSW1wb3J0KCkudG9TdHJpbmcoKSIgc2VyaWFsaXplcj0iJG9wdC5nZXRTZXJpYWxpemVyKCkudG9TdHJpbmcoKSIgc0ltcG9ydD0iJG9wdC5nZXRTZXJpYWxpemVySW1wb3J0KCkudG9TdHJpbmcoKSI+CQorCQkJCTwvZXh0ZXJubWFwPgorI2VuZAorI2lmICgkbi5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJPC9leHRlcm4+CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisJCTwvZXh0ZXJucz4KKwkJCisjIyBpdGVyYXRlIHRocm91Z2ggZW51bXMsIGdyb3VwaW5nIHRoZW0gdG9nZXRoZXIKKwkJPGVudW1zPgorI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0VudW14KCkpCisJCQk8ZW51bSBuYW1lPSIkbi5uYW1lKCkiIHR5cGVJZD0iJGhlbHBlci5pZCggJG4gKSIgdHlwZU5hbWU9IiRuLmZxbmFtZSgpIj4KKyNpZiAoJG4uZGVzY3IoKS5zaXplKCkgPiAwKQorCQkJCTxkZXNjcmlwdGlvbj4kaGVscGVyLnByb3RlY3RDRGF0YSgkaGVscGVyLmVtaXRYbWwoJG4uZGVzY3IoKSkpPC9kZXNjcmlwdGlvbj4KKyNlbmQKKyNmb3JlYWNoKCAkcGFyYW0gaW4gJG4uaXRlcmF0b3IoKSApCisJCQkJPGVudHJ5IHZhbHVlPSIkcGFyYW0ubmFtZSgpIiBlbnRyeUlkPSIkaGVscGVyLmlkKCAkcGFyYW0gKSIgLz4KKyNlbmQKKwkJCTwvZW51bT4KKwkJCQorI2VuZAorI2VuZAorIyMgLS0tIGVudW1zIGZyb20gbWl4ZWQtaW4gaW50ZXJmYWNlcworI2ZvcmVhY2goICR4IGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmKCAkeC5pc01peGluKCkgKQorI3NldCggJG0gPSAkeC5nZXRNb2R1bGUoKSApCisjc2V0KCAkeiA9ICRtLml0ZXJhdG9yKCkubmV4dCgpICkKKyNmb3JlYWNoKCAkbiBpbiAkei5lbnVtcyggdHJ1ZSApICkKKyNpZiAoJG4uaXNFbnVteCgpKQorCQkJCisJCQk8ZW51bSBuYW1lPSIkbi5uYW1lKCkiIHR5cGVJZD0iJGhlbHBlci5pZCggJG4gKSIgdHlwZU5hbWU9IiRuLmZxbmFtZSgpIj4KKyNpZiAoJG4uZGVzY3IoKS5zaXplKCkgPiAwKQorCQkJCTxkZXNjcmlwdGlvbj4kaGVscGVyLnByb3RlY3RDRGF0YSgkaGVscGVyLmVtaXRYbWwoJG4uZGVzY3IoKSkpPC9kZXNjcmlwdGlvbj4KKyNlbmQKKyNmb3JlYWNoKCAkcGFyYW0gaW4gJG4uaXRlcmF0b3IoKSApCisJCQkJPGVudHJ5IHZhbHVlPSIkcGFyYW0ubmFtZSgpIiBlbnRyeUlkPSIkaGVscGVyLmlkKCAkcGFyYW0gKSIgLz4KKyNlbmQKKwkJCTwvZW51bT4KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKwkJPC9lbnVtcz4KKworIyMgaXRlcmF0ZSB0aHJvdWdoIHN0cnVjdHVyZXMsIGdyb3VwaW5nIHRoZW0gdG9nZXRoZXIKKwkJPHN0cnVjdHM+CisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzU3RydWN0KCkpCisJCQk8c3RydWN0IG5hbWU9IiRuLm5hbWUoKSIgdHlwZUlkPSIkaGVscGVyLmlkKCAkbiApIiB0eXBlTmFtZT0iJG4uZnFuYW1lKCkiICNpZigkbi5oYXNFeHRlbmRzKCkpYmFzZVR5cGU9IiRuLmdldEV4dGVuZHMoKS5mcW5hbWUoKSIjZWxzZSBiYXNlVHlwZT0ibnVsbCIjZW5kPgorI2lmICgkbi5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorI2ZvcmVhY2goICRwYXJhbSBpbiAkbi5pdGVyYXRvcigpICkKKwkJCQk8ZmllbGQgbmFtZT0iJHBhcmFtLm5hbWUoKSIgZmllbGRJZD0iJGhlbHBlci5pZCggJHBhcmFtICkiIGZpZWxkTmFtZT0iJHBhcmFtLmZxbmFtZSgpIiB0eXBlPSIkaGVscGVyLmdldFR5cGVOYW1lKCRwYXJhbS50eXBlKCkpIiBpc1ByaW1pdGl2ZVR5cGU9IiRoZWxwZXIuaXNCYXNpY1R5cGUoJHBhcmFtLnR5cGUoKSkiIGlzQXJyYXk9IiRwYXJhbS50eXBlKCkuaXNBcnJheSgpIiAjaWYoJHBhcmFtLnR5cGUoKS5pc0FycmF5KCkpZGltZW5zaW9uPSIkcGFyYW0udHlwZSgpLmRpbSgpIiNlbmQ+CisjaWYgKCRwYXJhbS5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJCTxkZXNjcmlwdGlvbj4kaGVscGVyLnByb3RlY3RDRGF0YSgkaGVscGVyLmVtaXRYbWwoJHBhcmFtLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisjZW5kCisJCQkJPC9maWVsZD4KKyNlbmQKKwkJCTwvc3RydWN0PgorI2VuZAorI2VuZAorCisjZm9yZWFjaCggJHggaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYoICR4LmlzTWl4aW4oKSApCisjc2V0KCAkbSA9ICR4LmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQorI2ZvcmVhY2goICRuIGluICR6LnN0cnVjdHMoIHRydWUgKSApCisjaWYgKCRuLmlzU3RydWN0KCkpCisJCQkKKwkJCTxzdHJ1Y3QgbmFtZT0iJG4ubmFtZSgpIiB0eXBlSWQ9IiRoZWxwZXIuaWQoICRuICkiIHR5cGVOYW1lPSIkbi5mcW5hbWUoKSIgICNpZigkbi5oYXNFeHRlbmRzKCkpYmFzZVR5cGU9IiRuLmdldEV4dGVuZHMoKS5mcW5hbWUoKSIjZWxzZSBiYXNlVHlwZT0ibnVsbCIjZW5kPgorI2lmICgkbi5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorI2ZvcmVhY2goICRwYXJhbSBpbiAkbi5pdGVyYXRvcigpICkKKwkJCQk8ZmllbGQgbmFtZT0iJHBhcmFtLm5hbWUoKSIgZmllbGRJZD0iJGhlbHBlci5pZCggJHBhcmFtICkiIGZpZWxkTmFtZT0iJHBhcmFtLmZxbmFtZSgpIiB0eXBlPSIkaGVscGVyLmdldFR5cGVOYW1lKCRwYXJhbS50eXBlKCkpIiBpc1ByaW1pdGl2ZVR5cGU9IiRoZWxwZXIuaXNCYXNpY1R5cGUoJHBhcmFtLnR5cGUoKSkiICBpc0FycmF5PSIkcGFyYW0udHlwZSgpLmlzQXJyYXkoKSIgI2lmKCRwYXJhbS50eXBlKCkuaXNBcnJheSgpKWRpbWVuc2lvbj0iJHBhcmFtLnR5cGUoKS5kaW0oKSIjZW5kPgorI2lmICgkcGFyYW0uZGVzY3IoKS5zaXplKCkgPiAwKQorCQkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRwYXJhbS5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJCTwvZmllbGQ+CisjZW5kCisJCQk8L3N0cnVjdD4KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKwkJPC9zdHJ1Y3RzPgorCisjIyBpdGVyYXRlIHRocm91Z2ggZXhjZXB0aW9ucywgZ3JvdXBpbmcgdGhlbSB0b2dldGhlcgkJCisJCTxleGNlcHRpb25zPgorI2ZvcmVhY2goICRuIGluICRpbnRmLml0ZXJhdG9yKCkgKQorI2lmICgkbi5pc0V4Y2VwdCgpKQorCQkJPGV4Y2VwdGlvbiBuYW1lPSIkbi5uYW1lKCkiIGlzVW5jaGVja2VkPSIkbi5pc1VuY2hlY2tlZCgpIiB0eXBlSWQ9IiRoZWxwZXIuaWQoICRuICkiIHR5cGVOYW1lPSIkbi5mcW5hbWUoKSIgI2lmKCRuLmhhc0V4dGVuZHMoKSliYXNlVHlwZT0iJG4uZ2V0RXh0ZW5kcygpLmZxbmFtZSgpIiNlbHNlIGJhc2VUeXBlPSJudWxsIiNlbmQ+CisjaWYgKCRuLmRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRuLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisjZW5kCisjZm9yZWFjaCggJHBhcmFtIGluICRuLml0ZXJhdG9yKCkgKQorCQkJCTxmaWVsZCBuYW1lPSIkcGFyYW0ubmFtZSgpIiBmaWVsZElkPSIkaGVscGVyLmlkKCAkcGFyYW0gKSIgZmllbGROYW1lPSIkcGFyYW0uZnFuYW1lKCkiIHR5cGU9IiRwYXJhbS50eXBlKCkudHlwZSgpIiBpc0FycmF5PSIkcGFyYW0udHlwZSgpLmlzQXJyYXkoKSIgI2lmKCRwYXJhbS50eXBlKCkuaXNBcnJheSgpKWRpbWVuc2lvbj0iJHBhcmFtLnR5cGUoKS5kaW0oKSIjZW5kPgorI2lmICgkcGFyYW0uZGVzY3IoKS5zaXplKCkgPiAwKQorCQkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRwYXJhbS5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJCTwvZmllbGQ+CisjZW5kCisJCQk8L2V4Y2VwdGlvbj4KKyNlbmQKKyNlbmQKKyNmb3JlYWNoKCAkeCBpbiAkaW50Zi5pdGVyYXRvcigpICkKKyNpZiggJHguaXNNaXhpbigpICkKKyNzZXQoICRtID0gJHguZ2V0TW9kdWxlKCkgKQorI3NldCggJHogPSAkbS5pdGVyYXRvcigpLm5leHQoKSApCisjZm9yZWFjaCggJG4gaW4gJHouZXhjZXB0aW9ucyggdHJ1ZSApICkKKyNpZiAoJG4uaXNFeGNlcHQoKSkKKwkJCQorCQkJPGV4Y2VwdGlvbiBuYW1lPSIkbi5uYW1lKCkiIGlzVW5jaGVja2VkPSIkbi5pc1VuY2hlY2tlZCgpIiB0eXBlSWQ9IiRoZWxwZXIuaWQoICRuICkiIHR5cGVOYW1lPSIkbi5mcW5hbWUoKSIgI2lmKCRuLmhhc0V4dGVuZHMoKSliYXNlVHlwZT0iJG4uZ2V0RXh0ZW5kcygpLmZxbmFtZSgpIiNlbHNlIGJhc2VUeXBlPSJudWxsIiNlbmQ+CisjaWYgKCRuLmRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRuLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisjZW5kCisjZm9yZWFjaCggJHBhcmFtIGluICRuLml0ZXJhdG9yKCkgKQorCQkJCTxmaWVsZCBuYW1lPSIkcGFyYW0ubmFtZSgpIiBmaWVsZElkPSIkaGVscGVyLmlkKCAkcGFyYW0gKSIgZmllbGROYW1lPSIkcGFyYW0uZnFuYW1lKCkiIHR5cGU9IiRwYXJhbS50eXBlKCkudHlwZSgpIiBpc0FycmF5PSIkcGFyYW0udHlwZSgpLmlzQXJyYXkoKSIgI2lmKCRwYXJhbS50eXBlKCkuaXNBcnJheSgpKWRpbWVuc2lvbj0iJHBhcmFtLnR5cGUoKS5kaW0oKSIjZW5kPgorI2lmICgkcGFyYW0uZGVzY3IoKS5zaXplKCkgPiAwKQorCQkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRwYXJhbS5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJCTwvZmllbGQ+CisjZW5kCisJCQk8L2V4Y2VwdGlvbj4KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKwkJPC9leGNlcHRpb25zPgorCQkKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBpdGVyYXRlIHRocm91Z2ggbWVzc2FnZXMsIGdyb3VwaW5nIHRoZW0gdG9nZXRoZXIJCQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJPG1ldGhvZHM+CisjZm9yZWFjaCggJG4gaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYgKCRuLmlzTWVzc2FnZSgpKQorI2lmICghJG4uaXNIaWRkZW4oKSkKKyNpZiAoISRuLmlzT25ld2F5KCkpCisjc2V0KCAkciA9ICRuLmdldFJlc3VsdE1lc3NhZ2UoKSApCisjZW5kCisJCQk8bWV0aG9kIG5hbWU9IiRuLm5hbWUoKSIgdHlwZUlkPSIkaGVscGVyLmlkKCAkbiApIiB0eXBlTmFtZT0iJG4uZnFuYW1lKCkiIGFzeW5jUmVjZWl2ZXJNb2RlPSIkbi5nZXRBc3luY1JlY2VpdmVyKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIiBpc09uZXdheT0iJG4uaXNPbmV3YXkoKSIgbWVzc2FnZURpcmVjdGlvbj0iJG4uZ2V0TWVzc2FnZURpcmVjdGlvbigpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSIgPgorI2lmICgkbi5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAkJCQkKKyNpZiAoJG4uaGFzVGhyb3duKCkpCisjZm9yZWFjaCggJHRocm93bkl0ZW0gaW4gJG4udGhyb3duKCkuaXRlcmF0b3IoKSApCisJCQkJPGV4Y2VwdGlvbiBuYW1lPSIkdGhyb3duSXRlbSIgdHlwZT0iJHRocm93bkl0ZW0uZ2V0TmFtZWQoKS5lZnFuYW1lKCRoZWxwZXIpIj4KKwkJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkdGhyb3duSXRlbS5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorCQkJCTwvZXhjZXB0aW9uPgorI2VuZAorI2VuZAorI2lmICgkbi5oYXNBdXRoKCkpCisJCQkJPGF1dGhvcml6ZSBtZXRob2ROYW1lPSIkbi5nZXRBdXRoKCkubWV0aG9kKCkiPgorI2ZvcmVhY2goICRhdXRoQXJnIGluICRuLmdldEF1dGgoKS5hcmdzKCkgKQorCQkJCQk8YXJndW1lbnQgbmFtZT0iJGF1dGhBcmcudmFsdWUoKSIgLz4KKyNlbmQKKwkJCQk8L2F1dGhvcml6ZT4KKyNlbmQKKyNmb3JlYWNoKCAkcGFyYW0gaW4gJG4uaXRlcmF0b3IoKSApCisJCQkJPGZpZWxkIG5hbWU9IiRwYXJhbS5uYW1lKCkiIGZpZWxkSWQ9IiRoZWxwZXIuaWQoICRwYXJhbSApIiBmaWVsZE5hbWU9IiRwYXJhbS5mcW5hbWUoKSIgdHlwZT0iJGhlbHBlci5nZXROYXRpdmVUeXBlTmFtZSgkcGFyYW0udHlwZSgpKSIgaXNQcmltaXRpdmVUeXBlPSIkaGVscGVyLmlzQmFzaWNUeXBlKCRwYXJhbS50eXBlKCkpIiBpc0FycmF5PSIkcGFyYW0udHlwZSgpLmlzQXJyYXkoKSIgI2lmKCRwYXJhbS50eXBlKCkuaXNBcnJheSgpKWRpbWVuc2lvbj0iJHBhcmFtLnR5cGUoKS5kaW0oKSIjZW5kPgorI2lmICgkcGFyYW0uZGVzY3IoKS5zaXplKCkgPiAwKQorCQkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRwYXJhbS5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJCTwvZmllbGQ+CisjZW5kCisJCQkJPHJlc3VsdCAjaWYgKCEkbi5pc09uZXdheSgpKWZpZWxkSWQ9IiRoZWxwZXIuaWQoICRuLmdldFJlc3VsdE1lc3NhZ2UoKSApIiBmaWVsZE5hbWU9IiRuLmdldFJlc3VsdE1lc3NhZ2UoKS5mcW5hbWUoKSIjZW5kIHR5cGU9IiRoZWxwZXIuZ2V0TmF0aXZlVHlwZU5hbWUoJG4udHlwZSgpKSIgaXNQcmltaXRpdmVUeXBlPSIkaGVscGVyLmlzQmFzaWNUeXBlKCRuLnR5cGUoKSkiIGlzQXJyYXk9IiRuLnR5cGUoKS5pc0FycmF5KCkiICNpZigkbi50eXBlKCkuaXNBcnJheSgpKWRpbWVuc2lvbj0iJG4udHlwZSgpLmRpbSgpIiNlbmQ+CisjaWYgKCRuLnJldHVybkRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5yZXR1cm5EZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJCTwvcmVzdWx0PgorCQkJPC9tZXRob2Q+CisJCQkKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyMgcmVzdWx0IG1lc3NhZ2UgCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoISRuLmlzT25ld2F5KCkpCisJCQk8bWV0aG9kIG5hbWU9IiRyLm5hbWUoKSIgdHlwZUlkPSIkaGVscGVyLmlkKCAkciApIiB0eXBlTmFtZT0iJHIuZnFuYW1lKCkiIGFzeW5jUmVjZWl2ZXJNb2RlPSIkci5nZXRBc3luY1JlY2VpdmVyKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIiBpc09uZXdheT0idHJ1ZSIgbWVzc2FnZURpcmVjdGlvbj0iJHIubXNnRGlyKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIiB0aW1lb3V0PSIkbi5nZXRUaW1lb3V0KCkiIHJlc3BvbnNlRmllbGQ9InJlc3VsdCI+CisjaWYgKCRyLmRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRuLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisjZW5kCQkJCisjZm9yZWFjaCggJHBhcmFtIGluICRyLml0ZXJhdG9yKCkgKQorCQkJCTxmaWVsZCBuYW1lPSIkcGFyYW0ubmFtZSgpIiBmaWVsZElkPSIkaGVscGVyLmlkKCAkcGFyYW0gKSIgZmllbGROYW1lPSIkcGFyYW0uZnFuYW1lKCkiIHR5cGU9IiRoZWxwZXIuZ2V0TmF0aXZlVHlwZU5hbWUoJHBhcmFtLnR5cGUoKSkiIGlzUHJpbWl0aXZlVHlwZT0iJGhlbHBlci5pc0Jhc2ljVHlwZSgkcGFyYW0udHlwZSgpKSIgaXNBcnJheT0iJHBhcmFtLnR5cGUoKS5pc0FycmF5KCkiICNpZigkcGFyYW0udHlwZSgpLmlzQXJyYXkoKSlkaW1lbnNpb249IiRwYXJhbS50eXBlKCkuZGltKCkiI2VuZD4KKyNpZiAoJHBhcmFtLmRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkcGFyYW0uZGVzY3IoKSkpPC9kZXNjcmlwdGlvbj4KKyNlbmQKKwkJCQk8L2ZpZWxkPgorI2VuZAorCQkJPC9tZXRob2Q+CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBhZGQgbWl4aW4gc3R1ZmYgaGVyZSAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZm9yZWFjaCggJHggaW4gJGludGYuaXRlcmF0b3IoKSApCisjaWYoICR4LmlzTWl4aW4oKSApCisjc2V0KCAkbSA9ICR4LmdldE1vZHVsZSgpICkKKyNzZXQoICR6ID0gJG0uaXRlcmF0b3IoKS5uZXh0KCkgKQorI2ZvcmVhY2goICRuIGluICR6Lm1lc3NhZ2VzKCB0cnVlICkgKQorI2lmKCEkbi5pc0hpZGRlbigpKQorI2lmICghJG4uaXNPbmV3YXkoKSkKKyNzZXQoICRyID0gJG4uZ2V0UmVzdWx0TWVzc2FnZSgpICkKKyNlbmQKKwkJCTxtZXRob2QgbmFtZT0iJG4ubmFtZSgpIiB0eXBlSWQ9IiRoZWxwZXIuaWQoICRuICkiIHR5cGVOYW1lPSIkbi5mcW5hbWUoKSIgYXN5bmNSZWNlaXZlck1vZGU9IiRuLmdldEFzeW5jUmVjZWl2ZXIoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkiIGlzT25ld2F5PSIkbi5pc09uZXdheSgpIiBtZXNzYWdlRGlyZWN0aW9uPSIkbi5nZXRNZXNzYWdlRGlyZWN0aW9uKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIiA+CisjaWYgKCRuLmRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCRuLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisjZW5kCQkJCQorI2lmICgkbi5oYXNUaHJvd24oKSkKKyNmb3JlYWNoKCAkdGhyb3duSXRlbSBpbiAkbi50aHJvd24oKS5pdGVyYXRvcigpICkKKwkJCQk8ZXhjZXB0aW9uIG5hbWU9IiR0aHJvd25JdGVtIiB0eXBlPSIkdGhyb3duSXRlbS5nZXROYW1lZCgpLmVmcW5hbWUoJGhlbHBlcikiPgorCQkJCQk8ZGVzY3JpcHRpb24+JGhlbHBlci5wcm90ZWN0Q0RhdGEoJGhlbHBlci5lbWl0WG1sKCR0aHJvd25JdGVtLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisJCQkJPC9leGNlcHRpb24+CisjZW5kCisjZW5kCisjaWYgKCRuLmhhc0F1dGgoKSkKKwkJCQk8YXV0aG9yaXplIG1ldGhvZE5hbWU9IiRuLmdldEF1dGgoKS5tZXRob2QoKSI+CisjZm9yZWFjaCggJGF1dGhBcmcgaW4gJG4uZ2V0QXV0aCgpLmFyZ3MoKSApCisJCQkJCTxhcmd1bWVudCBuYW1lPSIkYXV0aEFyZy52YWx1ZSgpIiAvPgorI2VuZAorCQkJCTwvYXV0aG9yaXplPgorI2VuZAorI2ZvcmVhY2goICRwYXJhbSBpbiAkbi5pdGVyYXRvcigpICkKKwkJCQk8ZmllbGQgbmFtZT0iJHBhcmFtLm5hbWUoKSIgZmllbGRJZD0iJGhlbHBlci5pZCggJHBhcmFtICkiIGZpZWxkTmFtZT0iJHBhcmFtLmZxbmFtZSgpIiB0eXBlPSIkaGVscGVyLmdldE5hdGl2ZVR5cGVOYW1lKCRwYXJhbS50eXBlKCkpIiBpc1ByaW1pdGl2ZVR5cGU9IiRoZWxwZXIuaXNCYXNpY1R5cGUoJHBhcmFtLnR5cGUoKSkiIGlzQXJyYXk9IiRwYXJhbS50eXBlKCkuaXNBcnJheSgpIiAjaWYoJHBhcmFtLnR5cGUoKS5pc0FycmF5KCkpZGltZW5zaW9uPSIkcGFyYW0udHlwZSgpLmRpbSgpIiNlbmQ+CisjaWYgKCRwYXJhbS5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJCTxkZXNjcmlwdGlvbj4kaGVscGVyLnByb3RlY3RDRGF0YSgkaGVscGVyLmVtaXRYbWwoJHBhcmFtLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisjZW5kCisJCQkJPC9maWVsZD4KKyNlbmQKKwkJCQk8cmVzdWx0ICNpZiAoISRuLmlzT25ld2F5KCkpZmllbGRJZD0iJGhlbHBlci5pZCggJG4uZ2V0UmVzdWx0TWVzc2FnZSgpICkiIGZpZWxkTmFtZT0iJG4uZ2V0UmVzdWx0TWVzc2FnZSgpLmZxbmFtZSgpIiNlbmQgdHlwZT0iJGhlbHBlci5nZXROYXRpdmVUeXBlTmFtZSgkbi50eXBlKCkpIiBpc1ByaW1pdGl2ZVR5cGU9IiRoZWxwZXIuaXNCYXNpY1R5cGUoJG4udHlwZSgpKSIgIGlzQXJyYXk9IiRuLnR5cGUoKS5pc0FycmF5KCkiICNpZigkbi50eXBlKCkuaXNBcnJheSgpKWRpbWVuc2lvbj0iJG4udHlwZSgpLmRpbSgpIiNlbmQ+CisjaWYgKCRuLnJldHVybkRlc2NyKCkuc2l6ZSgpID4gMCkKKwkJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5yZXR1cm5EZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorCQkJCTwvcmVzdWx0PgorCQkJPC9tZXRob2Q+CisJCQkKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyByZXN1bHQgbWl4ZWQtaW4gbWVzc2FnZQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoISRuLmlzT25ld2F5KCkpCisJCQk8bWV0aG9kIG5hbWU9IiRyLm5hbWUoKSIgdHlwZUlkPSIkaGVscGVyLmlkKCAkciApIiB0eXBlTmFtZT0iJHIuZnFuYW1lKCkiIGFzeW5jUmVjZWl2ZXJNb2RlPSIkci5nZXRBc3luY1JlY2VpdmVyKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIiBpc09uZXdheT0idHJ1ZSIgbWVzc2FnZURpcmVjdGlvbj0iJHIubXNnRGlyKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIiB0aW1lb3V0PSIkbi5nZXRUaW1lb3V0KCkiIHJlc3BvbnNlRmllbGQ9InJlc3VsdCIgPgorI2lmICgkci5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJPGRlc2NyaXB0aW9uPiRoZWxwZXIucHJvdGVjdENEYXRhKCRoZWxwZXIuZW1pdFhtbCgkbi5kZXNjcigpKSk8L2Rlc2NyaXB0aW9uPgorI2VuZAorI2ZvcmVhY2goICRwYXJhbSBpbiAkci5pdGVyYXRvcigpICkKKwkJCQk8ZmllbGQgbmFtZT0iJHBhcmFtLm5hbWUoKSIgZmllbGRJZD0iJGhlbHBlci5pZCggJHBhcmFtICkiIGZpZWxkTmFtZT0iJHBhcmFtLmZxbmFtZSgpIiB0eXBlPSIkaGVscGVyLmdldE5hdGl2ZVR5cGVOYW1lKCRwYXJhbS50eXBlKCkpIiBpc1ByaW1pdGl2ZVR5cGU9IiRoZWxwZXIuaXNCYXNpY1R5cGUoJHBhcmFtLnR5cGUoKSkiIGlzQXJyYXk9IiRwYXJhbS50eXBlKCkuaXNBcnJheSgpIiAjaWYoJHBhcmFtLnR5cGUoKS5pc0FycmF5KCkpZGltZW5zaW9uPSIkcGFyYW0udHlwZSgpLmRpbSgpIiNlbmQ+CisjaWYgKCRwYXJhbS5kZXNjcigpLnNpemUoKSA+IDApCisJCQkJCTxkZXNjcmlwdGlvbj4kaGVscGVyLnByb3RlY3RDRGF0YSgkaGVscGVyLmVtaXRYbWwoJHBhcmFtLmRlc2NyKCkpKTwvZGVzY3JpcHRpb24+CisjZW5kCisJCQkJPC9maWVsZD4KKyNlbmQKKwkJCTwvbWV0aG9kPgorI2VuZAorI2VuZAorI2VuZAorI2VuZAorI2VuZAorCisjIyAtLS0tLS0gZW5kIG1peGluIHN0dWZmIGhlcmUgLS0tLS0tCisJCTwvbWV0aG9kcz4KKyMjIGl0ZXJhdGUgb3ZlciByYXcgbWVzc2FnZXMsIGFuZCBkZWZpbmUgdGhlbSBhbGwgaGVyZQorCis8L3NlcnZpY2U+Cis8L21vZHVsZT4KKworCmRpZmYgLS1naXQgYS9idWlsZC1zdXBwb3J0L05Vbml0VG9KVW5pdC54c2wgYi9idWlsZC1zdXBwb3J0L05Vbml0VG9KVW5pdC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0YTgyOAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLXN1cHBvcnQvTlVuaXRUb0pVbml0LnhzbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0idXRmLTgiIHZlcnNpb249IjEuMCIgY2RhdGEtc2VjdGlvbi1lbGVtZW50cz0iZmFpbHVyZSIgLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3QtcmVzdWx0cy90ZXN0LXN1aXRlIj4KKworICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RjYXNlcyIgc2VsZWN0PSIvL3Rlc3Qtc3VpdGVbLi9yZXN1bHRzL3Rlc3QtY2FzZV0iLz4KKyAgICAgICAgPCEtLQorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFzbUNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdGVzdGNhc2VzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlc3RjYXNlc1sxXS8uLi8uLi9AbmFtZSIvPjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgLS0+CisgICAgICAgIDx0ZXN0c3VpdGUgbmFtZT0iTlVuaXRUZXN0cyIgdGltZT0ie0B0aW1lfSIgdGVzdHM9Intjb3VudCgkdGVzdGNhc2VzLy90ZXN0LWNhc2UpfSIKKyAgICAgICAgICAgIGVycm9ycz0iIiBmYWlsdXJlcz0ie2NvdW50KCR0ZXN0Y2FzZXMvL3Rlc3QtY2FzZS9mYWlsdXJlKX0iPgorCisgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRlc3RjYXNlcyI+CisKKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN1aXRlIiBzZWxlY3Q9Ii4iLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImdlbmVyYWxmYWlsdXJlIiBzZWxlY3Q9Ii4vZmFpbHVyZSIvPgorICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLy90ZXN0LWNhc2UiPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENsYXNzIiBzZWxlY3Q9ImNvbmNhdChzdWJzdHJpbmctYmVmb3JlKC4vQG5hbWUsIC4vLi4vLi4vQG5hbWUpLCAuLy4uLy4uL0BuYW1lKSIgLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3ROYW1lIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlciguL0BuYW1lLCBjb25jYXQoJHRlc3RDbGFzcywnLicpKSIgLz4KKworICAgICAgICAgICAgICAgIDx0ZXN0Y2FzZSBjbGFzc25hbWU9InskdGVzdENsYXNzfSIgbmFtZT0ieyR0ZXN0TmFtZX0iIHRpbWU9InsuL0B0aW1lfSIgPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4vZmFpbHVyZSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsc3RhY2siIHNlbGVjdD0iY291bnQoLi9mYWlsdXJlL3N0YWNrLXRyYWNlLyopICsgY291bnQoLi9mYWlsdXJlL3N0YWNrLXRyYWNlL3RleHQoKSkiLz4KKyAgICAgICAgICAgICAgICA8ZmFpbHVyZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZhaWxzdGFjayAmZ3Q7IDAgb3Igbm90KCRnZW5lcmFsZmFpbHVyZSkiPgorTUVTU0FHRTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vZmFpbHVyZS9tZXNzYWdlIi8+CisrKysrKysrKysrKysrKysrKysrCitTVEFDSyBUUkFDRTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vZmFpbHVyZS9zdGFjay10cmFjZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorTUVTU0FHRTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnZW5lcmFsZmFpbHVyZS9tZXNzYWdlIi8+CisrKysrKysrKysrKysrKysrKysrCitTVEFDSyBUUkFDRTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnZW5lcmFsZmFpbHVyZS9zdGFjay10cmFjZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPC9mYWlsdXJlPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDwvdGVzdGNhc2U+CisgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKworICAgICAgICA8L3Rlc3RzdWl0ZT4KKworICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvYnVpbGQtc3VwcG9ydC9SRUFETUUudHh0IGIvYnVpbGQtc3VwcG9ydC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2QwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC1zdXBwb3J0L1JFQURNRS50eHQKQEAgLTAsMCArMSw1IEBACitTaGFyZWQgYW50LXRhcmdldHMgYW5kIG1hY3Jvcy4KKworQ2F0Y2ggYWxsLCBhbnQvYnVpbGQgc3VwcG9ydCBzdHVmZi4KKworCmRpZmYgLS1naXQgYS9idWlsZC1zdXBwb3J0L2RlZmF1bHRfaGVhZGVyLnR4dCBiL2J1aWxkLXN1cHBvcnQvZGVmYXVsdF9oZWFkZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzU0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC1zdXBwb3J0L2RlZmF1bHRfaGVhZGVyLnR4dApAQCAtMCwwICsxLDE3IEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwpkaWZmIC0tZ2l0IGEvYnVpbGQtc3VwcG9ydC9kZXBlbmRlbmNpZXMueG1sIGIvYnVpbGQtc3VwcG9ydC9kZXBlbmRlbmNpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NmRlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC1zdXBwb3J0L2RlcGVuZGVuY2llcy54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtZGVwZW5kZW5jaWVzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJjaGVjay1hbGwiPgorICAgIDxkZXNjcmlwdGlvbj5FdGNoIERlcGVuZGVuY2llczwvZGVzY3JpcHRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYmFzZWRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4iIC8+CisgICAgCisgICAgPCEtLSBMb2FkIEVudmlyb25tZW50IC0tPgorICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52IiAvPgorICAgIAorICAgIDwhLS0gTG9hZCBkZXBlbmRlbmNpZXMgLS0+CisgICAgPHByb3BlcnR5IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC5kZXBlbmRlbmNpZXMiIHByZWZpeD0iZGVmYXVsdCIgLz4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrLWphdmFjYyIgPgorICAgICAgICA8ZmFpbCBtZXNzYWdlPSIke2RlZmF1bHQuamF2YWNjLmhvbWV9L2Jpbi9saWIvamF2YWNjLmphciBjYW5ub3QgYmUgZm91bmQuIFBsZWFzZSBzZXQgJ2phdmFjYy5ob21lJyBpbiBidWlsZC5kZXBlbmRlbmNpZXMiPgorICAgICAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICAgICAgICA8bm90PjxhdmFpbGFibGUgZmlsZT0iJHtkZWZhdWx0LmphdmFjYy5ob21lfS9iaW4vbGliL2phdmFjYy5qYXIiIC8+PC9ub3Q+CisgICAgICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgICAgPC9mYWlsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJVc2luZyAke2RlZmF1bHQuamF2YWNjLmhvbWV9L2Jpbi9saWIvamF2YWNjLmphciAuLi4iIC8+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJjaGVjay1qdW5pdCI+CisgICAgICAgIDxmYWlsIG1lc3NhZ2U9IiR7ZGVmYXVsdC5qdW5pdC5saWJ9L2p1bml0LTQuMy4xLmphciBjYW5ub3QgYmUgZm91bmQuIFBsZWFzZSBzZXQgJ2p1bml0LmxpYicgaW4gYnVpbGQuZGVwZW5kZW5jaWVzIj4KKyAgICAgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgICAgICAgPG5vdD48YXZhaWxhYmxlIGZpbGU9IiR7ZGVmYXVsdC5qdW5pdC5saWJ9L2p1bml0LTQuMy4xLmphciIgLz48L25vdD4KKyAgICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8L2ZhaWw+ICAgICAgICAKKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iVXNpbmcgJHtkZWZhdWx0Lmp1bml0LmxpYn0vanVuaXQtNC4zLjEuamFyIC4uLiIgLz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrLXZlbG9jaXR5Ij4KKyAgICAgICAgPGZhaWwgbWVzc2FnZT0iJHtkZWZhdWx0LnZlbG9jaXR5LmxpYn0vdmVsb2NpdHktZGVwLTEuNS5qYXIgY2Fubm90IGJlIGZvdW5kLiBQbGVhc2Ugc2V0ICd2ZWxvY2l0eS5saWInIGluIGJ1aWxkLmRlcGVuZGVuY2llcyI+CisgICAgICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgICAgICAgIDxub3Q+PGF2YWlsYWJsZSBmaWxlPSIke2RlZmF1bHQudmVsb2NpdHkubGlifS92ZWxvY2l0eS1kZXAtMS41LmphciIgLz48L25vdD4KKyAgICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8L2ZhaWw+ICAgICAgICAKKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iVXNpbmcgJHtkZWZhdWx0LnZlbG9jaXR5LmxpYn0vdmVsb2NpdHktZGVwLTEuNS5qYXIgLi4uIiAvPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iY2hlY2stZG90bmV0IiA+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkFOVC1ET1RORVQiIC8+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJjaGVjay1hbGwiIGRlcGVuZHM9ImNoZWNrLWphdmFjYyxjaGVjay1qdW5pdCxjaGVjay12ZWxvY2l0eSxjaGVjay1kb3RuZXQiIC8+CisgICAgCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1aWxkLXN1cHBvcnQvZXRjaC5jb21tb24ueG1sIGIvYnVpbGQtc3VwcG9ydC9ldGNoLmNvbW1vbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjZjUzNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLXN1cHBvcnQvZXRjaC5jb21tb24ueG1sCkBAIC0wLDAgKzEsMzE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPHByb2plY3QgbmFtZT0iZXRjaC5jb21tb24iIGJhc2VkaXI9Ii4iID4KKworICAgIDwhLS0gU3RhdGljIHByb3BlcnRpZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guY29weXJpZ2h0Tm90aWNlIiAgICB2YWx1ZT0iQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiIgLz4KKworICAgIDwhLS0gTG9hZCBFbnZpcm9ubWVudCAtLT4KKyAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KKyAgICA8cHJvcGVydHkgZmlsZT0iJHtFdGNoLmJhc2VkaXJ9L2J1aWxkLmRlcGVuZGVuY2llcyIgcHJlZml4PSJidWlsZCIgLz4KKworICAgIDwhLS0gVmFsaWRhdGUgcHJvcGVydGllcyAtLT4KKyAgICAKKyAgICA8IS0tIENvbXB1dGUgdG9wIG9mIHRyZWUgLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iRXRjaC5iYXNlZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfSIgPgorICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0iRXRjaC5iYXNlZGlyIiAvPjwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLnJ1bnRpbWUud29ya3NwYWNlIiB2YWx1ZT0iJHtFdGNoLmJhc2VkaXJ9IiAvPgorCisgICAgPCEtLSBsb2FkIHJ1bnRpbWUgcHJvcGVydGllcyAtLT4KKyAgICA8cHJvcGVydHkgcHJlZml4PSJFdGNoLnByb3BlcnR5LiIgICAgICBmaWxlPSIke0V0Y2guYmFzZWRpcn0vZXRjaC5wcm9wZXJ0aWVzIiAvPgorICAgIDxwcm9wZXJ0eSBwcmVmaXg9IkV0Y2gucnVudGltZS4iICAgICAgIGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9iYW1ib28ucHJvcGVydGllcyIgLz4KKyAgICAKKyAgICA8IS0tIENvbXB1dGUgdmVyc2lvbiBudW1iZXJzIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IkV0Y2gucHJvcGVydHkubWFqb3JWZXJzaW9uIiB2YWx1ZT0iMCI+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJFdGNoLnByb3BlcnR5Lm1ham9yVmVyc2lvbiIgLz48L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJFdGNoLnByb3BlcnR5Lm1pbm9yVmVyc2lvbiIgdmFsdWU9IjAiID4KKyAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9IkV0Y2gucHJvcGVydHkubWlub3JWZXJzaW9uIiAvPjwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IkV0Y2gucHJvcGVydHkucGF0Y2hWZXJzaW9uIiB2YWx1ZT0iMCIgPgorICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0iRXRjaC5wcm9wZXJ0eS5wYXRjaFZlcnNpb24iIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iRXRjaC5ydW50aW1lLmJ1aWxkS2V5IiB2YWx1ZT0iTE9DQUwiID4KKyAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9IkV0Y2gucnVudGltZS5idWlsZEtleSIgLz48L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJFdGNoLnJ1bnRpbWUuYnVpbGROdW1iZXIiIHZhbHVlPSIwIiA+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJFdGNoLnJ1bnRpbWUuYnVpbGROdW1iZXIiIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iRXRjaC5ydW50aW1lLnJldmlzaW9uTnVtYmVyIiB2YWx1ZT0iMCIgPgorICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0iRXRjaC5ydW50aW1lLnJldmlzaW9uTnVtYmVyIiAvPjwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IkV0Y2gucHJvcGVydHkuc3VmZml4IiB2YWx1ZT0iIiA+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJFdGNoLnByb3BlcnR5LnN1ZmZpeCIgLz48L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLnRhcmdldCIgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7RXRjaC5iYXNlZGlyfS90YXJnZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guZGlzdCIgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLnRhcmdldH0vSW5zdGFsbGVycy9kaXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmNsb3Zlci1kaXN0IiAgICAgICAgICAgbG9jYXRpb249IiR7RXRjaC50YXJnZXR9L0luc3RhbGxlcnMvZGlzdC1jbG92ZXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guc3VwcG9ydCIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLnRhcmdldH0vU3VwcG9ydC9kaXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmNsb3Zlci1zdXBwb3J0IiAgICAgICAgbG9jYXRpb249IiR7RXRjaC50YXJnZXR9L1N1cHBvcnQvZGlzdC1jbG92ZXIiIC8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC52ZXJzaW9uIiAgICAgICAgICAgICAgIHZhbHVlPSIke0V0Y2gucHJvcGVydHkubWFqb3JWZXJzaW9ufS4ke0V0Y2gucHJvcGVydHkubWlub3JWZXJzaW9ufS4ke0V0Y2gucHJvcGVydHkucGF0Y2hWZXJzaW9ufSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5sb25ndmVyc2lvbiIgICAgICAgICAgIHZhbHVlPSIke0V0Y2gudmVyc2lvbn0ke0V0Y2gucHJvcGVydHkuc3VmZml4fSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5sb25nbmFtZSIgICAgICAgICAgICAgIHZhbHVlPSJhcGFjaGUtZXRjaC0ke0V0Y2gubG9uZ3ZlcnNpb259IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLnNob3J0dmVyc2lvbiIgICAgICAgICAgdmFsdWU9IiR7RXRjaC5wcm9wZXJ0eS5tYWpvclZlcnNpb259LiR7RXRjaC5wcm9wZXJ0eS5taW5vclZlcnNpb259IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJ1aWxkVGFnIiAgICAgICAgICAgICAgdmFsdWU9IiR7RXRjaC5ydW50aW1lLmJ1aWxkS2V5fS0ke0V0Y2gucnVudGltZS5idWlsZE51bWJlcn0iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYnVpbGRTdXBwb3J0RGlyZWN0b3J5IiBsb2NhdGlvbj0iJHtFdGNoLmJhc2VkaXJ9L2J1aWxkLXN1cHBvcnQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2gubG9nRGlyZWN0b3J5IiAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLnRhcmdldH0vQnVpbGRMb2dzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmluc3RhbGxlckRpcmVjdG9yeSIgICAgbG9jYXRpb249IiR7RXRjaC50YXJnZXR9L0luc3RhbGxlcnMiIC8+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJFdGNoLnJ1bnRpbWUudGVzdHMuZmFpbCIgdmFsdWU9IiR7RXRjaC50YXJnZXR9XGZhaWwiPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImJ1aWxkLnB1Ymxpc2giIC8+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8IS0tIGRlZmluZSBhcnRpZmFjdHMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtY29tcGlsZXIuamFyIiAgICAgICAgICAgIHZhbHVlPSJldGNoLWNvbXBpbGVyLSR7RXRjaC52ZXJzaW9ufS5qYXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtY29tcGlsZXItc3JjLnppcCIgICAgICAgIHZhbHVlPSJldGNoLWNvbXBpbGVyLSR7RXRjaC52ZXJzaW9ufS1zcmMuemlwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtY29tcGlsZXIuamFyIiAgICAgICB2YWx1ZT0iZXRjaC1qYXZhLWNvbXBpbGVyLSR7RXRjaC52ZXJzaW9ufS5qYXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtamF2YS1jb21waWxlci1zcmMuemlwIiAgIHZhbHVlPSJldGNoLWphdmEtY29tcGlsZXItJHtFdGNoLnZlcnNpb259LXNyYy56aXAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtamF2YS1ydW50aW1lLmphciIgICAgICAgIHZhbHVlPSJldGNoLWphdmEtcnVudGltZS0ke0V0Y2gudmVyc2lvbn0uamFyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtcnVudGltZS1zcmMuemlwIiAgICB2YWx1ZT0iZXRjaC1qYXZhLXJ1bnRpbWUtJHtFdGNoLnZlcnNpb259LXNyYy56aXAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtY3NoYXJwLWNvbXBpbGVyLmphciIgICAgIHZhbHVlPSJldGNoLWNzaGFycC1jb21waWxlci0ke0V0Y2gudmVyc2lvbn0uamFyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWNzaGFycC1jb21waWxlci1zcmMuemlwIiB2YWx1ZT0iZXRjaC1jc2hhcnAtY29tcGlsZXItJHtFdGNoLnZlcnNpb259LXNyYy56aXAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gteG1sLWNvbXBpbGVyLmphciIgICAgICAgIHZhbHVlPSJldGNoLXhtbC1jb21waWxlci0ke0V0Y2gudmVyc2lvbn0uamFyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLXhtbC1jb21waWxlci1zcmMuemlwIiAgICB2YWx1ZT0iZXRjaC14bWwtY29tcGlsZXItJHtFdGNoLnZlcnNpb259LXNyYy56aXAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtdXRpbC5qYXIiICAgICAgICAgICAgICAgIHZhbHVlPSJldGNoLXV0aWwtJHtFdGNoLnZlcnNpb259LmphciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC11dGlsLXNyYy56aXAiICAgICAgICAgICAgdmFsdWU9ImV0Y2gtdXRpbC0ke0V0Y2gudmVyc2lvbn0tc3JjLnppcCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC1hbnQtdGFzay5qYXIiICAgICAgICAgICAgdmFsdWU9ImV0Y2gtYW50LXBsdWdpbi0ke0V0Y2gudmVyc2lvbn0uamFyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWFudC10YXNrLXNyYy56aXAiICAgICAgICB2YWx1ZT0iZXRjaC1hbnQtcGx1Z2luLSR7RXRjaC52ZXJzaW9ufS1zcmMuemlwIiAvPgorCisgICAgPCEtLSBEZWZpbmUgZmlsdGVyc2V0IGZvciBidWlsZC10aW1lIHN1YnN0aXR1dGlvbnMgLS0+CisgICAgPGZpbHRlcnNldCBpZD0iRXRjaC5idWlsZFRva2VucyIgPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJFdGNoVmVyc2lvbiIgICAgICAgICAgICAgICB2YWx1ZT0iJHtFdGNoLnZlcnNpb259IiAvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJFdGNoTG9uZ1ZlcnNpb24iICAgICAgICAgICB2YWx1ZT0iJHtFdGNoLmxvbmd2ZXJzaW9ufSIgLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iRXRjaExvbmdOYW1lIiAgICAgICAgICAgICAgdmFsdWU9IiR7RXRjaC5sb25nbmFtZX0iIC8+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IkV0Y2hCdWlsZFRhZyIgICAgICAgICAgICAgIHZhbHVlPSIke0V0Y2guYnVpbGRUYWd9IiAvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJFdGNoUnVudGltZVJldmlzaW9uTnVtYmVyIiB2YWx1ZT0iJHtFdGNoLnJ1bnRpbWUucmV2aXNpb25OdW1iZXJ9IiAvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJFdGNoUnVudGltZUJ1aWxkS2V5IiAgICAgICB2YWx1ZT0iJHtFdGNoLnJ1bnRpbWUuYnVpbGRLZXl9IiAvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJFdGNoUnVudGltZUJ1aWxkTnVtYmVyIiAgICB2YWx1ZT0iJHtFdGNoLnJ1bnRpbWUuYnVpbGROdW1iZXJ9IiAvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJFdGNoTWFqb3JWZXJzaW9uIiAgICAgICAgICB2YWx1ZT0iJHtFdGNoLnByb3BlcnR5Lm1ham9yVmVyc2lvbn0iIC8+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IkV0Y2hNaW5vclZlcnNpb24iICAgICAgICAgIHZhbHVlPSIke0V0Y2gucHJvcGVydHkubWlub3JWZXJzaW9ufSIgLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iRXRjaFBhdGNoVmVyc2lvbiIgICAgICAgICAgdmFsdWU9IiR7RXRjaC5wcm9wZXJ0eS5wYXRjaFZlcnNpb259IiAvPgorICAgIDwvZmlsdGVyc2V0PgorCisgICAgPCEtLSBUT0RPOiBNaWdyYXRlIHRvIC5ORVQgdGFza3MgZm9yIEFOVCAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0idG9vbC52cy0yazUtdGFzayIgdmFsdWU9IiR7RXRjaC5ydW50aW1lLndvcmtzcGFjZX0vc2NyaXB0cy92cy0yazUtdGFzay5iYXQiIC8+CisKKyAgICA8IS0tIE5TSVMgaW5zdGFsbGVyIHN1cHBvcnQgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InRvb2wubWFrZW5zaXMiICAgIHZhbHVlPSIke2J1aWxkLm5zaXMuaG9tZX1cbWFrZW5zaXMuZXhlIiAvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Ik5TSVMuZW5hYmxlZCI+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIiAvPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke3Rvb2wubWFrZW5zaXN9IiAvPgorICAgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICAKKyAgICA8dGVtcGZpbGUgcHJvcGVydHk9IkV0Y2guYnVpbGQudG1wZGlyIiBkZXN0ZGlyPSIvdG1wIiAvPgorCisgICAgPHByb3BlcnR5ICAgbmFtZT0iRXRjaC5kZXBlbmRlbmN5LmphdmFjYy5ob21lIiB2YWx1ZT0iJHtidWlsZC5qYXZhY2MuaG9tZX0iIC8+CisgICAgPHByb3BlcnR5ICAgbmFtZT0iRXRjaC5kZXBlbmRlbmN5Lmp1bml0LmphciIgbG9jYXRpb249IiR7YnVpbGQuanVuaXQubGlifS9qdW5pdC00LjMuMS5qYXIiIC8+CisgICAgPHByb3BlcnR5ICAgbmFtZT0iRXRjaC5kZXBlbmRlbmN5LnZlbG9jaXR5LmphciIgdmFsdWU9IiR7YnVpbGQudmVsb2NpdHkubGlifS92ZWxvY2l0eS0xLjUuamFyIiAvPgorICAgIDxwcm9wZXJ0eSAgIG5hbWU9IkV0Y2guZGVwZW5kZW5jeS52ZWxvY2l0eS1kZXAuamFyIiB2YWx1ZT0iJHtidWlsZC52ZWxvY2l0eS5saWJ9L3ZlbG9jaXR5LWRlcC0xLjUuamFyIiAvPgorICAgIDxwcm9wZXJ0eSAgIG5hbWU9IkV0Y2guZGVwZW5kZW5jeS5hbnQtZG90bmV0LTEuMC5qYXIiIHZhbHVlPSIke2J1aWxkLmFudC1kb3RuZXQubGlifS9hbnQtZG90bmV0LTEuMC5qYXIiIC8+CisKKyAgICA8IS0tIENzaGFycCBTdXBwb3J0IC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IlVTRS5kb3RuZXQiPgorICAgICAgICA8YW5kPgorICAgICAgICAgICAgPG9zIGZhbWlseT0id2luZG93cyIgLz4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtidWlsZC5kb3RuZXQuaG9tZX0vbXNidWlsZC5leGUiIC8+CisgICAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IlVTRS5tb25vIj4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxub3Q+PG9zIGZhbWlseT0id2luZG93cyIgLz48L25vdD4KKyAgICAgICAgICAgIDwhLS0gVE9ETyBtb25vIHN1cHBvcnQgaXMgbm90IGZ1bGx5IGJha2VkLCB1c2UgLURVU0UubW9ubyB0byB0ZXN0IC0tPgorICAgICAgICAgICAgPCEtLSA8YXZhaWxhYmxlIGZpbGU9IiR7YnVpbGQubW9uby5ob21lfS9iaW4vbWR0b29sIiAvPiAtLT4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iVVNFLm1vbm8iIC8+CisgICAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IkJVSUxELmNzaGFycCI+CisgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iVVNFLmRvdG5ldCIgLz4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iVVNFLm1vbm8iIC8+CisgICAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9InRvb2wubWR0b29sIiB2YWx1ZT0iJHtidWlsZC5tb25vLmhvbWV9L2Jpbi9tZHRvb2wiIC8+CisKKyAgICA8IS0tIGNsb3ZlciBzdXBwb3J0IC0tPgorICAgIDwhLS0gVE9ETzogbWFrZSB0aGlzIHRvZ2dsZS1hYmxlIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJXaXRoLmNsb3ZlciIgdmFsdWU9InRydWUiIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iQ2xvdmVyLmVuYWJsZWQiID4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtidWlsZC5jbG92ZXIuaG9tZX0vbGliL2Nsb3Zlci5qYXIiIC8+CisgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9IldpdGguY2xvdmVyIiAvPgorICAgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5kZXBlbmRlbmN5LmNsb3Zlci5qYXIiIHZhbHVlPSIke2J1aWxkLmNsb3Zlci5ob21lfS9saWIvY2xvdmVyLmphciIgLz4KKyAgICA8dGFza2RlZiByZXNvdXJjZT0iY2xvdmVybGliLnhtbCIgY2xhc3NwYXRoPSIke0V0Y2guZGVwZW5kZW5jeS5jbG92ZXIuamFyfSIgLz4KKyAgICA8IS0tIElmIENsb3ZlciBpcyBlbmFibGVkLCB1c2UgdGhlIGNsb3ZlciB2ZXJzaW9uIG9mIHRoZSBFdGNoIGJ1aWxkLCB0aGlzCisgICAgICAgICBhbGxvd3MgY29kZS1jb3ZlcmFnZSBtZXRyaWNzIHRvIGJlIGNvbGxlY3RlZCB0aHJvdWdob3V0IHRoZSBidWlsZCBwcm9jZXNzIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IkV0Y2guSE9NRSIgdmFsdWU9IiR7RXRjaC5jbG92ZXItZGlzdH0iID4KKyAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtDbG92ZXIuZW5hYmxlZH0iIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iRXRjaC5IT01FIiB2YWx1ZT0iJHtFdGNoLmRpc3R9IiA+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJFdGNoLkhPTUUiIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iRXRjaC5TVVBQT1JUIiB2YWx1ZT0iJHtFdGNoLmNsb3Zlci1zdXBwb3J0fSIgPgorICAgICAgICA8aXN0cnVlIHZhbHVlPSIke0Nsb3Zlci5lbmFibGVkfSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJFdGNoLlNVUFBPUlQiIHZhbHVlPSIke0V0Y2guc3VwcG9ydH0iID4KKyAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9IkV0Y2guU1VQUE9SVCIgLz48L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iQ2xvdmVyLnBhdGgiIGxvY2F0aW9uPSIke0V0Y2guY2xvdmVyLWRpc3R9L2Nsb3ZlciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iQ2xvdmVyLmRiLnBhdGgiIGxvY2F0aW9uPSIke0Nsb3Zlci5wYXRofS9kYiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iQ2xvdmVyLmRiIiBsb2NhdGlvbj0iJHtDbG92ZXIuZGIucGF0aH0vY2xvdmVyLm1hc3Rlci5kYiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iQ2xvdmVyLmNvdmVyYWdlIiBsb2NhdGlvbj0iJHtDbG92ZXIucGF0aH0vY29kZS1jb3ZlcmFnZS1yZXN1bHRzIiAvPgorICAgIAorICAgIDwhLS0gcHJvcGVydGllcyBmb3IgZXhhbXBsZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9IkVYQU1QTEUuZXRjaC5ob21lIiB2YWx1ZT0iJHtFdGNoLmRpc3R9IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFWEFNUExFLmV0Y2gudmVyc2lvbiIgdmFsdWU9IiR7RXRjaC52ZXJzaW9ufSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iRVhBTVBMRS5hbnQuZG90bmV0LmphciIgdmFsdWU9IiR7RXRjaC5kZXBlbmRlbmN5LmFudC1kb3RuZXQtMS4wLmphcn0iIC8+CisgICAgCisgICAgPCEtLSBjc2hhcnAgc3VwcG9ydCAtLT4KKyAgICA8dGFza2RlZiBvbmVycm9yPSJyZXBvcnQiIHJlc291cmNlPSJvcmcvYXBhY2hlL2FudC9kb3RuZXQvYW50bGliLnhtbCIgY2xhc3NwYXRoPSIke0V0Y2guZGVwZW5kZW5jeS5hbnQtZG90bmV0LTEuMC5qYXJ9IiAvPgorCisgICAgPCEtLSBkZXBlbmRlbmNpZXMgLS0+CisgICAgPCEtLSBUT0RPOiByZW1vdmUgY2xvdmVyIHJlZmVyZW5jZSBpZiBjbG92ZXItZGlzYWJsZWQgLS0+CisgICAgPHBhdGggaWQ9IkV0Y2guZGVwZW5kZW5jaWVzLmphci5wYXRocyI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kudmVsb2NpdHktZGVwLmphcn0iIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyfSIgLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5jbG92ZXIuamFyfSIgLz4KKyAgICA8L3BhdGg+CisKKyAgICA8IS0tIG1hY3JvcyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iYnVpbGRfY29tcG9uZW50IiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9vdCIgICAgIGRlZmF1bHQ9Ii4iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiAgICAgIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiAgIGRlZmF1bHQ9IiR7RXRjaC5idWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNjcmlwdCIgICBkZWZhdWx0PSJidWlsZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbnRmaWxlIiAgZGVmYXVsdD0iQHtzY3JpcHR9LnhtbCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dsYWJlbCIgZGVmYXVsdD0iQHtkaXJ9IiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgICBkZWZhdWx0PSIke0V0Y2gubG9nRGlyZWN0b3J5fS9Ae2xvZ2xhYmVsfS5Ae3RhcmdldH0udHh0IiAvPgorICAgICAgICA8ZWxlbWVudCAgIG5hbWU9ImNvbXBvbmVudEFudEVsZW1lbnRzIiBvcHRpb25hbD0idHJ1ZSIgaW1wbGljaXQ9InRydWUiIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iQHtsb2dsYWJlbH0uQHt0YXJnZXR9IiAvPgorICAgICAgICAgICAgPGFudCBkaXI9IkB7cm9vdH0vQHtkaXJ9IiBhbnRmaWxlPSJAe2FudGZpbGV9IiBpbmhlcml0QWxsPSJmYWxzZSIgaW5oZXJpdFJlZnM9ImZhbHNlIiBvdXRwdXQ9IkB7b3V0cHV0fSIgdGFyZ2V0PSJAe3RhcmdldH0iPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eXNldCBpZD0iYnVpbGQtcGFyYW1ldGVycyI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eXJlZiBuYW1lPSJETy5tYXZlbi5pbnN0YWxsIiAvPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHlyZWYgbmFtZT0iYnVpbGQudGVzdHMuZmFpbCIgLz4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5c2V0PgorICAgICAgICAgICAgICAgIDxjb21wb25lbnRBbnRFbGVtZW50cyAvPgorICAgICAgICAgICAgPC9hbnQ+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIAorICAgIDxtYWNyb2RlZiBuYW1lPSJidWlsZF9leGFtcGxlIiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9vdCIgICAgIGRlZmF1bHQ9Ii4iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiAgICAgIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NyaXB0IiAgIGRlZmF1bHQ9ImJ1aWxkIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFudGZpbGUiICBkZWZhdWx0PSJAe3NjcmlwdH0ueG1sIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZ2xhYmVsIiBkZWZhdWx0PSJAe2Rpcn0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9nZGlyIiAgIGRlZmF1bHQ9ImxvZ3MiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiAgIGRlZmF1bHQ9IiR7RXRjaC5idWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgICBkZWZhdWx0PSJAe2xvZ2Rpcn0vQHtsb2dsYWJlbH0udHh0IiAvPgorICAgICAgICA8ZWxlbWVudCAgIG5hbWU9ImNvbXBvbmVudEFudEVsZW1lbnRzIiBvcHRpb25hbD0idHJ1ZSIgaW1wbGljaXQ9InRydWUiIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtsb2dkaXJ9IiAvPgorICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iQHtsb2dsYWJlbH0iIC8+CisgICAgICAgICAgICA8YW50IGRpcj0iQHtyb290fS9Ae2Rpcn0iIGFudGZpbGU9IkB7YW50ZmlsZX0iIGluaGVyaXRBbGw9ImZhbHNlIiBpbmhlcml0UmVmcz0iZmFsc2UiIG91dHB1dD0iQHtvdXRwdXR9IiB0YXJnZXQ9IkB7dGFyZ2V0fSI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5c2V0IGlkPSJleGFtcGxlcy1wYXJhbWV0ZXJzIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5cmVmIHByZWZpeD0iRVhBTVBMRSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSJFWEFNUExFLioiIHRvPSIqIiAvPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHlzZXQ+CisgICAgICAgICAgICAgICAgPGNvbXBvbmVudEFudEVsZW1lbnRzIC8+CisgICAgICAgICAgICA8L2FudD4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+ICAgIAorICAgIAorCisgICAgPCEtLSB0b2tlbiBmaWx0ZXIgbWFjcm8gLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9InVwZGF0ZS10b2tlbnMiID4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlbmFtZSIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZW1wbGF0ZSIgZGVmYXVsdD0iQHtmaWxlbmFtZX0udG1wbCIgLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8IS0tIEdlbmVyYXRlIHZlcnNpb24gaW5mbyAtLT4KKyAgICAgICAgICAgIDxjb3B5IHRvZmlsZT0iQHtmaWxlbmFtZX0iIGZpbGU9IkB7dGVtcGxhdGV9IiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9IkV0Y2guYnVpbGRUb2tlbnMiIC8+CisgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPCEtLSBOU0lTIG1hY3JvIC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJtYWtlbnNpcyI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9vdCIgICAgICAgIGRlZmF1bHQ9Ii4iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiAgICAgICAgIGRlZmF1bHQ9Ii4iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiAgICAgIGRlZmF1bHQ9IiR7RXRjaC5idWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNjcmlwdCIgICAgICBkZWZhdWx0PSJteXNjcmlwdCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dsYWJlbCIgICAgZGVmYXVsdD0iQHtzY3JpcHR9IiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiAgICBkZWZhdWx0PSJAe3NjcmlwdH0tc2V0dXAuZXhlIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iICAgICBkZWZhdWx0PSIke0V0Y2gudmVyc2lvbn0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiAgICAgIGRlZmF1bHQ9IiR7RXRjaC5sb2dzRGlyZWN0b3J5fS9Ae2xvZ2xhYmVsfS5Ae3RhcmdldH0udHh0IiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiBkZWZhdWx0PSJmYWxzZSIgLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3Rvb2wubWFrZW5zaXN9IiBkaXI9IkB7cm9vdH0vQHtkaXJ9IiBmYWlsb25lcnJvcj0iQHtmYWlsb25lcnJvcn0iID4KKyAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIvVjQiIC8+CisgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iL0RQUk9EVUNUX1ZFUlNJT049QHt2ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIvRE9VVF9GSUxFPUB7ZGVzdGZpbGV9IiAvPgorICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9IkB7c2NyaXB0fS5uc2kiIC8+CisgICAgICAgICAgICA8L2V4ZWM+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIAorICAgIDwhLS0gQ2xvdmVyIG1hY3JvIC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJpbml0aWFsaXplLWNsb3ZlciIgPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiICAgICBkZWZhdWx0PSIke0Nsb3Zlci5lbmFibGVkfSIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiICAgICAgZGVmYXVsdD0ibm9uZSIgLz4KKyAgICAgICAgPGVsZW1lbnQgICBuYW1lPSJvcHRpb25zIiAgICAgaW1wbGljaXQ9InRydWUiIC8+IAorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDwhLS0gVE9ETzogZG8gbm90IG1ha2UgZGlyZWN0b3JpZXMgaWYgY2xvdmVyIGlzIGRpc2FibGVkIC0tPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtDbG92ZXIuZGIucGF0aH0vQHtzdWZmaXh9IiAvPgorICAgICAgICAgICAgPGNsb3Zlci1zZXR1cCAKKyAgICAgICAgICAgICAgICAgICAgaW5pdHN0cmluZz0iJHtDbG92ZXIuZGIucGF0aH0vQHtzdWZmaXh9L2Nsb3Zlci5kYiIKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZD0iQHtlbmFibGVkfSIKKyAgICAgICAgICAgICAgICAgICAgc291cmNlPSIxLjUiCisgICAgICAgICAgICAgICAgICAgIGZsdXNocG9saWN5PSJ0aHJlYWRlZCIKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hpbnRlcnZhbD0iOTAwMDAiID4KKyAgICAgICAgICAgICAgICA8b3B0aW9ucyAvPgorICAgICAgICAgICAgPC9jbG92ZXItc2V0dXA+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPCEtLSBNT05PIG1kdG9vbCBtYWNybyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0ibWR0b29sIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiICAgICAgICAgZGVmYXVsdD0iLiIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgZGVmYXVsdD0iZmFsc2UiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvamVjdCIgICAgIGRlZmF1bHQ9InByb2plY3QuY3Nwcm9qIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgICAgICBkZWZhdWx0PSIke0V0Y2guYnVpbGQudGFyZ2V0fSIgLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3Rvb2wubWR0b29sfSIgZGlyPSJAe2Rpcn0iIGZhaWxvbmVycm9yPSJAe2ZhaWxvbmVycm9yfSIgPgorICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9ImJ1aWxkIiAvPgorICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tYnVpbGRmaWxlOkB7cHJvamVjdH0iIC8+CisgICAgICAgICAgICA8L2V4ZWM+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIGIvYnVpbGQtc3VwcG9ydC9ldGNoLmluY2x1ZGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjgwNDRhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQtc3VwcG9ydC9ldGNoLmluY2x1ZGVzLnhtbApAQCAtMCwwICsxLDE1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2guaW5jbHVkZSIgZGVmYXVsdD0iaGVscCIgYmFzZWRpcj0iLiI+CisgIDxkZXNjcmlwdGlvbj5FdGNoIEFudCBJbmNsdWRlIGZpbGU8L2Rlc2NyaXB0aW9uPgorCisgIDwhLS0gU3RhbmRhcmQgUHJvcGVydGllcyBzaGFyZWQgYnkgYWxsIHN1Yi1wcm9qZWN0cyAtLT4KKyAgPGltcG9ydCBmaWxlPSJldGNoLmNvbW1vbi54bWwiIC8+CisKKyAgPCEtLSBTdGFuZGFyZCB0YXJnZXRzLCBkbyBub3QgbW9kaWZ5IG9yIG92ZXJsb2FkLiBPdmVybG9hZCB0aGUgImRvLSoiIHRhcmdldHMgaW4gZWFjaCBzdWItcHJvamVjdCAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZWJ1ZyIgICAgICAgICAgIGRlcGVuZHM9ImluaXQtRGVidWcsYWxsIiAvPgorICA8dGFyZ2V0IG5hbWU9IkRlYnVnIiAgICAgICAgICAgZGVwZW5kcz0iZGVidWciIC8+CisgIDx0YXJnZXQgbmFtZT0icmVsZWFzZSIgICAgICAgICBkZXBlbmRzPSJpbml0LVJlbGVhc2UsYWxsIiAvPgorICA8dGFyZ2V0IG5hbWU9IlJlbGVhc2UiICAgICAgICAgZGVwZW5kcz0icmVsZWFzZSIgLz4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgICAgICAgICAgIGRlcGVuZHM9ImluaXQtQ2xlYW4saW5pdCxkby1jbGVhbiIgLz4KKyAgPHRhcmdldCBuYW1lPSJDbGVhbiIgICAgICAgICAgIGRlcGVuZHM9ImNsZWFuIiAvPgorICA8dGFyZ2V0IG5hbWU9ImhlbHAiICAgICAgICAgICAgZGVwZW5kcz0iaW5pdC1IZWxwIiAvPgorICA8dGFyZ2V0IG5hbWU9IkhlbHAiICAgICAgICAgICAgZGVwZW5kcz0iaW5pdC1IZWxwIiAvPgorICA8dGFyZ2V0IG5hbWU9ImRlYnVnLXJlYnVpbGQiICAgZGVwZW5kcz0iQ2xlYW4sRGVidWciIC8+CisgIDx0YXJnZXQgbmFtZT0icmVsZWFzZS1yZWJ1aWxkIiBkZXBlbmRzPSJDbGVhbixSZWxlYXNlIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdC1IZWxwIiBkZXBlbmRzPSJkby1oZWxwIj4KKyAgICAgPCEtLSBHZW5lcmljIGhlbHAgbWVzc2FnZSAtLT4KKyAgICAgPGVjaG8+CisgICAgIFRoZSBmb2xsb3dpbmcgR2VuZXJpYyB0YXJnZXRzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgIERlYnVnICAgICAgICAgICA6PSBEZWJ1ZyBidWlsZAorICAgICAgICBSZWxlYXNlICAgICAgICAgOj0gUmVsZWFzZSBidWlsZAorICAgICAgICBDbGVhbiAgICAgICAgICAgOj0gQ2xlYW4gYWN0aW9uCisgICAgICAgIGRlYnVnLXJlYnVpbGQgICA6PSBDbGVhbiB0aGVuIERlYnVnIGJ1aWxkCisgICAgICAgIHJlbGVhc2UtcmVidWlsZCA6PSBDbGVhbiB0aGVuIFJlbGVhc2UgYnVpbGQKKyAgICAgPC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQtRGVidWciPgorICAgICA8IS0tIERlYnVnIFRhcmdldCAtLT4KKyAgICAgPHRzdGFtcCAvPgorICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiICAgICB2YWx1ZT0iRGVidWciIC8+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLmRlYnVnIiAgICAgIHZhbHVlPSJvbiIgLz4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMub3B0aW1pemUiICAgdmFsdWU9Im9mZiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0LVJlbGVhc2UiPgorICAgIDwhLS0gUmVsZWFzZSBUYXJnZXQgLS0+CisgICAgPHRzdGFtcCAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJ1aWxkLnRhcmdldCIgICAgICB2YWx1ZT0iUmVsZWFzZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5qYXZhYy5kZWJ1ZyIgICAgICAgdmFsdWU9Im9uIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLm9wdGltaXplIiAgICB2YWx1ZT0ib2ZmIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQtQ2xlYW4iPgorICAgICA8IS0tIENsZWFuIFRhcmdldCAtLT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYnVpbGQudGFyZ2V0IiAgICAgdmFsdWU9IkNsZWFuIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByb3BlcnR5LWluaXQiID4KKyAgICAgPCEtLSBJbml0aWFsaXplIHRhcmdldC1zcGVjaWZpYyBwcm9wZXJ0aWVzIC0tPiAKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnR5LWluaXQsZG8taW5pdCI+CisgICAgIDwhLS0gSW5pdGlhbGl6YXRpb24gVGFyZ2V0IC0tPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJpbml0LGRvLWJ1aWxkIj4KKyAgICAgPCEtLSBCdWlsZCB0YXJnZXQgLS0+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icG9zdGJ1aWxkIiBkZXBlbmRzPSJidWlsZCxkby1wb3N0YnVpbGQiPgorICAgICA8IS0tIFBvc3QtYnVpbGQgVGFyZ2V0IC0tPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9InBvc3RidWlsZCxkby10ZXN0Ij4KKyAgICAgPCEtLSBUZXN0IFRhcmdldCAtLT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwb3N0dGVzdCIgZGVwZW5kcz0idGVzdCIgaWY9ImJ1aWxkLnB1Ymxpc2giPgorICAgIDwhLS0gUG9zdHRlc3QgVGFyZ2V0IC0tPgorCTxhbnRjYWxsIHRhcmdldD0iZG8tcHVibGlzaCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0idGVzdCxwb3N0dGVzdCI+CisgICAgIDwhLS0gYWxsIHRhcmdldCAtLT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBPdmVybG9hZCB0aGVzZSB0YXJnZXRzIGluIGVhY2ggc3ViLXByb2plY3QgLS0+CisgIDx0YXJnZXQgbmFtZT0iZG8taW5pdCI+CisgICAgPCEtLSBVc2UgdGhpcyB0YXJnZXQgZm9yIGFueSBwcmUtYnVpbGQgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgIChkaXJlY3RvcnkgY3JlYXRpb24sIGV0Yy4pLCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgd2lsbCBiZSBkZWZpbmVkCisgICAgICAgICBiZWZvcmUgdGhpcyB0YXJnZXQgaXMgY2FsbGVkOgorCisgICAgICAgICBFdGNoLmJ1aWxkLnRhcmdldCAgICAgIDo9ICBPbmUgb2YgIkRlYnVnIiBvciAiUmVsZWFzZSIKKyAgICAtLT4KKyAgICA8ZWNobyBtZXNzYWdlPSJObyBJbml0aWFsaXphdGlvbiBkZWZpbmVkLiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkby1idWlsZCI+CisgICAgPCEtLSBVc2UgdGhpcyB0YXJnZXQgZm9yIHRoZSBhY3R1YWwgYnVpbGQKKyAgICAgICAgIGxvZ2ljLiAiZG8taW5pdCIgd2lsbCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICAgICB0aGlzIHRhcmdldC4KKyAgICAtLT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkby1jbGVhbiI+CisgICAgPCEtLSBVc2UgdGhpcyB0YXJnZXQgdG8gaW1wbGVtZW50IGFueSBidWlsZC1jbGVhbgorICAgICAgICAgbG9naWMuICJkby1pbml0IiB3aWxsICpub3QqIGJlIGNhbGxlZCBiZWZvcmUKKyAgICAgICAgIHRoaXMgdGFyZ2V0LgorICAgIC0tPgorICAgIDxlY2hvIG1lc3NhZ2U9Ik5vIENsZWFuIHRhcmdldCBkZWZpbmVkLiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkby1wb3N0YnVpbGQiPgorICAgIDwhLS0gVXNlIHRoaXMgdGFyZ2V0IHRvIGNvcHkgdGhlIGJ1aWxkIHByb2R1Y3RzCisgICAgICAgICB0byB0aGUgY29tbW9uIHdvcmtzcGFjZSBidWlsZCBkaXIsIGkuZS4gWDpcQnVpbGQuCisgICAgICAgICBUaGUgImRvLWJ1aWxkIiB0YXJnZXQgbXVzdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHkKKyAgICAgICAgIGJlZm9yZSB0aGlzIHRhcmdldCBpcyBjYWxsZWQuCisgICAgLS0+CisgICAgPGVjaG8gbWVzc2FnZT0iTm8gUG9zdGJ1aWxkIGRlZmluZWQuIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvLXRlc3QiPgorICAgIDwhLS0gVXNlIHRoaXMgdGFyZ2V0IHRvIGV4ZWN1dGUgdW5pdCB0ZXN0cyAtLT4KKyAgICA8ZWNobyBtZXNzYWdlPSJObyBVbml0IFRlc3RzIERlZmluZWQuIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvLXB1Ymxpc2giPgorCTwhLS0gVXNlIHRoaXMgdGFyZ2V0IHRvIHB1Ymxpc2ggdGhlIGJ1aWxkCisgICAgICAgICByZXN1bHRzIGJ1dCBpZiB0aGUgdGVzdHMgc3VjY2Vzc2Z1bGx5CisgICAgICAgICBwYXNzZWQgLS0+CisgICAgPGVjaG8+Tm8gUHVibGlzaGluZyBkZWZpbmVkLjwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkby1oZWxwIj4KKyAgICA8IS0tIFVzZSB0aGlzIHRhcmdldCB0byBsaXN0IGFueSBzcGVjaWFsIHRhcmdldHMKKyAgICAgICAgIG9yIGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBzdWJwcm9qZWN0LgorICAgIC0tPgorICAgIDxlY2hvPgorICAgIFRoZSBmb2xsb3dpbmcgc3BlY2lhbCB0YXJnZXRzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgIE5vbmUKKyAgICA8L2VjaG8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idWlsZC1zdXBwb3J0L3JlYWxjbGVhbi5iYXQgYi9idWlsZC1zdXBwb3J0L3JlYWxjbGVhbi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlOTk5MwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLXN1cHBvcnQvcmVhbGNsZWFuLmJhdApAQCAtMCwwICsxLDI0IEBACitAcmVtICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorQHJlbSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKK0ByZW0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCitAcmVtICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorQHJlbSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKK0ByZW0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCitAcmVtICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKK0ByZW0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCitAcmVtICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorQHJlbSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKK0ByZW0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCitAcmVtICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorY2FsbCBhbnQgY2xlYW4KKworZGVsIGJpbmRpbmctY3NoYXJwXGNvbXBpbGVyXHNyY1xtYWluXGphdmFcZXRjaFxiaW5kaW5nc1xjc2hhcnBcY29tcGlsZXJcQ29tcGlsZXJWZXJzaW9uLmphdmEKK2RlbCBiaW5kaW5nLXhtbFxjb21waWxlclxzcmNcbWFpblxqYXZhXGV0Y2hcYmluZGluZ3NceG1sXGNvbXBpbGVyXENvbXBpbGVyVmVyc2lvbi5qYXZhCitkZWwgYmluZGluZy1qYXZhXGNvbXBpbGVyXHNyY1xtYWluXGphdmFcZXRjaFxiaW5kaW5nc1xqYXZhXGNvbXBpbGVyXENvbXBpbGVyVmVyc2lvbi5qYXZhCitkZWwgY29tcGlsZXJcc3JjXG1haW5camF2YVxldGNoXGNvbXBpbGVyXFZlcnNpb24uamF2YQorZGVsIGJpbmRpbmctY3NoYXJwXHJ1bnRpbWVcc3JjXG1haW5cY3NoYXJwXFByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzCitzdm4gdXBkYXRlIC4KZGlmZiAtLWdpdCBhL2J1aWxkLXN1cHBvcnQvcmVhbGNsZWFuLnNoIGIvYnVpbGQtc3VwcG9ydC9yZWFsY2xlYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGI3NmY1NQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLXN1cHBvcnQvcmVhbGNsZWFuLnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyMgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisjICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorIyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyMgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisjICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorIyAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisjICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorIyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyMgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisjICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorIyAgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK2FudCBjbGVhbgorZmluZCAuIC1uYW1lICdDb21waWxlclZlcnNpb24uamF2YScgLWV4ZWMgcm0gLWYge30gXDsKK3JtIC1mIGNvbXBpbGVyL3NyYy9tYWluL2phdmEvZXRjaC9jb21waWxlci9WZXJzaW9uLmphdmEKK3JtIC1mIGJpbmRpbmctY3NoYXJwL3J1bnRpbWUvc3JjL21haW4vY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCitzdm4gdXBkYXRlIC4KKwpkaWZmIC0tZ2l0IGEvYnVpbGQuZGVwZW5kZW5jaWVzIGIvYnVpbGQuZGVwZW5kZW5jaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTkwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC5kZXBlbmRlbmNpZXMKQEAgLTAsMCArMSw0NSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorIyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKw0KKyMjDQorIyMgQ29yZSBEZXBlbmRlbmNpZXMgLi4gdGhlc2UgbXVzdCBiZSBzZXQNCisjIw0KKw0KK2phdmFjYy5ob21lPSR7ZW52LlRPT0xTX0RJUn0vamF2YWNjLzQuMA0KK2p1bml0LmxpYj0ke2Vudi5UT09MU19ESVJ9L2p1bml0LzQuMy4xDQordmVsb2NpdHkubGliPSR7ZW52LlRPT0xTX0RJUn0vdmVsb2NpdHkvMS41DQorDQorIyMNCisjIyBPcHRpb25hbCBEZXBlbmRlbmNpZXMNCisjIw0KKw0KKyMjIE5TSVMNCituc2lzLmhvbWU9JHtlbnYuTlNJU19IT01FfQ0KKw0KKyMjIENsb3Zlcg0KK2Nsb3Zlci5ob21lPSR7ZW52LkNMT1ZFUl9IT01FfQ0KKw0KKyMjIENzaGFycCBzdXBwb3J0DQorYW50LWRvdG5ldC5saWI9JHtlbnYuVE9PTFNfRElSfS9hcGFjaGUtYW50LWRvdG5ldC8xLjANCitudW5pdC5ob21lPSR7ZW52Lk5VTklUX0hPTUV9DQorDQorIyBTZXQgdG8gdGhlIC5ORVQgMi4wIGZyYW1ld29yayBpbnN0YWxsDQorZG90bmV0LmhvbWU9JHtlbnYud2luZGlyfS9NaWNyb3NvZnQuTkVUL0ZyYW1ld29yay92Mi4wLjUwNzI3DQorDQorIyBNT05PIHN1cHBvcnQgc3RpbGwgYSBiaXQgZmxha2V5DQorbW9uby5ob21lPSR7ZW52Lk1PTk9fSE9NRX0NCisNCmRpZmYgLS1naXQgYS9idWlsZC54bWwgYi9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdkNmY2YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLnhtbApAQCAtMCwwICsxLDE2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoIiBkZWZhdWx0PSJkZWJ1ZyIgYmFzZWRpcj0iLiI+CisgICAgPGRlc2NyaXB0aW9uPk1hc3RlciBidWlsZCBzY3JpcHQgZm9yIEV0Y2g8L2Rlc2NyaXB0aW9uPgorICAgIDxpbXBvcnQgZmlsZT0iYnVpbGQtc3VwcG9ydC9ldGNoLmNvbW1vbi54bWwiIC8+CisKKyAgICA8IS0tIHN0YW5kYXJkLCBzdXBwb3J0ZWQgdGFyZ2V0cyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9IkRlYnVnIiAgICAgICAgIGRlcGVuZHM9ImRlYnVnIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iUmVsZWFzZSIgICAgICAgZGVwZW5kcz0icmVsZWFzZSIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9IkNsZWFuIiAgICAgICAgIGRlcGVuZHM9ImNsZWFuIiAvPgorICAgIDx0YXJnZXQgbmFtZT0iZGVidWciICAgICAgICAgZGVwZW5kcz0iaW5pdC1kZWJ1Zyxjb21wb25lbnQtYWxsLHBvc3QtZGVidWciICAgLz4KKyAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiICAgICAgIGRlcGVuZHM9ImluaXQtcmVsZWFzZSxjb21wb25lbnQtYWxsLHBvc3QtcmVsZWFzZSIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiAgICAgICAgIGRlcGVuZHM9ImluaXQtY2xlYW4sY29tcG9uZW50LWFsbCxwb3N0LWNsZWFuIiAvPgorICAgIDx0YXJnZXQgbmFtZT0icmVhbGNsZWFuIiAgICAgZGVwZW5kcz0iY2xlYW4sZXh0cmEtY2xlYW4iIC8+CisgICAgPHRhcmdldCBuYW1lPSJtYXZlbi1pbnN0YWxsIiBkZXBlbmRzPSJpbml0LW1hdmVuLHJlbGVhc2UiIC8+CisKKyAgICA8IS0tIEV4ZWN1dGUgYSBjbGVhbiwgdGhlbiAnZGVidWcnIGJ1aWxkIC0tPgorICAgIDx0YXJnZXQgbmFtZT0icmVidWlsZC1kZWJ1ZyI+CisgICAgICAgIDxhbnQgdGFyZ2V0PSJjbGVhbiIgLz4KKyAgICAgICAgPGFudCB0YXJnZXQ9ImRlYnVnIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBFeGVjdXRlIGEgY2xlYW4sIHRoZW4gJ3JlbGVhc2UnIGJ1aWxkIC0tPgorICAgIDx0YXJnZXQgbmFtZT0icmVidWlsZC1yZWxlYXNlIj4KKyAgICAgICAgPGFudCB0YXJnZXQ9ImNsZWFuIiAvPgorICAgICAgICA8YW50IHRhcmdldD0icmVsZWFzZSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gRXhlY3V0ZSBhIGNsZWFuLCB0aGVuICdyZWxlYXNlJyBhbmQgdGhlbiBtYXZlbiBzbmFwc2hvdCBpbnN0YWxsIChlLmcuIGxpa2UgcnVubmluZyAnbXZuIGNsZWFuIGluc3RhbGwnKSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9InJlYnVpbGQtbWF2ZW4taW5zdGFsbCI+CisgICAgICAgIDxhbnQgdGFyZ2V0PSJjbGVhbiIgLz4KKyAgICAgICAgPGFudCB0YXJnZXQ9Im1hdmVuLWluc3RhbGwiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIGZyYW1ld29yayB0YXJnZXRzLCBkbyBub3QgY2FsbCB0aGVzZSBkaXJlY3RseSAtLT4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1tYXZlbiIgPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRE8ubWF2ZW4uaW5zdGFsbCIgdmFsdWU9InRydWUiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLWRlcGVuZGVuY2llcyIgPgorICAgICAgICA8dHN0YW1wIC8+CisgICAgICAgIDxidWlsZF9jb21wb25lbnQgZGlyPSJidWlsZC1zdXBwb3J0IiB0YXJnZXQ9ImNoZWNrLWFsbCIgc2NyaXB0PSJkZXBlbmRlbmNpZXMiIC8+CisgICAgICAgIAorICAgICAgICA8ZWNobyBtZXNzYWdlPSJXb3Jrc3BhY2U6ICR7RXRjaC5iYXNlZGlyfSIgLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iU1ZOIFJldmlzaW9uOiAke0V0Y2gucnVudGltZS5yZXZpc2lvbk51bWJlcn0iIC8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlZlcnNpb246ICR7RXRjaC5wcm9wZXJ0eS5tYWpvclZlcnNpb259LiR7RXRjaC5wcm9wZXJ0eS5taW5vclZlcnNpb259IiAvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZEtleTogJHtFdGNoLnJ1bnRpbWUuYnVpbGRLZXl9IiAvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZE51bWJlcjogJHtFdGNoLnJ1bnRpbWUuYnVpbGROdW1iZXJ9IiAvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJMb2dEaXI6ICR7RXRjaC5sb2dEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJJbnN0YWxsRGlyOiAke0V0Y2guaW5zdGFsbGVyRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtFdGNoLmxvZ0RpcmVjdG9yeX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtZGVidWciIGRlcGVuZHM9InZhbGlkYXRlLWRlcGVuZGVuY2llcyxkby1jbG92ZXItaW5pdCIgPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiIHZhbHVlPSJEZWJ1ZyIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMuZGVidWciIHZhbHVlPSJvbiIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guamF2YWMub3B0aW1pemUiIHZhbHVlPSJvZmYiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InBvc3QtZGVidWciIGRlcGVuZHM9ImRvLWNsb3Zlci1yZXBvcnQiPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJpbml0LXJlbGVhc2UiIGRlcGVuZHM9InZhbGlkYXRlLWRlcGVuZGVuY2llcyxkby1jbG92ZXItaW5pdCI+CisgICAgICAgIDwhLS0gRm9yIG5vdywga2VlcCBkZWJ1Zy1zeW1ib2xzIGFuZCBuby1vcHRpbWl6ZSwgZXZlbiBmb3IgcmVsZWFzZSBidWlsZHMgLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJ1aWxkLnRhcmdldCIgdmFsdWU9IlJlbGVhc2UiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLmRlYnVnIiAgdmFsdWU9Im9uIiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5qYXZhYy5vcHRpbWl6ZSIgdmFsdWU9Im9mZiIgLz4KKyAgICAgICAgPCEtLQorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5qYXZhYy5kZWJ1ZyIgIHZhbHVlPSJvZmYiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmphdmFjLm9wdGltaXplIiB2YWx1ZT0ib24iIC8+CisgICAgICAgIC0tPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0icG9zdC1yZWxlYXNlIiBkZXBlbmRzPSJkby1jbG92ZXItcmVwb3J0Ij4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tY2xvdmVyLWluaXQiID4KKyAgICA8L3RhcmdldD4KKyAgICAgICAgCisgICAgPHRhcmdldCBuYW1lPSJkby1jbG92ZXItcmVwb3J0IiBpZj0iQ2xvdmVyLmVuYWJsZWQiID4KKyAgICAgICAgPCEtLSBHZW5lcmF0ZSBDb3ZlcmFnZSBSZXBvcnQgLS0+CisgICAgICAgIDxta2RpciBkaXI9IiR7Q2xvdmVyLmNvdmVyYWdlfSIgLz4KKyAgICAgICAgCisgICAgICAgIDxjbG92ZXItbWVyZ2UgaW5pdFN0cmluZz0iJHtDbG92ZXIuZGJ9Ij4KKyAgICAgICAgICAgIDxjbG92ZXJEYlNldCBkaXI9IiR7Q2xvdmVyLmRiLnBhdGh9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9jbG92ZXIuZGIiIC8+CisgICAgICAgICAgICA8L2Nsb3ZlckRiU2V0PgorICAgICAgICA8L2Nsb3Zlci1tZXJnZT4KKyAgICAgICAgCisgICAgICAgIDwhLS0gVE9ETzogaW1wbGVtZW50IGEgdG9nZ2xlIGZvciB0aGUgUERGIHJlcG9ydCAtLT4KKyAgICAgICAgPCEtLSA8Y2xvdmVyLXBkZi1yZXBvcnQgaW5pdHN0cmluZz0iJHtDbG92ZXIuZGJ9IiBvdXRmaWxlPSIke0Nsb3Zlci5jb3ZlcmFnZX0vY292ZXJhZ2UucGRmIiAvPiAgLS0+CisgICAgICAgIAorICAgICAgICA8Y2xvdmVyLXJlcG9ydCBpbml0c3RyaW5nPSIke0Nsb3Zlci5kYn0iID4KKyAgICAgICAgICAgIDxjdXJyZW50IGFsd2F5c1JlcG9ydD0idHJ1ZSIgb3V0ZmlsZT0iJHtDbG92ZXIuY292ZXJhZ2V9L2NvdmVyYWdlLnhtbCI+CisgICAgICAgICAgICAgICAgPGZvcm1hdCB0eXBlPSJ4bWwiLz4KKyAgICAgICAgICAgIDwvY3VycmVudD4KKyAgICAgICAgPC9jbG92ZXItcmVwb3J0PgorCisgICAgICAgIDwhLS0gQ2xlYW4gQ2xvdmVyIERCIC0tPgorICAgICAgICA8IS0tIDxjbG92ZXItY2xlYW4gaW5pdHN0cmluZz0iJHtDbG92ZXIuZGJ9IiBrZWVwZGI9ImZhbHNlIiAvPiAtLT4KKyAgICA8L3RhcmdldD4KKworCisgICAgPHRhcmdldCBuYW1lPSJpbml0LWNsZWFuIiBkZXBlbmRzPSJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5idWlsZC50YXJnZXQiIHZhbHVlPSJDbGVhbiIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icG9zdC1jbGVhbiIgPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJFeGVjdXRpbmcgY2xlYW4iIC8+CisgICAgICAgIDxkZWxldGUgcXVpZXQ9InRydWUiIGRpcj0iJHtFdGNoLnRhcmdldH0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImV4dHJhLWNsZWFuIj4KKyAgICAgICAgPCEtLSByZW1vdmUgZmlsZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBmaWx0ZXJlZCBjb3B5IC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxkZWxldGUgZmlsZT0iY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvVmVyc2lvbi5qYXZhIiAvPgorICAgICAgICA8ZGVsZXRlIGZpbGU9ImJpbmRpbmctamF2YS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9qYXZhL2NvbXBpbGVyL0NvbXBpbGVyVmVyc2lvbi5qYXZhIiAvPgorICAgICAgICA8ZGVsZXRlIGZpbGU9ImJpbmRpbmcteG1sL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2JpbmRpbmdzL3htbC9jb21waWxlci9Db21waWxlclZlcnNpb24uamF2YSIgLz4KKyAgICAgICAgPGRlbGV0ZSBmaWxlPSJiaW5kaW5nLWNzaGFycC9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9iaW5kaW5ncy9jc2hhcnAvY29tcGlsZXIvQ29tcGlsZXJWZXJzaW9uLmphdmEiIC8+CisgICAgICAgIDxkZWxldGUgZmlsZT0iYmluZGluZy1jc2hhcnAvcnVudGltZS9zcmMvbWFpbi9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MiIC8+CisgICAgICAgIC0tPgorICAgIDwvdGFyZ2V0PiAgICAKKworICAgIDwhLS0gQ29tcG9uZW50IHRhcmdldHM7IEFkZCB0byB0aGlzIHNldCAtLT4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcG9uZW50LWFsbCIgPgorICAgICAgICA8IS0tIENvcmUgLS0+CisgICAgICAgIDxidWlsZF9jb21wb25lbnQgZGlyPSJ1dGlsIiAvPgorICAgICAgICA8YnVpbGRfY29tcG9uZW50IGRpcj0iY29tcGlsZXIiIC8+CisgICAgICAgIAorICAgICAgICA8IS0tIElERS90b29sIHBsdWdpbnMgLS0+CisgICAgICAgIDxidWlsZF9jb21wb25lbnQgZGlyPSJwbHVnaW5zL2FudCIgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gQmluZGluZ3MgLS0+CisgICAgICAgIDxidWlsZF9jb21wb25lbnQgZGlyPSJiaW5kaW5nLXhtbCIgLz4KKyAgICAgICAgPGJ1aWxkX2NvbXBvbmVudCBkaXI9ImJpbmRpbmctamF2YSIgLz4KKyAgICAgICAgPGJ1aWxkX2NvbXBvbmVudCBkaXI9ImJpbmRpbmctY3NoYXJwIiAvPgorICAgICAgICAKKyAgICAgICAgPCEtLSBFeGFtcGxlcyAtLT4KKyAgICAgICAgPGJ1aWxkX2NvbXBvbmVudCBkaXI9ImV4YW1wbGVzIiAvPgorICAgICAgICAKKyAgICAgICAgPCEtLSBGdW5jdGlvbmFsIFRlc3RzIC0tPgorICAgICAgICA8YnVpbGRfY29tcG9uZW50IGRpcj0idGVzdHMiIC8+CisgICAgICAgIAorICAgICAgICA8IS0tIEluc3RhbGxlci96aXAgQnVuZGxlcyAtLT4KKyAgICAgICAgPGJ1aWxkX2NvbXBvbmVudCBkaXI9Imluc3RhbGxlcnMiIC8+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2J1aWxkLnhtbCBiL2NvbXBpbGVyL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVkMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPHByb2plY3QgbmFtZT0iZXRjaC1jb21waWxlciIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+CisgICAgPGRlc2NyaXB0aW9uPkNvbW1vbiB1dGlsaXRpZXMgZm9yIGNvbXBpbGVyIGltcGxlbWVudGF0aW9ucyBhbmQgamF2YSBiaW5kaW5nPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPCEtLSBTdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgc3ViLXByb2plY3QgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InByb2oiICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLmJhc2VkaXJ9L2NvbXBpbGVyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQiICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vdGFyZ2V0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiICAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vc3JjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5lcmF0ZWRTcmMiICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9nZW5lcmF0ZWQtc291cmNlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc0RpcmVjdG9yeSIgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vY2xhc3NlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2VzRGlyZWN0b3J5IiAgIGxvY2F0aW9uPSIke3RhcmdldH0vcmVzb3VyY2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0UmVzdWx0c0RpcmVjdG9yeSIgbG9jYXRpb249IiR7dGFyZ2V0fS90ZXN0LXJlc3VsdHMiIC8+CisKKyAgICA8IS0tIE1BQ1JPOiBpbml0LXRhcmdldCAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iaW5pdC10YXJnZXQiID4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3Jlc291cmNlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3RSZXN1bHRzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8IS0tIE1BQ1JPOiBjb21waWxlLXNvdXJjZXMgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImNvbXBpbGUtc291cmNlcyIgPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHBvcnQiIGRlZmF1bHQ9IiR7RXRjaC5zdXBwb3J0fSIgLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiIC8+CisKKyAgICAgICAgICAgIDwhLS0gY29tcGlsZSBtYWluIC0tPgorICAgICAgICAgICAgPGphdmFjICBkZWJ1Zz0iJHtFdGNoLmphdmFjLmRlYnVnfSIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjUiCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPSIke0V0Y2guamF2YWMub3B0aW1pemV9IgorICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iID4KKyAgICAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfS9tYWluL2phdmEiIC8+CisgICAgICAgICAgICAgICAgPHNyYyBwYXRoPSIke2dlbmVyYXRlZFNyY30vbWFpbi9qYXZhY2MvamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IkV0Y2guZGVwZW5kZW5jaWVzLmphci5wYXRocyIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IkB7c3VwcG9ydH0vbGliLyR7ZXRjaC11dGlsLmphcn0iIC8+CisgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8L2phdmFjPgorCisgICAgICAgICAgICA8IS0tIG1haW4tcmVzb3VyY2VzIC0tPgorICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9yZXNvdXJjZXMiPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L2NvcHk+ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIDwhLS0gY29tcGlsZSB0ZXN0IC0tPgorICAgICAgICAgICAgPGphdmFjICBkZWJ1Zz0iJHtFdGNoLmphdmFjLmRlYnVnfSIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjUiCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPSIke0V0Y2guamF2YWMub3B0aW1pemV9IgorICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiID4KKyAgICAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfS90ZXN0L2phdmEiIC8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJFdGNoLmRlcGVuZGVuY2llcy5qYXIucGF0aHMiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iQHtzdXBwb3J0fS9saWIvJHtldGNoLXV0aWwuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwvamF2YWM+CisKKyAgICAgICAgICAgIDwhLS0gdGVzdC1yZXNvdXJjZXMgLS0+CisgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS90ZXN0L3Jlc291cmNlcyI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvY29weT4gICAgICAgICAgICAKKworICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDwhLS0gTUFDUk86IGJ1bmRsZS1qYXJzIC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJidW5kbGUtamFycyIgPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc3QiIGRlZmF1bHQ9IiR7RXRjaC5kaXN0fSIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwb3J0IiBkZWZhdWx0PSIke0V0Y2guc3VwcG9ydH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtkaXN0fS9saWIiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSJAe3N1cHBvcnR9L2xpYiIgLz4KKworICAgICAgICAgICAgPCEtLSBDb3B5IDNyZCBwYXJ0eSBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgICAgICA8Y29weSB0b2Rpcj0iQHtkaXN0fS9saWIiIGZpbGU9IiR7RXRjaC5kZXBlbmRlbmN5LnZlbG9jaXR5LWRlcC5qYXJ9IiAvPgorICAgICAgICAgICAgPGNvcHkgdG9kaXI9IkB7c3VwcG9ydH0vbGliIiBmaWxlPSIke0V0Y2guZGVwZW5kZW5jeS52ZWxvY2l0eS1kZXAuamFyfSIgLz4KKworICAgICAgICAgICAgPCEtLSBDUkVBVEUgamFycyAtLT4KKworICAgICAgICAgICAgPCEtLSBQYWNrYWdlIHVwIGV0Y2gtY29tcGlsZXIgamFyIC0tPgorICAgICAgICAgICAgPGphciBqYXJmaWxlPSJAe3N1cHBvcnR9L2xpYi8ke2V0Y2gtY29tcGlsZXIuamFyfSIgPgorICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDb3B5cmlnaHQiICAgIHZhbHVlPSIke0V0Y2guY29weXJpZ2h0Tm90aWNlfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJWZXJzaW9uIiAgICAgIHZhbHVlPSIke0V0Y2gudmVyc2lvbn0iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTG9uZ1ZlcnNpb24iICB2YWx1ZT0iJHtFdGNoLmxvbmd2ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsZC1UYWciICAgIHZhbHVlPSIke0V0Y2guYnVpbGRUYWd9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNWTi1SZXZpc2lvbiIgdmFsdWU9IiR7RXRjaC5ydW50aW1lLnJldmlzaW9uTnVtYmVyfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiAgIHZhbHVlPSIke2V0Y2gtdXRpbC5qYXJ9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiICAgdmFsdWU9ImV0Y2guY29tcGlsZXIuRXRjaE1haW4iIC8+CisgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8bWV0YWluZiBkaXI9IiR7RXRjaC5iYXNlZGlyfSIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICA8L21ldGFpbmY+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvKioiIC8+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gPGluY2x1ZGUgbmFtZT0icmVzb3VyY2VzLyoqIiAvPiAtLT4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L2phcj4KKworICAgICAgICAgICAgPCEtLSBwbGFjZWhvbGRlciAtLT4KKyAgICAgICAgICAgIDxqYXIgamFyZmlsZT0iQHtzdXBwb3J0fS9saWIvJHtldGNoLXV0aWwuamFyfSIgdXBkYXRlPSJ0cnVlIiBmaWxlc2V0bWFuaWZlc3Q9Im1lcmdlIj4KKyAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iVmVyc2lvbiIgdmFsdWU9IiR7RXRjaC52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+ICAgCisgICAgICAgICAgICA8L2phcj4KKworICAgICAgICAgICAgPCEtLSBDUkVBVEUgc291cmNlIGFyY2hpdmVzIC0tPgorCisgICAgICAgICAgICA8IS0tIHBhY2thZ2UgdXAgZXRjaC1jb21waWxlciBzb3VyY2UgLS0+CisgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJAe3N1cHBvcnR9L2xpYi8ke2V0Y2gtY29tcGlsZXItc3JjLnppcH0iID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2phdmEiID4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyLyoqLyouamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9yZXNvdXJjZXMiID4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5rd2QiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC96aXA+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fS9lbXB0eS1kaXIiIC8+ICAgICAgICAgICAKKyAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9IkB7c3VwcG9ydH0vbGliLyR7ZXRjaC11dGlsLXNyYy56aXB9IiB1cGRhdGU9InRydWUiIHdoZW5lbXB0eT0iY3JlYXRlIiBiYXNlZGlyPSIke3RhcmdldH0vZW1wdHktZGlyIi8+CisKKyAgICAgICAgICAgIDwhLS0gQ29weSBiYXRjaC1zY3JpcHRzIC0tPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtkaXN0fS9iaW4iIC8+CisgICAgICAgICAgICA8Y29weSAgZmlsZT0iJHtzcmN9L21haW4vc2NyaXB0cy9ldGNoLnNoIiB0b2ZpbGU9IkB7ZGlzdH0vYmluL2V0Y2giIC8+CisgICAgICAgICAgICA8Y2htb2QgZmlsZT0iQHtkaXN0fS9iaW4vZXRjaCIgcGVybT0iNzU1IiAvPgorICAgICAgICAgICAgPGNvcHkgIGZpbGU9IiR7c3JjfS9tYWluL3NjcmlwdHMvZXRjaC5iYXQiIHRvZGlyPSJAe2Rpc3R9L2JpbiIgLz4KKworICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDwhLS0gTUFDUk86IHVwZGF0ZS1qYXJzIC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJ1cGRhdGUtamFycyIgPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc3QiIGRlZmF1bHQ9IiR7RXRjaC5kaXN0fSIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwb3J0IiBkZWZhdWx0PSIke0V0Y2guc3VwcG9ydH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPCEtLSByZXBhY2thZ2UgLmphciAtLT4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IkB7ZGlzdH0vbGliIiAvPgorCisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9L3RtcC1jb21waWxlciIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0vdG1wLWNvbXBpbGVyIiAvPgorCisgICAgICAgICAgICA8dW5qYXIgc3JjPSJAe3N1cHBvcnR9L2xpYi8ke2V0Y2gtdXRpbC5qYXJ9IiAgICAgZGVzdD0iJHt0YXJnZXR9L3RtcC1jb21waWxlciIgLz4KKyAgICAgICAgICAgIDx1bmphciBzcmM9IkB7c3VwcG9ydH0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiBkZXN0PSIke3RhcmdldH0vdG1wLWNvbXBpbGVyIiAvPgorCisgICAgICAgICAgICA8amFyIGphcmZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiB1cGRhdGU9InRydWUiIGZpbGVzZXRtYW5pZmVzdD0ibWVyZ2UiID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGFyZ2V0fS90bXAtY29tcGlsZXIiICAvPgorICAgICAgICAgICAgPC9qYXI+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gcmVwYWNrYWdlIC56aXAgc3JjIC0tPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtkaXN0fS9saWIiIC8+CisKKyAgICAgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0vdG1wLWNvbXBpbGVyLXNyYyIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0vdG1wLWNvbXBpbGVyLXNyYyIgLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPHVuemlwIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLXV0aWwtc3JjLnppcH0iIGRlc3Q9IiR7dGFyZ2V0fS90bXAtY29tcGlsZXItc3JjIiAvPgorICAgICAgICAgICAgPHVuemlwIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLWNvbXBpbGVyLXNyYy56aXB9IiBkZXN0PSIke3RhcmdldH0vdG1wLWNvbXBpbGVyLXNyYyIgLz4KKyAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1jb21waWxlci1zcmMuemlwfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0YXJnZXR9L3RtcC1jb21waWxlci1zcmMiIC8+CisgICAgICAgICAgICA8L3ppcD4KKyAgICAgICAgICAgIAorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDwhLS0gSU5JVCBUQVJHRVQgLS0+CisgICAgPCEtLSBNb2RpZnkgdGhpcyB0YXJnZXQgdG8gZGVmaW5lIHByb2plY3Qgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNhbiBvbmx5IGJlIHNldCBhdCBydW50aW1lIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8taW5pdCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWRTcmN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Jlc291cmNlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGVzdFJlc3VsdHNEaXJlY3Rvcnl9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBDTEVBTiBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1jbGVhbiI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIEJVSUxEIFRBUkdFVCAtLT4KKworICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtc291cmNlcyIgPgorICAgICAgICA8IS0tIEdlbmVyYXRlIHZlcnNpb24gaW5mbyAtLT4KKyAgICAgICAgPHVwZGF0ZS10b2tlbnMgZmlsZW5hbWU9IiR7c3JjfS9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL1ZlcnNpb24uamF2YSIgLz4KKworICAgICAgICA8IS0tIEdlbmVyYXRlIFBhcnNlciAtLT4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWRTcmN9L21haW4vamF2YWNjL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyIiAvPgorICAgICAgICA8amF2YWNjCisgICAgICAgICAgICB0YXJnZXQ9IiR7c3JjfS9tYWluL2phdmFjYy9FdGNoR3JhbW1hci5qaiIKKyAgICAgICAgICAgIGphdmFjY2hvbWU9IiR7RXRjaC5kZXBlbmRlbmN5LmphdmFjYy5ob21lfSIKKyAgICAgICAgICAgIG91dHB1dGRpcmVjdG9yeT0iJHtnZW5lcmF0ZWRTcmN9L21haW4vamF2YWNjL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyIgorICAgICAgICAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLWZvci1kaXN0IiA+CisgICAgICAgIDwhLS0gSW5pdGlhbGl6ZSB0YXJnZXQgZGlyZWN0b3JpZXMgLS0+CisgICAgICAgIDxpbml0LXRhcmdldCAvPgorCisgICAgICAgIDwhLS0gQ29tcGlsZSBTb3VyY2UgLS0+CisgICAgICAgIDxjb21waWxlLXNvdXJjZXMgc3VwcG9ydD0iJHtFdGNoLnN1cHBvcnR9IiAvPgorCisgICAgICAgIDwhLS0gQnVuZGxlIEphcnMgLS0+CisgICAgICAgIDxidW5kbGUtamFycyBkaXN0PSIke0V0Y2guZGlzdH0iIHN1cHBvcnQ9IiR7RXRjaC5zdXBwb3J0fSIgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gVXBkYXRlIEphcnMgLS0+CisgICAgICAgIDx1cGRhdGUtamFycyBkaXN0PSIke0V0Y2guZGlzdH0iIHN1cHBvcnQ9IiR7RXRjaC5zdXBwb3J0fSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gY29tcGlsZSBmb3IgdW5pdC10ZXN0aW5nIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS1mb3ItY2xvdmVyIiBpZj0iQ2xvdmVyLmVuYWJsZWQiID4KKworICAgICAgICA8ZWNobyBtZXNzYWdlPSJSZWJ1aWxkaW5nIHdpdGggY2xvdmVyIiAvPgorCisgICAgICAgIDwhLS0gaW5pdGlhbGl6ZS1jbG92ZXIgLS0+CisgICAgICAgIDxpbml0aWFsaXplLWNsb3ZlciBzdWZmaXg9ImNvbXBpbGVyIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPHRlc3Rzb3VyY2VzIGRpcj0iJHtzcmN9L3Rlc3QvamF2YSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgPC90ZXN0c291cmNlcz4KKyAgICAgICAgPC9pbml0aWFsaXplLWNsb3Zlcj4KKworICAgICAgICA8IS0tIEluaXRpYWxpemUgdGFyZ2V0IGRpcmVjdG9yaWVzIC0tPgorICAgICAgICA8aW5pdC10YXJnZXQgLz4KKworICAgICAgICA8IS0tIENvbXBpbGUgU291cmNlIC0tPgorICAgICAgICA8Y29tcGlsZS1zb3VyY2VzIHN1cHBvcnQ9IiR7RXRjaC5zdXBwb3J0fSIgLz4KKworICAgICAgICA8IS0tIEJ1bmRsZSBKYXJzIC0tPgorICAgICAgICA8YnVuZGxlLWphcnMgZGlzdD0iJHtFdGNoLmNsb3Zlci1kaXN0fSIgc3VwcG9ydD0iJHtFdGNoLmNsb3Zlci1zdXBwb3J0fSIgLz4KKworICAgICAgICA8IS0tIFVwZGF0ZSBKYXJzIC0tPgorICAgICAgICA8dXBkYXRlLWphcnMgZGlzdD0iJHtFdGNoLmNsb3Zlci1kaXN0fSIgc3VwcG9ydD0iJHtFdGNoLmNsb3Zlci1zdXBwb3J0fSIgLz4KKworICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkby1idWlsZCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyxjb21waWxlLWZvci1kaXN0LGNvbXBpbGUtZm9yLWNsb3ZlciIgLz4KKworICAgIDwhLS0gVEVTVCBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby10ZXN0Ij4KKworICAgICAgICA8IS0tIFJ1biBVbml0IFRlc3RzIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIiBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iCisgICAgICAgICAgICBlcnJvclByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIiBmYWlsdXJlUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vdGVzdCIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5Lmp1bml0Lmphcn0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS52ZWxvY2l0eS1kZXAuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5TVVBQT1JUfS9saWIvJHtldGNoLXV0aWwuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlbW92ZSBpZiBjbG92ZXIgbm90IGF2YWlsYWJsZSAtLT4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmNsb3Zlci5qYXJ9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InRydWUiIHRvZGlyPSIke3Rlc3RSZXN1bHRzRGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyLyoqL1Rlc3QqLmphdmEiIC8+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gVE9ETzogTW92ZSBUZXN0RXRjaCB0byBKYXZhIGJpbmRpbmcgLS0+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL1Rlc3RFdGNoLmphdmEiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIFBPU1RCVUlMRCBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1wb3N0YnVpbGQiPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkby1wdWJsaXNoIiBpZj0iYnVpbGQudGVzdHMuZmFpbCI+CisgICAgICAgIDwhLS0gU2V0IGZsYWcgZmlsZSBpZiBhbnkgdGVzdHMgZmFpbGVkIC0tPgorICAgICAgICA8dG91Y2ggZmlsZT0iJHtFdGNoLnJ1bnRpbWUudGVzdHMuZmFpbH0iLz4KKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvQWJzdHJhY3RMb2dIYW5kbGVyLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9BYnN0cmFjdExvZ0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNmMWYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvQWJzdHJhY3RMb2dIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CisKKworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIExvZ0hhbmRsZXIuIFN1YmNsYXNzZXIgbXVzdCBpbXBsZW1lbnQKKyAqIGZpbmFsIGRpc3Bvc2l0aW9uIG9mIHRoZSBtZXNzYWdlLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RMb2dIYW5kbGVyIGltcGxlbWVudHMgTG9nSGFuZGxlcgoreworCXByb3RlY3RlZCBBYnN0cmFjdExvZ0hhbmRsZXIoKQorCXsKKwkJdGhpcyggbnVsbCApOworCX0KKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RMb2dIYW5kbGVyKCBTdHJpbmcgaW5pdGlhbFBoYXNlICkKKwl7CisJCXNldFBoYXNlKCBpbml0aWFsUGhhc2UgKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgcGhhc2U7CisKKwlwcml2YXRlIGludCBlcnJvckNvdW50OworCisJcHJpdmF0ZSBpbnQgd2FybmluZ0NvdW50OworCisJcHJpdmF0ZSBTdHJpbmcgc291cmNlOworCisJcHJpdmF0ZSBpbnQgbG9nTGV2ZWwgPSBMRVZFTF9JTkZPOworCisJcHJpdmF0ZSBTdGFjazxMb2dIYW5kbGVyLkhpc3Rvcnk+IGhpc3RvcnkgPSBuZXcgU3RhY2s8TG9nSGFuZGxlci5IaXN0b3J5PigpOworCisJZmluYWwgcHVibGljIGludCBnZXRMZXZlbCgpCisJeworCQlyZXR1cm4gbG9nTGV2ZWw7CisJfQorCisJZmluYWwgcHVibGljIHZvaWQgc2V0TGV2ZWwoIGludCBsZXZlbCApCisJeworCQljaGVja0xldmVsKCBsZXZlbCApOworCQlsb2dMZXZlbCA9IGxldmVsOworCX0KKworCWZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0UGhhc2UoKQorCXsKKwkJcmV0dXJuIHBoYXNlOworCX0KKworCWZpbmFsIHB1YmxpYyB2b2lkIHNldFBoYXNlKCBTdHJpbmcgcGhhc2UgKQorCXsKKwkJdGhpcy5waGFzZSA9IHBoYXNlOworCX0KKworCWZpbmFsIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkKKwl7CisJCXJldHVybiBlcnJvckNvdW50ID4gMDsKKwl9CisKKwlmaW5hbCBwdWJsaWMgaW50IGVycm9yQ291bnQoKQorCXsKKwkJcmV0dXJuIGVycm9yQ291bnQ7CisJfQorCisJZmluYWwgcHVibGljIGJvb2xlYW4gaGFzV2FybmluZygpCisJeworCQlyZXR1cm4gd2FybmluZ0NvdW50ID4gMDsKKwl9CisKKwlmaW5hbCBwdWJsaWMgaW50IHdhcm5pbmdDb3VudCgpCisJeworCQlyZXR1cm4gd2FybmluZ0NvdW50OworCX0KKworCWZpbmFsIHB1YmxpYyB2b2lkIHJlcG9ydCggaW50IGxldmVsLCBTdHJpbmcgZm10LCBPYmplY3QgLi4uIHBhcmFtcyApCisJeworCQlyZXBvcnQoIGxldmVsLCBudWxsLCBmbXQsIHBhcmFtcyApOworCX0KKworCWZpbmFsIHB1YmxpYyB2b2lkIHJlcG9ydCggaW50IGxldmVsLCBJbnRlZ2VyIGxpbmVOdW1iZXIsIFN0cmluZyBmbXQsCisJCU9iamVjdCAuLi4gcGFyYW1zICkKKwl7CisJCXJlcG9ydCggbGV2ZWwsIGxpbmVOdW1iZXIsIFN0cmluZy5mb3JtYXQoIGZtdCwgcGFyYW1zICkgKTsKKwl9CisKKwlmaW5hbCBwdWJsaWMgdm9pZCBsb2dNZXNzYWdlKCBpbnQgbGV2ZWwsIFRva2VuIHRva2VuLCBTdHJpbmcgbXNnICkKKwl7CisJCXJlcG9ydCggbGV2ZWwsIHRva2VuLmJlZ2luTGluZSwgbXNnICk7CisJfQorCisJZmluYWwgcHVibGljIHZvaWQgcmVwb3J0KCBpbnQgbGV2ZWwsIEludGVnZXIgbGluZU51bWJlciwgU3RyaW5nIG1zZyApCisJeworCQljaGVja0xldmVsKCBsZXZlbCApOworCQkKKwkJaWYgKGxldmVsID09IExFVkVMX0VSUk9SKQorCQkJZXJyb3JDb3VudCsrOworCQkKKwkJaWYgKGxldmVsID09IExFVkVMX1dBUk5JTkcpCisJCQl3YXJuaW5nQ291bnQrKzsKKwkJCisJCWlmIChpc0ludGVyZXN0aW5nKCBsZXZlbCApKQorCQkJbG9nKCBuZXcgTWVzc2FnZSggbGV2ZWwsIHBoYXNlLCBzb3VyY2UsIGxpbmVOdW1iZXIsIG1zZy50cmltKCksCisJCQkJZ2V0SGlzdG9yeSgpICkgKTsKKwl9CisKKwkvKioKKwkgKiBMb2dzIGEgbWVzc2FnZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRlZW1lZCBpbnRlcmVzdGluZyBiYXNlZCBvbgorCSAqIGl0cyBsZXZlbC4gU3ViY2xhc3NlciBtaWdodCBwcmludCB0aGUgbWVzc2FnZSBvciBwdXQgaXQgaW50byBhIGxpc3QuCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBsb2coIE1lc3NhZ2UgbWVzc2FnZSApOworCisJcHJpdmF0ZSBMb2dIYW5kbGVyLkhpc3RvcnlbXSBnZXRIaXN0b3J5KCkKKwl7CisJCWlmIChoaXN0b3J5LmlzRW1wdHkoKSkKKwkJCXJldHVybiBudWxsOworCQkKKwkJcmV0dXJuIGhpc3RvcnkudG9BcnJheSggbmV3IExvZ0hhbmRsZXIuSGlzdG9yeVtoaXN0b3J5LnNpemUoKV0gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tMZXZlbCggaW50IGxldmVsICkKKwl7CisJCUFzc2VydGlvbi5jaGVjayggTEVWRUxfSU1QT1JUQU5UIDwgTEVWRUxfSU5GTywKKwkJCSJMRVZFTF9JTVBPUlRBTlQgPCBMRVZFTF9JTkZPIiApOworCQkKKwkJaWYgKGxldmVsIDwgTEVWRUxfSU1QT1JUQU5UIHx8IGxldmVsID4gTEVWRUxfSU5GTykKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJImxldmVsIDwgTEVWRUxfSU1QT1JUQU5UIHx8IGxldmVsID4gTEVWRUxfSU5GTyIgKTsKKwl9CisKKwlmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0aW5nKCBpbnQgbGV2ZWwgKQorCXsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBsZXZlbCA+PSBMRVZFTF9JTVBPUlRBTlQgJiYgbGV2ZWwgPD0gTEVWRUxfSU5GTywKKwkJCSJsZXZlbCA+PSBMRVZFTF9JTVBPUlRBTlQgJiYgbGV2ZWwgPD0gTEVWRUxfSU5GTyIgKTsKKwkJcmV0dXJuIGxldmVsIDw9IGxvZ0xldmVsOworCX0KKworCWZpbmFsIHB1YmxpYyB2b2lkIHBvcCggU3RyaW5nIG9sZFNvdXJjZSApCisJeworCQlpZiAob2xkU291cmNlID09IG51bGwgfHwgb2xkU291cmNlLmxlbmd0aCgpID09IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJvbGRTb3VyY2UgaXMgbnVsbCBvciBlbXB0eSIgKTsKKwkJCisJCWlmICghb2xkU291cmNlLmVxdWFscyggc291cmNlICkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJvbGRTb3VyY2UgZG9lcyBub3QgbWF0Y2ggbGFzdCBwdXNoIiApOworCQkKKwkJaWYgKCFoaXN0b3J5LmlzRW1wdHkoKSkKKwkJeworCQkJTG9nSGFuZGxlci5IaXN0b3J5IGggPSBoaXN0b3J5LnBvcCgpOworCQkJc291cmNlID0gaC5zb3VyY2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzb3VyY2UgPSBudWxsOworCQl9CisJfQorCisJZmluYWwgcHVibGljIHZvaWQgcHVzaCggU3RyaW5nIG5ld1NvdXJjZSwgSW50ZWdlciBsaW5lTnVtYmVySW5PbGRTb3VyY2UgKQorCXsKKwkJaWYgKG5ld1NvdXJjZSA9PSBudWxsIHx8IG5ld1NvdXJjZS5sZW5ndGgoKSA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkibmV3U291cmNlIGlzIG51bGwgb3IgZW1wdHkiICk7CisJCQorCQlpZiAoc291cmNlID09IG51bGwgJiYgbGluZU51bWJlckluT2xkU291cmNlICE9IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJsaW5lIG51bWJlciBtdXN0IGJlIG51bGwgZm9yIGluaXRpYWwgc291cmNlIiApOworCQkKKwkJaWYgKHNvdXJjZSAhPSBudWxsICYmIGxpbmVOdW1iZXJJbk9sZFNvdXJjZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkibGluZSBudW1iZXIgY2Fubm90IGJlIG51bGwgZm9yIG5lc3RlZCBzb3VyY2UiICk7CisJCQorCQlpZiAobGluZU51bWJlckluT2xkU291cmNlICE9IG51bGwpCisJCQloaXN0b3J5LnB1c2goIG5ldyBMb2dIYW5kbGVyLkhpc3RvcnkoIHNvdXJjZSwgbGluZU51bWJlckluT2xkU291cmNlICkgKTsKKwkJCisJCXNvdXJjZSA9IG5ld1NvdXJjZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvQmFja2VuZC5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvQmFja2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGI3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9CYWNrZW5kLmphdmEKQEAgLTAsMCArMSw2ODkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTWVzc2FnZURpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1vZHVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk9wdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5UeXBlUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRXh0ZXJuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbjsKKworCisvKioKKyAqIEdlbmVyaWMgaW50ZXJmYWNlIHRvIGxhbmd1YWdlIChvciBsYW5ndWFnZS9ydW50aW1lKSBiaW5kaW5ncy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhY2tlbmQKK3sKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgdG1wbFBhdGgxID0gIm9yZy9hcGFjaGUvZXRjaC9jb21waWxlci8iOworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyB0bXBsUGF0aDIgPSAicmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci8iOworCQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gV0hBVCBESVJFQ1RJT04gR1JPVVAgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIENvbnN0YW50IGZvciBvcHRpb24gLS13aGF0OiBnZW5lcmF0ZSBib3RoIGNsaWVudCBhbmQgc2VydmVyIGZpbGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIQVRfQk9USCA9ICJCT1RIIjsKKwkKKwkvKioKKwkgKiBDb25zdGFudCBmb3Igb3B0aW9uIC0td2hhdDogZ2VuZXJhdGUgY2xpZW50IGZpbGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIQVRfQ0xJRU5UID0gIkNMSUVOVCI7CisJCisJLyoqCisJICogQ29uc3RhbnQgZm9yIG9wdGlvbiAtLXdoYXQ6IGdlbmVyYXRlIGdlbmVyYXRlIHNlcnZlciBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSEFUX1NFUlZFUiA9ICJTRVJWRVIiOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFdIQVQgRklMRVMgR1JPVVAgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQ29uc3RhbnQgZm9yIG9wdGlvbiAtLXdoYXQ6IGdlbmVyYXRlIGFsbCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSEFUX0FMTCA9ICJBTEwiOworCQorCS8qKgorCSAqIENvbnN0YW50IGZvciBvcHRpb24gLS13aGF0OiBnZW5lcmF0ZSBubyBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSEFUX05PTkUgPSAiTk9ORSI7CisJCisJLyoqCisJICogQ29uc3RhbnQgZm9yIG9wdGlvbiAtLXdoYXQ6IGdlbmVyYXRlIGludGYgZmlsZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hBVF9JTlRGID0gIklOVEYiOworCQorCS8qKgorCSAqIENvbnN0YW50IGZvciBvcHRpb24gLS13aGF0OiBnZW5lcmF0ZSBtYWluIGZpbGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hBVF9NQUlOID0gIk1BSU4iOworCQorCS8qKgorCSAqIENvbnN0YW50IGZvciBvcHRpb24gLS13aGF0OiBnZW5lcmF0ZSBpbXBsIGZpbGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIQVRfSU1QTCA9ICJJTVBMIjsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFdIQVQgTUlTQyBHUk9VUCAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIENvbnN0YW50IGZvciBvcHRpb24gLS13aGF0OiBvdmVyd3JpdGUgdGVtcGxhdGUgZmlsZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hBVF9GT1JDRSA9ICJGT1JDRSI7CisJCisJLyoqCisJICogQ29uc3RhbnQgZm9yIG9wdGlvbiAtLXdoYXQ6IGdpdmUgaGVscCBvbiB3aGF0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIQVRfSEVMUCA9ICJIRUxQIjsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBCYWNrZW5kLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIEJhY2tlbmQoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmdbXSBwYXRoID0geyB0bXBsUGF0aDEsIHRtcGxQYXRoMiB9OworCQlnbG9iYWxfa3dkID0gZ2V0UGF0aChwYXRoLCAiZ2xvYmFsS2V5d29yZHMua3dkIik7CisJfQorCisJLyoqCisJICogUGF0aCB0byBnbG9iYWwga2V5d29yZCByZXNvdXJjZS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdsb2JhbF9rd2Q7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBnZXRMYW5nKCk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGVzIGNvZGUgZm9yIHRoaXMgYmluZGluZyBvZiB0aGUgaWRsLgorCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHdlIGFyZSBnZW5lcmF0aW5nIGNvZGUgZm9yLgorCSAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjb21waWxlci4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIGdlbmVyYXRlKCBNb2R1bGUgbW9kdWxlLCBDbWRMaW5lT3B0aW9ucyBvcHRpb25zICkKKwkJdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJ1bnMgdGhlIGdlbmVyYXRvciBmb3IgYSBwYXJ0aWN1bGFyIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkCisJICogb3V0cHV0IHN0cmVhbS4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIEdlbgorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBwdworCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCQkgKi8KKwkJdm9pZCBydW4oIFByaW50V3JpdGVyIHB3ICkgdGhyb3dzIEV4Y2VwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBIZWxwZXIgbWV0aG9kLiAgUmV0dXJuIHRydWUgaWYgdGhlIG1kIGlzIFNFUlZFUi4KKwkgKiBAcGFyYW0gbWQKKwkgKiBAcmV0dXJuIHRydWUgaWYgTWVzc2FnZURpcmVjdGlvbiBpcyBTRVJWRVIuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXIoTWVzc2FnZURpcmVjdGlvbiBtZCkKKwl7CisJCWlmIChtZCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAibWQgPT0gbnVsbCIgKTsKKwkJcmV0dXJuIG1kID09IE1lc3NhZ2VEaXJlY3Rpb24uU0VSVkVSOworCX0KKworCS8qKgorCSAqIEhlbHBlciBtZXRob2QuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWQgaXMgQ0xJRU5ULgorCSAqIEBwYXJhbSBtZAorCSAqIEByZXR1cm4gdHJ1ZSBpZiBNZXNzYWdlRGlyZWN0aW9uIGlzIENMSUVOVC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudChNZXNzYWdlRGlyZWN0aW9uIG1kKQorCXsKKwkJaWYgKG1kID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJtZCA9PSBudWxsIiApOworCQlyZXR1cm4gbWQgPT0gTWVzc2FnZURpcmVjdGlvbi5DTElFTlQ7CisJfQorCisJLyoqCisJICogSGVscGVyIG1ldGhvZHMuIFJldHVybiB0cnVlIGlmIHRoZSBtZCBpcyBCT1RILgorCSAqIEBwYXJhbSBtZAorCSAqIEByZXR1cm4gdHJ1ZSBpZiBNZXNzYWdlRGlyZWN0aW9uIGlzIEJPVEguCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCb3RoKCBNZXNzYWdlRGlyZWN0aW9uIG1kICkKKwl7CisJCWlmICggbWQgPT0gbnVsbCApCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJtZCA9PSBudWxsIiApOworCQlyZXR1cm4gbWQgPT0gTWVzc2FnZURpcmVjdGlvbi5CT1RIOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvcnJlY3QgcGF0aCB0byBhIHJlc291cmNlLgorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRocyB0byB0cnkgZm9yIG9wZW5pbmcgdGhlIHJlc291cmNlcworCSAqIEBwYXJhbSBmbiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW4KKwkgKiBAcmV0dXJuIHRoZSBjb3JyZWN0IHBhdGggdG8gYSByZXNvdXJjZQorCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoKFN0cmluZ1tdIHBhdGgsIFN0cmluZyBmbikKKwkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorCXsKKwkJZm9yIChTdHJpbmcgcDogcGF0aCkKKwkJeworCQkJaWYgKHAgPT0gbnVsbCkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJU3RyaW5nIHMgPSBwICsgZm47CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInRyeWluZyAiK3MgKTsKKwkJCQorCQkJdHJ5CisJCQl7CisJCQkJVVJMIHRlbXAgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2Uocyk7CisJCQkJaWYgKHRlbXAgIT0gbnVsbCkKKwkJCQkJCXJldHVybiBzOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJLy8gaWdub3JlCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJpZ25vcmluZyAiK2UgKTsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGZuKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIChvciBkZWxldGVzKSB0aGUgc3BlY2lmaWVkIGZpbGUuCisJICogQHBhcmFtIGRpcgorCSAqIEBwYXJhbSBmbgorCSAqIEBwYXJhbSBnZW4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvRmlsZSggT3V0cHV0IGRpciwgU3RyaW5nIGZuLCBMb2dIYW5kbGVyIGxoLCBHZW4gZ2VuICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoIGRpci5uZXdPdXRwdXRTdHJlYW0oIGZuICkgKTsKKwkJdHJ5CisJCXsKKwkJCWdlbi5ydW4oIHB3ICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQlwdy5jbG9zZSgpOworCQl9CisJfQorCisJLyoqCisJICogQXVnbWVudHMgdGhlIG1hcHBpbmcgZnJvbSB1c2VyIGRlZmluZWQgcmVzZXJ2ZWQgd29yZHMgdG8gdGhlIHJlc2VydmVkCisJICogd29yZHMgdXNlZCBieSB0aGUgY29tcGlsZXIgYXMgcGFyc2VkIGZyb20gYSByZXNlcnZlZCB3b3JkIGxpc3Qgc3RvcmVkIGluCisJICogYSBmaWxlIGxvY2F0ZWQgYXQgdGhlIHNwZWNpZmllZCBwYXRoLgorCSAqIEBwYXJhbSBmaWxlUGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHJlc2VydmVkIHdvcmQgbWFwcGluZworCSAqIEBwYXJhbSB3b3JkTWFwCisJICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgbWFwV29yZHMoU3RyaW5nIGZpbGVQYXRoLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHdvcmRNYXApCisJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisJeworCQlTdHJpbmcgY29tbWVudE1hcmtlciA9ICIjIjsKKwkJU3RyaW5nIHZhbHVlUHJlZml4ID0gIngiOworCQlTdHJpbmcga2V5VmFsdWVEZWxpbWV0ZXIgPSAiPSBcdCI7CisKKwkJLy8gT3BlbiBmaWxlIGZvciBwYXJzaW5nIG9yIHRocm93IGFuIEZpbGVOb3RGb3VuZEVycm9yIGlmIHJlc291cmNlcyBpcworCQkvLyB1bmF2YWlsYWJsZS4KKwkJQnVmZmVyZWRSZWFkZXIgZmlsZVJlYWRlciA9IG51bGw7CisJCXRyeQorCQl7CisJCQkvLyBBc3N1bWUgZmlsZSBpcyBpbnRlcm5hbCB0byBwcm9qZWN0OgorCQkJLy8gRUcpIG9yZy9hcGFjaGUvZXRjaC9jb21waWxlci9nbG9iYWxLZXl3b3JkcworCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlUGF0aCk7CisKKwkJCS8vIE90aGVyd2lzZSBpdCdzIGV4dGVybmFsCisJCQkvLyBFRykgLi4vZm9vL2Jhci9zb21lS2V5d29yZHMKKwkJCWlmIChudWxsID09IGlucHV0KQorCQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCk7CisKKwkJCS8vZmlsZVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVQYXRoKSkpOworCQkJZmlsZVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXQpKTsKKworCQkJU3RyaW5nIGN1cnJlbnRMaW5lID0gZmlsZVJlYWRlci5yZWFkTGluZSgpOworCQkJd2hpbGUgKG51bGwgIT0gY3VycmVudExpbmUpCisJCQl7CisJCQkJLy8gU3RyaXAgdHJhaWxpbmcgY29tbWVudHMgYW5kIHBhZGRlZCB3aGl0ZXNwYWNlCisJCQkJY3VycmVudExpbmUgPSBjdXJyZW50TGluZS50cmltKCk7CisJCQkJaWYgKGN1cnJlbnRMaW5lLmNvbnRhaW5zKGNvbW1lbnRNYXJrZXIpKQorCQkJCQljdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLnN1YnN0cmluZygwLCBjdXJyZW50TGluZS5pbmRleE9mKGNvbW1lbnRNYXJrZXIpKTsKKworCQkJCS8vIFNraXAgYmxhbmsgbGluZXMKKwkJCQlTdHJpbmdUb2tlbml6ZXIgY3VycmVudFRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3VycmVudExpbmUsIGtleVZhbHVlRGVsaW1ldGVyKTsKKwkJCQlpZiAoY3VycmVudFRva2Vucy5oYXNNb3JlVG9rZW5zKCkpCisJCQkJeworCQkJCQlTdHJpbmcga2V5IAk9IGN1cnJlbnRUb2tlbnMubmV4dFRva2VuKCk7CisJCQkJCVN0cmluZyB2YWx1ZTsKKworCQkJCQlpZiAoY3VycmVudFRva2Vucy5oYXNNb3JlVG9rZW5zKCkpCisJCQkJCQl2YWx1ZSA9IGN1cnJlbnRUb2tlbnMubmV4dFRva2VuKCk7CisJCQkJCWVsc2UKKwkJCQkJCXZhbHVlID0gQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGtleS5jb2RlUG9pbnRBdCgwKSkgPworCQkJCQkJCQl2YWx1ZVByZWZpeC50b1VwcGVyQ2FzZSgpICsga2V5IDoKKwkJCQkJCQkJdmFsdWVQcmVmaXggKyBrZXk7CisKKwkJCQkJd29yZE1hcC5wdXQoa2V5LCB2YWx1ZSk7CisJCQkJfQorCisJCQkJY3VycmVudExpbmUgPSBmaWxlUmVhZGVyLnJlYWRMaW5lKCk7CisJCQl9CisJCX0KKworCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKKwkJeworCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmaWxlUGF0aCk7CisJCX0KKworCQlmaW5hbGx5CisJCXsKKwkJCWlmIChudWxsICE9IGZpbGVSZWFkZXIpCisJCQkJZmlsZVJlYWRlci5jbG9zZSgpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIHdoYXQKKwkgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rpb24gZ2l2ZSAtLXdoYXQgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisJICovCisJcHJvdGVjdGVkIE1lc3NhZ2VEaXJlY3Rpb24gZ2V0TWVzc2FnZURpcmVjdGlvbihTZXQ8U3RyaW5nPiB3aGF0KQorCXsKKwkJaWYgKCB3aGF0LmNvbnRhaW5zKCBXSEFUX0JPVEggKSAgKQorCQkJcmV0dXJuIE1lc3NhZ2VEaXJlY3Rpb24uQk9USDsKKwkJCisJCWlmICggd2hhdC5jb250YWlucyggV0hBVF9TRVJWRVIgKSApCisJCQlyZXR1cm4gTWVzc2FnZURpcmVjdGlvbi5TRVJWRVI7CisJCQorCQlpZiAoIHdoYXQuY29udGFpbnMoIFdIQVRfQ0xJRU5UICkgKQorCQkJcmV0dXJuIE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5UOworCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJ3aGF0IG5vdCBjb3JyZWN0bHkgc3BlY2lmaWVkIiApOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gd2hhdAorCSAqIEByZXR1cm4gd2hhdCBtb2RpZmllZCB0byBhY2NvdW50IGZvciBpbnRlcmFjdGlvbiBvZiBvcHRpb25zLgorCSAqLworCXByb3RlY3RlZCBTZXQ8U3RyaW5nPiBwb3B1bGF0ZVdoYXQoIFNldDxTdHJpbmc+IHdoYXQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQljaGVja09wdGlvbiggd2hhdCApOworCQkKKwkJaWYgKHdoYXQuY29udGFpbnMoIFdIQVRfSEVMUCApKQorCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigKKwkJCQkic3BlY2lmeSB3aGF0IGFzIG9uZSBvciBtb3JlIG9mICIrd2hhdEhlbHAoKSApOworCQkKKwkJLy8gZGlyZWN0aW9uIGdyb3VwCisJCQorCQlpZiAoIXdoYXQuY29udGFpbnMoIFdIQVRfQ0xJRU5UICkKKwkJCSYmICF3aGF0LmNvbnRhaW5zKCBXSEFUX1NFUlZFUiApCisJCQkmJiAhd2hhdC5jb250YWlucyggV0hBVF9CT1RIICkgKQorCQl7CisJCQkvLyBkZWZhdWx0IHRvIEJPVEggaWYgbm9uZSBvZiB0aGUgZGlyZWN0aW9uIGdyb3VwIGlzIHByZXNlbnQuCisJCQl3aGF0LmFkZCggV0hBVF9CT1RIICk7CisJCQl3aGF0LmFkZCggV0hBVF9DTElFTlQgKTsKKwkJCXdoYXQuYWRkKCBXSEFUX1NFUlZFUiApOworCQl9CisJCWVsc2UgaWYgKHdoYXQuY29udGFpbnMoIFdIQVRfQk9USCApKQorCQl7CisJCQkvLyBCT1RIIGltcGxpZXMgQ0xJRU5UIGFuZCBTRVJWRVIKKwkJCXdoYXQuYWRkKCBXSEFUX0NMSUVOVCApOworCQkJd2hhdC5hZGQoIFdIQVRfU0VSVkVSICk7CisJCX0KKwkJZWxzZSBpZiAod2hhdC5jb250YWlucyggV0hBVF9DTElFTlQgKSAmJiB3aGF0LmNvbnRhaW5zKCBXSEFUX1NFUlZFUiApKQorCQl7CisJCQkvLyBDTElFTlQgYW5kIFNFUlZFUiB0b2dldGhlciBpbXBsaWVzIEJPVEgKKwkJCXdoYXQuYWRkKCBXSEFUX0JPVEggKTsKKwkJfQorCQkKKwkJLy8gdGhlcmUgYXJlIHRocmVlIHJlYXNvbmFibGUgb3V0Y29tZXMgb2YgdGhlIGFib3ZlIGxvZ2ljOgorCQkvLyBDTElFTlQKKwkJLy8gU0VSVkVSCisJCS8vIEJPVEgsIENMSUVOVCwgU0VSVkVSCisJCUFzc2VydGlvbi5jaGVjaygKKwkJCSAgIHdoYXQuY29udGFpbnMoIFdIQVRfQ0xJRU5UICkgJiYgIXdoYXQuY29udGFpbnMoIFdIQVRfU0VSVkVSICkgJiYgIXdoYXQuY29udGFpbnMoIFdIQVRfQk9USCApCisJCQl8fCAhd2hhdC5jb250YWlucyggV0hBVF9DTElFTlQgKSAmJiB3aGF0LmNvbnRhaW5zKCBXSEFUX1NFUlZFUiApICYmICF3aGF0LmNvbnRhaW5zKCBXSEFUX0JPVEggKQorCQkJfHwgd2hhdC5jb250YWlucyggV0hBVF9DTElFTlQgKSAmJiB3aGF0LmNvbnRhaW5zKCBXSEFUX1NFUlZFUiApICYmIHdoYXQuY29udGFpbnMoIFdIQVRfQk9USCApCisJCQksICJ3aGF0IGZpbGVzIGlzIHtDTElFTlR9LCB7U0VSVkVSfSwgT1Ige0NMSUVOVCxTRVJWRVIsQk9USH0iICk7CisJCQorCQkvLyBmaWxlcyBncm91cAorCQkKKwkJaWYgKCF3aGF0LmNvbnRhaW5zKCBXSEFUX0FMTCApCisJCQkmJiAhd2hhdC5jb250YWlucyggV0hBVF9OT05FICkKKwkJCSYmICF3aGF0LmNvbnRhaW5zKCBXSEFUX0lOVEYgKQorCQkJJiYgIXdoYXQuY29udGFpbnMoIFdIQVRfTUFJTiApCisJCQkmJiAhd2hhdC5jb250YWlucyggV0hBVF9JTVBMICkpCisJCXsKKwkJCS8vIGRlZmF1bHQgdG8gSU5URiBpZiBub25lIG9mIHRoZSBmaWxlIGdyb3VwIGlzIHByZXNlbnQuCisJCQl3aGF0LmFkZCggV0hBVF9JTlRGICk7CisJCX0KKwkJCisJCWlmICh3aGF0LmNvbnRhaW5zKCBXSEFUX0FMTCApKQorCQl7CisJCQl3aGF0LmFkZCggV0hBVF9JTlRGICk7CisJCQl3aGF0LmFkZCggV0hBVF9NQUlOICk7CisJCQl3aGF0LmFkZCggV0hBVF9JTVBMICk7CisJCQl3aGF0LnJlbW92ZSggV0hBVF9BTEwgKTsKKwkgICAgICAgIHdoYXQucmVtb3ZlKCBXSEFUX05PTkUgKTsKKwkJfQorCQkKKwkJaWYgKHdoYXQuY29udGFpbnMoIFdIQVRfTk9ORSApKQorCQl7CisJICAgICAgICB3aGF0LnJlbW92ZSggV0hBVF9JTlRGICk7CisJICAgICAgICB3aGF0LnJlbW92ZSggV0hBVF9NQUlOICk7CisJICAgICAgICB3aGF0LnJlbW92ZSggV0hBVF9JTVBMICk7CisJICAgICAgICB3aGF0LnJlbW92ZSggV0hBVF9OT05FICk7CisJCX0KKwkJCisJCXJldHVybiB3aGF0OworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja09wdGlvbiggU2V0PFN0cmluZz4gd2hhdCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNldDxTdHJpbmc+IHcgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCB3aGF0ICk7CisJCQorCQkvLyB3aGF0IGRpcmVjdGlvbiBncm91cAorCQl3LnJlbW92ZSggV0hBVF9DTElFTlQgKTsKKwkJdy5yZW1vdmUoIFdIQVRfU0VSVkVSICk7CisJCXcucmVtb3ZlKCBXSEFUX0JPVEggKTsKKwkJCisJCS8vIHdoYXQgZmlsZXMgZ3JvdXAKKwkJdy5yZW1vdmUoIFdIQVRfQUxMICk7CisJCXcucmVtb3ZlKCBXSEFUX05PTkUgKTsKKwkJdy5yZW1vdmUoIFdIQVRfSU5URiApOworCQl3LnJlbW92ZSggV0hBVF9NQUlOICk7CisJCXcucmVtb3ZlKCBXSEFUX0lNUEwgKTsKKwkJCisJCXcucmVtb3ZlKCBXSEFUX0ZPUkNFICk7CisJCXcucmVtb3ZlKCBXSEFUX0hFTFAgKTsKKwkJCisJCWlmICghdy5pc0VtcHR5KCkpCisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAorCQkJCSJiYWQgd2hhdCBvcHRpb24gdmFsdWUocyk6ICIrdworCQkJCSsiOyBzcGVjaWZ5IHdoYXQgYXMgb25lIG9yIG1vcmUgb2YgIgorCQkJCSsgd2hhdEhlbHAoKSApOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyB3aGF0SGVscCgpCisJeworCQlyZXR1cm4gV0hBVF9DTElFTlQKKwkJCSsiLCAiCisJCQkrV0hBVF9TRVJWRVIKKwkJCSsiLCAiCisJCQkrV0hBVF9CT1RICisJCQkrIiwgIgorCQkJK1dIQVRfQUxMCisJCQkrIiwgIgorCQkJK1dIQVRfTk9ORQorCQkJKyIsICIKKwkJCStXSEFUX0lOVEYKKwkJCSsiLCAiCisJCQkrV0hBVF9NQUlOCisJCQkrIiwgIgorCQkJK1dIQVRfSU1QTAorCQkJKyIsICIKKwkJCStXSEFUX0ZPUkNFCisJCQkrIiwgIgorCQkJK1dIQVRfSEVMUDsKKwl9CisKKworCS8qKgorCSAqIEBwYXJhbSB2bmFtZQorCSAqIEByZXR1cm4gZ2VuZXJpYyB0eXBlIHZuYW1lIGludG8gYSBiaW5kaW5nIGFwcHJvcHJpYXRlCisJICogdm5hbWUuCisJICovCisJYWJzdHJhY3QgcHVibGljIFN0cmluZyBtdHZuYW1lKCBTdHJpbmcgdm5hbWUgKTsKKworCS8qKgorCSAqIEBwYXJhbSB2bmFtZQorCSAqIEByZXR1cm4gZ2VuZXJpYyBmaWVsZCB2bmFtZSBpbnRvIGEgYmluZGluZyBhcHByb3ByaWF0ZQorCSAqIHZuYW1lLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgbWZ2bmFtZSggU3RyaW5nIHZuYW1lICk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBsYW5nIGJlaW5nIGNvbXBpbGVkLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpOworCisJLyoqCisJICogQHBhcmFtIG1zZyBhIE1lc3NhZ2Ugd2l0aCB0aGUgYXN5bmMgcmVjZWl2ZXIgcHJvcGVydHkuCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXN5bmMgcmVjZWl2ZXIgdGhyZWFkIHBvb2wgbmFtZSB0bworCSAqIHVzZSBmb3IgdGhpcyBhc3luYyByZWNlaXZlciBtZXRob2QuCisJICovCisJYWJzdHJhY3QgcHVibGljIFN0cmluZyBhc3luY1JlY2VpdmVyUG9vbE5hbWUoIE1lc3NhZ2UgbXNnICk7CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHByb3Blcmx5IGZvcm1hdHRlZCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVZhbHVlKCBUeXBlUmVmIHR5cGUsIFRva2VuIHZhbHVlICkKKwkJdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb247CisKKwkvKioKKwkgKiBAcGFyYW0gbgorCSAqIEBwYXJhbSBpc0V4Y2VwdAorCSAqIEByZXR1cm4gdGhlIHByb3Blcmx5IGZvcm1hdHRlZCAidG9TdHJpbmcoKSIgZm9ybWF0IHN0cmluZy4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKCBQYXJhbUxpc3Q8U2VydmljZT4gbiwKKwkJYm9vbGVhbiBpc0V4Y2VwdCApIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEByZXR1cm4gdHlwZSBuYW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgYXMgYSBzdHJ1Y3R1cmUKKwkgKiBlbGVtZW50IG9yIGV4Y2VwdGlvbiBwYXJhbWV0ZXIgb3IgZnVuY3Rpb24gcGFyYW1ldGVyCisJICogb3IgcmVzdWx0LgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoIFR5cGVSZWYgdHlwZSApOworCisJLyoqCisJICogQHBhcmFtIHR5cGUgdGhlIGV0Y2ggdHlwZQorCSAqIEByZXR1cm4gdGhlIGZ1bmRhbWVudGFsIG5hdGl2ZSB0eXBlIGZvciBqYXZhLiBzbyBldGNoCisJICogaW50IC0+IGphdmEgaW50LCB3aGlsZSBldGNoIHN0cmluZyAtPiBqYXZhIFN0cmluZy4gdGhpcworCSAqIGlzIHVzZWQgd2hlbiB0eXBpbmcgY29uc3RhbnRzIHRoYXQgZG9uJ3Qgd2FudCByZWYgdHlwZXMuCisJICovCisJYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXROYXRpdmVUeXBlTmFtZSggVHlwZVJlZiB0eXBlICk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBleHRlcm5hbCBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIGVudW0uIFRoaXMgbWlnaHQKKwkgKiBoYXZlIHRvIGJlIG1vZGlmaWVkIG92ZXIgdGhlIG5vcm1hbCBmcW5hbWUgZm9yIHRoZSBlbnVtLCB3aGljaCB3b3VsZAorCSAqIGJlIG1vZHVsZU5hbWUrJy4nK3NlcnZpY2VOYW1lKycuJytlbnVtTmFtZS4KKwkgKiBAcGFyYW0gZnFuYW1lCisJICogQHBhcmFtIG1vZHVsZU5hbWUKKwkgKiBAcGFyYW0gc2VydmljZU5hbWUKKwkgKiBAcGFyYW0gZW51bU5hbWUKKwkgKiBAcmV0dXJuIHRoZSBleHRlcm5hbCBmcW5hbWUuCisJICovCisJYWJzdHJhY3QgcHVibGljIFN0cmluZyBlbnVtX2VmcW5hbWUoIFN0cmluZyBmcW5hbWUsIFN0cmluZyBtb2R1bGVOYW1lLAorCQlTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBlbnVtTmFtZSApOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZXh0ZXJuYWwgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBlbnVtLiBUaGlzIG1pZ2h0CisJICogaGF2ZSB0byBiZSBtb2RpZmllZCBvdmVyIHRoZSBub3JtYWwgZnFuYW1lIGZvciB0aGUgZW51bSwgd2hpY2ggd291bGQKKwkgKiBiZSBtb2R1bGVOYW1lKycuJytzZXJ2aWNlTmFtZSsnLicrZW51bU5hbWUuCisJICogQHBhcmFtIGZxbmFtZQorCSAqIEBwYXJhbSBtb2R1bGVOYW1lCisJICogQHBhcmFtIHNlcnZpY2VOYW1lCisJICogQHBhcmFtIGVudW1OYW1lCisJICogQHJldHVybiB0aGUgZXh0ZXJuYWwgZnFuYW1lLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgc3RydWN0X2VmcW5hbWUoIFN0cmluZyBmcW5hbWUsIFN0cmluZyBtb2R1bGVOYW1lLAorCQlTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBlbnVtTmFtZSApOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZXh0ZXJuYWwgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBlbnVtLiBUaGlzIG1pZ2h0CisJICogaGF2ZSB0byBiZSBtb2RpZmllZCBvdmVyIHRoZSBub3JtYWwgZnFuYW1lIGZvciB0aGUgZW51bSwgd2hpY2ggd291bGQKKwkgKiBiZSBtb2R1bGVOYW1lKycuJytzZXJ2aWNlTmFtZSsnLicrZW51bU5hbWUuCisJICogQHBhcmFtIGZxbmFtZQorCSAqIEBwYXJhbSBtb2R1bGVOYW1lCisJICogQHBhcmFtIHNlcnZpY2VOYW1lCisJICogQHBhcmFtIGVudW1OYW1lCisJICogQHJldHVybiB0aGUgZXh0ZXJuYWwgZnFuYW1lLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZXhjZXB0X2VmcW5hbWUoIFN0cmluZyBmcW5hbWUsIFN0cmluZyBtb2R1bGVOYW1lLAorCQlTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBlbnVtTmFtZSApOworCisJLyoqCisJICogQHBhcmFtIGludGYgdGhlIGludGVyZmFjZSBvZiB0aGUgY29uc3RhbnQuCisJICogQHBhcmFtIG5hbWUgYW4gaWQgb3IgcWlkIHdoaWNoIHJlZmVyZW5jZXMgYSBjb25zdGFudC4KKwkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgZXh0ZXJuYWwgbmFtZS4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIHF1YWxpZnlDb25zdGFudE5hbWUoIFNlcnZpY2UgaW50ZiwgVG9rZW4gbmFtZSApOworCisJLyoqCisJICogQHBhcmFtIGludGYgdGhlIGludGVyZmFjZSBvZiB0aGUgZW51bS4KKwkgKiBAcGFyYW0gbmFtZSBhbiBpZCBvciBxaWQgd2hpY2ggcmVmZXJlbmNlcyBhbiBlbnVtLgorCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBleHRlcm5hbCBuYW1lLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgcXVhbGlmeUVudW1OYW1lKCBTZXJ2aWNlIGludGYsIFRva2VuIG5hbWUgKTsKKworCS8qKgorCSAqIEBwYXJhbSBuYW1lIGFuIGlkIG9yIHFpZCB3aGljaCByZWZlcmVuY2VzIGEgcGFyYW1ldGVyIG9mCisJICogYSBtZXRob2QuCisJICogQHJldHVybiB0aGUgcXVhbGlmaWVkIHBhcmFtZXRlciBuYW1lLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgcXVhbGlmeVBhcmFtZXRlck5hbWUoIFRva2VuIG5hbWUgKTsKKworCS8qKgorCSAqIEBwYXJhbSBuYW1lZAorCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRvciBmb3IgdGhlIHBhcmFtZXRlci4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvciggTmFtZWQ8Pz4gbmFtZWQgKTsKKworCS8qKgorCSAqIE9uY2UgYSBzZXJ2aWNlIGlzIGNyZWF0ZWQsIHRoZSBiaW5kaW5nIG1heSBhZGQgZGVmYXVsdAorCSAqIGl0ZW1zIHRvIGl0IHN1Y2ggYXMgc3RhbmRhcmQgdHlwZXMsIGV4dGVybnMsIGV0Yy4KKwkgKiBAcGFyYW0gc2VydmljZSBhIG5ld2x5IGNyZWF0ZWQgc2VydmljZSwgcmVhZHkgZm9yCisJICogZGVmYXVsdHMuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIGFkZERlZmF1bHRzKCBTZXJ2aWNlIHNlcnZpY2UgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb247CisKKwkvKioKKwkgKiBBZGRzIGFuIGV4dGVybiBkZWNsYXJhdGlvbiB0byB0aGUgc2VydmljZS4KKwkgKiBAcGFyYW0gc2VydmljZSB0aGUgc2VydmVyIHRvIGJlIG1vZGlmaWVkLgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSBleHRlcm4uCisJICogQHBhcmFtIGxhbmd1YWdlIHRoZSBsYW5ndWFnZSBiaW5kaW5nIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4KKwkgKiBAcGFyYW0geG5hbWUgdGhlIGJpbmRpbmcgc3BlY2lmaWMgbmFtZSBvZiB0aGUgdHlwZS4KKwkgKiBAcGFyYW0geG5hbWVJbXBvcnQgdGhlICJpbXBvcnQiIG9mIHRoZSB0eXBlIGlmIG5lZWRlZC4KKwkgKiBAcGFyYW0gc2VyaWFsaXplciB0aGUgYmluZGluZyBzcGVjaWZpYyBuYW1lIG9mIHRoZSBpbXBvcnQvZXhwb3J0IGhlbHBlci4KKwkgKiBAcGFyYW0gc2VyaWFsaXplckltcG9ydCB0aGUgImltcG9ydCIgb2YgdGhlIGltcG9ydC9leHBvcnQgaGVscGVyIGlmIG5lZWRlZC4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZXJuKCBTZXJ2aWNlIHNlcnZpY2UsIE5hbWUgbmFtZSwgVG9rZW4gbGFuZ3VhZ2UsCisJCVRva2VuIHhuYW1lLCBUb2tlbiB4bmFtZUltcG9ydCwgVG9rZW4gc2VyaWFsaXplciwKKwkJVG9rZW4gc2VyaWFsaXplckltcG9ydCApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJTWFwPFN0cmluZywgT3B0PiBvcHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPcHQ+KCk7CisJCW9wdHMucHV0KCAiRXh0ZXJuLiIrbGFuZ3VhZ2UuaW1hZ2UsIG5ldyBFeHRlcm4oIG5hbWUsIGxhbmd1YWdlLCB4bmFtZSwKKwkJCXhuYW1lSW1wb3J0LCBzZXJpYWxpemVyLCBzZXJpYWxpemVySW1wb3J0ICkgKTsKKwkJc2VydmljZS5hZGRFeHRlcm4oIG5hbWUsIG9wdHMgKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgYnVpbHQtaW4gZGVjbGFyYXRpb24gdG8gdGhlIHNlcnZpY2UuCisJICogQHBhcmFtIHNlcnZpY2UKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBiaW5kaW5nTmFtZQorCSAqIEBwYXJhbSBhbGxvd1N1YmNsYXNzCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEJ1aWx0aW4oIFNlcnZpY2Ugc2VydmljZSwgTmFtZSBuYW1lLCBTdHJpbmcgYmluZGluZ05hbWUsCisJCWJvb2xlYW4gYWxsb3dTdWJjbGFzcyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJc2VydmljZS5hZGRCdWlsdGluKCBuYW1lLCBiaW5kaW5nTmFtZSwgYWxsb3dTdWJjbGFzcyApOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuYW1lICh3aXRoIGFzc29jaWF0ZWQgSWQgdG9rZW4pLgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgTmFtZSB3aXRoIElEIHRva2VuLgorCSAqLworCXByb3RlY3RlZCBOYW1lIG5ld05hbWUoIFN0cmluZyBuYW1lICkKKwl7CisJCVRva2VuIHQgPSBuZXdJZCggbmFtZSApOworCQlyZXR1cm4gbmV3IE5hbWUoIHQsIG5hbWUgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhbiBJRCB0b2tlbi4KKwkgKiBAcGFyYW0gaWQKKwkgKiBAcmV0dXJuIHRoZSBJRCB0b2tlbi4KKwkgKi8KKwlwcm90ZWN0ZWQgVG9rZW4gbmV3SWQoIFN0cmluZyBpZCApCisJeworCQlyZXR1cm4gbmV3VG9rZW4oIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklELCBpZCApOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgU1RSIHRva2VuLgorCSAqIEBwYXJhbSBzCisJICogQHJldHVybiB0aGUgU1RSIHRva2VuLgorCSAqLworCXByb3RlY3RlZCBUb2tlbiBuZXdTdHJpbmcoIFN0cmluZyBzICkKKwl7CisJCXJldHVybiBuZXdUb2tlbiggRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSLCBzICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgYSB0b2tlbiBvZiBzcGVjaWZpZWQga2luZC4KKwkgKiBAcGFyYW0ga2luZAorCSAqIEBwYXJhbSBpbWFnZQorCSAqIEByZXR1cm4gdGhlIHRva2VuLgorCSAqLworCXByb3RlY3RlZCBUb2tlbiBuZXdUb2tlbiggaW50IGtpbmQsIFN0cmluZyBpbWFnZSApCisJeworCQlUb2tlbiB0ID0gbmV3IFRva2VuKCk7CisJCXQua2luZCA9IGtpbmQ7CisJCXQuaW1hZ2UgPSBpbWFnZTsKKwkJcmV0dXJuIHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvQ21kTGluZU9wdGlvbnMuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0NtZExpbmVPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0NjkwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0NtZExpbmVPcHRpb25zLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUgRXRjaCBjb21waWxlci4KKyAqLworcHVibGljIGNsYXNzIENtZExpbmVPcHRpb25zCit7CisJLyoqCisJICogTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hpY2ggY29udHJpYnV0ZXMgdG8gdGhlIGluY2x1ZGUgcGF0aC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFVENIX0lOQ0xVREVfUEFUSCA9ICJFVENIX0lOQ0xVREVfUEFUSCI7CisJCisgICAgLyoqCisgICAgICogU2VwYXJhdG9ycyBmb3IgaXRlbXMgaW4gdGhlICJ3aGF0IiBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdIQVRfREVMSU1FVEVSID0gIiw7OiAiOworCQorCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQ21kTGluZU9wdGlvbnMgZnJvbSBhbiBleGlzdGluZyBvbmUuCisJICogQHBhcmFtIG90aGVyCisJICovCisJcHVibGljIENtZExpbmVPcHRpb25zKCBDbWRMaW5lT3B0aW9ucyBvdGhlciApCisJeworCQlpbmNsdWRlUGF0aCA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oIG90aGVyLmluY2x1ZGVQYXRoICk7CisJCWlnbm9yZUdsb2JhbFdvcmRzTGlzdCA9IG90aGVyLmlnbm9yZUdsb2JhbFdvcmRzTGlzdDsKKwkJaWdub3JlTG9jYWxXb3Jkc0xpc3QgPSBvdGhlci5pZ25vcmVMb2NhbFdvcmRzTGlzdDsKKwkJdXNlcldvcmRzTGlzdCA9IG90aGVyLnVzZXJXb3Jkc0xpc3Q7CisJCW91dHB1dERpciA9IG90aGVyLm91dHB1dERpcjsKKwkJYmluZGluZyA9IG90aGVyLmJpbmRpbmc7CisJCXdoYXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCBvdGhlci53aGF0ICk7CisJCW1peGluT3V0cHV0RGlyID0gb3RoZXIubWl4aW5PdXRwdXREaXI7CisJCW5vTWl4aW5BcnRpZmFjdHMgPSBvdGhlci5ub01peGluQXJ0aWZhY3RzOworCQlub0ZsYXR0ZW5QYWNrYWdlcyA9IG90aGVyLm5vRmxhdHRlblBhY2thZ2VzOworCQlxdWlldCA9IG90aGVyLnF1aWV0OworCQl0ZW1wbGF0ZU91dHB1dERpciA9IG90aGVyLnRlbXBsYXRlT3V0cHV0RGlyOworCQlpZ25vcmVJbmNsdWRlUGF0aCA9IG90aGVyLmlnbm9yZUluY2x1ZGVQYXRoOworCQl0ZXN0aW5nID0gb3RoZXIudGVzdGluZzsKKwkJc291cmNlRmlsZSA9IG90aGVyLnNvdXJjZUZpbGU7CisJCS8vIEVQSEVNRVJBTCBTVFVGRiAvLworCQljbCA9IG90aGVyLmNsOworCQlsaCA9IG90aGVyLmxoOworCQllZmZlY3RpdmVJbmNsdWRlUGF0aCA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oIG90aGVyLmVmZmVjdGl2ZUluY2x1ZGVQYXRoICk7CisJCW91dHB1dCA9IG90aGVyLm91dHB1dDsKKwkJdGVtcGxhdGVPdXRwdXQgPSBvdGhlci50ZW1wbGF0ZU91dHB1dDsKKwkJbWl4aW5PdXRwdXQgPSBvdGhlci5taXhpbk91dHB1dDsKKwkJYmluZGluZ0NsYXNzID0gb3RoZXIuYmluZGluZ0NsYXNzOworCQliYWNrZW5kID0gb3RoZXIuYmFja2VuZDsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBDbWRMaW5lT3B0aW9ucy4KKwkgKi8KKwlwdWJsaWMgQ21kTGluZU9wdGlvbnMoKQorCXsKKwkJaW5jbHVkZVBhdGggPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisJCXdoYXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWVmZmVjdGl2ZUluY2x1ZGVQYXRoID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiBwYXRocyB0byBzZWFyY2ggZm9yIGluY2x1ZGVkIG9yIG1peGVkIGluIGZpbGVzICgtSSBvcHRpb24pLgorCSAqLworCXB1YmxpYyBMaXN0PEZpbGU+IGluY2x1ZGVQYXRoOworCisJLyoqCisJICogRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBpZ25vcmUgdGhlIGdsb2JhbGx5IHJlc2VydmVkIHdvcmQgbGlzdCAoLWcKKwkgKiBvcHRpb24pLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlnbm9yZUdsb2JhbFdvcmRzTGlzdDsKKworCS8qKgorCSAqIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBsb2NhbGx5IHJlc2VydmVkIHdvcmQgbGlzdCAoLWwKKwkgKiBvcHRpb24pLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlnbm9yZUxvY2FsV29yZHNMaXN0OworCisJLyoqCisJICogVGhlIHBhdGggb2YgdGhlIHVzZXItZGVmaW5lZCByZXNlcnZlZCB3b3JkcyBsaXN0ICgtVyBvcHRpb24pLgorCSAqLworCXB1YmxpYyBGaWxlIHVzZXJXb3Jkc0xpc3Q7CisKKwkvKioKKwkgKiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKC1kIG9wdGlvbikuIElmIG5vdAorCSAqIHNwZWNpZmllZCwgdGhlIHNhbWUgZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2UgZmlsZS4KKwkgKi8KKwlwdWJsaWMgRmlsZSBvdXRwdXREaXI7CisKKwkvKioKKwkgKiBUaGUgYmluZGluZyBuYW1lLiBFeGFtcGxlIHZhbHVlcyBhcmUgamF2YSwgY3NoYXJwLCBweXRob24sIHJ1YnksIGMsIGFuZAorCSAqIHhtbCAoLWIgb3B0aW9uKS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGJpbmRpbmc7CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyB0aGUgZmlsZShzKSB3ZSBuZWVkIHRvIGdlbmVyYXRlICgtdyBvcHRpb24pLiBWYWxpZCB2YWx1ZXMKKwkgKiBkZXBlbmQgdXBvbiB0aGUgYmluZGluZywgYnV0IGV4YW1wbGVzIGluY2x1ZGUgQk9USCwgU0VSVkVSLCBDTElFTlQsIEFMTCwKKwkgKiBJTlRGLCBJTVBMLCBNQUlOLCBOT05FLCBhbmQgRk9SQ0UuIEhFTFAgbWlnaHQgZ2l2ZSB5b3Ugc29tZS4gU2VwYXJhdGUKKwkgKiB2YWx1ZXMgdXNpbmcgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBmcm9tICIsOzogIiAoZS5nLiwgIkJPVEgsIElOVEYiLAorCSAqIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQgZm9yIG1hbnkgYmluZGluZ3MpLgorCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiB3aGF0OworCisJLyoqCisJICogVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgZ2VuZXJhdGVkIG1peGluIGZpbGVzICgtbSBvcHRpb24pLiBJZgorCSAqIG5vdCBzcGVjaWZpZWQsIGFuZCBpZiB7QGxpbmsgI25vTWl4aW5BcnRpZmFjdHN9IGFsbG93cywgbWl4aW4gYXJ0aWZhY3RzCisJICogYXJlIGdlbmVyYXRlZCBpbnRvIHtAbGluayAjb3V0cHV0RGlyfS4KKwkgKi8KKwlwdWJsaWMgRmlsZSBtaXhpbk91dHB1dERpcjsKKworCS8qKgorCSAqIEZsYWcgaW5kaWNhdGVzIHRoYXQgbWl4aW4gYXJ0aWZhY3RzIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkICgtbiBvcHRpb24pLgorCSAqIElmIGZhbHNlLCBtaXhpbiBhcnRpZmFjdHMgYXJlIGdlbmVyYXRlZCBpbnRvIHtAbGluayAjbWl4aW5PdXRwdXREaXJ9LgorCSAqLworCXB1YmxpYyBib29sZWFuIG5vTWl4aW5BcnRpZmFjdHM7CisKKwkvKioKKwkgKiBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtb2R1bGUgbmFtZSBzaG91bGQgc2hvdWxkIGJlIGZsYXR0ZW5lZCB0bworCSAqIHByb2R1Y2UgYSBzaW5nbGUgZGlyZWN0b3J5IG9yIGEgZGlyZWN0b3J5IHRyZWUgKGUuZy4sIGZvciBjc2hhcnApICgtZgorCSAqIG9wdGlvbikuCisJICovCisJcHVibGljIGJvb2xlYW4gbm9GbGF0dGVuUGFja2FnZXM7CisKKwkvKioKKwkgKiBGbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjb21waWxlciBzaG91bGQgbm90IHJlcG9ydCBwcm9ncmVzcyAoLXEgb3B0aW9uKS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBxdWlldDsKKworCS8qKgorCSAqIERlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgdXNlciBlZGl0YWJsZSB0ZW1wbGF0ZSBmaWxlcyAoLXQgb3B0aW9uKS4KKwkgKiBJZiBub3Qgc3BlY2lmaWVkLCBzYW1lIGFzIHtAbGluayAjb3V0cHV0RGlyfS4KKwkgKi8KKwlwdWJsaWMgRmlsZSB0ZW1wbGF0ZU91dHB1dERpcjsKKworCS8qKgorCSAqIElnbm9yZSB0aGUgRVRDSF9JTkNMVURFX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgKC1pIG9wdGlvbikuCisJICovCisJcHVibGljIGJvb2xlYW4gaWdub3JlSW5jbHVkZVBhdGg7CisKKwkvKioKKwkgKiBXZSdyZSBqdXN0IHRlc3RpbmcgdGhlIGNvbXBpbGVyLCBkb24ndCB3cml0ZSBhbnkgZmlsZXMgKC0tdGVzdGluZyBvcHRpb24pLgorCSAqLworCXB1YmxpYyBib29sZWFuIHRlc3Rpbmc7CisKKwkvKioKKwkgKiBUaGUgc291cmNlIGZpbGUgdG8gY29tcGlsZS4KKwkgKi8KKwlwdWJsaWMgRmlsZSBzb3VyY2VGaWxlOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRVBIRU1FUkFMIFNUVUZGIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBUaGUgYmluZGluZyBjbGFzcyBsb2FkZXIuCisJICovCisJcHVibGljIENsYXNzTG9hZGVyIGNsOworCQorCS8qKgorCSAqIERlc3RpbmF0aW9uIG9mIHZhcmlvdXMgZXJyb3Igb3Igc3RhdHVzIG1lc3NhZ2VzLgorCSAqLworCXB1YmxpYyBMb2dIYW5kbGVyIGxoOworCisJLyoqCisJICogQ29tcHV0ZWQgZWZmZWN0aXZlIGluY2x1ZGVQYXRoLCBpbmNsdWRpbmcgcGFyZW50IGRpciBvZiBzb3VyY2UgZmlsZSwKKwkgKiBpbmNsdWRlIHBhdGggY29tbWFuZCBsaW5lIGVsZW1lbnRzLCBhbmQgcGF0aCBlbGVtZW50cyBmcm9tIHN5c3RlbQorCSAqIGVudmlyb25tZW50IHZhcmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PEZpbGU+IGVmZmVjdGl2ZUluY2x1ZGVQYXRoOworCisJLyoqCisJICogT3V0cHV0IGZvciBzZXJ2aWNlIGdlbmVyYXRlZCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgT3V0cHV0IG91dHB1dDsKKworCS8qKgorCSAqIE91dHB1dCBmb3Igc2VydmljZSB1c2VyLWVkaXRhYmxlIGdlbmVyYXRlZCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgT3V0cHV0IHRlbXBsYXRlT3V0cHV0OworCisJLyoqCisJICogT3V0cHV0IGZvciBtaXhlZCBpbiBhcnRpZmFjdHMuCisJICovCisJcHVibGljIE91dHB1dCBtaXhpbk91dHB1dDsKKyAgICAKKwkvKioKKwkgKiBUaGUgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgYmluZGluZy4KKwkgKi8KKwlwdWJsaWMgQ2xhc3M8Pz4gYmluZGluZ0NsYXNzOworICAgIAorCS8qKgorCSAqIFRoZSBpbnN0YW5jZSBvZiBiaW5kaW5nQ2xhc3MgdXNlZCB0byBnZW5lcmF0ZWQgY29kZS4KKwkgKi8KKwlwdWJsaWMgQmFja2VuZCBiYWNrZW5kOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvQ29uc29sZUxvZ0hhbmRsZXIuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0NvbnNvbGVMb2dIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwNGY5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0NvbnNvbGVMb2dIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgTG9nSGFuZGxlciBJbnRlcmZhY2UgZm9yIENvbXBpbGVyCisgKiBAYXV0aG9yIGdzYW5kaGlyCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29uc29sZUxvZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0hhbmRsZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBDb21waWxlckxvZ0hhbmRsZXIgYW5kIHNldHMgdGhlIGluaXRpYWwgcGhhc2UuCisJICogQHBhcmFtIHBoYXNlCisJICovCisJcHVibGljIENvbnNvbGVMb2dIYW5kbGVyKCBTdHJpbmcgcGhhc2UgKQorCXsKKwkJc3VwZXIoIHBoYXNlICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIENvbXBpbGVyTG9nSGFuZGxlci4KKwkgKi8KKwlwdWJsaWMgQ29uc29sZUxvZ0hhbmRsZXIoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBsb2coIE1lc3NhZ2UgbXNnICkKKwl7CisJCVByaW50U3RyZWFtIHBzID0gc2VsZWN0UHJpbnRTdHJlYW0oIG1zZy5sZXZlbCApOworCQkKKwkJLy8gRXRjaCA6IExldmVsIDogUGhhc2UgOiBTb3VyY2UgW2xpbmUgTGluZV0gOiBtc2cKKwkJCisJCXBzLnByaW50KCAiRXRjaCIgKTsJCQorCQlmb3JtYXRMZXZlbCggcHMsIG1zZy5sZXZlbCApOworCQlmb3JtYXRQaGFzZSggcHMsIG1zZy5waGFzZSApOworCQlmb3JtYXRTb3VyY2UoIHBzLCBtc2cuc291cmNlLCBtc2cubGluZU51bWJlciApOworCQlmb3JtYXRNc2coIHBzLCBtc2cubXNnICk7CisJCXBzLnByaW50bG4oKTsKKwkJCisJCWZvcm1hdEhpc3RvcnkoIG1zZy5oaXN0b3J5ICk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUCA9ICIgOiAiOworCisJcHJpdmF0ZSB2b2lkIGZvcm1hdExldmVsKCBQcmludFN0cmVhbSBwcywgaW50IGxldmVsICkKKwl7CisJCXBzLnByaW50KCBTRVAgKTsKKwkJc3dpdGNoIChsZXZlbCkKKwkJeworCQkJY2FzZSBMRVZFTF9JTkZPOgorCQkJCXBzLnByaW50KCAiSSIgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTEVWRUxfV0FSTklORzoKKwkJCQlwcy5wcmludCggIlciICk7CisJCQkJYnJlYWs7CisJCQljYXNlIExFVkVMX0VSUk9SOgorCQkJCXBzLnByaW50KCAiRSIgKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHMucHJpbnQoICI/IiApOworCQkJCWJyZWFrOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZvcm1hdFBoYXNlKCBQcmludFN0cmVhbSBwcywgU3RyaW5nIHBoYXNlICkKKwl7CisJCXBzLnByaW50KCBTRVAgKTsKKwkJaWYgKHBoYXNlICE9IG51bGwgJiYgcGhhc2UubGVuZ3RoKCkgPiAwKQorCQkJcHMucHJpbnQoIHBoYXNlICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZvcm1hdFNvdXJjZSggUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBzb3VyY2UsIEludGVnZXIgbGluZU51bWJlciApCisJeworCQlpZiAoc291cmNlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJzb3VyY2UgPT0gbnVsbCIgKTsKKwkJCisJCXBzLnByaW50KCBTRVAgKTsKKwkJaWYgKGxpbmVOdW1iZXIgIT0gbnVsbCAmJiBsaW5lTnVtYmVyICE9IDApCisJCQlwcy5wcmludGYoICIlcyBsaW5lICVkIiwgc291cmNlLCBsaW5lTnVtYmVyLmludFZhbHVlKCkgKTsKKwkJZWxzZQorCQkJcHMucHJpbnQoIHNvdXJjZSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZm9ybWF0TXNnKCBQcmludFN0cmVhbSBwcywgU3RyaW5nIG1zZyApCisJeworCQlwcy5wcmludCggU0VQICk7CisJCXBzLnByaW50KCBtc2cgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZm9ybWF0SGlzdG9yeSggSGlzdG9yeVtdIGhpc3RvcnkgKQorCXsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgZm9ybWF0SGlzdG9yeQorCX0KKworCXByaXZhdGUgUHJpbnRTdHJlYW0gc2VsZWN0UHJpbnRTdHJlYW0oIGludCBsZXZlbCApCisJeworCQlzd2l0Y2ggKGxldmVsKQorCQl7CisJCQljYXNlIExFVkVMX0VSUk9SOgorCQkJCXJldHVybiBTeXN0ZW0uZXJyOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gU3lzdGVtLm91dDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0V0Y2hDb21waWxlci5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvRXRjaENvbXBpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2MmZlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0V0Y2hDb21waWxlci5qYXZhCkBAIC0wLDAgKzEsNjIyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1vZHVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5PcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5TZXJ2aWNlOworCisKKy8qKgorICogVGhlIG1haW4gZHJpdmVyIG9mIHRoZSBjb21waWxlci4KKyAqLworcHVibGljIGNsYXNzIEV0Y2hDb21waWxlcgoreworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlIGEgbmV3IGNvbXBpbGVyCisgICAgICogQHBhcmFtIGNsIHRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGJpbmRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgRXRjaENvbXBpbGVyKCBDbGFzc0xvYWRlciBjbCApCisgICAgeworICAgIAl0aGlzLmNsID0gY2w7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgY2w7CisgICAgCisgICAgLyoqCisgICAgICogUnVucyB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBpbnB1dCBvcHRpb25zLgorICAgICAqIEBwYXJhbSBjbG8KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oIENtZExpbmVPcHRpb25zIGNsbyApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgCWNsby5jbCA9IGNsOworICAgIAkKKyAgICAJaWYgKGNsby5saCA9PSBudWxsKQorICAgIAl7CisJICAgIAljbG8ubGggPSBuZXcgQ29uc29sZUxvZ0hhbmRsZXIoICJDb21tYW5kIiApOworCSAgICAJY2xvLmxoLnNldExldmVsKAorCSAgICAJCWNsby5xdWlldCA/IExvZ0hhbmRsZXIuTEVWRUxfV0FSTklORyA6IExvZ0hhbmRsZXIuTEVWRUxfSU5GTyApOworICAgIAl9CisgICAgCQorICAgIAlpZiAoIWluaXRCaW5kaW5nQ2xhc3MoIGNsbyApKQorICAgIAkJcmV0dXJuOworICAgIAkKKyAgICAJaWYgKCFjaGVja1NvdXJjZUZpbGUoIGNsbyApKQorICAgIAkJcmV0dXJuOworICAgIAkKKyAgICAJaW5pdE91dHB1dCggY2xvICk7CisgICAgICAgIGNsby5saC5wdXNoKCBjbG8uc291cmNlRmlsZS5nZXROYW1lKCksIG51bGwgKTsKKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisJCQljb21waWxlKCBjbG8gKTsKKwkgICAgCQorCQkJaWYgKCFjbG8ubGguaGFzRXJyb3IoKSkKKwkJCXsKKwkJICAgICAgICBjbG8ubGgucmVwb3J0KCBMb2dIYW5kbGVyLkxFVkVMX0lORk8sICJTYXZpbmcgUmVzb3VyY2VzLi4uIiApOworCQkgICAgICAgIAorCQkgICAgICAgIHNhdmVPdXRwdXQoIGNsbyApOworCQkgICAgICAgIAorCQkgICAgICAgIGlmICghY2xvLmxoLmhhc0Vycm9yKCkpCisJCSAgICAgICAgCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfSU5GTywgIlNhdmluZyBSZXNvdXJjZXMgRG9uZS4iICk7CisJCSAgICAgICAgZWxzZQorCQkgICAgICAgIAljbG8ubGgucmVwb3J0KCBMb2dIYW5kbGVyLkxFVkVMX0lORk8sICJTYXZpbmcgUmVzb3VyY2VzIEZhaWxlZC4iICk7CisJCQl9CisJCQllbHNlCisJCQkJY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9JTkZPLCAiQ29tcGlsZSBGYWlsZWQuIiApOworCSAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIAljbG8ubGgucmVwb3J0KCBMb2dIYW5kbGVyLkxFVkVMX0VSUk9SLCAiY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlICk7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAJY2xvLmxoLnBvcCggY2xvLnNvdXJjZUZpbGUuZ2V0TmFtZSgpICk7CisgICAgICAgIH0KKyAgICB9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRCaW5kaW5nQ2xhc3MoIENtZExpbmVPcHRpb25zIGNsbyApCisJeworCQlpZiAoY2xvLmJpbmRpbmdDbGFzcyAhPSBudWxsKQorCQkJcmV0dXJuIHRydWU7CisKKwkJU3RyaW5nIG4gPSBjbG8uYmluZGluZzsKKwkJCisJCWlmIChuID09IG51bGwgfHwgbi5sZW5ndGgoKSA9PSAwKQorCQl7CisJCQljbG8ubGgucmVwb3J0KCBMb2dIYW5kbGVyLkxFVkVMX0VSUk9SLAorCQkJCSJCaW5kaW5nIG5vdCBzcGVjaWZpZWQuIiApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlpZiAobi5lcXVhbHNJZ25vcmVDYXNlKCAiaGVscCIgKSkKKwkJeworCQkJLy8gVE9ETyBmaW5kIHNvbWUgd2F5IHRvIGxpc3QgdGhlIGJpbmRpbmdzPworCQkJY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwKKwkJCQkiQmluZGluZyBoZWxwIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIiApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlpZiAobi5lcXVhbHNJZ25vcmVDYXNlKCAibnVsbCIgKSkKKwkJeworCQkJY2xvLmJpbmRpbmdDbGFzcyA9IE51bGxDb21waWxlci5jbGFzczsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlTdHJpbmcgY24gPSBTdHJpbmcuZm9ybWF0KCBCSU5ESU5HX0ZPUk1BVCwgbiApOworCQkKKwkJdHJ5CisJCXsKKwkJCWNsby5iaW5kaW5nQ2xhc3MgPSBjbG8uY2wubG9hZENsYXNzKCBjbiApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQorCQl7CisJCQljbG8ubGgucmVwb3J0KCBMb2dIYW5kbGVyLkxFVkVMX0VSUk9SLAorCQkJCSJCaW5kaW5nICclcycgY291bGQgbm90IGJlIGxvYWRlZDsgY2xhc3MgJyVzJyBub3QgaW4gY2xhc3NwYXRoLiIsCisJCQkJbiwgY24gKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQljYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gZSApCisJCXsKKwkJCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfRVJST1IsCisJCQkJIkJpbmRpbmcgJyVzJyBjb3VsZCBub3QgYmUgbG9hZGVkOyBjbGFzcyAnJXMnIHRocmV3IGV4Y2VwdGlvbiAlcyIsCisJCQkJbiwgY24sIGUgKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0QmFja2VuZCggQ21kTGluZU9wdGlvbnMgY2xvICkKKwl7CisJCXRyeQorCQl7CisJCQljbG8uYmFja2VuZCA9IChCYWNrZW5kKSBjbG8uYmluZGluZ0NsYXNzLm5ld0luc3RhbmNlKCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwKKwkJCQkiQmluZGluZyAnJXMnIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZDsgY2F1Z2h0IGV4Y2VwdGlvbiAlcy4iLAorCQkJCWNsby5iaW5kaW5nLCBlICk7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBCSU5ESU5HX0ZPUk1BVCA9ICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuJXMuY29tcGlsZXIuQ29tcGlsZXIiOworCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1NvdXJjZUZpbGUoIENtZExpbmVPcHRpb25zIGNsbyApCisJeworCQlGaWxlIGYgPSBjbG8uc291cmNlRmlsZTsKKwkJCisJCWlmICghZi5pc0ZpbGUoKSkKKwkJeworCQkJY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwKKwkJCQkiU291cmNlIGZpbGUgJyVzJyBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBmaWxlLiIsIGYgKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJaWYgKCFmLmdldE5hbWUoKS5lbmRzV2l0aCggIi5ldGNoIiApKQorCQl7CisJCQljbG8ubGgucmVwb3J0KCBMb2dIYW5kbGVyLkxFVkVMX0VSUk9SLAorCQkJCSJTb3VyY2UgZmlsZSAnJXMnIG11c3QgaGF2ZSAuZXRjaCBleHRlbnNpb24uIiwgZiApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKyAgICAgKiBAcGFyYW0gZXRjaEhvbWUgY29tbWFuZCBsaW5lIHNwZWNpZmllZCBsb2NhdGlvbiBmb3IgdGhlIGV0Y2guCisgICAgICogQHJldHVybiBzZXRzIHVwIHRoZSBjbGFzcyBsb2FkZXIgYmFzZWQgb24gaW5mb3JtYXRpb24gZnJvbQorICAgICAqIG91ciBlbnZpcm9ubWVudC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgc2V0dXBDbGFzc0xvYWRlciggRmlsZSBldGNoSG9tZSApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBjbGFzcyBwYXRoLi4uCisgICAgICAgIAorICAgICAgICBTZXQ8U3RyaW5nPiBtYWluQ2xhc3NQYXRoID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBFdGNoTWFpbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoY2wgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChVUkwgdTogKChVUkxDbGFzc0xvYWRlcikgY2wpLmdldFVSTHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAocy5zdGFydHNXaXRoKCAiZmlsZToiICkgJiYgcy5lbmRzV2l0aCggIi5qYXIiICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSggdS50b1VSSSgpICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpICYmIGYuY2FuUmVhZCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gZi5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYWluQ2xhc3NQYXRoLmFkZCggcyApOworLy8gICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibWFpbkNsYXNzUGF0aC5hZGQ6ICIrcyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBzZWFyY2ggZXRjaC5ob21lIChpZiBzcGVjaWZpZWQpIGZvciBtb3JlIGphciBmaWxlcyB0byBhZGQKKyAgICAgICAgLy8gdG8gYSBzZWNvbmRhcnkgY2xhc3MgbG9hZGVyLiBleGNsdWRlIGphciBmaWxlcyBvbiB0aGUgbWFpbgorICAgICAgICAvLyBjbGFzcyBwYXRoLgorICAgICAgICAKKyAgICAgICAgU3RyaW5nIHMgPSBldGNoSG9tZSAhPSBudWxsID8gZXRjaEhvbWUuZ2V0Q2Fub25pY2FsUGF0aCgpIDogbnVsbDsKKyAgICAgICAgCisgICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorICAgICAgICB7CisgICAgICAgIAkvLyBmcm9tIGphdmEgLURldGNoLmhvbWU9Li4uCisgICAgICAgICAgICBzID0gU3lzdGVtLmdldFByb3BlcnR5KCAiZXRjaC5ob21lIiApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHMgPSBTeXN0ZW0uZ2V0ZW52KCAiRVRDSF9IT01FIiApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgcyA9IHMgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiOworCisgICAgICAgIC8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiZXRjaC5ob21lLmxpYiA9ICIrcyApOworICAgICAgICBpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZSggcyApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWQuaXNEaXJlY3RvcnkoKSB8fCAhZC5jYW5SZWFkKCkpCisgICAgICAgICAgICAJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgCQkiU3BlY2lmaWVkICRFVENIX0hPTUUvbGliIGlzIG5vdCBhIGRpcmVjdG9yeTogJXNcbiIsIHMgKSApOworCisgICAgICAgICAgICBkID0gZC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE15VVJMQ2xhc3NMb2FkZXIgbmNsID0gbmV3IE15VVJMQ2xhc3NMb2FkZXIoIG5ldyBVUkxbXSB7fSwgY2wgKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmOiBkLmxpc3RGaWxlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZi5pc0ZpbGUoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgU3RyaW5nIHggPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXguZW5kc1dpdGgoICIuamFyIiApKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIW1haW5DbGFzc1BhdGguY29udGFpbnMoIHggKSkKKyAgICAgICAgICAgICAgICAgICAgbmNsLmFkZFVSTCggZi50b1VSSSgpLnRvVVJMKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsID0gbmNsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlVUkxDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyBqdXN0IGEgY2xhc3MgbG9hZGVyIHdoZXJlIHdlIGNhbiBoYW5nIG1vcmUgdXJscyB0bworICAgICAgICAgKiBzZWFyY2guCisgICAgICAgICAqIEBwYXJhbSB1cmxzCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeVVSTENsYXNzTG9hZGVyKCBVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlciggdXJscywgcGFyZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRVUkwoIFVSTCB1cmwgKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5hZGRVUkwoIHVybCApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIGluY2x1ZGVQYXRoCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHtAbGluayBDbWRMaW5lT3B0aW9ucyNlZmZlY3RpdmVJbmNsdWRlUGF0aH0gZ2l2ZW4gdGhlCisgICAgICogY29tcGlsYXRpb24gd2UgYXJlIGFib3V0IHRvIHBlcmZvcm0uCisgICAgICogQHBhcmFtIGNsbworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEluY2x1ZGVQYXRoKCBDbWRMaW5lT3B0aW9ucyBjbG8gKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisvLyAgICAJU3lzdGVtLm91dC5wcmludGxuKCAiaW5pdEluY2x1ZGVQYXRoOiBzb3VyY2VGaWxlID0gIitjbG8uc291cmNlRmlsZSApOworLy8gICAgCVN5c3RlbS5vdXQucHJpbnRsbiggImluaXRJbmNsdWRlUGF0aDogaW5jbHVkZVBhdGggPSAiK2Nsby5pbmNsdWRlUGF0aCApOworICAgIAkKKyAgICAJLy8gaW5jbHVkZVBhdGggaXMgY29tcG9zZWQgb2YgdGhlIHNvdXJjZSBmaWxlJ3MgZGlyZWN0b3J5LCB0aGVuCisgICAgCS8vIHRoZSBwYXRocyBzcGVjaWZpZXMgYnkgLUkgY29tbWFuZCBsaW5lIGRpcmVjdGl2ZXMsIHRoZW4gdGhlCisgICAgCS8vIHBhdGhzIHNwZWNpZmllZCBieSB0aGUgRVRDSF9JTkNMVURFX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgCQorICAgIAljbG8uZWZmZWN0aXZlSW5jbHVkZVBhdGggPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCApOworICAgIAkKKyAgICAJLy8gYWRkIGRpcmVjdG9yeSBvZiBzb3VyY2UgZmlsZS4KKyAgICAJaWYgKGNsby5zb3VyY2VGaWxlICE9IG51bGwpCisgICAgCQljbG8uZWZmZWN0aXZlSW5jbHVkZVBhdGguYWRkKAorICAgIAkJCWNsby5zb3VyY2VGaWxlLmdldENhbm9uaWNhbEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkgKTsKKyAgICAJCisgICAgCWZvciAoRmlsZSBmOiBjbG8uaW5jbHVkZVBhdGgpCisgICAgCXsKKyAgICAJCWlmIChmLmlzRGlyZWN0b3J5KCkpCisgICAgCQkJY2xvLmVmZmVjdGl2ZUluY2x1ZGVQYXRoLmFkZCggZiApOworICAgIAkJZWxzZQorICAgIAkJCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfV0FSTklORywKKyAgICAgICAgICAgIAkJIkluY2x1ZGUgcGF0aCBlbGVtZW50IGRvZXNuJ3QgZXhpc3Q6ICVzIiwgZiApOworICAgIAl9CisgICAgCQorICAgIAlpZiAoIWNsby5pZ25vcmVJbmNsdWRlUGF0aCkKKyAgICAJeworCSAgICAgICAgU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0ZW52KCBDbWRMaW5lT3B0aW9ucy5FVENIX0lOQ0xVREVfUEFUSCApOworCSAgICAgICAgaWYgKHMgIT0gbnVsbCkKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBzLCBGaWxlLnBhdGhTZXBhcmF0b3IgKTsKKwkgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIHN0Lm5leHRUb2tlbigpICk7CisJICAgICAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpCisJICAgICAgICAgICAgICAgIAljbG8uZWZmZWN0aXZlSW5jbHVkZVBhdGguYWRkKCBmICk7CisJICAgICAgICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICAgICAgCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfV0FSTklORywKKwkgICAgICAgICAgICAgICAgCQkiRW52aXJvbm1lbnQgaW5jbHVkZSBwYXRoIGVsZW1lbnQgZG9lc24ndCBleGlzdDogJXMiLCBmICk7CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorICAgIAl9CisvLyAgICAJU3lzdGVtLm91dC5wcmludGxuKCAiaW5pdEluY2x1ZGVQYXRoOiBlZmZlY3RpdmVJbmNsdWRlUGF0aCA9ICIrY2xvLmVmZmVjdGl2ZUluY2x1ZGVQYXRoICk7CisgICAgfQorCisJcHJpdmF0ZSBzdGF0aWMgTW9kdWxlIGNvbXBpbGUoIENtZExpbmVPcHRpb25zIGNsbyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUlucHV0U3RyZWFtIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oIGNsby5zb3VyY2VGaWxlICkgKTsKKyAgICAJdHJ5CisJCXsKKwkJCXJldHVybiBjb21waWxlKCBjbG8sIGlzICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQlpcy5jbG9zZSgpOworCQl9CisJfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIE1vZHVsZSBjb21waWxlKCBDbWRMaW5lT3B0aW9ucyBjbG8sIElucHV0U3RyZWFtIGlzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKyAgICAJaW5pdEluY2x1ZGVQYXRoKCBjbG8gKTsKKyAgICAJCisgICAgCWlmICghaW5pdEJhY2tlbmQoIGNsbyApKQorICAgIAkJcmV0dXJuIG51bGw7CisgICAgCQorICAgIAlpZiAoY2xvLnNvdXJjZUZpbGUgIT0gbnVsbCkKKyAgICAJCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfSU5GTywgIkNvbXBpbGluZyAlcy4uLiIsIGNsby5zb3VyY2VGaWxlICk7CisgICAgCWVsc2UKKyAgICAJCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfSU5GTywgIkNvbXBpbGluZy4uLiIgKTsKKyAgICAJCisgICAgCWZpbmFsIEV0Y2hHcmFtbWFyIHBhcnNlciA9IG5ldyBFdGNoR3JhbW1hciggY2xvLmJhY2tlbmQsIGlzICk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBNb2R1bGUgbTsKKyAgICAgICAgCisgICAgICAgIC8vIFBhcnNlIC5ldGNoIHNvdXJjZQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbSA9IHBhcnNlci5tb2R1bGUoIGNsbyApOworICAgICAgICAgICAgY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9JTkZPLCAiUGFyc2VkIE9rLiIgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbS5jaGVjaygpOworICAgICAgICAgICAgY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9JTkZPLCAiQ2hlY2tlZCBPay4iICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBQYXJzZUV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGZtdCA9IGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgIAllLmN1cnJlbnRUb2tlbiAhPSBudWxsID8gZS5jdXJyZW50VG9rZW4uYmVnaW5MaW5lIDogbnVsbCwKKyAgICAgICAgICAgIAkJZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIC8vIFRPRE8gYmV0dGVyIHJlcG9ydCBvZiBhIFBhcnNlRXhjZXB0aW9uCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUuY3VycmVudFRva2VuICsgIiAiICsgZm10KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9FUlJPUiwgImNhdWdodCBleGNlcHRpb246ICVzIiwgZSApOworICAgICAgICAgICAgLy8gVE9ETyBiZXR0ZXIgcmVwb3J0IG9mIGFuIEV4Y2VwdGlvbgorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ29kZSBnZW5lcmF0aW9uCisgICAgICAgIAorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyByZXBvcnQgd29yayBsaXN0cz8KKyAgICAgICAgCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfSU5GTywgIkdlbmVyYXRpbmcgUmVzb3VyY2VzLi4uIiApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBUT0RPIGludGVncmF0ZSBpbmNsdWRlUGF0aCB3aXRoIGNvZGUgZ2VuZXJhdGlvbi4KKyAgICAgICAgICAgIGNsby5iYWNrZW5kLmdlbmVyYXRlKCBtLCBjbG8gKTsKKworICAgICAgICAgICAgLy8gTW92ZSBnZW5lcmF0ZWQgY29kZSB0byB0YXJnZXQgbG9jYXRpb24KKyAgICAgICAgICAgIC8vICAgdGhlIHBhcnNlciB3aWxsIHNldCAnaXNNaXhpblByZXNlbnQnIGlmIGEgIm1peGluIiBkaXJlY3RpdmUgaXMgaW4gdGhlIC5ldGNoIGZpbGUKKyAgICAgICAgICAgIC8vIFRPRE8gd291bGQgYmUgbmljZSBpZiB0aGUgYmFja2VuZCBqdXN0IHB1dCB0aGluZ3MgaW4gdGhlIHJpZ2h0IHBsYWNlIGZyb20gdGhlIHN0YXJ0IC4uIHNpZ2ggcmUtZmFjdG9yIGxhdGVyICAgICAgICAKKyAgICAgICAgICAgIC8vIG1vdmVHZW5lcmF0ZWRDb2RlKG9wdGlvbnMub3V0cHV0RGlyLCBvcHRpb25zLmlzTWl4aW5QcmVzZW50LCB3b3JraW5nRGlyZWN0b3J5KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGZtdCA9IGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgLy8gVE9ETyBiZXR0ZXIgcmVwb3J0IG9mIGFuIEV4Y2VwdGlvbgorICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZm10KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXBsZXRlCisKKyAgICAgICAgY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9JTkZPLCAiQ29tcGlsZSBEb25lLiIgKTsKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0T3V0cHV0KCBDbWRMaW5lT3B0aW9ucyBjbG8gKQorCXsKKwkJY2xvLm91dHB1dCA9IG5ldyBGaWxlT3V0cHV0KCk7CisJCWNsby50ZW1wbGF0ZU91dHB1dCA9IG5ldyBGaWxlT3V0cHV0KCk7CisJCWNsby5taXhpbk91dHB1dCA9IGNsby5ub01peGluQXJ0aWZhY3RzID8gbmV3IE51bGxPdXRwdXQoKSA6IG5ldyBGaWxlT3V0cHV0KCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYXZlT3V0cHV0KCBDbWRMaW5lT3B0aW9ucyBjbG8gKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gaW1wbGVtZW50IHNhdmVPdXRwdXQKKy8vCQljbG8ub3V0cHV0LnJlcG9ydCggIm91dHB1dCIgKTsKKy8vCQljbG8udGVtcGxhdGVPdXRwdXQucmVwb3J0KCAidGVtcGxhdGVPdXRwdXQiICk7CisvLwkJY2xvLm1peGluT3V0cHV0LnJlcG9ydCggIm1peGluT3V0cHV0IiApOworCQkKKwkJaWYgKGNsby50ZXN0aW5nKQorCQkJcmV0dXJuOworCQkKKwkJLy8gRGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIGdlbmVyYXRlZCBhcnRpZmFjdHMuIFVzZSBzb3VyY2UgZmlsZSdzCisJCS8vIHBhcmVudCBkaXJlY3RvcnkgaWYgbm90IHNwZWNpZmllZC4KKwkJCisJCUZpbGUgb3V0cHV0RGlyID0gY2xvLm91dHB1dERpcjsKKwkJYm9vbGVhbiBub1F1YWxPdXRwdXREaXIgPSBmYWxzZTsKKwkJaWYgKG91dHB1dERpciA9PSBudWxsKQorCQl7CisJCQlvdXRwdXREaXIgPSBjbG8uc291cmNlRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOworCQkJbm9RdWFsT3V0cHV0RGlyID0gdHJ1ZTsKKwkJfQorCisJCS8vIERlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBnZW5lcmF0ZWQgdXNlci1lZGl0YWJsZSBhcnRpZmFjdHMuIFVzZQorCQkvLyBvdXRwdXREaXIgaWYgbm90IHNwZWNpZmllZC4KKwkJCisJCUZpbGUgdGVtcGxhdGVPdXRwdXREaXIgPSBjbG8udGVtcGxhdGVPdXRwdXREaXI7CisJCWJvb2xlYW4gbm9RdWFsVGVtcGxhdGVPdXRwdXREaXIgPSBmYWxzZTsKKwkJaWYgKHRlbXBsYXRlT3V0cHV0RGlyID09IG51bGwpCisJCXsKKwkJCXRlbXBsYXRlT3V0cHV0RGlyID0gb3V0cHV0RGlyOworCQkJbm9RdWFsVGVtcGxhdGVPdXRwdXREaXIgPSBub1F1YWxPdXRwdXREaXI7CisJCX0KKwkJCisJCS8vIERlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBtaXhpbiBnZW5lcmF0ZWQgYXJ0aWZhY3RzLiBVc2Ugb3V0cHV0RGlyCisJCS8vIGlmIG5vdCBzcGVjaWZpZWQuCisJCQorCQlGaWxlIG1peGluT3V0cHV0RGlyID0gY2xvLm1peGluT3V0cHV0RGlyOworCQlib29sZWFuIG5vUXVhbE1peGluT3V0cHV0RGlyID0gZmFsc2U7CisJCWlmIChtaXhpbk91dHB1dERpciA9PSBudWxsKQorCQl7CisJCQltaXhpbk91dHB1dERpciA9IG91dHB1dERpcjsKKwkJCW5vUXVhbE1peGluT3V0cHV0RGlyID0gbm9RdWFsT3V0cHV0RGlyOworCQl9CisJCQorCQlib29sZWFuIGZvcmNlID0gY2xvLndoYXQuY29udGFpbnMoIEJhY2tlbmQuV0hBVF9GT1JDRSApOworCisJCXNhdmVGaWxlcyggY2xvLm91dHB1dCwgb3V0cHV0RGlyLCBub1F1YWxPdXRwdXREaXIsIGNsby5ub0ZsYXR0ZW5QYWNrYWdlcywgdHJ1ZSApOworCQlzYXZlRmlsZXMoIGNsby50ZW1wbGF0ZU91dHB1dCwgdGVtcGxhdGVPdXRwdXREaXIsIG5vUXVhbFRlbXBsYXRlT3V0cHV0RGlyLCBjbG8ubm9GbGF0dGVuUGFja2FnZXMsIGZvcmNlICk7CisJCXNhdmVGaWxlcyggY2xvLm1peGluT3V0cHV0LCBtaXhpbk91dHB1dERpciwgbm9RdWFsTWl4aW5PdXRwdXREaXIsIGNsby5ub0ZsYXR0ZW5QYWNrYWdlcywgdHJ1ZSApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2F2ZUZpbGVzKCBPdXRwdXQgb3V0cHV0LCBGaWxlIG91dHB1dERpciwKKwkJYm9vbGVhbiBub1F1YWxPdXRwdXREaXIsIGJvb2xlYW4gbm9GbGF0dGVuUGFja2FnZXMsIGJvb2xlYW4gZm9yY2UgKQorCQl0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCW91dHB1dC5zYXZlRmlsZXMoIG91dHB1dERpciwgbm9RdWFsT3V0cHV0RGlyLCBub0ZsYXR0ZW5QYWNrYWdlcywgZm9yY2UgKTsKKwl9CisKKwkvKioKKwkgKiBQYXJzZXMgYSBtaXhpbiB3aGljaCBpcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBzZXJ2aWNlLgorCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG4KKwkgKiBAcGFyYW0gb3B0cworCSAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIE1peGluIG9iamVjdCwgb3IgbnVsbC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1vZHVsZSBwYXJzZU1vZHVsZSggU2VydmljZSBpbnRmLCBOYW1lIG4sIE1hcDxTdHJpbmcsCisJCU9wdD4gb3B0cyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNtZExpbmVPcHRpb25zIGNsbyA9IG5ldyBDbWRMaW5lT3B0aW9ucyggaW50Zi5nZXRDbWRMaW5lT3B0aW9ucygpICk7CisJCQorCQkvLyBmaW5kIHRoZSBtaXhpbiBmaWxlCisJCQorCQlTdHJpbmcgZm4gPSBuLm5hbWU7CisJCQorCQkvLyBmbiBpcyBzb21ldGhpbmcgbGlrZSBhLmIuYy5kIG9yIHBlcmhhcHMganVzdCBwbGFpbiBkLgorCQkvLworCQkvLyB3ZSB3aWxsIGxvb2sgZm9yIGQuZXRjaCwgYS9iL2MvZC5ldGNoLCBhbmQgYS5iLmMvZC5ldGNoLgorCQkvLworCQkvLyB3ZSBjYW4gbG9vayBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIG9yaWdpbmFsIHNvdXJjZSB3ZSBhcmUKKwkJLy8gY29tcGlsaW5nICh0aGUgd29ya2luZyBkaXIpLCBvciBhbnkgb2YgdGhlIGluY2x1ZGUgcGF0aCBkaXJlY3Rvcmllcy4KKwkJCisJCVN0cmluZyBtb2R1bGU7CisJCVN0cmluZyBmaWxlOworCQlpbnQgaSA9IGZuLmxhc3RJbmRleE9mKCAnLicgKTsKKwkJaWYgKGkgPj0gMCkKKwkJeworCQkJbW9kdWxlID0gZm4uc3Vic3RyaW5nKCAwLCBpICk7CisJCQlmaWxlID0gZm4uc3Vic3RyaW5nKCBpKzEgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1vZHVsZSA9IG51bGw7CisJCQlmaWxlID0gZm47CisJCX0KKwkJCisJCWZpbGUgPSBmaWxlICsgIi5ldGNoIjsKKwkJCisvLwkJU3lzdGVtLm91dC5wcmludGYoICJzZWFyY2hpbmcgZm9yIG1peGluICclcycgbW9kdWxlICclcydcbiIsIGZpbGUsIG1vZHVsZSApOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggImluY2x1ZGVQYXRoID0gIitjbG8uaW5jbHVkZVBhdGggKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJlZmZlY3RpdmVJbmNsdWRlUGF0aCA9ICIrY2xvLmVmZmVjdGl2ZUluY2x1ZGVQYXRoICk7CisJCQorCQlMaXN0PEZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisJCQorCQkvLyBsb29rIGZvciB0aGUgdW5xdWFsaWZpZWQgbmFtZQorCQlmaW5kKCBsaXN0LCBjbG8sIG51bGwsIGZpbGUgKTsKKwkJCisJCWlmIChtb2R1bGUgIT0gbnVsbCkKKwkJeworCQkJLy8gbG9vayBmb3IgdGhlIHF1YWxpZmllZCBuYW1lCisJCQlmaW5kKCBsaXN0LCBjbG8sIG1vZHVsZSwgZmlsZSApOworCQkJZmluZCggbGlzdCwgY2xvLCBtb2R1bGUucmVwbGFjZSggJy4nLCAnLycgKSwgZmlsZSApOworCQl9CisJCQorCQlpZiAobGlzdC5pc0VtcHR5KCkpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCUZpbGUgZiA9IGxpc3QuZ2V0KCAwICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAibWl4aW5nIGluID0gIitmICk7CisJCQorCQlyZXR1cm4gcGFyc2VNb2R1bGUwKCBjbG8sIG4sIGYgKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kKCBMaXN0PEZpbGU+IGxpc3QsIENtZExpbmVPcHRpb25zIGNsbywgU3RyaW5nIHBhdGgsCisJCVN0cmluZyBmaWxlICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlmb3IgKEZpbGUgZDogY2xvLmVmZmVjdGl2ZUluY2x1ZGVQYXRoKQorCQl7CisJCQlGaWxlIGYgPSBkOworCQkJCisJCQlpZiAocGF0aCAhPSBudWxsKQorCQkJCWYgPSBuZXcgRmlsZSggZiwgcGF0aCApOworCQkJCisJCQlmID0gbmV3IEZpbGUoIGYsIGZpbGUgKS5nZXRDYW5vbmljYWxGaWxlKCk7CisJCQkKKwkJCWlmIChmLmlzRmlsZSgpICYmICFsaXN0LmNvbnRhaW5zKCBmICkpCisJCQkJbGlzdC5hZGQoIGYgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBjbG8KKwkgKiBAcGFyYW0gbgorCSAqIEBwYXJhbSBmCisJICogQHJldHVybiB0aGUgcGFyc2VkIG1vZHVsZSBvZiB0aGUgbWl4aW4uCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1vZHVsZSBwYXJzZU1vZHVsZTAoIENtZExpbmVPcHRpb25zIGNsbywgTmFtZSBuLCBGaWxlIGYgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQljbG8uc291cmNlRmlsZSA9IGY7CisJCWNsby5vdXRwdXQgPSBjbG8ubWl4aW5PdXRwdXQ7CisJCQorCQljbG8udGVtcGxhdGVPdXRwdXQgPSBuZXcgTnVsbE91dHB1dCgpOworCQljbG8ud2hhdC5yZW1vdmUoIEJhY2tlbmQuV0hBVF9NQUlOICk7CisJCWNsby53aGF0LnJlbW92ZSggQmFja2VuZC5XSEFUX0lNUEwgKTsKKwkJCisJCWlmIChjbG8ubm9NaXhpbkFydGlmYWN0cykKKwkJeworCQkJY2xvLndoYXQuY2xlYXIoKTsKKwkJCWNsby53aGF0LmFkZCggQmFja2VuZC5XSEFUX05PTkUgKTsKKwkJfQorCQkKKwkJY2xvLmxoLnJlcG9ydCggTG9nSGFuZGxlci5MRVZFTF9JTkZPLCBuLnRva2VuLmJlZ2luTGluZSwKKwkJCSJDb21waWxpbmcgbWl4aW4gZmlsZTogJXMiLCBuLm5hbWUgKTsKKwkJY2xvLmxoLnB1c2goIGYuZ2V0TmFtZSgpLCBuLnRva2VuLmJlZ2luTGluZSApOworCQl0cnkKKwkJeworCQkJcmV0dXJuIGNvbXBpbGUoIGNsbyApOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJY2xvLmxoLnBvcCggZi5nZXROYW1lKCkgKTsKKwkJCWNsby5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfSU5GTywgbi50b2tlbi5iZWdpbkxpbmUsCisJCQkJIkRvbmUgY29tcGlsaW5nIG1peGluIGZpbGU6ICVzIiwgbi5uYW1lICk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9FdGNoSGVscGVyLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9FdGNoSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwNDI3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0V0Y2hIZWxwZXIuamF2YQpAQCAtMCwwICsxLDY4NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5Db25zdGFudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LkVudW14OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuRXhjZXB0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuSXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5Nb2R1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuT3B0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuUGFyYW1MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlN0cnVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlRocm93bjsKKworCisvKioKKyAqIENvbXBpbGVyIHN1cHBvcnQgcm91dGluZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBFdGNoSGVscGVyCit7CisvLwkvKiogVE9ETyBzdGF0aWMgZ2xvYmFsIHZhcmlhYmxlIGxoIGluIGNvbXBpbGVyIG5lZWRzIHRvIGdvIGF3YXkuICovCisvLwlwdWJsaWMgc3RhdGljIExvZ0hhbmRsZXIgbGg7CisJCisvLwkvKiogVE9ETyBzdGF0aWMgZ2xvYmFsIHZhcmlhYmxlIGNsIGluIGNvbXBpbGVyIG5lZWRzIHRvIGdvIGF3YXkuICovCisvLwlwdWJsaWMgc3RhdGljIENtZExpbmVPcHRpb25zIGNsOworCisJLyoqCisJICogUGFyc2VzIGFuZCBzYXZlcyBhIG1vZHVsZSBjb21tZW50LgorCSAqIEBwYXJhbSBtCisJICogQHBhcmFtIHNwZWNpYWxUb2tlbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBtb2R1bGVDb21tZW50KCBNb2R1bGUgbSwgVG9rZW4gc3BlY2lhbFRva2VuICkKKwl7CisJCWlmIChzcGVjaWFsVG9rZW4gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGRlQ29tbWVudCggc3BlY2lhbFRva2VuLmltYWdlICk7CisJCWlmIChsaXN0ID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJbS5zZXREZXNjciggbGlzdCApOworCX0KKworCS8qKgorCSAqIFBhcnNlcyBhbmQgc2F2ZXMgYSBzZXJ2aWNlIGNvbW1lbnQuCisJICogQHBhcmFtIHMKKwkgKiBAcGFyYW0gc3BlY2lhbFRva2VuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlcnZpY2VDb21tZW50KCBTZXJ2aWNlIHMsIFRva2VuIHNwZWNpYWxUb2tlbiApCisJeworCQlpZiAoc3BlY2lhbFRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBkZUNvbW1lbnQoIHNwZWNpYWxUb2tlbi5pbWFnZSApOworCQlpZiAobGlzdCA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCXMuc2V0RGVzY3IoIGxpc3QgKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgdGhlIGZvcm1hbCBjb21tZW50IGZvciBhIGNvbnN0YW50LgorCSAqIEBwYXJhbSBjCisJICogQHBhcmFtIHNwZWNpYWxUb2tlbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjb25zdGFudENvbW1lbnQoIENvbnN0YW50IGMsIFRva2VuIHNwZWNpYWxUb2tlbiApCisJeworCQlpZiAoc3BlY2lhbFRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBkZUNvbW1lbnQoIHNwZWNpYWxUb2tlbi5pbWFnZSApOworCQlpZiAobGlzdCA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWMuc2V0RGVzY3IoIGxpc3QgKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgdGhlIGZvcm1hbCBjb21tZW50IGZvciBhbiBlbnVtLgorCSAqIEBwYXJhbSBlCisJICogQHBhcmFtIHNwZWNpYWxUb2tlbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBlbnVtQ29tbWVudCggRW51bXggZSwgVG9rZW4gc3BlY2lhbFRva2VuICkKKwl7CisJCWlmIChzcGVjaWFsVG9rZW4gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGRlQ29tbWVudCggc3BlY2lhbFRva2VuLmltYWdlICk7CisJCWlmIChsaXN0ID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJLy8gVE9ETyBpZiB0aGUgaXRlbXMgYXJlIGRlc2NyaWJlZCBpbiBAaXRlbSB0YWdzIGhlcmUKKwkJLy8gYWRkIHRoYXQgdG8gdGhlIGFwcHJvcHJpYXRlIGl0ZW0uIFRoaXMgd2lsbCBsb29rCisJCS8vIGFsb3QgbGlrZSBwYXJhbUxpc3RDb21tZW50LgorCisJCWUuc2V0RGVzY3IoIGxpc3QgKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgdGhlIGZvcm1hbCBjb21tZW50IGZvciBhbiBlbnVtIGl0ZW0uCisJICogQHBhcmFtIGkKKwkgKiBAcGFyYW0gc3BlY2lhbFRva2VuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGl0ZW1Db21tZW50KCBJdGVtIGksIFRva2VuIHNwZWNpYWxUb2tlbiApCisJeworCQlpZiAoc3BlY2lhbFRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBkZUNvbW1lbnQoIHNwZWNpYWxUb2tlbi5pbWFnZSApOworCQlpZiAobGlzdCA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWkuc2V0RGVzY3IoIGxpc3QgKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgdGhlIGZvcm1hbCBjb21tZW50IGZvciBhIHBhcmFtZXRlciBvZiBhIHN0cnVjdCwgZXhjZXB0aW9uLAorCSAqIG9yIG1lc3NhZ2UuCisJICogQHBhcmFtIHAKKwkgKiBAcGFyYW0gc3BlY2lhbFRva2VuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHBhcmFtZXRlckNvbW1lbnQoIFBhcmFtZXRlciBwLCBUb2tlbiBzcGVjaWFsVG9rZW4gKQorCXsKKwkJaWYgKHNwZWNpYWxUb2tlbiA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZGVDb21tZW50KCBzcGVjaWFsVG9rZW4uaW1hZ2UgKTsKKwkJaWYgKGxpc3QgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlwLnNldERlc2NyKCBsaXN0ICk7CisJfQorCisJLyoqCisJICogUHJvY2Vzc2VzIHRoZSBmb3JtYWwgY29tbWVudCBmb3IgYSB0aHJvd24gZXhjZXB0aW9uLgorCSAqIEBwYXJhbSB0CisJICogQHBhcmFtIHNwZWNpYWxUb2tlbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB0aHJvd25Db21tZW50KCBUaHJvd24gdCwgVG9rZW4gc3BlY2lhbFRva2VuICkKKwl7CisJCWlmIChzcGVjaWFsVG9rZW4gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGRlQ29tbWVudCggc3BlY2lhbFRva2VuLmltYWdlICk7CisJCWlmIChsaXN0ID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJdC5zZXREZXNjciggbGlzdCApOworCX0KKworCS8qKgorCSAqIFByb2Nlc3NlcyB0aGUgZm9ybWFsIGNvbW1lbnQgZm9yIGEgc3RydWN0LgorCSAqIEBwYXJhbSBzCisJICogQHBhcmFtIHNwZWNpYWxUb2tlbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzdHJ1Y3RDb21tZW50KCBTdHJ1Y3QgcywgVG9rZW4gc3BlY2lhbFRva2VuICkKKwl7CisJCXBhcmFtTGlzdENvbW1lbnQoIHMsIHNwZWNpYWxUb2tlbiwgZmFsc2UgKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgdGhlIGZvcm1hbCBjb21tZW50IGZvciBhbiBleGNlcHRpb24uCisJICogQHBhcmFtIGUKKwkgKiBAcGFyYW0gc3BlY2lhbFRva2VuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGV4Y2VwdENvbW1lbnQoIEV4Y2VwdCBlLCBUb2tlbiBzcGVjaWFsVG9rZW4gKQorCXsKKwkJcGFyYW1MaXN0Q29tbWVudCggZSwgc3BlY2lhbFRva2VuLCBmYWxzZSApOworCX0KKworCS8qKgorCSAqIFByb2Nlc3NlcyB0aGUgZm9ybWFsIGNvbW1lbnQgZm9yIGEgbWVzc2FnZS4KKwkgKiBAcGFyYW0gbQorCSAqIEBwYXJhbSBzcGVjaWFsVG9rZW4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbWVzc2FnZUNvbW1lbnQoIE1lc3NhZ2UgbSwgVG9rZW4gc3BlY2lhbFRva2VuICkKKwl7CisJCXBhcmFtTGlzdENvbW1lbnQoIG0sIHNwZWNpYWxUb2tlbiwgdHJ1ZSApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaXhTdHJpbmcoIFRva2VuIHQgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWlmICh0LmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSKQorCQkJcmV0dXJuOworCisJCXRyeQorCQl7CisJCQl0LmltYWdlID0gdW5lc2NhcGVTdHIoIHQuaW1hZ2UgKTsKKwkJfQorCQljYXRjaCAoIElPRXhjZXB0aW9uIGUpCisJCXsKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiUHJvYmxlbSB3aXRoIHN0cmluZyAnJXMnIGF0IGxpbmUgJWQiLCBlLmdldE1lc3NhZ2UoKSwgdC5iZWdpbkxpbmUgKSApOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlU3RyKCBTdHJpbmcgcyApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJLy8gcmVtb3ZlIHRoZSBxdW90ZXMuCisKKwkJaWYgKCFzLnN0YXJ0c1dpdGgoICJcIiIgKSB8fCAhcy5lbmRzV2l0aCggIlwiIiApKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInN0cmluZyBpbWFnZSBpcyBub3QgcXVvdGVkIiApOworCisJCXMgPSBzLnN1YnN0cmluZyggMSwgcy5sZW5ndGgoKS0xICk7CisKKwkJU3RyaW5nUmVhZGVyIHJkciA9IG5ldyBTdHJpbmdSZWFkZXIoIHMgKTsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJCWludCBjOworCQl3aGlsZSAoKGMgPSByZHIucmVhZCgpKSA+PSAwKQorCQl7CisJCQlpZiAoYyAhPSAnXFwnKQorCQkJeworCQkJCXNiLmFwcGVuZCggKGNoYXIpIGMgKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gYyA9PSAnXFwnOiB0d28gZXNjYXBlIGZvcm1hdHM6IHV4eHh4IGFuZCBrIChrPVsiXHRybl0pCisKKwkJCWMgPSByZHIucmVhZCgpOworCQkJaWYgKGMgPT0gJ3UnKQorCQkJeworCQkJCS8vIHVuaWNvZGUgZXNjYXBlIChuZWVkIGZvciBoZXggY2hhcnMpCisJCQkJYyA9IGZyb21IZXgoIHJkci5yZWFkKCkgKTsKKy8vCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oICJjMTogIitjICk7CisJCQkJYyA9IChjIDw8IDQpICsgZnJvbUhleCggcmRyLnJlYWQoKSApOworLy8JCQkJIFN5c3RlbS5vdXQucHJpbnRsbiggImMyOiAiK2MgKTsKKwkJCQljID0gKGMgPDwgNCkgKyBmcm9tSGV4KCByZHIucmVhZCgpICk7CisvLwkJCQkgU3lzdGVtLm91dC5wcmludGxuKCAiYzM6ICIrYyApOworCQkJCWMgPSAoYyA8PCA0KSArIGZyb21IZXgoIHJkci5yZWFkKCkgKTsKKy8vCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oICJjNDogIitjICk7CisJCQkJc2IuYXBwZW5kKCAoY2hhcikgYyApOworCQkJfQorCQkJZWxzZSBzd2l0Y2ggKGMpCisJCQl7CisJCQkJLy8gcGxhaW4gZXNjYXBlCisJCQkJY2FzZSAnIic6IHNiLmFwcGVuZCggIlwiIiApOyBicmVhazsKKwkJCQljYXNlICdcXCc6IHNiLmFwcGVuZCggIlxcIiApOyBicmVhazsKKwkJCQljYXNlICd0Jzogc2IuYXBwZW5kKCAiXHQiICk7IGJyZWFrOworCQkJCWNhc2UgJ3InOiBzYi5hcHBlbmQoICJcciIgKTsgYnJlYWs7CisJCQkJY2FzZSAnbic6IHNiLmFwcGVuZCggIlxuIiApOyBicmVhazsKKwkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJiYWQgZXNjYXBlIGNoYXI6ICIrYyApOworCQkJfQorCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgc3RhdGljIGludCBmcm9tSGV4KCBpbnQgYyApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSByZXR1cm4gYyAtICcwJzsKKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSByZXR1cm4gYyAtICdhJyArIDEwOworCQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHJldHVybiBjIC0gJ0EnICsgMTA7CisJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggImJhZCBoZXggY2hhcjogIitjICk7CisJfQorCisJLyoqCisJICogRm9ybWFsIGNvbW1lbnQgdHlwZXMgKHRhZ3MpLgorCSAqLworCWVudW0gVHlwZQorCXsKKwkJLyoqCisJCSAqIFRoZSBtYWluIGJvZHkgb2YgdGhlIGNvbW1lbnQgYmVmb3JlIGFueSB0YWdzLgorCQkgKi8KKwkJTWFpbiwKKwkJLyoqCisJCSAqIFRoZSB0eXBlIGRlbm90aW5nIGFuIEBwYXJhbSB0YWcuCisJCSAqLworCQlQYXJhbSwKKwkJLyoqCisJCSAqIFRoZSB0eXBlIGRlbm90aW5nIGFuIEByZXR1cm4gdGFnLgorCQkgKi8KKwkJUmV0dXJuLAorCQkvKioKKwkJICogVGhlIHR5cGUgZGVub3RpbmcgYW4gQHRocm93cyB0YWcuCisJCSAqLworCQlUaHJvd3MsCisJCS8qKgorCQkgKiBUaGUgdHlwZSBkZW5vdGluZyBhbiB1bnJlY29nbml6ZWQgdGFnLgorCQkgKi8KKwkJTm9uZQorCX0KKworCS8qKgorCSAqIFByb2Nlc3NlcyBhbnkgc2F2ZWQgbWVzc2FnZSBjb21tZW50LgorCSAqIEBwYXJhbSBtCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJhbUxpc3RDb21tZW50KCBQYXJhbUxpc3Q8U2VydmljZT4gbSwKKwkJVG9rZW4gc3BlY2lhbFRva2VuLCBib29sZWFuIGlzTWVzc2FnZSApCisJeworCQlpZiAoc3BlY2lhbFRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBkZUNvbW1lbnQoIHNwZWNpYWxUb2tlbi5pbWFnZSApOworCQlpZiAobGlzdCA9PSBudWxsKQorCQkJcmV0dXJuOworCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCBsaXN0ICk7CisKKwkJVHlwZSB0eXBlID0gVHlwZS5NYWluOworCQlTdHJpbmcgbmFtZSA9IG51bGw7CisJCWZvciAoU3RyaW5nIHM6IGxpc3QpCisJCXsKKwkJCVN0cmluZyB4ID0gczsKKworLy8JCQlTeXN0ZW0ub3V0LnByaW50ZiggInByb2Nlc3Npbmc6ICVzXG4iLCBzICk7CisJCQlpZiAocy5zdGFydHNXaXRoKCAiQCIgKSkKKwkJCXsKKwkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBzLCAiIFx0IiApOworCQkJCVN0cmluZyBrID0gc3QubmV4dFRva2VuKCk7CisJCQkJaWYgKGsuZXF1YWxzKCAiQHBhcmFtIiApKQorCQkJCXsKKwkJCQkJdHlwZSA9IFR5cGUuUGFyYW07CisJCQkJCWlmICghc3QuaGFzTW9yZVRva2VucygpKQorCQkJCQl7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50ZiggIioqKiB3YXJuaW5nOiBwYXJhbWV0ZXIgbmFtZSBtaXNzaW5nIG9uIEBwYXJhbSBhdCBsaW5lICVkXG4iLCBzcGVjaWFsVG9rZW4uYmVnaW5MaW5lICk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJbmFtZSA9IHN0Lm5leHRUb2tlbigpOworCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKQorCQkJCQkJcyA9IHN0Lm5leHRUb2tlbiggIlxyXG4iICkudHJpbSgpOworCQkJCQllbHNlCisJCQkJCQlzID0gIiI7CisJCQkJfQorCQkJCWVsc2UgaWYgKGsuZXF1YWxzKCAiQHJldHVybiIgKSkKKwkJCQl7CisJCQkJCXR5cGUgPSBUeXBlLlJldHVybjsKKwkJCQkJaWYgKCFpc01lc3NhZ2UgfHwgISgoTWVzc2FnZSkgbSkuaGFzUmV0dXJuKCkpCisJCQkJCXsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRmKCAiKioqIHdhcm5pbmc6IEByZXR1cm4gdXNlZCBvbiBub24tbWVzc2FnZSBvciB2b2lkIG1lc3NhZ2UgYXQgbGluZSAlZFxuIiwgc3BlY2lhbFRva2VuLmJlZ2luTGluZSApOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpCisJCQkJCQlzID0gc3QubmV4dFRva2VuKCAiXHJcbiIgKS50cmltKCk7CisJCQkJCWVsc2UKKwkJCQkJCXMgPSAiIjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoay5lcXVhbHMoICJAdGhyb3dzIiApKQorCQkJCXsKKwkJCQkJdHlwZSA9IFR5cGUuVGhyb3dzOworCQkJCQlpZiAoIWlzTWVzc2FnZSkKKwkJCQkJeworCQkJCQkJU3lzdGVtLm91dC5wcmludGYoICIqKiogd2FybmluZzogQHRocm93cyB1c2VkIG9uIG5vbi1tZXNzYWdlIGF0IGxpbmUgJWRcbiIsIHNwZWNpYWxUb2tlbi5iZWdpbkxpbmUgKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQlpZiAoIXN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJCQkJeworCQkJCQkJU3lzdGVtLm91dC5wcmludGYoICIqKiogd2FybmluZzogZXhjZXB0aW9uIG5hbWUgbWlzc2luZyBvbiBAdGhyb3dzIGF0IGxpbmUgJWRcbiIsIHNwZWNpYWxUb2tlbi5iZWdpbkxpbmUgKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQluYW1lID0gc3QubmV4dFRva2VuKCk7CisJCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpCisJCQkJCQlzID0gc3QubmV4dFRva2VuKCAiXHJcbiIgKS50cmltKCk7CisJCQkJCWVsc2UKKwkJCQkJCXMgPSAiIjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdHlwZSA9IFR5cGUuTm9uZTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGYoICIqKiogd2FybmluZzogJXMgbm90IHVuZGVyc3Rvb2QgaW4gdGhpcyBjb250ZXh0ICglcyk6ICVzXG4iLCBrLCBtLm5hbWUoKSwgeCApOworCQkJCX0KKwkJCX0KKworLy8JCQlTeXN0ZW0ub3V0LnByaW50ZiggInR5cGUgJWRcbiIsIHR5cGUgKTsKKworCQkJaWYgKHR5cGUgPT0gVHlwZS5NYWluKQorCQkJeworCQkJCS8vU3lzdGVtLm91dC5wcmludGYoICJhZGRpbmcgdG8gbS5kZXNjcjogJXNcbiIsIHMgKTsKKwkJCQltLmRlc2NyKCkuYWRkKCBzICk7CisJCQl9CisJCQllbHNlIGlmICh0eXBlID09IFR5cGUuUGFyYW0pCisJCQl7CisvLwkJCQlTeXN0ZW0ub3V0LnByaW50ZiggImFkZGluZyB0byBwLmRlc2NyICglcyk6ICVzXG4iLCBuYW1lLCBzICk7CisJCQkJUGFyYW1ldGVyIHAgPSBtLmdldFBhcmFtZXRlciggbmFtZSApOworCQkJCWlmIChwICE9IG51bGwpCisJCQkJCXAuZGVzY3IoKS5hZGQoIHMgKTsKKwkJCQllbHNlCisJCQkJCVN5c3RlbS5vdXQucHJpbnRmKCAiKioqIHdhcm5pbmc6IGNhbm5vdCBkb2N1bWVudCBwYXJhbWV0ZXIgJXMgb2YgJXNcbiIsIG5hbWUsIG0ubmFtZSgpICk7CisJCQl9CisJCQllbHNlIGlmICh0eXBlID09IFR5cGUuUmV0dXJuKQorCQkJeworLy8JCQkJU3lzdGVtLm91dC5wcmludGYoICJhZGRpbmcgdG8gbS5yZXR1cm5EZXNjcjogJXNcbiIsIHMgKTsKKwkJCQkoKE1lc3NhZ2UpIG0pLnJldHVybkRlc2NyKCkuYWRkKCBzICk7CisJCQl9CisJCQllbHNlIGlmICh0eXBlID09IFR5cGUuVGhyb3dzKQorCQkJeworLy8JCQkJU3lzdGVtLm91dC5wcmludGYoICJhZGRpbmcgdG8gdC5kZXNjciAoJXMpOiAlc1xuIiwgbmFtZSwgcyApOworCQkJCVRocm93biB0ID0gKChNZXNzYWdlKSBtKS5nZXRUaHJvd24oIG5hbWUgKTsKKwkJCQlpZiAodCAhPSBudWxsKQorCQkJCQl0LmRlc2NyKCkuYWRkKCBzICk7CisJCQkJZWxzZQorCQkJCQlTeXN0ZW0ub3V0LnByaW50ZiggIioqKiB3YXJuaW5nOiBjYW5ub3QgZG9jdW1lbnQgdGhyb3duICVzIG9mICVzXG4iLCBuYW1lLCBtLm5hbWUoKSApOworCQkJfQorCQkJZWxzZSBpZiAodHlwZSAhPSBUeXBlLk5vbmUpCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGYoICIqKiogd2FybmluZzogY29tbWVudCB0eXBlICVzIG5vdCB1bmRlcnN0b29kXG4iLCB0eXBlICk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTcGxpdHMgYSBmb3JtYWwgY29tbWVudCBpbnRvIGl0cyBsaW5lcywgc3RyaXBwaW5nCisJICogb2ZmIHRoZSBjb21tZW50IGd1bmsuCisJICogQHBhcmFtIHMKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGxpbmVzIG9mIHRoZSBjb21tZW50LCB3aXRob3V0CisJICogdGhlIEVPTCBjaGFyYWN0ZXJzIGFuZCB0aGUgY29tbWVudCBndW5rLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxTdHJpbmc+IGRlQ29tbWVudCggU3RyaW5nIHMgKQorCXsKKwkJaWYgKCFzLnN0YXJ0c1dpdGgoICIvKiogIiApICYmCisJCQkJIXMuc3RhcnRzV2l0aCggIi8qKlx0IiApICYmCisJCQkJIXMuc3RhcnRzV2l0aCggIi8qKlxyIiApICYmCisJCQkJIXMuc3RhcnRzV2l0aCggIi8qKlxuIiApKQorCQkJcmV0dXJuIG51bGw7CisKKwkJcyA9IHMuc3Vic3RyaW5nKCAzICk7CisKKwkJaWYgKHMuZW5kc1dpdGgoICIqLyIgKSkKKwkJCXMgPSBzLnN1YnN0cmluZyggMCwgcy5sZW5ndGgoKSAtIDIgKTsKKworCQlzID0gcy50cmltKCk7CisKKwkJLy8gbm93IHdlIGhhdmUgYSBidW5jaCBvZiBsaW5lcyB0aGF0IGxvb2sgbGlrZSB0aGlzOgorCQkvLyAuKihcclxuXHdbKl0oXFcuKik/KSoKKwkJLy8gdW5kbyBhbGwgdGhhdCBieSBjaG9wcGluZyB1cCBpbnRvIGxpbmVzLCB0aGVuIHJlbW92aW5nCisJCS8vIGxlYWRpbmcgd2hpdGUgc3BhY2UgdXAgdG8gdGhlICogYW5kIHRoZW4gdGhlIHNwYWNlIGRpcmVjdGx5CisJCS8vIGFmdGVyIHRoZSAqIGlmIHRoZXJlIGlzIG9uZS4KKworCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHMsICJcclxuIiwgdHJ1ZSApOworCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQorCQl7CisJCQlTdHJpbmcgdCA9IHN0Lm5leHRUb2tlbigpOworCQkJaWYgKHQuZXF1YWxzKCAiXHIiICkpCisJCQl7CisJCQkJLy8gaWdub3JlIHRoZSBFT0wgbWFya3MuCisJCQl9CisJCQllbHNlIGlmICh0LmVxdWFscyggIlxuIiApKQorCQkJeworCQkJCS8vIGlnbm9yZSB0aGUgRU9MIG1hcmtzLgorCQkJfQorCQkJZWxzZQorCQkJLy8gbm90IGFuIEVPTCBtYXJrZXIuLi4KKwkJCXsKKwkJCQl0ID0gdC50cmltKCk7CisJCQkJLy8gdGhpcyBpcyBhIGxpbmUgdGhhdCBsb29rcyBsaWtlICIqYmxhaCIgb3IKKwkJCQkvLyAiKiBibGFoIiBvciAiKiIuCisJCQkJaWYgKHQuc3RhcnRzV2l0aCggIiogIiApKQorCQkJCQlsaXN0LmFkZCggdC5zdWJzdHJpbmcoIDIgKSApOworCQkJCWVsc2UgaWYgKHQuc3RhcnRzV2l0aCggIioiICkpCisJCQkJCWxpc3QuYWRkKCB0LnN1YnN0cmluZyggMSApICk7CisJCQkJZWxzZQorCQkJCQlsaXN0LmFkZCggdCApOworCQkJfQorCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGxhc3Qgc2F2ZWQgY29tbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgVG9rZW4gZ2V0Q29tbWVudCgpCisJeworCQlUb2tlbiBjb21tZW50ID0gc2F2ZWRDb21tZW50OworCQlzYXZlZENvbW1lbnQgPSBudWxsOworCQlyZXR1cm4gY29tbWVudDsKKwl9CisKKwlwcml2YXRlIFRva2VuIHNhdmVkQ29tbWVudDsKKworCS8qKgorCSAqIFNhdmVzIGEgY29tbWVudCB0byBiZSB1c2VkIGxhdGVyLiBPbmx5IHRoZQorCSAqIG1vc3QgcmVjZW50bHkgc2F2ZWQgY29tbWVudCB3aWxsIGJlIGF2YWlsYWJsZS4KKwkgKiBAcGFyYW0gY29tbWVudAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNhdmVDb21tZW50KCBUb2tlbiBjb21tZW50ICkKKwl7CisJCWlmIChjb21tZW50ICE9IG51bGwpCisJCQlzYXZlZENvbW1lbnQgPSBjb21tZW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuIHRoZSBuYW1lIG9mIHRoZSBvcHQuCisJICogQHBhcmFtIGxpc3QgdGhlIGxpc3Qgb2Ygb3B0IGFyZ3VtZW50cy4KKwkgKiBAcmV0dXJuIGFuIE9wdCBzdWJjbGFzcworCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgT3B0IG1ha2VPcHQoIE5hbWUgbiwgTGlzdDxUb2tlbj4gbGlzdCApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGNuID0gIm9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuIituLnRva2VuLmltYWdlOworCQlDbGFzczw/PiBjOworCisJCXRyeQorCQl7CisJCQljID0gQ2xhc3MuZm9yTmFtZSggY24gKTsKKwkJfQorCQljYXRjaCAoIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIm9wdGlvbiBjbGFzcyAlcyBub3QgZm91bmQgYXQgbGluZSAlZCIsCisJCQkJbiwgbi50b2tlbi5iZWdpbkxpbmUgKSApOworCQl9CisJCWNhdGNoICggQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJvcHRpb24gY2xhc3MgJXMgbm90IGZvdW5kIGF0IGxpbmUgJWQiLAorCQkJCW4sIG4udG9rZW4uYmVnaW5MaW5lICkgKTsKKwkJfQorCisJCUNsYXNzPD8+W10gcGFyYW1zID0geyBOYW1lLmNsYXNzLCBUb2tlbltdLmNsYXNzIH07CisKKwkJQ29uc3RydWN0b3I8Pz4gazsKKworCQl0cnkKKwkJeworCQkJayA9IGMuZ2V0Q29uc3RydWN0b3IoIHBhcmFtcyApOworCQl9CisJCWNhdGNoICggU2VjdXJpdHlFeGNlcHRpb24gZSApCisJCXsKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkic2VjdXJpdHkgcnVsZXMgYmxvY2sgYWNjZXNzIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBvcHRpb24gY2xhc3MgJXMgYXQgbGluZSAlZCIsCisJCQkJbiwgbi50b2tlbi5iZWdpbkxpbmUgKSApOworCQl9CisJCWNhdGNoICggTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIm1pc3NpbmcgY29uc3RydWN0b3IgZm9yIG9wdGlvbiBjbGFzcyAlcyBhdCBsaW5lICVkIiwKKwkJCQluLCBuLnRva2VuLmJlZ2luTGluZSApICk7CisJCX0KKworCQlPYmplY3RbXSBhcmdzID0geyBuLCBsaXN0LnRvQXJyYXkoIG5ldyBUb2tlbltsaXN0LnNpemUoKV0gKSB9OworCisJCXRyeQorCQl7CisJCQlyZXR1cm4gKE9wdCkgay5uZXdJbnN0YW5jZSggYXJncyApOworCQl9CisJCWNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJImlsbGVnYWwgYXJndW1lbnQgdG8gbmV3SW5zdGFuY2UgZm9yIG9wdGlvbiBjbGFzcyAlcyBhdCBsaW5lICVkOiAlcyIsCisJCQkJbiwgbi50b2tlbi5iZWdpbkxpbmUsIGUgKSApOworCQl9CisJCWNhdGNoICggSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJjYW5ub3QgaW5zdGFudGlhdGUgb3B0aW9uIGNsYXNzICVzIGF0IGxpbmUgJWQ6ICVzIiwKKwkJCQluLCBuLnRva2VuLmJlZ2luTGluZSwgZSApICk7CisJCX0KKwkJY2F0Y2ggKCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJImlsbGVnYWwgYWNjZXNzIG9mIGNvbnN0cnVjdG9yIGZvciBvcHRpb24gY2xhc3MgJXMgYXQgbGluZSAlZDogJXMiLAorCQkJCW4sIG4udG9rZW4uYmVnaW5MaW5lLCBlICkgKTsKKwkJfQorCQljYXRjaCAoIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSApCisJCXsKKwkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pCisJCQkJdGhyb3cgKFBhcnNlRXhjZXB0aW9uKSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOworCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJImV4Y2VwdGlvbiBjYXVnaHQgZnJvbSBjb25zdHJ1Y3RvciBmb3Igb3B0aW9uIGNsYXNzICVzIGF0IGxpbmUgJWQ6ICVzIiwKKwkJCQluLCBuLnRva2VuLmJlZ2luTGluZSwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSApICk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkb1N0YXJ0U2VydmljZSgpCisJeworCX0KKworCXByb3RlY3RlZCB2b2lkIGRvRW5kU2VydmljZShTZXJ2aWNlIG9TZXJ2KQorCXsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZiBuYW1lIG9mIHRoZSBmaWxlbmFtZSBmb3IgdGhlIGluY2x1ZGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9JbmNsdWRlKCBUb2tlbiBmaWxlTmFtZSwgU2VydmljZSBzZXJ2b2JqKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisKKwkJLy9HZXQgdGhlIEdyYW1hciBPYmoKKwkJRXRjaEdyYW1tYXIgb0dyYW1hciA9IChFdGNoR3JhbW1hcikgdGhpczsKKworCQlzZXJ2b2JqLmdldENtZExpbmVPcHRpb25zKCkubGgucHVzaCggZmlsZU5hbWUudG9TdHJpbmcoKSwgZmlsZU5hbWUuYmVnaW5MaW5lICk7CisKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLVN0YXJ0IERvIEluY2x1ZGUtLS0tLS0tIik7CisKKwkJLy9HZXQgdGhlIGZpbGUgbmFtZQorCSAgCVN0cmluZyBvU3RyID0gZmlsZU5hbWUudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsKKworCSAvLyAJU3lzdGVtLm91dC5wcmludGxuKCJJbmNsdWRpbmcgIiArIG9TdHIpOworCSAgCXNlcnZvYmouZ2V0Q21kTGluZU9wdGlvbnMoKS5saC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfSU5GTywgIkluY2x1ZGluZyAlcyIsIG9TdHIgKTsKKworCSAgICAvL0NyZWF0ZSB0aGUgaW5wdXQgc3RyaW5nIGFuZCByZWFkIGl0IGluCisJCUlucHV0U3RyZWFtIG9TdHJlYW0gPSBudWxsOworCisJCS8vIFNlYXJjaCB0aGUgZXRjaCBwYXRoIGZvciB0aGUgZmlsZQorCQlmb3IgKEZpbGUgZiA6IHNlcnZvYmouZ2V0Q21kTGluZU9wdGlvbnMoKS5lZmZlY3RpdmVJbmNsdWRlUGF0aCkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJb1N0cmVhbSA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmLCBvU3RyKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCisJCQl7CisJCQl9CisJCX0KKworCQlpZiAob1N0cmVhbSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCIgSW5jbHVkZWQgRmlsZSAiICsgb1N0ciArICIgTm90IEZvdW5kXG4iKTsKKworCQkvL0tlZXAgZm9yIGRlYnVnZ2luZworCQkvL1N0YWNrSW5wdXRTdHJlYW0gb1N0U3RyZWFtID0gbmV3IFN0YWNrSW5wdXRTdHJlYW0ob1N0cmVhbSk7CisJCVNpbXBsZUNoYXJTdHJlYW0gY3VyU3RyZWFtID0gbnVsbDsKKwkJdHJ5CisJCXsKKwkJCWN1clN0cmVhbSA9IG5ldyBTaW1wbGVDaGFyU3RyZWFtKG9TdHJlYW0sIG51bGwsIDEsIDEpOworCQl9CisKKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIiBJbmNsdWRlZCBGaWxlICIgKyBvU3RyICsgIiBpcyBub3QgY29ycmVjdGx5IGVuY29kZWRcbiIpOworCisJCX0KKworCQkvL0NyZWF0ZSBhIG5ldyB0b2tlbiBtYW5hZ2VyIHdpdGggdGhlIG5ldyBpbmNsdWRlIHN0cmVhbQorCSAgICBFdGNoR3JhbW1hclRva2VuTWFuYWdlciBvVE0gPSBuZXcgRXRjaEdyYW1tYXJUb2tlbk1hbmFnZXIoY3VyU3RyZWFtKTsKKworCSAgICAvL0tlZXAgdGhlIG9sZCB0b2tlbiBtYW5hZ2VyCisJICAgIEV0Y2hHcmFtbWFyVG9rZW5NYW5hZ2VyIG9PbGRUTSA9IG9HcmFtYXIudG9rZW5fc291cmNlOworCisJICAgIC8vS2VlcCB0aGUgb2xkIHRva2VuCisJICAgIFRva2VuIHRva2VuID0gb0dyYW1hci50b2tlbjsKKworCSAgICAvL3JlaW5pdCB3aXRoIHRoZSBuZXcgdG9rZW4gbWFuYWdlcgorCSAgICBvR3JhbWFyLlJlSW5pdCggb1RNICk7CisKKwkgICAgCS8vUHJvYyB0aGUgc3RyZWFtCisJCW9HcmFtYXIuc3RtdHMoIHNlcnZvYmogKTsKKworCisJCS8vUHV0IHRoZSBvbGQgZGF0YSBiYWNrCisJCW9HcmFtYXIuUmVJbml0KCBvT2xkVE0gKTsKKwkJb0dyYW1hci50b2tlbiA9IHRva2VuOworCQlzZXJ2b2JqLmdldENtZExpbmVPcHRpb25zKCkubGgucG9wKCBmaWxlTmFtZS50b1N0cmluZygpICk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS1FbmQgRG8gSW5jbHVkZS0tLS0tLS0tLSIpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0V0Y2hNYWluLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9FdGNoTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZmZkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9FdGNoTWFpbi5qYXZhCkBAIC0wLDAgKzEsMzcyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQuQ29tbWFuZFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQuT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kLlByb2dyYW07CisKKworLyoqCisgKiBUaGUgbWFpbiBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGZvciB0aGUgZXRjaCBjb21waWxlci4KKyAqLworcHVibGljIGNsYXNzIEV0Y2hNYWluIGV4dGVuZHMgUHJvZ3JhbQoreworCS8qKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogQHRocm93cyBFeGNlcHRpb24gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgIAluZXcgRXRjaE1haW4oKS5kb01haW4oIGFyZ3MgKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUnVucyB0aGUgbWFpbiBwcm9ncmFtLCBwYXJzaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHBlcmZvcm1pbmcKKyAgICAgKiB0aGUgYWN0aW9uLgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb01haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgIAl0cnkKKyAgICAJeworICAgIAkJbWFpbiggdGhpcywgYXJncyApOworICAgIAl9CisgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQorICAgICAgICB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZXhpdCggMywgdG9TdHJpbmcoKSwgZS50b1N0cmluZygpLCB0cnVlICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSBldGNoIHBhcnNlciAvIGNvbXBpbGVyIGRyaXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXRjaE1haW4oKQorICAgIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiZXRjaCI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZGVmaW5lT3B0aW9uc0FuZFBhcmFtZXRlcnMoIENvbW1hbmRQYXJzZXIgY3AgKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBjcC5kZWZpbmVGaWxlT3B0aW9uKCAiLWR8LS1vdXRwdXQtZGlyIiwgIm91dHB1dERpciIsICJzZXRPdXRwdXREaXIiLAorICAgICAgICAgICAgIm91dHB1dCBkaXJlY3RvcnkgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBmaWxlcyIsCisgICAgICAgICAgICBPcHRpb24uU0lOR0xFVE9OLCBudWxsLCBudWxsICk7CisKKyAgICAgICAgY3AuZGVmaW5lRmlsZU9wdGlvbiggIi1tfC0tbWl4aW4tb3V0cHV0LWRpciIsICJvdXRwdXREaXIiLCAic2V0TWl4aW5PdXRwdXREaXIiLAorICAgICAgICAgICAgIm91dHB1dCBkaXJlY3RvcnkgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBmaWxlcyBmb3IgbWl4aW5zIiwKKyAgICAgICAgICAgIE9wdGlvbi5TSU5HTEVUT04sIG51bGwsIG51bGwgKTsKKworICAgICAgICBjcC5kZWZpbmVGaWxlT3B0aW9uKCAiLXR8LS10ZW1wbGF0ZS1vdXRwdXQtZGlyIiwgIm91dHB1dERpciIsICJzZXRUZW1wbGF0ZU91dHB1dERpciIsCisgICAgICAgICAgICAib3V0cHV0IGRpcmVjdG9yeSBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIHVzZXIgZWRpdGFibGUgdGVtcGxhdGUgZmlsZXMiLAorICAgICAgICAgICAgT3B0aW9uLlNJTkdMRVRPTiwgbnVsbCwgbnVsbCApOworICAgICAgICAgICAgCisgICAgICAgIGNwLmRlZmluZVN0cmluZ09wdGlvbiggIi1ifC0tYmluZGluZyIsICJiaW5kaW5nIiwgInNldEJpbmRpbmciLAorICAgICAgICAgICAgInNwZWNpZmllcyBhIHRhcmdldCBsYW5ndWFnZSBiaW5kaW5nIHRvIGdlbmVyYXRlIiwKKyAgICAgICAgICAgIE9wdGlvbi5SRVFVSVJFRHxPcHRpb24uU0lOR0xFVE9OLCBudWxsLCBudWxsICk7CisKKyAgICAgICAgY3AuZGVmaW5lU3RyaW5nT3B0aW9uKCAiLXd8LS13aGF0IiwgIndoYXQiLCAiYWRkV2hhdCIsCisgICAgICAgICAgICAic3BlY2lmaWVzIHdoYXQgZmlsZXMgdG8gZ2VuZXJhdGUgKGRlcGVuZHMgdXBvbiBiaW5kaW5nLCB0cnkgLXcgaGVscCBmb3IgbW9yZSBpbmZvOyBzZXBhcmF0ZSB3aXRoICciK0NtZExpbmVPcHRpb25zLldIQVRfREVMSU1FVEVSKyInKSIsCisgICAgICAgICAgICBPcHRpb24uTk9ORSwgbnVsbCwgbnVsbCApOworCisgICAgICAgIGNwLmRlZmluZU51bGxPcHRpb24oICItZ3wtLWlnbm9yZS1nbG9iYWwtd29yZHMtbGlzdCIsICJpZ25vcmVHbG9iYWxXb3Jkc0xpc3QiLAorICAgICAgICAgICAgImlnbm9yZSB0aGUgZ2xvYmFsIHJlc2VydmVkIHdvcmRzIGxpc3QiLAorICAgICAgICAgICAgT3B0aW9uLlNJTkdMRVRPTiApOworCisgICAgICAgIGNwLmRlZmluZU51bGxPcHRpb24oICItbHwtLWlnbm9yZS1sb2NhbC13b3Jkcy1saXN0IiwgImlnbm9yZUxvY2FsV29yZHNMaXN0IiwKKyAgICAgICAgICAgICJpZ25vcmUgdGhlIGxvY2FsIChiaW5kaW5nLXNwZWNpZmljKSByZXNlcnZlZCB3b3JkcyBsaXN0IiwKKyAgICAgICAgICAgIE9wdGlvbi5TSU5HTEVUT04gKTsKKworICAgICAgICBjcC5kZWZpbmVGaWxlT3B0aW9uKCAiLVd8LS11c2VyLXdvcmRzLWxpc3QiLCAid29yZExpc3QiLCAic2V0VXNlcldvcmRzTGlzdCIsCisgICAgICAgICAgICAiZmlsZSBuYW1lIG9mIGEgdXNlci1zcGVjaWZpZWQgcmVzZXJ2ZWQgd29yZHMgbGlzdCIsCisgICAgICAgICAgICBPcHRpb24uU0lOR0xFVE9OLCBudWxsLCBudWxsICk7CisKKyAgICAgICAgY3AuZGVmaW5lU3RyaW5nT3B0aW9uKCAiLUl8LS1pbmNsdWRlLXBhdGgiLCAiaW5jbHVkZVBhdGgiLCAiYWRkSW5jbHVkZVBhdGgiLAorICAgICAgICAgICAgImFkZHMgc2VhcmNoIGRpcmVjdG9yaWVzIGZvciBpbmNsdWRlZCBvciBtaXhlZCBpbiBldGNoIGZpbGVzIChzZXBhcmF0ZSBlbGVtZW50cyB3aXRoIHN5c3RlbSBwYXRoIHNlcGFyYXRvciAnIitGaWxlLnBhdGhTZXBhcmF0b3IrIicpIiwKKyAgICAgICAgICAgIE9wdGlvbi5OT05FLCBudWxsLCBudWxsICk7CisKKyAgICAgICAgY3AuZGVmaW5lTnVsbE9wdGlvbiggIi1pfC0taWdub3JlLWluY2x1ZGUtcGF0aCIsICJpZ25vcmVJbmNsdWRlUGF0aCIsCisgICAgICAgICAgICAiaWdub3JlIHRoZSAiK0NtZExpbmVPcHRpb25zLkVUQ0hfSU5DTFVERV9QQVRIKyIgZW52aXJvbm1lbnQgdmFyaWFibGUiLAorICAgICAgICAgICAgT3B0aW9uLlNJTkdMRVRPTiApOworCisgICAgICAgIGNwLmRlZmluZU51bGxPcHRpb24oICItbnwtLW5vLW1peGluLWFydGlmYWN0cyIsICJub01peGluQXJ0aWZhY3RzIiwKKyAgICAgICAgICAgICJtaXhpbiBhcnRpZmFjdHMgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQiLAorICAgICAgICAgICAgT3B0aW9uLlNJTkdMRVRPTiApOworCisgICAgICAgIGNwLmRlZmluZU51bGxPcHRpb24oICItcXwtLXF1aWV0IiwgInF1aWV0IiwKKyAgICAgICAgICAgICJvbmx5IHJlcG9ydCBwcm9ibGVtcyIsCisgICAgICAgICAgICBPcHRpb24uU0lOR0xFVE9OICk7CisKKyAgICAgICAgY3AuZGVmaW5lTnVsbE9wdGlvbiggIi12fC0tdmVyc2lvbiIsICJkb1ZlcnNpb24iLAorICAgICAgICAgICAgInNob3cgdGhlIHZlcnNpb24gYW5kIGV4aXQiLAorICAgICAgICAgICAgT3B0aW9uLlNJTkdMRVRPTiApOworCisgICAgICAgIGNwLmRlZmluZU51bGxPcHRpb24oICItZnwtLW5vLWZsYXR0ZW4tcGFja2FnZXMiLCAibm9GbGF0dGVuUGFja2FnZXMiLAorICAgICAgICAgICAgIm5hbWVzcGFjZSBkaXJlY3RvcnkgdHJlZSBzaG91bGQgbm90IGJlIGZsYXR0ZW5lZCIsCisgICAgICAgICAgICBPcHRpb24uU0lOR0xFVE9OICk7CisgICAgICAgIAorICAgICAgICBjcC5kZWZpbmVOdWxsT3B0aW9uKCAiLS10ZXN0aW5nIiwgInNldFRlc3RpbmciLAorICAgICAgICAJIiIsCisgICAgICAgIAlPcHRpb24uSElEREVOICk7CisKKyAgICAgICAgY3AuZGVmaW5lRmlsZVBhcmFtZXRlciggInNvdXJjZUZpbGUiLCAic2V0U291cmNlRmlsZSIsCisgICAgICAgICAgICAiZXRjaCBzb3VyY2UgZmlsZSB0byBjb21waWxlIiwgdHJ1ZSwgZmFsc2UsIG51bGwgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBDbWRMaW5lT3B0aW9ucyBjbG8gPSBuZXcgQ21kTGluZU9wdGlvbnMoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgY29tcGlsZXIgZ2VuZXJhdGVkIGZpbGVzLgorICAgICAqIEBwYXJhbSBjcAorICAgICAqIEBwYXJhbSBvcHRpb24KKyAgICAgKiBAcGFyYW0gdG9rZW4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXIoIENvbW1hbmRQYXJzZXIgY3AsIE9wdGlvbiBvcHRpb24sIFN0cmluZyB0b2tlbiwKKyAgICAgICAgRmlsZSB2YWx1ZSApCisgICAgeworICAgICAgICBjbG8ub3V0cHV0RGlyID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHVzZXIgZWRpdGFibGUgdGVtcGxhdGUgZmlsZXMuCisgICAgICogQHBhcmFtIGNwCisgICAgICogQHBhcmFtIG9wdGlvbgorICAgICAqIEBwYXJhbSB0b2tlbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdGVtcGxhdGUgb3V0cHV0IGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRlbXBsYXRlT3V0cHV0RGlyKCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisgICAgICAgIEZpbGUgdmFsdWUgKQorICAgIHsKKyAgICAJY2xvLnRlbXBsYXRlT3V0cHV0RGlyID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmluZGluZy4KKyAgICAgKiBAcGFyYW0gY3AKKyAgICAgKiBAcGFyYW0gb3B0aW9uCisgICAgICogQHBhcmFtIHRva2VuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBiaW5kaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmluZGluZyggQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHRva2VuLAorICAgICAgICBTdHJpbmcgdmFsdWUgKQorICAgIHsKKyAgICAJY2xvLmJpbmRpbmcgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRvIHRoZSBzZXQgb2Ygd2hhdCBuZWVkcyB0byBiZSBnZW5lcmF0ZWQuCisgICAgICogQHBhcmFtIGNwCisgICAgICogQHBhcmFtIG9wdGlvbgorICAgICAqIEBwYXJhbSB0b2tlbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbGlzdCBvZiB3aGF0IG5lZWRzIHRvIGJlIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXaGF0KCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisgICAgICAgIFN0cmluZyB2YWx1ZSApCisgICAgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCB2YWx1ZSwgQ21kTGluZU9wdGlvbnMuV0hBVF9ERUxJTUVURVIgKTsKKyAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKSAKKyAgICAgICAgCWNsby53aGF0LmFkZChzdC5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpZ25vcmUgdGhlIGdsb2JhbGx5IHJlc2VydmVkIHdvcmRzIGxpc3QgZmxhZy4KKyAgICAgKiBAcGFyYW0gY3AKKyAgICAgKiBAcGFyYW0gb3B0aW9uCisgICAgICogQHBhcmFtIHRva2VuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaWdub3JlR2xvYmFsV29yZHNMaXN0KENvbW1hbmRQYXJzZXIgY3AsIE9wdGlvbiBvcHRpb24sIFN0cmluZyB0b2tlbikKKyAgICB7CisgICAgCWNsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGlnbm9yZSB0aGUgbG9jYWxseSByZXNlcnZlZCB3b3JkcyBsaXN0IGZsYWcuCisgICAgICogQHBhcmFtIGNwCisgICAgICogQHBhcmFtIG9wdGlvbgorICAgICAqIEBwYXJhbSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlnbm9yZUxvY2FsV29yZHNMaXN0KENvbW1hbmRQYXJzZXIgY3AsIE9wdGlvbiBvcHRpb24sIFN0cmluZyB0b2tlbikKKyAgICB7CisgICAgCWNsby5pZ25vcmVMb2NhbFdvcmRzTGlzdCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZmlsZSBuYW1lIG9mIHRoZSB1c2VyLWRlZmluZWQgcmVzZXJ2ZWQgd29yZHMgbGlzdC4KKyAgICAgKiBAcGFyYW0gY3AKKyAgICAgKiBAcGFyYW0gb3B0aW9uCisgICAgICogQHBhcmFtIHRva2VuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHVzZXItZGVmaW5lZCByZXNlcnZlZCB3b3JkcyBsaXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcldvcmRzTGlzdChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisgICAgICAgIEZpbGUgdmFsdWUpCisgICAgeworICAgIAljbG8udXNlcldvcmRzTGlzdCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdG8gdGhlIGluY2x1ZGUgcGF0aC4KKyAgICAgKiBAcGFyYW0gY3AKKyAgICAgKiBAcGFyYW0gb3B0aW9uCisgICAgICogQHBhcmFtIHRva2VuCisgICAgICogQHBhcmFtIHZhbHVlIHBhdGggbGlzdCB0byBhcHBlbmQgdG8gdGhlIGN1cnJlbnQgaW5jbHVkZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluY2x1ZGVQYXRoKCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisgICAgICAgIFN0cmluZyB2YWx1ZSApCisgICAgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaW5jbHVkZVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsCisgICAgICAgICAgICBGaWxlLnBhdGhTZXBhcmF0b3IpOworCisgICAgICAgIHdoaWxlKGluY2x1ZGVUb2tlbnMuaGFzTW9yZVRva2VucygpKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIHRlbXAgPSBuZXcgRmlsZShpbmNsdWRlVG9rZW5zLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIGNsby5pbmNsdWRlUGF0aC5hZGQodGVtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpZ25vcmUgdGhlIGluY2x1ZGUgcGF0aCBmcm9tIHRoZSBlbnZpcm9ubWVudCBmbGFnLgorICAgICAqIEBwYXJhbSBjcAorICAgICAqIEBwYXJhbSBvcHRpb24KKyAgICAgKiBAcGFyYW0gdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpZ25vcmVJbmNsdWRlUGF0aChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLAorICAgICAgICBTdHJpbmcgdG9rZW4pCisgICAgeworICAgIAljbG8uaWdub3JlSW5jbHVkZVBhdGggPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHF1aWV0IGZsYWcuCisgICAgICogQHBhcmFtIGNwCisgICAgICogQHBhcmFtIG9wdGlvbgorICAgICAqIEBwYXJhbSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHF1aWV0KCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4gKQorICAgIHsKKyAgICAJY2xvLnF1aWV0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyB0aGUgdmVyc2lvbiBhbmQgZXhpdHMuCisgICAgICogQHBhcmFtIGNwCisgICAgICogQHBhcmFtIG9wdGlvbgorICAgICAqIEBwYXJhbSB0b2tlbgorICAgICAqIEByZXR1cm4gZmFsc2Ugc28gdGhhdCB3ZSBzdG9wLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRvVmVyc2lvbiggQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHRva2VuICkKKyAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJFdGNoIHZlcnNpb24gaXMgJXMiLCBWZXJzaW9uLlZFUlNJT04pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN1cHByZXNzIG1peGluIGFydGlmYWN0cyBmbGFnLgorICAgICAqIEBwYXJhbSBjcAorICAgICAqIEBwYXJhbSBvcHRpb24KKyAgICAgKiBAcGFyYW0gdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub01peGluQXJ0aWZhY3RzKCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4gKQorICAgIHsKKyAgICAJY2xvLm5vTWl4aW5BcnRpZmFjdHMgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIG1peGlucy4KKyAgICAgKiBAcGFyYW0gY3AKKyAgICAgKiBAcGFyYW0gb3B0aW9uCisgICAgICogQHBhcmFtIHRva2VuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBtaXhpbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1peGluT3V0cHV0RGlyKCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisgICAgICAgIEZpbGUgdmFsdWUgKQorICAgIHsKKyAgICAJY2xvLm1peGluT3V0cHV0RGlyID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbm8gZmxhdHRlbiBwYWNrYWdlcyBmbGFnLgorICAgICAqIEBwYXJhbSBjcAorICAgICAqIEBwYXJhbSBvcHRpb24KKyAgICAgKiBAcGFyYW0gdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub0ZsYXR0ZW5QYWNrYWdlcyggQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHRva2VuICkKKyAgICB7CisgICAgCWNsby5ub0ZsYXR0ZW5QYWNrYWdlcyA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhpZGRlbiB0ZXN0aW5nIGZsYWcuCisgICAgICogQHBhcmFtIGNwCisgICAgICogQHBhcmFtIG9wdGlvbgorICAgICAqIEBwYXJhbSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRlc3RpbmcoIENvbW1hbmRQYXJzZXIgY3AsIE9wdGlvbiBvcHRpb24sIFN0cmluZyB0b2tlbiApCisgICAgeworICAgIAljbG8udGVzdGluZyA9IHRydWU7CisgICAgCWNsby5saCA9IG5ldyBMaXN0TG9nSGFuZGxlcigpOworICAgIAl0ZXN0aW5nQ2xvID0gY2xvOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJZiAtLXRlc3RpbmcgaXMgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIENtZExpbmVPcHRpb25zIGlzIHNhdmVkCisgICAgICogaGVyZSBmb3IgcmVmZXJlbmNlIGJ5IHVuaXQgdGVzdGluZyBwcm9ncmFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ21kTGluZU9wdGlvbnMgdGVzdGluZ0NsbzsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGV0Y2ggc291cmNlIGZpbGUgdG8gY29tcGlsZS4KKyAgICAgKiBAcGFyYW0gY3AgdGhlIGNvbW1hbmQgcGFyc2VyCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogQHBhcmFtIHZhbHVlIHBhdGggb2YgZXRjaCBmaWxlIHRvIGNvbXBpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VGaWxlKCBDb21tYW5kUGFyc2VyIGNwLCBQYXJhbWV0ZXIgcGFyYW0sIEZpbGUgdmFsdWUgKQorICAgIHsKKyAgICAJY2xvLnNvdXJjZUZpbGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBJbnN0YW50aWF0ZSBhIG5ldyBjb21waWxlciBpbnN0YW5jZSBhbmQgcnVuIGl0LgorICAgIAlDbGFzc0xvYWRlciBjbCA9IEV0Y2hDb21waWxlci5zZXR1cENsYXNzTG9hZGVyKCBudWxsICk7CisgICAgICAgIEV0Y2hDb21waWxlciBldGNoQ29tcGlsZXIgPSBuZXcgRXRjaENvbXBpbGVyKCBjbCApOworICAgICAgICAKKyAgICAgICAgZXRjaENvbXBpbGVyLnJ1biggY2xvICk7CisgICAgICAgIAorICAgICAgICBpZiAoY2xvLmxoLmhhc0Vycm9yKCkpCisgICAgICAgIAlleGl0KCAzLCAiRXRjaE1haW4iLCAiZXJyb3JzIGR1cmluZyBjb21waWxlIiwgZmFsc2UgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9GaWxlT3V0cHV0LmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9GaWxlT3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNmY1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0ZpbGVPdXRwdXQuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEZpbGUvZGlyZWN0b3J5IGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIE91dHB1dCBjb250YWluZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlT3V0cHV0IGltcGxlbWVudHMgT3V0cHV0Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0b3AtbGV2ZWwgT3V0cHV0LCBubyBwYWNrYWdlLgorCSAqLworCXB1YmxpYyBGaWxlT3V0cHV0KCkKKwl7CisJCXRoaXMoIG51bGwgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBtaWQtbGV2ZWwgT3V0cHV0IHdpdGggcGFja2FnZSBuYW1lLgorCSAqIEBwYXJhbSBwbgorCSAqLworCXB1YmxpYyBGaWxlT3V0cHV0KCBTdHJpbmcgcG4gKQorCXsKKwkJdGhpcy5wbiA9IHBuOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBwbjsKKwkKKwlwdWJsaWMgdm9pZCByZXBvcnQoIFN0cmluZyB3aGF0ICkKKwl7CisJCXJlcG9ydCggd2hhdCwgIiIgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlcG9ydCggU3RyaW5nIHdoYXQsIFN0cmluZyBpbmRlbnQgKQorCXsKKwkJaWYgKHBuICE9IG51bGwpCisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzcGFja2FnZSAlcyIsIGluZGVudCwgcG4gKTsKKwkJZWxzZQorCQkJU3lzdGVtLm91dC5wcmludGYoICIlcyVzIiwgaW5kZW50LCB3aGF0ICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCQkKKwkJU3RyaW5nIHNpbmRlbnQgPSBpbmRlbnQrIiAgIjsKKwkJCisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQnl0ZUFycmF5T3V0cHV0U3RyZWFtPiBtZTogZmlsZXMuZW50cnlTZXQoKSkKKwkJCXJlcG9ydCggc2luZGVudCwgbWUuZ2V0S2V5KCksIG1lLmdldFZhbHVlKCkgKTsKKwkJCisJCWZvciAoRmlsZU91dHB1dCBwOiBwYWNrYWdlcy52YWx1ZXMoKSkKKwkJCXAucmVwb3J0KCB3aGF0LCBzaW5kZW50ICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlcG9ydCggU3RyaW5nIGluZGVudCwgU3RyaW5nIGZuLCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gdmFsdWUgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGYoICIlc2ZpbGUgJXMgJWQiLCBpbmRlbnQsIGZuLCB2YWx1ZS5zaXplKCkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJfQorCisJcHVibGljIE91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oIFN0cmluZyBmbiApCisJeworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJZmlsZXMucHV0KCBmbiwgYmFvcyApOworCQlyZXR1cm4gYmFvczsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0+IGZpbGVzID0KKwkJbmV3IEhhc2hNYXA8U3RyaW5nLCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0+KCk7CisKKwlwdWJsaWMgT3V0cHV0IG5ld1BhY2thZ2UoIFN0cmluZyBwbiApCisJeworCQlGaWxlT3V0cHV0IHAgPSBwYWNrYWdlcy5nZXQoIHBuICk7CisJCWlmIChwID09IG51bGwpCisJCXsKKwkJCXAgPSBuZXcgRmlsZU91dHB1dCggcG4gKTsKKwkJCXBhY2thZ2VzLnB1dCggcG4sIHAgKTsKKwkJfQorCQlyZXR1cm4gcDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBGaWxlT3V0cHV0PiBwYWNrYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRmlsZU91dHB1dD4oKTsKKworCXB1YmxpYyB2b2lkIHNhdmVGaWxlcyggRmlsZSBvdXRwdXREaXIsIGJvb2xlYW4gbm9RdWFsT3V0cHV0RGlyLAorCQlib29sZWFuIG5vRmxhdHRlblBhY2thZ2VzLCBib29sZWFuIGZvcmNlICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlzYXZlRmlsZXMoIG91dHB1dERpciwgbm9RdWFsT3V0cHV0RGlyLCBub0ZsYXR0ZW5QYWNrYWdlcywgZm9yY2UsIG51bGwgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2F2ZUZpbGVzKCBGaWxlIG91dHB1dERpciwgYm9vbGVhbiBub1F1YWxPdXRwdXREaXIsCisJCWJvb2xlYW4gbm9GbGF0dGVuUGFja2FnZXMsIGJvb2xlYW4gZm9yY2UsIFN0cmluZyBwa2cgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWlmIChwbiAhPSBudWxsKQorCQl7CisJCQlpZiAocGtnICE9IG51bGwpCisJCQkJcGtnICs9ICcuJyArIHBuOworCQkJZWxzZQorCQkJCXBrZyA9IHBuOworCQl9CisKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZigKKy8vCQkJInNhdmVGaWxlczogb3V0cHV0RGlyICVzLCBub1F1YWxPdXRwdXREaXIgJXMsIG5vRmxhdHRlblBhY2thZ2VzICVzLCBmb3JjZSAlcywgcGtnICVzXG4iLAorLy8JCQlvdXRwdXREaXIsIG5vUXVhbE91dHB1dERpciwgbm9GbGF0dGVuUGFja2FnZXMsIGZvcmNlLCBwa2cgKTsKKwkJCisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQnl0ZUFycmF5T3V0cHV0U3RyZWFtPiBtZTogZmlsZXMuZW50cnlTZXQoKSkKKwkJCXNhdmVGaWxlKCBvdXRwdXREaXIsIG5vUXVhbE91dHB1dERpciwgbm9GbGF0dGVuUGFja2FnZXMsIGZvcmNlLCBwa2csIG1lLmdldEtleSgpLCBtZS5nZXRWYWx1ZSgpICk7CisJCQorCQlmb3IgKEZpbGVPdXRwdXQgcDogcGFja2FnZXMudmFsdWVzKCkpCisJCQlwLnNhdmVGaWxlcyggb3V0cHV0RGlyLCBub1F1YWxPdXRwdXREaXIsIG5vRmxhdHRlblBhY2thZ2VzLCBmb3JjZSwgcGtnICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNhdmVGaWxlKCBGaWxlIG91dHB1dERpciwgYm9vbGVhbiBub1F1YWxPdXRwdXREaXIsCisJCWJvb2xlYW4gbm9GbGF0dGVuUGFja2FnZXMsIGJvb2xlYW4gZm9yY2UsIFN0cmluZyBwa2csIFN0cmluZyBmbiwKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHZhbHVlICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworLy8JCVN5c3RlbS5vdXQucHJpbnRmKAorLy8JCQkic2F2ZUZpbGU6IG91dHB1dERpciAlcywgbm9RdWFsT3V0cHV0RGlyICVzLCBub0ZsYXR0ZW5QYWNrYWdlcyAlcywgZm9yY2UgJXMsIHBrZyAlcywgZm4gJXMsIHNpemUgJWRcbiIsCisvLwkJCW91dHB1dERpciwgbm9RdWFsT3V0cHV0RGlyLCBub0ZsYXR0ZW5QYWNrYWdlcywgZm9yY2UsIHBrZywgZm4sIHZhbHVlLnNpemUoKSApOworCQkKKwkJaWYgKHBrZyAhPSBudWxsICYmICFub1F1YWxPdXRwdXREaXIpCisJCXsKKwkJCWlmIChub0ZsYXR0ZW5QYWNrYWdlcykKKwkJCQlwa2cgPSBwa2cucmVwbGFjZSggJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIgKTsKKwkJCW91dHB1dERpciA9IG5ldyBGaWxlKCBvdXRwdXREaXIsIHBrZyApOworCQl9CisJCQorCQlGaWxlIGYgPSBuZXcgRmlsZSggb3V0cHV0RGlyLCBmbiApLmdldENhbm9uaWNhbEZpbGUoKTsKKwkJCisJCWlmIChmLmlzRmlsZSgpICYmICFmb3JjZSkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGYoICIqKiogZXhpc3RpbmcgZmlsZSBub3Qgb3ZlcndyaXR0ZW46ICVzXG4iLCBmICk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworCQkKKwkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOworCQl0cnkKKwkJeworCQkJdmFsdWUud3JpdGVUbyggZm9zICk7CisJCX0KKwkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKwkJeworCQkJZm9zLmNsb3NlKCk7CisJCQlmLmRlbGV0ZSgpOworCQkJSU9FeGNlcHRpb24geCA9IG5ldyBJT0V4Y2VwdGlvbiggImVycm9yIHdyaXRpbmcgIitmICk7CisJCQl4LmluaXRDYXVzZSggZSApOworCQkJdGhyb3cgeDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWZvcy5jbG9zZSgpOworCQl9CisJCQorLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAid3JvdGUgZmlsZSAlcywgc2l6ZSAlZFxuIiwgZiwgdmFsdWUuc2l6ZSgpICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvTGlzdExvZ0hhbmRsZXIuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0xpc3RMb2dIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0NzE5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL0xpc3RMb2dIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogTG9nSGFuZGxlciB3aGljaCBhY2N1bXVsYXRlcyBtZXNzYWdlcyBpbiBhIGxpc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0TG9nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0TG9nSGFuZGxlcgoreworCS8qKiBsaXN0IG9mIGFjY3VtdWxhdGVkIG1lc3NhZ2VzICovCisJcHVibGljIExpc3Q8TWVzc2FnZT4gbXNncyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGxvZyggTWVzc2FnZSBtZXNzYWdlICkKKwl7CisJCW1zZ3MuYWRkKCBtZXNzYWdlICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvTG9nSGFuZGxlci5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvTG9nSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9Mb2dIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKKworLyoqCisgKiBUaGlzIEludGVyZmFjZSBpcyB1c2VkIGZvciBMb2dnaW5nIG1lc3NhZ2VzLiBJdCBoZWxwcyBwcm92aWRlIGEgY29uc2lzdGVudAorICogd2F5IG9mIHByaW50aW5nIGFuZCByZXBvcnRpbmcgRXJyb3IsIEluZm8gYW5kIFdhcm5pbmcgbWVzc2FnZXMuCisgKiBAYXV0aG9yIGdzYW5kaGlyCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIExvZ0hhbmRsZXIKK3sKKwkvKioKKwkgKiBBIG1lc3NhZ2Ugd2hpY2ggaXMgYWx3YXlzIHByaW50ZWQsIGJ1dCBkb2Vzbid0IGFmZmVjdCBjb21waWxhdGlvbi4KKwkgKiBBbHNvIHVzdWFsbHkgZm9ybWF0dGVkIHdpdGhvdXQgbGV2ZWwsIHBoYXNlLCBzb3VyY2UsIGxpbmUgbnVtYmVyLCBvcgorCSAqIGhpc3RvcnkgaW5mb3JtYXRpb24uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVWRUxfSU1QT1JUQU5UID0gMDsKKwkKKwkvKioKKwkgKiBBbiBlcnJvciBsZXZlbCBtZXNzYWdlLiBBbHNvIGNhdXNlcyBjb21waWxlciB0byBleGl0IHdpdGggYW4gZXJyb3IgY29kZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVZFTF9FUlJPUiA9IDE7CisJCisJLyoqCisJICogQSB3YXJuaW5nIGxldmVsIG1lc3NhZ2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVWRUxfV0FSTklORyA9IDI7CisJCisJLyoqCisJICogQW4gaW5mb3JtYXRpb24gbGV2ZWwgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVZFTF9JTkZPID0gMzsKKwkKKwkvKioKKwkgKiBGb3JtYXRzIGFuZCByZXBvcnRzIGEgbWVzc2FnZSB3aXRob3V0IGEgbGluZSBudW1iZXIuCisJICogQHBhcmFtIGxldmVsCisJICogQHBhcmFtIGZtdAorCSAqIEBwYXJhbSBwYXJhbXMKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnQoIGludCBsZXZlbCwgU3RyaW5nIGZtdCwgT2JqZWN0IC4uLiBwYXJhbXMgKTsKKwkKKwkvKioKKwkgKiBGb3JtYXRzIGFuZCByZXBvcnRzIGEgbWVzc2FnZSB3aXRoIHBlcmhhcHMgYSBsaW5lIG51bWJlci4KKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiBAcGFyYW0gbGluZU51bWJlcgorCSAqIEBwYXJhbSBmbXQKKwkgKiBAcGFyYW0gcGFyYW1zCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0KCBpbnQgbGV2ZWwsIEludGVnZXIgbGluZU51bWJlciwgU3RyaW5nIGZtdCwKKwkJT2JqZWN0IC4uLiBwYXJhbXMgKTsKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGVpdGhlciBzdG9yZSBvciBwcmludCBtZXNzYWdlcworCSAqIEBwYXJhbSBsZXZlbCBpbmRpY2F0ZXMgRVJST1IsIFdBUk5JTkcgb3IgSU5GTworCSAqIEBwYXJhbSB0b2tlbiBpbmRpY2F0ZXMgdGhlIHRva2VuIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZAorCSAqIEBwYXJhbSBtc2cgU3RyaW5nIG1lc3NhZ2UKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNyZXBvcnQoaW50LCBJbnRlZ2VyLCBTdHJpbmcpfSBpbnN0ZWFkLgorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHZvaWQgbG9nTWVzc2FnZSggaW50IGxldmVsLCBUb2tlbiB0b2tlbiwgU3RyaW5nIG1zZyApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYSBwcmUtZm9ybWF0dGVkIG1lc3NhZ2UgcGVyaGFwcyB3aXRoIGEgbGluZSBudW1iZXIuCisJICogQHBhcmFtIGxldmVsCisJICogQHBhcmFtIGxpbmVOdW1iZXIKKwkgKiBAcGFyYW0gbXNnCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0KCBpbnQgbGV2ZWwsIEludGVnZXIgbGluZU51bWJlciwgU3RyaW5nIG1zZyApOworCQorCS8qKgorCSAqIERldGVybWluZXMgaWYgYSBtZXNzYWdlIGlzIGludGVyZXN0aW5nIGdpdmVuIGl0cyBsZXZlbC4KKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiBAcmV0dXJuIHRydWUgaWYgYSBtZXNzYWdlIGlzIGludGVyZXN0aW5nIGdpdmVuIGl0cyBsZXZlbC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0aW5nKCBpbnQgbGV2ZWwgKTsKKwkKKwkvKioKKwkgKiBQdXNoZXMgYSBuZXcgc291cmNlIG9uIHRoZSBzdGFjay4KKwkgKiBAcGFyYW0gbmV3U291cmNlIG5ldyBzb3VyY2UgbmFtZSBiZWluZyByZWFkLgorCSAqIEBwYXJhbSBsaW5lTnVtYmVySW5PbGRTb3VyY2UgbGluZSBudW1iZXIgaW4gb2xkIHNvdXJjZSB3aGljaCBjYXVzZWQgdGhlIG5ldworCSAqIHNvdXJjZSB0byBiZSByZWFkLiBUaGlzIHNob3VsZCBiZSBudWxsIGZvciB0aGUgdG9wIGxldmVsIHNvdXJjZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXNoKCBTdHJpbmcgbmV3U291cmNlLCBJbnRlZ2VyIGxpbmVOdW1iZXJJbk9sZFNvdXJjZSApOworCQorCS8qKgorCSAqIFJlbW92ZXMgdGhlIHNvdXJjZSB0aGF0IHdhcyBhZGRlZCBieSB0aGUgbGFzdCBwdXNoIG1ldGhvZC4KKwkgKiBJdCBiZWhhdmVzIGV4YWN0bHkgbGlrZSB0aGUgcG9wIG1ldGhvZCBpbiBTdGFja3MKKwkgKiBAcGFyYW0gb2xkU291cmNlIHRoZSBzb3VyY2UgbmFtZSB3ZSBqdXN0IGZpbmlzaGVkIHJlYWRpbmcuIFRoaXMgd2FzCisJICogcHJldmlvdXNseSBwYXNzZWQgYXMgdGhlIGFyZ3VtZW50IHRvIHRoZSBsYXN0IHB1c2guCisJICovCisJcHVibGljIHZvaWQgcG9wKCBTdHJpbmcgb2xkU291cmNlICk7CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGFuIGVycm9yIGhhcyBiZWVuIHJlcG9ydGVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCk7CisJCisJLyoqCisJICogQHJldHVybiBjb3VudCBvZiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gcmVwb3J0ZWQuCisJICovCisJcHVibGljIGludCBlcnJvckNvdW50KCk7CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGEgd2FybmluZyBoYXMgYmVlbiByZXBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNXYXJuaW5nKCk7CisJCisJLyoqCisJICogQHJldHVybiBjb3VudCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYmVlbiByZXBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgaW50IHdhcm5pbmdDb3VudCgpOworCisJLyoqCisJICogR2V0cyB0aGUgbGV2ZWwgb2YgbG9nZ2luZy4KKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGxldmVsIG9mIGxvZ2dpbmcuIE9ubHkgbWVzc2FnZXMgd2l0aCBsZXZlbCBsZXNzIHRoYW4KKwkgKiBvciBlcXVhbCB0byB0aGlzIHZhbHVlIHdpbGwgYmUgbG9nZ2VkLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TGV2ZWwoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBsZXZlbCBvZiBsb2dnaW5nLiBPbmx5IG1lc3NhZ2VzIHdpdGggbGV2ZWwgbGVzcyB0aGFuCisJICogb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZSB3aWxsIGJlIGxvZ2dlZC4KKwkgKiBAcGFyYW0gbGV2ZWwgdGhlIGxldmVsIG9mIGxvZ2dpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMZXZlbCggaW50IGxldmVsICk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCBwaGFzZSBvZiBwcm9jZXNzaW5nLiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBudWxsLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGhhc2UoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBjdXJyZW50IHBoYXNlIG9mIHByb2Nlc3NpbmcuCisJICogQHBhcmFtIHBoYXNlIG1heSBiZSBudWxsLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBoYXNlKCBTdHJpbmcgcGhhc2UgKTsKKwkKKwkvKioKKwkgKiBGaW5hbCBjb25kZW5zYXRpb24gb2YgdGhlIGluZm9ybWF0aW9uIG9mIGEgcmVwb3J0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZQorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBsZXZlbAorCQkgKiBAcGFyYW0gcGhhc2UKKwkJICogQHBhcmFtIHNvdXJjZQorCQkgKiBAcGFyYW0gbGluZU51bWJlcgorCQkgKiBAcGFyYW0gbXNnCisJCSAqIEBwYXJhbSBoaXN0b3J5CisJCSAqLworCQlwdWJsaWMgTWVzc2FnZSggaW50IGxldmVsLCBTdHJpbmcgcGhhc2UsIFN0cmluZyBzb3VyY2UsCisJCQlJbnRlZ2VyIGxpbmVOdW1iZXIsIFN0cmluZyBtc2csIEhpc3RvcnlbXSBoaXN0b3J5ICkKKwkJeworCQkJdGhpcy5sZXZlbCA9IGxldmVsOworCQkJdGhpcy5waGFzZSA9IHBoYXNlOworCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisJCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOworCQkJdGhpcy5tc2cgPSBtc2c7CisJCQl0aGlzLmhpc3RvcnkgPSBoaXN0b3J5OworCQl9CisJCQorCQkvKiogdGhlIGxldmVsIG9mIHRoZSByZXBvcnQgKi8KKwkJcHVibGljIGZpbmFsIGludCBsZXZlbDsKKwkJCisJCS8qKiB0aGUgcGhhc2Ugb2YgcHJvY2Vzc2luZyB3aGVuIHRoZSByZXBvcnQgd2FzIG1hZGUgKi8KKwkJcHVibGljIGZpbmFsIFN0cmluZyBwaGFzZTsKKwkJCisJCS8qKiB0aGUgY3VycmVudCBpbnB1dCBzb3VyY2UgKi8KKwkJcHVibGljIGZpbmFsIFN0cmluZyBzb3VyY2U7CisJCQorCQkvKiogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2Ugd2hpY2ggY2F1c2VkIHRoZSByZXBvcnQgKGlmIGFueSkgKi8KKwkJcHVibGljIGZpbmFsIEludGVnZXIgbGluZU51bWJlcjsKKwkJCisJCS8qKiB0aGUgdGV4dCBvZiB0aGUgcmVwb3J0ICovCisJCXB1YmxpYyBmaW5hbCBTdHJpbmcgbXNnOworCQkKKwkJLyoqIHRoZSBoaXN0b3J5IG9mIHNvdXJjZXMgcHJldmlvdXMgdG8gc291cmNlIC8gbGluZU51bWJlciBhYm92ZSAqLworCQlwdWJsaWMgZmluYWwgSGlzdG9yeVtdIGhpc3Rvcnk7CisJfQorCisJLyoqCisJICogUmVjb3JkIG9mIHRoZSBpbnB1dCBzdHJlYW1zIHByZXZpb3VzIHRvIHRoZSBsYXN0IG9uZSBwdXNoZWQuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBIaXN0b3J5CisJeworCQkvKioKKwkJICogQHBhcmFtIHNvdXJjZQorCQkgKiBAcGFyYW0gbGluZU51bWJlcgorCQkgKi8KKwkJcHVibGljIEhpc3RvcnkoIFN0cmluZyBzb3VyY2UsIGludCBsaW5lTnVtYmVyICkKKwkJeworCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisJCQlsaW5lTnVtID0gbGluZU51bWJlcjsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFRoZSBzb3VyY2Ugb2YgdGhlIGlucHV0IHN0cmVhbSAoZmlsZSwgc3RkaW4sIGV0Yy4pCisJCSAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIHNvdXJjZTsKKwkJCisJCS8qKgorCQkgKiBUaGUgbGluZSBudW1iZXIgb2YgdGhlIHNvdXJjZSB3aGljaCBjYXVzZWQgYSBuZXcgc291cmNlIHRvIGJlIHB1c2hlZC4KKwkJICovCisJCXB1YmxpYyBmaW5hbCBpbnQgbGluZU51bTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9OdWxsQ29tcGlsZXIuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL051bGxDb21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTBhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9OdWxsQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5Nb2R1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlBhcmFtTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5UeXBlUmVmOworCisKKy8qKgorICogQ29tcGlsZXIgd2hpY2ggZG9lc24ndCBnZW5lcmF0ZWQgYW55IGNvZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsQ29tcGlsZXIgZXh0ZW5kcyBCYWNrZW5kCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgTnVsbENvbXBpbGVyLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIE51bGxDb21waWxlcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZERlZmF1bHRzKCBTZXJ2aWNlIHNlcnZpY2UgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWFkZEJ1aWx0aW4oIHNlcnZpY2UsIG5ld05hbWUoICJMaXN0IiApLCAiIiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiTWFwIiApLCAiIiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiU2V0IiApLCAiIiwgdHJ1ZSApOworCQlhZGRCdWlsdGluKCBzZXJ2aWNlLCBuZXdOYW1lKCAiRGF0ZXRpbWUiICksICIiLCBmYWxzZSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgYXN5bmNSZWNlaXZlclBvb2xOYW1lKCBNZXNzYWdlIG1zZyApCisJeworCQkvLyBpZ25vcmUKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBlbnVtX2VmcW5hbWUoIFN0cmluZyBmcW5hbWUsIFN0cmluZyBtb2R1bGVOYW1lLAorCQlTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBlbnVtTmFtZSApCisJeworCQkvLyBpZ25vcmUKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBleGNlcHRfZWZxbmFtZSggU3RyaW5nIGZxbmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUsCisJCVN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGVudW1OYW1lICkKKwl7CisJCS8vIGlnbm9yZQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGZvcm1hdFN0cmluZyggUGFyYW1MaXN0PFNlcnZpY2U+IG4sIGJvb2xlYW4gaXNFeGNlcHQgKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uCisJeworCQkvLyBpZ25vcmUKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZ2VuZXJhdGUoIE1vZHVsZSBtb2R1bGUsIENtZExpbmVPcHRpb25zIG9wdGlvbnMgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBpZ25vcmUKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldExhbmcoKQorCXsKKwkJLy8gaWdub3JlCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmF0aXZlVHlwZU5hbWUoIFR5cGVSZWYgdHlwZSApCisJeworCQkvLyBpZ25vcmUKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSggVHlwZVJlZiB0eXBlICkKKwl7CisJCS8vIGlnbm9yZQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVWYWx1ZSggVHlwZVJlZiB0eXBlLCBUb2tlbiB2YWx1ZSApIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJRXhjZXB0aW9uCisJeworCQkvLyBpZ25vcmUKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3IoIE5hbWVkPD8+IG5hbWVkICkKKwl7CisJCS8vIGlnbm9yZQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIG1mdm5hbWUoIFN0cmluZyB2bmFtZSApCisJeworCQkvLyBpZ25vcmUKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBtdHZuYW1lKCBTdHJpbmcgdm5hbWUgKQorCXsKKwkJLy8gaWdub3JlCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgcXVhbGlmeUNvbnN0YW50TmFtZSggU2VydmljZSBpbnRmLCBUb2tlbiBuYW1lICkKKwl7CisJCS8vIGlnbm9yZQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHF1YWxpZnlFbnVtTmFtZSggU2VydmljZSBpbnRmLCBUb2tlbiBuYW1lICkKKwl7CisJCS8vIGlnbm9yZQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHF1YWxpZnlQYXJhbWV0ZXJOYW1lKCBUb2tlbiBuYW1lICkKKwl7CisJCS8vIGlnbm9yZQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHN0cnVjdF9lZnFuYW1lKCBTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwKKwkJU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZW51bU5hbWUgKQorCXsKKwkJLy8gaWdub3JlCisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL051bGxPdXRwdXQuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL051bGxPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWRkZTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvTnVsbE91dHB1dC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBPdXRwdXQgd2hpY2ggZG9lcyBub3RoaW5nLgorICovCitwdWJsaWMgY2xhc3MgTnVsbE91dHB1dCBpbXBsZW1lbnRzIE91dHB1dAoreworCXB1YmxpYyBPdXRwdXRTdHJlYW0gbmV3T3V0cHV0U3RyZWFtKCBTdHJpbmcgZm4gKQorCXsKKwkJcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW0oKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKCBpbnQgYiApIHRocm93cyBJT0V4Y2VwdGlvbgorCQkJeworCQkJCS8vIGlnbm9yZSwgd2UgZG9uJ3Qgd2FudCB0aGUgb3V0cHV0LgorCQkJfQorCQl9OworCX0KKworCXB1YmxpYyBPdXRwdXQgbmV3UGFja2FnZSggU3RyaW5nIHBuICkKKwl7CisJCS8vIGlnbm9yZSwgd2UgZG9uJ3QgY2FyZSB3aGF0IHRoZSBwYWNrYWdlIGlzLgorCQlyZXR1cm4gdGhpczsKKwl9CisJCisJcHVibGljIHZvaWQgcmVwb3J0KCBTdHJpbmcgd2hhdCApCisJeworCQkvLyBpZ25vcmUsIG5vdGhpbmcgdG8gcmVwb3J0LgorCX0KKworCXB1YmxpYyB2b2lkIHNhdmVGaWxlcyggRmlsZSBvdXRwdXREaXIsIGJvb2xlYW4gbm9RdWFsT3V0cHV0RGlyLAorCQlib29sZWFuIG5vRmxhdHRlblBhY2thZ2VzLCBib29sZWFuIGZvcmNlICkKKwl7CisJCS8vIGlnbm9yZSwgbm90aGluZyB0byBzYXZlLgorCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL091dHB1dC5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvT3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjMmExMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL091dHB1dC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBJbnRlcmZhY2Ugb2YgYW4gb3V0cHV0IGNvbnRhaW5lciBmb3IgdGhlIGNvbXBpbGVyLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE91dHB1dAoreworCS8qKgorCSAqIENyZWF0ZXMgYW4gT3V0cHV0U3RyZWFtIGZvciB0aGUgb3V0cHV0IGZpbGUuCisJICogQHBhcmFtIGZuCisJICogQHJldHVybiBhIG5ldyBPdXRwdXRTdHJlYW0gZm9yIHRoZSBvdXRwdXQgZmlsZS4KKwkgKi8KKwlwdWJsaWMgT3V0cHV0U3RyZWFtIG5ld091dHB1dFN0cmVhbSggU3RyaW5nIGZuICk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IE91dHB1dCB0byBob2xkIHRoZSBvdXRwdXQgZm9yIHRoZSBwYWNrYWdlLgorCSAqIEBwYXJhbSBwbgorCSAqIEByZXR1cm4gYSBuZXcgT3V0cHV0LgorCSAqLworCXB1YmxpYyBPdXRwdXQgbmV3UGFja2FnZSggU3RyaW5nIHBuICk7CisJCisJLyoqCisJICogUmVwb3J0cyBvbiB0aGUgY29udGVudHMgb2YgdGhlIE91dHB1dC4KKwkgKiBAcGFyYW0gd2hhdAorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydCggU3RyaW5nIHdoYXQgKTsKKworCS8qKgorCSAqIFNhdmVzIHRoZSBmaWxlcyBpbiB0aGlzIG91dHB1dCBjb250YWluZXIuCisJICogQHBhcmFtIG91dHB1dERpciB0aGUgZGlyZWN0b3J5IGZvciB0aGUgb3V0cHV0IGZpbGVzLgorCSAqIEBwYXJhbSBub1F1YWxPdXRwdXREaXIgaWYgdHJ1ZSBkbyBub3QgcXVhbGlmeSB0aGUgZmlsZSBuYW1lIHdpdGggdGhlCisJICogbW9kdWxlIG5hbWUuCisJICogQHBhcmFtIG5vRmxhdHRlblBhY2thZ2VzIGlmIHRydWUgZG8gbm90IGZsYXR0ZW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKKwkgKiBpbXBsaWVkIGJ5IHRoZSBtb2R1bGUgbmFtZS4KKwkgKiBAcGFyYW0gZm9yY2UgaWYgdHJ1ZSBhbHdheXMgb3ZlcndyaXRlIGZpbGVzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCisJICovCisJcHVibGljIHZvaWQgc2F2ZUZpbGVzKCBGaWxlIG91dHB1dERpciwgYm9vbGVhbiBub1F1YWxPdXRwdXREaXIsCisJCWJvb2xlYW4gbm9GbGF0dGVuUGFja2FnZXMsIGJvb2xlYW4gZm9yY2UgKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9TdGFja0lucHV0U3RyZWFtLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9TdGFja0lucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMmYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL1N0YWNrSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBJbnB1dCBzdHJlYW0gdG8gc3VwcG9ydCBpbmNsdWRlIGluIHRoZSBldGNoIGNvbXBpbGVyLgorICovCitwdWJsaWMgY2xhc3MgU3RhY2tJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtCit7CisJc3RhdGljIGludCBuT25jZSA9IDA7CisJCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBtYWluU3RyZWFtID0gbnVsbDsKKwlwcml2YXRlIElucHV0U3RyZWFtIGluY2x1ZGVTdHJlYW0gPSBudWxsOworCXByaXZhdGUgSW5wdXRTdHJlYW0gY3VycmVudFN0cmVhbSA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBTdGFja0lucHV0U3RyZWFtLgorCSAqIEBwYXJhbSBpbjEKKwkgKi8KKwlwdWJsaWMgU3RhY2tJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbjEpCisJeworCQltYWluU3RyZWFtID0gaW4xOworCQljdXJyZW50U3RyZWFtID0gbWFpblN0cmVhbTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW4yCisJICovCisJcHVibGljIHZvaWQgc2V0U3RyZWFtVHdvKElucHV0U3RyZWFtIGluMikKKwl7CisJCWluY2x1ZGVTdHJlYW0gPSBpbjI7CisJfQorCisJLyoqCisJICogQHBhcmFtIHZhbAorCSAqLworCXB1YmxpYyB2b2lkIEFjdGl2YXRlU3RyZWFtKGludCB2YWwpCisJeworCQlpZih2YWwgPT0gMCkKKwkJeworCQkJY3VycmVudFN0cmVhbSA9IG1haW5TdHJlYW07CisJCX0KKwkJZWxzZSBpZih2YWwgPT0gMSkKKwkJeworCQkJY3VycmVudFN0cmVhbSA9IGluY2x1ZGVTdHJlYW07CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGludCByZWFkKCkKKwl7CisJCWludCB2YWwgPSAwOworCQl0cnkKKwkJeworCQkJdmFsID0gY3VycmVudFN0cmVhbS5yZWFkKCk7CisJCX0KKwkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKwkJeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQkKKwkJaWYodmFsID09IC0xICYmIG5PbmNlID09IDAgJiYgaW5jbHVkZVN0cmVhbSAhPSBudWxsKQorCQl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLVN0YWNrIFJlc2V0IFRvIFN0cmVhbSAwID4+Pj4gIiArIHZhbCk7CisJCQlBY3RpdmF0ZVN0cmVhbSgxKTsKKwkJCXRyeQorCQkJeworCQkJCXZhbCA9IGN1cnJlbnRTdHJlYW0ucmVhZCgpOworCQkJfQorCQkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJbk9uY2UgPSAxOworCQl9CisJCQorCQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLVN0YWNrIFJlYWQgPj4+PiAiICsgdmFsKTsKKwkJcmV0dXJuIHZhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9WZXJzaW9uLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9WZXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyM2NiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL1ZlcnNpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyOworCisvKioKKyAqIFRoZSB2ZXJzaW9uIGluZm8gb2YgdGhlIEV0Y2ggZnJvbnRlbmQgKHBhcnNlcikKKyAqLworcHVibGljIGludGVyZmFjZSBWZXJzaW9uCit7CisJLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBFdGNoIGZyb250ZW5kIChwYXJzZXIpICovCisJcHVibGljIFN0cmluZyBWRVJTSU9OID0gIkFwYWNoZSBFdGNoIDEuMS4wLWluY3ViYXRpbmcgKExPQ0FMLTApIjsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL1ZlcnNpb24uamF2YS50bXBsIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvVmVyc2lvbi5qYXZhLnRtcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjNjY3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL1ZlcnNpb24uamF2YS50bXBsCkBAIC0wLDAgKzEsMjcgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlcjsKKworLyoqCisgKiBUaGUgdmVyc2lvbiBpbmZvIG9mIHRoZSBFdGNoIGZyb250ZW5kIChwYXJzZXIpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmVyc2lvbgoreworCS8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgRXRjaCBmcm9udGVuZCAocGFyc2VyKSAqLworCXB1YmxpYyBTdHJpbmcgVkVSU0lPTiA9ICJBcGFjaGUgRXRjaCBARXRjaExvbmdWZXJzaW9uQCAoQEV0Y2hCdWlsZFRhZ0ApIjsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFRyZWVXYWxrZXIuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFRyZWVXYWxrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2VjYWEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0Fic3RyYWN0VHJlZVdhbGtlci5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0cmVlIHdhbGtlciB0aGF0IGRvZXMgbm90aGluZy4gVXNlZnVsIGZvcgorICogaW5zdGFuY2VzIHdoZXJlIHlvdSB3YW50IHRvIGxvb2sgYXQgYSBmZXcgdGhpbmdzIGR1cmluZyBhIHRyZWUKKyAqIHdhbGsgYnV0IGRvbid0IHdhbnQgdG8gbG9vayBhdCBldmVyeXRoaW5nLgorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RUcmVlV2Fsa2VyIGltcGxlbWVudHMgVHJlZVdhbGtlcgoreworCXB1YmxpYyB2b2lkIGRvRXh0ZXJuKCBFeHRlcm4gZXh0ZXJuICkKKwl7CisJCS8vIGlnbm9yZS4KKwl9CisKKwlwdWJsaWMgdm9pZCBkb0l0ZW0oIEl0ZW0gaXRlbSApCisJeworCQkvLyBpZ25vcmUuCisJfQorCisJcHVibGljIHZvaWQgZG9NaXhpbiggTWl4aW4gbWl4aW4gKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIGRvVGhyb3duKCBUaHJvd24gdGhyb3duICkKKwl7CisJCS8vIGlnbm9yZS4KKwl9CisKKwlwdWJsaWMgdm9pZCBkb1R5cGVSZWYoIFR5cGVSZWYgcmVmICkKKwl7CisJCS8vIGlnbm9yZS4KKwl9CisKKwlwdWJsaWMgdm9pZCBwb3N0Q29uc3RhbnQoIENvbnN0YW50IGNvbnN0YW50ICkKKwl7CisJCS8vIGlnbm9yZS4KKwl9CisKKwlwdWJsaWMgdm9pZCBwb3N0RW51bSggRW51bXggZW51bXggKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHBvc3RFeGNlcHQoIEV4Y2VwdCBleGNlcHQgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHBvc3RNZXNzYWdlKCBNZXNzYWdlIG1lc3NhZ2UgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHBvc3RNb2R1bGUoIE1vZHVsZSBtb2R1bGUgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHBvc3RQYXJhbWV0ZXIoIFBhcmFtZXRlciBwYXJhbWV0ZXIgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHBvc3RTZXJ2aWNlKCBTZXJ2aWNlIHNlcnZpY2UgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHBvc3RTdHJ1Y3QoIFN0cnVjdCBzdHJ1Y3QgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHByZUNvbnN0YW50KCBDb25zdGFudCBjb25zdGFudCApCisJeworCQkvLyBpZ25vcmUuCisJfQorCisJcHVibGljIHZvaWQgcHJlRW51bSggRW51bXggZW51bXggKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHByZUV4Y2VwdCggRXhjZXB0IGV4Y2VwdCApCisJeworCQkvLyBpZ25vcmUuCisJfQorCisJcHVibGljIHZvaWQgcHJlTWVzc2FnZSggTWVzc2FnZSBtZXNzYWdlICkKKwl7CisJCS8vIGlnbm9yZS4KKwl9CisKKwlwdWJsaWMgdm9pZCBwcmVNb2R1bGUoIE1vZHVsZSBtb2R1bGUgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KKworCXB1YmxpYyB2b2lkIHByZVBhcmFtZXRlciggUGFyYW1ldGVyIHBhcmFtZXRlciApCisJeworCQkvLyBpZ25vcmUuCisJfQorCisJcHVibGljIHZvaWQgcHJlU2VydmljZSggU2VydmljZSBzZXJ2aWNlICkKKwl7CisJCS8vIGlnbm9yZS4KKwl9CisKKwlwdWJsaWMgdm9pZCBwcmVTdHJ1Y3QoIFN0cnVjdCBzdHJ1Y3QgKQorCXsKKwkJLy8gaWdub3JlLgorCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9Bc3luY1JlY2VpdmVyTW9kZS5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0FzeW5jUmVjZWl2ZXJNb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiMTkyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9Bc3luY1JlY2VpdmVyTW9kZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCisvKioKKyAqIEZsYWcgdGhhdCBjb250cm9scyBob3cgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIgZGlzcGF0Y2hlcworICogYW5kIHJ1bnMgdGhlIGltcGxlbWVudGF0aW9uIG1ldGhvZC4KKyAqLworcHVibGljIGVudW0gQXN5bmNSZWNlaXZlck1vZGUKK3sKKwkvKioKKwkgKiBBc3luYyByZWNlaXZlciBtb2RlIGlzIGRpc2FibGVkLiBUaGUgbWVzc2FnZSBydW5zIHN5bmNocm9ub3VzbHkuCisJICovCisJTk9ORSwKKwkKKwkvKioKKwkgKiBBc3luYyByZWNlaXZlciBxdWV1ZWQgbW9kZS4gVGhlIG1lc3NhZ2UgaXMgcXVldWVkIHRvIGEgdGhyZWFkIHBvb2wuCisJICovCisJUVVFVUVELAorCQorCS8qKgorCSAqIEFzeW5jIHJlY2VpdmVyIHF1ZXVlZCBtb2RlLiBUaGUgbWVzc2FnZSBpcyBxdWV1ZWQgdG8gYSB0aHJlYWQgcG9vbC4KKwkgKiBUaGlzIGlzIGFuIGFsaWFzIGZvciBRVUVVRUQuCisJICogQGRlcHJlY2F0ZWQgdXNlIHF1ZXVlZCBpbnN0ZWFkLgorCSAqLworCUBEZXByZWNhdGVkCisJUE9PTCwKKwkKKwkvKioKKwkgKiBBc3luYyByZWNlaXZlciBmcmVlIG1vZGUuIFRIZSBtZXNzYWdlIHJ1bnMgb24gYSBmcmVlIHRocmVhZC4KKwkgKi8KKwlGUkVFCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvQnVpbHRpbi5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0J1aWx0aW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDc4YjAwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0J1aWx0aW4uamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQmFja2VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBBIGJ1aWx0LWluIGRlY2xhcmF0aW9uIGZyb20gdGhlIGJpbmRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBCdWlsdGluIGV4dGVuZHMgUGFyYW1MaXN0PFNlcnZpY2U+Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQnVpbHRpbi4KKwkgKgorCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gYmluZGluZ05hbWUKKwkgKiBAcGFyYW0gYWxsb3dTdWJjbGFzcworCSAqLworCXB1YmxpYyBCdWlsdGluKCBTZXJ2aWNlIGludGYsIE5hbWUgbmFtZSwgU3RyaW5nIGJpbmRpbmdOYW1lLAorCQlib29sZWFuIGFsbG93U3ViY2xhc3MgKQorCXsKKwkJc3VwZXIoIGludGYsIG5hbWUsIG51bGwgKTsKKwkJdGhpcy5iaW5kaW5nTmFtZSA9IGJpbmRpbmdOYW1lOworCQl0aGlzLmFsbG93U3ViY2xhc3MgPSBhbGxvd1N1YmNsYXNzOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBiaW5kaW5nTmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWxsb3dTdWJjbGFzczsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiYnVpbHQtaW4gJXMoICVzICkiLCBuYW1lKCksIGJpbmRpbmdOYW1lICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNlcnZpY2Ugc2VydmljZSgpCisJeworCQlyZXR1cm4gcGFyZW50KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2hlY2soKQorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgYmluZGluZyBuYW1lIG9mIHRoaXMgYnVpbHQtaW4uIEZvciBleGFtcGxlLAorCSAqIE1hcCdzIGJpbmRpbmcgbmFtZSBmb3IgamF2YSBpcyBqYXZhLnV0aWwuTWFwPE9iamVjdCwgT2JqZWN0PgorCSAqLworCXB1YmxpYyBTdHJpbmcgYmluZGluZ05hbWUoKQorCXsKKwkJcmV0dXJuIGJpbmRpbmdOYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIHR5cGUgYWxsb3dzIHN1YmNsYXNzaW5nIG9yIHdoZXRoZXIgdGhlCisJICogY2xhc3NlcyBtdXN0IG1hdGNoIGV4YWN0bHkuCisJICovCisJcHVibGljIGJvb2xlYW4gYWxsb3dTdWJjbGFzcygpCisJeworCQlyZXR1cm4gYWxsb3dTdWJjbGFzczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNidWlsdGluICVzOiAlc1xuIiwgaW5kZW50LCBuYW1lKCksIGJpbmRpbmdOYW1lICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIGJpbmRpbmdOYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRyZWV3YWxrKCBUcmVlV2Fsa2VyIHdhbGtlciApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHZuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBidWlsdGluIGNsYXNzLgorCSAqLworCXB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lKCkKKwl7CisJCXJldHVybiBiaW5kaW5nTmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvQ29uc3RhbnQuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9Db25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTc3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvQ29uc3RhbnQuamF2YQpAQCAtMCwwICsxLDMxMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkJhY2tlbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkV0Y2hHcmFtbWFyQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuVG9rZW47CisKKworLyoqCisgKiBBIG5hbWVkIGNvbnN0YW50IGRlY2xhcmF0aW9uIGZyb20gdGhlIGV0Y2ggaWRsLgorICovCitwdWJsaWMgY2xhc3MgQ29uc3RhbnQgZXh0ZW5kcyBOYW1lZDxTZXJ2aWNlPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIENvbnN0YW50LgorCSAqCisJICogQHBhcmFtIGludGYKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBuT3B0cworCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHVibGljIENvbnN0YW50KCBTZXJ2aWNlIGludGYsIE5hbWUgbmFtZSwgTWFwPFN0cmluZywgT3B0PiBuT3B0cywKKwkJVHlwZVJlZiB0eXBlLCBUb2tlbiB2YWx1ZSApCisJeworCQlzdXBlciggaW50ZiwgbmFtZSwgbk9wdHMgKTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFR5cGVSZWYgdHlwZTsKKwkKKwlwcml2YXRlIGZpbmFsIFRva2VuIHZhbHVlOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBjb25zdGFudC4KKwkgKi8KKwlwdWJsaWMgVHlwZVJlZiB0eXBlKCkKKwl7CisJCXJldHVybiB0eXBlOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnN0YW50LgorCSAqLworCXB1YmxpYyBUb2tlbiB2YWx1ZSgpCisJeworCQlyZXR1cm4gdmFsdWU7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdm5hbWUoIEJhY2tlbmQgaGVscGVyICkKKwl7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGZxbmFtZSgpCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisvLwlAT3ZlcnJpZGUKKy8vCXB1YmxpYyBJbnRlZ2VyIGlkKCkKKy8vCXsKKy8vCQlyZXR1cm4gbnVsbDsKKy8vCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiY29uc3QgJXMgJXMgPSAlcyIsIHR5cGUsIG5hbWUoKS5uYW1lLCB2YWx1ZSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGR1bXAoIFN0cmluZyBpbmRlbnQgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGYoICIlc2NvbnN0ICVzICVzID0gJXNcbiIsIGluZGVudCwgdHlwZSwgbmFtZSgpLm5hbWUsIHZhbHVlICk7CisJCQorCQlTdHJpbmcgc0luZGVudCA9IGluZGVudCsiICAiOworCQkKKwkJZm9yIChTdHJpbmcgczogZGVzY3IoKSkKKwkJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNkZXNjciAlc1xuIiwgc0luZGVudCwgcyApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNoZWNrKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQljaGVja0NvbnN0YW50TmFtZSggbmFtZSgpICk7CisJCQorCQkvLyB0eXBlczogYm9vbGVhbiwgYnl0ZSwgc2hvcnQsIGludCwgbG9uZywgZmxvYXQsIGRvdWJsZSwgc3RyaW5nCisJCS8vIHZhbHVlczogdHJ1ZSwgZmFsc2UsIGludGVnZXIsIG9jdGFsLCBoZXgsIGJpbmFyeSwgZGVjaW1hbCwgc3RyCisJCQorCQlzd2l0Y2ggKHR5cGUudHlwZSgpLmtpbmQpCisJCXsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQk9PTEVBTjoKKwkJCQlpZiAoIWlzQm9vbGVhbiggdmFsdWUgKSkKKwkJCQkJaW5jb21wYXRWYWx1ZUZvclR5cGUoIHR5cGUsIHZhbHVlICk7CisJCQkJYnJlYWs7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEU6CisJCQkJaWYgKCFpc0J5dGUoIHZhbHVlICkpCisJCQkJCWluY29tcGF0VmFsdWVGb3JUeXBlKCB0eXBlLCB2YWx1ZSApOworCQkJCWJyZWFrOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVDoKKwkJCQlpZiAoIWlzU2hvcnQoIHZhbHVlICkpCisJCQkJCWluY29tcGF0VmFsdWVGb3JUeXBlKCB0eXBlLCB2YWx1ZSApOworCQkJCWJyZWFrOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQ6CisJCQkJaWYgKCFpc0ludCggdmFsdWUgKSkKKwkJCQkJaW5jb21wYXRWYWx1ZUZvclR5cGUoIHR5cGUsIHZhbHVlICk7CisJCQkJYnJlYWs7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkxPTkc6CisJCQkJaWYgKCFpc0xvbmcoIHZhbHVlICkpCisJCQkJCWluY29tcGF0VmFsdWVGb3JUeXBlKCB0eXBlLCB2YWx1ZSApOworCQkJCWJyZWFrOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5GTE9BVDoKKwkJCQlpZiAoIWlzRmxvYXQoIHZhbHVlICkpCisJCQkJCWluY29tcGF0VmFsdWVGb3JUeXBlKCB0eXBlLCB2YWx1ZSApOworCQkJCWJyZWFrOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6CisJCQkJaWYgKCFpc0RvdWJsZSggdmFsdWUgKSkKKwkJCQkJaW5jb21wYXRWYWx1ZUZvclR5cGUoIHR5cGUsIHZhbHVlICk7CisJCQkJYnJlYWs7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUklORzoKKwkJCQlpZiAoIWlzU3RyaW5nKCB2YWx1ZSApKQorCQkJCQlpbmNvbXBhdFZhbHVlRm9yVHlwZSggdHlwZSwgdmFsdWUgKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCAidW5rbm93biB0eXBlICIrdHlwZS50eXBlKCkgKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBpbmNvbXBhdFZhbHVlRm9yVHlwZSggVHlwZVJlZiB0LCBUb2tlbiB2ICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkiaW5jb21wYXRpYmxlIHZhbHVlIGZvciB0eXBlICVzIGF0IGxpbmUgJWQ6ICVzIiwKKwkJCXR5cGUudHlwZSgpLCB2YWx1ZS5iZWdpbkxpbmUsIHZhbHVlICkgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNCb29sZWFuKCBUb2tlbiB2ICkKKwl7CisJCWlmICh2LmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuVFJVRSkKKwkJCXJldHVybiB0cnVlOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZBTFNFKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNCeXRlKCBUb2tlbiB2ICkKKwl7CisJCWlmICh2LmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuSU5URUdFUikKKwkJCXJldHVybiBjaGVja0J5dGUoIHYuaW1hZ2UsIDEwICk7CisJCWlmICh2LmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuT0NUQUwpCisJCQlyZXR1cm4gdi5pbWFnZS5zdGFydHNXaXRoKCAiMCIgKSAmJiBjaGVja0J5dGUoIHYuaW1hZ2Uuc3Vic3RyaW5nKCAxICksIDggKTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5IRVgpCisJCQlyZXR1cm4gdi5pbWFnZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICIweCIgKSAmJiBjaGVja0J5dGUoIHYuaW1hZ2Uuc3Vic3RyaW5nKCAyICksIDE2ICk7CisJCWlmICh2LmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuQklOQVJZKQorCQkJcmV0dXJuIHYuaW1hZ2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCAiMGIiICkgJiYgY2hlY2tCeXRlKCB2LmltYWdlLnN1YnN0cmluZyggMiApLCAyICk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tCeXRlKCBTdHJpbmcgcywgaW50IHJhZGl4ICkKKwl7CisJCWlmIChyYWRpeCA9PSAxMCkKKwkJCXJldHVybiBjaGVja051bWJlciggcywgcmFkaXgsIC0xMjgsIDEyNyApOworCQlyZXR1cm4gY2hlY2tOdW1iZXIoIHMsIHJhZGl4LCAwLCAyNTUgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNTaG9ydCggVG9rZW4gdiApCisJeworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVEVHRVIpCisJCQlyZXR1cm4gY2hlY2tTaG9ydCggdi5pbWFnZSwgMTAgKTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5PQ1RBTCkKKwkJCXJldHVybiB2LmltYWdlLnN0YXJ0c1dpdGgoICIwIiApICYmIGNoZWNrU2hvcnQoIHYuaW1hZ2Uuc3Vic3RyaW5nKCAxICksIDggKTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5IRVgpCisJCQlyZXR1cm4gdi5pbWFnZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICIweCIgKSAmJiBjaGVja1Nob3J0KCB2LmltYWdlLnN1YnN0cmluZyggMiApLCAxNiApOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJJTkFSWSkKKwkJCXJldHVybiB2LmltYWdlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCggIjBiIiApICYmIGNoZWNrU2hvcnQoIHYuaW1hZ2Uuc3Vic3RyaW5nKCAyICksIDIgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBjaGVja1Nob3J0KCBTdHJpbmcgcywgaW50IHJhZGl4ICkKKwl7CisJCWlmIChyYWRpeCA9PSAxMCkKKwkJCXJldHVybiBjaGVja051bWJlciggcywgcmFkaXgsIC0zMjc2OCwgMzI3NjcgKTsKKwkJcmV0dXJuIGNoZWNrTnVtYmVyKCBzLCByYWRpeCwgMCwgNjU1MzUgKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNJbnQoIFRva2VuIHYgKQorCXsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlRFR0VSKQorCQkJcmV0dXJuIGNoZWNrSW50KCB2LmltYWdlLCAxMCApOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLk9DVEFMKQorCQkJcmV0dXJuIHYuaW1hZ2Uuc3RhcnRzV2l0aCggIjAiICkgJiYgY2hlY2tJbnQoIHYuaW1hZ2Uuc3Vic3RyaW5nKCAxICksIDggKTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5IRVgpCisJCQlyZXR1cm4gdi5pbWFnZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICIweCIgKSAmJiBjaGVja0ludCggdi5pbWFnZS5zdWJzdHJpbmcoIDIgKSwgMTYgKTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5CSU5BUlkpCisJCQlyZXR1cm4gdi5pbWFnZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICIwYiIgKSAmJiBjaGVja0ludCggdi5pbWFnZS5zdWJzdHJpbmcoIDIgKSwgMiApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrSW50KCBTdHJpbmcgcywgaW50IHJhZGl4ICkKKwl7CisJCWlmIChyYWRpeCA9PSAxMCkKKwkJCXJldHVybiBjaGVja051bWJlciggcywgcmFkaXgsIC0yMTQ3NDgzNjQ4LCAyMTQ3NDgzNjQ3ICk7CisJCXJldHVybiBjaGVja051bWJlciggcywgcmFkaXgsIDAsIDQyOTQ5NjcyOTVMICk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzTG9uZyggVG9rZW4gdiApCisJeworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVEVHRVIpCisJCQlyZXR1cm4gY2hlY2tMb25nKCB2LmltYWdlLCAxMCApOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLk9DVEFMKQorCQkJcmV0dXJuIHYuaW1hZ2Uuc3RhcnRzV2l0aCggIjAiICkgJiYgY2hlY2tMb25nKCB2LmltYWdlLnN1YnN0cmluZyggMSApLCA4ICk7CisJCWlmICh2LmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuSEVYKQorCQkJcmV0dXJuIHYuaW1hZ2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCAiMHgiICkgJiYgY2hlY2tMb25nKCB2LmltYWdlLnN1YnN0cmluZyggMiApLCAxNiApOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJJTkFSWSkKKwkJCXJldHVybiB2LmltYWdlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCggIjBiIiApICYmIGNoZWNrTG9uZyggdi5pbWFnZS5zdWJzdHJpbmcoIDIgKSwgMiApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrTG9uZyggU3RyaW5nIHMsIGludCByYWRpeCApCisJeworCQlpZiAocmFkaXggPT0gMTApCisJCQlyZXR1cm4gY2hlY2tOdW1iZXIoIHMsIHJhZGl4LCAtOTIyMzM3MjAzNjg1NDc3NTgwOEwsIDkyMjMzNzIwMzY4NTQ3NzU4MDdMICk7CisJCXJldHVybiBjaGVja051bWJlciggcywgcmFkaXgsIDAsIC0xTCApOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBjaGVja051bWJlciggU3RyaW5nIHMsIGludCByYWRpeCwgbG9uZyBtaW4sIGxvbmcgbWF4ICkKKwl7CisJCS8vIFRPRE8gdGhpcyBuZWVkcyB0byB3b3JrIGJldHRlciBmb3Igbm9uLWRlY2ltYWwgcmFkaXgKKwkJdHJ5CisJCXsKKwkJCWxvbmcgbCA9IExvbmcucGFyc2VMb25nKCBzLCByYWRpeCApOworCQkJcmV0dXJuIGwgPj0gbWluICYmIGwgPD0gbWF4OworCQl9CisJCWNhdGNoICggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNGbG9hdCggVG9rZW4gdiApCisJeworCQkvLyBUT0RPIGltcGxlbWVudCBzb21lIHNvcnQgb2YgZmxvYXQgdmFsdWUgY2hlY2tpbmcuLi4KKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlRFR0VSKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICh2LmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuT0NUQUwpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5IRVgpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5CSU5BUlkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5ERUNJTUFMKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNEb3VibGUoIFRva2VuIHYgKQorCXsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgc29tZSBzb3J0IG9mIGRvdWJsZSB2YWx1ZSBjaGVja2luZy4uLgorCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVEVHRVIpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKHYua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5PQ1RBTCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkhFWCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJJTkFSWSkKKwkJCXJldHVybiB0cnVlOworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkRFQ0lNQUwpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1N0cmluZyggVG9rZW4gdiApCisJeworCQlpZiAodi5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUikKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdHJlZXdhbGsoIFRyZWVXYWxrZXIgd2Fsa2VyICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQl3YWxrZXIucHJlQ29uc3RhbnQoIHRoaXMgKTsKKwkJCisJCXR5cGUudHJlZXdhbGsoIHdhbGtlciApOworCQkKKwkJd2Fsa2VyLnBvc3RDb25zdGFudCggdGhpcyApOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9FbnVteC5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0VudW14LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4ZWZkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9FbnVteC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkJhY2tlbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlBhcnNlRXhjZXB0aW9uOworCisKKy8qKgorICogQW4gZW51bWVyYXRpb24gKG5hbWVkIHNldCBvZiBuYW1lZCBjb25zdGFudHMpIGRlY2xhcmF0aW9uIGZyb20gdGhlIGV0Y2ggaWRsLgorICovCitwdWJsaWMgY2xhc3MgRW51bXggZXh0ZW5kcyBOYW1lZDxTZXJ2aWNlPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEl0ZW0+Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgRW51bXguCisJICoKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG5PcHRzCisJICovCisJcHVibGljIEVudW14KCBTZXJ2aWNlIGludGYsIE5hbWUgbmFtZSwgTWFwPFN0cmluZywgT3B0PiBuT3B0cyApCisJeworCQlzdXBlciggaW50ZiwgbmFtZSwgbk9wdHMgKTsKKwkJCisJCW1vZHVsZU5hbWUgPSBpbnRmLnBhcmVudCgpLm5hbWUoKS5uYW1lOworCQlzZXJ2aWNlTmFtZSA9IGludGYubmFtZSgpLm5hbWU7CisJCWVudW1OYW1lID0gbmFtZS5uYW1lOworCisJCWZxbmFtZSA9IG1vZHVsZU5hbWUrJy4nK3NlcnZpY2VOYW1lKycuJytlbnVtTmFtZTsKKwkJdm5hbWUgPSBmcW5hbWUucmVwbGFjZSggJy4nLCAnXycgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbW9kdWxlTmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBlbnVtTmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB2bmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBmcW5hbWU7CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB2bmFtZSggQmFja2VuZCBoZWxwZXIgKQorCXsKKwkJcmV0dXJuIGhlbHBlci5tdHZuYW1lKCB2bmFtZSApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGZxbmFtZSgpCisJeworCQlyZXR1cm4gZnFuYW1lOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGVmcW5hbWUoIEJhY2tlbmQgaGVscGVyICkKKwl7CisJCXJldHVybiBoZWxwZXIuZW51bV9lZnFuYW1lKCBmcW5hbWUsIG1vZHVsZU5hbWUsIHNlcnZpY2VOYW1lLCBlbnVtTmFtZSApOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBpdGVtIHRvIHRoZSBlbnVtZXJhdGlvbi4KKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIGl0ZW0gYWRkZWQuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBJdGVtIGFkZEl0ZW0oIE5hbWUgbmFtZSApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJbGlzdC5jaGVjayggbmFtZSApOworCQlJdGVtIGkgPSBuZXcgSXRlbSggdGhpcywgbmFtZSApOworCQlsaXN0LmFkZCggaS5uYW1lKCksIGkgKTsKKwkJcmV0dXJuIGk7CisJfQorCQorCXByaXZhdGUgZmluYWwgTmFtZUxpc3Q8SXRlbT4gbGlzdCA9IG5ldyBOYW1lTGlzdDxJdGVtPigpOworCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggImVudW0gJXMgJXMiLCBuYW1lKCksIGxpc3QgKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZHVtcCggU3RyaW5nIGluZGVudCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzZW51bSAlc1xuIiwgaW5kZW50LCBuYW1lKCkgKTsKKwkJCisJCVN0cmluZyBzSW5kZW50ID0gaW5kZW50KyIgICI7CisJCQorCQlmb3IgKFN0cmluZyBzOiBkZXNjcigpKQorCQkJU3lzdGVtLm91dC5wcmludGYoICIlc2Rlc2NyICVzXG4iLCBzSW5kZW50LCBzICk7CisJCQorCQlmb3IgKEl0ZW0gaTogbGlzdCkKKwkJCWkuZHVtcCggc0luZGVudCApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNoZWNrKCkKKwl7CisJCWNoZWNrVHlwZU5hbWUoIG5hbWUoKSApOworCQkKKwkJZm9yIChJdGVtIGk6IGxpc3QpCisJCQlpLmNoZWNrKCk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPEl0ZW0+IGl0ZXJhdG9yKCkKKwl7CisJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBlbnVtIGl0ZW0uCisJICovCisJcHVibGljIEl0ZW0gZ2V0SXRlbSggU3RyaW5nIG5hbWUgKQorCXsKKwkJcmV0dXJuIGxpc3QuZ2V0KCBuYW1lICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdHJlZXdhbGsoIFRyZWVXYWxrZXIgd2Fsa2VyICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQl3YWxrZXIucHJlRW51bSggdGhpcyApOworCQkKKwkJZm9yIChJdGVtIGk6IHRoaXMpCisJCQlpLnRyZWV3YWxrKCB3YWxrZXIgKTsKKwkJCisJCXdhbGtlci5wb3N0RW51bSggdGhpcyApOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9FeGNlcHQuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9FeGNlcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjlhOTM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0V4Y2VwdC5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LlVuY2hlY2tlZDsKKworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbiBmcm9tIHRoZSBldGNoIGlkbC4KKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdCBleHRlbmRzIFBhcmFtTGlzdDxTZXJ2aWNlPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEV4Y2VwdC4KKwkgKgorCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gb3B0cworCSAqLworCXB1YmxpYyBFeGNlcHQoIFNlcnZpY2UgaW50ZiwgTmFtZSBuYW1lLCBNYXA8U3RyaW5nLCBPcHQ+IG9wdHMgKQorCXsKKwkJc3VwZXIoIGludGYsIG5hbWUsIG9wdHMgKTsKKwkJCisJCW1vZHVsZU5hbWUgPSBpbnRmLnBhcmVudCgpLm5hbWUoKS5uYW1lOworCQlzZXJ2aWNlTmFtZSA9IGludGYubmFtZSgpLm5hbWU7CisJCWV4Y2VwdE5hbWUgPSBuYW1lLm5hbWU7CisKKwkJZnFuYW1lID0gbW9kdWxlTmFtZSsnLicrc2VydmljZU5hbWUrJy4nK2V4Y2VwdE5hbWU7CisJCXZuYW1lID0gZnFuYW1lLnJlcGxhY2UoICcuJywgJ18nICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWU7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWU7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhjZXB0TmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB2bmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBmcW5hbWU7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHZuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gaGVscGVyLm10dm5hbWUoIHZuYW1lICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIGZxbmFtZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBlZnFuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gaGVscGVyLmVudW1fZWZxbmFtZSggZnFuYW1lLCBtb2R1bGVOYW1lLCBzZXJ2aWNlTmFtZSwgZXhjZXB0TmFtZSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJleGNlcHQgJXMgKCVzKSIsIG5hbWUoKSwgZ2V0UGFyYW1ldGVycygpICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZHVtcCggU3RyaW5nIGluZGVudCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzZXhjZXB0aW9uICVzXG4iLCBpbmRlbnQsIG5hbWUoKSApOworCQkKKwkJU3RyaW5nIHNJbmRlbnQgPSBpbmRlbnQrIiAgIjsKKwkJCisJCWZvciAoU3RyaW5nIHM6IGRlc2NyKCkpCisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzZGVzY3IgJXNcbiIsIHNJbmRlbnQsIHMgKTsKKwkJCisJCWZvciAoUGFyYW1ldGVyIHA6IHRoaXMpCisJCQlwLmR1bXAoIHNJbmRlbnQgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjaGVjaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJY2hlY2tUeXBlTmFtZSggbmFtZSgpICk7CisJCQorCQlmb3IgKFBhcmFtZXRlciBwOiB0aGlzKQorCQkJcC5jaGVjaygpOworCQkKKwkJaWYgKGhhc0V4dGVuZHMoKSkKKwkJeworCQkJTmFtZWQ8Pz4gbiA9IHBhcmVudCgpLmdldCggeHRuZHMubmFtZSApOworCisJCQlpZiAobiA9PSBudWxsKQorCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJImV4Y2VwdGlvbiAlcyBleHRlbmRzICVzIG5vdCBkZWZpbmVkIGF0IGxpbmUgJWQiLAorCQkJCQluYW1lKCksIHh0bmRzLm5hbWUoKSwgeHRuZHMudG9rZW4uYmVnaW5MaW5lICkgKTsKKwkJCQorCQkJaWYgKCEobiBpbnN0YW5jZW9mIEV4Y2VwdCkpCisJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkiZXhjZXB0aW9uICVzIGV4dGVuZHMgJXMgbm90IGFuIGV4Y2VwdGlvbiBhdCBsaW5lICVkIiwKKwkJCQkJbmFtZSgpLCB4dG5kcy5uYW1lKCksIHh0bmRzLnRva2VuLmJlZ2luTGluZSApICk7CisJCQkKKwkJCUV4Y2VwdCBzID0gdGhpczsKKwkJCXdoaWxlIChzICE9IG51bGwgJiYgcy5oYXNFeHRlbmRzKCkpCisJCQl7CisJCQkJcyA9IHMuZ2V0RXh0ZW5kcygpOworCQkJCWlmIChzID09IHRoaXMpCisJCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJleGNlcHRpb24gJXMgZXh0ZW5kcyAlcyBjcmVhdGVzIGxvb3AgYXQgbGluZSAlZCIsCisJCQkJCQluYW1lKCksIHh0bmRzLm5hbWUoKSwgeHRuZHMudG9rZW4uYmVnaW5MaW5lICkgKTsKKwkJCX0KKwkJCQorCQkJcyA9IGdldEV4dGVuZHMoKTsKKwkJCWZvciAoUGFyYW1ldGVyIHA6IHRoaXMpCisJCQl7CisJCQkJUGFyYW1ldGVyIHggPSBzLmdldFBhcmFtZXRlciggcC5uYW1lKCkubmFtZSApOworCQkJCWlmICh4ICE9IG51bGwpCisJCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJleGNlcHRpb24gJXMgZXh0ZW5kcyAlcyBoaWRlcyBwYXJhbWV0ZXIgJXMgZnJvbSAlcyBhdCBsaW5lICVkIiwKKwkJCQkJCW5hbWUoKSwgeHRuZHMubmFtZSgpLCB4Lm5hbWUoKSwgeC5wYXJlbnQoKS5uYW1lKCksCisJCQkJCQl4dG5kcy50b2tlbi5iZWdpbkxpbmUgKSApOworCQkJfQorCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKCBTdHJpbmcgbiApCisJeworCQlQYXJhbWV0ZXIgcCA9IHN1cGVyLmdldFBhcmFtZXRlciggbiApOworCQlpZiAocCA9PSBudWxsICYmIGhhc0V4dGVuZHMoKSkKKwkJCXAgPSBnZXRFeHRlbmRzKCkuZ2V0UGFyYW1ldGVyKCBuICk7CisJCXJldHVybiBwOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBwYXJhbWV0ZXJzIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVyY2xhc3Nlcy4KKwkgKiBUaGV5IGFyZSByZXR1cm5lZCBpbiBkZWNsYXJhdGlvbiBvcmRlciwgc3RhcnRpbmcgd2l0aCB0aG9zZSBmcm9tIHRoZQorCSAqIGJhc2UgY2xhc3MuCisJICovCisJcHVibGljIExpc3Q8UGFyYW1ldGVyPiBnZXRBbGxQYXJhbWV0ZXJzKCkKKwl7CisJCWlmIChoYXNFeHRlbmRzKCkpCisJCXsKKwkJCUxpc3Q8UGFyYW1ldGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7CisJCQlsaXN0LmFkZEFsbCggZ2V0RXh0ZW5kcygpLmdldEFsbFBhcmFtZXRlcnMoKSApOworCQkJbGlzdC5hZGRBbGwoIGdldFBhcmFtZXRlcnMoKSApOworCQkJcmV0dXJuIGxpc3Q7CisJCX0KKwkJcmV0dXJuIGdldFBhcmFtZXRlcnMoKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGFueSBwYXJhbWV0ZXJzIGFyZSBkZWNsYXJlZCBpbiB0aGlzIG9yIGEgc3VwZXIuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQW55UGFyYW1ldGVycygpCisJeworCQlyZXR1cm4gaGFzUGFyYW1ldGVycygpIHx8CisJCQloYXNFeHRlbmRzKCkgJiYgZ2V0RXh0ZW5kcygpLmhhc0FueVBhcmFtZXRlcnMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2VydmljZSBzZXJ2aWNlKCkKKwl7CisJCXJldHVybiBwYXJlbnQoKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5jaGVja2VkKCkKKwl7CisJCVVuY2hlY2tlZCB1ID0gKFVuY2hlY2tlZCkgZ2V0T3B0KCAiVW5jaGVja2VkIiApOworCQlyZXR1cm4gdSAhPSBudWxsICYmIHUuaXNVbmNoZWNrZWQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0cmVld2FsayggVHJlZVdhbGtlciB3YWxrZXIgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCXdhbGtlci5wcmVFeGNlcHQoIHRoaXMgKTsKKwkJCisJCWZvciAoUGFyYW1ldGVyIHA6IHRoaXMpCisJCQlwLnRyZWV3YWxrKCB3YWxrZXIgKTsKKwkJCisJCWlmIChoYXNFeHRlbmRzKCkpCisJCQlnZXRFeHRlbmRzKCkudHJlZXdhbGsoIHdhbGtlciApOworCQkKKwkJd2Fsa2VyLnBvc3RFeGNlcHQoIHRoaXMgKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgZXhjZXB0aW9uIGV4dGVuZHMgYW5vdGhlci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbmRzKCkKKwl7CisJCXJldHVybiB4dG5kcyAhPSBudWxsOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gdGhhdCB0aGlzIG9uZSBleHRlbmRzIG9yIG51bGwuCisJICovCisJcHVibGljIEV4Y2VwdCBnZXRFeHRlbmRzKCkKKwl7CisJCWlmICh4dG5kcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlyZXR1cm4gKEV4Y2VwdCkgcGFyZW50KCkuZ2V0KCB4dG5kcy5uYW1lICk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZXh0ZW5kcyBhdHRyaWJ1dGUgb2YgdGhpcyBleGNlcHRpb24uCisJICogQHBhcmFtIHh0bmRzCisJICovCisJcHVibGljIHZvaWQgc2V0RXh0ZW5kcyggTmFtZSB4dG5kcyApCisJeworCQl0aGlzLnh0bmRzID0geHRuZHM7CisJfQorCQorCXByaXZhdGUgTmFtZSB4dG5kczsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9FeHRlcm4uamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9FeHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWUxOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0V4dGVybi5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQmFja2VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBBbiBleHRlcm4gZGVjbGFyYXRpb24gZnJvbSB0aGUgZXRjaCBpZGwuCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm4gZXh0ZW5kcyBQYXJhbUxpc3Q8U2VydmljZT4KK3sKKwkvKioKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG9wdHMKKwkgKi8KKwlwdWJsaWMgRXh0ZXJuKCBTZXJ2aWNlIGludGYsIE5hbWUgbmFtZSwgTWFwPFN0cmluZywgT3B0PiBvcHRzICkKKwl7CisJCXN1cGVyKCBpbnRmLCBuYW1lLCBvcHRzICk7CisKKwkJdm5hbWUgPSBpbnRmLnBhcmVudCgpLm5hbWUoKS5uYW1lLnJlcGxhY2UoICcuJywgJ18nICkrJ18nK2ludGYubmFtZSgpKydfJytuYW1lOworCQlmcW5hbWUgPSBpbnRmLnBhcmVudCgpLm5hbWUoKS5uYW1lKycuJytpbnRmLm5hbWUoKS5uYW1lKycuJytuYW1lLm5hbWU7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIHZuYW1lOworCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGZxbmFtZTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTZXJ2aWNlIHNlcnZpY2UoKQorCXsKKwkJcmV0dXJuIHBhcmVudCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNoZWNrKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQljaGVja1R5cGVOYW1lKCBuYW1lKCkgKTsKKwkJCisJCS8vIG5vdGhpbmcgdG8gZG8KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNleHRlcm4gJXNcbiIsIGluZGVudCwgbmFtZSgpICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIGZxbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGVmcW5hbWUoIEJhY2tlbmQgaGVscGVyICkKKwl7CisJCVN0cmluZyBsYW5nID0gaGVscGVyLmdldExhbmcoKTsKKwkJb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdC5FeHRlcm4gb3B0ID0gKG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRXh0ZXJuKSBnZXRPcHQoICJFeHRlcm4uIitsYW5nICk7CisJCWlmIChvcHQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gb3B0LnhuYW1lLmltYWdlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdm5hbWUoIEJhY2tlbmQgaGVscGVyICkKKwl7CisJCXJldHVybiBoZWxwZXIubXR2bmFtZSggdm5hbWUgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGhlbHBlcgorCSAqIEByZXR1cm4gdGhlIGV4dGVybidzIHNlcmlhbGl6ZXIncyBuYW1lLgorCSAqLworCXB1YmxpYyBTdHJpbmcgc25hbWUoIEJhY2tlbmQgaGVscGVyICkKKwl7CisJCVN0cmluZyBsYW5nID0gaGVscGVyLmdldExhbmcoKTsKKwkJb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdC5FeHRlcm4gb3B0ID0gKG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRXh0ZXJuKSBnZXRPcHQoICJFeHRlcm4uIitsYW5nICk7CisJCWlmIChvcHQgPT0gbnVsbCkKKwkJCS8vIFRPRE8gbmVlZCB0byB0aHJvdyB0aGUgcmlnaHQgdGhpbmcuLi4KKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkibm8gZXh0ZXJuIHR5cGUgZGVmaW5lZCBmb3IgYmluZGluZyAlczogJXMgYXQgbGluZSAlZCIsCisJCQkJbGFuZywgbmFtZSgpLm5hbWUsIG5hbWUoKS50b2tlbi5iZWdpbkxpbmUgKSApOworCQlyZXR1cm4gb3B0LnNlcmlhbGl6ZXIuaW1hZ2U7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBoZWxwZXIKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV4dGVybiBuZWVkcyBhbiBpbXBvcnQuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzSW1wb3J0KCBCYWNrZW5kIGhlbHBlciApCisJeworCQlTdHJpbmcgbGFuZyA9IGhlbHBlci5nZXRMYW5nKCk7CisJCW9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRXh0ZXJuIG9wdCA9IChvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LkV4dGVybikgZ2V0T3B0KCAiRXh0ZXJuLiIrbGFuZyApOworCQlpZiAob3B0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBvcHQueG5hbWVJbXBvcnQuaW1hZ2UubGVuZ3RoKCkgPiAwOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gaGVscGVyCisJICogQHJldHVybiB0aGUgZXh0ZXJuJ3MgaW1wb3J0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0KCBCYWNrZW5kIGhlbHBlciApCisJeworCQlTdHJpbmcgbGFuZyA9IGhlbHBlci5nZXRMYW5nKCk7CisJCW9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRXh0ZXJuIG9wdCA9IChvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LkV4dGVybikgZ2V0T3B0KCAiRXh0ZXJuLiIrbGFuZyApOworCQlpZiAob3B0ID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIG9wdC54bmFtZUltcG9ydC5pbWFnZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaGVscGVyCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBleHRlcm4ncyBzZXJpYWxpemVyIG5lZWRzIGFuIGltcG9ydC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNTZXJpYWxpemVySW1wb3J0KCBCYWNrZW5kIGhlbHBlciApCisJeworCQlTdHJpbmcgbGFuZyA9IGhlbHBlci5nZXRMYW5nKCk7CisJCW9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRXh0ZXJuIG9wdCA9IChvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LkV4dGVybikgZ2V0T3B0KCAiRXh0ZXJuLiIrbGFuZyApOworCQlpZiAob3B0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBvcHQuc2VyaWFsaXplckltcG9ydC5pbWFnZS5sZW5ndGgoKSA+IDA7CisJfQorCisJLyoqCisJICogQHBhcmFtIGhlbHBlcgorCSAqIEByZXR1cm4gdGhlIGV4dGVybidzIHNlcmlhbGl6ZXIncyBpbXBvcnQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRTZXJpYWxpemVySW1wb3J0KCBCYWNrZW5kIGhlbHBlciApCisJeworCQlTdHJpbmcgbGFuZyA9IGhlbHBlci5nZXRMYW5nKCk7CisJCW9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRXh0ZXJuIG9wdCA9IChvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LkV4dGVybikgZ2V0T3B0KCAiRXh0ZXJuLiIrbGFuZyApOworCQlpZiAob3B0ID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIG9wdC5zZXJpYWxpemVySW1wb3J0LmltYWdlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRyZWV3YWxrKCBUcmVlV2Fsa2VyIHdhbGtlciApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJd2Fsa2VyLmRvRXh0ZXJuKCB0aGlzICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L0l0ZW0uamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9JdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjMjFiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9JdGVtLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQmFja2VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBBbiBlbnVtZXJhdGlvbiBpdGVtIGRlY2xhcmF0aW9uIGZyb20gdGhlIGV0Y2ggaWRsLgorICovCitwdWJsaWMgY2xhc3MgSXRlbSBleHRlbmRzIE5hbWVkPEVudW14PgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEl0ZW0uCisJICoKKwkgKiBAcGFyYW0gZW51bXgKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXB1YmxpYyBJdGVtKCBFbnVteCBlbnVteCwgTmFtZSBuYW1lICkKKwl7CisJCXN1cGVyKCBlbnVteCwgbmFtZSwgbnVsbCApOworCQkKKwkJdm5hbWUgPSBuYW1lLm5hbWU7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIHZuYW1lOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdm5hbWUoIEJhY2tlbmQgaGVscGVyICkKKwl7CisJCXJldHVybiBoZWxwZXIubWZ2bmFtZSggdm5hbWUgKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIG5hbWUoKS50b1N0cmluZygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGR1bXAoIFN0cmluZyBpbmRlbnQgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGYoICIlc2l0ZW0gJXNcbiIsIGluZGVudCwgbmFtZSgpLm5hbWUgKTsKKwkJCisJCVN0cmluZyBzSW5kZW50ID0gaW5kZW50KyIgICI7CisJCQorCQlmb3IgKFN0cmluZyBzOiBkZXNjcigpKQorCQkJU3lzdGVtLm91dC5wcmludGYoICIlc2Rlc2NyICVzXG4iLCBzSW5kZW50LCBzICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2hlY2soKQorCXsKKwkJY2hlY2tDb25zdGFudE5hbWUoIG5hbWUoKSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRyZWV3YWxrKCBUcmVlV2Fsa2VyIHdhbGtlciApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJd2Fsa2VyLmRvSXRlbSggdGhpcyApOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9NZXNzYWdlLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWM4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNDcxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoR3JhbW1hckNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdC5Bc3luY1JlY2VpdmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuQXV0aG9yaXplOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuRGlyZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuT25ld2F5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQuVGltZW91dDsKKworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIE1lc3NhZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlIGV4dGVuZHMgUGFyYW1MaXN0PFNlcnZpY2U+Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgTWVzc2FnZS4KKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG5PcHRzCisJICogQHBhcmFtIHR5cGUKKwkgKi8KKwlwdWJsaWMgTWVzc2FnZSggU2VydmljZSBpbnRmLCBOYW1lIG5hbWUsIE1hcDxTdHJpbmcsIE9wdD4gbk9wdHMsIFR5cGVSZWYgdHlwZSApCisJeworCQlzdXBlciggaW50ZiwgbmFtZSwgbk9wdHMgKTsKKworCQltZCA9IGdldE1lc3NhZ2VEaXJlY3Rpb24oKTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwcml2YXRlIE1lc3NhZ2VEaXJlY3Rpb24gbWQ7CisKKwlwcml2YXRlIGZpbmFsIFR5cGVSZWYgdHlwZTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdWZmaXggb2YgdGhpcyBtZXNzYWdlJ3MgaW50ZXJmYWNlIGdpdmVuIHRoZSBkaXJlY3Rpb24uCisJICovCisJcHVibGljIFN0cmluZyBzdWZmaXgoKQorCXsKKwkJcmV0dXJuIE1zZ0RpckhlbHBlci5nZXRTdWZmaXgoIG1kICk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHZuYW1lIG9mIHRoaXMgbWVzc2FnZSAodGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdpdGggIl8iIGluc3RlYWQgb2YgIi4iKS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG1rVm5hbWUoKQorCXsKKwkJU2VydmljZSBpbnRmID0gcGFyZW50KCk7CisJCU5hbWUgbmFtZSA9IG5hbWUoKTsKKwkJcmV0dXJuIGludGYucGFyZW50KCkubmFtZSgpLm5hbWUucmVwbGFjZSggJy4nLCAnXycgKSsnXycraW50Zi5uYW1lKCkrJ18nK25hbWUubmFtZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgbWtGcU5hbWUoKQorCXsKKwkJU2VydmljZSBpbnRmID0gcGFyZW50KCk7CisJCU5hbWUgbmFtZSA9IG5hbWUoKTsKKwkJcmV0dXJuIGludGYucGFyZW50KCkubmFtZSgpLm5hbWUrJy4nK2ludGYubmFtZSgpLm5hbWUrJy4nK25hbWUubmFtZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkaXJlY3Rpb24gb2YgdGhpcyBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBNZXNzYWdlRGlyZWN0aW9uIG1zZ0RpcigpCisJeworCQlyZXR1cm4gbWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbWVzc2FnZSBkaXJlY3Rpb24gb2YgdGhpcyBtZXNzYWdlLgorCSAqIEBwYXJhbSBtZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1zZ0RpciggTWVzc2FnZURpcmVjdGlvbiBtZCApCisJeworCQl0aGlzLm1kID0gbWQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIG90aGVyCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWVzc2FnZSdzIGRpcmVjdGlvbiBlcXVhbHMgb3RoZXIuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNc2dEaXIoIE1lc3NhZ2VEaXJlY3Rpb24gb3RoZXIgKQorCXsKKwkJcmV0dXJuIG1kID09IG90aGVyOworCX0KKworCS8qKgorCSAqCisJICogQHJldHVybiB0cnVzIGlmIHRoaXMgbWVzc2FnZSdzIGRpcmVjdGlvbiBpcyBib3RoCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNc2dEaXJCb3RoKCkKKwl7CisJCXJldHVybiBtZCA9PSBNZXNzYWdlRGlyZWN0aW9uLkJPVEg7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbWVzc2FnZSBkaXJlY3Rpb24gcGVyIHRoZSBEaXJlY3Rpb24gb3B0LgorCSAqLworCXB1YmxpYyBNZXNzYWdlRGlyZWN0aW9uIGdldE1lc3NhZ2VEaXJlY3Rpb24oKQorCXsKKwkJT3B0IG8gPSBnZXRPcHQoICJEaXJlY3Rpb24iICk7CisKKwkJaWYgKG8gPT0gbnVsbCkKKwkJCXJldHVybiBNZXNzYWdlRGlyZWN0aW9uLlNFUlZFUjsKKworCQlEaXJlY3Rpb24gZCA9IChEaXJlY3Rpb24pIG87CisJCXJldHVybiBkLmdldE1lc3NhZ2VEaXJlY3Rpb24oKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIHRpbWVvdXQgcGVyIHRoZSBUaW1lb3V0IG9wdC4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFRpbWVvdXQoKQorCXsKKwkJT3B0IG8gPSBnZXRPcHQoICJUaW1lb3V0IiApOworCisJCWlmIChvID09IG51bGwpCisJCQlyZXR1cm4gMDsKKworCQlUaW1lb3V0IHQgPSAoVGltZW91dCkgbzsKKwkJcmV0dXJuIHQudGltZW91dCgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBUeXBlUmVmIHR5cGUoKQorCXsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB2bmFtZSggQmFja2VuZCBoZWxwZXIgKQorCXsKKwkJcmV0dXJuIGhlbHBlci5tdHZuYW1lKCBta1ZuYW1lKCkgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIG1lc3NhZ2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIG1rRnFOYW1lKCk7CisJfQorCisvLwkvKioKKy8vCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoaXMgbWVzc2FnZS4KKy8vCSAqLworLy8JQE92ZXJyaWRlCisvLwlwdWJsaWMgSW50ZWdlciBpZCgpCisvLwl7CisvLwkJcmV0dXJuIG1rSWQoKTsKKy8vCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJtZXNzYWdlICVzICVzICVzICglcykgdGhyb3dzICVzIiwgbWQsIHR5cGUsIG5hbWUoKSwgZ2V0UGFyYW1ldGVycygpLCB0aHJvd24gKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGRlc2NyaXB0aW9uLgorCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gcmV0dXJuRGVzY3IoKQorCXsKKwkJcmV0dXJuIHJldHVybkRlc2NyOworCX0KKworCS8qKgorCSAqIEBwYXJhbSByZXR1cm5EZXNjcgorCSAqLworCXB1YmxpYyB2b2lkIHNldFJldHVybkRlc2NyKCBMaXN0PFN0cmluZz4gcmV0dXJuRGVzY3IgKQorCXsKKwkJdGhpcy5yZXR1cm5EZXNjciA9IHJldHVybkRlc2NyOworCX0KKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHJldHVybkRlc2NyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIHVzZWQgdG8gcmV0dXJuIGEgcmVzdWx0IGZyb20gYSBjYWxsLgorCSAqLworCXB1YmxpYyBNZXNzYWdlIGdldFJlc3VsdE1lc3NhZ2UoKQorCXsKKwkJcmV0dXJuIHJlc3VsdE1lc3NhZ2U7CisJfQorCisJLyoqCisJICogQHBhcmFtIHJlc3VsdE1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRNZXNzYWdlKCBNZXNzYWdlIHJlc3VsdE1lc3NhZ2UgKQorCXsKKwkJdGhpcy5yZXN1bHRNZXNzYWdlID0gcmVzdWx0TWVzc2FnZTsKKwl9CisKKwlwcml2YXRlIE1lc3NhZ2UgcmVzdWx0TWVzc2FnZTsKKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgbWVzc2FnZSB3aGljaCBjb250cmlidXRlcyB0byB0aGUKKwkgKiB0eXBlcyBhbmQgZmllbGRzIGJ1dCBzaG91bGQgbm90IGFwcGVhciBpbiB0aGUgaW50ZXJmYWNlCisJICogKGJlY2F1c2UgaXQgaXMgYSByZXNwb25zZSBtZXNzYWdlKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkKKwl7CisJCXJldHVybiBuYW1lKCkubmFtZS5zdGFydHNXaXRoKCBSRVNVTFRfTUVTU0FHRV9OQU1FX1BSRUZJWCApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGV4cGVjdGVkIG5hbWUgb2YgYSByZXN1bHQgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgTmFtZSBnZXRSZXN1bHRNZXNzYWdlTmFtZSgpCisJeworCQlyZXR1cm4gbmV3IE5hbWUoIG51bGwsIFJFU1VMVF9NRVNTQUdFX05BTUVfUFJFRklYK25hbWUoKS5uYW1lICk7CisJfQorCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBvZiBhIHJlc3VsdCBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9QQVJBTV9OQU1FID0gInJlc3VsdCI7CisKKwkvKioKKwkgKiBUaGUgcHJlZml4IHRvIGFwcGx5IHRvIHRoZSBuYW1lIG9mIGEgcmVzdWx0IG1lc3NhZ2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX01FU1NBR0VfTkFNRV9QUkVGSVggPSAiX3Jlc3VsdF8iOworCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0IHBhcmFtZXRlci4KKwkgKi8KKwlwdWJsaWMgTmFtZSBnZXRSZXN1bHRQYXJhbU5hbWUoKQorCXsKKwkJcmV0dXJuIG5ldyBOYW1lKCBudWxsLCBSRVNVTFRfUEFSQU1fTkFNRSApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBwYXJhbWV0ZXIuCisJICovCisJcHVibGljIFBhcmFtZXRlciBnZXRSZXN1bHRQYXJhbSgpCisJeworCQlyZXR1cm4gZ2V0UGFyYW1ldGVyKCBSRVNVTFRfUEFSQU1fTkFNRSApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY2FsbCAoaS5lLiwgcmV0dXJucyBhIHZhbHVlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1JldHVybigpCisJeworCQlyZXR1cm4gdHlwZS50eXBlKCkua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5WT0lEOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGR1bXAoIFN0cmluZyBpbmRlbnQgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGYoICIlc21ldGhvZCAlcyAlcyAlc1xuIiwgaW5kZW50LCBtZCwgdHlwZSwgbmFtZSgpLm5hbWUgKTsKKworCQlTdHJpbmcgc0luZGVudCA9IGluZGVudCsiICAiOworCisJCWZvciAoU3RyaW5nIHM6IGRlc2NyKCkpCisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzZGVzY3IgJXNcbiIsIHNJbmRlbnQsIHMgKTsKKworCQlmb3IgKE9wdCBvOiBvcHRzKCkpCisJCQlvLmR1bXAoIHNJbmRlbnQgKTsKKworCQlmb3IgKFBhcmFtZXRlciBwOiB0aGlzKQorCQkJcC5kdW1wKCBzSW5kZW50ICk7CisKKwkJaWYgKGhhc1JldHVybigpKQorCQkJU3lzdGVtLm91dC5wcmludGYoICIlc3JldHVybkRlc2NyICVzXG4iLCBzSW5kZW50LCByZXR1cm5EZXNjciApOworCisJCWZvciAoVGhyb3duIG46IHRocm93bikKKwkJCW4uZHVtcCggc0luZGVudCApOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBuYW1lIHRvIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoaXMgbWVzc2FnZS4KKwkgKiBAcGFyYW0gbgorCSAqIEByZXR1cm4gdGhlIHJlcHJlc2VudGF0aW9uIG9iamVjdCBmb3IgYSB0aHJvd24gZXhjZXB0aW9uLgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgVGhyb3duIGFkZFRocm93biggTmFtZSBuICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlpZiAoaXNPbmV3YXkoKSkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiT25ld2F5IG1lc3NhZ2UgY2Fubm90IHRocm93IGV4Y2VwdGlvbiBhdCBsaW5lICVkIiwgbi50b2tlbi5iZWdpbkxpbmUgKSApOworCisJCXRocm93bi5jaGVjayggbiApOworCQlUaHJvd24gdCA9IG5ldyBUaHJvd24oIHRoaXMsIG4gKTsKKwkJdGhyb3duLmFkZCggbiwgdCApOworCQlyZXR1cm4gdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbgorCSAqIEByZXR1cm4gYW55IHRocm93biBleGNlcHRpb24gYnkgdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqLworCXB1YmxpYyBUaHJvd24gZ2V0VGhyb3duKCBTdHJpbmcgbiApCisJeworCQlyZXR1cm4gdGhyb3duLmdldCggbiApOworCX0KKworCXByaXZhdGUgZmluYWwgTmFtZUxpc3Q8VGhyb3duPiB0aHJvd24gPSBuZXcgTmFtZUxpc3Q8VGhyb3duPigpOworCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWVzc2FnZSBoYXMgdGhyb3duIGV4Y2VwdGlvbnMuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzVGhyb3duKCkKKwl7CisJCXJldHVybiAhdGhyb3duLmxpc3QoKS5pc0VtcHR5KCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgYXN5bmMgcmVjZWl2ZXIgbW9kZS4KKwkgKi8KKwlwdWJsaWMgQXN5bmNSZWNlaXZlck1vZGUgZ2V0QXN5bmNSZWNlaXZlcigpCisJeworCQlBc3luY1JlY2VpdmVyIGFyID0gKEFzeW5jUmVjZWl2ZXIpIGdldE9wdCggIkFzeW5jUmVjZWl2ZXIiICk7CisKKwkJaWYgKGFyID09IG51bGwpCisJCQlyZXR1cm4gQXN5bmNSZWNlaXZlck1vZGUuTk9ORTsKKworCQlyZXR1cm4gYXIuZ2V0TW9kZSgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyBtYXJrZWQgdG8gaGF2ZSBhbiBhc3luY2hyb25vdXMKKwkgKiByZWNlaXZlci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FzeW5jUmVjZWl2ZXIoKQorCXsKKwkJcmV0dXJuIGdldEFzeW5jUmVjZWl2ZXIoKSAhPSBBc3luY1JlY2VpdmVyTW9kZS5OT05FOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyBtYXJrZWQgdG8gaGF2ZSBhIHF1ZXVlZCBhc3luY2hyb25vdXMKKwkgKiByZWNlaXZlci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlZEFzeW5jUmVjZWl2ZXIoKQorCXsKKwkJcmV0dXJuIGdldEFzeW5jUmVjZWl2ZXIoKSA9PSBBc3luY1JlY2VpdmVyTW9kZS5RVUVVRUQ7CisJfQorCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGlzIG1hcmtlZCB0byBoYXZlIGEgZnJlZSBhc3luY2hyb25vdXMKKwkgKiByZWNlaXZlci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZyZWVBc3luY1JlY2VpdmVyKCkKKwl7CisJCXJldHVybiBnZXRBc3luY1JlY2VpdmVyKCkgPT0gQXN5bmNSZWNlaXZlck1vZGUuRlJFRTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIG9uZXdheSBtZXNzYWdlIHdoaWNoIGRvZXMgbm90IHdhaXQKKwkgKiBmb3IgYW55IHJlc3BvbnNlIGZyb20gdGhlIG90aGVyIGVuZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc09uZXdheSgpCisJeworCQlPbmV3YXkgb25ld2F5ID0gKE9uZXdheSkgZ2V0T3B0KCAiT25ld2F5IiApOworCQlyZXR1cm4gb25ld2F5ICE9IG51bGwgJiYgb25ld2F5LmlzT25ld2F5KCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWVzc2FnZSByZXF1aXJlcyBhdXRob3JpemF0aW9uLgorCSAqLworCXB1YmxpYyBBdXRob3JpemUgZ2V0QXV0aCgpCisJeworCQlyZXR1cm4gKEF1dGhvcml6ZSkgZ2V0T3B0KCAiQXV0aG9yaXplIiApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1lc3NhZ2UgcmVxdWlyZXMgYXV0aG9yaXphdGlvbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNBdXRoKCkKKwl7CisJCUF1dGhvcml6ZSBhdXRoID0gZ2V0QXV0aCgpOworCQlyZXR1cm4gYXV0aCAhPSBudWxsICYmIGF1dGguaGFzQXV0aCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNoZWNrKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQljaGVja01lc3NhZ2VOYW1lKCBuYW1lKCkgKTsKKwkJCisJCXR5cGUuY2hlY2soIHBhcmVudCgpICk7CisKKwkJZm9yIChQYXJhbWV0ZXIgcDogdGhpcykKKwkJCXAuY2hlY2soKTsKKworCQlmb3IgKFRocm93biBuOiB0aHJvd24pCisJCQluLmNoZWNrKCk7CisKKwkJQXV0aG9yaXplIGF1dGggPSBnZXRBdXRoKCk7CisJCWlmIChhdXRoICE9IG51bGwpCisJCQlhdXRoLmNoZWNrKCBwYXJlbnQoKSwgdGhpcyApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTZXJ2aWNlIHNlcnZpY2UoKQorCXsKKwkJcmV0dXJuIHBhcmVudCgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdGhyb3duIGV4Y2VwdGlvbnMuCisJICovCisJcHVibGljIE5hbWVMaXN0PFRocm93bj4gdGhyb3duKCkKKwl7CisJCXJldHVybiB0aHJvd247CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgcmVxdWVzdCBtZXNzYWdlIG9mIHRoaXMgcmVzdWx0IG1lc3NhZ2UuCisJICovCisJcHVibGljIE1lc3NhZ2UgZ2V0UmVxdWVzdE1lc3NhZ2UoKQorCXsKKwkJcmV0dXJuIHJlcU1zZzsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSByZXF1ZXN0IG1lc3NhZ2Ugb2YgdGhpcyByZXN1bHQgbWVzc2FnZS4KKwkgKiBAcGFyYW0gcmVxTXNnCisJICovCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdE1lc3NhZ2UoIE1lc3NhZ2UgcmVxTXNnICkKKwl7CisJCXRoaXMucmVxTXNnID0gcmVxTXNnOworCX0KKworCXByaXZhdGUgTWVzc2FnZSByZXFNc2c7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0cmVld2FsayggVHJlZVdhbGtlciB3YWxrZXIgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCXdhbGtlci5wcmVNZXNzYWdlKCB0aGlzICk7CisKKwkJd2Fsa2VyLmRvVHlwZVJlZiggdHlwZSApOworCisJCWZvciAoUGFyYW1ldGVyIHA6IHRoaXMpCisJCQlwLnRyZWV3YWxrKCB3YWxrZXIgKTsKKworCQlmb3IgKFRocm93biBuOiB0aHJvd24pCisJCQluLnRyZWV3YWxrKCB3YWxrZXIgKTsKKworCQl3YWxrZXIucG9zdE1lc3NhZ2UoIHRoaXMgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvTWVzc2FnZURpcmVjdGlvbi5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L01lc3NhZ2VEaXJlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdiMmJjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L01lc3NhZ2VEaXJlY3Rpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworLyoqCisgKiBUaGUgbWVzc2FnZSBkaXJlY3Rpb24gaXMgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBmcm9tIGNsaWVudCB0bworICogc2VydmVyIG9yIHNlcnZlciB0byBjbGllbnQgb3IgYm90aC4KKyAqLworcHVibGljIGVudW0gTWVzc2FnZURpcmVjdGlvbgoreworCS8qKgorCSAqIFRoaXMgbWVzc2FnZSBpcyB1c2VkIGJ5IHRoZSBjbGllbnQgdG8gaW52b2tlIHRoZSBzZXJ2ZXIuCisJICovCisJU0VSVkVSLAorCS8qKgorCSAqIFRoaXMgbWVzc2FnZSBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8gaW52b2tlIHRoZSBjbGllbnQuCisJICovCisJQ0xJRU5ULAorCS8qKgorCSAqIFRoaXMgbWVzc2FnZSBtYXkgYmUgdXNlZCBieSBlaXRoZXIgdGhlIGNsaWVudCBvciBzZXJ2ZXIgdG8gaW52b2tlIHRoZSBvdGhlci4KKwkgKi8KKwlCT1RICit9CisKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9NaXhpbi5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L01peGluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjOTljMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9NaXhpbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKKworCisvKioKKyAqIEEgbWl4aW4gZGVjbGFyYXRpb24gZnJvbSB0aGUgZXRjaCBpZGwuCisgKi8KK3B1YmxpYyBjbGFzcyBNaXhpbiBleHRlbmRzIE5hbWVkPFNlcnZpY2U+Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgTWl4aW4uCisJICoKKwkgKiBAcGFyYW0gaW50ZgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG5PcHRzCisJICogQHBhcmFtIG1vZAorCSAqLworCXB1YmxpYyBNaXhpbiggU2VydmljZSBpbnRmLCBOYW1lIG5hbWUsIE1hcDxTdHJpbmcsIE9wdD4gbk9wdHMsIE1vZHVsZSBtb2QgKQorCXsKKwkJc3VwZXIoIGludGYsIG5hbWUsIG5PcHRzICk7CisJCXRoaXMubW9kID0gbW9kOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1vZHVsZSBtb2Q7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbWl4ZWQgaW4gbW9kdWxlLgorCSAqLworCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKCkKKwl7CisJCXJldHVybiBtb2Q7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdm5hbWUoIEJhY2tlbmQgaGVscGVyICkKKwl7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGZxbmFtZSgpCisJeworCQlyZXR1cm4gbW9kLml0ZXJhdG9yKCkubmV4dCgpLmZxbmFtZSgpOworCX0KKwkKKy8vCUBPdmVycmlkZQorLy8JcHVibGljIEludGVnZXIgaWQoKQorLy8JeworLy8JCXJldHVybiBudWxsOworLy8JfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZHVtcCggU3RyaW5nIGluZGVudCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzbWl4aW4gJXNcbiIsIGluZGVudCwgbmFtZSgpLm5hbWUgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjaGVjaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0cmVld2FsayggVHJlZVdhbGtlciB3YWxrZXIgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCXdhbGtlci5kb01peGluKCB0aGlzICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L01vZHVsZS5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDE0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvTW9kdWxlLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQmFja2VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQ21kTGluZU9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlBhcnNlRXhjZXB0aW9uOworCisKKy8qKgorICogQSBtb2R1bGUgZGVjbGFyYXRpb24gZnJvbSB0aGUgZXRjaCBpZGwuCisgKi8KK3B1YmxpYyBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBOYW1lZDxNb2R1bGU+IGltcGxlbWVudHMgSXRlcmFibGU8U2VydmljZT4KK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBNb2R1bGUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGlzIGlzIHRoZSBtb3JhbCBlcXVpdmFsZW50IG9mIGEgamF2YSBwYWNrYWdlLiBJdCBpcworCSAqIGEgZG90dGVkIG5hbWUgbGlzdCBsaWtlICJjb20uY2lzY28uY3VhZS5tZWRpYSIuCisJICogQHBhcmFtIGNtZExpbmVPcHRpb25zIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKwkgKi8KKwlwdWJsaWMgTW9kdWxlKCBOYW1lIG5hbWUsIENtZExpbmVPcHRpb25zIGNtZExpbmVPcHRpb25zICkKKwl7CisJCXN1cGVyKCBudWxsLCBuYW1lLCBudWxsLCBjbWRMaW5lT3B0aW9ucyApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHZuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWUoKS5uYW1lOworCX0KKwkKKy8vCUBPdmVycmlkZQorLy8JcHVibGljIEludGVnZXIgaWQoKQorLy8JeworLy8JCXJldHVybiBudWxsOworLy8JfQorCisJLyoqCisJICogQHBhcmFtIG4KKwkgKiBAcGFyYW0gb3B0cworCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgc2VydmljZS4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIFNlcnZpY2UgYWRkU2VydmljZSggTmFtZSBuLCBNYXA8U3RyaW5nLCBPcHQ+IG9wdHMgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCXNlcnZpY2VzLmNoZWNrKCBuICk7CisJCVNlcnZpY2UgaSA9IG5ldyBTZXJ2aWNlKCB0aGlzLCBuLCBvcHRzICk7CisJCXNlcnZpY2VzLmFkZCggaS5uYW1lKCksIGkgKTsKKwkJcmV0dXJuIGk7CisJfQorCQorCXByaXZhdGUgTmFtZUxpc3Q8U2VydmljZT4gc2VydmljZXMgPSBuZXcgTmFtZUxpc3Q8U2VydmljZT4oKTsKKworCisJcHVibGljIEl0ZXJhdG9yPFNlcnZpY2U+IGl0ZXJhdG9yKCkKKwl7CisJCXJldHVybiBzZXJ2aWNlcy5pdGVyYXRvcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGR1bXAoIFN0cmluZyBpbmRlbnQgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGYoICIlc21vZHVsZSAlcztcbiIsIGluZGVudCwgbmFtZSgpICk7CisJCQorCQlTdHJpbmcgc0luZGVudCA9IGluZGVudCsiICAiOworCQkKKwkJZm9yIChTdHJpbmcgczogZGVzY3IoKSkKKwkJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNkZXNjciAlc1xuIiwgc0luZGVudCwgcyApOworCQkKKwkJZm9yIChTZXJ2aWNlIGk6IHRoaXMpCisJCQlpLmR1bXAoIHNJbmRlbnQgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjaGVjaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJY2hlY2tNb2R1bGVOYW1lKCBuYW1lKCkgKTsKKwkJCisJCWZvciAoU2VydmljZSBpOiB0aGlzKQorCQkJaS5jaGVjaygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRyZWV3YWxrKCBUcmVlV2Fsa2VyIHdhbGtlciApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJd2Fsa2VyLnByZU1vZHVsZSggdGhpcyApOworCQkKKwkJZm9yIChTZXJ2aWNlIHM6IHRoaXMpCisJCQlzLnRyZWV3YWxrKCB3YWxrZXIgKTsKKwkJCisJCXdhbGtlci5wb3N0TW9kdWxlKCB0aGlzICk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9Nc2dEaXJIZWxwZXIuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9Nc2dEaXJIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmJkYzhhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L01zZ0RpckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCisvKioKKyAqIFNvbWUgaGVscGZ1bCBtZXRob2RzIHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIE1lc3NhZ2VEaXJlY3Rpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBNc2dEaXJIZWxwZXIKK3sKKwkvKioKKwkgKiBAcGFyYW0gbWMKKwkgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBzdWZmaXggZm9yIGEgbWVzc2FnZSBuYW1lIGdpdmVuIHRoZQorCSAqIG1lc3NhZ2UgZGlyZWN0aW9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN1ZmZpeCggTWVzc2FnZURpcmVjdGlvbiBtYyApCisJeworCQlzd2l0Y2ggKG1jKQorCQl7CisJCQljYXNlIENMSUVOVDogcmV0dXJuICJDbGllbnQiOworCQkJY2FzZSBTRVJWRVI6IHJldHVybiAiU2VydmVyIjsKKwkJCWNhc2UgQk9USDogcmV0dXJuICIiOworCQkJZGVmYXVsdDogdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInVua25vd24gbWVzc2FnZSBkaXJlY3Rpb24gIittYyApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L05hbWUuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9OYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxNWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9OYW1lLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuVG9rZW47CisKKy8qKgorICogQSBuYW1lIG9mIGEgdGhpbmcgZnJvbSB0aGUgZXRjaCBpZGxlLiBJZiB0aGUgdG9rZW4gaXMgcHJlc2VudCwKKyAqIGl0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgbmFtZS4KKyAqLworcHVibGljIGNsYXNzIE5hbWUKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBOYW1lLgorCSAqCisJICogQHBhcmFtIHRva2VuCisJICogQHBhcmFtIG5hbWUKKwkgKi8KKwlwdWJsaWMgTmFtZSggVG9rZW4gdG9rZW4sIFN0cmluZyBuYW1lICkKKwl7CisJCXRoaXMudG9rZW4gPSB0b2tlbjsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisJCisJLyoqCisJICogVGhlIG9yaWdpbmFsIHNvdXJjZSBvZiB0aGUgbmFtZS4gVXNlZCB0byBnZXQgdGhlIGxpbmUgbnVtYmVyLgorCSAqLworCXB1YmxpYyBmaW5hbCBUb2tlbiB0b2tlbjsKKwkKKwkvKioKKwkgKiBUaGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgc3RyaW5nIG9mIHRoaXMgbmFtZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L05hbWVMaXN0LmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvTmFtZUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc1M2RiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L05hbWVMaXN0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFic3RyYWN0aW9uIG9mIGEgbGlzdCBvZiBuYW1lZCBpdGVtcy4gVGhlIGl0ZW1zIG1heSBiZSByZXRyZWl2ZWQgaW4KKyAqIG9yZGVyIGFkZGVkIG9yIGJ5IG5hbWUuCisgKiBAcGFyYW0gPFQ+CisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lTGlzdDxUPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPFQ+Cit7CisJLyoqCisJICogQ2hlY2tzIHRoZSBuYW1lIGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgbmFtZSBsaXN0LgorCSAqIEBwYXJhbSBuYW1lCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrKCBOYW1lIG5hbWUgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWlmIChtYXAuY29udGFpbnNLZXkoIG5hbWUubmFtZSApKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJkdXBsaWNhdGUgbmFtZSAoJXMpIGF0IGxpbmUgJWQiLCBuYW1lLm5hbWUsIG5hbWUudG9rZW4uYmVnaW5MaW5lICkgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXN0LnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgbmFtZWQgaXRlbSwgb3IgbnVsbC4KKwkgKi8KKwlwdWJsaWMgVCBnZXQoIFN0cmluZyBuYW1lICkKKwl7CisJCXJldHVybiBtYXAuZ2V0KCBuYW1lICk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgbmFtZWQgaXRlbSB0byB0aGUgbmFtZSBsaXN0LgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgYWRkKCBOYW1lIG5hbWUsIFQgbiApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJY2hlY2soIG5hbWUgKTsKKwkJbWFwLnB1dCggbmFtZS5uYW1lLCBuICk7CisJCWxpc3QuYWRkKCBuICk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkKKwl7CisJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBUPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFQ+KCk7CisJCisJcHJpdmF0ZSBMaXN0PFQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIGxpc3QuCisJICovCisJcHVibGljIExpc3Q8VD4gbGlzdCgpCisJeworCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVsaXN0IGlzIGVtcHR5LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQorCXsKKwkJcmV0dXJuIGxpc3QuaXNFbXB0eSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lbGlzdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzKCBTdHJpbmcgbmFtZSApCisJeworCQlyZXR1cm4gbWFwLmNvbnRhaW5zS2V5KCBuYW1lICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L05hbWVkLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvTmFtZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmYwNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L05hbWVkLmphdmEKQEAgLTAsMCArMSwzMDggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQmFja2VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQ21kTGluZU9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5Ub2tlbjsKKworCisvKioKKyAqIEFic3RyYWN0aW9uIG9mIGEgbmFtZWQgaXRlbSBmcm9tIHRoZSBldGNoIGlkbC4KKyAqIEBwYXJhbSA8UD4gdGhlIHBhcmVudCB0eXBlIG9mIHRoaXMgaXRlbS4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIE5hbWVkPFAgZXh0ZW5kcyBOYW1lZDw/Pj4KK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBOYW1lZC4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBuT3B0cworCSAqLworCXB1YmxpYyBOYW1lZCggUCBwYXJlbnQsIE5hbWUgbmFtZSwgTWFwPFN0cmluZywgT3B0PiBuT3B0cyApCisJeworCQl0aGlzKCBwYXJlbnQsIG5hbWUsIG5PcHRzLCBudWxsICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIE5hbWVkLgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG5PcHRzCisJICogQHBhcmFtIGNtZExpbmVPcHRpb25zIAorCSAqLworCXB1YmxpYyBOYW1lZCggUCBwYXJlbnQsIE5hbWUgbmFtZSwgTWFwPFN0cmluZywgT3B0PiBuT3B0cywKKwkJQ21kTGluZU9wdGlvbnMgY21kTGluZU9wdGlvbnMgKQorCXsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubk9wdHMgPSBuT3B0czsKKwkJdGhpcy5jbWRMaW5lT3B0aW9ucyA9IGNtZExpbmVPcHRpb25zOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFAgcGFyZW50OworCQorCXByaXZhdGUgZmluYWwgTmFtZSBuYW1lOworCQorCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT3B0PiBuT3B0czsKKwkKKwlwcml2YXRlIGZpbmFsIENtZExpbmVPcHRpb25zIGNtZExpbmVPcHRpb25zOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIGl0ZW0uCisJICovCisJcHVibGljIFAgcGFyZW50KCkKKwl7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBpdGVtLgorCSAqLworCXB1YmxpYyBOYW1lIG5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBuIHRoZSBvcHQgbmFtZSB0byBjaGVjay4KKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wdCBpcyBwcmVzZW50IGhlcmUgb3IgaW4gdGhlIHBhcmVudC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNPcHQoIFN0cmluZyBuICkKKwl7CisJCXJldHVybiBnZXRPcHQoIG4gKSAhPSBudWxsOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBvZiB1cywgb3IgdGhvc2Ugb2YgdGhlIHBhcmVudC4KKwkgKi8KKwlwdWJsaWMgQ21kTGluZU9wdGlvbnMgZ2V0Q21kTGluZU9wdGlvbnMoKQorCXsKKwkJaWYgKGNtZExpbmVPcHRpb25zICE9IG51bGwpCisJCQlyZXR1cm4gY21kTGluZU9wdGlvbnM7CisJCQorCQlyZXR1cm4gcGFyZW50ICE9IG51bGwgPyBwYXJlbnQuZ2V0Q21kTGluZU9wdGlvbnMoKSA6IG51bGw7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBuIHRoZSBuYW1lIG9mIHRoZSBvcHQuCisJICogQHJldHVybiB0aGUgb3B0IGlmIGZvdW5kLiBpZiB0aGlzIG5hbWVkIGRvZXMgbm90IGRlZmluZQorCSAqIGl0LCBzZWFyY2ggdGhlIHBhcmVudC4KKwkgKi8KKwlwdWJsaWMgT3B0IGdldE9wdCggU3RyaW5nIG4gKQorCXsKKwkJT3B0IG9wdCA9IG51bGw7CisJCWlmIChuT3B0cyAhPSBudWxsKQorCQkJb3B0ID0gbk9wdHMuZ2V0KCBuICk7CisJCWlmIChvcHQgPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkKKwkJCW9wdCA9IHBhcmVudC5nZXRPcHQoIG4gKTsKKwkJcmV0dXJuIG9wdDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgb3B0cyBvZiB0aGlzIG5hbWVkIHRoaW5nLgorCSAqLworCXB1YmxpYyBDb2xsZWN0aW9uPE9wdD4gb3B0cygpCisJeworCQlyZXR1cm4gbk9wdHMudmFsdWVzKCk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBoZWxwZXIgYmFja2VuZCB0byBoZWxwIHdpdGggbmFtZSBmb3JtYXRzCisJICogQHJldHVybiB0aGUgdmFyaWFibGUgbmFtZSBvZiB0aGlzIG5hbWVkLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgdm5hbWUoIEJhY2tlbmQgaGVscGVyICk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBuYW1lZCAoYXMgdXNlZCBpbiBUeXBlCisJICogZGVjbGFyYXRpb24pLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZnFuYW1lKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gaGVscGVyCisJICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGVudW0sIHN0cnVjdCwgb3IgZXh0ZXJuIG5hbWUgdG8gdXNlCisJICogd2hlbiByZWZlcmluZyB0byB0aGUgaXRlbSBpbiBjb2RlLiBtb3N0IHByb2JhYmx5IHRoZSBzYW1lIGFzIGZxbmFtZQorCSAqIGV4Y2VwdCBmb3IgZXh0ZXJuLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZWZxbmFtZSggQmFja2VuZCBoZWxwZXIgKQorCXsKKwkJcmV0dXJuIGZxbmFtZSgpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBkZXNjcmlwdGlvbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNEZXNjcigpCisJeworCQlyZXR1cm4gZGVzY3IgIT0gbnVsbCAmJiAhZGVzY3IuaXNFbXB0eSgpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgZGVzY3JpcHRpb24uCisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBkZXNjcigpCisJeworCQlyZXR1cm4gZGVzY3I7CisJfQorCisJLyoqCisJICogQHBhcmFtIGRlc2NyCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3IoIExpc3Q8U3RyaW5nPiBkZXNjciApCisJeworCQl0aGlzLmRlc2NyID0gZGVzY3I7CisJfQorCQorCXByaXZhdGUgTGlzdDxTdHJpbmc+IGRlc2NyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkvKioKKwkgKiBEdW1wcyB0aGUgaXRlbSBuaWNlbHkgZm9ybWF0dGVkLgorCSAqIEBwYXJhbSBpbmRlbnQKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICk7CisKKwkvKioKKwkgKiBDaGVja3MgdGhlIGl0ZW0gZm9yIGJlaW5nIGZ1bGx5IGRlZmluZWQuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIGNoZWNrKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uOworCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tNb2R1bGVOYW1lKCBOYW1lIG5hbWUgKQorCXsKKwkJYm9vbGVhbiBvayA9IHRydWU7CisJCQorCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBuYW1lLm5hbWUsICIuIiApOworCQl3aGlsZSAob2sgJiYgc3QuaGFzTW9yZVRva2VucygpKQorCQkJb2sgPSBzdGFydHNXaXRoTG93ZXIoIHN0Lm5leHRUb2tlbigpICk7CisJCQorCQlpZiAoIW9rKQorCQkJd2FybigKKwkJCQkibW9kdWxlIGVsZW1lbnQgbmFtZSBzaG91bGQgc3RhcnQgd2l0aCBsb3dlcmNhc2UiLAorCQkJCW5hbWUubmFtZSwgbmFtZS50b2tlbiApOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrQ29uc3RhbnROYW1lKCBOYW1lIG5hbWUgKQorCXsKKwkJaWYgKCFuYW1lLm5hbWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIG5hbWUubmFtZSApKQorCQkJd2FybigKKwkJCQkiY29uc3RhbnQgbmFtZSBzaG91bGQgYmUgYWxsIHVwcGVyY2FzZSIsCisJCQkJbmFtZS5uYW1lLCBuYW1lLnRva2VuICk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlTmFtZSggTmFtZSBuYW1lICkKKwl7CisJCWlmICghc3RhcnRzV2l0aFVwcGVyKCBuYW1lLm5hbWUgKSkKKwkJCXdhcm4oCisJCQkJInR5cGUgbmFtZSBzaG91bGQgc3RhcnQgd2l0aCB1cHBlcmNhc2UiLAorCQkJCW5hbWUubmFtZSwgbmFtZS50b2tlbiApOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyYW1OYW1lKCBOYW1lIG5hbWUgKQorCXsKKwkJaWYgKCFzdGFydHNXaXRoTG93ZXIoIG5hbWUubmFtZSApKQorCQkJd2FybigKKwkJCQkicGFyYW1ldGVyIG5hbWUgc2hvdWxkIHN0YXJ0IHdpdGggbG93ZXJjYXNlIiwKKwkJCQluYW1lLm5hbWUsIG5hbWUudG9rZW4gKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VOYW1lKCBOYW1lIG5hbWUgKQorCXsKKwkJaWYgKCFzdGFydHNXaXRoTG93ZXIoIG5hbWUubmFtZSApKQorCQkJd2FybigKKwkJCQkibWVzc2FnZSBuYW1lIHNob3VsZCBzdGFydCB3aXRoIGxvd2VyY2FzZSIsCisJCQkJbmFtZS5uYW1lLCBuYW1lLnRva2VuICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB3YXJuKCBTdHJpbmcgbXNnLCBTdHJpbmcgbmFtZSwgVG9rZW4gdG9rZW4gKQorCXsKKwkJLy8gVE9ETyB0dXJuIG9uIHdhcm5pbmdzIGZvciBuYW1pbmcgY29udmVudGlvbnMuCisvLwkJU3lzdGVtLmVyci5wcmludGYoICJXYXJuaW5nOiAlczogJXMgYXQgbGluZSAlZFxuIiwKKy8vCQkJbXNnLCBuYW1lLCB0b2tlbiAhPSBudWxsID8gdG9rZW4uYmVnaW5MaW5lIDogMCApOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gc3RhcnRzV2l0aExvd2VyKCBTdHJpbmcgcyApCisJeworCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKCBzLmNoYXJBdCggMCApICkgfHwgcy5jaGFyQXQoIDAgKSA9PSAnXyc7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHN0YXJ0c1dpdGhVcHBlciggU3RyaW5nIHMgKQorCXsKKwkJcmV0dXJuIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSggcy5jaGFyQXQoIDAgKSApOworCX0KKwkKKwkvKioKKwkgKiBXYWxrcyB0aGUgdHJlZSBmcm9tIHRoZSB0b3AgdG8gdGhlIGJvdHRvbSwgdmlzaXRpbmcgZXZlcnkgbm9kZS4KKwkgKiBAcGFyYW0gd2Fsa2VyIGNhbGxlZCB3aXRoIGVhY2ggYW5kIGV2ZXJ5IG5vZGUgdW5kZXIgdGhpcyBvbmUuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIHRyZWV3YWxrKCBUcmVlV2Fsa2VyIHdhbGtlciApIHRocm93cyBQYXJzZUV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGNvbnN0YW50LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29uc3RhbnQoKSB7IHJldHVybiB0aGlzIGluc3RhbmNlb2YgQ29uc3RhbnQ7IH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBlbnVtLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW51bXgoKSB7IHJldHVybiB0aGlzIGluc3RhbmNlb2YgRW51bXg7IH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHN0cnVjdC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0cnVjdCgpIHsgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBTdHJ1Y3Q7IH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBleHRlcm4uCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFeHRlcm4oKSB7IHJldHVybiB0aGlzIGluc3RhbmNlb2YgRXh0ZXJuOyB9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBidWlsdC1pbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0J1aWx0aW4oKSB7IHJldHVybiB0aGlzIGluc3RhbmNlb2YgQnVpbHRpbjsgfQorCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGV4Y2VwdGlvbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4Y2VwdCgpIHsgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBFeGNlcHQ7IH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIG1lc3NhZ2UuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlKCkgeyByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIE1lc3NhZ2U7IH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIE1peGluCisJICovCisJCisJcHVibGljIGJvb2xlYW4gaXNNaXhpbigpIHsgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBNaXhpbjsgfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L09wdC5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L09wdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjIyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvT3B0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgYW5ub3RhdGlvbnMgZnJvbSB0aGUgZXRjaCBpZGwuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBPcHQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBPcHQuCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGlzIG9wdC4gbXVzdCBiZSB1bmlxdWUuCisJICogQHBhcmFtIGxpbmVubyB0aGUgbGluZSBudW1iZXIgb2YgdGhpcyBvcHQuCisJICovCisJcHVibGljIE9wdCggU3RyaW5nIG5hbWUsIGludCBsaW5lbm8gKQorCXsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saW5lbm8gPSBsaW5lbm87CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgbGluZW5vOworCQorCXByaXZhdGUgZmluYWwgU2V0PENsYXNzPD8+PiB0eXBlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworCQorCS8qKgorCSAqIEBwYXJhbSB0eXBlIGFkZHMgdGhlIHNwZWNpZmllZCB0eXBlIHRvIHRoZSBzZXQgb2YgY29uc3RydWN0cworCSAqIHRvIHdoaWNoIHRoaXMgb3B0IG1heSBiZSBhdHRhY2hlZC4gZ2VuZXJhbGx5IG9ubHkgY2FsbGVkIGZyb20KKwkgKiB0aGUgY29uc3RydWN0b3Igb2YgYW4gb3B0LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFR5cGUoIENsYXNzPD8+IHR5cGUgKQorCXsKKwkJdHlwZXMuYWRkKCB0eXBlICk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG9wdGlvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoaXMgb3B0LgorCSAqLworCXB1YmxpYyBpbnQgbGluZW5vKCkKKwl7CisJCXJldHVybiBsaW5lbm87CisJfQorCisJLyoqCisJICogRHVtcHMgdGhlIG9wdGlvbiBuaWNlbHkgZm9ybWF0dGVkLgorCSAqIEBwYXJhbSBpbmRlbnQKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICk7CisKKwlAT3ZlcnJpZGUKKwlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBjb25zdHJ1Y3QgdG8gd2hpY2ggdGhlIG9wdCBpcyBhdHRhY2hlZC4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgY2hlY2soIENsYXNzPD8+IHR5cGUgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWlmICh0eXBlcyAhPSBudWxsKQorCQl7CisJCQlpZiAoIXR5cGVzLmNvbnRhaW5zKCB0eXBlICkpCisJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkib3B0aW9uICVzIG5vdCBhbGxvd2VkIGhlcmUsIGxpbmUgJWQiLCB0aGlzLCBsaW5lbm8pICk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvT3B0TGlzdC5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L09wdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjNiOThhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L09wdExpc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIEEgbGlzdCBvZiBvcHRpb25zIChhbm5vdGF0aW9ucywgZS5nLiwgQFRpbWVvdXQsIEBPbmV3YXkpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3B0TGlzdAoreworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbGxlY3RlZCBvcHRpb25zLgorCSAqLworCXB1YmxpYyBDb2xsZWN0aW9uPE9wdD4gb3B0cygpOworCQorCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtIGhhcyB0aGUgc3BlY2lmaWVkIG9wdGlvbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNPcHQoIFN0cmluZyBuYW1lICk7CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgb3B0aW9uLgorCSAqLworCXB1YmxpYyBPcHQgZ2V0T3B0KCBTdHJpbmcgbmFtZSApOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1BhcmFtTGlzdC5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1BhcmFtTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmE5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvUGFyYW1MaXN0LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LlRvU3RyaW5nLkZpZWxkSXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0LlRvU3RyaW5nLkZtdEl0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdC5Ub1N0cmluZy5TdHJpbmdJdGVtOworCisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBzZXJ2aWNlIGVsZW1lbnRzIHdoaWNoIGhhdmUgcGFyYW1ldGVyIGxpc3RzCisgKiBmcm9tIHRoZSBldGNoIGlkbC4gVGhpcyBpbmNsdWRlcyBzdHJ1Y3QsIGV4Y2VwdGlvbiwgYW5kIG1lc3NhZ2UKKyAqIGVsZW1lbnRzLgorICogQHBhcmFtIDxQPiB0aGUgdHlwZSBvZiB0aGUgcGFyZW50IG9iamVjdC4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFBhcmFtTGlzdDxQIGV4dGVuZHMgTmFtZWQ8Pz4+IGV4dGVuZHMgTmFtZWQ8UD4KKwlpbXBsZW1lbnRzIEl0ZXJhYmxlPFBhcmFtZXRlcj4KK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBQYXJhbUxpc3QuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gb3B0cworCSAqLworCXB1YmxpYyBQYXJhbUxpc3QoIFAgcGFyZW50LCBOYW1lIG5hbWUsIE1hcDxTdHJpbmcsIE9wdD4gb3B0cyApCisJeworCQlzdXBlciggcGFyZW50LCBuYW1lLCBvcHRzICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHJ0CisJICogQHBhcmFtIG4KKwkgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdGhhdCB3YXMgYWRkZWQuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBQYXJhbWV0ZXIgYWRkUGFyYW1ldGVyKCBOYW1lIG4sIFR5cGVSZWYgcnQgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisvLwkJaWYgKHJ0LnR5cGUoKS5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlZPSUQpCisvLwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJiYWQgcGFyYW1ldGVyIHR5cGUgIitydCsiIGZvciBuYW1lICIrbiApOworCQkKKwkJbGlzdC5jaGVjayggbiApOworCQlQYXJhbWV0ZXIgcCA9IG5ldyBQYXJhbWV0ZXIoIHRoaXMsIG4sIHJ0ICk7CisJCWxpc3QuYWRkKCBuLCBwICk7CisJCXJldHVybiBwOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBuYW1lIGlzIGRlZmluZWQgYnkgdGhpcyBlbGVtZW50LgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1BhcmFtZXRlciggU3RyaW5nIG4gKQorCXsKKwkJcmV0dXJuIGxpc3QuaGFzKCBuICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG4gdGhlIHBhcmFtZXRlciBuYW1lIHRvIGdldC4KKwkgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9yIG51bGwuCisJICovCisJcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoIFN0cmluZyBuICkKKwl7CisJCXJldHVybiBsaXN0LmdldCggbiApOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIGluIG9yZGVyLgorCSAqLworCXB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpCisJeworCQlyZXR1cm4gbGlzdC5saXN0KCk7CisJfQorCQorCXByaXZhdGUgTmFtZUxpc3Q8UGFyYW1ldGVyPiBsaXN0ID0gbmV3IE5hbWVMaXN0PFBhcmFtZXRlcj4oKTsKKworCXB1YmxpYyBJdGVyYXRvcjxQYXJhbWV0ZXI+IGl0ZXJhdG9yKCkKKwl7CisJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgZGVmaW5lcyBhbnkgcGFyYW1ldGVycy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNQYXJhbWV0ZXJzKCkKKwl7CisJCXJldHVybiAhbGlzdC5pc0VtcHR5KCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgc2VydmljZSB0aGF0IHdlIGFyZSBwYXJ0IG9mLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyBTZXJ2aWNlIHNlcnZpY2UoKTsKKworCS8qKgorCSAqIEBwYXJhbSBpc0V4Y2VwdAorCSAqIEBwYXJhbSBoYXNFeHRlbmRzCisJICogQHJldHVybiBhIGxpc3Qgb2YgZm9ybWF0IGl0ZW1zIGZvciB0aGlzIGVsZW1lbnQuCisJICovCisJcHVibGljIExpc3Q8Rm10SXRlbT4gbWtGb3JtYXRMaXN0KCBib29sZWFuIGlzRXhjZXB0LCBib29sZWFuIGhhc0V4dGVuZHMgKQorCXsKKwkJTGlzdDxGbXRJdGVtPiBmbXRzID0gbmV3IEFycmF5TGlzdDxGbXRJdGVtPigpOworCQkKKwkJaWYgKCFpc0V4Y2VwdCkKKwkJCWZtdHMuYWRkKCBuZXcgU3RyaW5nSXRlbSggbmFtZSgpLm5hbWUrIigiICkgKTsKKworCQlpZiAoaGFzRXh0ZW5kcykKKwkJeworCQkJZm10cy5hZGQoIG5ldyBGaWVsZEl0ZW0oIGlzRXhjZXB0ID8gInN1cGVyLmdldE1lc3NhZ2UoKSIgOiAic3VwZXIudG9TdHJpbmcoKSIgKSApOworCQkJZm10cy5hZGQoIG5ldyBTdHJpbmdJdGVtKCAiOyAiICkgKTsKKwkJfQorCQkKKwkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCWZvciAoUGFyYW1ldGVyIHA6IGxpc3QpCisJCXsKKwkJCWlmIChmaXJzdCkKKwkJCXsKKwkJCQlmaXJzdCA9IGZhbHNlOworCQkJCWZtdHMuYWRkKCBuZXcgU3RyaW5nSXRlbSggcC5uYW1lKCkubmFtZSsiPSIgKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZtdHMuYWRkKCBuZXcgU3RyaW5nSXRlbSggIjsgIitwLm5hbWUoKS5uYW1lKyI9IiApICk7CisJCQl9CisJCQlmbXRzLmFkZCggbmV3IEZpZWxkSXRlbSggcC5uYW1lKCkubmFtZSApICk7CisJCX0KKwkJCisJCWlmICghaXNFeGNlcHQpCisJCQlmbXRzLmFkZCggbmV3IFN0cmluZ0l0ZW0oICIpIiApICk7CisKKwkJcmV0dXJuIGZtdHM7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHRoZSBmb3JtYXQgaXRlbXMgZm9yIHRoaXMgZWxlbWVudC4KKwkgKiBAcGFyYW0gbGluZW5vCisJICogQHBhcmFtIGZtdHMKKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgY2hlY2tGb3JtYXRMaXN0KCBpbnQgbGluZW5vLCBMaXN0PEZtdEl0ZW0+IGZtdHMgKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWZvciAoRm10SXRlbSBpOiBmbXRzKQorCQl7CisJCQlpZiAoaSBpbnN0YW5jZW9mIEZpZWxkSXRlbSkKKwkJCXsKKwkJCQlGaWVsZEl0ZW0gZmkgPSAoRmllbGRJdGVtKSBpOworCQkJCWlmICghaGFzUGFyYW1ldGVyKCBmaS52YWx1ZSgpICkpCisJCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJUb1N0cmluZzogZm9ybWF0IGxpc3Qgc3BlY2lmaWVzIHBhcmFtZXRlciAoJXMpIHdoaWNoIGRvZXMgbm90IGV4aXN0IGF0IGxpbmUgJWQiLAorCQkJCQkJZmkudmFsdWUoKSwgbGluZW5vICkgKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9QYXJhbWV0ZXIuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9QYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE0MmFiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1BhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKKworCisvKioKKyAqIEEgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIGZyb20gdGhlIGV0Y2ggaWRsLiBBIHBhcmFtZXRlciBjYW4gYmUKKyAqIGEgZmllbGQgb2YgYSBzdHJ1Y3Qgb3IgZXhjZXB0aW9uLCBvciBhIHBhcmFtZXRlciBvZiBhIG1lc3NhZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBOYW1lZDxQYXJhbUxpc3Q8Pz4+Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgUGFyYW1ldGVyLgorCSAqCisJICogQHBhcmFtIHBsCisJICogQHBhcmFtIHJ0CisJICogQHBhcmFtIG5hbWUKKwkgKi8KKwlwdWJsaWMgUGFyYW1ldGVyKCBQYXJhbUxpc3Q8Pz4gcGwsIE5hbWUgbmFtZSwgVHlwZVJlZiBydCApCisJeworCQlzdXBlciggcGwsIG5hbWUsIG51bGwgKTsKKwkJdHlwZSA9IHJ0OworCQl2bmFtZSA9IG5hbWUubmFtZTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBUeXBlUmVmIHR5cGU7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdm5hbWU7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlci4KKwkgKi8KKwlwdWJsaWMgVHlwZVJlZiB0eXBlKCkKKwl7CisJCXJldHVybiB0eXBlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHZuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gaGVscGVyLm1mdm5hbWUoIHZuYW1lICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWUoKS5uYW1lOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiB0eXBlKyIgIituYW1lKCkubmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNwYXJhbSAlcyAlc1xuIiwgaW5kZW50LCB0eXBlLCBuYW1lKCkubmFtZSApOworCQkKKwkJU3RyaW5nIHNJbmRlbnQgPSBpbmRlbnQrIiAgIjsKKwkJCisJCWZvciAoU3RyaW5nIHM6IGRlc2NyKCkpCisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzZGVzY3IgJXNcbiIsIHNJbmRlbnQsIHMgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjaGVjaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJY2hlY2tQYXJhbU5hbWUoIG5hbWUoKSApOworCQkKKwkJdHlwZS5jaGVjayggcGFyZW50KCkuc2VydmljZSgpICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdHJlZXdhbGsoIFRyZWVXYWxrZXIgd2Fsa2VyICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQl3YWxrZXIucHJlUGFyYW1ldGVyKCB0aGlzICk7CisJCQorCQl0eXBlLnRyZWV3YWxrKCB3YWxrZXIgKTsKKwkJCisJCXdhbGtlci5wb3N0UGFyYW1ldGVyKCB0aGlzICk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9SZXNlcnZlZFdvcmRDaGVja2VyLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvUmVzZXJ2ZWRXb3JkQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzYxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvUmVzZXJ2ZWRXb3JkQ2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5Mb2dIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5Ub2tlbjsKKworCisvKioKKyAqIENoZWNrcyB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgZm9yIHVzZXMgb2YgcmVzZXJ2ZWQgd29yZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNlcnZlZFdvcmRDaGVja2VyIGV4dGVuZHMgQWJzdHJhY3RUcmVlV2Fsa2VyCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgcmVzZXJ2ZWQgd29yZCBjaGVja2VyIHdpdGggdGhlIHdvcmQgbGlzdC4KKwkgKiBAcGFyYW0gd29yZHMgdGhlIHJlc2VydmVkIHdvcmQgbGlzdCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zLgorCSAqIEBwYXJhbSByZXdyaXRlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdlIHNob3VsZCBhdHRlbXB0IHRvIHJld3JpdGUKKwkgKiB0aGUgd29yZC4KKwkgKiBAcGFyYW0gbGggCisJICovCisJcHVibGljIFJlc2VydmVkV29yZENoZWNrZXIoIE1hcDxTdHJpbmcsIFN0cmluZz4gd29yZHMsIGJvb2xlYW4gcmV3cml0ZSwgTG9nSGFuZGxlciBsaCApCisJeworCQlpZiAocmV3cml0ZSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJyZXdyaXRlIG5vdCBzdXBwb3J0ZWQgeWV0IiApOworCQkKKwkJdGhpcy53b3JkcyA9IHdvcmRzOworCQl0aGlzLnJld3JpdGUgPSByZXdyaXRlOworCQl0aGlzLmxoID0gbGg7CisJfQorCQorCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB3b3JkczsKKwkKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmV3cml0ZTsKKwkKKwlwcml2YXRlIExvZ0hhbmRsZXIgbGg7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyZWUgd2FsayB3YXMgb2ssIGZhbHNlIGlmIHRoZXJlCisJICogd2VyZSBjb2xsaXNpb25zIHdoaWNoIHdlcmUgbm90IGVkaXRlZCBhd2F5LgorCSAqLworCXB1YmxpYyBib29sZWFuIG9rKCkKKwl7CisJCXJldHVybiBvazsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIG9rID0gdHJ1ZTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVNb2R1bGUoIE1vZHVsZSBtb2R1bGUgKQorCXsKKwkJTmFtZSBuYW1lID0gbW9kdWxlLm5hbWUoKTsKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplciggbmFtZS5uYW1lLCAiLiIgKTsKKwkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJeworCQkJU3RyaW5nIHMgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCWlmICh3b3Jkcy5jb250YWluc0tleSggcyApKQorCQkJeworCQkJCXdoaW5lKCAibW9kdWxlIG5hbWUgY29tcG9uZW50IiwgbmFtZS50b2tlbiApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByZVNlcnZpY2UoIFNlcnZpY2Ugc2VydmljZSApCisJeworCQlOYW1lIG5hbWUgPSBzZXJ2aWNlLm5hbWUoKTsKKwkJaWYgKHdvcmRzLmNvbnRhaW5zS2V5KCBuYW1lLm5hbWUgKSkKKwkJCXdoaW5lKCAic2VydmljZSBuYW1lIiwgbmFtZS50b2tlbiApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVDb25zdGFudCggQ29uc3RhbnQgY29uc3RhbnQgKQorCXsKKwkJTmFtZSBuYW1lID0gY29uc3RhbnQubmFtZSgpOworCQlpZiAod29yZHMuY29udGFpbnNLZXkoIG5hbWUubmFtZSApKQorCQkJd2hpbmUoICJjb25zdGFudCBuYW1lIiwgbmFtZS50b2tlbiApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVFbnVtKCBFbnVteCBlbnVteCApCisJeworCQlOYW1lIG5hbWUgPSBlbnVteC5uYW1lKCk7CisJCWlmICh3b3Jkcy5jb250YWluc0tleSggbmFtZS5uYW1lICkpCisJCQl3aGluZSggImVudW0gbmFtZSIsIG5hbWUudG9rZW4gKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9JdGVtKCBJdGVtIGl0ZW0gKQorCXsKKwkJTmFtZSBuYW1lID0gaXRlbS5uYW1lKCk7CisJCWlmICh3b3Jkcy5jb250YWluc0tleSggbmFtZS5uYW1lICkpCisJCQl3aGluZSggImVudW0gaXRlbSBuYW1lIiwgbmFtZS50b2tlbiApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVTdHJ1Y3QoIFN0cnVjdCBzdHJ1Y3QgKQorCXsKKwkJTmFtZSBuYW1lID0gc3RydWN0Lm5hbWUoKTsKKwkJaWYgKHdvcmRzLmNvbnRhaW5zS2V5KCBuYW1lLm5hbWUgKSkKKwkJCXdoaW5lKCAic3RydWN0IG5hbWUiLCBuYW1lLnRva2VuICk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvRXh0ZXJuKCBFeHRlcm4gZXh0ZXJuICkKKwl7CisJCU5hbWUgbmFtZSA9IGV4dGVybi5uYW1lKCk7CisJCWlmICh3b3Jkcy5jb250YWluc0tleSggbmFtZS5uYW1lICkpCisJCQl3aGluZSggImV4dGVybiBuYW1lIiwgbmFtZS50b2tlbiApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVFeGNlcHQoIEV4Y2VwdCBleGNlcHQgKQorCXsKKwkJTmFtZSBuYW1lID0gZXhjZXB0Lm5hbWUoKTsKKwkJaWYgKHdvcmRzLmNvbnRhaW5zS2V5KCBuYW1lLm5hbWUgKSkKKwkJCXdoaW5lKCAiZXhjZXB0aW9uIG5hbWUiLCBuYW1lLnRva2VuICk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByZU1lc3NhZ2UoIE1lc3NhZ2UgbWVzc2FnZSApCisJeworCQlOYW1lIG5hbWUgPSBtZXNzYWdlLm5hbWUoKTsKKwkJaWYgKHdvcmRzLmNvbnRhaW5zS2V5KCBuYW1lLm5hbWUgKSkKKwkJCXdoaW5lKCAibWVzc2FnZSBuYW1lIiwgbmFtZS50b2tlbiApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVQYXJhbWV0ZXIoIFBhcmFtZXRlciBwYXJhbWV0ZXIgKQorCXsKKwkJTmFtZSBuYW1lID0gcGFyYW1ldGVyLm5hbWUoKTsKKwkJaWYgKHdvcmRzLmNvbnRhaW5zS2V5KCBuYW1lLm5hbWUgKSkKKwkJCXdoaW5lKCAicGFyYW1ldGVyIG5hbWUiLCBuYW1lLnRva2VuICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdoaW5lKCBTdHJpbmcgd2hhdCwgVG9rZW4gdG9rZW4gKQorCXsKKwkJU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoICJFdGNoOiAlcyAnJXMnIGlzIGEgcmVzZXJ2ZWQgd29yZCBhdCBsaW5lICVkXG4iLCB3aGF0LCB0b2tlbi5pbWFnZSwgdG9rZW4uYmVnaW5MaW5lKTsKKwkJaWYgKHJld3JpdGUpCisJCQlsaC5yZXBvcnQoIExvZ0hhbmRsZXIuTEVWRUxfV0FSTklORywgdG9rZW4uYmVnaW5MaW5lLCBtc2cgKTsKKwkJZWxzZQorCQkJbGgucmVwb3J0KCBMb2dIYW5kbGVyLkxFVkVMX0VSUk9SLCB0b2tlbi5iZWdpbkxpbmUsIG1zZyApOworCQlvayA9IHJld3JpdGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1NlcnZpY2UuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxOGQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw1NjYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoQ29tcGlsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkV0Y2hHcmFtbWFyQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuVG9rZW47CisKKworCisvKioKKyAqIERlY2xhcmF0aW9uIG9mIGEgc2VydmljZSBmcm9tIHRoZSBldGNoIGlkbC4KKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2UgZXh0ZW5kcyBOYW1lZDxNb2R1bGU+IGltcGxlbWVudHMgT3B0TGlzdCwgSXRlcmFibGU8TmFtZWQ8Pz4+Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgc2VydmljZS4KKwkgKgorCSAqIEBwYXJhbSBtb2R1bGUKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBvcHRzCisJICovCisJcHVibGljIFNlcnZpY2UoIE1vZHVsZSBtb2R1bGUsIE5hbWUgbmFtZSwgTWFwPFN0cmluZywgT3B0PiBvcHRzICkKKwl7CisJCXN1cGVyKCBtb2R1bGUsIG5hbWUsIG9wdHMgKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB2bmFtZSggQmFja2VuZCBoZWxwZXIgKQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZnFuYW1lKCkKKwl7CisJCXJldHVybiBwYXJlbnQoKS5mcW5hbWUoKSArICcuJyArIG5hbWUoKS5uYW1lOworCX0KKwkKKy8vCUBPdmVycmlkZQorLy8JcHVibGljIEludGVnZXIgaWQoKQorLy8JeworLy8JCXJldHVybiBudWxsOworLy8JfQorCisJLyoqCisJICogQWRkcyBhIG1peGluIGRlY2xhcmF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBuCisJICogQHBhcmFtIG5PcHRzCisJICogQHJldHVybiB0aGUgYWRkZWQgbWl4aW4uCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBNaXhpbiBhZGRNaXhpbiggTmFtZSBuLCBNYXA8U3RyaW5nLCBPcHQ+IG5PcHRzICkKKwkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlvcHRzQ2hlY2soIE1peGluLmNsYXNzLCBuT3B0cyApOworCQkKKwkJdHJ5CisJCXsKKwkJCU1vZHVsZSBtb2R1bGUgPSBFdGNoQ29tcGlsZXIucGFyc2VNb2R1bGUoIHRoaXMsIG4sIG5PcHRzICk7CisJCQlpZiAobW9kdWxlID09IG51bGwpCisJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkiY291bGQgbm90IGZpbmQgbWl4aW4gJyVzJyBhdCBsaW5lICVkIiwKKwkJCQkJbi5uYW1lLCBuLnRva2VuLmJlZ2luTGluZSApICk7CisJCQkKKwkJCU1peGluIG1peGluID0gbmV3IE1peGluKCB0aGlzLCBuLCBuT3B0cywgbW9kdWxlICk7CisJCQluYW1lTGlzdC5hZGQoIG4sIG1peGluICk7CisJCQlyZXR1cm4gbWl4aW47CisJCX0KKwkJY2F0Y2ggKCBQYXJzZUV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgZTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJjb3VsZCBub3QgZmluZCBtaXhpbiAnJXMnIGF0IGxpbmUgJWQ6ICVzIiwKKwkJCQluLm5hbWUsIG4udG9rZW4uYmVnaW5MaW5lLCBlICkgKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBBZGRzIGEgY29uc3RhbnQgZGVjbGFyYXRpb24uCisJICogQHBhcmFtIG4KKwkgKiBAcGFyYW0gbk9wdHMKKwkgKiBAcGFyYW0gdHIKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHRoZSBhZGRlZCBjb25zdGFudC4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIENvbnN0YW50IGFkZENvbnN0YW50KCBOYW1lIG4sIE1hcDxTdHJpbmcsIE9wdD4gbk9wdHMsIFR5cGVSZWYgdHIsIFRva2VuIHZhbHVlICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQluYW1lTGlzdC5jaGVjayggbiApOworCQlvcHRzQ2hlY2soIENvbnN0YW50LmNsYXNzLCBuT3B0cyApOworCQlDb25zdGFudCBjID0gbmV3IENvbnN0YW50KCB0aGlzLCBuLCBuT3B0cywgdHIsIHZhbHVlICk7CisJCW5hbWVMaXN0LmFkZCggbiwgYyApOworCQlyZXR1cm4gYzsKKwl9CisKKwlwcml2YXRlIHZvaWQgb3B0c0NoZWNrKCBDbGFzczw/PiB0eXBlLCBNYXA8U3RyaW5nLCBPcHQ+IG5PcHRzICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlmb3IgKE9wdCBvcHQ6IG5PcHRzLnZhbHVlcygpKQorCQkJb3B0Q2hlY2soIHR5cGUsIG9wdCApOworCX0KKworCXByaXZhdGUgdm9pZCBvcHRDaGVjayggQ2xhc3M8Pz4gdHlwZSwgT3B0IG9wdCApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJb3B0LmNoZWNrKCB0eXBlICk7CisJfQorCisJLyoqCisJICogQWRkcyBhbiBlbnVtZXJhdGlvbiBkZWNsYXJhdGlvbi4KKwkgKiBAcGFyYW0gbgorCSAqIEBwYXJhbSBuT3B0cworCSAqIEByZXR1cm4gdGhlIGFkZGVkIGVudW14LgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgRW51bXggYWRkRW51bSggTmFtZSBuLCBNYXA8U3RyaW5nLCBPcHQ+IG5PcHRzICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQluYW1lTGlzdC5jaGVjayggbiApOworCQlvcHRzQ2hlY2soIEVudW14LmNsYXNzLCBuT3B0cyApOworCQlFbnVteCBlID0gbmV3IEVudW14KCB0aGlzLCBuLCBuT3B0cyApOworCQluYW1lTGlzdC5hZGQoIG4sIGUgKTsKKwkJcmV0dXJuIGU7CisJfQorCisJLyoqCisJICogQWRkcyBhIHN0cnVjdCBkZWNsYXJhdGlvbi4KKwkgKiBAcGFyYW0gbgorCSAqIEBwYXJhbSBuT3B0cworCSAqIEByZXR1cm4gdGhlIGFkZGVkIHN0cnVjdC4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cnVjdCBhZGRTdHJ1Y3QoIE5hbWUgbiwgTWFwPFN0cmluZywgT3B0PiBuT3B0cyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJbmFtZUxpc3QuY2hlY2soIG4gKTsKKwkJb3B0c0NoZWNrKCBTdHJ1Y3QuY2xhc3MsIG5PcHRzICk7CisJCVN0cnVjdCBzID0gbmV3IFN0cnVjdCggdGhpcywgbiwgbk9wdHMgKTsKKwkJbmFtZUxpc3QuYWRkKCBuLCBzICk7CisJCXJldHVybiBzOworCX0KKworCS8qKgorCSAqIEFkZHMgYW4gZXh0ZXJuIGRlY2xhcmF0aW9uLgorCSAqIEBwYXJhbSBuCisJICogQHBhcmFtIG5PcHRzCisJICogQHJldHVybiB0aGUgYWRkZWQgZXh0ZXJuLgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgRXh0ZXJuIGFkZEV4dGVybiggTmFtZSBuLCBNYXA8U3RyaW5nLCBPcHQ+IG5PcHRzICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQluYW1lTGlzdC5jaGVjayggbiApOworCQlvcHRzQ2hlY2soIEV4dGVybi5jbGFzcywgbk9wdHMgKTsKKwkJRXh0ZXJuIHMgPSBuZXcgRXh0ZXJuKCB0aGlzLCBuLCBuT3B0cyApOworCQluYW1lTGlzdC5hZGQoIG4sIHMgKTsKKwkJcmV0dXJuIHM7CisJfQorCisJLyoqCisJICogQWRkcyBhIGJ1aWx0LWluIGRlY2xhcmF0aW9uLgorCSAqIEBwYXJhbSBuCisJICogQHBhcmFtIGJpbmRpbmdOYW1lCisJICogQHBhcmFtIGFsbG93U3ViY2xhc3MKKwkgKiBAcmV0dXJuIHRoZSBCdWlsdGluIHRoYXQgd2FzIGFkZGVkLgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgQnVpbHRpbiBhZGRCdWlsdGluKCBOYW1lIG4sIFN0cmluZyBiaW5kaW5nTmFtZSwgYm9vbGVhbiBhbGxvd1N1YmNsYXNzICkKKwkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQluYW1lTGlzdC5jaGVjayggbiApOworCQlCdWlsdGluIGIgPSBuZXcgQnVpbHRpbiggdGhpcywgbiwgYmluZGluZ05hbWUsIGFsbG93U3ViY2xhc3MgKTsKKwkJbmFtZUxpc3QuYWRkKCBuLCBiICk7CisJCXJldHVybiBiOworCX0KKworCS8qKgorCSAqIEFkZHMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorCSAqIEBwYXJhbSBuCisJICogQHBhcmFtIG5PcHRzCisJICogQHJldHVybiB0aGUgYWRkZWQgZXhjZXB0aW9uLgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgRXhjZXB0IGFkZEV4Y2VwdCggTmFtZSBuLCBNYXA8U3RyaW5nLCBPcHQ+IG5PcHRzICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQluYW1lTGlzdC5jaGVjayggbiApOworCQlvcHRzQ2hlY2soIEV4Y2VwdC5jbGFzcywgbk9wdHMgKTsKKwkJRXhjZXB0IGUgPSBuZXcgRXhjZXB0KCB0aGlzLCBuLCBuT3B0cyApOworCQluYW1lTGlzdC5hZGQoIG4sIGUgKTsKKwkJcmV0dXJuIGU7CisJfQorCisJLyoqCisJICogQWRkcyBhIG1lc3NhZ2UgZGVjbGFyYXRpb24uCisJICogQHBhcmFtIG4KKwkgKiBAcGFyYW0gcnQKKwkgKiBAcGFyYW0gbk9wdHMKKwkgKiBAcmV0dXJuIHRoZSBhZGRlZCBtZXNzYWdlLgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTWVzc2FnZSBhZGRNZXNzYWdlKCBOYW1lIG4sIE1hcDxTdHJpbmcsIE9wdD4gbk9wdHMsIFR5cGVSZWYgcnQgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCW5hbWVMaXN0LmNoZWNrKCBuICk7CisJCW9wdHNDaGVjayggTWVzc2FnZS5jbGFzcywgbk9wdHMgKTsKKwkJTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoIHRoaXMsIG4sIG5PcHRzLCBydCApOworCQluYW1lTGlzdC5hZGQoIG4sIG0gKTsKKwkJCisJCWlmICghbS5pc09uZXdheSgpKQorCQkJYWRkUmVzdWx0TWVzc2FnZSggbSApOworCQllbHNlIGlmIChtLmhhc1JldHVybigpKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJPbmV3YXkgbWVzc2FnZSBjYW5ub3QgaGF2ZSBhIG5vbi12b2lkIHJldHVybiB0eXBlIGF0IGxpbmUgJWQiLCBuLnRva2VuLmJlZ2luTGluZSApICk7CisJCQorCQlyZXR1cm4gbTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHJlcU1zZworCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRSZXN1bHRNZXNzYWdlKCBNZXNzYWdlIHJlcU1zZyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaWYgKHJlcU1zZy5nZXRSZXN1bHRNZXNzYWdlKCkgIT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCU5hbWUgcm1OYW1lID0gcmVxTXNnLmdldFJlc3VsdE1lc3NhZ2VOYW1lKCk7CisKKwkJVG9rZW4gcm1UeXBlID0gbmV3IFRva2VuKCk7CisJCXJtVHlwZS5raW5kID0gRXRjaEdyYW1tYXJDb25zdGFudHMuVk9JRDsKKwkJcm1UeXBlLmltYWdlID0gInZvaWQiOworCQlUeXBlUmVmIHJtVHlwZVJlZiA9IG5ldyBUeXBlUmVmKCB0aGlzLCBybVR5cGUgKTsKKwkJCisJCW5hbWVMaXN0LmNoZWNrKCBybU5hbWUgKTsKKwkJTWVzc2FnZSBybSA9IG5ldyBNZXNzYWdlKCB0aGlzLCBybU5hbWUsIG5ldyBIYXNoTWFwPFN0cmluZywgT3B0PigpLAorCQkJcm1UeXBlUmVmICk7CisJCXJtLnNldE1zZ0RpciggZ2V0UmVzdWx0TWVzc2FnZURpcmVjdGlvbiggcmVxTXNnLm1zZ0RpcigpICkgKTsKKwkJbmFtZUxpc3QuYWRkKCBybU5hbWUsIHJtICk7CisJCQorCQlybS5hZGRQYXJhbWV0ZXIoIHJlcU1zZy5nZXRSZXN1bHRQYXJhbU5hbWUoKSwgcmVxTXNnLnR5cGUoKSApOworCQkKKwkJcmVxTXNnLnNldFJlc3VsdE1lc3NhZ2UoIHJtICk7CisJCXJtLnNldFJlcXVlc3RNZXNzYWdlKCByZXFNc2cgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWQKKwkgKiBAcmV0dXJuIG1lc3NhZ2UgZGlyZWN0aW9uIG9wcG9zaXRlIHRvIHRoZSBzdXBwbGllZCBtZXNzYWdlIGRpcmVjdGlvbi4KKwkgKi8KKwlwdWJsaWMgTWVzc2FnZURpcmVjdGlvbiBnZXRSZXN1bHRNZXNzYWdlRGlyZWN0aW9uKCBNZXNzYWdlRGlyZWN0aW9uIG1kICkKKwl7CisJCXN3aXRjaCAobWQpCisJCXsKKwkJCWNhc2UgQ0xJRU5UOiByZXR1cm4gTWVzc2FnZURpcmVjdGlvbi5TRVJWRVI7CisJCQljYXNlIFNFUlZFUjogcmV0dXJuIE1lc3NhZ2VEaXJlY3Rpb24uQ0xJRU5UOworCQkJY2FzZSBCT1RIOiByZXR1cm4gTWVzc2FnZURpcmVjdGlvbi5CT1RIOworCQkJZGVmYXVsdDogdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInVua25vd24gbWVzc2FnZSBkaXJlY3Rpb24gIittZCApOworCQl9CisJfQorCisJcHVibGljIEl0ZXJhdG9yPE5hbWVkPD8+PiBpdGVyYXRvcigpCisJeworCQlyZXR1cm4gbmFtZUxpc3QuaXRlcmF0b3IoKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHJlY3Vyc2l2ZSBpZiB0cnVlLCByZWN1cnNlIGludG8gbWl4ZWQgaW4gc2VydmljZXMsIHRvby4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBtZXRob2RzIG9mIHRoaXMgc2VydmljZS4KKwkgKi8KKwlwdWJsaWMgSXRlcmF0b3I8TmFtZWQ8Pz4+IG1lc3NhZ2VzKCBib29sZWFuIHJlY3Vyc2l2ZSApCisJeworCQlMaXN0PE5hbWVkPD8+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lZDw/Pj4oKTsKKwkJZ2V0TWVzc2FnZXMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZ2V0TWVzc2FnZXMoIExpc3Q8TmFtZWQ8Pz4+IGxpc3QsIGJvb2xlYW4gcmVjdXJzaXZlICkKKwl7CisJCWZvciAoTmFtZWQ8Pz4gbjogbmFtZUxpc3QpCisJCXsKKwkJCWlmIChuLmlzTWVzc2FnZSgpKQorCQkJCWxpc3QuYWRkKCBuICk7CisJCQllbHNlIGlmIChyZWN1cnNpdmUgJiYgbi5pc01peGluKCkpCisJCQkJKChNaXhpbikgbikuZ2V0TW9kdWxlKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWVzc2FnZXMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIHJlY3Vyc2l2ZSBpZiB0cnVlLCByZWN1cnNlIGludG8gbWl4ZWQgaW4gc2VydmljZXMsIHRvbworCSAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBhbGwgdGhlIHN0cnVjdHMgb2YgdGhpcyBzZXJ2aWNlCisJICovCisJcHVibGljIEl0ZXJhdG9yPE5hbWVkPD8+PiBzdHJ1Y3RzKCBib29sZWFuIHJlY3Vyc2l2ZSApCisJeworCQlMaXN0PE5hbWVkPD8+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lZDw/Pj4oKTsKKwkJZ2V0U3RydWN0cyggbGlzdCwgcmVjdXJzaXZlICk7CisJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBnZXRTdHJ1Y3RzKCBMaXN0PE5hbWVkPD8+PiBsaXN0LCBib29sZWFuIHJlY3Vyc2l2ZSApCisJeworCQlmb3IgKCBOYW1lZDw/PiBuOiBuYW1lTGlzdCApCisJCXsKKwkJCWlmICggbi5pc1N0cnVjdCgpICkKKwkJCQlsaXN0LmFkZChuKTsKKwkJCWVsc2UgaWYgKCByZWN1cnNpdmUgJiYgbi5pc01peGluKCkgKQorCQkJCSgoTWl4aW4pbikuZ2V0TW9kdWxlKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3RydWN0cyggbGlzdCwgcmVjdXJzaXZlICk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIHJlY3Vyc2l2ZSBpZiB0cnVlLCByZWN1cnNlIGludG8gbWl4ZWQgaW4gc2VydmljZXMsIHRvbworCSAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBhbGwgdGhlIGVudW1zIG9mIHRoaXMgc2VydmljZQorCSAqLworCXB1YmxpYyBJdGVyYXRvcjxOYW1lZDw/Pj4gZW51bXMoIGJvb2xlYW4gcmVjdXJzaXZlICkKKwl7CisJCUxpc3Q8TmFtZWQ8Pz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVkPD8+PigpOworCQlnZXRFbnVtcyggbGlzdCwgcmVjdXJzaXZlICk7CisJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBnZXRFbnVtcyggTGlzdDxOYW1lZDw/Pj4gbGlzdCwgYm9vbGVhbiByZWN1cnNpdmUgKQorCXsKKwkJZm9yICggTmFtZWQ8Pz4gbjogbmFtZUxpc3QgKQorCQl7CisJCQlpZiAoIG4uaXNFbnVteCgpICkKKwkJCQlsaXN0LmFkZChuKTsKKwkJCWVsc2UgaWYgKCByZWN1cnNpdmUgJiYgbi5pc01peGluKCkgKQorCQkJCSgoTWl4aW4pbikuZ2V0TW9kdWxlKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RW51bXMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSByZWN1cnNpdmUgaWYgdHJ1ZSwgcmVjdXJzZSBpbnRvIG1peGVkIGluIHNlcnZpY2VzLCB0b28KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBleHRlcm5zIG9mIHRoaXMgc2VydmljZQorCSAqLworCXB1YmxpYyBJdGVyYXRvcjxOYW1lZDw/Pj4gZXh0ZXJucyggYm9vbGVhbiByZWN1cnNpdmUgKQorCXsKKwkJTGlzdDxOYW1lZDw/Pj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZWQ8Pz4+KCk7CisJCWdldEV4dGVybnMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZ2V0RXh0ZXJucyggTGlzdDxOYW1lZDw/Pj4gbGlzdCwgYm9vbGVhbiByZWN1cnNpdmUgKQorCXsKKwkJZm9yICggTmFtZWQ8Pz4gbjogbmFtZUxpc3QgKQorCQl7CisJCQlpZiAoIG4uaXNFeHRlcm4oKSApCisJCQkJbGlzdC5hZGQobik7CisJCQllbHNlIGlmICggcmVjdXJzaXZlICYmIG4uaXNNaXhpbigpICkKKwkJCQkoKE1peGluKW4pLmdldE1vZHVsZSgpLml0ZXJhdG9yKCkubmV4dCgpLmdldEV4dGVybnMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSByZWN1cnNpdmUgaWYgdHJ1ZSwgcmVjdXJzZSBpbnRvIG1peGVkIGluIHNlcnZpY2VzLCB0b28KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBjb25zdGFudHMgb2YgdGhpcyBzZXJ2aWNlCisJICovCisJcHVibGljIEl0ZXJhdG9yPE5hbWVkPD8+PiBjb25zdGFudHMoIGJvb2xlYW4gcmVjdXJzaXZlICkKKwl7CisJCUxpc3Q8TmFtZWQ8Pz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVkPD8+PigpOworCQlnZXRDb25zdGFudHMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZ2V0Q29uc3RhbnRzKCBMaXN0PE5hbWVkPD8+PiBsaXN0LCBib29sZWFuIHJlY3Vyc2l2ZSApCisJeworCQlmb3IgKCBOYW1lZDw/PiBuOiBuYW1lTGlzdCApCisJCXsKKwkJCWlmICggbi5pc0NvbnN0YW50KCkgKQorCQkJCWxpc3QuYWRkKG4pOworCQkJZWxzZSBpZiAoIHJlY3Vyc2l2ZSAmJiBuLmlzTWl4aW4oKSApCisJCQkJKChNaXhpbiluKS5nZXRNb2R1bGUoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb25zdGFudHMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSByZWN1cnNpdmUgaWYgdHJ1ZSwgcmVjdXJzZSBpbnRvIG1peGVkIGluIHNlcnZpY2VzLCB0b28KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBleGNlcHRpb25zIG9mIHRoaXMgc2VydmljZQorCSAqLworCXB1YmxpYyBJdGVyYXRvcjxOYW1lZDw/Pj4gZXhjZXB0aW9ucyggYm9vbGVhbiByZWN1cnNpdmUgKQorCXsKKwkJTGlzdDxOYW1lZDw/Pj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZWQ8Pz4+KCk7CisJCWdldEV4Y2VwdGlvbnMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZ2V0RXhjZXB0aW9ucyggTGlzdDxOYW1lZDw/Pj4gbGlzdCwgYm9vbGVhbiByZWN1cnNpdmUgKQorCXsKKwkJZm9yICggTmFtZWQ8Pz4gbjogbmFtZUxpc3QgKQorCQl7CisJCQlpZiAoIG4uaXNFeGNlcHQoKSApCisJCQkJbGlzdC5hZGQobik7CisJCQllbHNlIGlmICggcmVjdXJzaXZlICYmIG4uaXNNaXhpbigpICkKKwkJCQkoKE1peGluKW4pLmdldE1vZHVsZSgpLml0ZXJhdG9yKCkubmV4dCgpLmdldEV4Y2VwdGlvbnMoIGxpc3QsIHJlY3Vyc2l2ZSApOworCQl9CisJfQorCQorCXByaXZhdGUgZmluYWwgTmFtZUxpc3Q8TmFtZWQ8Pz4+IG5hbWVMaXN0ID0gbmV3IE5hbWVMaXN0PE5hbWVkPD8+PigpOworCisJLyoqCisJICogQHBhcmFtIG1jCisJICogQHJldHVybiB0cnVlIGlmIHNvbWUgb2YgdGhhdCB0eXBlIGV4aXN0cy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlRGlyZWN0aW9uKCBNZXNzYWdlRGlyZWN0aW9uIG1jICkKKwl7CisJCWZvciAoTmFtZWQ8Pz4gbjogdGhpcykKKwkJeworCQkJLy9TeXN0ZW0ub3V0LnByaW50ZiggImhhc01lc3NhZ2VEaXJlY3Rpb24gKCVzKTogJXNcbiIsIG1jLCBuICk7CisJCQkKKwkJCWlmICghKG4gaW5zdGFuY2VvZiBNZXNzYWdlKSkKKwkJCXsKKwkJCQlpZiAobWMgPT0gTWVzc2FnZURpcmVjdGlvbi5CT1RIKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJTWVzc2FnZSBtID0gKE1lc3NhZ2UpIG47CisJCQlpZiAobS5tc2dEaXIoKSA9PSBtYyAmJiAhbS5pc0hpZGRlbigpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNzZXJ2aWNlICVzXG4iLCBpbmRlbnQsIG5hbWUoKSApOworCQkKKwkJU3RyaW5nIHNJbmRlbnQgPSBpbmRlbnQrIiAgIjsKKwkJCisJCWZvciAoU3RyaW5nIHM6IGRlc2NyKCkpCisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzZGVzY3IgJXNcbiIsIHNJbmRlbnQsIHMgKTsKKwkJCisJCWZvciAoT3B0IG86IG9wdHMoKSkKKwkJCW8uZHVtcCggc0luZGVudCApOworCQkKKwkJZm9yIChOYW1lZDw/PiBtOiB0aGlzKQorCQkJbS5kdW1wKCBzSW5kZW50ICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2hlY2soKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWNoZWNrVHlwZU5hbWUoIG5hbWUoKSApOworCQkKKwkJZm9yIChOYW1lZDw/PiBuOiB0aGlzKQorCQkJbi5jaGVjaygpOworCX0KKworCS8qKgorCSAqIEdldHMgdGhlIG5hbWVkIHRoaW5nIGZyb20gdGhlIHNlcnZpY2UuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBuYW1lZCB0aGluZywgb3IgbnVsbC4KKwkgKi8KKwlwdWJsaWMgTmFtZWQ8Pz4gZ2V0KCBTdHJpbmcgbmFtZSApCisJeworCQlMaXN0PE5hbWVkPD8+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lZDw/Pj4oKTsKKwkKKwkJTmFtZWQ8Pz4gbmFtZWQgPSBuYW1lTGlzdC5nZXQoIG5hbWUgKTsKKwkJaWYgKG5hbWVkICE9IG51bGwpCisJCXsKKwkJCS8qU3lzdGVtLm91dC5wcmludGxuKCAicmVzb2x2ZWQgdG8gIituYW1lZCApOworCQkJcmV0dXJuIG5hbWVkOyovCisJCQlsaXN0LmFkZChuYW1lZCk7CisJCX0KKwkJCisJCWlmIChpc1F1YWxpZmllZE5hbWUoIG5hbWUgKSkKKwkJeworCQkJU3RyaW5nIHggPSBnZXRTaW1wbGVOYW1lKCBuYW1lICk7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJ0cnlpbmcgIit4ICk7CisJCQluYW1lZCA9IG5hbWVMaXN0LmdldCggeCApOworCQkJaWYgKG5hbWVkICE9IG51bGwpCisJCQl7CisJCQkJU3RyaW5nIHkgPSBuYW1lZC5mcW5hbWUoKTsKKwkJCQlpZiAobmFtZS5lcXVhbHMoIHkgKSkKKwkJCQl7CisJCQkJCWxpc3QuYWRkKG5hbWVkKTsKKwkJCQl9CisJCQl9CisJCX0KKworCisJCWZvciAoTmFtZWQ8Pz4gbiA6IHRoaXMpCisJCXsKKwkJCWlmIChuLmlzTWl4aW4oKSkKKwkJCXsKKworCQkJCW5hbWVkID0gKChNaXhpbikgbikuZ2V0TW9kdWxlKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0KCBuYW1lICk7CisJCQkJCisJCQkJaWYgKG5hbWVkICE9IG51bGwpCisJCQkJLy8JcmV0dXJuIG5hbWVkOworCQkJCXsKKwkJCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKKwkJCQkJSXRlcmF0b3I8TmFtZWQ8Pz4+IGl0ID0gbGlzdC5pdGVyYXRvcigpOworCQkJCQl3aGlsZSAoIGl0Lmhhc05leHQoKSkKKwkJCQkJeworCQkJCQkJaWYgKCAoKE5hbWVkPD8+KWl0Lm5leHQoKSkuZnFuYW1lKCkuZXF1YWxzKCBuYW1lZC5mcW5hbWUoKSApICkKKwkJCQkJCXsKKwkJCQkJCQlleGlzdHMgPSB0cnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQlpZiAoICFleGlzdHMgKQorCQkJCQkJbGlzdC5hZGQobmFtZWQpOworCQkJCX0KKworCQkJfQorCQl9CisKKwkJaWYgKGxpc3Quc2l6ZSgpID09IDEgKQorCQkJcmV0dXJuIGxpc3QuZ2V0KCAwICk7CisKKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNRdWFsaWZpZWROYW1lKCBTdHJpbmcgbmFtZSApCisJeworCQlyZXR1cm4gbmFtZS5sYXN0SW5kZXhPZiggJy4nICkgPj0gMDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRTaW1wbGVOYW1lKCBTdHJpbmcgbmFtZSApCisJeworCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoIG5hbWUubGFzdEluZGV4T2YoICcuJyApKzEgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gd2Fsa2VyIGNhbGxlZCB3aXRoIGVhY2ggYW5kIGV2ZXJ5IG5vZGUgdW5kZXIgdGhpcyBvbmUuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdHJlZXdhbGsoIFRyZWVXYWxrZXIgd2Fsa2VyICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQl3YWxrZXIucHJlU2VydmljZSggdGhpcyApOworCQkKKwkJZm9yIChOYW1lZDw/PiBuOiB0aGlzKQorCQkJbi50cmVld2Fsayggd2Fsa2VyICk7CisJCQorCQl3YWxrZXIucG9zdFNlcnZpY2UoIHRoaXMgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvU3RydWN0LmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvU3RydWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlNWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9TdHJ1Y3QuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuQmFja2VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBBIHN0cnVjdCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBldGNoIGlkbC4KKyAqLworcHVibGljIGNsYXNzIFN0cnVjdCBleHRlbmRzIFBhcmFtTGlzdDxTZXJ2aWNlPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFN0cnVjdC4KKwkgKgorCSAqIEBwYXJhbSBpbnRmCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gb3B0cworCSAqLworCXB1YmxpYyBTdHJ1Y3QoIFNlcnZpY2UgaW50ZiwgTmFtZSBuYW1lLCBNYXA8U3RyaW5nLCBPcHQ+IG9wdHMgKQorCXsKKwkJc3VwZXIoIGludGYsIG5hbWUsIG9wdHMgKTsKKwkJCisJCW1vZHVsZU5hbWUgPSBpbnRmLnBhcmVudCgpLm5hbWUoKS5uYW1lOworCQlzZXJ2aWNlTmFtZSA9IGludGYubmFtZSgpLm5hbWU7CisJCXN0cnVjdE5hbWUgPSBuYW1lLm5hbWU7CisKKwkJZnFuYW1lID0gbW9kdWxlTmFtZSsnLicrc2VydmljZU5hbWUrJy4nK3N0cnVjdE5hbWU7CisJCXZuYW1lID0gZnFuYW1lLnJlcGxhY2UoICcuJywgJ18nICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWU7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWU7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RydWN0TmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB2bmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBmcW5hbWU7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHZuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gaGVscGVyLm10dm5hbWUoIHZuYW1lICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBmcW5hbWUoKQorCXsKKwkJcmV0dXJuIGZxbmFtZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBlZnFuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gaGVscGVyLmVudW1fZWZxbmFtZSggZnFuYW1lLCBtb2R1bGVOYW1lLCBzZXJ2aWNlTmFtZSwgc3RydWN0TmFtZSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJzdHJ1Y3QgJXMgKCVzKSIsIG5hbWUoKSwgZ2V0UGFyYW1ldGVycygpICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZHVtcCggU3RyaW5nIGluZGVudCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzc3RydWN0ICVzXG4iLCBpbmRlbnQsIG5hbWUoKSApOworCQkKKwkJU3RyaW5nIHNJbmRlbnQgPSBpbmRlbnQrIiAgIjsKKwkJCisJCWZvciAoU3RyaW5nIHM6IGRlc2NyKCkpCisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzZGVzY3IgJXNcbiIsIHNJbmRlbnQsIHMgKTsKKwkJCisJCWZvciAoUGFyYW1ldGVyIHA6IHRoaXMpCisJCQlwLmR1bXAoIHNJbmRlbnQgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjaGVjaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJY2hlY2tUeXBlTmFtZSggbmFtZSgpICk7CisJCQorCQlmb3IgKFBhcmFtZXRlciBwOiB0aGlzKQorCQkJcC5jaGVjaygpOworCQkKKwkJaWYgKGhhc0V4dGVuZHMoKSkKKwkJeworCQkJTmFtZWQ8Pz4gbiA9IHBhcmVudCgpLmdldCggeHRuZHMubmFtZSApOworCQkJCisJCQlpZiAobiA9PSBudWxsKQorCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJInN0cnVjdCAlcyBleHRlbmRzICVzIG5vdCBkZWZpbmVkIGF0IGxpbmUgJWQiLAorCQkJCQluYW1lKCksIHh0bmRzLm5hbWUoKSwgeHRuZHMudG9rZW4uYmVnaW5MaW5lICkgKTsKKwkJCQorCQkJaWYgKCEobiBpbnN0YW5jZW9mIFN0cnVjdCkpCisJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkic3RydWN0ICVzIGV4dGVuZHMgJXMgbm90IGEgc3RydWN0IGF0IGxpbmUgJWQiLAorCQkJCQluYW1lKCksIHh0bmRzLm5hbWUoKSwgeHRuZHMudG9rZW4uYmVnaW5MaW5lICkgKTsKKwkJCQorCQkJU3RydWN0IHMgPSB0aGlzOworCQkJd2hpbGUgKHMgIT0gbnVsbCAmJiBzLmhhc0V4dGVuZHMoKSkKKwkJCXsKKwkJCQlzID0gcy5nZXRFeHRlbmRzKCk7CisJCQkJaWYgKHMgPT0gdGhpcykKKwkJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkJInN0cnVjdCAlcyBleHRlbmRzICVzIGNyZWF0ZXMgbG9vcCBhdCBsaW5lICVkIiwKKwkJCQkJCW5hbWUoKSwgeHRuZHMubmFtZSgpLCB4dG5kcy50b2tlbi5iZWdpbkxpbmUgKSApOworCQkJfQorCQkJCisJCQlzID0gZ2V0RXh0ZW5kcygpOworCQkJZm9yIChQYXJhbWV0ZXIgcDogdGhpcykKKwkJCXsKKwkJCQlQYXJhbWV0ZXIgeCA9IHMuZ2V0UGFyYW1ldGVyKCBwLm5hbWUoKS5uYW1lICk7CisJCQkJaWYgKHggIT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkJInN0cnVjdCAlcyBleHRlbmRzICVzIGhpZGVzIHBhcmFtZXRlciAlcyBmcm9tICVzIGF0IGxpbmUgJWQiLAorCQkJCQkJbmFtZSgpLCB4dG5kcy5uYW1lKCksIHgubmFtZSgpLCB4LnBhcmVudCgpLm5hbWUoKSwKKwkJCQkJCXh0bmRzLnRva2VuLmJlZ2luTGluZSApICk7CisJCQl9CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoIFN0cmluZyBuICkKKwl7CisJCVBhcmFtZXRlciBwID0gc3VwZXIuZ2V0UGFyYW1ldGVyKCBuICk7CisJCWlmIChwID09IG51bGwgJiYgaGFzRXh0ZW5kcygpKQorCQkJcCA9IGdldEV4dGVuZHMoKS5nZXRQYXJhbWV0ZXIoIG4gKTsKKwkJcmV0dXJuIHA7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJjbGFzc2VzLgorCSAqIFRoZXkgYXJlIHJldHVybmVkIGluIGRlY2xhcmF0aW9uIG9yZGVyLCBzdGFydGluZyB3aXRoIHRob3NlIGZyb20gdGhlCisJICogYmFzZSBjbGFzcy4KKwkgKi8KKwlwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IGdldEFsbFBhcmFtZXRlcnMoKQorCXsKKwkJaWYgKGhhc0V4dGVuZHMoKSkKKwkJeworCQkJTGlzdDxQYXJhbWV0ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKKwkJCWxpc3QuYWRkQWxsKCBnZXRFeHRlbmRzKCkuZ2V0QWxsUGFyYW1ldGVycygpICk7CisJCQlsaXN0LmFkZEFsbCggZ2V0UGFyYW1ldGVycygpICk7CisJCQlyZXR1cm4gbGlzdDsKKwkJfQorCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzdHJ1Y3Qgb3IgYW55IGV4dGVuZGVkIHN0cnVjdCBoYXMgYSBwYXJhbWV0ZXIuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQW55UGFyYW1ldGVycygpCisJeworCQlyZXR1cm4gaGFzUGFyYW1ldGVycygpIHx8CisJCQloYXNFeHRlbmRzKCkgJiYgZ2V0RXh0ZW5kcygpLmhhc0FueVBhcmFtZXRlcnMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2VydmljZSBzZXJ2aWNlKCkKKwl7CisJCXJldHVybiBwYXJlbnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0cmVld2FsayggVHJlZVdhbGtlciB3YWxrZXIgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCXdhbGtlci5wcmVTdHJ1Y3QoIHRoaXMgKTsKKwkJCisJCWZvciAoUGFyYW1ldGVyIHA6IHRoaXMpCisJCQlwLnRyZWV3YWxrKCB3YWxrZXIgKTsKKwkJCisJCWlmIChoYXNFeHRlbmRzKCkpCisJCQlnZXRFeHRlbmRzKCkudHJlZXdhbGsoIHdhbGtlciApOworCQkKKwkJd2Fsa2VyLnBvc3RTdHJ1Y3QoIHRoaXMgKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgc3RydWN0IGV4dGVuZHMgYW5vdGhlci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbmRzKCkKKwl7CisJCXJldHVybiB4dG5kcyAhPSBudWxsOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3QgdGhhdCB0aGlzIG9uZSBleHRlbmRzIG9yIG51bGwuCisJICovCisJcHVibGljIFN0cnVjdCBnZXRFeHRlbmRzKCkKKwl7CisJCWlmICh4dG5kcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlyZXR1cm4gKFN0cnVjdCkgcGFyZW50KCkuZ2V0KCB4dG5kcy5uYW1lICk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZXh0ZW5kcyBhdHRyaWJ1dGUgb2YgdGhpcyBleGNlcHRpb24uCisJICogQHBhcmFtIHh0bmRzCisJICovCisJcHVibGljIHZvaWQgc2V0RXh0ZW5kcyggTmFtZSB4dG5kcyApCisJeworCQl0aGlzLnh0bmRzID0geHRuZHM7CisJfQorCQorCXByaXZhdGUgTmFtZSB4dG5kczsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9UaHJvd24uamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9UaHJvd24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg4YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1Rocm93bi5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5CYWNrZW5kOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoR3JhbW1hckNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBBIHRocm93biBleGNlcHRpb24gcmVmZXJlbmNlIGZyb20gdGhlIGV0Y2ggaWRsLgorICovCitwdWJsaWMgY2xhc3MgVGhyb3duIGV4dGVuZHMgTmFtZWQ8TWVzc2FnZT4KK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBUaHJvd24uCisJICoKKwkgKiBAcGFyYW0gbXRoZAorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHVibGljIFRocm93biggTWVzc2FnZSBtdGhkLCBOYW1lIG5hbWUgKQorCXsKKwkJc3VwZXIoIG10aGQsIG5hbWUsIG51bGwgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHZuYW1lKCBCYWNrZW5kIGhlbHBlciApCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGZxbmFtZSgpCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lZCBleGNlcHRpb24uCisJICovCisJcHVibGljIE5hbWVkPD8+IGdldE5hbWVkKCkKKwl7CisJCWlmIChuYW1lKCkudG9rZW4ua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5JRCAmJiBuYW1lKCkudG9rZW4ua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5RSUQpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBwYXJlbnQoKS5zZXJ2aWNlKCkuZ2V0KCBuYW1lKCkudG9rZW4uaW1hZ2UgKTsKKwl9CisJCisvLwlAT3ZlcnJpZGUKKy8vCXB1YmxpYyBJbnRlZ2VyIGlkKCkKKy8vCXsKKy8vCQlyZXR1cm4gbnVsbDsKKy8vCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIG5hbWUoKS5uYW1lOworCX0KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXN0aHJvd3MgJXNcbiIsIGluZGVudCwgbmFtZSgpICk7CisJCQorCQlTdHJpbmcgc0luZGVudCA9IGluZGVudCsiICAiOworCQkKKwkJZm9yIChTdHJpbmcgczogZGVzY3IoKSkKKwkJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNkZXNjciAlc1xuIiwgc0luZGVudCwgcyApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNoZWNrKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlOYW1lZDw/PiBuID0gZ2V0TmFtZWQoKTsKKwkJCisJCWlmIChuID09IG51bGwpCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJInVuZGVmaW5lZCBleGNlcHRpb24gJXMgYXQgbGluZSAlZCIsIG5hbWUoKS50b2tlbi5pbWFnZSwgbmFtZSgpLnRva2VuLmJlZ2luTGluZSApICk7CisKKwkJaWYgKCEobiBpbnN0YW5jZW9mIEV4Y2VwdCkpCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIiVzIG5vdCBhbiBleGNlcHRpb24gYXQgbGluZSAlZCIsIG5hbWUoKS50b2tlbi5pbWFnZSwgbmFtZSgpLnRva2VuLmJlZ2luTGluZSApICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdHJlZXdhbGsoIFRyZWVXYWxrZXIgd2Fsa2VyICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQl3YWxrZXIuZG9UaHJvd24oIHRoaXMgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9hc3QvVHJlZVdhbGtlci5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1RyZWVXYWxrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWFmZjNhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1RyZWVXYWxrZXIuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3Q7CisKKy8qKgorICogSW50ZXJmYWNlcyB1c2VkIGJ5IHRoZSB0cmVlIHdhbGtlciB0byByZXBvcnQgd2hhdCBpdCBmaW5kcy4KKyAqLworcHVibGljIGludGVyZmFjZSBUcmVlV2Fsa2VyCit7CisJLyoqCisJICogUmVwb3J0cyBhIG1vZHVsZSwgYmVmb3JlIHdlIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbW9kdWxlLgorCSAqIEBwYXJhbSBtb2R1bGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVNb2R1bGUoIE1vZHVsZSBtb2R1bGUgKTsKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGEgbW9kdWxlLCBhZnRlciB3ZSB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG1vZHVsZS4KKwkgKiBAcGFyYW0gbW9kdWxlCisJICovCisJcHVibGljIHZvaWQgcG9zdE1vZHVsZSggTW9kdWxlIG1vZHVsZSApOworCisJLyoqCisJICogUmVwb3J0cyBhIHNlcnZpY2UsIGJlZm9yZSB3ZSB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIHNlcnZpY2UuCisJICogQHBhcmFtIHNlcnZpY2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVTZXJ2aWNlKCBTZXJ2aWNlIHNlcnZpY2UgKTsKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGEgc2VydmljZSwgYWZ0ZXIgd2UgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBzZXJ2aWNlLgorCSAqIEBwYXJhbSBzZXJ2aWNlCisJICovCisJcHVibGljIHZvaWQgcG9zdFNlcnZpY2UoIFNlcnZpY2Ugc2VydmljZSApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYSBtaXhpbi4KKwkgKiBAcGFyYW0gbWl4aW4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkb01peGluKCBNaXhpbiBtaXhpbiApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYSBjb25zdGFudCwgYmVmb3JlIHdlIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgY29uc3RhbnQuCisJICogQHBhcmFtIGNvbnN0YW50CisJICovCisJcHVibGljIHZvaWQgcHJlQ29uc3RhbnQoIENvbnN0YW50IGNvbnN0YW50ICk7CisJCisJLyoqCisJICogUmVwb3J0cyBhIGNvbnN0YW50LCBhZnRlciB3ZSB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGNvbnN0YW50LgorCSAqIEBwYXJhbSBjb25zdGFudAorCSAqLworCXB1YmxpYyB2b2lkIHBvc3RDb25zdGFudCggQ29uc3RhbnQgY29uc3RhbnQgKTsKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGFuIGVudW0sIGJlZm9yZSB3ZSB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGVudW0uCisJICogQHBhcmFtIGVudW14CisJICovCisJcHVibGljIHZvaWQgcHJlRW51bSggRW51bXggZW51bXggKTsKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGFuIGVudW0sIGFmdGVyIHdlIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgZW51bS4KKwkgKiBAcGFyYW0gZW51bXgKKwkgKi8KKwlwdWJsaWMgdm9pZCBwb3N0RW51bSggRW51bXggZW51bXggKTsKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGFuIGl0ZW0gb2YgYW4gZW51bS4KKwkgKiBAcGFyYW0gaXRlbQorCSAqLworCXB1YmxpYyB2b2lkIGRvSXRlbSggSXRlbSBpdGVtICk7CisJCisJLyoqCisJICogUmVwb3J0cyBhIHN0cnVjdCwgYmVmb3JlIHdlIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgc3RydWN0LgorCSAqIEBwYXJhbSBzdHJ1Y3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVTdHJ1Y3QoIFN0cnVjdCBzdHJ1Y3QgKTsKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGEgc3RydWN0LCBhZnRlciB3ZSB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIHN0cnVjdC4KKwkgKiBAcGFyYW0gc3RydWN0CisJICovCisJcHVibGljIHZvaWQgcG9zdFN0cnVjdCggU3RydWN0IHN0cnVjdCApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYW4gZXh0ZXJuLgorCSAqIEBwYXJhbSBleHRlcm4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkb0V4dGVybiggRXh0ZXJuIGV4dGVybiApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYW4gZXhjZXB0LCBiZWZvcmUgd2UgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBleGNlcHQuCisJICogQHBhcmFtIGV4Y2VwdAorCSAqLworCXB1YmxpYyB2b2lkIHByZUV4Y2VwdCggRXhjZXB0IGV4Y2VwdCApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYW4gZXhjZXB0LCBhZnRlciB3ZSB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGV4Y2VwdC4KKwkgKiBAcGFyYW0gZXhjZXB0CisJICovCisJcHVibGljIHZvaWQgcG9zdEV4Y2VwdCggRXhjZXB0IGV4Y2VwdCApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYSBtZXNzYWdlLCBiZWZvcmUgd2UgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBtZXNzYWdlLgorCSAqIEBwYXJhbSBtZXNzYWdlCisJICovCisJcHVibGljIHZvaWQgcHJlTWVzc2FnZSggTWVzc2FnZSBtZXNzYWdlICk7CisJCisJLyoqCisJICogUmVwb3J0cyBhIG1lc3NhZ2UsIGFmdGVyIHdlIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbWVzc2FnZS4KKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqLworCXB1YmxpYyB2b2lkIHBvc3RNZXNzYWdlKCBNZXNzYWdlIG1lc3NhZ2UgKTsKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGEgcGFyYW1ldGVyLCBiZWZvcmUgd2UgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHBhcmFtZXRlcgorCSAqLworCXB1YmxpYyB2b2lkIHByZVBhcmFtZXRlciggUGFyYW1ldGVyIHBhcmFtZXRlciApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYSBwYXJhbWV0ZXIsIGFmdGVyIHdlIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgcGFyYW1ldGVyLgorCSAqIEBwYXJhbSBwYXJhbWV0ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBwb3N0UGFyYW1ldGVyKCBQYXJhbWV0ZXIgcGFyYW1ldGVyICk7CisJCisJLyoqCisJICogUmVwb3J0cyBhIHRocm93biBleGNlcHRpb24gb2YgYSBtZXNzYWdlLgorCSAqIEBwYXJhbSB0aHJvd24KKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1Rocm93biggVGhyb3duIHRocm93biApOworCQorCS8qKgorCSAqIFJlcG9ydHMgYSB0eXBlIHJlZmVyZW5jZS4KKwkgKiBAcGFyYW0gcmVmCisJICovCisJcHVibGljIHZvaWQgZG9UeXBlUmVmKCBUeXBlUmVmIHJlZiApOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvYXN0L1R5cGVSZWYuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9UeXBlUmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmZGJlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL2FzdC9UeXBlUmVmLmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkV0Y2hHcmFtbWFyQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuVG9rZW47CisKKy8qKgorICogQSB0eXBlIHJlZmVyZW5jZSBmcm9tIHRoZSBldGNoIGlkbC4KKyAqLworcHVibGljIGNsYXNzIFR5cGVSZWYKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBUeXBlUmVmLgorCSAqIEBwYXJhbSBpbnRmIAorCSAqCisJICogQHBhcmFtIHR5cGUKKwkgKi8KKwlwdWJsaWMgVHlwZVJlZiggU2VydmljZSBpbnRmLCBUb2tlbiB0eXBlICkKKwl7CisJCXRoaXMuaW50ZiA9IGludGY7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCQorCXByaXZhdGUgZmluYWwgU2VydmljZSBpbnRmOworCQorCXByaXZhdGUgZmluYWwgVG9rZW4gdHlwZTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoaXMgcmVmZXJlbmNlLgorCSAqLworCXB1YmxpYyBTZXJ2aWNlIGludGYoKQorCXsKKwkJcmV0dXJuIGludGY7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHRva2VuIG9mIHRoZSB0eXBlLgorCSAqLworCXB1YmxpYyBUb2tlbiB0eXBlKCkKKwl7CisJCXJldHVybiB0eXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIG9mIGFuIGFycmF5IHR5cGUuCisJICogQHBhcmFtIGQgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIG9mIGFuIGFycmF5IHR5cGUuCisJICovCisJcHVibGljIHZvaWQgc2V0RGltKCBpbnQgZCApCisJeworCQlkaW0gPSBkOworCX0KKwkKKwlwcml2YXRlIGludCBkaW07CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIHR5cGUuaW1hZ2UgKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW07IGkrKykKKwkJCXNiLmFwcGVuZCggIltdIiApOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGkKKwkgKiBAcmV0dXJuIHRoZSBuYW1lZCB0eXBlLgorCSAqLworCXB1YmxpYyBOYW1lZDw/PiBnZXROYW1lZCggU2VydmljZSBpICkKKwl7CisJCWlmIChpc0J1aWx0aW4oKSkKKwkJCXJldHVybiBudWxsOworCQkKKwkJcmV0dXJuIGkuZ2V0KCB0eXBlLmltYWdlICk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHRoZSByZWZlcmVuY2VkIHR5cGUgdG8gbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuCisJICogQHBhcmFtIGkKKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgY2hlY2soIFNlcnZpY2UgaSApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaWYgKGlzQnVpbHRpbigpKQorCQkJcmV0dXJuOworCisJCU5hbWVkPD8+IG4gPSBnZXROYW1lZCggaSApOworCQkKKwkJaWYgKG4gPT0gbnVsbCkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkidW5kZWZpbmVkIG9yIGFtYmlndW91cyB0eXBlICVzIGF0IGxpbmUgJWQiLCB0eXBlLmltYWdlLCB0eXBlLmJlZ2luTGluZSApICk7CisKKwkJaWYgKG4gaW5zdGFuY2VvZiBFbnVteCkKKwkJCXJldHVybjsKKwkJCisJCWlmIChuIGluc3RhbmNlb2YgU3RydWN0KQorCQkJcmV0dXJuOworCQkKKwkJaWYgKG4gaW5zdGFuY2VvZiBFeHRlcm4pCisJCQlyZXR1cm47CisJCQorCQlpZiAobiBpbnN0YW5jZW9mIEJ1aWx0aW4pCisJCQlyZXR1cm47CisJCQorCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkiJXMgbm90IGEgdHlwZSBhdCBsaW5lICVkIiwgdHlwZS5pbWFnZSwgdHlwZS5iZWdpbkxpbmUgKSApOworCX0KKwkKKwkvKioKKwkgKiBDYWxsIHRoZSB0cmVlIHdhbGtlciBvbiBvdXIgc3ViLWVsZW1lbnRzLgorCSAqIEBwYXJhbSB3YWxrZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCB0cmVld2FsayggVHJlZVdhbGtlciB3YWxrZXIgKQorCXsKKwkJd2Fsa2VyLmRvVHlwZVJlZiggdGhpcyApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlZCB0eXBlIGlzIGJ1aWx0aW4gKGN1cnJlbnRseSBhbGwgYnVpbHRpbnMKKwkgKiB1c2Uga2V5d29yZHMgdG8gcmVmZXJlbmNlIHRoZW0pLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQnVpbHRpbigpCisJeworCQlyZXR1cm4gdHlwZS5raW5kICE9IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklECisJCQkmJiB0eXBlLmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuUUlEOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoaXMgdHlwZSByZWZlcmVuY2UuCisJICovCisJcHVibGljIGludCBkaW0oKQorCXsKKwkJcmV0dXJuIGRpbTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIHJlZmVyZW5jZSBpcyBhbiBhcnJheS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkKKwl7CisJCXJldHVybiBkaW0gPiAwOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIHJlZmVyZW5jZSBpcyBhIHNjYWxhciBib29sZWFuLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhbigpCisJeworCQlyZXR1cm4gdHlwZS5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJPT0xFQU4gJiYgIWlzQXJyYXkoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIHJlZmVyZW5jZSBpcyBhIHNjYWxhciBpbnRlZ3JhbCB0eXBlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZWdyYWwoKQorCXsKKwkJaWYgKGlzQXJyYXkoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAodHlwZS5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEUpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCWlmICh0eXBlLmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuU0hPUlQpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCWlmICh0eXBlLmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuSU5UKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlpZiAodHlwZS5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkxPTkcpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIHJlZmVyZW5jZSBpcyBhIHNjYWxhciBmbG9hdGluZyB0eXBlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmxvYXRpbmcoKQorCXsKKwkJaWYgKGlzQXJyYXkoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAodHlwZS5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlpZiAodHlwZS5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkRPVUJMRSkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgcmVmZXJlbmNlIGlzIGEgc2NhbGFyIHN0cmluZyB0eXBlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3RyaW5nKCkKKwl7CisJCWlmIChpc0FycmF5KCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKHR5cGUua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkcpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSByZWZlcmVuY2UgaXMgYSBzY2FsYXIgb2JqZWN0IHR5cGUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNPYmplY3QoKQorCXsKKwkJaWYgKGlzQXJyYXkoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAodHlwZS5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLk9CSkVDVCkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9Bc3luY1JlY2VpdmVyLmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9vcHQvQXN5bmNSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YmNlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9vcHQvQXN5bmNSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkV0Y2hHcmFtbWFyQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5Bc3luY1JlY2VpdmVyTW9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuT3B0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuU2VydmljZTsKKworCisvKioKKyAqIE9wdGlvbiB3aGljaCBzZXRzIHRoZSBhc3luYyBtb2RlIG9mIHRoZSBtZXNzYWdlIHJlY2VpdmVyLgorICovCitwdWJsaWMgY2xhc3MgQXN5bmNSZWNlaXZlciBleHRlbmRzIE9wdAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEFzeW5jUmVjZWl2ZXIuCisJICoKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisJcHVibGljIEFzeW5jUmVjZWl2ZXIoIE5hbWUgbmFtZSwgVG9rZW4uLi4gYXJncyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIG5hbWUubmFtZSwgbmFtZS50b2tlbi5iZWdpbkxpbmUgKTsKKwkJYWRkVHlwZSggTWVzc2FnZS5jbGFzcyApOworCQlhZGRUeXBlKCBTZXJ2aWNlLmNsYXNzICk7CisJCQorCQlpZiAoYXJncy5sZW5ndGggIT0gMSkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCggIkFzeW5jUmVjZWl2ZXIgYXJncyBsZW5ndGggIT0gMSIgKSApOworCQkKKwkJVG9rZW4gYXJnID0gYXJnc1swXTsKKwkJaWYgKGFyZy5raW5kICE9IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklEKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KCAiQXN5bmNSZWNlaXZlciBhcmcgc2hvdWxkIGJlIGlkZW50aWZpZXI6ICIrYXJnLmltYWdlICkgKTsKKwkJCisJCXRyeQorCQl7CisJCQlBc3luY1JlY2VpdmVyTW9kZSBtID0gQXN5bmNSZWNlaXZlck1vZGUudmFsdWVPZiggYXJnLmltYWdlLnRvVXBwZXJDYXNlKCkgKTsKKwkJCWlmIChtID09IEFzeW5jUmVjZWl2ZXJNb2RlLlBPT0wpCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGYoCisJCQkJCSJXQVJOSU5HOiBkZXByZWNhdGVkIEFzeW5jUmVjZWl2ZXIgbW9kZSBQT09MIHNob3VsZCBiZSBjaGFuZ2VkIHRvIFFVRVVFRCBhdCBsaW5lICVkXG4iLAorCQkJCQlhcmcuYmVnaW5MaW5lICk7CisJCQkJbSA9IEFzeW5jUmVjZWl2ZXJNb2RlLlFVRVVFRDsKKwkJCX0KKwkJCW1vZGUgPSBtOworCQl9CisJCWNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIkFzeW5jUmVjZWl2ZXIgYXJnIHNob3VsZCBiZSBvbmUgb2Y6ICIrRW51bVNldC5hbGxPZiggQXN5bmNSZWNlaXZlck1vZGUuY2xhc3MgKSApICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBBc3luY1JlY2VpdmVyTW9kZSBtb2RlOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZHVtcCggU3RyaW5nIGluZGVudCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzQEFzeW5jUmVjZWl2ZXIoICVzIClcbiIsIGluZGVudCwgbW9kZSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJAQXN5bmNSZWNlaXZlciggJXMgKSIsIG1vZGUgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhc3luYyByZWNlaXZlciBtb2RlLgorCSAqLworCXB1YmxpYyBBc3luY1JlY2VpdmVyTW9kZSBnZXRNb2RlKCkKKwl7CisJCXJldHVybiBtb2RlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9BdXRob3JpemUuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9BdXRob3JpemUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTg3ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L0F1dGhvcml6ZS5qYXZhCkBAIC0wLDAgKzEsNzgwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoR3JhbW1hckNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5FbnVteDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lkl0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWVkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuT3B0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlN0cnVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlR5cGVSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuU3RyaW5nVXRpbDsKKworCisvKioKKyAqIE9wdGlvbiB3aGljaCBzZXRzIHRoZSBhdXRob3JpemF0aW9uIG1ldGhvZCBmb3IgYSBtZXNzYWdlLgorICovCitwdWJsaWMgY2xhc3MgQXV0aG9yaXplIGV4dGVuZHMgT3B0Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQXV0aG9yaXplLgorCSAqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgQXV0aG9yaXplKCBOYW1lIG5hbWUsIFRva2VuLi4uIGFyZ3MgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBuYW1lLm5hbWUsIG5hbWUudG9rZW4uYmVnaW5MaW5lICk7CisJCWFkZFR5cGUoIE1lc3NhZ2UuY2xhc3MgKTsKKwkJYWRkVHlwZSggU2VydmljZS5jbGFzcyApOworCQkKKwkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA9PSAwKQorCQl7CisJCQltZXRob2QgPSBuZXcgVG9rZW4oKTsKKwkJCW1ldGhvZC5raW5kID0gRXRjaEdyYW1tYXJDb25zdGFudHMuVFJVRTsKKwkJCW1ldGhvZC5iZWdpbkxpbmUgPSBuYW1lLnRva2VuLmJlZ2luTGluZTsKKwkJCWFyZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PEF1dGhBcmc+KCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCW1ldGhvZCA9IGFyZ3NbMF07CisJCWlmIChtZXRob2Qua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5JRCAmJgorCQkJCW1ldGhvZC5raW5kICE9IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlRSVUUgJiYKKwkJCQltZXRob2Qua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5GQUxTRSkKKwkJeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJBdXRob3JpemUgbWV0aG9kIHNob3VsZCBiZSBpZGVudGlmaWVyLCB0cnVlLCBvciBmYWxzZSAoYnV0IG5vdCAlcykgYXQgbGluZSAlZCIsCisJCQkJbWV0aG9kLCBtZXRob2QuYmVnaW5MaW5lICkgKTsKKwkJfQorCQkKKwkJaWYgKChtZXRob2Qua2luZCA9PSBFdGNoR3JhbW1hckNvbnN0YW50cy5UUlVFIHx8CisJCQkJbWV0aG9kLmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuRkFMU0UpICYmIGFyZ3MubGVuZ3RoID4gMSkKKwkJeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJBdXRob3JpemUgJWQgY2Fubm90IGhhdmUgYW55IGFyZ3MgYXQgbGluZSAlZCIsCisJCQkJbWV0aG9kLCBtZXRob2QuYmVnaW5MaW5lICkgKTsKKwkJfQorCisJCWFyZ0xpc3QgPSBhcmdzVG9BcmdMaXN0KCBhcmdzICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgVG9rZW4gbWV0aG9kOworCQorCXByaXZhdGUgZmluYWwgTGlzdDxBdXRoQXJnPiBhcmdMaXN0OworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGF1dGhvcml6YXRpb24gbWV0aG9kLgorCSAqLworCXB1YmxpYyBUb2tlbiBtZXRob2QoKQorCXsKKwkJcmV0dXJuIG1ldGhvZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNAQXV0aG9yaXplKCAlcywgJXMgKVxuIiwgaW5kZW50LCBtZXRob2QsIGFyZ0xpc3QgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiQEF1dGhvcml6ZSggJXMsICVzICkiLCBtZXRob2QsIGFyZ0xpc3QgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGFyZ3MgYXMgYSBsaXN0LgorCSAqLworCXByaXZhdGUgTGlzdDxBdXRoQXJnPiBhcmdzVG9BcmdMaXN0KCBUb2tlbltdIGFyZ3MgKQorCXsKKwkJTGlzdDxBdXRoQXJnPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxBdXRoQXJnPigpOworCQlpbnQgbiA9IGFyZ3MubGVuZ3RoOworCQlmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykKKwkJCWxpc3QuYWRkKCBuZXcgQXV0aEFyZyggYXJnc1tpXSApICk7CisJCXJldHVybiBsaXN0OworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhcmdzIGZvciB0aGUgYXV0aG9yaXphdGlvbiBtZXRob2QuCisJICovCisJcHVibGljIExpc3Q8QXV0aEFyZz4gYXJncygpCisJeworCQlyZXR1cm4gYXJnTGlzdDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgbmVlZHMgYXV0aG9yaXphdGlvbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNBdXRoKCkKKwl7CisJCXJldHVybiBtZXRob2QgIT0gbnVsbCAmJiBtZXRob2Qua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5UUlVFOworCX0KKworCS8qKgorCSAqIENoZWNrcyB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZCBieSBhdXRob3JpemUgdG8gbWFrZSBzdXJlIGl0IGlzCisJICogYSBzZXJ2aWNlIG1ldGhvZCBhbmQgdGhhdCB0aGUgcGFyYW1ldGVycyBhcmUgY29ycmVjdC4KKwkgKiBAcGFyYW0gc2VydmljZSBvdXIgc2VydmljZSBkZWZpbml0aW9uCisJICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSBiZWluZyBwcm90ZWN0ZWQgYnkgdGhlIGF1dGgKKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgY2hlY2soIFNlcnZpY2Ugc2VydmljZSwgTWVzc2FnZSBtc2cgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWlmICghaGFzQXV0aCgpKQorCQkJcmV0dXJuOworCQkKKwkJaWYgKGlzTWV0aG9kVHJ1ZSgpIHx8IGlzTWV0aG9kRmFsc2UoKSkKKwkJCXJldHVybjsKKwkJCisJCU5hbWVkPD8+IG5hbWVkID0gc2VydmljZS5nZXQoIG1ldGhvZC5pbWFnZSApOworCQlpZiAobmFtZWQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiQXV0aG9yaXplIG1ldGhvZCBuYW1lICVzIGlzIG5vdCBkZWZpbmVkIGF0ICVkIiwKKwkJCQkJbWV0aG9kLmltYWdlLCBsaW5lbm8oKSApICk7CisJCQorCQlpZiAoIW5hbWVkLmlzTWVzc2FnZSgpKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJBdXRob3JpemUgbWV0aG9kIG5hbWUgJXMgaXMgbm90IGEgbWV0aG9kIGF0ICVkIiwKKwkJCQltZXRob2QuaW1hZ2UsIGxpbmVubygpICkgKTsKKwkJCisJCU1lc3NhZ2UgYXV0aE1zZyA9IChNZXNzYWdlKSBuYW1lZDsKKwkJCisJCWlmIChhdXRoTXNnLnR5cGUoKS50eXBlKCkua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5CT09MRUFOKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJBdXRob3JpemUgbWV0aG9kICVzIHJlc3VsdCB0eXBlIGlzIG5vdCBib29sZWFuIGF0ICVkIiwKKwkJCQltZXRob2QuaW1hZ2UsIGxpbmVubygpICkgKTsKKwkJCisJCUxpc3Q8UGFyYW1ldGVyPiBhdXRoUGFyYW1zID0gYXV0aE1zZy5nZXRQYXJhbWV0ZXJzKCk7CisJCWlmIChhdXRoUGFyYW1zLnNpemUoKSAhPSBhcmdMaXN0LnNpemUoKSkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiQXV0aG9yaXplIG1ldGhvZCAlcyBwYXJhbWV0ZXIgbGlzdCBzaXplIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2Ygc3VwcGxpZWQgYXJndW1lbnRzIGF0ICVkIiwKKwkJCQltZXRob2QuaW1hZ2UsIGxpbmVubygpICkgKTsKKwkJCisJCWludCBuID0gYXJnTGlzdC5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQl7CisJCQlQYXJhbWV0ZXIgcGFyYW0gPSBhdXRoUGFyYW1zLmdldCggaSApOworCQkJQXV0aEFyZyBhYXJnID0gYXJnTGlzdC5nZXQoIGkgKTsKKwkJCWFhcmcuc2V0VHlwZSggcGFyYW0udHlwZSgpICk7CisJCQlUb2tlbiBhcmcgPSBhYXJnLnZhbHVlKCk7CisJCQkKKy8vCQkJU3lzdGVtLm91dC5wcmludGYoICJhdXRoIG1ldGhvZCAlcyBwYXJhbSAlcyA9ICVzXG4iLAorLy8JCQkJbWV0aG9kLCBwYXJhbS5uYW1lKCksIGFyZyApOworCQkJCisJCQlzd2l0Y2ggKGFyZy5raW5kKQorCQkJeworCQkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuTlVMTDoKKwkJCQkJLy8gYW55IHBhcmFtZXRlciB2YWx1ZSBtYXkgYmUgc3BlY2lmaWVkIGFzIG51bGwuLi4KKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5JRDoKKwkJCQkJLy8gYXJnIGlzIHJlZmVyZW5jaW5nIGVpdGhlciBhIHBhcmFtZXRlciBvZiBtc2cgb3IgYQorCQkJCQkvLyBzZXJ2aWNlIGNvbnN0YW50LgorCQkJCQljaGVja01zZ1BhcmFtT3JTZXJ2aWNlQ29uc3QoIG1zZywgcGFyYW0sIGFyZywgaSApOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlFJRDoKKwkJCQkJLy8gYXJnIGlzIHJlZmVyZW5jaW5nIGFuIGVudW0gaXRlbSAoZW51bS5pdGVtKSBvcgorCQkJCQkvLyBjb3VsZCBiZSB0cnlpbmcgdG8gcmVmZXJlbmNlIGEgZmllbGQgb2YgYQorCQkJCQkvLyBwYXJhbWV0ZXIgb2YgbWVzc2FnZSAocGFyYW0oLmZpZWxkKSspLgorCQkJCQljaGVja01zZ1BhcmFtRmllbGRSZWZPckVudW1JdGVtKCBtc2csIHBhcmFtLCBhcmcsIGkgKTsKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5UUlVFOgorCQkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRkFMU0U6CisJCQkJCS8vIGFyZyBpcyBhIGJvb2xlYW4gY29uc3RhbnQgdGhlIHBhcmFtZXRlciBiZXR0ZXIgYmUKKwkJCQkJLy8gYm9vbGVhbiwgdG9vLgorCQkJCQljaGVja0Jvb2xlYW5Db25zdGFudCggcGFyYW0sIGFyZywgaSApOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVEVHRVI6CisJCQkJCS8vIGFyZyBpcyBhbiBpbnRlZ2VyIGNvbnN0YW50LCB0aGUgcGFyYW1ldGVyIGJldHRlcgorCQkJCQkvLyBiZSBhbiBpbnRlZ3JhbCBvciBmbG9hdGluZyB0eXBlIGFuZCBhcmcgYmV0dGVyCisJCQkJCS8vIGJlIHRoZSByaWdodCBzaXplLi4uCisJCQkJCWNoZWNrSW50ZWdlckNvbnN0YW50KCBwYXJhbSwgYXJnLCBpICk7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuT0NUQUw6CisJCQkJCS8vIGFyZyBpcyBhbiBvY3RhbCBjb25zdGFudCwgdGhlIHBhcmFtZXRlciBiZXR0ZXIKKwkJCQkJLy8gYmUgYW4gaW50ZWdyYWwgb3IgZmxvYXRpbmcgdHlwZSBhbmQgYXJnIGJldHRlcgorCQkJCQkvLyBiZSB0aGUgcmlnaHQgc2l6ZS4uLgorCQkJCQljaGVja09jdGFsQ29uc3RhbnQoIHBhcmFtLCBhcmcsIGkgKTsKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5IRVg6CisJCQkJCS8vIGFyZyBpcyBhIGhleCBjb25zdGFudCwgdGhlIHBhcmFtZXRlciBiZXR0ZXIKKwkJCQkJLy8gYmUgYW4gaW50ZWdyYWwgb3IgZmxvYXRpbmcgdHlwZSBhbmQgYXJnIGJldHRlcgorCQkJCQkvLyBiZSB0aGUgcmlnaHQgc2l6ZS4uLgorCQkJCQljaGVja0hleENvbnN0YW50KCBwYXJhbSwgYXJnLCBpICk7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQklOQVJZOgorCQkJCQkvLyBhcmcgaXMgYSBiaW5hcnkgY29uc3RhbnQsIHRoZSBwYXJhbWV0ZXIgYmV0dGVyCisJCQkJCS8vIGJlIGFuIGludGVncmFsIG9yIGZsb2F0aW5nIHR5cGUgYW5kIGFyZyBiZXR0ZXIKKwkJCQkJLy8gYmUgdGhlIHJpZ2h0IHNpemUuLi4KKwkJCQkJY2hlY2tCaW5hcnlDb25zdGFudCggcGFyYW0sIGFyZywgaSApOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkRFQ0lNQUw6CisJCQkJCS8vIGFyZyBpcyBhIGRlY2ltYWwgY29uc3RhbnQsIHRoZSBwYXJhbWV0ZXIgYmV0dGVyCisJCQkJCS8vIGJlIGEgZmxvYXRpbmcgdHlwZSBhbmQgYXJnIGJldHRlciBiZSB0aGUgcmlnaHQKKwkJCQkJLy8gc2l6ZS4uLgorCQkJCQljaGVja0RlY2ltYWxDb25zdGFudCggcGFyYW0sIGFyZywgaSApOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUjoKKwkJCQkJLy8gYXJnIGlzIGEgc3RyaW5nIGNvbnN0YW50IHRoZSBwYXJhbWV0ZXIgYmV0dGVyIGJlCisJCQkJCS8vIHN0cmluZywgdG9vLgorCQkJCQljaGVja1N0cmluZ0NvbnN0YW50KCBwYXJhbSwgYXJnLCBpICk7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWRlZmF1bHQ6CisJCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCSJBdXRob3JpemUgbWV0aG9kICVzIGFyZyAlZCB1bnN1cHBvcnRlZCBraW5kICglcykgYXQgbGluZSAlZCIsCisJCQkJCQltZXRob2QuaW1hZ2UsIGkrMSwgYXJnLCBsaW5lbm8oKSApICk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBmYWxzZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEZhbHNlKCkKKyAgICB7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCAiaXNNZXRob2RGYWxzZSgpID0+ICIrKG1ldGhvZC5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZBTFNFKSApOworCSAgICByZXR1cm4gbWV0aG9kLmtpbmQgPT0gRXRjaEdyYW1tYXJDb25zdGFudHMuRkFMU0U7CisgICAgfQorCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgaXMgdHJ1ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFRydWUoKQorICAgIHsKKwkgICAgcmV0dXJuIG1ldGhvZC5raW5kID09IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlRSVUU7CisgICAgfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrTXNnUGFyYW1PclNlcnZpY2VDb25zdCggTWVzc2FnZSBtc2csIFBhcmFtZXRlciBwYXJhbSwKKwkJVG9rZW4gYXJnLCBpbnQgYXJnTm8gKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCVBhcmFtZXRlciBwID0gbXNnLmdldFBhcmFtZXRlciggYXJnLmltYWdlICk7CisJCWlmIChwICE9IG51bGwpCisJCXsKKwkJCS8vIGl0J3MgYSBwYXJhbWV0ZXIsIGRvIHRoZSB0eXBlcyBtYXRjaD8KKwkJCQorCQkJTmFtZWQ8Pz4gcHQgPSBwLnR5cGUoKS5nZXROYW1lZCggbXNnLnBhcmVudCgpICk7CisJCQlOYW1lZDw/PiBwYXJhbVR5cGUgPSBwYXJhbS50eXBlKCkuZ2V0TmFtZWQoIG1zZy5wYXJlbnQoKSApOworCQkJaWYgKHB0ID09IHBhcmFtVHlwZSkKKwkJCQlyZXR1cm47CisJCQkKKwkJCXRocm93IHR5cGVNaXNtYXRjaCggcGFyYW0sIGFyZywgYXJnTm8gKTsKKwkJfQorCQkKKwkJTmFtZWQ8Pz4gbmFtZWQgPSBtc2cucGFyZW50KCkuZ2V0KCBhcmcuaW1hZ2UgKTsKKwkJCisJCWlmIChuYW1lZCAhPSBudWxsKQorCQl7CisJCQkvLyBpdCdzIGEgbmFtZWQgdGhpbmcsIGl0IGlzIGEgY29uc3RhbnQgYW5kIGRvIHRoZQorCQkJLy8gdHlwZXMgbWF0Y2g/CisJCQkKKwkJCWlmIChuYW1lZC5pc0NvbnN0YW50KCkpCisJCQl7CisJCQkJQ29uc3RhbnQgYyA9IChDb25zdGFudCkgbmFtZWQ7CisJCQkJCisJCQkJLy8gaXQncyBhIGNvbnN0YW50LCBkbyB0aGUgdHlwZXMgbWF0Y2g/CisJCQkJCisJCQkJTmFtZWQ8Pz4gY3QgPSBjLnR5cGUoKS5nZXROYW1lZCggbXNnLnBhcmVudCgpICk7CisJCQkJTmFtZWQ8Pz4gcGFyYW1UeXBlID0gcGFyYW0udHlwZSgpLmdldE5hbWVkKCBtc2cucGFyZW50KCkgKTsKKwkJCQlpZiAoY3QgPT0gcGFyYW1UeXBlKQorCQkJCQlyZXR1cm47CisJCQkJCisJCQkJdGhyb3cgdHlwZU1pc21hdGNoKCBwYXJhbSwgYXJnLCBhcmdObyApOworCQkJfQorCQkJCisJCQkvLyB0aGUgbmFtZWQgdGhpbmcgaXMgbm90IGEgY29uc3RhbnQsIHNvIGJsb3cgY2h1bmtzLgorCQkJCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIkF1dGhvcml6ZSBtZXRob2QgJXMgYXJnICVkIG5hbWUgbm90IGEgcGFyYW1ldGVyIG9yIGNvbnN0YW50ICglcykgYXQgbGluZSAlZCIsCisJCQkJbWV0aG9kLmltYWdlLCBhcmdObysxLCBhcmcsIGxpbmVubygpICkgKTsKKwkJfQorCQkKKwkJLy8gdGhlIG5hbWVkIHRoaW5nIGRvZXMgbm90IGV4aXN0LCBzbyBibG93IGNodW5rcy4KKwkJCisJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCSJBdXRob3JpemUgbWV0aG9kICVzIGFyZyAlZCBuYW1lIHVua25vd24gKCVzKSBhdCBsaW5lICVkIiwKKwkJCW1ldGhvZC5pbWFnZSwgYXJnTm8rMSwgYXJnLCBsaW5lbm8oKSApICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrTXNnUGFyYW1GaWVsZFJlZk9yRW51bUl0ZW0oIE1lc3NhZ2UgbXNnLCBQYXJhbWV0ZXIgcGFyYW0sCisJCVRva2VuIGFyZywgaW50IGFyZ05vICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlTZXJ2aWNlIHNlcnZpY2UgPSBtc2cucGFyZW50KCk7CisJCQorCQlTdHJpbmdUb2tlbml6ZXIgcGF0aCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIGFyZy5pbWFnZSwgIi4iICk7CisJCVN0cmluZyBuYW1lID0gcGF0aC5uZXh0VG9rZW4oKTsKKwkJCisJCVBhcmFtZXRlciBwID0gbXNnLmdldFBhcmFtZXRlciggbmFtZSApOworCQlpZiAocCAhPSBudWxsKQorCQl7CisJCQkvLyBpdCdzIGEgcGFyYW1ldGVyLCBzbyB0eXBlIG9mIHAgbXVzdCBiZSBhIHN0cnVjdC4uLgorCisJCQlwID0gZ2V0RmllbGQoIHNlcnZpY2UsIHAsIHBhdGggKTsKKwkJCQorCQkJaWYgKHAgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJCSJBdXRob3JpemUgbWV0aG9kICVzIGFyZyAlZCBuYW1lIGRvZXMgbm90IHJlc29sdmUgdG8gYSBmaWVsZCAoJXMpIGF0IGxpbmUgJWQiLAorCQkJCQltZXRob2QuaW1hZ2UsIGFyZ05vKzEsIGFyZywgbGluZW5vKCkgKSApOworCQkJCisJCQlOYW1lZDw/PiBwdCA9IHAudHlwZSgpLmdldE5hbWVkKCBzZXJ2aWNlICk7CisJCQlOYW1lZDw/PiBwYXJhbVR5cGUgPSBwYXJhbS50eXBlKCkuZ2V0TmFtZWQoIHNlcnZpY2UgKTsKKwkJCWlmIChwdCA9PSBwYXJhbVR5cGUpCisJCQkJcmV0dXJuOworCisJCQl0aHJvdyB0eXBlTWlzbWF0Y2goIHBhcmFtLCBhcmcsIGFyZ05vICk7CisJCX0KKwkJCisJCS8vIGl0IGlzbid0IGEgcGFyYW1ldGVyLCBzbyBpdCBtdXN0IGJlIGFuIGVudW0uLi4KKwkJCisJCU5hbWVkPD8+IG5hbWVkID0gc2VydmljZS5nZXQoIG5hbWUgKTsKKwkJaWYgKG5hbWVkID09IG51bGwpCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIkF1dGhvcml6ZSBtZXRob2QgJXMgYXJnICVkIG5hbWUgdW5rbm93biAoJXMpIGF0IGxpbmUgJWQiLAorCQkJCW1ldGhvZC5pbWFnZSwgYXJnTm8rMSwgYXJnLCBsaW5lbm8oKSApICk7CisJCQorCQlpZiAoIW5hbWVkLmlzRW51bXgoKSkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiQXV0aG9yaXplIG1ldGhvZCAlcyBhcmcgJWQgbmFtZSBub3QgYSBwYXJhbWV0ZXIgZmllbGQgb3IgZW51bSAoJXMpIGF0IGxpbmUgJWQiLAorCQkJCW1ldGhvZC5pbWFnZSwgYXJnTm8rMSwgYXJnLCBsaW5lbm8oKSApICk7CisJCQorCQlFbnVteCBlID0gKEVudW14KSBuYW1lZDsKKwkJCisJCUl0ZW0gaSA9IGUuZ2V0SXRlbSggcGF0aC5uZXh0VG9rZW4oKSApOworCQlpZiAoaSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJBdXRob3JpemUgbWV0aG9kICVzIGFyZyAlZCBuYW1lIG5vdCBhbiBlbnVtIGl0ZW0gKCVzKSBhdCBsaW5lICVkIiwKKwkJCQltZXRob2QuaW1hZ2UsIGFyZ05vKzEsIGFyZywgbGluZW5vKCkgKSApOworCQkKKwkJaWYgKHBhdGguaGFzTW9yZVRva2VucygpKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJBdXRob3JpemUgbWV0aG9kICVzIGFyZyAlZCBuYW1lIG5vdCBhbiBlbnVtIGl0ZW0gKCVzKSBhdCBsaW5lICVkIiwKKwkJCQltZXRob2QuaW1hZ2UsIGFyZ05vKzEsIGFyZywgbGluZW5vKCkgKSApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzZXJ2aWNlCisJICogQHBhcmFtIHAKKwkgKiBAcGFyYW0gcGF0aAorCSAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciB0aGF0IHdhcyByZXNvbHZlZCB1c2luZyB0aGUgdG9rZW5zIGZyb20gc3QuCisJICovCisJcHJpdmF0ZSBQYXJhbWV0ZXIgZ2V0RmllbGQoIFNlcnZpY2Ugc2VydmljZSwgUGFyYW1ldGVyIHAsIFN0cmluZ1Rva2VuaXplciBwYXRoICkKKwl7CisJCWlmICghcGF0aC5oYXNNb3JlVG9rZW5zKCkpCisJCQlyZXR1cm4gcDsKKwkJCisJCVN0cmluZyBuYW1lID0gcGF0aC5uZXh0VG9rZW4oKTsKKwkJCisJCS8vIGdldCB0aGUgdHlwZSBvZiBwLCBpdCBiZXR0ZXIgYmUgYSBzdHJ1Y3QuCisJCQorCQlOYW1lZDw/PiBuYW1lZCA9IHAudHlwZSgpLmdldE5hbWVkKCBzZXJ2aWNlICk7CisJCWlmIChuYW1lZCA9PSBudWxsIHx8ICFuYW1lZC5pc1N0cnVjdCgpKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlTdHJ1Y3QgcyA9IChTdHJ1Y3QpIG5hbWVkOworCQkKKwkJcCA9IHMuZ2V0UGFyYW1ldGVyKCBuYW1lICk7CisJCWlmIChwID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBnZXRGaWVsZCggc2VydmljZSwgcCwgcGF0aCApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0Jvb2xlYW5Db25zdGFudCggUGFyYW1ldGVyIHBhcmFtLCBUb2tlbiBhcmcsIGludCBhcmdObyApCisJCXRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaWYgKCFwYXJhbS50eXBlKCkuaXNCb29sZWFuKCkpCisJCQl0aHJvdyB0eXBlTWlzbWF0Y2goIHBhcmFtLCBhcmcsIGFyZ05vICk7CisJfQorCisJcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiB0eXBlTWlzbWF0Y2goIFBhcmFtZXRlciBwYXJhbSwgVG9rZW4gYXJnLCBpbnQgYXJnTm8gKQorCXsKKwkJLy9pZiAodHJ1ZSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJ0eXBlIG1pc21hdGNoIiApOworCQlyZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJIkF1dGhvcml6ZSBtZXRob2QgJXMgcGFyYW1ldGVyICVkICglcykgdHlwZSBtaXNtYXRjaCBhdCBsaW5lICVkIiwKKwkJCW1ldGhvZCwgYXJnTm8rMSwgcGFyYW0ubmFtZSgpLCBhcmcuYmVnaW5MaW5lICkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tJbnRlZ2VyQ29uc3RhbnQoIFBhcmFtZXRlciBwYXJhbSwgVG9rZW4gYXJnLCBpbnQgYXJnTm8gKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWlmICghKHBhcmFtLnR5cGUoKS5pc0ludGVncmFsKCkgfHwgcGFyYW0udHlwZSgpLmlzRmxvYXRpbmcoKSkpCisJCQl0aHJvdyB0eXBlTWlzbWF0Y2goIHBhcmFtLCBhcmcsIGFyZ05vICk7CisJCQorCQlMb25nIHZhbHVlID0gcGFyc2VMb25nKCBhcmcuaW1hZ2UsIDEwLCAiIiApOworCQlpZiAodmFsdWUgIT0gbnVsbCkKKwkJeworCQkJLy8gY2hlY2sgcmFuZ2Ugb2YgbG9uZyB2cy4gaW50ZWdyYWwgb3IgZmxvYXRpbmcgcGFyYW0gdHlwZQorCQkJaWYgKGNoZWNrUmFuZ2UoIHZhbHVlLCBwYXJhbSwgYXJnLCBhcmdObyApKQorCQkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gdmFsdWUgcmFuZ2UgaXMgdG9vIG11Y2ggZm9yIGxvbmcgdHlwZSwgb3IgcGFyYW1ldGVyIGlzIG5vdCBhCisJCS8vIGtub3duIGludGVncmFsIG9yIGZsb2F0aW5nIHR5cGU7IHRyeSBkb3VibGUKKwkJCisJCURvdWJsZSBkdmFsdWUgPSBwYXJzZURvdWJsZSggYXJnLmltYWdlICk7CisJCWlmIChkdmFsdWUgIT0gbnVsbCkKKwkJeworCQkJLy8gY2hlY2sgcmFuZ2Ugb2YgZG91YmxlIHZzLiBmbG9hdGluZyBwYXJhbSB0eXBlCisJCQlpZiAoY2hlY2tSYW5nZSggZHZhbHVlLCBwYXJhbSwgYXJnLCBhcmdObyApKQorCQkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gdmFsdWUgcmFuZ2UgaXMgdG9vIG11Y2ggZm9yIGxvbmcgb3IgZG91YmxlIHR5cGUsIG9yIHBhcmFtZXRlcgorCQkvLyBpcyBub3QgYSBrbm93biBpbnRlZ3JhbCBvciBmbG9hdGluZyB0eXBlCisJCQorCQl0aHJvdyB0eXBlTWlzbWF0Y2goIHBhcmFtLCBhcmcsIGFyZ05vICk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrUmFuZ2UoIGxvbmcgdmFsdWUsIFBhcmFtZXRlciBwYXJhbSwgVG9rZW4gYXJnLAorCQlpbnQgYXJnTm8gKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCS8vIHdlIHBhcnNlZCB0aGUgdmFsdWUgYXMgYSBsb25nLCBub3cgc2VlIGlmIGl0IGlzIGNvbXBhdGlibGUgd2l0aAorCQkvLyBvdXIgcGFyYW1ldGVyIHR5cGUuCisJCXN3aXRjaCAocGFyYW0udHlwZSgpLnR5cGUoKS5raW5kKQorCQl7CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEU6CisJCQkJY2hlY2tSYW5nZSggdmFsdWUsIEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1BWF9WQUxVRSwgcGFyYW0sIGFyZywKKwkJCQkJYXJnTm8gKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQorCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVDoKKwkJCQljaGVja1JhbmdlKCB2YWx1ZSwgU2hvcnQuTUlOX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUsIHBhcmFtLCBhcmcsCisJCQkJCWFyZ05vICk7CisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuSU5UOgorCQkJCWNoZWNrUmFuZ2UoIHZhbHVlLCBJbnRlZ2VyLk1JTl9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUsIHBhcmFtLAorCQkJCQlhcmcsIGFyZ05vICk7CisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuTE9ORzoKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRkxPQVQ6CisJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkRPVUJMRToKKwkJCQkvLyB2YWx1ZSBpcyBhIGxvbmcsIGFuZCB0aGF0IGlzIGNlcnRhaW5seSBjb21wYXRpYmxlIHdpdGggbG9uZywKKwkJCQkvLyBmbG9hdCwgb3IgZG91YmxlLgorCQkJCXJldHVybiB0cnVlOworCQkJCisJCQlkZWZhdWx0OgorCQkJCS8vIHBhcmFtZXRlciBpcyBub3QgYSByZWNvZ25pemVkIHR5cGUuCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrUmFuZ2UoIGRvdWJsZSBkdmFsdWUsIFBhcmFtZXRlciBwYXJhbSwgVG9rZW4gYXJnLAorCQlpbnQgYXJnTm8gKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCS8vIHdlIHBhcnNlZCB0aGUgdmFsdWUgYXMgYSBkb3VibGUsIG5vdyBzZWUgaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoCisJCS8vIG91ciBwYXJhbWV0ZXIgdHlwZS4KKwkJc3dpdGNoIChwYXJhbS50eXBlKCkudHlwZSgpLmtpbmQpCisJCXsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRkxPQVQ6CisJCQkJY2hlY2tSYW5nZSggZHZhbHVlLCBGbG9hdC5NSU5fVkFMVUUsIEZsb2F0Lk1BWF9WQUxVRSwgcGFyYW0sCisJCQkJCWFyZywgYXJnTm8gKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQorCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6CisJCQkJLy8gdmFsdWUgaXMgYSBkb3VibGUsIGFuZCB0aGF0IGlzIGNlcnRhaW5seSBjb21wYXRpYmxlIHdpdGgKKwkJCQkvLyBkb3VibGUuCisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcGFyYW1ldGVyIGlzIG5vdCBhIHJlY29nbml6ZWQgdHlwZS4KKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tSYW5nZSggbG9uZyB2YWx1ZSwgbG9uZyBtaW4sIGxvbmcgbWF4LCBQYXJhbWV0ZXIgcGFyYW0sCisJCVRva2VuIGFyZywgaW50IGFyZ05vICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlpZiAodmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heCkKKwkJCXJldHVybjsKKwkJCisJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCSJBdXRob3JpemUgbWV0aG9kICVzIHBhcmFtZXRlciAlZCAoJXMpIGludGVncmFsIHZhbHVlIG91dCBvZiByYW5nZSBhdCBsaW5lICVkIiwKKwkJCW1ldGhvZCwgYXJnTm8rMSwgcGFyYW0ubmFtZSgpLCBhcmcuYmVnaW5MaW5lICkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tSYW5nZSggZG91YmxlIGR2YWx1ZSwgZG91YmxlIG1pbiwgZG91YmxlIG1heCwKKwkJUGFyYW1ldGVyIHBhcmFtLCBUb2tlbiBhcmcsIGludCBhcmdObyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJLy8gaWdub3JlIHNpZ24sIGl0IGRvZXNuJ3QgbWF0dGVyLgorCQkKKwkJZHZhbHVlID0gTWF0aC5hYnMoIGR2YWx1ZSApOworCQkKKwkJaWYgKGR2YWx1ZSA+PSBtaW4gJiYgZHZhbHVlIDw9IG1heCkKKwkJCXJldHVybjsKKwkJCisJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCSJBdXRob3JpemUgbWV0aG9kICVzIHBhcmFtZXRlciAlZCAoJXMpIGZsb2F0aW5nIHZhbHVlIG91dCBvZiByYW5nZSBhdCBsaW5lICVkIiwKKwkJCW1ldGhvZCwgYXJnTm8rMSwgcGFyYW0ubmFtZSgpLCBhcmcuYmVnaW5MaW5lICkgKTsKKwl9CisKKwlwcml2YXRlIExvbmcgcGFyc2VMb25nKCBTdHJpbmcgcywgaW50IHJhZGl4LCBTdHJpbmcgcHJlZml4ICkKKwl7CisJCXRyeQorCQl7CisJCQlpZiAoIXMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCBwcmVmaXggKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBMb25nLnBhcnNlTG9uZyggcy5zdWJzdHJpbmcoIHByZWZpeC5sZW5ndGgoKSApLCByYWRpeCApOworCQl9CisJCWNhdGNoICggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQorCQl7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXByaXZhdGUgRG91YmxlIHBhcnNlRG91YmxlKCBTdHJpbmcgaW1hZ2UgKQorCXsKKwkJdHJ5CisJCXsKKwkJCXJldHVybiBEb3VibGUucGFyc2VEb3VibGUoIGltYWdlICk7CisJCX0KKwkJY2F0Y2ggKCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSApCisJCXsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrT2N0YWxDb25zdGFudCggUGFyYW1ldGVyIHBhcmFtLCBUb2tlbiBhcmcsIGludCBhcmdObyApCisJCXRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaWYgKCFwYXJhbS50eXBlKCkuaXNJbnRlZ3JhbCgpKQorCQkJdGhyb3cgdHlwZU1pc21hdGNoKCBwYXJhbSwgYXJnLCBhcmdObyApOworCQkKKwkJTG9uZyB2YWx1ZSA9IHBhcnNlTG9uZyggYXJnLmltYWdlLCA4LCAiMCIgKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpCisJCXsKKwkJCS8vIGNoZWNrIHJhbmdlIG9mIGxvbmcgdnMuIGludGVncmFsIG9yIGZsb2F0aW5nIHBhcmFtIHR5cGUKKwkJCWlmIChjaGVja1JhbmdlKCB2YWx1ZSwgcGFyYW0sIGFyZywgYXJnTm8gKSkKKwkJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIHZhbHVlIHJhbmdlIGlzIHRvbyBtdWNoIGZvciBsb25nIG9yIGRvdWJsZSB0eXBlLCBvciBwYXJhbWV0ZXIKKwkJLy8gaXMgbm90IGEga25vd24gaW50ZWdyYWwgb3IgZmxvYXRpbmcgdHlwZQorCQkKKwkJdGhyb3cgdHlwZU1pc21hdGNoKCBwYXJhbSwgYXJnLCBhcmdObyApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0hleENvbnN0YW50KCBQYXJhbWV0ZXIgcGFyYW0sIFRva2VuIGFyZywgaW50IGFyZ05vICkKKwkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlpZiAoIXBhcmFtLnR5cGUoKS5pc0ludGVncmFsKCkpCisJCQl0aHJvdyB0eXBlTWlzbWF0Y2goIHBhcmFtLCBhcmcsIGFyZ05vICk7CisJCQorCQlMb25nIHZhbHVlID0gcGFyc2VMb25nKCBhcmcuaW1hZ2UsIDE2LCAiMHgiICk7CisJCWlmICh2YWx1ZSAhPSBudWxsKQorCQl7CisJCQkvLyBjaGVjayByYW5nZSBvZiBsb25nIHZzLiBpbnRlZ3JhbCBvciBmbG9hdGluZyBwYXJhbSB0eXBlCisJCQlpZiAoY2hlY2tSYW5nZSggdmFsdWUsIHBhcmFtLCBhcmcsIGFyZ05vICkpCisJCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyB2YWx1ZSByYW5nZSBpcyB0b28gbXVjaCBmb3IgbG9uZyBvciBkb3VibGUgdHlwZSwgb3IgcGFyYW1ldGVyCisJCS8vIGlzIG5vdCBhIGtub3duIGludGVncmFsIG9yIGZsb2F0aW5nIHR5cGUKKwkJCisJCXRocm93IHR5cGVNaXNtYXRjaCggcGFyYW0sIGFyZywgYXJnTm8gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tCaW5hcnlDb25zdGFudCggUGFyYW1ldGVyIHBhcmFtLCBUb2tlbiBhcmcsIGludCBhcmdObyApCisJCXRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaWYgKCFwYXJhbS50eXBlKCkuaXNJbnRlZ3JhbCgpKQorCQkJdGhyb3cgdHlwZU1pc21hdGNoKCBwYXJhbSwgYXJnLCBhcmdObyApOworCQkKKwkJTG9uZyB2YWx1ZSA9IHBhcnNlTG9uZyggYXJnLmltYWdlLCAyLCAiMGIiICk7CisJCWlmICh2YWx1ZSAhPSBudWxsKQorCQl7CisJCQkvLyBjaGVjayByYW5nZSBvZiBsb25nIHZzLiBpbnRlZ3JhbCBvciBmbG9hdGluZyBwYXJhbSB0eXBlCisJCQlpZiAoY2hlY2tSYW5nZSggdmFsdWUsIHBhcmFtLCBhcmcsIGFyZ05vICkpCisJCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyB2YWx1ZSByYW5nZSBpcyB0b28gbXVjaCBmb3IgbG9uZyBvciBkb3VibGUgdHlwZSwgb3IgcGFyYW1ldGVyCisJCS8vIGlzIG5vdCBhIGtub3duIGludGVncmFsIG9yIGZsb2F0aW5nIHR5cGUKKwkJCisJCXRocm93IHR5cGVNaXNtYXRjaCggcGFyYW0sIGFyZywgYXJnTm8gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tEZWNpbWFsQ29uc3RhbnQoIFBhcmFtZXRlciBwYXJhbSwgVG9rZW4gYXJnLCBpbnQgYXJnTm8gKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWlmICghcGFyYW0udHlwZSgpLmlzRmxvYXRpbmcoKSkKKwkJCXRocm93IHR5cGVNaXNtYXRjaCggcGFyYW0sIGFyZywgYXJnTm8gKTsKKwkJCisJCURvdWJsZSBkdmFsdWUgPSBwYXJzZURvdWJsZSggYXJnLmltYWdlICk7CisJCWlmIChkdmFsdWUgIT0gbnVsbCkKKwkJeworCQkJLy8gY2hlY2sgcmFuZ2Ugb2YgZG91YmxlIHZzLiBmbG9hdGluZyBwYXJhbSB0eXBlCisJCQlpZiAoY2hlY2tSYW5nZSggZHZhbHVlLCBwYXJhbSwgYXJnLCBhcmdObyApKQorCQkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gdmFsdWUgcmFuZ2UgaXMgdG9vIG11Y2ggZm9yIGxvbmcgb3IgZG91YmxlIHR5cGUsIG9yIHBhcmFtZXRlcgorCQkvLyBpcyBub3QgYSBrbm93biBpbnRlZ3JhbCBvciBmbG9hdGluZyB0eXBlCisJCQorCQl0aHJvdyB0eXBlTWlzbWF0Y2goIHBhcmFtLCBhcmcsIGFyZ05vICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nQ29uc3RhbnQoIFBhcmFtZXRlciBwYXJhbSwgVG9rZW4gYXJnLCBpbnQgYXJnTm8gKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWlmICghcGFyYW0udHlwZSgpLmlzU3RyaW5nKCkpCisJCQl0aHJvdyB0eXBlTWlzbWF0Y2goIHBhcmFtLCBhcmcsIGFyZ05vICk7CisJfQorCQorCS8qKgorCSAqIFdyYXBwZXIgZm9yIGFyZyB3aGljaCBob2xkcyB0aGUgcmVxdWlyZWQgYXJnIHR5cGUgYXMgd2VsbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEF1dGhBcmcKKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gYXJnCisJCSAqLworCQlwdWJsaWMgQXV0aEFyZyggVG9rZW4gYXJnICkKKwkJeworCQkJdGhpcy5hcmcgPSBhcmc7CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgVG9rZW4gYXJnOworCQkKKwkJcHJpdmF0ZSBUeXBlUmVmIHR5cGU7CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgdG9rZW4gb2YgdGhlIGFyZy4KKwkJICovCisJCXB1YmxpYyBUb2tlbiB2YWx1ZSgpCisJCXsKKwkJCXJldHVybiBhcmc7CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZXRzIHRoZSByZXF1aXJlZCB0eXBlIG9mIHRoZSBhcmcuCisJCSAqIEBwYXJhbSB0eXBlCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRUeXBlKCBUeXBlUmVmIHR5cGUgKQorCQl7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgcmVxdWlyZWQgdHlwZSBvZiB0aGUgYXJnLgorCQkgKi8KKwkJcHVibGljIFR5cGVSZWYgdHlwZSgpCisJCXsKKwkJCXJldHVybiB0eXBlOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0cnVlIGlmIG5vdCBhbiBpZCBvciBxaWQuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc0xpdGVyYWxDb25zdGFudCgpCisJCXsKKwkJCXN3aXRjaCAoYXJnLmtpbmQpCisJCQl7CisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5UUlVFOgorCQkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRkFMU0U6CisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlRFR0VSOgorCQkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuT0NUQUw6CisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5IRVg6CisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5CSU5BUlk6CisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ERUNJTUFMOgorCQkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSOgorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gbXNnCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG5hbWVzIGEgcGFyYW1ldGVyIG9mIHRoZSBwcm90ZWN0ZWQKKwkJICogbWV0aG9kLgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoIE1lc3NhZ2UgbXNnICkKKwkJeworCQkJc3dpdGNoIChhcmcua2luZCkKKwkJCXsKKwkJCQljYXNlIEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklEOgorCQkJCQlyZXR1cm4gbXNnLmhhc1BhcmFtZXRlciggYXJnLmltYWdlICk7CisJCQkJCisJCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5RSUQ6CisJCQkJeworCQkJCQlTdHJpbmdbXSBuID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIGFyZy5pbWFnZSwgJy4nICk7CisJCQkJCXJldHVybiBtc2cuaGFzUGFyYW1ldGVyKCBuWzBdICk7CisJCQkJfQorCQkJCQorCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBpbnRmCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG5hbWVzIGEgY29uc3RhbnQgb2YgdGhlIHNlcnZpY2UuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0YW50KCBTZXJ2aWNlIGludGYgKQorCQl7CisJCQlpZiAoYXJnLmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuSUQKKwkJCQkJJiYgYXJnLmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuUUlEKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJTmFtZWQ8Pz4gbmFtZWQgPSBpbnRmLmdldCggYXJnLmltYWdlICk7CisJCQkKKwkJCXJldHVybiBuYW1lZCAhPSBudWxsICYmIG5hbWVkLmlzQ29uc3RhbnQoKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBpbnRmCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG5hbWVzIGFuIGVudW0gb2YgdGhlIHNlcnZpY2UuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc0VudW0oIFNlcnZpY2UgaW50ZiApCisJCXsKKwkJCWlmIChhcmcua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5RSUQpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlTdHJpbmdbXSBuID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIGFyZy5pbWFnZSwgJy4nICk7CisJCQkKKwkJCU5hbWVkPD8+IG5hbWVkID0gaW50Zi5nZXQoIG5bMF0gKTsKKwkJCQorCQkJcmV0dXJuIG5hbWVkICE9IG51bGwgJiYgbmFtZWQuaXNFbnVteCgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L0RpcmVjdGlvbi5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L0RpcmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjM0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9vcHQvRGlyZWN0aW9uLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoR3JhbW1hckNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1lc3NhZ2VEaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuT3B0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuU2VydmljZTsKKworCisvKioKKyAqIE9wdGlvbiB3aGljaCBzZXRzIHRoZSBkaXJlY3Rpb24gb2YgYSBtZXNzYWdlIChbY2xpZW50LT5dc2VydmVyLAorICogW3NlcnZlci0+XWNsaWVudCwgb3IgYm90aC4KKyAqLworcHVibGljIGNsYXNzIERpcmVjdGlvbiBleHRlbmRzIE9wdAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIERpcmVjdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIERpcmVjdGlvbiggTmFtZSBuYW1lLCBUb2tlbi4uLiBhcmdzICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlzdXBlciggbmFtZS5uYW1lLCBuYW1lLnRva2VuLmJlZ2luTGluZSApOworCQlhZGRUeXBlKCBNZXNzYWdlLmNsYXNzICk7CisJCWFkZFR5cGUoIFNlcnZpY2UuY2xhc3MgKTsKKwkJCisJCWlmIChhcmdzLmxlbmd0aCAhPSAxKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KCAiRGlyZWN0aW9uIGFyZ3MgbGVuZ3RoICE9IDEiICkgKTsKKwkJCisJCVRva2VuIGFyZyA9IGFyZ3NbMF07CisJCWlmIChhcmcua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5JRCkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCggIkRpcmVjdGlvbiBhcmcgc2hvdWxkIGJlIGlkZW50aWZpZXI6ICIrYXJnLmltYWdlICkgKTsKKwkJCisJCXRyeQorCQl7CisJCQltZCA9IE1lc3NhZ2VEaXJlY3Rpb24udmFsdWVPZiggYXJnLmltYWdlLnRvVXBwZXJDYXNlKCkgKTsKKwkJfQorCQljYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJEaXJlY3Rpb24gYXJnIHNob3VsZCBiZSBvbmUgb2Y6ICIrRW51bVNldC5hbGxPZiggTWVzc2FnZURpcmVjdGlvbi5jbGFzcyApICkgKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1lc3NhZ2VEaXJlY3Rpb24gbWQ7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNARGlyZWN0aW9uKCAlcyApXG4iLCBpbmRlbnQsIG1kICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIkBEaXJlY3Rpb24oICVzICkiLCBtZCApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIE1lc3NhZ2VEaXJlY3Rpb24gZm9yIHRoZSBkaXJlY3Rpb24uCisJICovCisJcHVibGljIE1lc3NhZ2VEaXJlY3Rpb24gZ2V0TWVzc2FnZURpcmVjdGlvbigpCisJeworCQlyZXR1cm4gbWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L0V4dGVybi5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L0V4dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGJjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9vcHQvRXh0ZXJuLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIub3B0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkV0Y2hHcmFtbWFyQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuT3B0OworCisKKy8qKgorICogT3B0aW9uIHdoaWNoIHNldHMgdGhlIGxhbmd1YWdlIHNwZWNpZmljIGF0dHJpYnV0ZXMgb2YgYW4gZXh0ZXJuCisgKiBkZWNsYXJhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEV4dGVybiBleHRlbmRzIE9wdAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEV4dGVybi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIEV4dGVybiggTmFtZSBuYW1lLCBUb2tlbi4uLiBhcmdzICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlzdXBlciggbnVsbCwgbmFtZS50b2tlbi5iZWdpbkxpbmUgKTsKKwkJYWRkVHlwZSggb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5FeHRlcm4uY2xhc3MgKTsKKwkJCisJCS8vIHVzYWdlOiBARXh0ZXJuKGxhbmd1YWdlLCBuYW1lLCBuYW1lSW1wb3J0LCBzZXJpYWxpemVyLCBzZXJpYWxpemVySW1wb3J0KQorCQkvLyBleGFtcGxlOiBARXh0ZXJuKGphdmEsICJqYXZhLnV0aWwuRGF0ZSIsICIiLCAiZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuRGF0ZVNlcmlhbGl6ZXIiLCAiIikKKwkJCisJCWlmIChhcmdzLmxlbmd0aCAhPSA1KQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJ1c2FnZTogQEV4dGVybihsYW5ndWFnZSwgXCJ4bmFtZVwiLCBcInhuYW1lSW1wb3J0XCIsIFwic2VyaWFsaXplclwiLCBcInNlcmlhbGl6ZXJJbXBvcnRcIikgYXQgbGluZSAlZCIsCisJCQkJbmFtZS50b2tlbi5iZWdpbkxpbmUgKSApOworCQkKKwkJbGFuZ3VhZ2UgPSBhcmdzWzBdOworCQl4bmFtZSA9IGFyZ3NbMV07CisJCXhuYW1lSW1wb3J0ID0gYXJnc1syXTsKKwkJc2VyaWFsaXplciA9IGFyZ3NbM107CisJCXNlcmlhbGl6ZXJJbXBvcnQgPSBhcmdzWzRdOworCQkKKwkJaWYgKGxhbmd1YWdlLmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuSUQpCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIkV4dGVybiBleHBlY3RlZCBsYW5ndWFnZSB0byBiZSA8SUQ+IGF0IGxpbmUgJWQiLAorCQkJCWxhbmd1YWdlLmJlZ2luTGluZSApICk7CisJCQorCQlpZiAoeG5hbWUua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFIpCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIkV4dGVybiBleHBlY3RlZCB4bmFtZSB0byBiZSA8U1RSPiBhdCBsaW5lICVkIiwKKwkJCQl4bmFtZS5iZWdpbkxpbmUgKSApOworCQkKKwkJaWYgKHhuYW1lSW1wb3J0LmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJFeHRlcm4gZXhwZWN0ZWQgeG5hbWVJbXBvcnQgdG8gYmUgPFNUUj4gYXQgbGluZSAlZCIsCisJCQkJeG5hbWVJbXBvcnQuYmVnaW5MaW5lICkgKTsKKwkJCisJCWlmIChzZXJpYWxpemVyLmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJFeHRlcm4gZXhwZWN0ZWQgc2VyaWFsaXplciB0byBiZSA8U1RSPiBhdCBsaW5lICVkIiwKKwkJCQlzZXJpYWxpemVyLmJlZ2luTGluZSApICk7CisJCQorCQlpZiAoc2VyaWFsaXplckltcG9ydC5raW5kICE9IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUikKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiRXh0ZXJuIGV4cGVjdGVkIHNlcmlhbGl6ZXJJbXBvcnQgdG8gYmUgPFNUUj4gYXQgbGluZSAlZCIsCisJCQkJc2VyaWFsaXplckltcG9ydC5iZWdpbkxpbmUgKSApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIG5hbWUoKQorCXsKKwkJcmV0dXJuICJFeHRlcm4uIitsYW5ndWFnZS5pbWFnZTsKKwl9CisJCisJLyoqCisJICogVGhlIGxhbmd1YWdlIG9mIHRoaXMgZXh0ZXJuIG9wdC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVG9rZW4gbGFuZ3VhZ2U7CisJCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIGNsYXNzLgorCSAqLworCXB1YmxpYyBmaW5hbCBUb2tlbiB4bmFtZTsKKwkKKwkvKioKKwkgKiBIb3cgdG8gbWFrZSB0aGUgZXh0ZXJuYWwgY2xhc3MgYXZhaWxhYmxlIGluIHRoZSBlbnZpcm9ubWVudC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVG9rZW4geG5hbWVJbXBvcnQ7CisJCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIHNlcmlhbGl6ZXIgY2xhc3MuCisJICovCisJcHVibGljIGZpbmFsIFRva2VuIHNlcmlhbGl6ZXI7CisKKwkvKioKKwkgKiBIb3cgdG8gbWFrZSB0aGUgc2VyaWFsaXplciBuYW1lIGF2YWlsYWJsZSBpbiB0aGUgZW52aXJvbm1lbnQuCisJICovCisJcHVibGljIGZpbmFsIFRva2VuIHNlcmlhbGl6ZXJJbXBvcnQ7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNARXh0ZXJuICVzICVzICVzICVzICVzXG4iLCBpbmRlbnQsIGxhbmd1YWdlLCB4bmFtZSwgeG5hbWVJbXBvcnQsIHNlcmlhbGl6ZXIsIHNlcmlhbGl6ZXJJbXBvcnQgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiQEV4dGVybiAlcyAlcyAlcyAlcyAlcyIsIGxhbmd1YWdlLCB4bmFtZSwgeG5hbWVJbXBvcnQsIHNlcmlhbGl6ZXIsIHNlcmlhbGl6ZXJJbXBvcnQgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBsYW5ndWFnZSAoZS5nLiwgamF2YSkgb2YgdGhpcyBleHRlcm4gb3B0aW9uLgorCSAqLworCXB1YmxpYyBUb2tlbiBnZXRMYW5ndWFnZSgpIHsKKwkJcmV0dXJuIGxhbmd1YWdlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJpYWxpemVyIGZvciB0aGlzIGV4dGVybi4KKwkgKi8KKwlwdWJsaWMgVG9rZW4gZ2V0U2VyaWFsaXplcigpIHsKKwkJcmV0dXJuIHNlcmlhbGl6ZXI7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgImltcG9ydCIgc3RhdGVtZW50IHdlIG1pZ2h0IG5lZWQgdG8gdXNlIHRvIGFjY2VzcyB0aGUKKwkgKiBzZXJpYWxpemVyIGNsYXNzLiBCbGFuayAoIiIpIG1lYW5zIG5vbmUuCisJICovCisJcHVibGljIFRva2VuIGdldFNlcmlhbGl6ZXJJbXBvcnQoKSB7CisJCXJldHVybiBzZXJpYWxpemVySW1wb3J0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIGNsYXNzLgorCSAqLworCXB1YmxpYyBUb2tlbiBnZXRYbmFtZSgpIHsKKwkJcmV0dXJuIHhuYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlICJpbXBvcnQiIHN0YXRlbWVudCB3ZSBtaWdodCBuZWVkIHRvIHVzZSB0byBhY2Nlc3MgdGhlCisJICogZXh0ZXJuYWwgY2xhc3MuIEJsYW5rICgiIikgbWVhbnMgbm9uZS4KKwkgKi8KKwlwdWJsaWMgVG9rZW4gZ2V0WG5hbWVJbXBvcnQoKSB7CisJCXJldHVybiB4bmFtZUltcG9ydDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9vcHQvT25ld2F5LmphdmEgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9vcHQvT25ld2F5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyY2E2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9PbmV3YXkuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoR3JhbW1hckNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5PcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5TZXJ2aWNlOworCisKKy8qKgorICogT3B0aW9uIHdoaWNoIHNldHMgdGhlIG9uZXdheSBhdHRyaWJ1dGUgb2YgYSBtZXNzYWdlLiBJZiB0aGUgbWVzc2FnZSBpcworICogb25ld2F5LCB0aGVuIHJlbW90ZSBzZW5kcyBhIG1lc3NhZ2UgYW5kIGRvZXNuJ3Qgd2FpdCBmb3IgYW55IHJlc3BvbnNlIG9yCisgKiB0aHJvd24gZXhjZXB0aW9uLgorICovCitwdWJsaWMgY2xhc3MgT25ld2F5IGV4dGVuZHMgT3B0Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgT25ld2F5LgorCSAqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgT25ld2F5KCBOYW1lIG5hbWUsIFRva2VuLi4uIGFyZ3MgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBuYW1lLm5hbWUsIG5hbWUudG9rZW4uYmVnaW5MaW5lICk7CisJCWFkZFR5cGUoIE1lc3NhZ2UuY2xhc3MgKTsKKwkJYWRkVHlwZSggU2VydmljZS5jbGFzcyApOworCQkKKwkJaWYgKGFyZ3MubGVuZ3RoID4gMSkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiT25ld2F5IGFjY2VwdHMgb25lIG9wdGlvbmFsIGJvb2xlYW4gYXJndW1lbnQgYXQgbGluZSAlZCIsCisJCQkJbmFtZS50b2tlbi5iZWdpbkxpbmUgKSApOworCQkKKwkJaWYgKGFyZ3MubGVuZ3RoID4gMCkKKwkJeworCQkJVG9rZW4gYXJnID0gYXJnc1swXTsKKwkJCWlmIChhcmcua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5UUlVFICYmCisJCQkJCWFyZy5raW5kICE9IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZBTFNFKQorCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJIk9uZXdheSBhY2NlcHRzIG9uZSBvcHRpb25hbCBib29sZWFuIGFyZ3VtZW50IGF0IGxpbmUgJWQiLAorCQkJCQluYW1lLnRva2VuLmJlZ2luTGluZSApICk7CisJCQlvbmV3YXkgPSBCb29sZWFuLnBhcnNlQm9vbGVhbiggYXJnLmltYWdlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvbmV3YXkgPSB0cnVlOworCQl9CisJfQorCQorCXByaXZhdGUgZmluYWwgYm9vbGVhbiBvbmV3YXk7CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIGEgb25ld2F5IG1lc3NhZ2UuIEEgb25ld2F5IG1lc3NhZ2UKKwkgKiBkb2VzIG5vdCBkZWxheSB0aGUgc2VuZGVyIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNPbmV3YXkoKQorCXsKKwkJcmV0dXJuIG9uZXdheTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNAT25ld2F5ICVzXG4iLCBpbmRlbnQsIG9uZXdheSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJAT25ld2F5ICVzIiwgb25ld2F5ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L1RpbWVvdXQuamF2YSBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9UaW1lb3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1YTY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9UaW1lb3V0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuRXRjaEdyYW1tYXJDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuT3B0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuU2VydmljZTsKKworCisvKioKKyAqIE9wdGlvbiB3aGljaCBzZXRzIHRoZSB0aW1lb3V0IG9mIGEgbWVzc2FnZSB3aGljaCBpcyBleHBlY3RpbmcgYQorICogcmVzdWx0ICh0aGF0IGlzLCBhIGNhbGwpLgorICogVGhlIHRpbWVvdXQgaXMgaW4gbXMuCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lb3V0IGV4dGVuZHMgT3B0Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVGltZW91dC4KKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIFRpbWVvdXQoIE5hbWUgbmFtZSwgVG9rZW4uLi4gYXJncyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIG5hbWUubmFtZSwgbmFtZS50b2tlbi5iZWdpbkxpbmUgKTsKKwkJYWRkVHlwZSggTWVzc2FnZS5jbGFzcyApOworCQlhZGRUeXBlKCBTZXJ2aWNlLmNsYXNzICk7CisJCQorCQlpZiAoYXJncy5sZW5ndGggIT0gMSkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCggImFyZ3MubGVuZ3RoICE9IDEiICkgKTsKKwkJVG9rZW4gYXJnID0gYXJnc1swXTsKKwkJaWYgKGFyZy5raW5kICE9IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVEVHRVIpCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoICJUaW1lb3V0IGFyZyBzaG91bGQgYmUgaW50ZWdlciBjb25zdGFudDogIithcmcuaW1hZ2UgKSApOworCQlpbnQgdiA9IEludGVnZXIucGFyc2VJbnQoIGFyZy5pbWFnZSApOworCQlpZiAodiA8IDApCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoICJUaW1lb3V0IGFyZyBzaG91bGQgYmUgaW50ZWdlciBjb25zdGFudCA+PSAwOiAiK2FyZy5pbWFnZSApICk7CisJCQorCQl0aW1lb3V0ID0gdjsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgdGltZW91dDsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0aW1lb3V0IHZhbHVlLgorCSAqLworCXB1YmxpYyBpbnQgdGltZW91dCgpCisJeworCQlyZXR1cm4gdGltZW91dDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNAVGltZW91dCggJWQgKVxuIiwgaW5kZW50LCB0aW1lb3V0ICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIkBUaW1lb3V0KCAlZCApIiwgdGltZW91dCApOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9Ub1N0cmluZy5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L1RvU3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExMTBmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL29wdC9Ub1N0cmluZy5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLm9wdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoR3JhbW1hckNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuRXhjZXB0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk9wdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlN0cnVjdDsKKworCisvKioKKyAqIE9wdGlvbiB3aGljaCBzZXRzIHRoZSBzdHJpbmcgZm9ybWF0IG9mIGEgc3RydWN0IG9yIGV4Y2VwdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFRvU3RyaW5nIGV4dGVuZHMgT3B0Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVG9TdHJpbmcuCisJICoKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBUb1N0cmluZyggTmFtZSBuYW1lLCBUb2tlbi4uLiBhcmdzICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlzdXBlciggbmFtZS5uYW1lLCBuYW1lLnRva2VuLmJlZ2luTGluZSApOworCQlhZGRUeXBlKCBFeGNlcHQuY2xhc3MgKTsKKwkJYWRkVHlwZSggU3RydWN0LmNsYXNzICk7CisJCQorCQlpZiAoYXJncy5sZW5ndGggIT0gMSkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiVG9TdHJpbmcgYWNjZXB0cyBvbmUgc3RyaW5nIGFyZ3VtZW50IGF0IGxpbmUgJWQiLAorCQkJCW5hbWUudG9rZW4uYmVnaW5MaW5lICkgKTsKKwkJCisJCVRva2VuIGFyZyA9IGFyZ3NbMF07CisJCWlmIChhcmcua2luZCAhPSBFdGNoR3JhbW1hckNvbnN0YW50cy5TVFIpCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIlRvU3RyaW5nIGFjY2VwdHMgb25lIHN0cmluZyBhcmd1bWVudCBhdCBsaW5lICVkIiwKKwkJCQlhcmcuYmVnaW5MaW5lICkgKTsKKwkJCisJCXRyeQorCQl7CisJCQlmb3JtYXQgPSBwYXJzZSggYXJnLmltYWdlICk7CisJCX0KKwkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJUb1N0cmluZzogcHJvYmxlbSB3aXRoIGZvcm1hdCBzdHJpbmcgYXQgbGluZSAlZDogJXMiLAorCQkJCWFyZy5iZWdpbkxpbmUsIGUuZ2V0TWVzc2FnZSgpICkgKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGZpbmFsIExpc3Q8Rm10SXRlbT4gZm9ybWF0OworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZHVtcCggU3RyaW5nIGluZGVudCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzQFRvU3RyaW5nKCAlcyApXG4iLCBpbmRlbnQsIGZvcm1hdCApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJAVG9TdHJpbmcoICVzICkiLCBmb3JtYXQgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBmb3JtYXQgZm9yIHRoZSBUb1N0cmluZy4KKwkgKi8KKwlwdWJsaWMgTGlzdDxGbXRJdGVtPiBnZXRGb3JtYXQoKQorCXsKKwkJcmV0dXJuIGZvcm1hdDsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxGbXRJdGVtPiBwYXJzZSggU3RyaW5nIHMgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWlmIChzLnN0YXJ0c1dpdGgoICJcIiIgKSkKKwkJCXMgPSBzLnN1YnN0cmluZyggMSApOworCQkKKwkJaWYgKHMuZW5kc1dpdGgoICJcIiIgKSkKKwkJCXMgPSBzLnN1YnN0cmluZyggMCwgcy5sZW5ndGgoKS0xICk7CisJCQorCQlMaXN0PEZtdEl0ZW0+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEZtdEl0ZW0+KCk7CisJCVN0cmluZ1JlYWRlciByZHIgPSBuZXcgU3RyaW5nUmVhZGVyKCBzICk7CisJCXdoaWxlIChzdHJpbmdJdGVtKCBsaXN0LCByZHIgKSAmJiBmaWVsZEl0ZW0oIGxpc3QsIHJkciApKQorCQl7CisJCQkvLyBub3RoaW5nIGVsc2UgdG8gZG8uCisJCX0KKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJdGVtKCBMaXN0PEZtdEl0ZW0+IGxpc3QsIFN0cmluZ1JlYWRlciByZHIgKQorCQl0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaW50IGM7CisJCWJvb2xlYW4gZXNjYXBlID0gZmFsc2U7CisJCXdoaWxlICgoYyA9IHJkci5yZWFkKCkpID49IDApCisJCXsKKwkJCWlmICghZXNjYXBlKQorCQkJeworCQkJCWlmIChjID09ICd7JykKKwkJCQl7CisJCQkJCS8vIHVuZXNjYXBlZCBicmFjZSBpcyBzdGFydCBvZiBmb3JtYXQgaXRlbS4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCQorCQkJCWlmIChjID09ICdcXCcpCisJCQkJeworCQkJCQkvLyB1bmVzY2FwZWQgYmFja3NsYXNoIGlzIHN0YXJ0IG9mIGVzY2FwZQorCQkJCQllc2NhcGUgPSB0cnVlOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKGMgPT0gJ3QnKSBjID0gJ1x0JzsKKwkJCQllbHNlIGlmIChjID09ICdyJykgYyA9ICdccic7CisJCQkJZWxzZSBpZiAoYyA9PSAnbicpIGMgPSAnXG4nOworCQkJCWVsc2UgaWYgKGMgPT0gJ3snKSBjID0gJ3snOworCQkJCWVsc2UgaWYgKGMgPT0gJ1xcJykgYyA9ICdcXCc7CisJCQkJZWxzZSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJiYWQgZXNjYXBlLiBleHBlY3Rpbmcgb25lIG9mIHQsIHIsIG4sIHssIG9yIFxcLiBnb3QgJyIrKGNoYXIpIGMrIiciICk7CisJCQkJZXNjYXBlID0gZmFsc2U7CisJCQl9CisJCQkKKwkJCXNiLmFwcGVuZCggKGNoYXIpIGMgKTsKKwkJfQorCQkKKwkJaWYgKGVzY2FwZSkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggInBhcnRpYWwgZXNjYXBlIGF0IGVuZCBvZiBzdHJpbmciICk7CisJCQorCQlpZiAoc2IubGVuZ3RoKCkgPiAwKQorCQkJbGlzdC5hZGQoIG5ldyBTdHJpbmdJdGVtKCBzYi50b1N0cmluZygpICkgKTsKKwkJCisJCXJldHVybiBjID49IDA7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaWVsZEl0ZW0oIExpc3Q8Rm10SXRlbT4gbGlzdCwgU3RyaW5nUmVhZGVyIHJkciApCisJCXRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpbnQgYzsKKwkJd2hpbGUgKChjID0gcmRyLnJlYWQoKSkgPj0gMCkKKwkJeworCQkJaWYgKGMgPT0gJ30nKQorCQkJCWJyZWFrOworCQkJCisJCQlzYi5hcHBlbmQoIChjaGFyKSBjICk7CisJCX0KKwkJCisJCWlmIChjICE9ICd9JykKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggInVuY2xvc2VkIGZpZWxkIGl0ZW0gYXQgZW5kIG9mIHN0cmluZyIgKTsKKwkJCisJCWlmIChzYi5sZW5ndGgoKSA+IDApCisJCQlsaXN0LmFkZCggbmV3IEZpZWxkSXRlbSggc2IudG9TdHJpbmcoKSApICk7CisJCQorCQlyZXR1cm4gYyA+PSAwOworCX0KKworCS8qKgorCSAqIEEgZm9ybWF0IGl0ZW0uCisJICovCisJcHVibGljIGludGVyZmFjZSBGbXRJdGVtCisJeworCQkvKioKKwkJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZvcm1hdCBpdGVtLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB2YWx1ZSgpOworCX0KKwkKKwkvKioKKwkgKiBBIHN0cmluZyBmb3JtYXQgaXRlbS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0l0ZW0gaW1wbGVtZW50cyBGbXRJdGVtCisJeworCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgc3RyaW5nIGZvcm1hdCBpdGVtLgorCQkgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIGZvcm1hdCBpdGVtLgorCQkgKi8KKwkJcHVibGljIFN0cmluZ0l0ZW0oIFN0cmluZyBzICkKKwkJeworCQkJdGhpcy5zID0gczsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgczsKKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwkJeworCQkJcmV0dXJuICJTdHJpbmc6ICciK3MrIiciOworCQl9CisKKwkJcHVibGljIFN0cmluZyB2YWx1ZSgpCisJCXsKKwkJCXJldHVybiBzOworCQl9CisJfQorCQorCS8qKgorCSAqIEEgZmllbGQgZm9ybWF0IGl0ZW0uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZEl0ZW0gaW1wbGVtZW50cyBGbXRJdGVtCisJeworCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgZmllbGQgZm9ybWF0IGl0ZW0uCisJCSAqIEBwYXJhbSBzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKwkJICovCisJCXB1YmxpYyBGaWVsZEl0ZW0oIFN0cmluZyBzICkKKwkJeworCQkJdGhpcy5zID0gczsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgczsKKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwkJeworCQkJcmV0dXJuICJGaWVsZDogIitzOworCQl9CisKKwkJcHVibGljIFN0cmluZyB2YWx1ZSgpCisJCXsKKwkJCXJldHVybiBzOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L1VuY2hlY2tlZC5qYXZhIGIvY29tcGlsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvb3B0L1VuY2hlY2tlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MWE5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9vcHQvVW5jaGVja2VkLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5vcHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuRXRjaEdyYW1tYXJDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LkV4Y2VwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5PcHQ7CisKKworLyoqCisgKiBPcHRpb24gd2hpY2ggc2V0cyB0aGUgdW5jaGVja2VkIGF0dHJpYnV0ZSBvZiBhbiBleGNlcHRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBVbmNoZWNrZWQgZXh0ZW5kcyBPcHQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBVbmNoZWNrZWQuCisJICoKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBVbmNoZWNrZWQoIE5hbWUgbmFtZSwgVG9rZW4uLi4gYXJncyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIG5hbWUubmFtZSwgbmFtZS50b2tlbi5iZWdpbkxpbmUgKTsKKwkJYWRkVHlwZSggRXhjZXB0LmNsYXNzICk7CisJCQorCQlpZiAoYXJncy5sZW5ndGggPiAxKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSJVbmNoZWNrZWQgYWNjZXB0cyBvbmUgb3B0aW9uYWwgYm9vbGVhbiBhcmd1bWVudCBhdCBsaW5lICVkIiwKKwkJCQluYW1lLnRva2VuLmJlZ2luTGluZSApICk7CisJCQorCQlpZiAoYXJncy5sZW5ndGggPiAwKQorCQl7CisJCQlUb2tlbiBhcmcgPSBhcmdzWzBdOworCQkJaWYgKGFyZy5raW5kICE9IEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlRSVUUgJiYKKwkJCQkJYXJnLmtpbmQgIT0gRXRjaEdyYW1tYXJDb25zdGFudHMuRkFMU0UpCisJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCQkiVW5jaGVja2VkIGFjY2VwdHMgb25lIG9wdGlvbmFsIGJvb2xlYW4gYXJndW1lbnQgYXQgbGluZSAlZCIsCisJCQkJCW5hbWUudG9rZW4uYmVnaW5MaW5lICkgKTsKKwkJCXVuY2hlY2tlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKCBhcmcuaW1hZ2UgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXVuY2hlY2tlZCA9IHRydWU7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVuY2hlY2tlZDsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV4Y2VwdGlvbiBzaG91bGQgaW5oZXJpdCBmcm9tIGFuIHVuY2hlY2tlZAorCSAqIHR5cGUgKGUuZy4sIGphdmEncyBSdW50aW1lRXhjZXB0aW9uKSB2cy4gYSBjaGVja2VkIHR5cGUgKGUuZy4sCisJICogamF2YSdzIEV4Y2VwdGlvbikuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNVbmNoZWNrZWQoKQorCXsKKwkJcmV0dXJuIHVuY2hlY2tlZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkdW1wKCBTdHJpbmcgaW5kZW50ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXNAVW5jaGVja2VkXG4iLCBpbmRlbnQgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiQFVuY2hlY2tlZCIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvbWFpbi9qYXZhY2MvRXRjaEdyYW1tYXIuaHRtbCBiL2NvbXBpbGVyL3NyYy9tYWluL2phdmFjYy9FdGNoR3JhbW1hci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTUxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhY2MvRXRjaEdyYW1tYXIuaHRtbApAQCAtMCwwICsxLDI3NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPgorPCEtLQorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCistLT4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Qk5GIGZvciBFdGNoR3JhbW1hci5qajwvVElUTEU+Cis8L0hFQUQ+Cis8Qk9EWT4KKzxIMSBBTElHTj1DRU5URVI+Qk5GIGZvciBFdGNoR3JhbW1hci5qajwvSDE+Cis8SDIgQUxJR049Q0VOVEVSPlRPS0VOUzwvSDI+Cis8VEFCTEU+CisgPCEtLSBTcGVjaWFsIHRva2VuIC0tPgorIDxUUj4KKyAgPFREPgorPFBSRT4KKy8qCisgKiBUb2tlbnMgdG8gaWdub3JlIGluIHRoZSBCTkYgZm9sbG93LgorICovPC9QUkU+CisgIDwvVEQ+CisgPC9UUj4KKyA8IS0tIFRva2VuIC0tPgorIDxUUj4KKyAgPFREPgorICAgPFBSRT4KKyZsdDtERUZBVUxUJmd0OyBTS0lQIDogeworIiAiCit8ICJcdCIKK3wgIlxyIgorfCAiXG4iCit8ICJcZiIKK3wgJmx0O1NJTkdMRTE6ICIvLyIgKH5bIlxyIiwiXG4iXSkqIFsiXHIiLCJcbiJdJmd0OworfCAmbHQ7U0lOR0xFMjogIiMiICh+WyJcciIsIlxuIl0pKiBbIlxyIiwiXG4iXSZndDsKK30KKworICAgPC9QUkU+CisgIDwvVEQ+CisgPC9UUj4KKyA8IS0tIFRva2VuIC0tPgorIDxUUj4KKyAgPFREPgorICAgPFBSRT4KKyZsdDtERUZBVUxUJmd0OyBTUEVDSUFMIDogeworJmx0O0ZPUk1BTDogIi8qKiIgKH5bIioiXSkqICIqIiAoIioiIHwgflsiKiIsIi8iXSAoflsiKiJdKSogIioiKSogIi8iJmd0OworfCAmbHQ7QkxPQ0s6ICIvKiIgKH5bIioiXSkqICIqIiAoIioiIHwgflsiKiIsIi8iXSAoflsiKiJdKSogIioiKSogIi8iJmd0OworfQorCisgICA8L1BSRT4KKyAgPC9URD4KKyA8L1RSPgorIDwhLS0gVG9rZW4gLS0+CisgPFRSPgorICA8VEQ+CisgICA8UFJFPgorJmx0O0RFRkFVTFQmZ3Q7IFRPS0VOIDogeworJmx0O0JPT0xFQU46ICJib29sZWFuIiZndDsKK3wgJmx0O0JZVEU6ICJieXRlIiZndDsKK3wgJmx0O0NPTlNUOiAiY29uc3QiJmd0OworfCAmbHQ7RE9VQkxFOiAiZG91YmxlIiZndDsKK3wgJmx0O0VOVU06ICJlbnVtIiZndDsKK3wgJmx0O0VYQ0VQVElPTjogImV4Y2VwdGlvbiImZ3Q7Cit8ICZsdDtFWFRFTkRTOiAiZXh0ZW5kcyImZ3Q7Cit8ICZsdDtFWFRFUk46ICJleHRlcm4iJmd0OworfCAmbHQ7RkFMU0U6ICJmYWxzZSImZ3Q7Cit8ICZsdDtGTE9BVDogImZsb2F0IiZndDsKK3wgJmx0O0lOQ0xVREU6ICJpbmNsdWRlIiZndDsKK3wgJmx0O0lOVDogImludCImZ3Q7Cit8ICZsdDtMT05HOiAibG9uZyImZ3Q7Cit8ICZsdDtNSVhJTjogIm1peGluIiZndDsKK3wgJmx0O01PRFVMRTogIm1vZHVsZSImZ3Q7Cit8ICZsdDtOVUxMOiAibnVsbCImZ3Q7Cit8ICZsdDtPQkpFQ1Q6ICJvYmplY3QiJmd0OworfCAmbHQ7U0VSVklDRTogInNlcnZpY2UiJmd0OworfCAmbHQ7U0hPUlQ6ICJzaG9ydCImZ3Q7Cit8ICZsdDtTVFJJTkc6ICJzdHJpbmciJmd0OworfCAmbHQ7U1RSVUNUOiAic3RydWN0IiZndDsKK3wgJmx0O1RIUk9XUzogInRocm93cyImZ3Q7Cit8ICZsdDtUUlVFOiAidHJ1ZSImZ3Q7Cit8ICZsdDtWT0lEOiAidm9pZCImZ3Q7Cit8ICZsdDtJRDogWyJhIi0ieiIsIkEiLSJaIl0gKFsiYSItInoiLCJBIi0iWiIsIjAiLSI5IiwiXyJdKSomZ3Q7Cit8ICZsdDtRSUQ6ICZsdDtJRCZndDsgKCIuIiAmbHQ7SUQmZ3Q7KSsmZ3Q7Cit8ICZsdDsjSU5UX0xJVDogWyIxIi0iOSJdIChbIjAiLSI5Il0pKiZndDsKK3wgJmx0OyNTR046IChbIi0iXSk/Jmd0OworfCAmbHQ7SU5URUdFUjogJmx0O1NHTiZndDsgKCIwIiB8ICZsdDtJTlRfTElUJmd0OykmZ3Q7Cit8ICZsdDtPQ1RBTDogIjAiIChbIjAiLSI3Il0pKyZndDsKK3wgJmx0O0hFWDogIjAiIFsieCIsIlgiXSAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSkrJmd0OworfCAmbHQ7QklOQVJZOiAiMCIgWyJiIiwiQiJdIChbIjAiLSIxIl0pKyZndDsKK3wgJmx0OyNFWFA6IFsiZSIsIkUiXSAmbHQ7SU5URUdFUiZndDsmZ3Q7Cit8ICZsdDsjRlJBQ1RJT046ICZsdDtTR04mZ3Q7ICIuIiAoWyIwIi0iOSJdKSsmZ3Q7Cit8ICZsdDtERUNJTUFMOiAmbHQ7SU5URUdFUiZndDsgKCIuIiAoWyIwIi0iOSJdKSopPyAmbHQ7RVhQJmd0OyB8ICZsdDtJTlRFR0VSJmd0OyAiLiIgKFsiMCItIjkiXSkqICgmbHQ7RVhQJmd0Oyk/IHwgJmx0O0ZSQUNUSU9OJmd0OyAoJmx0O0VYUCZndDspPyZndDsKK3wgJmx0O1NUUjogIlwiIiAoflsiXCIiLCJcXCIsIlxyIiwiXG4iXSB8ICJcXCIgWyJcIiIsIlxcIiwiciIsIm4iLCJ0Il0gfCAiXFx1IiAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSl7NCwtMX0pKiAiXCIiJmd0OworfCAmbHQ7QVQ6ICJAIiZndDsKK3wgJmx0O0NPTU1BOiAiLCImZ3Q7Cit8ICZsdDtFUTogIj0iJmd0OworfCAmbHQ7U0VNSTogIjsiJmd0OworfCAmbHQ7TFBBUkVOOiAiKCImZ3Q7Cit8ICZsdDtSUEFSRU46ICIpIiZndDsKK3wgJmx0O0xCUkFDRTogInsiJmd0OworfCAmbHQ7UkJSQUNFOiAifSImZ3Q7Cit8ICZsdDtMQlJBQ0tFVDogIlsiJmd0OworfCAmbHQ7UkJSQUNLRVQ6ICJdIiZndDsKK30KKworICAgPC9QUkU+CisgIDwvVEQ+CisgPC9UUj4KKzwvVEFCTEU+Cis8SDIgQUxJR049Q0VOVEVSPk5PTi1URVJNSU5BTFM8L0gyPgorPFRBQkxFPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMSI+bW9kdWxlPC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPjxBIEhSRUY9IiNwcm9kMiI+bW9kdWxlX3N0bXQ8L0E+IDxBIEhSRUY9IiNwcm9kMyI+c2VydmljZTwvQT48L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDIiPm1vZHVsZV9zdG10PC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPiZsdDtNT0RVTEUmZ3Q7IDxBIEhSRUY9IiNwcm9kNCI+eGlkPC9BPiAoICZsdDtTRU1JJmd0OyApPzwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMyI+c2VydmljZTwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT48QSBIUkVGPSIjcHJvZDUiPm9wdHM8L0E+ICZsdDtTRVJWSUNFJmd0OyA8QSBIUkVGPSIjcHJvZDYiPmRlZjwvQT4gJmx0O0xCUkFDRSZndDsgPEEgSFJFRj0iI3Byb2Q3Ij5zdG10czwvQT4gJmx0O1JCUkFDRSZndDs8L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDUiPm9wdHM8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+KCA8QSBIUkVGPSIjcHJvZDgiPm9wdDwvQT4gKSo8L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDgiPm9wdDwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4mbHQ7QVQmZ3Q7IDxBIEhSRUY9IiNwcm9kOSI+aWQ8L0E+ICggJmx0O0xQQVJFTiZndDsgPEEgSFJFRj0iI3Byb2QxMCI+YXJnczwvQT4gJmx0O1JQQVJFTiZndDsgKT88L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDEwIj5hcmdzPC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPjxBIEhSRUY9IiNwcm9kMTEiPmFyZzwvQT4gKCAmbHQ7Q09NTUEmZ3Q7IDxBIEhSRUY9IiNwcm9kMTEiPmFyZzwvQT4gKSo8L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDExIj5hcmc8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+KCA8QSBIUkVGPSIjcHJvZDEyIj5jdmFsdWU8L0E+IHwgPEEgSFJFRj0iI3Byb2Q0Ij54aWQ8L0E+IHwgJmx0O05VTEwmZ3Q7ICk8L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDEyIj5jdmFsdWU8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+KCAmbHQ7VFJVRSZndDsgfCAmbHQ7RkFMU0UmZ3Q7IHwgJmx0O0lOVEVHRVImZ3Q7IHwgJmx0O09DVEFMJmd0OyB8ICZsdDtIRVgmZ3Q7IHwgJmx0O0JJTkFSWSZndDsgfCAmbHQ7REVDSU1BTCZndDsgfCAmbHQ7U1RSJmd0OyApPC9URD4KKzwvVFI+Cis8VFI+Cis8VEQgQUxJR049UklHSFQgVkFMSUdOPUJBU0VMSU5FPjxBIE5BTUU9InByb2Q3Ij5zdG10czwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4oIDxBIEhSRUY9IiNwcm9kNSI+b3B0czwvQT4gKCA8QSBIUkVGPSIjcHJvZDEzIj5taXhpbl9zdG10PC9BPiB8IDxBIEhSRUY9IiNwcm9kMTQiPmluY2x1ZGVfc3RtdDwvQT4gfCA8QSBIUkVGPSIjcHJvZDE1Ij5jb25zdF9zdG10PC9BPiB8IDxBIEhSRUY9IiNwcm9kMTYiPmVudW1fc3RtdDwvQT4gfCA8QSBIUkVGPSIjcHJvZDE3Ij5zdHJ1Y3Rfc3RtdDwvQT4gfCA8QSBIUkVGPSIjcHJvZDE4Ij5leHRlcm5fc3RtdDwvQT4gfCA8QSBIUkVGPSIjcHJvZDE5Ij5leGNlcHRpb25fc3RtdDwvQT4gfCA8QSBIUkVGPSIjcHJvZDIwIj5tZXNzYWdlX3N0bXQ8L0E+ICkgKSo8L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDEzIj5taXhpbl9zdG10PC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPiZsdDtNSVhJTiZndDsgPEEgSFJFRj0iI3Byb2QyMSI+cmVmPC9BPiAoICZsdDtTRU1JJmd0OyApPzwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMTQiPmluY2x1ZGVfc3RtdDwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4mbHQ7SU5DTFVERSZndDsgJmx0O1NUUiZndDsgKCAmbHQ7U0VNSSZndDsgKT88L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDE1Ij5jb25zdF9zdG10PC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPiZsdDtDT05TVCZndDsgPEEgSFJFRj0iI3Byb2QyMiI+Y3R5cGU8L0E+IDxBIEhSRUY9IiNwcm9kNiI+ZGVmPC9BPiAmbHQ7RVEmZ3Q7IDxBIEhSRUY9IiNwcm9kMTIiPmN2YWx1ZTwvQT4gKCAmbHQ7U0VNSSZndDsgKT88L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDE2Ij5lbnVtX3N0bXQ8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+Jmx0O0VOVU0mZ3Q7IDxBIEhSRUY9IiNwcm9kNiI+ZGVmPC9BPiAmbHQ7TFBBUkVOJmd0OyA8QSBIUkVGPSIjcHJvZDIzIj5pdGVtX2xpc3Q8L0E+ICZsdDtSUEFSRU4mZ3Q7ICggJmx0O1NFTUkmZ3Q7ICk/PC9URD4KKzwvVFI+Cis8VFI+Cis8VEQgQUxJR049UklHSFQgVkFMSUdOPUJBU0VMSU5FPjxBIE5BTUU9InByb2QyMyI+aXRlbV9saXN0PC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPjxBIEhSRUY9IiNwcm9kNiI+ZGVmPC9BPiAoICZsdDtDT01NQSZndDsgPEEgSFJFRj0iI3Byb2Q2Ij5kZWY8L0E+ICkqPC9URD4KKzwvVFI+Cis8VFI+Cis8VEQgQUxJR049UklHSFQgVkFMSUdOPUJBU0VMSU5FPjxBIE5BTUU9InByb2QxNyI+c3RydWN0X3N0bXQ8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+Jmx0O1NUUlVDVCZndDsgPEEgSFJFRj0iI3Byb2Q2Ij5kZWY8L0E+IDxBIEhSRUY9IiNwcm9kMjQiPnBhcmFtczwvQT4gKCAmbHQ7RVhURU5EUyZndDsgPEEgSFJFRj0iI3Byb2QyMSI+cmVmPC9BPiApPyAoICZsdDtTRU1JJmd0OyApPzwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMTgiPmV4dGVybl9zdG10PC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPiZsdDtFWFRFUk4mZ3Q7IDxBIEhSRUY9IiNwcm9kNiI+ZGVmPC9BPiAoICZsdDtTRU1JJmd0OyApPzwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMTkiPmV4Y2VwdGlvbl9zdG10PC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPiZsdDtFWENFUFRJT04mZ3Q7IDxBIEhSRUY9IiNwcm9kNiI+ZGVmPC9BPiA8QSBIUkVGPSIjcHJvZDI0Ij5wYXJhbXM8L0E+ICggJmx0O0VYVEVORFMmZ3Q7IDxBIEhSRUY9IiNwcm9kMjEiPnJlZjwvQT4gKT8gKCAmbHQ7U0VNSSZndDsgKT88L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDIwIj5tZXNzYWdlX3N0bXQ8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+PEEgSFJFRj0iI3Byb2QyNSI+cnR5cGU8L0E+IDxBIEhSRUY9IiNwcm9kNiI+ZGVmPC9BPiA8QSBIUkVGPSIjcHJvZDI0Ij5wYXJhbXM8L0E+ICggJmx0O1RIUk9XUyZndDsgPEEgSFJFRj0iI3Byb2QyNiI+dGhyb3dzX2xpc3Q8L0E+ICk/ICggJmx0O1NFTUkmZ3Q7ICk/PC9URD4KKzwvVFI+Cis8VFI+Cis8VEQgQUxJR049UklHSFQgVkFMSUdOPUJBU0VMSU5FPjxBIE5BTUU9InByb2QyNiI+dGhyb3dzX2xpc3Q8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+PEEgSFJFRj0iI3Byb2QyMSI+cmVmPC9BPiAoICZsdDtDT01NQSZndDsgPEEgSFJFRj0iI3Byb2QyMSI+cmVmPC9BPiApKjwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kOSI+aWQ8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+Jmx0O0lEJmd0OzwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMjciPnFpZDwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4mbHQ7UUlEJmd0OzwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kNCI+eGlkPC9BPjwvVEQ+Cis8VEQgQUxJR049Q0VOVEVSIFZBTElHTj1CQVNFTElORT46Oj08L1REPgorPFREIEFMSUdOPUxFRlQgVkFMSUdOPUJBU0VMSU5FPiggPEEgSFJFRj0iI3Byb2QyNyI+cWlkPC9BPiB8IDxBIEhSRUY9IiNwcm9kOSI+aWQ8L0E+ICk8L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDYiPmRlZjwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT48QSBIUkVGPSIjcHJvZDkiPmlkPC9BPjwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMjEiPnJlZjwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT48QSBIUkVGPSIjcHJvZDQiPnhpZDwvQT48L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDIyIj5jdHlwZTwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4oICZsdDtCT09MRUFOJmd0OyB8ICZsdDtCWVRFJmd0OyB8ICZsdDtTSE9SVCZndDsgfCAmbHQ7SU5UJmd0OyB8ICZsdDtMT05HJmd0OyB8ICZsdDtGTE9BVCZndDsgfCAmbHQ7RE9VQkxFJmd0OyB8ICZsdDtTVFJJTkcmZ3Q7ICk8L1REPgorPC9UUj4KKzxUUj4KKzxURCBBTElHTj1SSUdIVCBWQUxJR049QkFTRUxJTkU+PEEgTkFNRT0icHJvZDI4Ij5wdHlwZTwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4oIDxBIEhSRUY9IiNwcm9kMjIiPmN0eXBlPC9BPiB8ICZsdDtPQkpFQ1QmZ3Q7IHwgPEEgSFJFRj0iI3Byb2QyMSI+cmVmPC9BPiApPC9URD4KKzwvVFI+Cis8VFI+Cis8VEQgQUxJR049UklHSFQgVkFMSUdOPUJBU0VMSU5FPjxBIE5BTUU9InByb2QyNSI+cnR5cGU8L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+KCAoIDxBIEhSRUY9IiNwcm9kMjgiPnB0eXBlPC9BPiA8QSBIUkVGPSIjcHJvZDI5Ij5kaW08L0E+ICkgfCAmbHQ7Vk9JRCZndDsgKTwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMjkiPmRpbTwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4oICZsdDtMQlJBQ0tFVCZndDsgJmx0O1JCUkFDS0VUJmd0OyApKjwvVEQ+Cis8L1RSPgorPFRSPgorPFREIEFMSUdOPVJJR0hUIFZBTElHTj1CQVNFTElORT48QSBOQU1FPSJwcm9kMjQiPnBhcmFtczwvQT48L1REPgorPFREIEFMSUdOPUNFTlRFUiBWQUxJR049QkFTRUxJTkU+Ojo9PC9URD4KKzxURCBBTElHTj1MRUZUIFZBTElHTj1CQVNFTElORT4mbHQ7TFBBUkVOJmd0OyAoIDxBIEhSRUY9IiNwcm9kMzAiPnBhcmFtPC9BPiAoICZsdDtDT01NQSZndDsgPEEgSFJFRj0iI3Byb2QzMCI+cGFyYW08L0E+ICkqICk/ICZsdDtSUEFSRU4mZ3Q7PC9URD4KKzwvVFI+Cis8VFI+Cis8VEQgQUxJR049UklHSFQgVkFMSUdOPUJBU0VMSU5FPjxBIE5BTUU9InByb2QzMCI+cGFyYW08L0E+PC9URD4KKzxURCBBTElHTj1DRU5URVIgVkFMSUdOPUJBU0VMSU5FPjo6PTwvVEQ+Cis8VEQgQUxJR049TEVGVCBWQUxJR049QkFTRUxJTkU+PEEgSFJFRj0iI3Byb2QyOCI+cHR5cGU8L0E+IDxBIEhSRUY9IiNwcm9kMjkiPmRpbTwvQT4gPEEgSFJFRj0iI3Byb2Q2Ij5kZWY8L0E+PC9URD4KKzwvVFI+Cis8L1RBQkxFPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vamF2YWNjL0V0Y2hHcmFtbWFyLmpqIGIvY29tcGlsZXIvc3JjL21haW4vamF2YWNjL0V0Y2hHcmFtbWFyLmpqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTc3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9qYXZhY2MvRXRjaEdyYW1tYXIuamoKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiAgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqLworCisvKiAkSWQkCisgKgorICogR3JhbW1lciBmb3IgdGhlIGV0Y2ggaWRsIGNvbXBpbGVyLgorICovCisgCitvcHRpb25zCit7CisJSkFWQV9VTklDT0RFX0VTQ0FQRSA9IGZhbHNlOworCVNUQVRJQyA9IGZhbHNlOworCUpES19WRVJTSU9OID0gIjEuNSI7CisJT1VUUFVUX0RJUkVDVE9SWSA9ICIuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9qYXZhY2MvamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIiOworfQorCitQQVJTRVJfQkVHSU4oRXRjaEdyYW1tYXIpCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5FbnVteDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LkV4Y2VwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0LlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5JdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk1vZHVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuYXN0Lk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5PcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5QYXJhbUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5TdHJ1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5UaHJvd247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5UeXBlUmVmOworCisvKiogVGhlIEphdmFDQyBncmFtbWFyIGZpbGUgZm9yIHRoZSBldGNoIGNvbXBpbGVyLiAqLworcHVibGljIGNsYXNzIEV0Y2hHcmFtbWFyIGV4dGVuZHMgRXRjaEhlbHBlcgoreworCXB1YmxpYyBFdGNoR3JhbW1hciggQmFja2VuZCBiLCBJbnB1dFN0cmVhbSBpcyApCisJeworCQl0aGlzKCBpcyApOworCQl0aGlzLmJpbmRpbmcgPSBiOworCX0KKwkKKwlwcml2YXRlIEJhY2tlbmQgYmluZGluZzsKKwkKKwlwcml2YXRlIFNlcnZpY2UgZ2ludGY7Cit9CisKK1BBUlNFUl9FTkQoRXRjaEdyYW1tYXIpCisKKy8qCisgKiBUb2tlbnMgdG8gaWdub3JlIGluIHRoZSBCTkYgZm9sbG93LgorICovCisKK1NLSVAgOgoreworCTwiICI+Cit8CTwiXHQiPgorfAk8IlxyIj4KK3wJPCJcbiI+Cit8CTwiXGYiPgorfAk8U0lOR0xFMSA6ICIvLyIgKH5bIlxyIiwiXG4iXSkqIFsiXHIiLCJcbiJdPgorfAk8U0lOR0xFMiA6ICIjIiAoflsiXHIiLCJcbiJdKSogWyJcciIsIlxuIl0+Cit9CisKK1NQRUNJQUxfVE9LRU4gOgoreworCTxGT1JNQUwgOiAiLyoqIiAoflsiKiJdKSogIioiICgiKiIgfCAoflsiKiIsIi8iXSAoflsiKiJdKSogIioiKSkqICIvIj4KK3wJPEJMT0NLIDogIi8qIiAoflsiKiJdKSogIioiICgiKiIgfCAoflsiKiIsIi8iXSAoflsiKiJdKSogIioiKSkqICIvIj4KK30KKworVE9LRU4gOgoreworCTxCT09MRUFOIDogImJvb2xlYW4iPgorfAk8QllURSA6ICJieXRlIj4KK3wJPENPTlNUIDogImNvbnN0Ij4KK3wJPERPVUJMRSA6ICJkb3VibGUiPgorfAk8RU5VTSA6ICJlbnVtIj4KK3wJPEVYQ0VQVElPTiA6ICJleGNlcHRpb24iPgorfAk8RVhURU5EUyA6ICJleHRlbmRzIj4KK3wJPEVYVEVSTiA6ICJleHRlcm4iPgorfAk8RkFMU0UgOiAiZmFsc2UiPgorfAk8RkxPQVQgOiAiZmxvYXQiPgorfCAgIDxJTkNMVURFIDogImluY2x1ZGUiPgorfAk8SU5UIDogImludCI+Cit8CTxMT05HIDogImxvbmciPgorfAk8TUlYSU4gOiAibWl4aW4iPgorfAk8TU9EVUxFIDogIm1vZHVsZSI+Cit8CTxOVUxMIDogIm51bGwiPgorfAk8T0JKRUNUIDogIm9iamVjdCI+Cit8CTxTRVJWSUNFIDogInNlcnZpY2UiPgorfAk8U0hPUlQgOiAic2hvcnQiPgorfAk8U1RSSU5HIDogInN0cmluZyI+Cit8CTxTVFJVQ1QgOiAic3RydWN0Ij4KK3wJPFRIUk9XUyA6ICJ0aHJvd3MiPgorfAk8VFJVRSA6ICJ0cnVlIj4KK3wJPFZPSUQgOiAidm9pZCI+Cit8CTxJRCA6IFsiYSItInoiLCJBIi0iWiJdIChbImEiLSJ6IiwiQSItIloiLCIwIi0iOSIsIl8iXSkqPgorfAk8UUlEIDogPElEPiAoICIuIiA8SUQ+ICkrPgorfAk8I0lOVF9MSVQgOiBbIjEiLSI5Il0gKFsiMCItIjkiXSkqPgorfAk8I1NHTiA6IChbIi0iXSk/PgorfAk8SU5URUdFUiA6IDxTR04+ICgiMCIgfCA8SU5UX0xJVD4pPgorfAk8T0NUQUwgOiAiMCIgKFsiMCItIjciXSkrPgorfAk8SEVYIDogIjAiIFsieCIsIlgiXSAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSkrPgorfAk8QklOQVJZIDogIjAiIFsiYiIsIkIiXSAoWyIwIi0iMSJdKSs+Cit8CTwjRVhQIDogWyJlIiwgIkUiXSA8SU5URUdFUj4+Cit8CTwjRlJBQ1RJT04gOiA8U0dOPiAiLiIgKFsiMCItIjkiXSkrPgorfAk8REVDSU1BTCA6ICg8SU5URUdFUj4gKCAiLiIgKFsiMCItIjkiXSkqICk/IDxFWFA+KSB8ICg8SU5URUdFUj4gIi4iIChbIjAiLSI5Il0pKiAoPEVYUD4pPykgfCAoPEZSQUNUSU9OPiAoPEVYUD4pPyk+Cit8CTxTVFIgOiAiXCIiICh+WyJcIiIsIlxcIiwiXHIiLCJcbiJdIHwgKCJcXCIgWyJcIiIsIlxcIiwiciIsIm4iLCJ0Il0pIHwgKCJcXHUiIChbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdKXs0fSkpKiAiXCIiPgorfAk8QVQgOiAiQCI+Cit8CTxDT01NQSA6ICIsIj4KK3wJPEVRIDogIj0iPgorfAk8U0VNSSA6ICI7Ij4KK3wJPExQQVJFTiA6ICIoIj4KK3wJPFJQQVJFTiA6ICIpIj4KK3wJPExCUkFDRSA6ICJ7Ij4KK3wJPFJCUkFDRSA6ICJ9Ij4KK3wJPExCUkFDS0VUIDogIlsiPgorfAk8UkJSQUNLRVQgOiAiXSI+Cit9CisKK01vZHVsZSBtb2R1bGUoIENtZExpbmVPcHRpb25zIGNtZExpbmVPcHRpb25zICkgOgoreyBNb2R1bGUgbTsgfQoreworCW0gPSBtb2R1bGVfc3RtdCggY21kTGluZU9wdGlvbnMgKQorCXNlcnZpY2UoIG0gKQorCXsgcmV0dXJuIG07IH0KK30KKworTW9kdWxlIG1vZHVsZV9zdG10KCBDbWRMaW5lT3B0aW9ucyBjbWRMaW5lT3B0aW9ucyApIDoKK3sgVG9rZW4gazsgVG9rZW4gdDsgfQoreworCWsgPSA8TU9EVUxFPiB0ID0geGlkKCkgKCA8U0VNST4gKT8KKwkKKwl7CisJCU1vZHVsZSBtID0gbmV3IE1vZHVsZSggbmV3IE5hbWUoIHQsIHQuaW1hZ2UgKSwgY21kTGluZU9wdGlvbnMgKTsKKwkJbW9kdWxlQ29tbWVudCggbSwgay5zcGVjaWFsVG9rZW4gKTsKKwkJcmV0dXJuIG07CisJfQorfQorCit2b2lkIHNlcnZpY2UoIE1vZHVsZSBtICkgOgoreyBNYXA8U3RyaW5nLCBPcHQ+IG9wdHM7IFRva2VuIGs7IE5hbWUgbjsgU2VydmljZSBpOyB9Cit7CisJeworCQlkb1N0YXJ0U2VydmljZSgpOwkKKwl9CisJCisJb3B0cyA9IG9wdHMoKQorCWsgPSA8U0VSVklDRT4gbiA9IGRlZigpCisJewkJIAorCQlzYXZlQ29tbWVudCggay5zcGVjaWFsVG9rZW4gKTsKKwkJaSA9IG0uYWRkU2VydmljZSggbiwgb3B0cyApOworCQlzZXJ2aWNlQ29tbWVudCggaSwgZ2V0Q29tbWVudCgpICk7CisJCWJpbmRpbmcuYWRkRGVmYXVsdHMoIGkgKTsKKwkJU2VydmljZSBvaW50ZiA9IGdpbnRmOworCQlnaW50ZiA9IGk7CisJfQorCTxMQlJBQ0U+IHN0bXRzKCBpICkgPFJCUkFDRT4KKwl7CisJCWdpbnRmID0gb2ludGY7CisJCWRvRW5kU2VydmljZSggaSApOwkKKwl9Cit9CisKK01hcDxTdHJpbmcsIE9wdD4gb3B0cygpIDoKK3sgTWFwPFN0cmluZywgT3B0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9wdD4oKTsgT3B0IG87IH0KK3sKKwkoCisJCW8gPSBvcHQoKQorCQl7IG1hcC5wdXQoIG8ubmFtZSgpLCBvICk7IH0KKwkpKgorCXsgcmV0dXJuIG1hcDsgfQorfQorCitPcHQgb3B0KCkgOgoreyBUb2tlbiBrOyBUb2tlbiBuOyBMaXN0PFRva2VuPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUb2tlbj4oKTsgfQoreworCWsgPSA8QVQ+IG4gPSBpZCgpCisJeworCQlzYXZlQ29tbWVudCggay5zcGVjaWFsVG9rZW4gKTsKKwl9CisJKCA8TFBBUkVOPiBhcmdzKCBsaXN0ICkgPFJQQVJFTj4gKT8KKwl7IHJldHVybiBtYWtlT3B0KCBuZXcgTmFtZSggbiwgbi5pbWFnZSApLCBsaXN0ICk7IH0KK30KKwordm9pZCBhcmdzKCBMaXN0PFRva2VuPiBsaXN0ICkgOgoreyBUb2tlbiB2OyB9Cit7CisJdiA9IGFyZygpIHsgbGlzdC5hZGQoIHYgKTsgfQorCSgKKwkJPENPTU1BPiB2ID0gYXJnKCkKKwkJeyBsaXN0LmFkZCggdiApOyB9CisJKSoKK30KKworVG9rZW4gYXJnKCkgOgoreyBUb2tlbiB0OyB9Cit7CisJKAorCQl0ID0gY3ZhbHVlKCkKKwl8CXQgPSByZWYoKQorCXwJdCA9IDxOVUxMPgorCSkKKwl7IHJldHVybiB0OyB9Cit9CisKK1Rva2VuIGN2YWx1ZSgpIDoKK3sgVG9rZW4gdDsgfQoreworCSgKKwkJdCA9IDxUUlVFPgorCXwJdCA9IDxGQUxTRT4KKwl8CXQgPSA8SU5URUdFUj4KKwl8CXQgPSA8T0NUQUw+CisJfAl0ID0gPEhFWD4KKwl8CXQgPSA8QklOQVJZPgorCXwJdCA9IDxERUNJTUFMPgorCXwJdCA9IDxTVFI+IHsgZml4U3RyaW5nKCB0ICk7IH0KKwkpCisJeyByZXR1cm4gdDsgfQorfQorCit2b2lkIHN0bXRzKCBTZXJ2aWNlIGkgKSA6Cit7IE1hcDxTdHJpbmcsIE9wdD4gb3B0czsgfQoreworCSgKKwkJb3B0cyA9IG9wdHMoKQorCQkoCisJCQltaXhpbl9zdG10KCBpLCBvcHRzICkKKwkJfAlpbmNsdWRlX3N0bXQoIGksIG9wdHMgKQorCQl8CWNvbnN0X3N0bXQoIGksIG9wdHMgKQorCQl8CWVudW1fc3RtdCggaSwgb3B0cyApCisJCXwJc3RydWN0X3N0bXQoIGksIG9wdHMgKQorCQl8CWV4dGVybl9zdG10KCBpLCBvcHRzICkKKwkJfAlleGNlcHRpb25fc3RtdCggaSwgb3B0cyApCisJCXwJbWVzc2FnZV9zdG10KCBpLCBvcHRzICkKKwkJKQorCSkqCit9CisKK3ZvaWQgbWl4aW5fc3RtdCggU2VydmljZSBpLCBNYXA8U3RyaW5nLCBPcHQ+IG9wdHMgKSA6Cit7IFRva2VuIHQ7IH0KK3sKKwk8TUlYSU4+IHQgPSByZWYoKSAoIDxTRU1JPiApPworCXsgaS5hZGRNaXhpbiggbmV3IE5hbWUoIHQsIHQuaW1hZ2UgKSwgb3B0cyApOyB9Cit9CisKKwordm9pZCBpbmNsdWRlX3N0bXQoIFNlcnZpY2UgaSwgTWFwPFN0cmluZywgT3B0PiBvcHRzICkgOgoreyBUb2tlbiBmOyB9Cit7CisJPElOQ0xVREU+IGYgPSA8U1RSPiAoIDxTRU1JPiApPworCXsgCisJCWRvSW5jbHVkZSggZiwgaSApOyAKKwl9Cit9CisKK3ZvaWQgY29uc3Rfc3RtdCggU2VydmljZSBpLCBNYXA8U3RyaW5nLCBPcHQ+IG9wdHMgKSA6Cit7IFRva2VuIGs7IFR5cGVSZWYgdHI7IE5hbWUgbjsgVG9rZW4gdjsgfQoreworCWsgPSA8Q09OU1Q+IHRyID0gY3R5cGUoKSBuID0gZGVmKCkgPEVRPiB2ID0gY3ZhbHVlKCkgKCA8U0VNST4gKT8KKwl7CisJCUNvbnN0YW50IGMgPSBpLmFkZENvbnN0YW50KCBuLCBvcHRzLCB0ciwgdiApOworCQljb25zdGFudENvbW1lbnQoIGMsIGsuc3BlY2lhbFRva2VuICk7CisJfQorfQorCit2b2lkIGVudW1fc3RtdCggU2VydmljZSBpLCBNYXA8U3RyaW5nLCBPcHQ+IG9wdHMgKSA6Cit7IFRva2VuIGs7IE5hbWUgbjsgRW51bXggZTsgfQoreworCWsgPSA8RU5VTT4gbiA9IGRlZigpCisJeworCQllID0gaS5hZGRFbnVtKCBuLCBvcHRzICk7CisJCWVudW1Db21tZW50KCBlLCBrLnNwZWNpYWxUb2tlbiApOworCX0KKwk8TFBBUkVOPiBpdGVtX2xpc3QoIGUgKSA8UlBBUkVOPiAoIDxTRU1JPiApPworfQorCit2b2lkIGl0ZW1fbGlzdCggRW51bXggZSApIDoKK3sgTmFtZSBuOyBJdGVtIGk7IH0KK3sKKwluID0gZGVmKCkKKwl7CisJCWkgPSBlLmFkZEl0ZW0oIG4gKTsKKwkJaXRlbUNvbW1lbnQoIGksIG4udG9rZW4uc3BlY2lhbFRva2VuICk7CisJfQorCSgKKwkJPENPTU1BPiBuID0gZGVmKCkKKwkJeworCQkJaSA9IGUuYWRkSXRlbSggbiApOworCQkJaXRlbUNvbW1lbnQoIGksIG4udG9rZW4uc3BlY2lhbFRva2VuICk7CisJCX0KKwkpKgorfQorCit2b2lkIHN0cnVjdF9zdG10KCBTZXJ2aWNlIGksIE1hcDxTdHJpbmcsIE9wdD4gb3B0cyApIDoKK3sgVG9rZW4gazsgTmFtZSBuOyBTdHJ1Y3QgczsgVG9rZW4geDsgVG9rZW4gZTsgfQoreworCWsgPSA8U1RSVUNUPiBuID0gZGVmKCkKKwl7IHNhdmVDb21tZW50KCBrLnNwZWNpYWxUb2tlbiApOyB4ID0gZ2V0Q29tbWVudCgpOyBzID0gaS5hZGRTdHJ1Y3QoIG4sIG9wdHMgKTsgfQorCXBhcmFtcyggcyApCisJKCA8RVhURU5EUz4gZSA9IHJlZigpIHsgcy5zZXRFeHRlbmRzKCBuZXcgTmFtZSggZSwgZS5pbWFnZSApICk7IH0gKT8KKwkoIDxTRU1JPiApPworCXsgc3RydWN0Q29tbWVudCggcywgeCApOyB9Cit9CisKK3ZvaWQgZXh0ZXJuX3N0bXQoIFNlcnZpY2UgaSwgTWFwPFN0cmluZywgT3B0PiBvcHRzICkgOgoreyBOYW1lIG47IH0KK3sKKwk8RVhURVJOPiBuID0gZGVmKCkKKwl7IGkuYWRkRXh0ZXJuKCBuLCBvcHRzICk7IH0KKwkoIDxTRU1JPiApPworfQorCit2b2lkIGV4Y2VwdGlvbl9zdG10KCBTZXJ2aWNlIGksIE1hcDxTdHJpbmcsIE9wdD4gb3B0cyApIDoKK3sgVG9rZW4gazsgTmFtZSBuOyBFeGNlcHQgczsgVG9rZW4geDsgVG9rZW4gZTsgfQoreworCWsgPSA8RVhDRVBUSU9OPiBuID0gZGVmKCkKKwl7IHNhdmVDb21tZW50KCBrLnNwZWNpYWxUb2tlbiApOyB4ID0gZ2V0Q29tbWVudCgpOyBzID0gaS5hZGRFeGNlcHQoIG4sIG9wdHMgKTsgfQorCXBhcmFtcyggcyApCisJKCA8RVhURU5EUz4gZSA9IHJlZigpIHsgcy5zZXRFeHRlbmRzKCBuZXcgTmFtZSggZSwgZS5pbWFnZSApICk7IH0gKT8KKwkoIDxTRU1JPiApPworCXsgZXhjZXB0Q29tbWVudCggcywgeCApOyB9Cit9CisKK3ZvaWQgbWVzc2FnZV9zdG10KCBTZXJ2aWNlIGksIE1hcDxTdHJpbmcsIE9wdD4gb3B0cyApIDoKK3sgVHlwZVJlZiBydDsgTmFtZSBuOyBNZXNzYWdlIG07IFRva2VuIGs7IH0KK3sKKwlydCA9IHJ0eXBlKCkgbiA9IGRlZigpCisJeworCQlzYXZlQ29tbWVudCggcnQudHlwZSgpLnNwZWNpYWxUb2tlbiApOworCQlrID0gZ2V0Q29tbWVudCgpOworCQltID0gaS5hZGRNZXNzYWdlKCBuLCBvcHRzLCBydCApOworCX0KKwlwYXJhbXMoIG0gKQorCSgKKwkJPFRIUk9XUz4gdGhyb3dzX2xpc3QoIG0gKQorCSk/CisJKCA8U0VNST4gKT8KKwl7IG1lc3NhZ2VDb21tZW50KCBtLCBrICk7IH0KK30KKwordm9pZCB0aHJvd3NfbGlzdCggTWVzc2FnZSBtICkgOgoreyBUb2tlbiBuOyBUaHJvd24gdDsgfQoreworCW4gPSByZWYoKQorCXsKKwkJdCA9IG0uYWRkVGhyb3duKCBuZXcgTmFtZSggbiwgbi5pbWFnZSApICk7CisJCXRocm93bkNvbW1lbnQoIHQsIG4uc3BlY2lhbFRva2VuICk7CisJfQorCSgKKwkJPENPTU1BPiBuID0gcmVmKCkKKwkJeworCQkJdCA9IG0uYWRkVGhyb3duKCBuZXcgTmFtZSggbiwgbi5pbWFnZSApICk7CisJCQl0aHJvd25Db21tZW50KCB0LCBuLnNwZWNpYWxUb2tlbiApOworCQl9CisJKSoKK30KKworVG9rZW4gaWQoKSA6Cit7IFRva2VuIHQ7IH0KK3sKKwl0ID0gPElEPgorCXsgcmV0dXJuIHQ7IH0KK30KKworVG9rZW4gcWlkKCkgOgoreyBUb2tlbiB0OyB9Cit7CisJdCA9IDxRSUQ+CisJeyByZXR1cm4gdDsgfQorfQorCitUb2tlbiB4aWQoKSA6Cit7IFRva2VuIHQ7IH0KK3sKKwkoIHQgPSBxaWQoKSB8IHQgPSBpZCgpICkKKwl7IHJldHVybiB0OyB9Cit9CisKK05hbWUgZGVmKCkgOgoreyBUb2tlbiB0OyB9Cit7CisJdCA9IGlkKCkKKwl7IHJldHVybiBuZXcgTmFtZSggdCwgdC5pbWFnZSApOyB9Cit9CisKK1Rva2VuIHJlZigpIDoKK3sgVG9rZW4gdDsgfQoreworCXQgPSB4aWQoKQorCXsgcmV0dXJuIHQ7IH0KK30KKworVHlwZVJlZiBjdHlwZSgpIDoKK3sgVG9rZW4gdDsgfQoreworCSgKKwkJdCA9IDxCT09MRUFOPgorCXwJdCA9IDxCWVRFPgorCXwJdCA9IDxTSE9SVD4KKwl8CXQgPSA8SU5UPgorCXwJdCA9IDxMT05HPgorCXwJdCA9IDxGTE9BVD4KKwl8CXQgPSA8RE9VQkxFPgorCXwJdCA9IDxTVFJJTkc+CisJKQorCXsgcmV0dXJuIG5ldyBUeXBlUmVmKCBnaW50ZiwgdCApOyB9Cit9CisKK1R5cGVSZWYgcHR5cGUoKSA6Cit7IFR5cGVSZWYgdHI7IFRva2VuIHQ7IH0KK3sKKwkoCisJCXRyID0gY3R5cGUoKQorCXwgICB0ID0gPE9CSkVDVD4geyB0ciA9IG5ldyBUeXBlUmVmKCBnaW50ZiwgdCApOyB9CisJfAl0ID0gcmVmKCkgeyB0ciA9IG5ldyBUeXBlUmVmKCBnaW50ZiwgdCApOyB9CisJKQorCXsgcmV0dXJuIHRyOyB9Cit9CisKK1R5cGVSZWYgcnR5cGUoKSA6Cit7IFR5cGVSZWYgdHI7IFRva2VuIHQ7IGludCBkOyB9Cit7CisJKAorCQkoIHRyID0gcHR5cGUoKSBkID0gZGltKCkgeyB0ci5zZXREaW0oIGQgKTsgfSApCisJfAl0ID0gPFZPSUQ+IHsgdHIgPSBuZXcgVHlwZVJlZiggZ2ludGYsIHQgKTsgfQorCSkKKwl7IHJldHVybiB0cjsgfQorfQorCitpbnQgZGltKCkgOgoreyBpbnQgZCA9IDA7IH0KK3sKKwkoIDxMQlJBQ0tFVD4gPFJCUkFDS0VUPiB7IGQrKzsgfSApKgorCXsgcmV0dXJuIGQ7IH0KK30KKwordm9pZCBwYXJhbXMoIFBhcmFtTGlzdDw/PiBwbCApIDoKK3t9Cit7CisJPExQQVJFTj4gKCBwYXJhbSggcGwgKSAoIDxDT01NQT4gcGFyYW0oIHBsICkgKSogKT8gPFJQQVJFTj4KK30KKwordm9pZCBwYXJhbSggUGFyYW1MaXN0PD8+IHBsICkgOgoreyBUeXBlUmVmIHRyOyBpbnQgZDsgTmFtZSBuOyB9Cit7CisJdHIgPSBwdHlwZSgpIGQgPSBkaW0oKSBuID0gZGVmKCkKKwl7CisJCXRyLnNldERpbSggZCApOworCQlQYXJhbWV0ZXIgcCA9IHBsLmFkZFBhcmFtZXRlciggbiwgdHIgKTsKKwkJcGFyYW1ldGVyQ29tbWVudCggcCwgdHIudHlwZSgpLnNwZWNpYWxUb2tlbiApOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvZ2xvYmFsS2V5d29yZHMua3dkIGIvY29tcGlsZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9nbG9iYWxLZXl3b3Jkcy5rd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMjkxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvZ2xvYmFsS2V5d29yZHMua3dkCkBAIC0wLDAgKzEsMTUgQEAKKyMgJElkJAorIyAKKyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMgCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorIyBvZiB0aGUgTGljZW5zZSBhdAorIyAgCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vc2NyaXB0cy9ldGNoLmJhdCBiL2NvbXBpbGVyL3NyYy9tYWluL3NjcmlwdHMvZXRjaC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1NzNiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy9tYWluL3NjcmlwdHMvZXRjaC5iYXQKQEAgLTAsMCArMSwzNiBAQAorQHJlbSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKK0ByZW0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCitAcmVtICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorQHJlbSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKK0ByZW0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCitAcmVtICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorQHJlbSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKK0ByZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0ByZW0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCitAcmVtICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorQHJlbSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKK0ByZW0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCitAcmVtICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorQHJlbSAgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0BlY2hvIG9mZgorc2V0bG9jYWwKKworcmVtIEZpbmQgdGhlIGV0Y2ggaG9tZSBkaXJlY3RvcnkKKworc2V0IEVUQ0hfSE9NRT0lfmRwMC4uCisKK3JlbSBNYWtlIGVub3VnaCBvZiBhIGNsYXNzcGF0aCB0byBnZXQgdG8gZmlyc3QgYmFzZQorCitzZXQgRVRDSF9DUD0KK2ZvciAlJWkgaW4gKCIlRVRDSF9IT01FJVxsaWJcZXRjaC1jb21waWxlci0qLmphciIpIGRvIHNldCBFVENIX0NQPSVFVENIX0NQJTslJWkKKworcmVtIGFkZCBjbG92ZXIgdG8gY2xhc3NwYXRoIGlmIGRlZmluZWQgYW5kIGV4aXN0cworCitpZiAiJUNMT1ZFUl9IT01FJSIgPT0gIiIgZ290byBza2lwX2Nsb3ZlcgoraWYgbm90IGV4aXN0ICIlQ0xPVkVSX0hPTUUlXGxpYlxjbG92ZXIuamFyIiBnb3RvIHNraXBfY2xvdmVyCitzZXQgRVRDSF9DUD0lRVRDSF9DUCU7JUNMT1ZFUl9IT01FJVxsaWJcY2xvdmVyLmphcgorOnNraXBfY2xvdmVyCisKK2phdmEgLWNwICIlRVRDSF9DUCUiIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoTWFpbiAlKgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL21haW4vc2NyaXB0cy9ldGNoLnNoIGIvY29tcGlsZXIvc3JjL21haW4vc2NyaXB0cy9ldGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgxNjdmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvbWFpbi9zY3JpcHRzL2V0Y2guc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL3NoCisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorIyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisjICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisjICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyMgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisjICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorIyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisjICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCisjCisjIFJ1biBFdGNoIGNvbXBpbGVyLgorIworCisjIEZpbmQgSmF2YQoraWYgWyAiJHtKQVZBX0hPTUV9IiAhPSAiIiBdOyB0aGVuCisgICAgSkFWQV9DTUQ9IiR7SkFWQV9IT01FfSIvYmluL2phdmEKK2Vsc2UKKyAgICBKQVZBX0NNRD1gd2hpY2ggamF2YWAKK2ZpCitpZiBbICEgLXggIiR7SkFWQV9DTUR9IiBdOyB0aGVuCisgICAgZWNobyAiQ2Fubm90IGZpbmQgSmF2YSIKKyAgICBleGl0IDEKK2ZpCisKKyMgQ29tcHV0ZSBFVENIIEhvbWUKK2V4cG9ydCBFVENIX0hPTUU9YGRpcm5hbWUgIiQwImAvLi4KKworIyBDb21wdXRlIGNsYXNzcGF0aCBmb3IgY29tcGlsZXIKK0VUQ0hfQ1A9Citmb3IgeCBpbiBgY2QgIiR7RVRDSF9IT01FfSI7IGVjaG8gbGliL2V0Y2gtY29tcGlsZXItKi5qYXJgIDsgZG8KKyAgICBFVENIX0NQPSIke0VUQ0hfQ1B9OiR7RVRDSF9IT01FfS8keCIKK2RvbmUKKworIyBBZGQgY2xvdmVyIGlmIGluc3RhbGxlZCAuLgoraWYgWyAtZiAiJHtDTE9WRVJfSE9NRX0vbGliL2Nsb3Zlci5qYXIiIF07IHRoZW4KKyAgICBFVENIX0NQPSIke0VUQ0hfQ1B9OiR7Q0xPVkVSX0hPTUV9L2xpYi9jbG92ZXIuamFyIgorZmkKKworIyBJbnZva2UgRXRjaAorZXhlYyAiJEpBVkFfQ01EIiAtY3AgIiR7RVRDSF9DUH0iICItRGV0Y2guaG9tZT0ke0VUQ0hfSE9NRX0iIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoTWFpbiAkezErIiRAIn0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy90ZXN0L2V0Y2gvY29tbWVudHMvQ29tbWVudHMuZXRjaCBiL2NvbXBpbGVyL3NyYy90ZXN0L2V0Y2gvY29tbWVudHMvQ29tbWVudHMuZXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQzZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL3Rlc3QvZXRjaC9jb21tZW50cy9Db21tZW50cy5ldGNoCkBAIC0wLDAgKzEsNzQgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLnRlc3QKKworc2VydmljZSBDb21tZW50cworeworCS8qKi8KKwkvKioqLworCS8qKioqLworCS8qKioqKi8KKwkvKioqKioqLworCQorCS8qICovCisJLyogICovCisJLyogICAqLworCS8qICAgICovCisJLyogICAgICovCisJCisJLyogKiAqLworCS8qICogKiAqLworCS8qICogKiAqICovCisJLyogKiAqICogKiAqLworCS8qICogKiAqICogKiAqLworCQorCS8qICoqICovCisJLyogKiogKiogKi8KKwkvKiAqKiAqKiAqKiAqLworCS8qICoqICoqICoqICoqICovCisJLyogKiogKiogKiogKiogKiogKi8KKwkKKwkvKiAvICogLyAqLworCS8qIC8gKiAvICogLyAqLworCS8qIC8gKiAvICogLyAqIC8gKi8KKwkvKiAvICogLyAqIC8gKiAvICogLyAqLworCS8qIC8gKiAvICogLyAqIC8gKiAvICogLyAqLworCQorCS8vCisJLy8vCisJLy8vLworCS8vLy8vCisJCisJIworCSMjCisJIyMjCisJIyMjIworCSMjIyMjCisJCisJLy9ibGFoCisJLy8gYmxhaAorCS8vKgorCS8vICoKKwkKKwkjYmxhaAorCSMgYmxhaAorCSMvKgorCSMgLyoKKwkvLyMKKwkjLy8KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy90ZXN0L2V0Y2gvY29uc3RhbnRzL0NvbnN0YW50cy5ldGNoIGIvY29tcGlsZXIvc3JjL3Rlc3QvZXRjaC9jb25zdGFudHMvQ29uc3RhbnRzLmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5NGVmNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy90ZXN0L2V0Y2gvY29uc3RhbnRzL0NvbnN0YW50cy5ldGNoCkBAIC0wLDAgKzEsMTk4IEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci50ZXN0CisKK3NlcnZpY2UgQ29uc3RhbnRzCit7CisJLy8gZGF0YSB0eXBlcworCQorCWNvbnN0IGJvb2xlYW4gdDEgPSBmYWxzZQorCWNvbnN0IGJ5dGUgdDIgPSAwCisJY29uc3Qgc2hvcnQgdDMgPSAwCisJY29uc3QgaW50IHQ0ID0gMAorCWNvbnN0IGxvbmcgdDUgPSAwCisJY29uc3QgZmxvYXQgdDYgPSAwCisJY29uc3QgZG91YmxlIHQ3ID0gMAorCWNvbnN0IHN0cmluZyB0OCA9ICIiCisJCisJLy8gYm9vbGVhbnMKKwkKKwljb25zdCBib29sZWFuIHQgPSB0cnVlCisJY29uc3QgYm9vbGVhbiBmID0gZmFsc2UKKwkKKwkvLyBpbnRlZ2VycworCQorCWNvbnN0IGJ5dGUgeiA9IDAKKwljb25zdCBieXRlIG16ID0gLTAKKwkKKwljb25zdCBieXRlIGkxID0gMQorCWNvbnN0IGJ5dGUgaTEwID0gMTAKKwljb25zdCBieXRlIGkxMDAgPSAxMDAKKwljb25zdCBzaG9ydCBpMTAwMCA9IDEwMDAKKwljb25zdCBzaG9ydCBpMTAwMDAgPSAxMDAwMAorCWNvbnN0IGludCBpMTAwMDAwID0gMTAwMDAwCisJY29uc3QgaW50IGkxMDAwMDAwID0gMTAwMDAwMAorCWNvbnN0IGludCBpMTAwMDAwMDAgPSAxMDAwMDAwMAorCWNvbnN0IGludCBpMTAwMDAwMDAwID0gMTAwMDAwMDAwCisJY29uc3QgaW50IGkxMDAwMDAwMDAwID0gMTAwMDAwMDAwMAorCWNvbnN0IGxvbmcgaTEwMDAwMDAwMDAwID0gMTAwMDAwMDAwMDAKKwljb25zdCBsb25nIGkxMDAwMDAwMDAwMDAgPSAxMDAwMDAwMDAwMDAKKwljb25zdCBsb25nIGkxMDAwMDAwMDAwMDAwID0gMTAwMDAwMDAwMDAwMAorCWNvbnN0IGxvbmcgaTEwMDAwMDAwMDAwMDAwID0gMTAwMDAwMDAwMDAwMDAKKwljb25zdCBsb25nIGkxMDAwMDAwMDAwMDAwMDAgPSAxMDAwMDAwMDAwMDAwMDAKKwljb25zdCBsb25nIGkxMDAwMDAwMDAwMDAwMDAwID0gMTAwMDAwMDAwMDAwMDAwMAorCWNvbnN0IGxvbmcgaTEwMDAwMDAwMDAwMDAwMDAwID0gMTAwMDAwMDAwMDAwMDAwMDAKKwljb25zdCBsb25nIGkxMDAwMDAwMDAwMDAwMDAwMDAgPSAxMDAwMDAwMDAwMDAwMDAwMDAKKwljb25zdCBsb25nIGkxMDAwMDAwMDAwMDAwMDAwMDAwID0gMTAwMDAwMDAwMDAwMDAwMDAwMAorLy8JY29uc3QgbG9uZyBpMTAwMDAwMDAwMDAwMDAwMDAwMDAgPSAxMDAwMDAwMDAwMDAwMDAwMDAwMCAvLyB0b28gYmlnCisJCisJY29uc3QgYnl0ZSBtaTEgPSAtMQorCWNvbnN0IGJ5dGUgbWkxMCA9IC0xMAorCWNvbnN0IGJ5dGUgbWkxMDAgPSAtMTAwCisJY29uc3Qgc2hvcnQgbWkxMDAwID0gLTEwMDAKKwljb25zdCBzaG9ydCBtaTEwMDAwID0gLTEwMDAwCisJY29uc3QgaW50IG1pMTAwMDAwID0gLTEwMDAwMAorCWNvbnN0IGludCBtaTEwMDAwMDAgPSAtMTAwMDAwMAorCWNvbnN0IGludCBtaTEwMDAwMDAwID0gLTEwMDAwMDAwCisJY29uc3QgaW50IG1pMTAwMDAwMDAwID0gLTEwMDAwMDAwMAorCWNvbnN0IGludCBtaTEwMDAwMDAwMDAgPSAtMTAwMDAwMDAwMAorCWNvbnN0IGxvbmcgbWkxMDAwMDAwMDAwMCA9IC0xMDAwMDAwMDAwMAorCWNvbnN0IGxvbmcgbWkxMDAwMDAwMDAwMDAgPSAtMTAwMDAwMDAwMDAwCisJY29uc3QgbG9uZyBtaTEwMDAwMDAwMDAwMDAgPSAtMTAwMDAwMDAwMDAwMAorCWNvbnN0IGxvbmcgbWkxMDAwMDAwMDAwMDAwMCA9IC0xMDAwMDAwMDAwMDAwMAorCWNvbnN0IGxvbmcgbWkxMDAwMDAwMDAwMDAwMDAgPSAtMTAwMDAwMDAwMDAwMDAwCisJY29uc3QgbG9uZyBtaTEwMDAwMDAwMDAwMDAwMDAgPSAtMTAwMDAwMDAwMDAwMDAwMAorCWNvbnN0IGxvbmcgbWkxMDAwMDAwMDAwMDAwMDAwMCA9IC0xMDAwMDAwMDAwMDAwMDAwMAorCWNvbnN0IGxvbmcgbWkxMDAwMDAwMDAwMDAwMDAwMDAgPSAtMTAwMDAwMDAwMDAwMDAwMDAwCisJY29uc3QgbG9uZyBtaTEwMDAwMDAwMDAwMDAwMDAwMDAgPSAtMTAwMDAwMDAwMDAwMDAwMDAwMAorLy8JY29uc3QgbG9uZyBtaTEwMDAwMDAwMDAwMDAwMDAwMDAwID0gLTEwMDAwMDAwMDAwMDAwMDAwMDAwIC8vIHRvbyBzbWFsbAorCQorCS8vIGJpZ2dlc3QgYW5kIHNtYWxsZXN0CisJCisJY29uc3QgYnl0ZSBtaW5fYnl0ZSA9IC0xMjgKKwljb25zdCBieXRlIG1heF9ieXRlID0gMTI3CisJCisJY29uc3Qgc2hvcnQgbWluX3Nob3J0ID0gLTMyNzY4CisJY29uc3Qgc2hvcnQgbWF4X3Nob3J0ID0gMzI3NjcKKwkKKwljb25zdCBpbnQgbWluX2ludCA9IC0yMTQ3NDgzNjQ4CisJY29uc3QgaW50IG1heF9pbnQgPSAyMTQ3NDgzNjQ3CisJCisJY29uc3QgbG9uZyBtaW5fbG9uZyA9IC05MjIzMzcyMDM2ODU0Nzc1ODA4CisJY29uc3QgbG9uZyBtYXhfbG9uZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKKwkKKwljb25zdCBmbG9hdCBtaW5fZmxvYXQgPSAxLjRlLTQ1CisJY29uc3QgZmxvYXQgbWF4X2Zsb2F0ID0gMy40MDI4MjM1ZTM4CisJCisJY29uc3QgZG91YmxlIG1pbl9kb3VibGUgPSA0LjllLTMyNAorCWNvbnN0IGRvdWJsZSBtYXhfZG91YmxlID0gMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOAorCQorCS8vIGJpbmFyeQorCQorCS8vY29uc3QgaW50IGIwID0gMGIwCisJLy9jb25zdCBpbnQgYjBhID0gMGIwMAorCS8vY29uc3QgaW50IGIxID0gMGIxCisJLy9jb25zdCBpbnQgYjFhID0gMGIwMQorCS8vY29uc3QgaW50IGIyID0gMGIxMAorCS8vY29uc3QgaW50IGIzID0gMGIxMQorCQorCS8vIG9jdGFsCisJCisJY29uc3QgaW50IG8wID0gMDAKKwljb25zdCBpbnQgbzEgPSAwMQorCWNvbnN0IGludCBvMiA9IDAyCisJY29uc3QgaW50IG8zID0gMDMKKwljb25zdCBpbnQgbzQgPSAwNAorCWNvbnN0IGludCBvNSA9IDA1CisJY29uc3QgaW50IG82ID0gMDYKKwljb25zdCBpbnQgbzcgPSAwNworCWNvbnN0IGludCBvMTAgPSAwMTAKKwkKKwkvLyBoZXgKKwkKKwljb25zdCBpbnQgaDAgPSAweDAKKwljb25zdCBpbnQgaDEgPSAweDEKKwljb25zdCBpbnQgaDIgPSAweDIKKwljb25zdCBpbnQgaDMgPSAweDMKKwljb25zdCBpbnQgaDQgPSAweDQKKwljb25zdCBpbnQgaDUgPSAweDUKKwljb25zdCBpbnQgaDYgPSAweDYKKwljb25zdCBpbnQgaDcgPSAweDcKKwljb25zdCBpbnQgaDggPSAweDgKKwljb25zdCBpbnQgaDkgPSAweDkKKwljb25zdCBpbnQgaGEgPSAweGEKKwljb25zdCBpbnQgaGIgPSAweGIKKwljb25zdCBpbnQgaGMgPSAweGMKKwljb25zdCBpbnQgaGQgPSAweGQKKwljb25zdCBpbnQgaGUgPSAweGUKKwljb25zdCBpbnQgaGYgPSAweGYKKwljb25zdCBpbnQgaDEwID0gMHgxMAorCQorCS8vIGZsb2F0aW5nIHplcm9zCisJCisJY29uc3QgZmxvYXQgZjBhID0gMAorCWNvbnN0IGZsb2F0IGYwYiA9IDAuCisJY29uc3QgZmxvYXQgZjBjID0gLjAKKwljb25zdCBmbG9hdCBmMGQgPSAwLjAKKwljb25zdCBmbG9hdCBmMGUgPSAwZTAKKwkKKwljb25zdCBmbG9hdCBtZjBhID0gLTAKKwljb25zdCBmbG9hdCBtZjBiID0gLTAuCisJY29uc3QgZmxvYXQgbWYwYyA9IC0uMAorCWNvbnN0IGZsb2F0IG1mMGQgPSAtMC4wCisJY29uc3QgZmxvYXQgbWYwZSA9IC0wZTAKKwkKKwkvLyB2YXJpb3VzIGZsb2F0aW5nIG5vbi16ZXJvcworCQorCWNvbnN0IGZsb2F0IGYxYSA9IDEKKwljb25zdCBmbG9hdCBmMWIgPSAxLgorCWNvbnN0IGZsb2F0IGYxYyA9IC4xCisJY29uc3QgZmxvYXQgZjFkID0gMS4xCisJY29uc3QgZmxvYXQgZjFlID0gMWUwCisJCisJY29uc3QgZmxvYXQgbWYxYSA9IC0xCisJY29uc3QgZmxvYXQgbWYxYiA9IC0xLgorCWNvbnN0IGZsb2F0IG1mMWMgPSAtLjEKKwljb25zdCBmbG9hdCBtZjFkID0gLTEuMQorCWNvbnN0IGZsb2F0IG1mMWUgPSAtMWUwCisJCisJLy8gZmxvYXRpbmcgYmlnIGFuZCBzbWFsbAorCQorCS8vY29uc3QgZmxvYXQgZmJpZyA9IDEyMzQ1Njc4OTAuMDk4NzY1NDMyMWUxMjM0NTY3ODkwCisJLy9jb25zdCBmbG9hdCBtZmJpZyA9IC0xMjM0NTY3ODkwLjA5ODc2NTQzMjFlMTIzNDU2Nzg5MAorCS8vY29uc3QgZmxvYXQgZnNtYWxsID0gMTIzNDU2Nzg5MC4wOTg3NjU0MzIxZS0xMjM0NTY3ODkwCisJLy9jb25zdCBmbG9hdCBtZnNtYWxsID0gLTEyMzQ1Njc4OTAuMDk4NzY1NDMyMWUtMTIzNDU2Nzg5MAorCQorCS8vIHN0cmluZ3MKKwkKKwljb25zdCBzdHJpbmcgYmxhbmsgPSAiIgorCQorCWNvbnN0IHN0cmluZyBzMSA9ICJhIgorCWNvbnN0IHN0cmluZyBzMiA9ICJhYiIKKwljb25zdCBzdHJpbmcgczMgPSAiYWJjIgorCWNvbnN0IHN0cmluZyBzNCA9ICJhYmNkIgorCWNvbnN0IHN0cmluZyBzNSA9ICJhYmNkZSIKKwkKKwljb25zdCBzdHJpbmcgZTEgPSAiXCIiCisJY29uc3Qgc3RyaW5nIGUyID0gIlxcIgorCWNvbnN0IHN0cmluZyBlMyA9ICJcdCIKKwljb25zdCBzdHJpbmcgZTQgPSAiXHIiCisJY29uc3Qgc3RyaW5nIGU1ID0gIlxuIgorCWNvbnN0IHN0cmluZyBlNiA9ICJcdTAwNTRoaXMgaXMgYSBcdTAwNzRlc3Qgb2ZcdTAwMjB1bmljb2RlIGVzY2FwZXNcdTAwMmUiCisJY29uc3Qgc3RyaW5nIGU3ID0gIlx1MDBhMVVzZSB1bmljb2RlIGVzY2FwZXMgdG8gXHUyMDFjcXVvdGVcdTIwMWQgdGhpbmdzISIKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL1Rlc3RFdGNoTWFpbi5qYXZhIGIvY29tcGlsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvVGVzdEV0Y2hNYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyZDg5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL1Rlc3RFdGNoTWFpbi5qYXZhCkBAIC0wLDAgKzEsMzQ0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiBFdGNoTWFpbi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RFdGNoTWFpbgoreworCXByaXZhdGUgZmluYWwgTXlFdGNoTWFpbiBwcm9nID0gbmV3IE15RXRjaE1haW4oKTsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVCA9ICItLXRlc3RpbmciOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBCSU5ESU5HID0gIm51bGwiOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBvcHRpb24gLWIgbm90IHNwZWNpZmllZAorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCB9ICk7CisJCWFzc2VydEVxdWFscyggMSwgcHJvZy5jb2RlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBtaXNzaW5nIHZhbHVlIGZvciBvcHRpb24gLWIKKwkJcHJvZy5kb01haW4oIG5ldyBTdHJpbmdbXSB7IFQsICItYiIgfSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHByb2cuY29kZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbWlzc2luZyBmaWxlIG5hbWUKKwkJcHJvZy5kb01haW4oIG5ldyBTdHJpbmdbXSB7IFQsICItYiIsICJ4eHgiIH0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBwcm9nLmNvZGUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGJpbmRpbmcgbmFtZSBpcyBib2d1cworCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi1iIiwgInh4eCIsICJ5eXkiIH0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBwcm9nLmNvZGUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0NSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHNvdXJjZSBmaWxlIGRvZXNuJ3QgZXhpc3QKKwkJcHJvZy5kb01haW4oIG5ldyBTdHJpbmdbXSB7IFQsICItYiIsIEJJTkRJTkcsICJ5eXkiIH0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBwcm9nLmNvZGUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0NigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHNvdXJjZSBmaWxlIGRvZXNuJ3QgZW5kIGluIC5ldGNoCisJCXByb2cuZG9NYWluKCBuZXcgU3RyaW5nW10geyBULCAiLWIiLCBCSU5ESU5HLCBmaW5kVGVzdFR4dCgpIH0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBwcm9nLmNvZGUgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3Q3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi1iIiwgQklORElORywgZmluZFRlc3RFdGNoKCkgfSApOworCQlpZiAocHJvZy5jb2RlICE9IDApCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJUZXN0RXRjaE1haW4udGVzdDcgbXNncyA9ICIrCisJCQkJKChMaXN0TG9nSGFuZGxlcikgcHJvZy50ZXN0aW5nQ2xvLmxoKS5tc2dzICk7CisJCWFzc2VydEVxdWFscyggMCwgcHJvZy5jb2RlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0OCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGNvbXBpbGF0aW9uIHNob3VsZCBoYXZlIHdvcmtlZC4KKwkJcHJvZy5kb01haW4oIG5ldyBTdHJpbmdbXSB7fSApOworCQlhc3NlcnROdWxsKCBwcm9nLnRlc3RpbmdDbG8gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCB9ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlR2xvYmFsV29yZHNMaXN0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlTG9jYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub01peGluQXJ0aWZhY3RzICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ubm9GbGF0dGVuUGFja2FnZXMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5xdWlldCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUluY2x1ZGVQYXRoICk7CisJCWFzc2VydFRydWUoIHByb2cudGVzdGluZ0Nsby50ZXN0aW5nICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0MTAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBjb21waWxhdGlvbiBzaG91bGQgaGF2ZSB3b3JrZWQuCisJCXByb2cuZG9NYWluKCBuZXcgU3RyaW5nW10geyBULCAiLXEiIH0gKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVMb2NhbFdvcmRzTGlzdCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLm5vTWl4aW5BcnRpZmFjdHMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub0ZsYXR0ZW5QYWNrYWdlcyApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8ucXVpZXQgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVJbmNsdWRlUGF0aCApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8udGVzdGluZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi0tcXVpZXQiIH0gKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVMb2NhbFdvcmRzTGlzdCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLm5vTWl4aW5BcnRpZmFjdHMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub0ZsYXR0ZW5QYWNrYWdlcyApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8ucXVpZXQgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVJbmNsdWRlUGF0aCApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8udGVzdGluZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi1nIiB9ICk7CisJCWFzc2VydFRydWUoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVMb2NhbFdvcmRzTGlzdCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLm5vTWl4aW5BcnRpZmFjdHMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub0ZsYXR0ZW5QYWNrYWdlcyApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLnF1aWV0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlSW5jbHVkZVBhdGggKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy50ZXN0aW5nQ2xvLnRlc3RpbmcgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3QxMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGNvbXBpbGF0aW9uIHNob3VsZCBoYXZlIHdvcmtlZC4KKwkJcHJvZy5kb01haW4oIG5ldyBTdHJpbmdbXSB7IFQsICItLWlnbm9yZS1nbG9iYWwtd29yZHMtbGlzdCIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlR2xvYmFsV29yZHNMaXN0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlTG9jYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub01peGluQXJ0aWZhY3RzICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ubm9GbGF0dGVuUGFja2FnZXMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5xdWlldCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUluY2x1ZGVQYXRoICk7CisJCWFzc2VydFRydWUoIHByb2cudGVzdGluZ0Nsby50ZXN0aW5nICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0MTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBjb21waWxhdGlvbiBzaG91bGQgaGF2ZSB3b3JrZWQuCisJCXByb2cuZG9NYWluKCBuZXcgU3RyaW5nW10geyBULCAiLWwiIH0gKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUxvY2FsV29yZHNMaXN0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ubm9NaXhpbkFydGlmYWN0cyApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLm5vRmxhdHRlblBhY2thZ2VzICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ucXVpZXQgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVJbmNsdWRlUGF0aCApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8udGVzdGluZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDE1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi0taWdub3JlLWxvY2FsLXdvcmRzLWxpc3QiIH0gKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUxvY2FsV29yZHNMaXN0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ubm9NaXhpbkFydGlmYWN0cyApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLm5vRmxhdHRlblBhY2thZ2VzICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ucXVpZXQgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVJbmNsdWRlUGF0aCApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8udGVzdGluZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDE2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi1pIiB9ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlR2xvYmFsV29yZHNMaXN0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlTG9jYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub01peGluQXJ0aWZhY3RzICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ubm9GbGF0dGVuUGFja2FnZXMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5xdWlldCApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlSW5jbHVkZVBhdGggKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy50ZXN0aW5nQ2xvLnRlc3RpbmcgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3QxNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGNvbXBpbGF0aW9uIHNob3VsZCBoYXZlIHdvcmtlZC4KKwkJcHJvZy5kb01haW4oIG5ldyBTdHJpbmdbXSB7IFQsICItLWlnbm9yZS1pbmNsdWRlLXBhdGgiIH0gKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVMb2NhbFdvcmRzTGlzdCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLm5vTWl4aW5BcnRpZmFjdHMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub0ZsYXR0ZW5QYWNrYWdlcyApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLnF1aWV0ICk7CisJCWFzc2VydFRydWUoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVJbmNsdWRlUGF0aCApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8udGVzdGluZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDE4KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi1uIiB9ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlR2xvYmFsV29yZHNMaXN0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlTG9jYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy50ZXN0aW5nQ2xvLm5vTWl4aW5BcnRpZmFjdHMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5ub0ZsYXR0ZW5QYWNrYWdlcyApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLnF1aWV0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8uaWdub3JlSW5jbHVkZVBhdGggKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy50ZXN0aW5nQ2xvLnRlc3RpbmcgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3QxOSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGNvbXBpbGF0aW9uIHNob3VsZCBoYXZlIHdvcmtlZC4KKwkJcHJvZy5kb01haW4oIG5ldyBTdHJpbmdbXSB7IFQsICItLW5vLW1peGluLWFydGlmYWN0cyIgfSApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUdsb2JhbFdvcmRzTGlzdCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUxvY2FsV29yZHNMaXN0ICk7CisJCWFzc2VydFRydWUoIHByb2cudGVzdGluZ0Nsby5ub01peGluQXJ0aWZhY3RzICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ubm9GbGF0dGVuUGFja2FnZXMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5xdWlldCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUluY2x1ZGVQYXRoICk7CisJCWFzc2VydFRydWUoIHByb2cudGVzdGluZ0Nsby50ZXN0aW5nICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0MjAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBjb21waWxhdGlvbiBzaG91bGQgaGF2ZSB3b3JrZWQuCisJCXByb2cuZG9NYWluKCBuZXcgU3RyaW5nW10geyBULCAiLWYiIH0gKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVMb2NhbFdvcmRzTGlzdCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLm5vTWl4aW5BcnRpZmFjdHMgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy50ZXN0aW5nQ2xvLm5vRmxhdHRlblBhY2thZ2VzICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ucXVpZXQgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5pZ25vcmVJbmNsdWRlUGF0aCApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8udGVzdGluZyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDIxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tcGlsYXRpb24gc2hvdWxkIGhhdmUgd29ya2VkLgorCQlwcm9nLmRvTWFpbiggbmV3IFN0cmluZ1tdIHsgVCwgIi0tbm8tZmxhdHRlbi1wYWNrYWdlcyIgfSApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUdsb2JhbFdvcmRzTGlzdCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUxvY2FsV29yZHNMaXN0ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnRlc3RpbmdDbG8ubm9NaXhpbkFydGlmYWN0cyApOworCQlhc3NlcnRUcnVlKCBwcm9nLnRlc3RpbmdDbG8ubm9GbGF0dGVuUGFja2FnZXMgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cudGVzdGluZ0Nsby5xdWlldCApOworCQlhc3NlcnRGYWxzZSggcHJvZy50ZXN0aW5nQ2xvLmlnbm9yZUluY2x1ZGVQYXRoICk7CisJCWFzc2VydFRydWUoIHByb2cudGVzdGluZ0Nsby50ZXN0aW5nICk7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGZpbmRUZXN0VHh0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGZpbmRGaWxlKCAidGVzdC50eHQiICk7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGZpbmRUZXN0RXRjaCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBmaW5kRmlsZSggInRlc3QuZXRjaCIgKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZmluZEZpbGUoIFN0cmluZyBmbiApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1ID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSggZm4gKTsKKwkJRmlsZSBmID0gbmV3IEZpbGUoIG5ldyBVUkkoIHUudG9TdHJpbmcoKSApICk7CisJCXJldHVybiBmLmdldEFic29sdXRlUGF0aCgpOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIE15RXRjaE1haW4gZXh0ZW5kcyBFdGNoTWFpbgorCXsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGV4aXQoIGludCBjb2RlLCBTdHJpbmcgc291cmNlLCBTdHJpbmcgcmVhc29uLAorCQkJYm9vbGVhbiBlbWVyZ2VuY3kgKQorCQl7CisJCQl0aGlzLmNvZGUgPSBjb2RlOworCQl9CisJCQorCQkvKiogdGhlIGV4aXQgY29kZSAqLworCQlwdWJsaWMgaW50IGNvZGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvVGVzdE1hcFdvcmRzLmphdmEgYi9jb21waWxlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9UZXN0TWFwV29yZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE2Nzc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvVGVzdE1hcFdvcmRzLmphdmEKQEAgLTAsMCArMSw0MzQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTW9kdWxlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuTmFtZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5QYXJhbUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLmFzdC5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5hc3QuVHlwZVJlZjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVW5pdFRlc3QgZm9yIHRoZSBtYXBXb3JkcyhTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4pIG1ldGhvZCBpbiBCYWNrZW5kLgorICogVGhlc2UgdGVzdHMgcmVseSBvbiBtYXBXb3Jkc1Rlc3RGaWxlT25lIGFuZCBtYXBXb3Jkc1Rlc3RGaWxlVHdvIGJlaW5nIGluIHRoZQorICogc2FtZSBkaXJlY3RvcnkgYXMgdGhpcyBmaWxlIGZvciB0ZXN0aW5nLiAgVGVzdGluZyBpbmNsdWRlcyBwYXJzaW5nIHRoZXNlCisgKiBmaWxlcywgY2hlY2tpbmcgcmVjb3ZlcnkgZnJvbSBiYWQgc3ludGF4IGFuZCBleHBlY3RlZCByZXN1bHRzIGZyb20gc3VjY2VzZnVsCisgKiBwYXJzaW5nLgorICovCitwdWJsaWMgY2xhc3MgVGVzdE1hcFdvcmRzCit7CisJLyoqCisJICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBCYWNrZW5kLiAgVGhlIG9ubHkgZnVuY3Rpb24geW91IG1heSBhc3N1bWUKKwkgKiB3b3JrcyBpcyBtYXBXb3JkcyhTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4uCisJICovCisJcHJpdmF0ZSBjbGFzcyBXb3JkTWFwcGVyIGV4dGVuZHMgQmFja2VuZAorCXsKKwkJLyoqCisJCSAqCisJCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJCSAqLworCQlwdWJsaWMgV29yZE1hcHBlcigpCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8uCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBhc3luY1JlY2VpdmVyUG9vbE5hbWUoIE1lc3NhZ2UgbXNnICkKKwkJeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBlbnVtX2VmcW5hbWUoIFN0cmluZyBmcW5hbWUsIFN0cmluZyBtb2R1bGVOYW1lLAorCQkJU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgZW51bU5hbWUgKQorCQl7CisJCQkvLyBOb3QgbmVlZGVkIGZvciB0ZXN0aW5nCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGV4Y2VwdF9lZnFuYW1lKCBTdHJpbmcgZnFuYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGVudW1OYW1lICkKKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBmb3JtYXRTdHJpbmcoIFBhcmFtTGlzdDxTZXJ2aWNlPiBuLCBib29sZWFuIGlzRXhjZXB0ICkKKwkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgZ2VuZXJhdGUoIE1vZHVsZSBtb2R1bGUsIENtZExpbmVPcHRpb25zIG9wdGlvbnMgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBOb3QgbmVlZGVkIGZvciB0ZXN0aW5nCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRMYW5nKCkKKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXROYXRpdmVUeXBlTmFtZSggVHlwZVJlZiB0eXBlICkKKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSggVHlwZVJlZiB0eXBlICkKKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUeXBlVmFsdWUoIFR5cGVSZWYgdHlwZSwgVG9rZW4gdmFsdWUgKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCS8vIE5vdCBuZWVkZWQgZm9yIHRlc3RpbmcKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yKCBOYW1lZDw/PiBuYW1lZCApCisJCXsKKwkJCS8vIE5vdCBuZWVkZWQgZm9yIHRlc3RpbmcKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgbWZ2bmFtZSggU3RyaW5nIHZuYW1lICkKKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBtdHZuYW1lKCBTdHJpbmcgdm5hbWUgKQorCQl7CisJCQkvLyBOb3QgbmVlZGVkIGZvciB0ZXN0aW5nCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHF1YWxpZnlDb25zdGFudE5hbWUoIFNlcnZpY2UgaW50ZiwgVG9rZW4gbmFtZSApCisJCXsKKwkJCS8vIE5vdCBuZWVkZWQgZm9yIHRlc3RpbmcKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgcXVhbGlmeUVudW1OYW1lKCBTZXJ2aWNlIGludGYsIFRva2VuIG5hbWUgKQorCQl7CisJCQkvLyBOb3QgbmVlZGVkIGZvciB0ZXN0aW5nCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHF1YWxpZnlQYXJhbWV0ZXJOYW1lKCBUb2tlbiBuYW1lICkKKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBzdHJ1Y3RfZWZxbmFtZSggU3RyaW5nIGZxbmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUsCisJCQlTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBlbnVtTmFtZSApCisJCXsKKwkJCS8vIE5vdCBuZWVkZWQgZm9yIHRlc3RpbmcKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG1hcFdvcmRzKFN0cmluZyBmaWxlTmFtZSwgTWFwPFN0cmluZywgU3RyaW5nPiB3b3JkTWFwKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwkJeworCQkJc3VwZXIubWFwV29yZHMoZmlsZU5hbWUsIHdvcmRNYXApOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGFkZERlZmF1bHRzKCBTZXJ2aWNlIHNlcnZpY2UgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkJeworCQkJLy8gTm90IG5lZWRlZCBmb3IgdGVzdGluZworCQl9CisJfQorCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG1wUGF0aDEgPSAib3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyLyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRtcFBhdGgyID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG1wUGF0aDMgPSAicmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci8iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHBhdGggPSB7dG1wUGF0aDEsIHRtcFBhdGgyLCB0bXBQYXRoM307CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlyc3RGaWxlID0gIm1hcFdvcmRzVGVzdEZpbGVPbmUua3dkIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2Vjb25kRmlsZSA9ICJtYXBXb3Jkc1Rlc3RGaWxlVHdvLmt3ZCI7CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IG15TWFwOworCXByaXZhdGUgc3RhdGljIFdvcmRNYXBwZXIgbXlNYXBwZXI7CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGZpcnN0TWFwcGluZzsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGZpcnN0U2Vjb25kTWFwcGluZzsKKworCisJLyoqCisJICogUmVpbml0aWFsaXplIGJhc2VsaW5lIGJlZm9yZSBlYWNoIHRlc3QuICBUbyBiZSBzYWZlLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc3RhcnRVcCgpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCW15TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJbXlNYXBwZXIgPSBuZXcgV29yZE1hcHBlcigpOworCQlteU1hcHBlci5tYXBXb3JkcyhnZXRQYXRoKHBhdGgsIGZpcnN0RmlsZSksIG15TWFwKTsKKworCQlmaXJzdE1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJZmlyc3RTZWNvbmRNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJLy8gVGhlIHJlc3VsdHMgb2YgcGFyc2luZyB0aGUgZmlyc3RGaWxlIGludG8gYSBuZXcgbWFwCisJCWZvciAoaW50IGkgPSAxOyBpIDwgNTsgKytpKQorCQkJZmlyc3RNYXBwaW5nLnB1dCgia2V5IiArIEludGVnZXIudG9TdHJpbmcoaSksICJ4a2V5IiArIEludGVnZXIudG9TdHJpbmcoaSkpOworCQlmb3IgKGludCBpID0gNTsgaSA8IDE2OyArK2kpCisJCQlmaXJzdE1hcHBpbmcucHV0KCJrZXkiICsgSW50ZWdlci50b1N0cmluZyhpKSwgInZhbHVlIiArIEludGVnZXIudG9TdHJpbmcoaSkpOworCQlmaXJzdE1hcHBpbmcucHV0KCJrZXkxNiIsICJ2YWx1ZTE3Iik7CisJCWZpcnN0TWFwcGluZy5wdXQoImtleTE3IiwgInZhbHVlMTciKTsKKwkJZmlyc3RNYXBwaW5nLnB1dCgia2V5MTgiLCAieGtleTE4Iik7CisJCWZpcnN0TWFwcGluZy5wdXQoIktleTE5IiwgIlhLZXkxOSIpOworCQlmaXJzdE1hcHBpbmcucHV0KCJLRVkyMCIsICJYS0VZMjAiKTsKKwkJZmlyc3RNYXBwaW5nLnB1dCgia0V5MjEiLCAieGtFeTIxIik7CisKKwkJLy8gVGhlIHJlc3VsdHMgb2YgcGFyc2luZyB0aGUgZmlyc3RGaWxlIGludG8gYSBuZXcgbWFwLCBhbmQgdGhlbiBwYXJzaW5nCisJCS8vIHRoZSBzZWNvbmRGaWxlIGludG8gdGhlIHNhbWUgbWFwCisJCWZpcnN0U2Vjb25kTWFwcGluZy5wdXRBbGwoZmlyc3RNYXBwaW5nKTsKKwkJZmlyc3RTZWNvbmRNYXBwaW5nLnB1dCgia2V5MSIsICJmb28iKTsKKwkJZmlyc3RTZWNvbmRNYXBwaW5nLnB1dCgia2V5NSIsICJ4a2V5NSIpOworCQlmaXJzdFNlY29uZE1hcHBpbmcucHV0KCJLZXkxOSIsICJiYXIiKTsKKwkJZmlyc3RTZWNvbmRNYXBwaW5nLnB1dCgiS0VZMjAiLCAiS0VZMjAiKTsKKwkJZmlyc3RTZWNvbmRNYXBwaW5nLnB1dCgia2V5MjIiLCAieGtleTIyIik7CisJCWZpcnN0U2Vjb25kTWFwcGluZy5wdXQoImtleTIzIiwgInZhbHVlMjMiKTsKKwl9CisKKworCS8qKgorCSAqIEJhc2ljIHRlc3QgdG8gZW5zdXJlIGZpbGVzIGNhbiBiZSBwYXJzZWQgd2l0aG91dCBjb21tZW50cywgd2hpdGVzcGFjZSBvcgorCSAqIGJhZCBzeW50YXggY3Jhc2hpbmcgdGhlIGZ1bmN0aW9uLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNpbXBsZVBhcnNlKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5zaXplKCksIG15TWFwLnNpemUoKSk7CisJfQorCisJLyoqCisJICogT3ZlcmFsbCB0ZXN0IHRvIHNlZSBpZiB0aGUgZmlyc3QgZmlsZSBwYXJzZWQgd2l0aCBleHBlY3RlZCByZXN1bHRzLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGV4cGVjdGVkUmVzdWx0cygpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcsIG15TWFwKTsKKwl9CisKKwkvKioKKwkgKiBBc3NlcnQgY29tbWVudHMgdHJhaWxpbmcgbWFwcGluZ3MgYXJlbid0IHBhcnNlZC4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0cmFpbGluZ0NvbW1lbnRzKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gY29tbWVudHMgYWZ0ZXIgaW1wbGljaXQgbWFwcGluZ3MKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTEiKSwgbXlNYXAuZ2V0KCJrZXkxIikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MiIpLCBteU1hcC5nZXQoImtleTIiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkzIiksIG15TWFwLmdldCgia2V5MyIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTQiKSwgbXlNYXAuZ2V0KCJrZXk0IikpOworCisJCS8vIGNvbW1lbnRzIGFmdGVyIGV4cGxpY2l0IG1hcHBpbmdzCisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXk2IiksIG15TWFwLmdldCgia2V5NiIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTciKSwgbXlNYXAuZ2V0KCJrZXk3IikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5OCIpLCBteU1hcC5nZXQoImtleTgiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkxMCIpLCBteU1hcC5nZXQoImtleTEwIikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MTEiKSwgbXlNYXAuZ2V0KCJrZXkxMSIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTEzIiksIG15TWFwLmdldCgia2V5MTMiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkxNCIpLCBteU1hcC5nZXQoImtleTE0IikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MTUiKSwgbXlNYXAuZ2V0KCJrZXkxNSIpKTsKKwl9CisKKwkvKioKKwkgKiBBc3NlcnQgZXhwbGljaXQgbWFwcGluZ3Mgd29yay4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBleHBsaWNpdE1hcHBpbmdzKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTUiKSwgbXlNYXAuZ2V0KCJrZXk1IikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5NiIpLCBteU1hcC5nZXQoImtleTYiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXk3IiksIG15TWFwLmdldCgia2V5NyIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTgiKSwgbXlNYXAuZ2V0KCJrZXk4IikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5OSIpLCBteU1hcC5nZXQoImtleTkiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkxMCIpLCBteU1hcC5nZXQoImtleTEwIikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MTEiKSwgbXlNYXAuZ2V0KCJrZXkxMSIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTEyIiksIG15TWFwLmdldCgia2V5MTIiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkxMyIpLCBteU1hcC5nZXQoImtleTEzIikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MTQiKSwgbXlNYXAuZ2V0KCJrZXkxNCIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTE1IiksIG15TWFwLmdldCgia2V5MTUiKSk7CisJfQorCisJLyoqCisJICogQXNzZXJ0IGltcGxpY2l0IG1hcHBpbmdzIHdvcmsuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wbGljaXRNYXBwaW5ncygpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkxIiksIG15TWFwLmdldCgia2V5MSIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTIiKSwgbXlNYXAuZ2V0KCJrZXkyIikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MyIpLCBteU1hcC5nZXQoImtleTMiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXk0IiksIG15TWFwLmdldCgia2V5NCIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTE4IiksIG15TWFwLmdldCgia2V5MTgiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkxOSIpLCBteU1hcC5nZXQoImtleTE5IikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MjAiKSwgbXlNYXAuZ2V0KCJrZXkyMCIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTIxIiksIG15TWFwLmdldCgia2V5MjEiKSk7CisJfQorCisJLyoqCisJICogQXNzZXJ0IHJlcGVhdGVkIG1hcHBpbmdzIG92ZXJ3cml0ZS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBvdmVyd3JpdHRlbk1hcHBpbmdzKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTE2IiksIG15TWFwLmdldCgia2V5MTYiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkxNyIpLCBteU1hcC5nZXQoImtleTE3IikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MTgiKSwgbXlNYXAuZ2V0KCJrZXkxOCIpKTsKKwl9CisKKwkvKioKKwkgKiBBc3NlcnQgaW1wbGljaXQgbWFwcGluZ3MgaGF2ZSBhbiB1cHBlcmNhc2UgJ3gnIHdoZXJlIGFwcHJvcHJpYXRlLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwY2FzaW5nKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZy5nZXQoImtleTE5IiksIG15TWFwLmdldCgia2V5MTkiKSk7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuZ2V0KCJrZXkyMCIpLCBteU1hcC5nZXQoImtleTIwIikpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLmdldCgia2V5MjEiKSwgbXlNYXAuZ2V0KCJrZXkyMSIpKTsKKwl9CisKKwkvKioKKwkgKiBBc3NlcnQgdGhhdCByZXBlYXRlZCBtYXBwaW5ncyBjYXVzZSBjaGFuZ2Ugd2hlbiBtYXBwaW5nIGEgc2Vjb25kIGZpbGUuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHdvUGFyc2luZ3MoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLCBteU1hcCk7CisJCW15TWFwcGVyLm1hcFdvcmRzKGdldFBhdGgocGF0aCwgc2Vjb25kRmlsZSksIG15TWFwKTsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0U2Vjb25kTWFwcGluZywgbXlNYXApOworCX0KKworCS8qKgorCSAqIEFzc2VydCB0aGF0IHJlcGVhdGVkIG1hcHBpbmdzIGNoYW5nZSB0aGUgbWFwcGluZ3MgdGhleSBzaG91bGQKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBtdWx0aVBhcnNpbmdzKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKGZpcnN0TWFwcGluZywgbXlNYXApOworCQlteU1hcHBlci5tYXBXb3JkcyhnZXRQYXRoKHBhdGgsIHNlY29uZEZpbGUpLCBteU1hcCk7CisJCWFzc2VydEVxdWFscyhmaXJzdFNlY29uZE1hcHBpbmcsIG15TWFwKTsKKwkJbXlNYXBwZXIubWFwV29yZHMoZ2V0UGF0aChwYXRoLCBmaXJzdEZpbGUpLCBteU1hcCk7CisKKwkJLy8gQWRkIHRoZSBuZXcgcGFyc2luZ3MgYW5kIHJlLWNoZWNrCisJCWZpcnN0TWFwcGluZy5wdXQoImtleTIyIiwgInhrZXkyMiIpOworCQlmaXJzdE1hcHBpbmcucHV0KCJrZXkyMyIsICJ2YWx1ZTIzIik7CisJCWFzc2VydEVxdWFscyhmaXJzdE1hcHBpbmcuc2l6ZSgpLCBteU1hcC5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoZmlyc3RNYXBwaW5nLCBteU1hcCk7CisJfQorCisJLy8gLS0tLS0tLQorCS8vIEhlbHBlcnMKKwkvLyAtLS0tLS0tCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IHBhdGggdG8gYSByZXNvdXJjZS4KKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aHMgdG8gdHJ5IGZvciBvcGVuaW5nIHRoZSByZXNvdXJjZXMKKwkgKiBAcGFyYW0gZm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0byBvcGVuCisJICogQHJldHVybiB0aGUgY29ycmVjdCBwYXRoIHRvIGEgcmVzb3VyY2UKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChTdHJpbmdbXSBwYXRoLCBTdHJpbmcgZm4pCisJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwl7CisJCWZvciAoU3RyaW5nIHA6IHBhdGgpCisJCXsKKwkJCWlmIChwID09IG51bGwpCisJCQkJY29udGludWU7CisJCQkKKwkJCVN0cmluZyBzID0gcCArIGZuOworCQkJCisJCQlVUkwgdGVtcCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKHMpOworCQkJaWYgKHRlbXAgIT0gbnVsbCkKKwkJCQkJcmV0dXJuIHM7CisJCX0KKwkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9tYXBXb3Jkc1Rlc3RGaWxlT25lLmt3ZCBiL2NvbXBpbGVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvbWFwV29yZHNUZXN0RmlsZU9uZS5rd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4YmEzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvbWFwV29yZHNUZXN0RmlsZU9uZS5rd2QKQEAgLTAsMCArMSw0NCBAQAorIyAkSWQkCisjIAorIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIG9mIHRoZSBMaWNlbnNlIGF0CisjICAKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXaGl0ZXNwYWNlIGJldHdpeHQgY29tbWVudHMKK2tleTEKK2tleTIjQ29tbWVudCBmb2xsb3dpbmcgZGlyZWN0bHkgYWZ0ZXIgYSBrZXkKK2tleTMgIyBTaW1wbGUgQ29tbWVudAora2V5NCAgIyBNdWx0aSBzcGFjZSBjb21tZW50CisKK2tleTUgPSB2YWx1ZTUKK2tleTYgPSB2YWx1ZTYjQ29tbWVudCBmb2xsb3dpbmcgZGlyZWN0bHkgYWZ0ZXIgYSB2YWx1ZQora2V5NyA9IHZhbHVlNyAjIFNpbXBsZSBDb21tZW50CitrZXk4ID0gdmFsdWU4ICAjIE11bHRpIHNwYWNlIGNvbW1lbnQKK2tleTk9dmFsdWU5CitrZXkxMD12YWx1ZTEwI0NvbW1lbnQgZm9sbG93aW5nIGRpcmVjdGx5IGFmdGVyIGEgbm9uLXNwYWNlZCB2YWx1ZQora2V5MTE9dmFsdWUxMSAjIFNpbXBsZSBDb21tZW50CitrZXkxMiB2YWx1ZTEyCitrZXkxMyB2YWx1ZTEzI0NvbW1lbnQgZm9sbG93aW5nIGRpcmVjdGx5IGFmdGVyIGEgdmFsdWUKK2tleTE0IHZhbHVlMTQgIyBTaW1wbGUgQ29tbWVudAora2V5MTUgdmFsdWUxNSAgIyBNdWx0aSBzcGFjZSBjb21tZW50CisKK2tleTE2IHZhbHVlMTYKK2tleTE2IHZhbHVlMTcKK2tleTE3CitrZXkxNyB2YWx1ZTE3CitrZXkxOCB2YWx1ZTE4CitrZXkxOAorCitLZXkxOQorS0VZMjAKK2tFeTIxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci9tYXBXb3Jkc1Rlc3RGaWxlVHdvLmt3ZCBiL2NvbXBpbGVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvbWFwV29yZHNUZXN0RmlsZVR3by5rd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2MzRlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvbWFwV29yZHNUZXN0RmlsZVR3by5rd2QKQEAgLTAsMCArMSwyMiBAQAorIyAkSWQkCisjIAorIyBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorIyAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisjIG9mIHRoZSBMaWNlbnNlIGF0CisjICAKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKwora2V5MSA9IGZvbwora2V5NQorS2V5MTkgPSBiYXIKK0tFWTIwIAkJCQkJCQkJCQkJCQkJCQkJS0VZMjAKK2tleTIyCitrZXkyMyA9IHZhbHVlMjMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL3Rlc3QuZXRjaCBiL2NvbXBpbGVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvdGVzdC5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTM0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL2NvbXBpbGVyL3Rlc3QuZXRjaApAQCAtMCwwICsxLDI0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKi8KK21vZHVsZSBmb28KKworc2VydmljZSBGb28KK3sKKwl2b2lkIGhlbGxvV29ybGQoIHN0cmluZyBtc2cgKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC9jb21waWxlci90ZXN0LnR4dCBiL2NvbXBpbGVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvdGVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwM2Y2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvY29tcGlsZXIvdGVzdC50eHQKQEAgLTAsMCArMSBAQAorZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGNvbXBpbGVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V0Y2gucHJvcGVydGllcyBiL2V0Y2gucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM1NWVjCi0tLSAvZGV2L251bGwKKysrIGIvZXRjaC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK21ham9yVmVyc2lvbj0xCittaW5vclZlcnNpb249MQorcGF0Y2hWZXJzaW9uPTAKK3N1ZmZpeD0taW5jdWJhdGluZwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYnVpbGQueG1sIGIvZXhhbXBsZXMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTkxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9idWlsZC54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtZXhhbXBsZXMiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiPgorICAgIDxkZXNjcmlwdGlvbj5FdGNoIEV4YW1wbGVzPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGFyZ2V0IiAvPgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZG8tY2xlYW4iPgorICAgICAgICA8YnVpbGRfZXhhbXBsZSBkaXI9ImNoYXQiIGxvZ2Rpcj0iJHtiYXNlZGlyfS90YXJnZXQvbG9ncyIgLz4KKyAgICAgICAgPGJ1aWxkX2V4YW1wbGUgZGlyPSJkaXN0bWFwIiBsb2dkaXI9IiR7YmFzZWRpcn0vdGFyZ2V0L2xvZ3MiIC8+CisgICAgICAgIDxidWlsZF9leGFtcGxlIGRpcj0iZXhhbXBsZSIgbG9nZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9sb2dzIiAvPgorICAgICAgICA8YnVpbGRfZXhhbXBsZSBkaXI9InBlcmYiIGxvZ2Rpcj0iJHtiYXNlZGlyfS90YXJnZXQvbG9ncyIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLWluaXQiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9IiBmYWlsb25lcnJvcj0iZmFsc2UiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0iIC8+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJkby1idWlsZCI+CisgICAgICAgIDxidWlsZF9leGFtcGxlIGRpcj0iY2hhdCIgbG9nZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9sb2dzIiAvPgorICAgICAgICA8YnVpbGRfZXhhbXBsZSBkaXI9ImRpc3RtYXAiIGxvZ2Rpcj0iJHtiYXNlZGlyfS90YXJnZXQvbG9ncyIgLz4KKyAgICAgICAgPGJ1aWxkX2V4YW1wbGUgZGlyPSJleGFtcGxlIiBsb2dkaXI9IiR7YmFzZWRpcn0vdGFyZ2V0L2xvZ3MiIC8+CisgICAgICAgIDxidWlsZF9leGFtcGxlIGRpcj0icGVyZiIgbG9nZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9sb2dzIiAvPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZG8tcG9zdGJ1aWxkIj4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLWhlbHAiPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jaGF0L1JFQURNRS50eHQgYi9leGFtcGxlcy9jaGF0L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNGIyNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDMzIEBACitUbyBnZXQgc3RhcnRlZCB3aXRoIHRoZSBleGFtcGxlIHlvdSB3aWxsIG5lZWQgamRrIDEuNS4wX3gsCit3aGVyZSB4IGlzIHByZXR0eSByZWNlbnQgKD49IDE1KSwgb3IgYW55IHJlbGVhc2Ugb2YgamRrIDEuNi4KK1lvdSB3aWxsIGFsc28gbmVlZCBhbnQgMS43LjAsIHdpdGggYW50IC5uZXQgcGx1Z2luIGlmIHlvdQord2FudCB0byBidWlsZCBjc2hhcnAuIFlvdSB3aWxsIGFsc28gbmVlZCBtaWNyb3NvZnQgLm5ldAorc2RrIDIuMCBmb3IgY3NoYXJwIGJ1aWxkcy4KKworVG8gYnVpbGQ6CisKKz4gYW50CisKK1RoaXMgd2lsbCBydW4gdGhlIGRlZmF1bHQgdGFyZ2V0IHdoaWNoIHdpbGwgYnVpbGQgYm90aCBqYXZhCithbmQgY3NoYXJwIHByb2dyYW1zLiBZb3UgY2FuIGFsc28gdXNlIGJ1aWxkLWphdmEgb3IgYnVpbGQtY3NoYXJwCit0YXJnZXRzIHRvIGJ1aWxkIG9ubHkgamF2YSBvciBvbmx5IGNzaGFycC4KKworVG8gcnVuIGphdmEgY2hhdCwgb3BlbiBhIGNtZCB3aW5kb3cgYW5kIHJ1biB0aGVzZSBjb21tYW5kczoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IGphdmEgLWNwIGNoYXQuamFyIGV0Y2guZXhhbXBsZXMuY2hhdC5NYWluQ2hhdExpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGNoYXQuamFyIGV0Y2guZXhhbXBsZXMuY2hhdC5NYWluQ2hhdENsaWVudAorPiBzdGFydCBqYXZhIC1jcCBjaGF0LmphciBldGNoLmV4YW1wbGVzLmNoYXQuTWFpbkNoYXRDbGllbnQKKworVHdvIGNoYXQgY2xpZW50cyB3aWxsIGJlIHN0YXJ0ZWQ7IHRoZXJlIGlzIGEgaGVscCBjb21tYW5kOworbG9naW4gYXMgYSBkaWZmZXJlbnQgdXNlciBpbiBlYWNoIHdpdGggYW55IHBhc3N3b3JkOyB0aGV5CitjYW4gY2hhdCB3aXRoIGVhY2ggb3RoZXIhCisKK1RvIHJ1biBjc2hhcnAgY2hhdDoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IENoYXRMaXN0ZW5lci5leGUKKz4gc3RhcnQgQ2hhdENsaWVudC5leGUKKz4gc3RhcnQgQ2hhdENsaWVudC5leGUKKworWW91IGNhbiBtaXggYW5kIG1hdGNoIHRoZSB2YXJpb3VzIGNsaWVudHMgYW5kIGxpc3RlbmVycy4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvYnVpbGQueG1sIGIvZXhhbXBsZXMvY2hhdC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2ZDFlNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPHByb2plY3QgbmFtZT0iZXRjaC1jaGF0LWV4YW1wbGUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiID4KKyAgICA8ZGVzY3JpcHRpb24+Q2hhdCBFeGFtcGxlPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPCEtLSBUT0RPIGJldHRlciBjb21wdXRhdGlvbiBvZiBldGNoLmhvbWUsIGV0Y2gudmVyc2lvbiAtLT4KKyAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KKworICAgIDwhLS0gY29tcHV0ZSBFVENIX0hPTUUgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLkVUQ0hfSE9NRSIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4vdGFyZ2V0L0luc3RhbGxlcnMvZGlzdCIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJldGNoLmhvbWUiIHZhbHVlPSIke2Vudi5FVENIX0hPTUV9IiA+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iJHtlbnYuRVRDSF9IT01FfSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJldGNoLmhvbWUiIHZhbHVlPSIke2J1aWxkLkVUQ0hfSE9NRX0iID4KKyAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9ImV0Y2guaG9tZSIgLz48L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyIgorICAgICAgICBsb2NhdGlvbj0iJHtkZWZhdWx0Lmp1bml0LmxpYn0vanVuaXQtNC4zLjEuamFyIiAvPgorCisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYnVpbGRTdXBwb3J0RGlyZWN0b3J5IiBsb2NhdGlvbj0iLi4vLi4vYnVpbGQtc3VwcG9ydCIgLz4KKworICAgIDwhLS0gY29tcHV0ZSBldGNoLnZlcnNpb24gLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZXRjaC52ZXJzaW9uIiB2YWx1ZT0iJHtFdGNoLnZlcnNpb259IiA+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJldGNoLnZlcnNpb24iIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8IS0tIENzaGFycCBTdXBwb3J0IC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IlVTRS5kb3RuZXQiID4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiIC8+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7ZW52LndpbmRpcn0vTWljcm9zb2Z0Lk5FVC9GcmFtZXdvcmsvdjIuMC41MDcyNy9tc2J1aWxkLmV4ZSIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iVVNFLm1vbm8iID4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxub3Q+PG9zIGZhbWlseT0id2luZG93cyIgLz48L25vdD4KKyAgICAgICAgICAgIDwhLS0gVE9ETyBtb25vIHN1cHBvcnQgaXMgbm90IGZ1bGx5IGJha2VkLCB1c2UgLURVU0UubW9ubyB0byB0ZXN0IC0tPgorICAgICAgICAgICAgPCEtLSA8YXZhaWxhYmxlIGZpbGU9IiR7ZW52Lk1PTk9fSE9NRX0vYmluL21kdG9vbCIgLz4gLS0+CisgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9IlVTRS5tb25vIiAvPgorICAgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJCVUlMRC5jc2hhcnAiID4KKyAgICAgICAgPG9yPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJVU0UuZG90bmV0IiAvPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJVU0UubW9ubyIgLz4KKyAgICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDwhLS0gaW1wb3J0IGV0Y2ggdGFzayAtLT4KKyAgICA8dGFza2RlZgorICAgICAgICBvbmVycm9yPSJyZXBvcnQiCisgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL2V0Y2gvdG9vbHMvYW50L2V0Y2gueG1sIgorICAgICAgICBjbGFzc3BhdGg9IiR7ZXRjaC5ob21lfS9saWIvZXRjaC1hbnQtcGx1Z2luLSR7ZXRjaC52ZXJzaW9ufS5qYXIiIC8+CisKKyAgICA8IS0tIGltcG9ydCBkb3RuZXQgdGFzayAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJhbnQuZG90bmV0LmphciIgdmFsdWU9ImFudC1kb3RuZXQtMS4wLmphciIgPgorICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0iYW50LmRvdG5ldC5qYXIiIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8dGFza2RlZgorICAgICAgICBvbmVycm9yPSJyZXBvcnQiCisgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL2FudC9kb3RuZXQvYW50bGliLnhtbCIKKyAgICAgICAgY2xhc3NwYXRoPSIke2FudC5kb3RuZXQuamFyfSIgLz4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJtZHRvb2wiID4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiICAgICAgICAgZGVmYXVsdD0iLiIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgZGVmYXVsdD0iZmFsc2UiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvamVjdCIgICAgIGRlZmF1bHQ9InByb2plY3QuY3Nwcm9qIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgICAgICBkZWZhdWx0PSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHtlbnYuTU9OT19IT01FfS9iaW4vbWR0b29sIiBkaXI9IkB7ZGlyfSIgZmFpbG9uZXJyb3I9IkB7ZmFpbG9uZXJyb3J9IiA+CisgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iYnVpbGQiIC8+CisgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1idWlsZGZpbGU6QHtwcm9qZWN0fSIgLz4KKyAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8IS0tIHNldCBwcm9wZXJ0aWVzIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiICAgICAgICAgICAgICAgbG9jYXRpb249IiR7YmFzZWRpcn0vc3JjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWluLXNyYy1qYXZhIiAgICAgbG9jYXRpb249IiR7c3JjfS9tYWluL2phdmEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3Qtc3JjLWphdmEiICAgICBsb2NhdGlvbj0iJHtzcmN9L3Rlc3QvamF2YSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiAgICAgICAgICAgIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RhcmdldCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGlzdC1zcmMiICAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vZGlzdC1zcmMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbmVyYXRlZC1zb3VyY2VzIiBsb2NhdGlvbj0iJHt0YXJnZXR9L2dlbmVyYXRlZC1zb3VyY2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW4tc3JjLWphdmEiICAgICAgbG9jYXRpb249IiR7Z2VuZXJhdGVkLXNvdXJjZXN9L21haW4vZXRjaC9qYXZhIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW4tc3JjLWNzaGFycCIgICAgbG9jYXRpb249IiR7Z2VuZXJhdGVkLXNvdXJjZXN9L21haW4vZXRjaC9jc2hhcnAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJpbiIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2JpbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgICAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vY2xhc3NlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy10ZXN0IiAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vY2xhc3Nlcy10ZXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LXJlc3VsdHMiICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS90ZXN0LXJlc3VsdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Im51bml0LXJlc3VsdHMiICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L251bml0LXJlc3VsdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRpc3QiICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLi90YXJnZXQvSW5zdGFsbGVycy9kaXN0IiAvPgorCisgICAgPCEtLSBpbml0aWFsaXplIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iaW5pdCIgPgorICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7ZGlzdC1zcmN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbmVyYXRlZC1zb3VyY2VzfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW4tc3JjLWphdmF9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbi1zcmMtY3NoYXJwfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtiaW59IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMtdGVzdH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGVzdC1yZXN1bHRzfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtudW5pdC1yZXN1bHRzfSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gYnVpbGQgdGhlIHNlcnZlciAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXNvdXJjZXMiIGRlcGVuZHM9ImluaXQiID4KKyAgICAgICAgPCEtLSBnZW5lcmF0ZSBzb3VyY2VzIC0tPgorCisgICAgICAgIDxldGNoIGhvbWU9IiR7ZXRjaC5ob21lfSIKKyAgICAgICAgICAgICAgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9DaGF0LmV0Y2giCisgICAgICAgICAgICAgIGJpbmRpbmc9ImphdmEiCisgICAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW4tc3JjLWphdmF9IiAvPgorCisgICAgICAgIDxldGNoIGhvbWU9IiR7ZXRjaC5ob21lfSIKKyAgICAgICAgICAgICAgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9DaGF0LmV0Y2giCisgICAgICAgICAgICAgIGJpbmRpbmc9ImNzaGFycCIKKyAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke2dlbi1zcmMtY3NoYXJwfSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtcnVudGltZS1uYW1lIgorICAgICAgICB2YWx1ZT0iZXRjaC1qYXZhLXJ1bnRpbWUtJHtldGNoLnZlcnNpb259LmphciIgLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmRlcGVuZGVuY3kuamF2YS5ydW50aW1lIgorICAgICAgICBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9IiAvPgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1qYXZhIiBkZXBlbmRzPSJnZW5lcmF0ZS1zb3VyY2VzIiA+CisgICAgICAgIDwhLS0gY29tcGlsZSBzb3VyY2VzIC0tPgorCisgICAgICAgIDxqYXZhYyB0YXJnZXQ9IjEuNSIgZGVzdGRpcj0iJHtjbGFzc2VzfSIgPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke2dlbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7bWFpbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuamF2YS5ydW50aW1lfSIgLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDxqYXZhYyB0YXJnZXQ9IjEuNSIgZGVzdGRpcj0iJHtjbGFzc2VzLXRlc3R9IiA+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7Z2VuLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHttYWluLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHt0ZXN0LXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qYXZhLnJ1bnRpbWV9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyfSIgLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDwhLS0gQ3JlYXRlIEphciAtLT4KKyAgICAgICAgPGphciBqYXJmaWxlPSIke2Jpbn0vY2hhdC5qYXIiID4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiIHZhbHVlPSIke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9IiAvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzfSIgPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvamFyPgorCisgICAgICAgIDwhLS0gY29weSBpbiBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Jpbn0iIGZpbGU9IiR7RXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycC13aXRoLW1vbm8iIGRlcGVuZHM9ImdlbmVyYXRlLXNvdXJjZXMiIGlmPSJVU0UubW9ubyIgPgorICAgICAgICA8bWR0b29sIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0NoYXRDbGllbnRQcm9qIiBwcm9qZWN0PSJDaGF0Q2xpZW50UHJvai5jc3Byb2oiIC8+CisgICAgICAgIDxtZHRvb2wgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvQ2hhdExpc3RlbmVyUHJvaiIgcHJvamVjdD0iQ2hhdExpc3RlbmVyUHJvai5jc3Byb2oiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycC13aXRoLWRvdG5ldCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyIgaWY9IlVTRS5kb3RuZXQiID4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vbWFpbi9jc2hhcnAvQ2hhdExpc3RlbmVyUHJvai9DaGF0TGlzdGVuZXJQcm9qLmNzcHJvaiIgPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDwvbXNidWlsZD4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vbWFpbi9jc2hhcnAvQ2hhdENsaWVudFByb2ovQ2hhdENsaWVudFByb2ouY3Nwcm9qIiA+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQ29uZmlndXJhdGlvbiIgdmFsdWU9IiR7YnVpbGQudGFyZ2V0fSIgLz4KKyAgICAgICAgPC9tc2J1aWxkPgorICAgICAgICA8bXNidWlsZCBidWlsZGZpbGU9IiR7c3JjfS90ZXN0L2NzaGFycC9DaGF0VGVzdFByb2ovQ2hhdFRlc3RQcm9qLmNzcHJvaiIgPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDwvbXNidWlsZD4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YmlufSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvQ2hhdExpc3RlbmVyUHJvai9iaW4vJHtidWlsZC50YXJnZXR9IiA+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0NoYXRDbGllbnRQcm9qL2Jpbi8ke2J1aWxkLnRhcmdldH0iID4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycCIgZGVwZW5kcz0iYnVpbGQtY3NoYXJwLXdpdGgtbW9ubyxidWlsZC1jc2hhcnAtd2l0aC1kb3RuZXQiIC8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJidWlsZC1qYXZhLGJ1aWxkLWNzaGFycCIgLz4KKworICAgIDwhLS0gcnVuIHVuaXQgdGVzdHMgLS0+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtamF2YSIgZGVwZW5kcz0iYnVpbGQtamF2YSIgPgorICAgICAgICA8IS0tIFJ1biBVbml0IFRlc3RzIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIiBkaXI9IiR7Y2xhc3Nlcy10ZXN0fSIKKyAgICAgICAgICAgIGVycm9yUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiIGZhaWx1cmVQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCIgPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlcy10ZXN0fSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZX0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qdW5pdC5qYXJ9IiAvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIgLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0idHJ1ZSIgdG9kaXI9IiR7dGVzdC1yZXN1bHRzfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LXNyYy1qYXZhfSIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNzaGFycCIgZGVwZW5kcz0iYnVpbGQtY3NoYXJwIiBpZj0iQlVJTEQuY3NoYXJwIiA+CisgICAgICAgICA8bnVuaXQgeG1sb3V0PSIke251bml0LXJlc3VsdHN9L05Vbml0UmVzdWx0cy54bWwiID4KKyAgICAgICAgICAgICA8dGVzdGFzc2VtYmx5IG5hbWU9IiR7c3JjfS90ZXN0L2NzaGFycC9DaGF0VGVzdFByb2ovYmluLyR7YnVpbGQudGFyZ2V0fS9DaGF0VGVzdFByb2ouZGxsIiAvPgorICAgICAgICAgPC9udW5pdD4KKworICAgICAgICAgPHhzbHQgc3R5bGU9IiR7RXRjaC5idWlsZFN1cHBvcnREaXJlY3Rvcnl9L05Vbml0VG9KVW5pdC54c2wiCisgICAgICAgICAgICAgICAgIGluPSIke251bml0LXJlc3VsdHN9L05Vbml0UmVzdWx0cy54bWwiIG91dD0iJHt0ZXN0LXJlc3VsdHN9L1RFU1QtTlVuaXRSZXN1bHRzLnhtbCIgLz4KKyAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJidWlsZCx0ZXN0LWphdmEsdGVzdC1jc2hhcnAsZG9uZSIgPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkb25lIiBkZXBlbmRzPSJidWlsZCIgPgorICAgICAgICA8ZWNobz4KKworQnVpbGQgQ29tcGxldGUhCisKK1RvIHJ1biBqYXZhIGNoYXQsIG9wZW4gYSBjbWQgd2luZG93IGFuZCBydW4gdGhlc2UgY29tbWFuZHM6CisKKz4gY2QgdGFyZ2V0XGJpbgorPiBzdGFydCBqYXZhIC1jcCBjaGF0LmphciBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdC5NYWluQ2hhdExpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGNoYXQuamFyIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0Lk1haW5DaGF0Q2xpZW50Cis+IHN0YXJ0IGphdmEgLWNwIGNoYXQuamFyIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0Lk1haW5DaGF0Q2xpZW50CisKK1R3byBjaGF0IGNsaWVudHMgd2lsbCBiZSBzdGFydGVkOyB0aGVyZSBpcyBhIGhlbHAgY29tbWFuZDsKK2xvZ2luIGFzIGEgZGlmZmVyZW50IHVzZXIgaW4gZWFjaCB3aXRoIGFueSBwYXNzd29yZDsgdGhleQorY2FuIGNoYXQgd2l0aCBlYWNoIG90aGVyIQorCitUbyBydW4gY3NoYXJwIGNoYXQ6CisKKz4gY2QgdGFyZ2V0XGJpbgorPiBzdGFydCBDaGF0TGlzdGVuZXIuZXhlCis+IHN0YXJ0IENoYXRDbGllbnQuZXhlCis+IHN0YXJ0IENoYXRDbGllbnQuZXhlCisKK1lvdSBjYW4gbWl4IGFuZCBtYXRjaCB0aGUgdmFyaW91cyBjbGllbnRzIGFuZCBsaXN0ZW5lcnMuCisKKyAgICAgICAgPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBidWlsZCBldmVyeXRoaW5nIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1kZWJ1ZyIgPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGFyZ2V0IiB2YWx1ZT0iRGVidWciIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtcmVsZWFzZSIgPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGFyZ2V0IiB2YWx1ZT0iUmVsZWFzZSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZGlzdC1zcmMiID4KKyAgICAgICAgPGNvcHkgZmlsZT0iZGlzdC1idWlsZC54bWwiIHRvZmlsZT0iJHtkaXN0LXNyY30vYnVpbGQueG1sIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9IkV0Y2guYnVpbGRUb2tlbnMiIC8+CisgICAgICAgIDwvY29weT4gICAgCisgICAgICAgIDxjb3B5IGZpbGU9IlJFQURNRS50eHQiIHRvZmlsZT0iJHtkaXN0LXNyY30vUkVBRE1FLnR4dCIgb3ZlcndyaXRlPSJ0cnVlIiAvPgorICAgICAgICAKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC1zcmN9L3NyYy9tYWluL2V0Y2giIG92ZXJ3cml0ZT0idHJ1ZSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9ldGNoIiA+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmV0Y2giIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgCisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Rpc3Qtc3JjfS9zcmMvbWFpbi9qYXZhIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSIgPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgICAgIAorICAgICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LXNyY30vc3JjL21haW4vY3NoYXJwIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vY3NoYXJwIiA+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmNzIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgICAgIAorICAgICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0fS9leGFtcGxlcy9jaGF0IiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LXNyY30iIC8+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZGVidWciIGRlcGVuZHM9ImRpc3Qtc3JjLGluaXQtZGVidWcsdGVzdCIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9ImRpc3Qtc3JjLGluaXQtcmVsZWFzZSx0ZXN0IiAvPgorCisgICAgPCEtLSBjbGVhbiAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiA+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0NoYXRDbGllbnRQcm9qL2JpbiIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvQ2hhdENsaWVudFByb2ovb2JqIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3JjfS9tYWluL2NzaGFycC9DaGF0TGlzdGVuZXJQcm9qL2JpbiIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvQ2hhdExpc3RlbmVyUHJvai9vYmoiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwL0NoYXRUZXN0UHJvai9iaW4iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwL0NoYXRUZXN0UHJvai9vYmoiIHF1aWV0PSJ0cnVlIiAvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9kaXN0LWJ1aWxkLnhtbCBiL2V4YW1wbGVzL2NoYXQvZGlzdC1idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2NTFhMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvZGlzdC1idWlsZC54bWwKQEAgLTAsMCArMSwxNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtY2hhdC1leGFtcGxlIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJidWlsZCI+CisgICAgPGRlc2NyaXB0aW9uPkNoYXQgRXhhbXBsZTwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC5ob21lIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLnZlcnNpb24iIHZhbHVlPSJARXRjaFZlcnNpb25AIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtamF2YS1ydW50aW1lLW5hbWUiIHZhbHVlPSJldGNoLWphdmEtcnVudGltZS0ke2V0Y2gudmVyc2lvbn0uamFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC1hbnQtcGx1Z2luLmphciIgICBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi9ldGNoLWFudC1wbHVnaW4tJHtldGNoLnZlcnNpb259LmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtcnVudGltZS5qYXIiIGxvY2F0aW9uPSIke2V0Y2guaG9tZX0vbGliLyR7ZXRjaC1qYXZhLXJ1bnRpbWUtbmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC5kbGwiICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi9FdGNoLmRsbCIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLW1haW4tZXRjaCIgICAgIGxvY2F0aW9uPSIke3NyY30vbWFpbi9ldGNoIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYy1tYWluLWphdmEiICAgICBsb2NhdGlvbj0iJHtzcmN9L21haW4vamF2YSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMtbWFpbi1jc2hhcnAiICAgbG9jYXRpb249IiR7c3JjfS9tYWluL2NzaGFycCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQiICAgICAgICAgICAgbG9jYXRpb249IiR7YmFzZWRpcn0vdGFyZ2V0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbmVyYXRlZC1zb3VyY2VzIiBsb2NhdGlvbj0iJHt0YXJnZXR9L2dlbmVyYXRlZC1zb3VyY2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbnNyYy1tYWluLWV0Y2gtamF2YSIgbG9jYXRpb249IiR7Z2VuZXJhdGVkLXNvdXJjZXN9L21haW4vZXRjaC9qYXZhIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbnNyYy1tYWluLWV0Y2gtY3NoYXJwIiBsb2NhdGlvbj0iJHtnZW5lcmF0ZWQtc291cmNlc30vbWFpbi9ldGNoL2NzaGFycCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiAgICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJpbiIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2JpbiIvPgorICAgIAorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IkJVSUxELmNzaGFycCIgPgorICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIiAvPgorICAgIDwvY29uZGl0aW9uPiAgICAKKworICAgIDx0YXNrZGVmCisgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL2V0Y2gvdG9vbHMvYW50L2V0Y2gueG1sIgorICAgICAgICBjbGFzc3BhdGg9IiR7ZXRjaC1hbnQtcGx1Z2luLmphcn0iLz4KKworICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImJ1aWxkLWphdmEsIGJ1aWxkLWNzaGFycCwgZG9uZSIvPgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1qYXZhIiBkZXBlbmRzPSJnZW5zcmMtamF2YSI+CisgICAgICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXN9IiBzb3VyY2U9IjEuNSIgZGVidWc9InRydWUiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZXRjaC1qYXZhLXJ1bnRpbWUuamFyfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjLW1haW4tamF2YX0iLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtnZW5zcmMtbWFpbi1ldGNoLWphdmF9Ii8+CisgICAgICAgIDwvamF2YWM+CisKKyAgICAgICAgPGphciBqYXJmaWxlPSIke2Jpbn0vY2hhdC5qYXIiPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIgdmFsdWU9IiR7ZXRjaC1qYXZhLXJ1bnRpbWUtbmFtZX0iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlc30iLz4KKyAgICAgICAgPC9qYXI+CisKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YmlufSIgZmlsZT0iJHtldGNoLWphdmEtcnVudGltZS5qYXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvbmUiPgorICAgICAgICA8ZWNobz4KKworVG8gcnVuIGphdmEgY2hhdCwgb3BlbiBhIGNtZCB3aW5kb3cgYW5kIHJ1biB0aGVzZSBjb21tYW5kczoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IGphdmEgLWNwIGNoYXQuamFyIGV0Y2guZXhhbXBsZXMuY2hhdC5NYWluQ2hhdExpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGNoYXQuamFyIGV0Y2guZXhhbXBsZXMuY2hhdC5NYWluQ2hhdENsaWVudAorPiBzdGFydCBqYXZhIC1jcCBjaGF0LmphciBldGNoLmV4YW1wbGVzLmNoYXQuTWFpbkNoYXRDbGllbnQKKworVHdvIGNoYXQgY2xpZW50cyB3aWxsIGJlIHN0YXJ0ZWQ7IHRoZXJlIGlzIGEgaGVscCBjb21tYW5kOworbG9naW4gYXMgYSBkaWZmZXJlbnQgdXNlciBpbiBlYWNoIHdpdGggYW55IHBhc3N3b3JkOyB0aGV5CitjYW4gY2hhdCB3aXRoIGVhY2ggb3RoZXIhCisKK1RvIHJ1biBjc2hhcnAgY2hhdCwgb3BlbiBhIGNtZCB3aW5kb3cgYW5kIHJ1biB0aGVzZSBjb21tYW5kczoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IENoYXRMaXN0ZW5lci5leGUKKz4gc3RhcnQgQ2hhdENsaWVudC5leGUKKz4gc3RhcnQgQ2hhdENsaWVudC5leGUKKworWW91IGNhbiBtaXggYW5kIG1hdGNoIHRoZSB2YXJpb3VzIGNsaWVudHMgYW5kIGxpc3RlbmVycy4KKworICAgICAgICA8L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycCIgZGVwZW5kcz0iZ2Vuc3JjLWNzaGFycCIgaWY9IkJVSUxELmNzaGFycCIgPgorICAgICAgICA8Y3NjCisgICAgICAgICAgICAgICAgZGVidWc9InRydWUiCisgICAgICAgICAgICAgICAgd2FybkxldmVsPSIxIgorICAgICAgICAgICAgICAgIHVuc2FmZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgICAgICAgICAgIGluY3JlbWVudGFsPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBtYWluQ2xhc3MgPSAiZXRjaC5leGFtcGxlcy5jaGF0Lk1haW5DaGF0Q2xpZW50IgorICAgICAgICAgICAgICAgIGRlc3RGaWxlPSIke2Jpbn0vQ2hhdENsaWVudC5leGUiPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7c3JjLW1haW4tY3NoYXJwfS9DaGF0Q2xpZW50UHJvaiIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vZXRjaC5leGFtcGxlcy5jaGF0IiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9IiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHJlZmVyZW5jZSBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgICAgICA8L2NzYz4KKworICAgICAgICA8Y3NjCisgICAgICAgICAgICAgICAgZGVidWc9InRydWUiCisgICAgICAgICAgICAgICAgd2FybkxldmVsPSIxIgorICAgICAgICAgICAgICAgIHVuc2FmZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgICAgICAgICAgIGluY3JlbWVudGFsPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBtYWluQ2xhc3MgPSAiZXRjaC5leGFtcGxlcy5jaGF0Lk1haW5DaGF0TGlzdGVuZXIiCisgICAgICAgICAgICAgICAgZGVzdEZpbGU9IiR7YmlufS9DaGF0TGlzdGVuZXIuZXhlIj4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vQ2hhdExpc3RlbmVyUHJvaiIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vZXRjaC5leGFtcGxlcy5jaGF0IiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9IiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHJlZmVyZW5jZSBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgICAgICA8L2NzYz4KKworICAgICAgICA8Y29weSB0b2Rpcj0iJHtiaW59IiBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJnZW5zcmMiIGRlcGVuZHM9ImdlbnNyYy1qYXZhLCBnZW5zcmMtY3NoYXJwIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbnNyYy1qYXZhIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGV0Y2gKKyAgICAgICAgICAgIGhvbWU9IiR7ZXRjaC5ob21lfSIKKyAgICAgICAgICAgIGJpbmRpbmc9ImphdmEiCisgICAgICAgICAgICBxdWlldD0idHJ1ZSIKKyAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWphdmF9IgorICAgICAgICAgICAgZmlsZT0iJHtzcmMtbWFpbi1ldGNofS9DaGF0LmV0Y2giLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZ2Vuc3JjLWNzaGFycCIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxldGNoCisgICAgICAgICAgICBob21lPSIke2V0Y2guaG9tZX0iCisgICAgICAgICAgICBiaW5kaW5nPSJjc2hhcnAiCisgICAgICAgICAgICBxdWlldD0idHJ1ZSIKKyAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWNzaGFycH0iCisgICAgICAgICAgICBmaWxlPSIke3NyYy1tYWluLWV0Y2h9L0NoYXQuZXRjaCIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuZXJhdGVkLXNvdXJjZXN9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1qYXZhfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbnNyYy1tYWluLWV0Y2gtY3NoYXJwfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXN9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YmlufSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iLz4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL0NoYXRDbGllbnRQcm9qL0NoYXRDbGllbnRQcm9qLmNzcHJvaiBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL0NoYXRDbGllbnRQcm9qL0NoYXRDbGllbnRQcm9qLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdkNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvQ2hhdENsaWVudFByb2ovQ2hhdENsaWVudFByb2ouY3Nwcm9qCkBAIC0wLDAgKzEsMTEzIEBACivvu788UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICAgIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjUwNzI3PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnsxM0JCQzI2OC0yRjMxLTRDNjgtQjYyQi0zQzJDRkQwMjI4QkV9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPm9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+Q2hhdENsaWVudDwvQXNzZW1ibHlOYW1lPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxCYXNlQ2hhdENsaWVudC5jcyI+CisgICAgICA8TGluaz5CYXNlQ2hhdENsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcQmFzZUNoYXRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+QmFzZUNoYXRTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XENoYXQuY3MiPgorICAgICAgPExpbms+Q2hhdC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcQ2hhdENsaWVudC5jcyI+CisgICAgICA8TGluaz5DaGF0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxDaGF0SGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPkNoYXRIZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XENoYXRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+Q2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcUmVtb3RlQ2hhdC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVDaGF0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxSZW1vdGVDaGF0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZUNoYXRDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XFJlbW90ZUNoYXRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+UmVtb3RlQ2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcU3R1YkNoYXQuY3MiPgorICAgICAgPExpbms+U3R1YkNoYXQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XFN0dWJDaGF0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlN0dWJDaGF0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxTdHViQ2hhdFNlcnZlci5jcyI+CisgICAgICA8TGluaz5TdHViQ2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcVmFsdWVGYWN0b3J5Q2hhdC5jcyI+CisgICAgICA8TGluaz5WYWx1ZUZhY3RvcnlDaGF0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLmNoYXRcSW1wbENoYXRDbGllbnQuY3MiPgorICAgICAgPExpbms+SW1wbENoYXRDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2guZXhhbXBsZXMuY2hhdFxNYWluQ2hhdENsaWVudC5jcyI+CisgICAgICA8TGluaz5NYWluQ2hhdENsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXC4uXC4uXGJpbmRpbmctY3NoYXJwXHJ1bnRpbWVcc3JjXG1haW5cY3NoYXJwXEV0Y2hQcm9qLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkV0Y2hQcm9qPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvQ2hhdENsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2NzaGFycC9DaGF0Q2xpZW50UHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmU0ODg3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvQ2hhdENsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorLy8gdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ2hhdCBDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQ2hhdCBDbGllbnQgRXhlY3V0YWJsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkNpc2NvIFN5c3RlbXMiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJFdGNoIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgqSAyMDA4IildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJjMGYxMmE1MC0yNWU1LTQ2NDgtOWQyZC1hMWJjOGFiM2RlYjgiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbiAKKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuMC4wLjEiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC4wLjAuMSIpXQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvQ2hhdExpc3RlbmVyUHJvai9DaGF0TGlzdGVuZXJQcm9qLmNzcHJvaiBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL0NoYXRMaXN0ZW5lclByb2ovQ2hhdExpc3RlbmVyUHJvai5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3M2NlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL0NoYXRMaXN0ZW5lclByb2ovQ2hhdExpc3RlbmVyUHJvai5jc3Byb2oKQEAgLTAsMCArMSwxMTQgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezU3NEMyOEY5LTFEMEQtNDdDQi05RjE4LTIyMUU1MTI4RDVBNn08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+ZXRjaC5leGFtcGxlcy5jaGF0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+Q2hhdExpc3RlbmVyPC9Bc3NlbWJseU5hbWU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XEJhc2VDaGF0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkJhc2VDaGF0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxCYXNlQ2hhdFNlcnZlci5jcyI+CisgICAgICA8TGluaz5CYXNlQ2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcQ2hhdC5jcyI+CisgICAgICA8TGluaz5DaGF0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxDaGF0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkNoYXRDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XENoYXRIZWxwZXIuY3MiPgorICAgICAgPExpbms+Q2hhdEhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcQ2hhdFNlcnZlci5jcyI+CisgICAgICA8TGluaz5DaGF0U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxSZW1vdGVDaGF0LmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZUNoYXQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XFJlbW90ZUNoYXRDbGllbnQuY3MiPgorICAgICAgPExpbms+UmVtb3RlQ2hhdENsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcUmVtb3RlQ2hhdFNlcnZlci5jcyI+CisgICAgICA8TGluaz5SZW1vdGVDaGF0U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxTdHViQ2hhdC5jcyI+CisgICAgICA8TGluaz5TdHViQ2hhdC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcU3R1YkNoYXRDbGllbnQuY3MiPgorICAgICAgPExpbms+U3R1YkNoYXRDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XFN0dWJDaGF0U2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJDaGF0U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxWYWx1ZUZhY3RvcnlDaGF0LmNzIj4KKyAgICAgIDxMaW5rPlZhbHVlRmFjdG9yeUNoYXQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2guZXhhbXBsZXMuY2hhdFxJbXBsQ2hhdFNlcnZlci5jcyI+CisgICAgICA8TGluaz5JbXBsQ2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC5leGFtcGxlcy5jaGF0XE1haW5DaGF0TGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+TWFpbkNoYXRMaXN0ZW5lci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXC4uXC4uXGJpbmRpbmctY3NoYXJwXHJ1bnRpbWVcc3JjXG1haW5cY3NoYXJwXEV0Y2hQcm9qLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkV0Y2hQcm9qPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvQ2hhdExpc3RlbmVyUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL0NoYXRMaXN0ZW5lclByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ZjBlZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL0NoYXRMaXN0ZW5lclByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorLy8gdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ2hhdCBMaXN0ZW5lciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJDaGF0IExpc3RlbmVyIEV4ZWN1dGFibGUiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJDaXNjbyBTeXN0ZW1zIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiRXRjaCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiNDY5MzdkNjMtYjg4OS00NTllLTgyNTQtNGY5OTA2Yjg5NDQ5IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuY2hhdC9JbXBsQ2hhdENsaWVudC5jcyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuY2hhdC9JbXBsQ2hhdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzk3ODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5jaGF0L0ltcGxDaGF0Q2xpZW50LmNzCkBAIC0wLDAgKzEsMTE1IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0Cit7CisgICAgcHVibGljIGNsYXNzIEltcGxDaGF0Q2xpZW50IDogQmFzZUNoYXRDbGllbnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3RyaW5nIF93aG9hbWk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfc251YjsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gd2hvaXNPbmxpbmUgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgIHByaXZhdGUgQ2hhdFNlcnZlciBzZXJ2ZXI7CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBDaGF0Q2xpZW50SW1wbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Indob2FtaSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzbnViIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgSW1wbENoYXRDbGllbnQoIFJlbW90ZUNoYXRTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgd2hvYW1pLCBib29sIHNudWIgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKKyAgICAgICAgICAgIF93aG9hbWkgPSB3aG9hbWk7CisgICAgICAgICAgICBfc251YiA9IHNudWI7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIENoYXRDbGllbnQgTWVtYmVycworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIHdob0lzT25saW5lKCBzdHJpbmdbXSBuYW1lcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBTdHJpbmcgbmFtZSBpbiBuYW1lcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJ7MH06IHsxfSBvbmxpbmUgKHNyYyA9IHdob0lzT25saW5lKVxuIiwgX3dob2FtaSwgbmFtZSApOworICAgICAgICAgICAgICAgIHdob2lzT25saW5lLkFkZCggbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgIHN0YXR1c0NoYW5nZSggc3RyaW5nIG5hbWUsIGJvb2w/IG9ubGluZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKGJvb2wpIG9ubGluZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJ7MH06IHsxfSBvbmxpbmUgKHNyYyA9IHN0YXR1c0NoYW5nZSlcbiIsIF93aG9hbWksIG5hbWUgKTsKKyAgICAgICAgICAgICAgICB3aG9pc09ubGluZS5BZGQoIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggIiB7MH06IHsxfSBvZmZsaW5lXG4iLCBfd2hvYW1pLCBuYW1lICk7CisgICAgICAgICAgICAgICAgd2hvaXNPbmxpbmUuUmVtb3ZlKCBuYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBDaGF0IE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbD8gaXNMb2dnZWRJbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNlcnZlciBpcyBhbHdheXMgbG9nZ2VkIGluIHRvIHRoZSBjbGllbnQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgc2VuZCggc3RyaW5nIHdobywgc3RyaW5nIG1zZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiezB9OiBtc2cgZnJvbSB7MX06IHsyfVxuIiwgX3dob2FtaSwgd2hvLCBtc2cgKTsKKyAgICAgICAgICAgIGlmICggX3NudWIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlci5zZW5kKCB3aG8sIFN0cmluZy5Gb3JtYXQoICJ7MH0sIGxlYXZlIG1lIGFsb25lISIsIHdobyApICk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJzbnViIGRvbmUiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgCisKKyAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgdm9pZCBTZXNzaW9uQ29udHJvbCggb2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbk5vdGlmeSggb2JqZWN0IGV2ZW50T2JqICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBldmVudE9iai5FcXVhbHMoIFNlc3Npb25Db25zdHMuRE9XTiApICkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggIihzZXJ2ZXIgZGlzY29ubmVjdGVkKSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgU2Vzc2lvblF1ZXJ5KCBvYmplY3QgcXVlcnkgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmNoYXQvSW1wbENoYXRTZXJ2ZXIuY3MgYi9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmNoYXQvSW1wbENoYXRTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmZjI5MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuY2hhdC9JbXBsQ2hhdFNlcnZlci5jcwpAQCAtMCwwICsxLDIzNiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXQKK3sKKyAgICBwdWJsaWMgY2xhc3MgSW1wbENoYXRTZXJ2ZXIgOiBCYXNlQ2hhdFNlcnZlcgorICAgIHsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUNoYXRDbGllbnQgX2NsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PFN0cmluZywgSW1wbENoYXRTZXJ2ZXI+IF93aG9Jc09ubGluZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBJbXBsQ2hhdFNlcnZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnQiPnRoZSBjbGllbnQgdG8gdXNlIGZvciBjYWxsYmFja3MuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3aG9Jc09ubGluZSI+dGhlIGRhdGFiYXNlIG9mIHdobyBpcyBvbmxpbmUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEltcGxDaGF0U2VydmVyKCBSZW1vdGVDaGF0Q2xpZW50IGNsaWVudCwgRGljdGlvbmFyeTxTdHJpbmcsIEltcGxDaGF0U2VydmVyPiB3aG9Jc09ubGluZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICBfd2hvSXNPbmxpbmUgPSB3aG9Jc09ubGluZTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gQ2hhdFNlcnZlciBNZW1iZXJzCisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX3VzZXI7CisgCisgICAgICAgIFsgTWV0aG9kSW1wbCAoIE1ldGhvZEltcGxPcHRpb25zLlN5bmNocm9uaXplZCApIF0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgbG9naW4oIHN0cmluZyBuYW1lLCBzdHJpbmcgcHdkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYm9vbCkgaXNMb2dnZWRJbigpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXQudHlwZXMuQ2hhdC5GYWlsdXJlKCAiQWxyZWFkeSBsb2dnZWQgaW4iICk7CisKKyAgICAgICAgICAgIGlmICggbmFtZSA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHlwZXMuQ2hhdC5GYWlsdXJlKCJOYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBuYW1lLlN0YXJ0c1dpdGgoImJhZCIpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyB0eXBlcy5DaGF0LkZhaWx1cmUoIlVzZXJuYW1lIGlzIG5vdCB2YWxpZCIpOworCisgICAgICAgICAgICBpZiAoIG5hbWUuTGVuZ3RoID09IDAgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyB0eXBlcy5DaGF0LkZhaWx1cmUoIlVzZXJuYW1lIGlzIGVtcHR5Iik7CisKKyAgICAgICAgICAgIGlmICggcHdkID09IG51bGwgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyB0eXBlcy5DaGF0LkZhaWx1cmUoIlBhc3N3b3JkIGlzIG5vdCB2YWxpZCIpOworCisgICAgICAgICAgICBpZiAoIHB3ZC5TdGFydHNXaXRoKCJiYWQiKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHlwZXMuQ2hhdC5GYWlsdXJlKCJQYXNzd29yZCBpcyBub3QgdmFsaWQiKTsKKworICAgICAgICAgICAgLy8gVE9ETyBjaGVjayB1c2VyIGF1dGhlbnRpY2F0aW9uLgorCisgICAgICAgICAgICAvLyBhZGQgdGhpcyB1c2VyIHRvIHRoZSB3aG8gaXMgb25saW5lIG1hcC4KKworICAgICAgICAgICAgbG9jayAoIF93aG9Jc09ubGluZSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEltcGxDaGF0U2VydmVyIG90aGVyIDsKKworICAgICAgICAgICAgICAgIC8vIHVzZXIgaXMgbG9nZ2VkIGluIGFscmVhZHkKKyAgICAgICAgICAgICAgICBpZiAoIF93aG9Jc09ubGluZS5Db250YWluc0tleSggbmFtZSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVyID0gX3dob0lzT25saW5lWyBuYW1lIF07CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5EZWxpdmVyKCAiU1lTVEVNIiwgIllvdSBoYXZlIGJlZW4gbG9nZ2VkIG91dCBiZWNhdXNlIHlvdSBsb2dnZWQgaW4gc29tZXdoZXJlIGVsc2UuIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBmYWlsdXJlIHRvIHNlbmQgdGhpcyBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXIubG9nb3V0KCk7CisgICAgICAgICAgICAgICAgICAgIG90aGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8ga2V5IGlzIG5vdCBwcmVzZW50LCBpLmUuLCB1c2VyIGlzbid0IGxvZ2dlZCBpbiBhbHJlYWR5CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfd2hvSXNPbmxpbmUuQWRkKCBuYW1lLCB0aGlzICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1hcmsgYXMgbG9nZ2VkIGluCisgICAgICAgICAgICBfdXNlciA9IG5hbWU7CisKKyAgICAgICAgICAgIC8vIHNheSB3ZSdyZSBvbmxpbmUKKyAgICAgICAgICAgIFNheVN0YXR1c0NoYW5nZWQoIF91c2VyLCB0cnVlICk7CisKKyAgICAgICAgICAgIC8vIHRlbGwgdGhlIGNsaWVudCB3aG8ncyBvbmxpbmUKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB3aG87CisKKworICAgICAgICAgICAgbG9jayAoIF93aG9Jc09ubGluZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hvID0gbmV3IExpc3Q8c3RyaW5nPiggX3dob0lzT25saW5lLktleXMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hvLlJlbW92ZSggbmFtZSApOworICAgICAgICAgICAgX2NsaWVudC53aG9Jc09ubGluZSggd2hvLlRvQXJyYXkoKSApOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggImxvZ2luIDogIiArIG5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtNZXRob2RJbXBsKCBNZXRob2RJbXBsT3B0aW9ucy5TeW5jaHJvbml6ZWQgKV0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgbG9nb3V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBfdXNlciAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIHRvb2tVc09mZmxpbmUgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGxvY2sgKCBfd2hvSXNPbmxpbmUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfd2hvSXNPbmxpbmUuQ29udGFpbnNLZXkoIF91c2VyICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF93aG9Jc09ubGluZVsgX3VzZXIgXSA9PSB0aGlzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdXMgZnJvbSB0aGUgb25saW5lIG1hcAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dob0lzT25saW5lLlJlbW92ZSggX3VzZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29rVXNPZmZsaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggdG9va1VzT2ZmbGluZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBzYXkgd2UncmUgb2ZmbGluZQorICAgICAgICAgICAgICAgICAgICBTYXlTdGF0dXNDaGFuZ2VkKCBfdXNlciwgZmFsc2UgKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJsb2dvdXQgOiAiICsgX3VzZXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF91c2VyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIENoYXQgTWVtYmVycworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sPyBpc0xvZ2dlZEluKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICggX3VzZXIgIT0gbnVsbCApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNheVN0YXR1c0NoYW5nZWQoIFN0cmluZyB1LCBib29sIGlzT25saW5lICkKKyAgICAgICAgeworICAgICAgICAgICAgRGljdGlvbmFyeTxTdHJpbmcsIEltcGxDaGF0U2VydmVyPi5WYWx1ZUNvbGxlY3Rpb24gd2hvID0gX3dob0lzT25saW5lLlZhbHVlczsKKyAgICAgICAgICAgIEltcGxDaGF0U2VydmVyW10gY0FycmF5ID0gbmV3IEltcGxDaGF0U2VydmVyWyBfd2hvSXNPbmxpbmUuQ291bnQgXTsKKyAgICAgICAgICAgIHdoby5Db3B5VG8oIGNBcnJheSwgMCApOworCisgICAgICAgICAgICBmb3JlYWNoICggSW1wbENoYXRTZXJ2ZXIgb3RoZXIgaW4gY0FycmF5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIG90aGVyICE9IHRoaXMgKQorICAgICAgICAgICAgICAgICAgICBvdGhlci5fY2xpZW50LnN0YXR1c0NoYW5nZSggdSwgaXNPbmxpbmUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlbmQKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgc2VuZCggc3RyaW5nIHdobywgc3RyaW5nIG1zZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBtZSA9IF91c2VyOworICAgICAgICAgICAgaWYgKCBtZSA9PSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIEltcGxDaGF0U2VydmVyIG90aGVyOworICAgICAgICAgICAgbG9jayAoIF93aG9Jc09ubGluZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBfd2hvSXNPbmxpbmUuQ29udGFpbnNLZXkoIHdobyApICkgICAgCisgICAgICAgICAgICAgICAgICAgIG90aGVyID0gX3dob0lzT25saW5lWyB3aG8gXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG90aGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBvdGhlciA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHlwZXMuQ2hhdC5GYWlsdXJlKCAidXNlciBpcyBub3Qgb25saW5lIDogIiArIHdobyApOworCisgICAgICAgICAgICBvdGhlci5EZWxpdmVyKCBtZSwgbXNnICk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERlbGl2ZXIoIFN0cmluZyBmcm9tLCBTdHJpbmcgbXNnICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jbGllbnQuc2VuZChmcm9tLCBtc2cgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCB0eXBlcy5DaGF0LkZhaWx1cmUgZSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlICk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggZSApOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgIAorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIF9TZXNzaW9uTm90aWZ5KG9iamVjdCBldmVudE9iaikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGV2ZW50T2JqLkVxdWFscyhTZXNzaW9uQ29uc3RzLlVQKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgaWYgKGV2ZW50T2JqLkVxdWFscyhTZXNzaW9uQ29uc3RzLkRPV04pKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgbG9nb3V0KCk7CisgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKGV2ZW50T2JqIGlzIEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKChFeGNlcHRpb24pIGV2ZW50T2JqKS5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAKKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5jaGF0L01haW5DaGF0Q2xpZW50LmNzIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5jaGF0L01haW5DaGF0Q2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDRjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmNoYXQvTWFpbkNoYXRDbGllbnQuY3MKQEAgLTAsMCArMSwzMjAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdAoreworICAgIHB1YmxpYyBjbGFzcyBNYWluQ2hhdENsaWVudCA6IENoYXRDbGllbnQsIE9ialNlc3Npb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTGlzdDxTdHJpbmc+IF93aG9Jc09ubGluZSA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEYXRlVGltZUZvcm1hdEluZm8gbXlEVEZJID0gbmV3IEN1bHR1cmVJbmZvKCJlbi1VUyIsIGZhbHNlKS5EYXRlVGltZUZvcm1hdDsKKworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCBTdHJpbmdbXSBhcmdzICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHVyaTsKKyAgICAgICAgICAgIGlmICggYXJncy5MZW5ndGggPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXJpID0gYXJnc1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBhcmdzLkxlbmd0aCA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDU/VGNwVHJhbnNwb3J0LnJlY29ubmVjdERlbGF5PTQwMDAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ1c2FnZTogTWFpbkNoYXRDbGllbnQgWzx1cmk+XSIpOworICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkV4aXQoIDEgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0aW5nIHRvIGNoYXQgc2VydmVyIGF0ICIgKyB1cmkpOworCisgICAgICAgICAgICBNYWluQ2hhdENsaWVudCBjbGllbnQgPSBuZXcgTWFpbkNoYXRDbGllbnQoKTsKKyAgICAgICAgICAgIFJlbW90ZUNoYXRTZXJ2ZXIgc2VydmVyID0gQ2hhdEhlbHBlci5OZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgbmV3IE15Q2hhdENsaWVudEZhY3RvcnkoIGNsaWVudCApKTsKKyAgICAgICAgICAgIHNlcnZlci5fU3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICIoIGNvbm5lY3RlZCwgZW50ZXIgY29tbWFuZHMgb3IgaGVscCkiICk7CisKKyAgICAgICAgICAgIHdoaWxlICggdHJ1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggImNtZCA6ICIgKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLk91dC5GbHVzaCgpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBDb25zb2xlLlJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoIHMuTGVuZ3RoID09IDAgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNoYXJbXSBzZXBzID0geyAnICcsICdcdCcsICdccicsICdcbicgfTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBjbWRzID0gcy5TcGxpdCggc2VwcyApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggY21kcy5MZW5ndGggPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKCBjbWRzWyAwIF0uRXF1YWxzKCAiaGVscCIgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEb19oZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggY21kc1swXS5FcXVhbHMoICJsb2dpbiIpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERvX2xvZ2luKCBzZXJ2ZXIsIGNtZHMgKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBjbWRzWzBdLkVxdWFscyggImxvZ291dCIpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5sb2dvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBjbWRzWzBdLkVxdWFscyggInF1aXQiKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGNtZHNbIDAgXS5FcXVhbHMoICJzZW5kIiApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbWVzc2FnZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogY21kc1syXSA9IG1lc3NhZ2UgdG8gYmUgZXh0cmFjdGVkCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbWRzLkxlbmd0aCA8IDMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidXNhZ2UgOiBzZW5kIDx1c2VyPiA8bXNnPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjaGFyW10gc2VwczIgPSB7J1xuJywgJ1xyJ307CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiIjsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDI7IGkgPCBjbWRzLkxlbmd0aDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArICIgIiArIGNtZHNbIGkgXTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBjbWRzMiA9IG1zZy5TcGxpdCggc2VwczIgKTsKKyAgICAgICAgICAgICAgICAgICAgRG9fc2VuZCggc2VydmVyLCBjbWRzWyAxIF0sIGNtZHMyICk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggY21kc1sgMCBdLkVxdWFscyggIndobyIgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEb193aG8oIGNsaWVudCApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggInVua25vd24gY29tbWFuZCIgKTsKKyAgICAgICAgICAgICAgICBEb19oZWxwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vc2VydmVyLmxvZ291dCgpOworICAgICAgICAgICAgLy8oICggUmVtb3RlQ2hhdFNlcnZlciApIHNlcnZlciApLl9TdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKyAgICAgICAgICAgIHNlcnZlci5fU3RvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEb19oZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJjb21tYW5kczogIiApOworCSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICIgIGhlbHAiICk7CisJICAgICAgICBDb25zb2xlLldyaXRlTGluZSggIiAgbG9naW4gPHVzZXI+IDxwd2Q+IiApOworCSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICIgIGxvZ291dCIgKTsKKwkgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiICBxdWl0IiApOworIAkgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiICBzZW5kIDx1c2VyPiA8bXNnPiIgKTsKKyAJICAgICAgICBDb25zb2xlLldyaXRlTGluZSggIiAgd2hvIiApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEb19sb2dpbiggQ2hhdFNlcnZlciBzZXJ2ZXIsIFN0cmluZ1tdIHN0ICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzdFsgMSBdOworICAgICAgICAgICAgICAgIFN0cmluZyBwd2QgPSBzdFsgMiBdOworICAgICAgICAgICAgICAgIHNlcnZlci5sb2dpbiggbmFtZSwgcHdkICk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJsb2dpbiBzdWNjZXNzZnVsIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdC50eXBlcy5DaGF0LkZhaWx1cmUgZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJmYWlsZWQgOiAiICsgZS5HZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggInVzYWdlIDogbG9naW4gPHVzZXJuYW1lPiA8cHdkPiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLk1lc3NhZ2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNlbmQgbWVzc2FnZSAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZXJ2ZXIiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXNlciI+dXNlcm5hbWU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0Ij5tZXNzYWdlIHRvIGJlIHNlbnQ8L3BhcmFtPgorICAgICAgICAvLy8gCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRG9fc2VuZCggQ2hhdFNlcnZlciBzZXJ2ZXIsIFN0cmluZyB1c2VyLCBTdHJpbmdbXSBzdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB3aG8gPSB1c2VyOworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBzdFsgMCBdOworICAgICAgICAgICAgICAgIHNlcnZlci5zZW5kKCB3aG8sIG1zZyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdC50eXBlcy5DaGF0LkZhaWx1cmUgZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJmYWlsZWQgOiAiICsgZS5HZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggX0V0Y2hfQXV0aEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJ5b3UgbXVzdCBsb2dpbiBmaXJzdCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggInVzYWdlOiBzZW5kIDx1c2VyPiA8bXNnPiAiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5NZXNzYWdlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERvX3dobyhNYWluQ2hhdENsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gY2xpZW50LkdldFdob0lzT25saW5lKCk7CisgICAgICAgICAgICBmb3JlYWNoICggU3RyaW5nIG5hbWUgaW4gbmFtZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiICIgKyBuYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgbGlzdCBvZiB3aG8gaXMgY3VycmVudGx5IG9ubGluZTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIEdldFdob0lzT25saW5lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF93aG9Jc09ubGluZS5Ub0FycmF5KCk7CisgICAgICAgIH0KKworCisgICAgICAgICNyZWdpb24gQ2hhdENsaWVudCBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIHZvaWQgd2hvSXNPbmxpbmUoIHN0cmluZ1tdIG5hbWVzICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoIFN0cmluZyBuYW1lIGluIG5hbWVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggbmFtZSArICIgaXMgb25saW5lIiApOworICAgICAgICAgICAgICAgIF93aG9Jc09ubGluZS5BZGQoIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXR1c0NoYW5nZSggc3RyaW5nIG5hbWUsIGJvb2w/IG9ubGluZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCBib29sICkgb25saW5lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggbmFtZSArICIgaXMgb25saW5lIiApOworICAgICAgICAgICAgICAgIF93aG9Jc09ubGluZS5BZGQoIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggbmFtZSArICIgaXMgb2ZmbGluZSIgKTsKKyAgICAgICAgICAgICAgICBfd2hvSXNPbmxpbmUuUmVtb3ZlKCBuYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBDaGF0IE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgYm9vbD8gaXNMb2dnZWRJbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNlcnZlciBpcyBhbHdheXMgbG9nZ2VkIGluIHRvIHRoZSBjbGllbnQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZCggc3RyaW5nIHdobywgc3RyaW5nIG1zZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKG15RFRGSSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggIlsgezB9QHsxfSBdIHsyfVxuIiwgd2hvLCBEYXRlVGltZS5Ob3cuVG9TdHJpbmcoIkhIOm1tOnNzIixteURURkkgKSwgbXNnICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFNlc3Npb24gTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIF9TZXNzaW9uQ29udHJvbCggb2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgX1Nlc3Npb25Ob3RpZnkoIG9iamVjdCBldmVudE9iaiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZXZlbnRPYmouRXF1YWxzKCBTZXNzaW9uQ29uc3RzLlVQICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiIChzZXJ2ZXIgb3BlbmVkIGNvbm5lY3Rpb24pIiApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggZXZlbnRPYmouRXF1YWxzKCBTZXNzaW9uQ29uc3RzLkRPV04gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICIgKHNlcnZlciBjbG9zZWQgY29ubmVjdGlvbikiICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBldmVudE9iaiBpcyBFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBldmVudE9iaiApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBfU2Vzc2lvblF1ZXJ5KCBvYmplY3QgcXVlcnkgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCAiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwcml2YXRlIGNsYXNzIE15Q2hhdENsaWVudEZhY3RvcnkgOiBDaGF0SGVscGVyLkNoYXRDbGllbnRGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBNeUNoYXRDbGllbnRGYWN0b3J5KE1haW5DaGF0Q2xpZW50IGNsaWVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNYWluQ2hhdENsaWVudCBjbGllbnQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBDaGF0Q2xpZW50IE5ld0NoYXRDbGllbnQoUmVtb3RlQ2hhdFNlcnZlciBzZXJ2ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuY2hhdC9NYWluQ2hhdExpc3RlbmVyLmNzIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5jaGF0L01haW5DaGF0TGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMGYzMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuY2hhdC9NYWluQ2hhdExpc3RlbmVyLmNzCkBAIC0wLDAgKzEsNjIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXQKK3sKKyAgICAvLy8KKyAgICAvLy88c3VtbWFyeT4gTWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgQ2hhdExpc3RlbmVyLiA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgcHVibGljIGNsYXNzIE1haW5DaGF0TGlzdGVuZXIgOiBDaGF0SGVscGVyLkNoYXRTZXJ2ZXJGYWN0b3J5CisgICAgeworICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pk1haW4gZm9yIENoYXRMaXN0ZW5lci48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB1cmkgPSAidGNwOi8vMTI3LjAuMC4xOjQwMDUiOworICAgICAgICAgICAgU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IENoYXRIZWxwZXIuTmV3TGlzdGVuZXIodXJpLCBudWxsLCBuZXcgTWFpbkNoYXRMaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgTWFpbkNoYXRMaXN0ZW5lci48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgTWFpbkNoYXRMaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdob0lzT25saW5lID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBJbXBsQ2hhdFNlcnZlcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgSW1wbENoYXRTZXJ2ZXI+IHdob0lzT25saW5lOworCisgICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIENoYXRTZXJ2ZXIuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtPlJlbW90ZSBDaGF0IENsaWVudDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgQ2hhdFNlcnZlciBOZXdDaGF0U2VydmVyKFJlbW90ZUNoYXRDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEltcGxDaGF0U2VydmVyKGNsaWVudCwgd2hvSXNPbmxpbmUpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vZXRjaC9DaGF0LmV0Y2ggYi9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2V0Y2gvQ2hhdC5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWQ4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2V0Y2gvQ2hhdC5ldGNoCkBAIC0wLDAgKzEsMTAxIEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0CisKKy8qKgorICogVGhlIENoYXQgZXhhbXBsZSBwcm9ncmFtIGltcGxlbWVudHMgYSBzaW1wbGUgc2VydmljZQorICogZm9yIGNvbW11bmljYXRpbmcgYmV0d2VlbiBsb2dnZWQgaW4gdXNlcnMuCisgKi8KK0BBdXRob3JpemUoIGlzTG9nZ2VkSW4gKSBAVGltZW91dCggNDAwMCApCitzZXJ2aWNlIENoYXQKK3sKKwkvKioKKwkgKiBFeGNlcHRpb24gdGhyb3duIGlmIENoYXQgZmFpbHMuCisJICoKKwkgKiBAcGFyYW0gbXNnIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlLgorCSAqLworCWV4Y2VwdGlvbiBGYWlsdXJlKCBzdHJpbmcgbXNnICkKKwkKKwkvLy8vLy8vLy8vCisJLy8gQVVUSCAvLworCS8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBNYXJrcyB0aGUgdXNlciBhcyBsb2dnZWQgaW4gaWYgdGhleSBhcmUgYXV0aGVudGljIGFuZCBoYXZlIHRoZSByaWdodAorCSAqIHRvIHV0aWxpemUgdGhlIHNlcnZpY2UuCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdXNlci4KKwkgKgorCSAqIEBwYXJhbSBwd2QgdGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyLgorCSAqCisJICogQHRocm93cyBGYWlsdXJlIGlmIHRoZSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkIGluLCBuYW1lIG9yIHB3ZCBkb24ndAorCSAqIG1hdGNoIGF1dGhlbnRpY2F0aW9uIGRhdGFiYXNlLCBvciBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0CisJICogdG8gdXRpbGl6ZSB0aGUgc2VydmljZS4KKwkgKi8KKwlAQXV0aG9yaXplKCB0cnVlICkKKwl2b2lkIGxvZ2luKCBzdHJpbmcgbmFtZSwgc3RyaW5nIHB3ZCApIHRocm93cyBGYWlsdXJlCisJCisJLyoqCisJICogTWFya3MgdGhlIHVzZXIgYXMgbG9nZ2VkIG91dC4KKwkgKi8KKwlAQXV0aG9yaXplKCB0cnVlICkKKwl2b2lkIGxvZ291dCgpCisJCisJLyoqCisJICogQ2hlY2tzIGlmIGEgdXNlciBpcyBsb2dnZWQgaW4uCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgYSB1c2VyIGlzIGxvZ2dlZCBpbi4KKwkgKi8KKwlAQXV0aG9yaXplKCB0cnVlICkgQERpcmVjdGlvbiggQm90aCApCisJYm9vbGVhbiBpc0xvZ2dlZEluKCkKKwkKKwkvLy8vLy8vLy8vCisJLy8gQ0hBVCAvLworCS8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBzZXQgb2Ygb25saW5lIHVzZXJzIHVwb24gbG9naW4uCisJICoKKwkgKiBAcGFyYW0gbmFtZXMgdGhlIHNldCBvZiBvbmxpbmUgdXNlcnMuCisJICovCisJQE9uZXdheSBARGlyZWN0aW9uKCBDbGllbnQgKQorCXZvaWQgd2hvSXNPbmxpbmUoIHN0cmluZ1tdIG5hbWVzICkKKwkKKwkvKioKKwkgKiBSZXBvcnRzIGEgc3RhdHVzIGNoYW5nZSBvZiBhIHVzZXIuCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdXNlci4KKwkgKgorCSAqIEBwYXJhbSBvbmxpbmUgdHJ1ZSBpZiB0aGV5IGFyZSBub3cgb25saW5lLgorCSAqLworCUBPbmV3YXkgQERpcmVjdGlvbiggQ2xpZW50ICkKKwl2b2lkIHN0YXR1c0NoYW5nZSggc3RyaW5nIG5hbWUsIGJvb2xlYW4gb25saW5lICkgCisJCisJLyoqCisJICogU2VuZHMgYSBtZXNzYWdlIHRvIG9yIGZyb20gdGhlIG5hbWVkIHVzZXIuCisJICoKKwkgKiBAcGFyYW0gd2hvIHRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQgb3IgdGhlIHNlbmRlcgorCSAqIGRlcGVuZGluZyB1cG9uIHRoZSBkaXJlY3Rpb24uCisJICoKKwkgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHRvIHNlbmQuCisJICoKKwkgKiBAdGhyb3dzIEZhaWx1cmUgaWYgdGhlIHVzZXIgaXMgbm90IG9ubGluZS4KKwkgKi8KKwlARGlyZWN0aW9uKCBCb3RoICkgQEFzeW5jUmVjZWl2ZXIoIFF1ZXVlZCApCisJdm9pZCBzZW5kKCBzdHJpbmcgd2hvLCBzdHJpbmcgbXNnICkgdGhyb3dzIEZhaWx1cmUKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvY2hhdC9JbXBsQ2hhdENsaWVudC5qYXZhIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9jaGF0L0ltcGxDaGF0Q2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyZjdlZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvY2hhdC9JbXBsQ2hhdENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uOworCisKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlQ2hhdENsaWVudC4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgSW1wbENoYXRDbGllbnQgZXh0ZW5kcyBCYXNlQ2hhdENsaWVudAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxDaGF0Q2xpZW50LgorCSAqCisJICogQHBhcmFtIHNlcnZlciBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCisJICogQHBhcmFtIHdob2FtaSAKKwkgKiBAcGFyYW0gc251YiAKKwkgKi8KKwlwdWJsaWMgSW1wbENoYXRDbGllbnQoIFJlbW90ZUNoYXRTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgd2hvYW1pLCBib29sZWFuIHNudWIgKQorCXsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCXRoaXMud2hvYW1pID0gd2hvYW1pOworCQl0aGlzLnNudWIgPSBzbnViOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUNoYXRTZXJ2ZXIgc2VydmVyOworCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIHdob2FtaTsKKwkKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc251YjsKKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGlzTG9nZ2VkSW4oKQorCXsKKwkJLy8gc2VydmVyIGlzIGFsd2F5cyBsb2dnZWQgaW4gdG8gdGhlIGNsaWVudC4KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhdHVzQ2hhbmdlKCBTdHJpbmcgbmFtZSwgQm9vbGVhbiBvbmxpbmUgKSAKKwl7CisJCWlmIChvbmxpbmUpCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXM6ICVzIG9ubGluZSAoc3JjPXN0YXR1c0NoYW5nZSlcbiIsIHdob2FtaSwgbmFtZSApOworCQkJd2hvSXNPbmxpbmUuYWRkKCBuYW1lICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzOiAlcyBvZmZsaW5lXG4iLCB3aG9hbWksIG5hbWUgKTsKKwkJCXdob0lzT25saW5lLnJlbW92ZSggbmFtZSApOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgd2hvSXNPbmxpbmUoIFN0cmluZ1tdIG5hbWVzICkKKyAgICB7CisJCWZvciAoU3RyaW5nIG5hbWU6IG5hbWVzKQorCQl7CisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzOiAlcyBvbmxpbmUgKHNyYz13aG9Jc09ubGluZSlcbiIsIHdob2FtaSwgbmFtZSApOworCQkJd2hvSXNPbmxpbmUuYWRkKCAgbmFtZSApOworCQl9CisgICAgfQorCQorCXByaXZhdGUgU2V0PFN0cmluZz4gd2hvSXNPbmxpbmUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZW5kKCBTdHJpbmcgd2hvLCBTdHJpbmcgbXNnICkgdGhyb3dzIEZhaWx1cmUKKyAgICB7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXM6IG1zZyBmcm9tICVzOiAlc1xuIiwgd2hvYW1pLCB3aG8sIG1zZyApOworCQlpZiAoc251YikKKwkJeworCQkJc2VydmVyLnNlbmQoIHdobywgU3RyaW5nLmZvcm1hdCggIiVzLCBsZWF2ZSBtZSBhbG9uZSEiLCB3aG8gKSApOworCQkJU3lzdGVtLm91dC5wcmludGxuKCAic251YiBkb25lIiApOworCQl9CisgICAgfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgX3Nlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChldmVudCA9PSBTZXNzaW9uLkRPV04pCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICIoc2VydmVyIGRpc2Nvbm5lY3RlZCkiICk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvY2hhdC9JbXBsQ2hhdFNlcnZlci5qYXZhIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9jaGF0L0ltcGxDaGF0U2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3NWMwNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NoYXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvY2hhdC9JbXBsQ2hhdFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMjMyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uOworCisKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlQ2hhdFNlcnZlci4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgSW1wbENoYXRTZXJ2ZXIgZXh0ZW5kcyBCYXNlQ2hhdFNlcnZlcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxDaGF0U2VydmVyLgorCSAqCisJICogQHBhcmFtIGNsaWVudCBhIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisJICogQHBhcmFtIHdob0lzT25saW5lIGRhdGFiYXNlIG9mIG9ubGluZSBjb25uZWN0aW9ucy4KKwkgKi8KKwlwdWJsaWMgSW1wbENoYXRTZXJ2ZXIoIFJlbW90ZUNoYXRDbGllbnQgY2xpZW50LAorCQlNYXA8U3RyaW5nLCBJbXBsQ2hhdFNlcnZlcj4gd2hvSXNPbmxpbmUgKQorCXsKKwkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CisJCXRoaXMud2hvSXNPbmxpbmUgPSB3aG9Jc09ubGluZTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVDaGF0Q2xpZW50IGNsaWVudDsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSW1wbENoYXRTZXJ2ZXI+IHdob0lzT25saW5lOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBdXRoZW50aWNhdGlvbiAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisvLwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9OQU1FX1BXRF9NU0cgPSAiVXNlciBuYW1lL3Bhc3N3b3JkIGlzIG5vdCB2YWxpZCI7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9naW4oIFN0cmluZyBuYW1lLCBTdHJpbmcgcHdkICkgdGhyb3dzIEZhaWx1cmUKKwl7CisJCWlmIChpc0xvZ2dlZEluKCkpCisJCQl0aHJvdyBuZXcgRmFpbHVyZSggIkFscmVhZHkgbG9nZ2VkIGluIiApOworCisJCWlmIChuYW1lID09IG51bGwpCisJCQl0aHJvdyBuZXcgRmFpbHVyZSgiVXNlcm5hbWUgaXMgbnVsbCIpOworCQkKKwkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCXRocm93IG5ldyBGYWlsdXJlKCJVc2VybmFtZSBpcyBlbXB0eSIpOworCQkKKwkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiYmFkIikpCisJCQl0aHJvdyBuZXcgRmFpbHVyZSgiVXNlcm5hbWUgaXMgbm90IHZhbGlkIik7CisKKwkJaWYgKHB3ZCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IEZhaWx1cmUoIlBhc3N3b3JkIGlzIG51bGwiKTsKKwkJCisJCWlmIChwd2Quc3RhcnRzV2l0aCgiYmFkIikpCisJCQl0aHJvdyBuZXcgRmFpbHVyZSgiUGFzc3dvcmQgaXMgbm90IHZhbGlkIik7CisJCQorCQkvLyBUT0RPIGNoZWNrIHVzZXIgYXV0aGVudGljYXRpb24uCisKKwkJLy8gYWRkIHRoaXMgdXNlciB0byB0aGUgd2hvIGlzIG9ubGluZSBtYXAuCisJCQorCQlJbXBsQ2hhdFNlcnZlciBvdGhlciA9IHdob0lzT25saW5lLnB1dCggbmFtZSwgdGhpcyApOworCQlpZiAob3RoZXIgIT0gbnVsbCkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJb3RoZXIuZGVsaXZlciggIlNZU1RFTSIsICJZb3UgaGF2ZSBiZWVuIGxvZ2dlZCBvdXQgYmVjYXVzZSB5b3UgbG9nZ2VkIGluIHNvbWV3aGVyZSBlbHNlLiIgKTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCS8vIGlnbm9yZSBmYWlsdXJlIHRvIHNlbmQgdGhpcyBtZXNzYWdlLgorCQkJfQorCQkJb3RoZXIubG9nb3V0KCk7CisJCQlvdGhlciA9IG51bGw7CisJCX0KKwkJCisJCS8vIG1hcmsgYXMgbG9nZ2VkIGluLgorCisJCXVzZXIgPSBuYW1lOworCQkKKwkJLy8gc2F5IHdlJ3JlIG9ubGluZQorCQkKKwkJc2F5U3RhdHVzQ2hhbmdlZCggdXNlciwgdHJ1ZSApOworCisJCS8vIHRlbGwgdGhlIGNsaWVudCB3aG8ncyBvbmxpbmUKKwkJCisJCVNldDxTdHJpbmc+IHdobzsKKwkJc3luY2hyb25pemVkICh3aG9Jc09ubGluZSkKKwkJeworCQkJd2hvID0gbmV3IEhhc2hTZXQ8U3RyaW5nPiggd2hvSXNPbmxpbmUua2V5U2V0KCkgKTsKKwkJfQorCQl3aG8ucmVtb3ZlKCBuYW1lICk7CisJCWNsaWVudC53aG9Jc09ubGluZSggd2hvLnRvQXJyYXkoIG5ldyBTdHJpbmdbd2hvLnNpemUoKV0gKSApOworCQkKKwkJTG9nLnJlcG9ydCggImxvZ2luIiwgIndobyIsIG5hbWUgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9nb3V0KCkKKwl7CisJCWlmICh1c2VyICE9IG51bGwpCisJCXsKKwkJCWJvb2xlYW4gdG9va1VzT2ZmbG5lID0gZmFsc2U7CisJCQkKKwkJCXN5bmNocm9uaXplZCAod2hvSXNPbmxpbmUpCisJCQl7CisJCQkJaWYgKHdob0lzT25saW5lLmdldCggdXNlciApID09IHRoaXMpCisJCQkJeworCQkJCQkvLyByZW1vdmUgdXMgZnJvbSB0aGUgb25saW5lIG1hcC4KKwkJCQkJCisJCQkJCXdob0lzT25saW5lLnJlbW92ZSggdXNlciApOworCQkJCQl0b29rVXNPZmZsbmUgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKHRvb2tVc09mZmxuZSkKKwkJCXsKKwkJCQkvLyBzYXkgd2UncmUgb2ZmbGluZQorCQkJCQorCQkJCXNheVN0YXR1c0NoYW5nZWQoIHVzZXIsIGZhbHNlICk7CisKKwkJCQlMb2cucmVwb3J0KCAibG9nb3V0IiwgIndobyIsIHVzZXIgKTsKKwkJCX0KKwkJCQorCQkJdXNlciA9IG51bGw7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBpc0xvZ2dlZEluKCkKKwl7CisJCXJldHVybiB1c2VyICE9IG51bGw7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNheVN0YXR1c0NoYW5nZWQoIFN0cmluZyB1LCBib29sZWFuIGlzT25saW5lICkKKyAgICB7CisJCUNvbGxlY3Rpb248SW1wbENoYXRTZXJ2ZXI+IHdobyA9IHdob0lzT25saW5lLnZhbHVlcygpOworCSAgICBmb3IgKEltcGxDaGF0U2VydmVyIG90aGVyOiB3aG8udG9BcnJheSggbmV3IEltcGxDaGF0U2VydmVyW3doby5zaXplKCldICkpCisJICAgIAlpZiAob3RoZXIgIT0gdGhpcykKKwkgICAgCQlvdGhlci5jbGllbnQuc3RhdHVzQ2hhbmdlKCB1LCBpc09ubGluZSApOworICAgIH0KKworCXByaXZhdGUgU3RyaW5nIHVzZXI7CisKKwkvLy8vLy8vLy8vCisJLy8gU2VuZCAvLworCS8vLy8vLy8vLy8KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNlbmQoIFN0cmluZyB3aG8sIFN0cmluZyBtc2cgKSB0aHJvd3MgRmFpbHVyZQorCXsKKwkJU3RyaW5nIG1lID0gdXNlcjsKKwkJaWYgKG1lID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlJbXBsQ2hhdFNlcnZlciBvdGhlciA9IHdob0lzT25saW5lLmdldCggd2hvICk7CisJCWlmIChvdGhlciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IEZhaWx1cmUoICJ1c2VyIGlzIG5vdCBvbmxpbmU6ICIrd2hvICk7CisJCQorCQlvdGhlci5kZWxpdmVyKCBtZSwgbXNnICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGl2ZXIoIFN0cmluZyBmcm9tLCBTdHJpbmcgbXNnICkgdGhyb3dzIEZhaWx1cmUKKwl7CisJCS8vIFRPRE8gY2hlY2sgZnJvbSBub3QgaW4gdXNlcidzIGJsb2NrIGxpc3QuLi4KKwkJCisJCXRyeQorCQl7CisJCQlMb2cucmVwb3J0KCAic2VuZGluZyIsICJmcm9tIiwgZnJvbSwgInRvIiwgdXNlciwgIm1zZyIsIG1zZyApOworCQkJY2xpZW50LnNlbmQoIGZyb20sIG1zZyApOworCQkJTG9nLnJlcG9ydCggInNlbnQiLCAiZnJvbSIsIGZyb20sICJ0byIsIHVzZXIsICJtc2ciLCBtc2cgKTsKKwkJfQorCQljYXRjaCAoIEZhaWx1cmUgZSApCisJCXsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0aHJvdyBlOworCQl9CisJCWNhdGNoICggUnVudGltZUV4Y2VwdGlvbiBlICkKKwkJeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXRocm93IGU7CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU2Vzc2lvbiBxdWVyeSwgY29udHJvbCwgYW5kIG5vdGlmeSAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIF9zZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoZXZlbnQgPT0gU2Vzc2lvbi5VUCkKKwkJCXJldHVybjsKKwkJCisJCWlmIChldmVudCA9PSBTZXNzaW9uLkRPV04pCisJCXsKKwkJCWxvZ291dCgpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBUaHJvd2FibGUpCisJCQkoKFRocm93YWJsZSkgZXZlbnQpLnByaW50U3RhY2tUcmFjZSgpOworCQllbHNlCisJCQlMb2cucmVwb3J0KCAiZXZlbnQiLCAiY29ubiIsIHRoaXMsICJ3aGF0IiwgZXZlbnQgKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9jaGF0L01haW5DaGF0Q2xpZW50LmphdmEgYi9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2NoYXQvTWFpbkNoYXRDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVjZWYzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9jaGF0L01haW5DaGF0Q2xpZW50LmphdmEKQEAgLTAsMCArMSwzMTEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5PYmpTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuX0V0Y2hfQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisKKworLyoqCisgKiBTaW1wbGUgY29tbWFuZCBsaW5lIGNoYXQgY2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpbkNoYXRDbGllbnQgaW1wbGVtZW50cyBDaGF0Q2xpZW50LCBPYmpTZXNzaW9uCit7CisJLyoqCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5hZGRTaW5rKCBudWxsICk7CisJCUxvZy5yZXBvcnQoICJNYWluQ2hhdENsaWVudCIgKTsKKwkJCisJCWZpbmFsIFN0cmluZyB1cmk7CisJCWlmIChhcmdzLmxlbmd0aCA9PSAxKQorCQl7CisJCQl1cmkgPSBhcmdzWzBdOworCQl9CisJCWVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDApCisJCXsKKwkJCXVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNT9UY3BUcmFuc3BvcnQucmVjb25uZWN0RGVsYXk9NDAwMCI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ1c2FnZTogTWFpbkNoYXRDbGllbnQgWzx1cmk+XSIgKTsKKwkJCVN5c3RlbS5leGl0KCAxICk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbiggIkNvbm5lY3RpbmcgdG8gY2hhdCBzZXJ2ZXIgYXQgIit1cmkgKTsKKwkJCisJCWZpbmFsIE1haW5DaGF0Q2xpZW50IGNsaWVudCA9IG5ldyBNYWluQ2hhdENsaWVudCgpOworCQkKKwkJUmVtb3RlQ2hhdFNlcnZlciBzZXJ2ZXIgPSBDaGF0SGVscGVyLm5ld1NlcnZlciggdXJpLCBudWxsLAorCQkJbmV3IENoYXRIZWxwZXIuQ2hhdENsaWVudEZhY3RvcnkoKQorCQkJeworCQkJCXB1YmxpYyBDaGF0Q2xpZW50IG5ld0NoYXRDbGllbnQoIFJlbW90ZUNoYXRTZXJ2ZXIgc2VydmVyICkKKwkJCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQkJCXsKKwkJCQkJcmV0dXJuIGNsaWVudDsKKwkJCQl9CisJCQl9ICk7CisJCQorCQlzZXJ2ZXIuX3N0YXJ0QW5kV2FpdFVwKCA0MDAwICk7CisJCQorCQlTeXN0ZW0ub3V0LnByaW50bG4oICIoY29ubmVjdGVkLCBlbnRlciBjb21tYW5kIG9yICdoZWxwJyB0byBsaXN0IGNvbW1hbmRzKSIgKTsKKwkJCisJCUJ1ZmZlcmVkUmVhZGVyIHJkciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKCBTeXN0ZW0uaW4gKSApOworCQl3aGlsZSAodHJ1ZSkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludCggImNtZDogIiApOworCQkJU3lzdGVtLm91dC5mbHVzaCgpOworCQkJCisJCQlTdHJpbmcgcyA9IHJkci5yZWFkTGluZSgpOworCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplciggcywgIiBcdFxyXG4iICk7CisJCQlpZiAoIXN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJU3RyaW5nIGNtZCA9IHN0Lm5leHRUb2tlbigpOworCQkJCisJCQlpZiAoY21kLmVxdWFscyggImhlbHAiICkpCisJCQl7CisJCQkJZG9faGVscCgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCisJCQlpZiAoY21kLmVxdWFscyggImxvZ2luIiApKQorCQkJeworCQkJCWRvX2xvZ2luKCBzZXJ2ZXIsIHN0ICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCWlmIChjbWQuZXF1YWxzKCAibG9nb3V0IiApKQorCQkJeworCQkJCWRvX2xvZ291dCggc2VydmVyICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCWlmIChjbWQuZXF1YWxzKCAicXVpdCIgKSkKKwkJCQlicmVhazsKKwkJCQorCQkJaWYgKGNtZC5lcXVhbHMoICJzZW5kIiApKQorCQkJeworCQkJCWRvX3NlbmQoIHNlcnZlciwgY21kLCBzdCApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCisJCQlpZiAoY21kLmVxdWFscyggIndobyIgKSkKKwkJCXsKKwkJCQlkb193aG8oIGNsaWVudCApOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ1bmtub3duIGNvbW1hbmQgIitjbWQgKTsKKwkJCWRvX2hlbHAoKTsKKwkJfQorCQkKKwkJc2VydmVyLl90cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RPUCwgbnVsbCApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZG9faGVscCgpCisgICAgeworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJjb21tYW5kczogIiApOworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgIGhlbHAiICk7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgbG9naW4gPHVzZXI+IDxwd2Q+IiApOworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgIGxvZ291dCIgKTsKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICBxdWl0IiApOworIAkgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICBzZW5kIDx1c2VyPiA8bXNnPiIgKTsKKyAJICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgd2hvIiApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZG9fbG9naW4oIENoYXRTZXJ2ZXIgc2VydmVyLCBTdHJpbmdUb2tlbml6ZXIgc3QgKQorICAgIHsKKwkJdHJ5CisJCXsKKwkJCVN0cmluZyBuYW1lID0gc3QubmV4dFRva2VuKCk7CisJCQlTdHJpbmcgcHdkID0gc3QubmV4dFRva2VuKCk7CisJCQlzZXJ2ZXIubG9naW4oIG5hbWUsIHB3ZCApOworCQkJU3lzdGVtLm91dC5wcmludGxuKCAiKGxvZ2luIHN1Y2Nlc3NmdWwpIiApOworCQl9CisJCWNhdGNoICggTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlICkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGxuKCAidXNhZ2U6IGxvZ2luIDx1c2VyPiA8cHdkPiIgKTsKKwkJfQorCQljYXRjaCAoIEZhaWx1cmUgZSApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggImZhaWxlZDogIitlLmdldE1lc3NhZ2UoKSApOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGxuKCAiZmFpbGVkOiAiK2UgKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKyAgICB9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRvX2xvZ291dCggQ2hhdFNlcnZlciBzZXJ2ZXIgKQorCXsKKwkJc2VydmVyLmxvZ291dCgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICIobG9nb3V0IHN1Y2Nlc3NmdWwpIiApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZG9fc2VuZCggQ2hhdFNlcnZlciBzZXJ2ZXIsIFN0cmluZyBjbWQsIFN0cmluZ1Rva2VuaXplciBzdCApCisgICAgeworCQl0cnkKKwkJeworCQkJU3RyaW5nIHdobyA9IHN0Lm5leHRUb2tlbigpOworCQkJU3RyaW5nIG1zZyA9IHN0Lm5leHRUb2tlbiggIlxyXG4iICk7CisJCQlzZXJ2ZXIuc2VuZCggd2hvLCBtc2cgKTsKKwkJfQorCQljYXRjaCAoIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInVzYWdlOiBzZW5kIDx1c2VyPiA8bXNnPiIgKTsKKwkJfQorCQljYXRjaCAoIF9FdGNoX0F1dGhFeGNlcHRpb24gZSApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInlvdSBtdXN0IGxvZ2luIGZpcnN0IiApOworCQl9CisJCWNhdGNoICggRmFpbHVyZSBlICkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGxuKCAiZmFpbGVkOiAiK2UuZ2V0TWVzc2FnZSgpICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggImZhaWxlZDogIitlICk7CisJCX0KKyAgICB9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb193aG8oIE1haW5DaGF0Q2xpZW50IGNsaWVudCApCisgICAgeworCSAgICBmb3IgKFN0cmluZyBuYW1lOiBjbGllbnQuZ2V0V2hvSXNPbmxpbmUoKSkKKwkgICAgCVN5c3RlbS5vdXQucHJpbnRsbiggIiAgIituYW1lICk7CisgICAgfQorCQorCS8qKgorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHdobyBpcyBvbmxpbmUgcmlnaHQgbm93LgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRXaG9Jc09ubGluZSgpCisJeworCQlyZXR1cm4gd2hvSXNPbmxpbmUudG9BcnJheSggbmV3IFN0cmluZ1swXSApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHdob0lzT25saW5lID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KCBuZXcgSGFzaFNldDxTdHJpbmc+KCkgKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDaGF0Q2xpZW50IC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIHZvaWQgd2hvSXNPbmxpbmUoIFN0cmluZ1tdIG5hbWVzICkKKyAgICB7CisJICAgIGZvciAoU3RyaW5nIG5hbWU6IG5hbWVzKQorCSAgICB7CisJICAgIAl3aG9Jc09ubGluZS5hZGQoIG5hbWUgKTsKKwkgICAgCVN5c3RlbS5vdXQucHJpbnRsbiggbmFtZSsiIGlzIG9ubGluZSIgKTsKKwkgICAgfQorICAgIH0KKworCXB1YmxpYyB2b2lkIHN0YXR1c0NoYW5nZSggU3RyaW5nIG5hbWUsIEJvb2xlYW4gb25saW5lICkKKyAgICB7CisJCWlmIChvbmxpbmUpCisJCXsKKwkJCXdob0lzT25saW5lLmFkZCggbmFtZSApOworCQkJU3lzdGVtLm91dC5wcmludGxuKCBuYW1lKyIgaXMgbm93IG9ubGluZSIgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdob0lzT25saW5lLnJlbW92ZSggbmFtZSApOworCQkJU3lzdGVtLm91dC5wcmludGxuKCBuYW1lKyIgaXMgbm93IG9mZmxpbmUiICk7CisJCX0KKyAgICB9CisKKwkvLy8vLy8vLy8vCisJLy8gQ2hhdCAvLworCS8vLy8vLy8vLy8KKworCXB1YmxpYyBCb29sZWFuIGlzTG9nZ2VkSW4oKQorICAgIHsKKwkJLy8gc2VydmVyIGlzIGFsd2F5cyBsb2dnZWQgaW4gdG8gdGhlIGNsaWVudC4KKwkgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisJcHVibGljIHZvaWQgc2VuZCggU3RyaW5nIHdobywgU3RyaW5nIG1zZyApIHRocm93cyBGYWlsdXJlCisgICAgeworCQlzeW5jaHJvbml6ZWQoIGRmICkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGYoICJbICVzQCVzIF0gJXNcbiIsIHdobywgZGYuZm9ybWF0KCBuZXcgRGF0ZSgpICksIG1zZyApOworCQl9CisgICAgfQorCQorCXByaXZhdGUgRGF0ZUZvcm1hdCBkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCAiSEg6bW06c3MiICk7CisKKwkvLy8vLy8vLy8vLy8vLy8vCisJLy8gT2JqU2Vzc2lvbiAvLworCS8vLy8vLy8vLy8vLy8vLy8KKworCXB1YmxpYyBPYmplY3QgX3Nlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnk6ICIrcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBfc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sOiAiK2NvbnRyb2wgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBfc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkKKwl7CisJCWlmIChldmVudC5lcXVhbHMoIFNlc3Npb24uVVAgKSApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggIihzZXJ2ZXIgb3BlbmVkIGNvbm5lY3Rpb24pIiApOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoZXZlbnQuZXF1YWxzKCBTZXNzaW9uLkRPV04gKSApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggIihzZXJ2ZXIgY2xvc2VkIGNvbm5lY3Rpb24pIiApOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBUaHJvd2FibGUpCisJCXsKKwkJCSgoVGhyb3dhYmxlKSBldmVudCkucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jaGF0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2NoYXQvTWFpbkNoYXRMaXN0ZW5lci5qYXZhIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9jaGF0L01haW5DaGF0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc0MzEwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2hhdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9jaGF0L01haW5DaGF0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgQ2hhdFNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW5DaGF0Q2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpbkNoYXRMaXN0ZW5lciBpbXBsZW1lbnRzIENoYXRIZWxwZXIuQ2hhdFNlcnZlckZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIENoYXRTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLmFkZFNpbmsoIG51bGwgKTsKKwkJTG9nLnJlcG9ydCggIk1haW5DaGF0TGlzdGVuZXIiICk7CisJCQorCQlTdHJpbmcgdXJpID0gInRjcDovLzAuMC4wLjA6NDAwNSI7CisJCWlmIChhcmdzLmxlbmd0aCA+IDApCisJCXsKKwkJCXVyaSA9IGFyZ3NbMF07CisJCX0KKwkJZWxzZSBpZiAoYXJncy5sZW5ndGggIT0gMCkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGxuKCAidXNhZ2U6IE1haW5DaGF0TGlzdGVuZXIgW3VyaV0iICk7CisJCQlTeXN0ZW0uZXhpdCggMSApOworCQkJcmV0dXJuOworCQl9CisJCQorCQlNYWluQ2hhdExpc3RlbmVyIGltcGxGYWN0b3J5ID0gbmV3IE1haW5DaGF0TGlzdGVuZXIoKTsKKwkJCisJCVNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBDaGF0SGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsCisJCQlpbXBsRmFjdG9yeSApOworCisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCX0KKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSW1wbENoYXRTZXJ2ZXI+IHdob0lzT25saW5lID0KKwkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcDxTdHJpbmcsIEltcGxDaGF0U2VydmVyPigpICk7CisKKwlwdWJsaWMgQ2hhdFNlcnZlciBuZXdDaGF0U2VydmVyKCBSZW1vdGVDaGF0Q2xpZW50IGNsaWVudCApCisJeworCQlyZXR1cm4gbmV3IEltcGxDaGF0U2VydmVyKCBjbGllbnQsIHdob0lzT25saW5lICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9zcmMvdGVzdC9jc2hhcnAvQ2hhdFRlc3RQcm9qL0NoYXRUZXN0UHJvai5jc3Byb2ogYi9leGFtcGxlcy9jaGF0L3NyYy90ZXN0L2NzaGFycC9DaGF0VGVzdFByb2ovQ2hhdFRlc3RQcm9qLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzYyMDlmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2hhdC9zcmMvdGVzdC9jc2hhcnAvQ2hhdFRlc3RQcm9qL0NoYXRUZXN0UHJvai5jc3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezAxQTdGMENDLTc4QUItNENGRS04OERCLTMyQUFDNkQ2QzAwQn08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkNoYXRUZXN0UHJvajwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkNoYXRUZXN0UHJvajwvQXNzZW1ibHlOYW1lPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrLCBWZXJzaW9uPTIuNC43LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OTZkMDlhMWViN2Y0NGE3NywgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPEhpbnRQYXRoPiQoTlVOSVRfSE9NRSlcYmluXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxCYXNlQ2hhdENsaWVudC5jcyI+CisgICAgICA8TGluaz5CYXNlQ2hhdENsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcQmFzZUNoYXRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+QmFzZUNoYXRTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XENoYXQuY3MiPgorICAgICAgPExpbms+Q2hhdC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcQ2hhdENsaWVudC5jcyI+CisgICAgICA8TGluaz5DaGF0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxDaGF0SGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPkNoYXRIZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XENoYXRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+Q2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcUmVtb3RlQ2hhdC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVDaGF0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxSZW1vdGVDaGF0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZUNoYXRDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XFJlbW90ZUNoYXRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+UmVtb3RlQ2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcU3R1YkNoYXQuY3MiPgorICAgICAgPExpbms+U3R1YkNoYXQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0XFN0dWJDaGF0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlN0dWJDaGF0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdFxTdHViQ2hhdFNlcnZlci5jcyI+CisgICAgICA8TGluaz5TdHViQ2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXRcVmFsdWVGYWN0b3J5Q2hhdC5jcyI+CisgICAgICA8TGluaz5WYWx1ZUZhY3RvcnlDaGF0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLmV4YW1wbGVzLmNoYXRcSW1wbENoYXRDbGllbnQuY3MiPgorICAgICAgPExpbms+SW1wbENoYXRDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2guZXhhbXBsZXMuY2hhdFxJbXBsQ2hhdFNlcnZlci5jcyI+CisgICAgICA8TGluaz5JbXBsQ2hhdFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC5leGFtcGxlcy5jaGF0XE1haW5DaGF0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPk1haW5DaGF0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLmV4YW1wbGVzLmNoYXRcTWFpbkNoYXRMaXN0ZW5lci5jcyI+CisgICAgICA8TGluaz5NYWluQ2hhdExpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLmNoYXRcVGVzdFJlbW90ZUNoYXRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+VGVzdFJlbW90ZUNoYXRTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlwuLlwuLlxiaW5kaW5nLWNzaGFycFxydW50aW1lXHNyY1xtYWluXGNzaGFycFxFdGNoUHJvai5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn08L1Byb2plY3Q+CisgICAgICA8TmFtZT5FdGNoUHJvajwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoYXQvc3JjL3Rlc3QvY3NoYXJwL0NoYXRUZXN0UHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2V4YW1wbGVzL2NoYXQvc3JjL3Rlc3QvY3NoYXJwL0NoYXRUZXN0UHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWFmZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2hhdC9zcmMvdGVzdC9jc2hhcnAvQ2hhdFRlc3RQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKy8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNoYXRUZXN0UHJvaiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJDaGF0VGVzdFByb2oiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCCpICAyMDA4IildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCI3MGY1ZjhkZS0zNjg1LTRmYWItYjgwZS1mYTIxYmQwZDE5N2QiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbiAKKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMgCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2hhdC9zcmMvdGVzdC9jc2hhcnAvZXRjaC5leGFtcGxlcy5jaGF0L1Rlc3RSZW1vdGVDaGF0U2VydmVyLmNzIGIvZXhhbXBsZXMvY2hhdC9zcmMvdGVzdC9jc2hhcnAvZXRjaC5leGFtcGxlcy5jaGF0L1Rlc3RSZW1vdGVDaGF0U2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTRmODgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jaGF0L3NyYy90ZXN0L2NzaGFycC9ldGNoLmV4YW1wbGVzLmNoYXQvVGVzdFJlbW90ZUNoYXRTZXJ2ZXIuY3MKQEAgLTAsMCArMSwxNjkgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0LnR5cGVzLkNoYXQ7CisKK25hbWVzcGFjZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuY2hhdAoreworICAgIFtUZXN0Rml4dHVyZV0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdFJlbW90ZUNoYXRTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgU3RyaW5nIF9mcmVkID0gIkZyZWQiOworICAgICAgIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBSZW1vdGVDaGF0U2VydmVyIGZyZWRfc2VydmVyOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFNlcnZlckZhY3RvcnkgbGlzdGVuZXI7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyAgdm9pZCBTZXR1cExpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAxMCI7CisKKyAgICAgICAgICAgIE1haW5DaGF0TGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkNoYXRMaXN0ZW5lcigpOworICAgICAgICAgICAgbGlzdGVuZXIgPSBDaGF0SGVscGVyLk5ld0xpc3RlbmVyKHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkpOworCisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJMaXN0ZW5lciBTdGFydGVkIik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICBbU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEFzc2lnbk51bGxUb0Nvbm5lY3Rpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgICAgICAgICAKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RMb2dpbjEoKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVkX3NlcnZlciA9IFNldHVwVXNlckFuZENvbm5lY3Rpb24oX2ZyZWQpOworICAgICAgICAgICAgZnJlZF9zZXJ2ZXIubG9naW4oIF9mcmVkLCBfZnJlZCApOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIEZhaWx1cmUgKSApXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TG9naW4yKCkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZF9zZXJ2ZXIgPSAgU2V0dXBVc2VyQW5kQ29ubmVjdGlvbihfZnJlZCApOyAgICAgICAgICAgCisgICAgICAgICAgICBmcmVkX3NlcnZlci5sb2dpbiggX2ZyZWQsIF9mcmVkICk7CisgICAgICAgICAgICBmcmVkX3NlcnZlci5sb2dpbihfZnJlZCwgX2ZyZWQpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRmFpbHVyZSkpXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TG9naW4zKCkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZF9zZXJ2ZXIgPSBTZXR1cFVzZXJBbmRDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgZnJlZF9zZXJ2ZXIubG9naW4obnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihGYWlsdXJlKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RMb2dpbjQoKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVkX3NlcnZlciA9IFNldHVwVXNlckFuZENvbm5lY3Rpb24oImZyZWQiKTsKKyAgICAgICAgICAgIGZyZWRfc2VydmVyLmxvZ2luKCJmcmVkIiwgImJhZFBhc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEZhaWx1cmUpKV0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdExvZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZF9zZXJ2ZXIgPSBTZXR1cFVzZXJBbmRDb25uZWN0aW9uKCJiYWRVc2VyIik7CisgICAgICAgICAgICBmcmVkX3NlcnZlci5sb2dpbigiYmFkVXNlciIsICJiYWRQYXNzIik7CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZWFyRG93bl0KKyAgICAgICAgcHVibGljIHZvaWQgU2h1dERvd25PcGVuQ29ubmVjdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZnJlZF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVkX3NlcnZlci5sb2dvdXQoKTsKKyAgICAgICAgICAgICAgICBmcmVkX3NlcnZlci5fU3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlVGVhckRvd25dCisgICAgICAgIHB1YmxpYyB2b2lkIFN0b3BMaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUT1BfQU5EX1dBSVRfRE9XTiwgNDAwMCk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0dXAgdGhlIGNvbm5lY3Rpb24gYW5kIHNlcnZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgdGhpcyB1c2VyLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1c2VybmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBDaGF0U2VydmVyIGluc3RhbmNlIHRvIHBsYXkgd2l0aDwvcmV0dXJucz4KKyAgICAgICAgLy8vIAorICAgICAgICBwdWJsaWMgc3RhdGljIFJlbW90ZUNoYXRTZXJ2ZXIgU2V0dXBVc2VyQW5kQ29ubmVjdGlvbiggU3RyaW5nIHVzZXJuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMTAiOworICAgICAgICAgICAgCisgICAgICAgICAgICBNeUNoYXRDbGllbnRJbXBsIGNsaWVudCA9IG5ldyBNeUNoYXRDbGllbnRJbXBsKCB1c2VybmFtZSk7CisgICAgICAgICAgICBSZW1vdGVDaGF0U2VydmVyIHNlcnZlciA9IENoYXRIZWxwZXIuTmV3U2VydmVyKCB1cmksbnVsbCwgY2xpZW50ICk7CisgICAgICAgICAKKyAgICAgICAgICAgIHNlcnZlci5fU3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKworICAgICAgICAgICAgcmV0dXJuIHNlcnZlcjsgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIHlvdXIgb3duIENoYXRDbGllbnRJbXBsIHNvIGFzIHRvIHZlcmlmeSBtZXNzYWdlcy4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjbGFzcyBNeUNoYXRDbGllbnRJbXBsIDogQ2hhdEhlbHBlci5DaGF0Q2xpZW50RmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdXNlcjsKKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIENvbnN0cnVjdHMgdGhlIENoYXRDbGllbnRJbXBsCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIE15Q2hhdENsaWVudEltcGwoc3RyaW5nIHVzZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgI3JlZ2lvbiBDaGF0Q2xpZW50RmFjdG9yeSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBDaGF0Q2xpZW50IE5ld0NoYXRDbGllbnQoUmVtb3RlQ2hhdFNlcnZlciBzZXJ2ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBsQ2hhdENsaWVudChzZXJ2ZXIsIHVzZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jaGF0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2NoYXQvVGVzdFJlbW90ZUNoYXRTZXJ2ZXIuamF2YSBiL2V4YW1wbGVzL2NoYXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvY2hhdC9UZXN0UmVtb3RlQ2hhdFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGFhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jaGF0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2NoYXQvVGVzdFJlbW90ZUNoYXRTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5jaGF0OworCisvLyBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsgCisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmNoYXQuQ2hhdC5GYWlsdXJlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdHMgUmVtb3RlQ2hhdFNlcnZlci4KKyAqLworcHVibGljIGNsYXNzIFRlc3RSZW1vdGVDaGF0U2VydmVyCit7CisJZmluYWwgU3RyaW5nIHVzZXIgPSAidXNlcjEiOworCWZpbmFsIFN0cmluZyBudWxsVXNlciA9IG51bGw7CisJZmluYWwgU3RyaW5nIGJhZFVzZXIgPSAiYmFkdXNlciI7CisJZmluYWwgU3RyaW5nIGJhZFBhc3MgPSAiYmFkUGFzcyI7IAorCVJlbW90ZUNoYXRTZXJ2ZXIgY3M7CisKKwkvKioKKwkgKiBTdGFydCByZW1vdGUgY2hhdCBsaXN0ZW5lcgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0UmVtb3RlQ2hhdExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiAKKwl7CisJCUxvZy5hZGRTaW5rKG51bGwpOworCQlMb2cucmVwb3J0KCJTdGFydFJlbW90ZUNoYXRMaXN0ZW5lciIpOworCQkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNSI7CisJCU1haW5DaGF0TGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkNoYXRMaXN0ZW5lcigpOyAKKwkJbGlzdGVuZXIgPSBDaGF0SGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsIGltcGxGYWN0b3J5ICk7CisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCQkKKwkJTG9nLnJlcG9ydCggIlN0YXJ0UmVtb3RlQ2hhdExpc3RlbmVyIiwKKwkJCSJzdGF0dXMiLCAidXAiLAorCQkJImxpc3RlbmVyIiwgbGlzdGVuZXIgKTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wUmVtb3RlQ2hhdExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCXsKKwkJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDAgKTsKKwkJCWxpc3RlbmVyID0gbnVsbDsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworCQorCS8qKgorCSAqIHRlc3RMb2dpbjE6IExvZ2luIHVzZXIKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExvZ2luMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CQkKKwkJTG9nLnJlcG9ydCgiVGVzdFJlbW90ZUNoYXRTZXJ2ZXIubG9naW46IHRlc3RMb2dpbjEgLSBMb2dpbiB1c2VyIik7CisJCWNzID0gc2V0dXBBbmRDb25uZWN0VXNlcih1c2VyKTsKKwkJY3MubG9naW4odXNlcix1c2VyKTsKKwl9CisJCisJLyoqCisJICogdGVzdExvZ2luMjogVXNlciBpcyBhbHJlYWR5IGxvZ2dlZCBpbgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QoZXhwZWN0ZWQgPSBGYWlsdXJlLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RMb2dpbjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCJUZXN0UmVtb3RlQ2hhdFNlcnZlci5sb2dpbjogdGVzdExvZ2luMiAtIExvZ2luIHVzZXIuIFVzZXIgaXMgYWxyZWFkeSBsb2dnZWQgaW4iKTsKKwkJY3MgPSBzZXR1cEFuZENvbm5lY3RVc2VyKHVzZXIpOworCQljcy5sb2dpbih1c2VyLHVzZXIpOworCQljcy5sb2dpbih1c2VyLHVzZXIpOworCX0KKwkKKwkvKioKKwkgKiB0ZXN0TG9naW4zOiBMb2dpbiAtIHVzZXIgaXMgbnVsbAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QoZXhwZWN0ZWQgPSBGYWlsdXJlLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RMb2dpbjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJewkJCisJCUxvZy5yZXBvcnQoIlRlc3RSZW1vdGVDaGF0U2VydmVyLmxvZ2luOiB0ZXN0TG9naW4zIC0gTG9naW4gdXNlci4gVXNlciBpcyBudWxsIik7CisJCWNzID0gc2V0dXBBbmRDb25uZWN0VXNlcihudWxsVXNlcik7CisJCWNzLmxvZ2luKG51bGxVc2VyLG51bGxVc2VyKTsKKwl9CisJCisJLyoqCisJICogdGVzdExvZ2luNDogTG9naW4gLSBiYWQgcGFzc3dvcmQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0KGV4cGVjdGVkID0gRmFpbHVyZS5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0TG9naW40KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsJCQorCQlMb2cucmVwb3J0KCJUZXN0UmVtb3RlQ2hhdFNlcnZlci5sb2dpbjogdGVzdExvZ2luNCAtIExvZ2luIHVzZXIuIEJhZCBwYXNzd29yZCIpOworCQljcyA9IHNldHVwQW5kQ29ubmVjdFVzZXIodXNlcik7CisJCWNzLmxvZ2luKHVzZXIsYmFkUGFzcyk7CisJfQorCQorCS8qKgorCSAqIHRlc3RMb2dpbjU6IExvZ2luIC0gYmFkIHVzZXJuYW1lCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdChleHBlY3RlZCA9IEZhaWx1cmUuY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdExvZ2luNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CQkKKwkJTG9nLnJlcG9ydCgiVGVzdFJlbW90ZUNoYXRTZXJ2ZXIubG9naW46IHRlc3RMb2dpbjUgLSBMb2dpbiB1c2VyLiBCYWQgdXNlcm5hbWUiKTsKKwkJY3MgPSBzZXR1cEFuZENvbm5lY3RVc2VyKHVzZXIpOworCQljcy5sb2dpbih1c2VyLGJhZFVzZXIpOworCX0KKwkKKwkvKioKKwkgKiBMb2dvdXQgb3V0IHVzZXIgYW5kIGNsb3NlIFRDUCBjb25lY3Rpb24KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlAQWZ0ZXIKKwlwdWJsaWMgdm9pZCBjbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChjcyAhPSBudWxsKQorCQl7CisJCQljcy5sb2dvdXQoKTsKKwkJCWNzLl9zdG9wKCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIHVzZXIKKwkgKiBAcmV0dXJuIGNoYXQgc2VydmVyCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgUmVtb3RlQ2hhdFNlcnZlciBzZXR1cEFuZENvbm5lY3RVc2VyIChmaW5hbCBTdHJpbmcgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNSI7CisJCQorLy8JCUNoYXRDbGllbnRJbXBsIGNsaWVudCA9IG5ldyBDaGF0Q2xpZW50SW1wbCh1c2VyLCBmYWxzZSk7CisJCVJlbW90ZUNoYXRTZXJ2ZXIgc2VydmVyID0gQ2hhdEhlbHBlci5uZXdTZXJ2ZXIoIHVyaSwgbnVsbCwKKwkJCW5ldyBDaGF0SGVscGVyLkNoYXRDbGllbnRGYWN0b3J5KCkKKwkJCXsKKwkJCQlwdWJsaWMgQ2hhdENsaWVudCBuZXdDaGF0Q2xpZW50KCBSZW1vdGVDaGF0U2VydmVyIHNlcnZlciApCisJCQkJCXRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCXJldHVybiBuZXcgSW1wbENoYXRDbGllbnQoIHNlcnZlciwgdXNlciwgZmFsc2UgKTsKKwkJCQl9CisJCQl9ICk7CisvLwkJY2xpZW50Ll9zZXRTZXJ2ZXIoc2VydmVyKTsKKwkKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCQkKKwkJcmV0dXJuIHNlcnZlcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9kaXN0bWFwL1JFQURNRS50eHQgYi9leGFtcGxlcy9kaXN0bWFwL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4ZTU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvUkVBRE1FLnR4dApAQCAtMCwwICsxLDI4IEBACitUbyBnZXQgc3RhcnRlZCB3aXRoIHRoZSBleGFtcGxlIHlvdSB3aWxsIG5lZWQgamRrIDEuNS4wX3gsCit3aGVyZSB4IGlzIHByZXR0eSByZWNlbnQgKD49IDE1KSwgb3IgYW55IHJlbGVhc2Ugb2YgamRrIDEuNi4KK1lvdSB3aWxsIGFsc28gbmVlZCBhbnQgMS43LjAsIHdpdGggYW50IC5uZXQgcGx1Z2luIGlmIHlvdQord2FudCB0byBidWlsZCBjc2hhcnAuIFlvdSB3aWxsIGFsc28gbmVlZCBtaWNyb3NvZnQgLm5ldAorc2RrIDIuMCBmb3IgY3NoYXJwIGJ1aWxkcy4KKworVG8gYnVpbGQ6CisKKz4gYW50CisKK1RoaXMgd2lsbCBydW4gdGhlIGRlZmF1bHQgdGFyZ2V0IHdoaWNoIHdpbGwgYnVpbGQgYm90aCBqYXZhCithbmQgY3NoYXJwIHByb2dyYW1zLiBZb3UgY2FuIGFsc28gdXNlIGJ1aWxkLWphdmEgb3IgYnVpbGQtY3NoYXJwCit0YXJnZXRzIHRvIGJ1aWxkIG9ubHkgamF2YSBvciBvbmx5IGNzaGFycC4KKworVG8gcnVuIGphdmEgZGlzdHJpYnV0ZWQgbWFwLCBvcGVuIGEgY21kIHdpbmRvdyBhbmQgcnVuIHRoZXNlCitjb21tYW5kczoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IGphdmEgLWNwIGRpc3RtYXAuamFyIGV0Y2guZXhhbXBsZXMuZGlzdG1hcC5NYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lcgorPiBzdGFydCBqYXZhIC1jcCBkaXN0bWFwLmphciBldGNoLmV4YW1wbGVzLmRpc3RtYXAuTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50CisKK1RvIHJ1biBjc2hhcnAgZGlzdHJpYnV0ZWQgbWFwOgorCis+IGNkIHRhcmdldFxiaW4KKz4gc3RhcnQgRGlzdE1hcExpc3RlbmVyLmV4ZQorPiBzdGFydCBEaXN0TWFwQ2xpZW50LmV4ZQorCitZb3UgY2FuIG1peCBhbmQgbWF0Y2ggdGhlIHZhcmlvdXMgY2xpZW50cyBhbmQgbGlzdGVuZXJzLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9idWlsZC54bWwgYi9leGFtcGxlcy9kaXN0bWFwL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThmY2JjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGlzdG1hcC9idWlsZC54bWwKQEAgLTAsMCArMSwzMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLWRpc3RtYXAtZXhhbXBsZSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCIgPgorICAgIDxkZXNjcmlwdGlvbj5EaXN0cmlidXRlZCBNYXAgRXhhbXBsZTwvZGVzY3JpcHRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYmFzZWRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4iIC8+CisgICAgPGltcG9ydCBmaWxlPSIke0V0Y2guYmFzZWRpcn0vYnVpbGQtc3VwcG9ydC9ldGNoLmluY2x1ZGVzLnhtbCIgLz4KKworICAgIDwhLS0gVE9ETyBiZXR0ZXIgY29tcHV0YXRpb24gb2YgZXRjaC5ob21lLCBldGNoLnZlcnNpb24gLS0+CisgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+CisKKyAgICA8IS0tIGNvbXB1dGUgRVRDSF9IT01FIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5FVENIX0hPTUUiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uL3RhcmdldC9JbnN0YWxsZXJzL2Rpc3QiIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZXRjaC5ob21lIiB2YWx1ZT0iJHtlbnYuRVRDSF9IT01FfSIgPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9IiR7ZW52LkVUQ0hfSE9NRX0iIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZXRjaC5ob21lIiB2YWx1ZT0iJHtidWlsZC5FVENIX0hPTUV9IiA+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJldGNoLmhvbWUiIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5kZXBlbmRlbmN5Lmp1bml0LmphciIKKyAgICAgICAgbG9jYXRpb249IiR7ZGVmYXVsdC5qdW5pdC5saWJ9L2p1bml0LTQuMy4xLmphciIgLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJ1aWxkU3VwcG9ydERpcmVjdG9yeSIgbG9jYXRpb249Ii4uLy4uL2J1aWxkLXN1cHBvcnQiIC8+CisKKyAgICA8IS0tIGNvbXB1dGUgZXRjaC52ZXJzaW9uIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImV0Y2gudmVyc2lvbiIgdmFsdWU9IiR7RXRjaC52ZXJzaW9ufSIgPgorICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0iZXRjaC52ZXJzaW9uIiAvPjwvbm90PgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPCEtLSBDc2hhcnAgU3VwcG9ydCAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJVU0UuZG90bmV0IiA+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIiAvPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Vudi53aW5kaXJ9L01pY3Jvc29mdC5ORVQvRnJhbWV3b3JrL3YyLjAuNTA3MjcvbXNidWlsZC5leGUiIC8+CisgICAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IlVTRS5tb25vIiA+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8bm90PjxvcyBmYW1pbHk9IndpbmRvd3MiIC8+PC9ub3Q+CisgICAgICAgICAgICA8IS0tIFRPRE8gbW9ubyBzdXBwb3J0IGlzIG5vdCBmdWxseSBiYWtlZCwgdXNlIC1EVVNFLm1vbm8gdG8gdGVzdCAtLT4KKyAgICAgICAgICAgIDwhLS0gPGF2YWlsYWJsZSBmaWxlPSIke2Vudi5NT05PX0hPTUV9L2Jpbi9tZHRvb2wiIC8+IC0tPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJVU0UubW9ubyIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iQlVJTEQuY3NoYXJwIiA+CisgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iVVNFLmRvdG5ldCIgLz4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iVVNFLm1vbm8iIC8+CisgICAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8IS0tIGltcG9ydCBldGNoIHRhc2sgLS0+CisgICAgPHRhc2tkZWYKKyAgICAgICAgb25lcnJvcj0icmVwb3J0IgorICAgICAgICByZXNvdXJjZT0ib3JnL2FwYWNoZS9ldGNoL3Rvb2xzL2FudC9ldGNoLnhtbCIKKyAgICAgICAgY2xhc3NwYXRoPSIke2V0Y2guaG9tZX0vbGliL2V0Y2gtYW50LXBsdWdpbi0ke2V0Y2gudmVyc2lvbn0uamFyIiAvPgorCisgICAgPCEtLSBpbXBvcnQgZG90bmV0IHRhc2sgLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYW50LmRvdG5ldC5qYXIiIHZhbHVlPSJhbnQtZG90bmV0LTEuMC5qYXIiID4KKyAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9ImFudC5kb3RuZXQuamFyIiAvPjwvbm90PgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPHRhc2tkZWYKKyAgICAgICAgb25lcnJvcj0icmVwb3J0IgorICAgICAgICByZXNvdXJjZT0ib3JnL2FwYWNoZS9hbnQvZG90bmV0L2FudGxpYi54bWwiCisgICAgICAgIGNsYXNzcGF0aD0iJHthbnQuZG90bmV0Lmphcn0iIC8+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0ibWR0b29sIiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiAgICAgICAgIGRlZmF1bHQ9Ii4iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIGRlZmF1bHQ9ImZhbHNlIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2plY3QiICAgICBkZWZhdWx0PSJwcm9qZWN0LmNzcHJvaiIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiICAgICAgZGVmYXVsdD0iJHtidWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7ZW52Lk1PTk9fSE9NRX0vYmluL21kdG9vbCIgZGlyPSJAe2Rpcn0iIGZhaWxvbmVycm9yPSJAe2ZhaWxvbmVycm9yfSIgPgorICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9ImJ1aWxkIiAvPgorICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tYnVpbGRmaWxlOkB7cHJvamVjdH0iIC8+CisgICAgICAgICAgICA8L2V4ZWM+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPCEtLSBzZXQgcHJvcGVydGllcyAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3NyYyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWFpbi1zcmMtamF2YSIgICAgIGxvY2F0aW9uPSIke3NyY30vbWFpbi9qYXZhIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LXNyYy1qYXZhIiAgICAgbG9jYXRpb249IiR7c3JjfS90ZXN0L2phdmEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS90YXJnZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRpc3Qtc3JjIiAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2Rpc3Qtc3JjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5lcmF0ZWQtc291cmNlcyIgbG9jYXRpb249IiR7dGFyZ2V0fS9nZW5lcmF0ZWQtc291cmNlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuLXNyYy1qYXZhIiAgICAgIGxvY2F0aW9uPSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvamF2YSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuLXNyYy1jc2hhcnAiICAgIGxvY2F0aW9uPSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvY3NoYXJwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW4iICAgICAgICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9iaW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMtdGVzdCIgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMtdGVzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC1yZXN1bHRzIiAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vdGVzdC1yZXN1bHRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJudW5pdC1yZXN1bHRzIiAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9udW5pdC1yZXN1bHRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0IiAgICAgICAgICAgICAgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4vdGFyZ2V0L0luc3RhbGxlcnMvZGlzdCIgLz4KKworICAgIDwhLS0gaW5pdGlhbGl6ZSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiID4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Rpc3Qtc3JjfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQtc291cmNlc30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW4tc3JjLWNzaGFycH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YmlufSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLXRlc3R9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QtcmVzdWx0c30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7bnVuaXQtcmVzdWx0c30iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIGJ1aWxkIHRoZSBzZXJ2ZXIgLS0+CisgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1zb3VyY2VzIiBkZXBlbmRzPSJpbml0IiA+CisgICAgICAgIDwhLS0gZ2VuZXJhdGUgc291cmNlcyAtLT4KKworICAgICAgICA8ZXRjaCBob21lPSIke2V0Y2guaG9tZX0iCisgICAgICAgICAgICAgIGZpbGU9IiR7c3JjfS9tYWluL2V0Y2gvRGlzdHJpYnV0ZWRIYXNoVGFibGUuZXRjaCIKKyAgICAgICAgICAgICAgYmluZGluZz0iamF2YSIKKyAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke2dlbi1zcmMtamF2YX0iIC8+CisKKyAgICAgICAgPGV0Y2ggaG9tZT0iJHtldGNoLmhvbWV9IgorICAgICAgICAgICAgICBmaWxlPSIke3NyY30vbWFpbi9ldGNoL0Rpc3RyaWJ1dGVkSGFzaFRhYmxlLmV0Y2giCisgICAgICAgICAgICAgIGJpbmRpbmc9ImNzaGFycCIKKyAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke2dlbi1zcmMtY3NoYXJwfSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtcnVudGltZS1uYW1lIgorICAgICAgICB2YWx1ZT0iZXRjaC1qYXZhLXJ1bnRpbWUtJHtldGNoLnZlcnNpb259LmphciIgLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmRlcGVuZGVuY3kuamF2YS5ydW50aW1lIgorICAgICAgICBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9IiAvPgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1qYXZhIiBkZXBlbmRzPSJnZW5lcmF0ZS1zb3VyY2VzIiA+CisgICAgICAgIDwhLS0gY29tcGlsZSBzb3VyY2VzIC0tPgorCisgICAgICAgIDxqYXZhYyB0YXJnZXQ9IjEuNSIgZGVzdGRpcj0iJHtjbGFzc2VzfSIgPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke2dlbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7bWFpbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuamF2YS5ydW50aW1lfSIgLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDxqYXZhYyB0YXJnZXQ9IjEuNSIgZGVzdGRpcj0iJHtjbGFzc2VzLXRlc3R9IiA+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7Z2VuLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHttYWluLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHt0ZXN0LXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qYXZhLnJ1bnRpbWV9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyfSIgLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDwhLS0gQ3JlYXRlIEphciAtLT4KKyAgICAgICAgPGphciBqYXJmaWxlPSIke2Jpbn0vZGlzdG1hcC5qYXIiID4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiIHZhbHVlPSIke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9IiAvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzfSIgPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvamFyPgorCisgICAgICAgIDwhLS0gY29weSBpbiBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Jpbn0iIGZpbGU9IiR7RXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycC13aXRoLW1vbm8iIGRlcGVuZHM9ImdlbmVyYXRlLXNvdXJjZXMiIGlmPSJVU0UubW9ubyIgPgorICAgICAgICA8bWR0b29sIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0Rpc3RNYXBDbGllbnRQcm9qIiBwcm9qZWN0PSJEaXN0TWFwQ2xpZW50UHJvai5jc3Byb2oiIC8+CisgICAgICAgIDxtZHRvb2wgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvRGlzdE1hcExpc3RlbmVyUHJvaiIgcHJvamVjdD0iRGlzdE1hcExpc3RlbmVyUHJvai5jc3Byb2oiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycC13aXRoLWRvdG5ldCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyIgaWY9IlVTRS5kb3RuZXQiID4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vbWFpbi9jc2hhcnAvRGlzdE1hcExpc3RlbmVyUHJvai9EaXN0TWFwTGlzdGVuZXJQcm9qLmNzcHJvaiIgPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDwvbXNidWlsZD4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vbWFpbi9jc2hhcnAvRGlzdE1hcENsaWVudFByb2ovRGlzdE1hcENsaWVudFByb2ouY3Nwcm9qIiA+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQ29uZmlndXJhdGlvbiIgdmFsdWU9IiR7YnVpbGQudGFyZ2V0fSIgLz4KKyAgICAgICAgPC9tc2J1aWxkPgorICAgICAgICA8bXNidWlsZCBidWlsZGZpbGU9IiR7c3JjfS90ZXN0L2NzaGFycC9EaXN0TWFwVGVzdFByb2ovRGlzdE1hcFRlc3RQcm9qLmNzcHJvaiIgPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDwvbXNidWlsZD4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YmlufSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvRGlzdE1hcExpc3RlbmVyUHJvai9iaW4vJHtidWlsZC50YXJnZXR9IiA+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0Rpc3RNYXBDbGllbnRQcm9qL2Jpbi8ke2J1aWxkLnRhcmdldH0iID4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycCIgZGVwZW5kcz0iYnVpbGQtY3NoYXJwLXdpdGgtbW9ubyxidWlsZC1jc2hhcnAtd2l0aC1kb3RuZXQiIC8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJidWlsZC1qYXZhLGJ1aWxkLWNzaGFycCIgLz4KKworICAgIDwhLS0gcnVuIHVuaXQgdGVzdHMgLS0+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtamF2YSIgZGVwZW5kcz0iYnVpbGQtamF2YSIgPgorICAgICAgICA8IS0tIFJ1biBVbml0IFRlc3RzIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIiBkaXI9IiR7Y2xhc3Nlcy10ZXN0fSIKKyAgICAgICAgICAgIGVycm9yUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiIGZhaWx1cmVQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCIgPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlcy10ZXN0fSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZX0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qdW5pdC5qYXJ9IiAvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIgLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0idHJ1ZSIgdG9kaXI9IiR7dGVzdC1yZXN1bHRzfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LXNyYy1qYXZhfSIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNzaGFycCIgZGVwZW5kcz0iYnVpbGQtY3NoYXJwIiBpZj0iQlVJTEQuY3NoYXJwIiA+CisgICAgICAgICA8bnVuaXQgeG1sb3V0PSIke251bml0LXJlc3VsdHN9L05Vbml0UmVzdWx0cy54bWwiPgorICAgICAgICAgICAgIDx0ZXN0YXNzZW1ibHkgbmFtZT0iJHtzcmN9L3Rlc3QvY3NoYXJwL0Rpc3RNYXBUZXN0UHJvai9iaW4vJHtidWlsZC50YXJnZXR9L0Rpc3RNYXBUZXN0UHJvai5kbGwiIC8+CisgICAgICAgICA8L251bml0PgorCisgICAgICAgICA8eHNsdCBzdHlsZT0iJHtFdGNoLmJ1aWxkU3VwcG9ydERpcmVjdG9yeX0vTlVuaXRUb0pVbml0LnhzbCIKKyAgICAgICAgICAgICAgICAgaW49IiR7bnVuaXQtcmVzdWx0c30vTlVuaXRSZXN1bHRzLnhtbCIgb3V0PSIke3Rlc3QtcmVzdWx0c30vVEVTVC1OVW5pdFJlc3VsdHMueG1sIiAvPgorICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImJ1aWxkLHRlc3QtamF2YSx0ZXN0LWNzaGFycCxkb25lIiA+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvbmUiIGRlcGVuZHM9ImJ1aWxkIiA+CisgICAgICAgIDxlY2hvPgorCitCdWlsZCBDb21wbGV0ZSEKKworVG8gcnVuIGphdmEgZGlzdHJpYnV0ZWQgbWFwLCBvcGVuIGEgY21kIHdpbmRvdyBhbmQgcnVuIHRoZXNlCitjb21tYW5kczoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IGphdmEgLWNwIGRpc3RtYXAuamFyIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwLk1haW5EaXN0cmlidXRlZEhhc2hUYWJsZUxpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGRpc3RtYXAuamFyIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwLk1haW5EaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudAorCitUbyBydW4gY3NoYXJwIGRpc3RyaWJ1dGVkIG1hcDoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IERpc3RNYXBMaXN0ZW5lci5leGUKKz4gc3RhcnQgRGlzdE1hcENsaWVudC5leGUKKworWW91IGNhbiBtaXggYW5kIG1hdGNoIHRoZSB2YXJpb3VzIGNsaWVudHMgYW5kIGxpc3RlbmVycy4KKworICAgICAgICA8L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIGJ1aWxkIGV2ZXJ5dGhpbmcgLS0+CisgICAgPHRhcmdldCBuYW1lPSJpbml0LWRlYnVnIiA+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50YXJnZXQiIHZhbHVlPSJEZWJ1ZyIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1yZWxlYXNlIiA+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50YXJnZXQiIHZhbHVlPSJSZWxlYXNlIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgIDx0YXJnZXQgbmFtZT0iZGlzdC1zcmMiID4KKyAgICAgICAgIDxjb3B5IGZpbGU9ImRpc3QtYnVpbGQueG1sIiB0b2ZpbGU9IiR7ZGlzdC1zcmN9L2J1aWxkLnhtbCIgb3ZlcndyaXRlPSJ0cnVlIiA+CisgICAgICAgICAgICAgPGZpbHRlcnNldCByZWZpZD0iRXRjaC5idWlsZFRva2VucyIgLz4KKyAgICAgICAgIDwvY29weT4KKyAgICAgICAgPGNvcHkgZmlsZT0iUkVBRE1FLnR4dCIgdG9maWxlPSIke2Rpc3Qtc3JjfS9SRUFETUUudHh0IiBvdmVyd3JpdGU9InRydWUiIC8+CisgICAgICAgIAorICAgICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LXNyY30vc3JjL21haW4vZXRjaCIgb3ZlcndyaXRlPSJ0cnVlIiA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2V0Y2giID4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZXRjaCIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICAKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC1zcmN9L3NyYy9tYWluL2phdmEiIG92ZXJ3cml0ZT0idHJ1ZSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9qYXZhIiA+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgCisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Rpc3Qtc3JjfS9zcmMvbWFpbi9jc2hhcnAiIG92ZXJ3cml0ZT0idHJ1ZSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAiID4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY3MiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgCisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Rpc3R9L2V4YW1wbGVzL2Rpc3RtYXAiIG92ZXJ3cml0ZT0idHJ1ZSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3Qtc3JjfSIgLz4KKyAgICAgICAgPC9jb3B5PgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZGVidWciIGRlcGVuZHM9ImRpc3Qtc3JjLGluaXQtZGVidWcsdGVzdCIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9ImRpc3Qtc3JjLGluaXQtcmVsZWFzZSx0ZXN0IiAvPgorCisgICAgPCEtLSBjbGVhbiAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiA+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0Rpc3RNYXBDbGllbnRQcm9qL2JpbiIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvRGlzdE1hcENsaWVudFByb2ovb2JqIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3JjfS9tYWluL2NzaGFycC9EaXN0TWFwTGlzdGVuZXJQcm9qL2JpbiIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvRGlzdE1hcExpc3RlbmVyUHJvai9vYmoiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwL0Rpc3RNYXBUZXN0UHJvai9iaW4iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwL0Rpc3RNYXBUZXN0UHJvai9vYmoiIHF1aWV0PSJ0cnVlIiAvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9kaXN0LWJ1aWxkLnhtbCBiL2V4YW1wbGVzL2Rpc3RtYXAvZGlzdC1idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2NzA4OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvZGlzdC1idWlsZC54bWwKQEAgLTAsMCArMSwxNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtZGlzdG1hcC1leGFtcGxlIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJidWlsZCI+CisgICAgPGRlc2NyaXB0aW9uPkRpc3RyaWJ1dGVkIE1hcCBFeGFtcGxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLmhvbWUiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gudmVyc2lvbiIgdmFsdWU9IkBFdGNoVmVyc2lvbkAiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC1qYXZhLXJ1bnRpbWUtbmFtZSIgdmFsdWU9ImV0Y2gtamF2YS1ydW50aW1lLSR7ZXRjaC52ZXJzaW9ufS5qYXIiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWFudC1wbHVnaW4uamFyIiAgIGxvY2F0aW9uPSIke2V0Y2guaG9tZX0vbGliL2V0Y2gtYW50LXBsdWdpbi0ke2V0Y2gudmVyc2lvbn0uamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtamF2YS1ydW50aW1lLmphciIgbG9jYXRpb249IiR7ZXRjaC5ob21lfS9saWIvJHtldGNoLWphdmEtcnVudGltZS1uYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLmRsbCIgICAgICAgICAgICAgIGxvY2F0aW9uPSIke2V0Y2guaG9tZX0vbGliL0V0Y2guZGxsIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMtbWFpbi1ldGNoIiAgICAgbG9jYXRpb249IiR7c3JjfS9tYWluL2V0Y2giLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLW1haW4tamF2YSIgICAgIGxvY2F0aW9uPSIke3NyY30vbWFpbi9qYXZhIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYy1tYWluLWNzaGFycCIgICBsb2NhdGlvbj0iJHtzcmN9L21haW4vY3NoYXJwIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS90YXJnZXQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkLXNvdXJjZXMiIGxvY2F0aW9uPSIke3RhcmdldH0vZ2VuZXJhdGVkLXNvdXJjZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2Vuc3JjLW1haW4tZXRjaC1qYXZhIiBsb2NhdGlvbj0iJHtnZW5lcmF0ZWQtc291cmNlc30vbWFpbi9ldGNoL2phdmEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2Vuc3JjLW1haW4tZXRjaC1jc2hhcnAiIGxvY2F0aW9uPSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvY3NoYXJwIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYmluIiAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vYmluIi8+CisgICAgCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iQlVJTEQuY3NoYXJwIiA+CisgICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiIC8+CisgICAgPC9jb25kaXRpb24+ICAgIAorCisgICAgPHRhc2tkZWYKKyAgICAgICAgcmVzb3VyY2U9Im9yZy9hcGFjaGUvZXRjaC90b29scy9hbnQvZXRjaC54bWwiCisgICAgICAgIGNsYXNzcGF0aD0iJHtldGNoLWFudC1wbHVnaW4uamFyfSIvPgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iYnVpbGQtamF2YSwgYnVpbGQtY3NoYXJwLCBkb25lIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWphdmEiIGRlcGVuZHM9ImdlbnNyYy1qYXZhIj4KKyAgICAgICAgPGphdmFjIGRlc3RkaXI9IiR7Y2xhc3Nlc30iIHNvdXJjZT0iMS41IiBkZWJ1Zz0idHJ1ZSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtldGNoLWphdmEtcnVudGltZS5qYXJ9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmMtbWFpbi1qYXZhfSIvPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke2dlbnNyYy1tYWluLWV0Y2gtamF2YX0iLz4KKyAgICAgICAgPC9qYXZhYz4KKworICAgICAgICA8amFyIGphcmZpbGU9IiR7YmlufS9kaXN0bWFwLmphciI+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iJHtldGNoLWphdmEtcnVudGltZS1uYW1lfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzfSIvPgorICAgICAgICA8L2phcj4KKworICAgICAgICA8Y29weSB0b2Rpcj0iJHtiaW59IiBmaWxlPSIke2V0Y2gtamF2YS1ydW50aW1lLmphcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG9uZSI+CisgICAgICAgIDxlY2hvPgorCitUbyBydW4gamF2YSBkaXN0cmlidXRlZCBtYXAsIG9wZW4gYSBjbWQgd2luZG93IGFuZCBydW4gdGhlc2UKK2NvbW1hbmRzOgorCis+IGNkIHRhcmdldFxiaW4KKz4gc3RhcnQgamF2YSAtY3AgZGlzdG1hcC5qYXIgZXRjaC5leGFtcGxlcy5kaXN0bWFwLk1haW5EaXN0cmlidXRlZEhhc2hUYWJsZUxpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGRpc3RtYXAuamFyIGV0Y2guZXhhbXBsZXMuZGlzdG1hcC5NYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQKKworVG8gcnVuIGNzaGFycCBkaXN0cmlidXRlZCBtYXA6CisKKz4gY2QgdGFyZ2V0XGJpbgorPiBzdGFydCBEaXN0TWFwTGlzdGVuZXIuZXhlCis+IHN0YXJ0IERpc3RNYXBDbGllbnQuZXhlCisKK1lvdSBjYW4gbWl4IGFuZCBtYXRjaCB0aGUgdmFyaW91cyBjbGllbnRzIGFuZCBsaXN0ZW5lcnMuCisKKyAgICAgICAgPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1jc2hhcnAiIGRlcGVuZHM9ImdlbnNyYy1jc2hhcnAiIGlmPSJCVUlMRC5jc2hhcnAiID4KKyAgICAgICAgPGNzYworICAgICAgICAgICAgICAgIGRlYnVnPSJ0cnVlIgorICAgICAgICAgICAgICAgIHdhcm5MZXZlbD0iMSIKKyAgICAgICAgICAgICAgICB1bnNhZmU9ImZhbHNlIgorICAgICAgICAgICAgICAgIHRhcmdldFR5cGU9ImV4ZSIKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbD0iZmFsc2UiCisgICAgICAgICAgICAgICAgbWFpbkNsYXNzID0gImV0Y2guZXhhbXBsZXMuZGlzdG1hcC5NYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQiCisgICAgICAgICAgICAgICAgZGVzdEZpbGU9IiR7YmlufS9EaXN0TWFwQ2xpZW50LmV4ZSI+CisgICAgICAgICAgICA8c3JjIGRpcj0iJHtzcmMtbWFpbi1jc2hhcnB9L0Rpc3RNYXBDbGllbnRQcm9qIiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7c3JjLW1haW4tY3NoYXJwfS9ldGNoLmV4YW1wbGVzLmRpc3RtYXAiIGluY2x1ZGVzPSIqKi8qLmNzIi8+CisgICAgICAgICAgICA8c3JjIGRpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWNzaGFycH0iIGluY2x1ZGVzPSIqKi8qLmNzIi8+CisgICAgICAgICAgICA8cmVmZXJlbmNlIGZpbGU9IiR7ZXRjaC5kbGx9Ii8+CisgICAgICAgIDwvY3NjPgorCisgICAgICAgIDxjc2MKKyAgICAgICAgICAgICAgICBkZWJ1Zz0idHJ1ZSIKKyAgICAgICAgICAgICAgICB3YXJuTGV2ZWw9IjEiCisgICAgICAgICAgICAgICAgdW5zYWZlPSJmYWxzZSIKKyAgICAgICAgICAgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICAgICAgICAgICAgaW5jcmVtZW50YWw9ImZhbHNlIgorICAgICAgICAgICAgICAgIG1haW5DbGFzcyA9ICJldGNoLmV4YW1wbGVzLmRpc3RtYXAuTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIiCisgICAgICAgICAgICAgICAgZGVzdEZpbGU9IiR7YmlufS9EaXN0TWFwTGlzdGVuZXIuZXhlIj4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vRGlzdE1hcExpc3RlbmVyUHJvaiIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vZXRjaC5leGFtcGxlcy5kaXN0bWFwIiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9IiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHJlZmVyZW5jZSBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgICAgICA8L2NzYz4KKworICAgICAgICA8Y29weSB0b2Rpcj0iJHtiaW59IiBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJnZW5zcmMiIGRlcGVuZHM9ImdlbnNyYy1qYXZhLCBnZW5zcmMtY3NoYXJwIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbnNyYy1qYXZhIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGV0Y2gKKyAgICAgICAgICAgIGhvbWU9IiR7ZXRjaC5ob21lfSIKKyAgICAgICAgICAgIGJpbmRpbmc9ImphdmEiCisgICAgICAgICAgICBxdWlldD0idHJ1ZSIKKyAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWphdmF9IgorICAgICAgICAgICAgZmlsZT0iJHtzcmMtbWFpbi1ldGNofS9EaXN0cmlidXRlZEhhc2hUYWJsZS5ldGNoIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbnNyYy1jc2hhcnAiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8ZXRjaAorICAgICAgICAgICAgaG9tZT0iJHtldGNoLmhvbWV9IgorICAgICAgICAgICAgYmluZGluZz0iY3NoYXJwIgorICAgICAgICAgICAgcXVpZXQ9InRydWUiCisgICAgICAgICAgICBvdXRwdXREaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9IgorICAgICAgICAgICAgZmlsZT0iJHtzcmMtbWFpbi1ldGNofS9EaXN0cmlidXRlZEhhc2hUYWJsZS5ldGNoIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQtc291cmNlc30iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWphdmF9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc30iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtiaW59Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvRGlzdE1hcENsaWVudFByb2ovRGlzdE1hcENsaWVudFByb2ouY3Nwcm9qIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvRGlzdE1hcENsaWVudFByb2ovRGlzdE1hcENsaWVudFByb2ouY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTJmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9EaXN0TWFwQ2xpZW50UHJvai9EaXN0TWFwQ2xpZW50UHJvai5jc3Byb2oKQEAgLTAsMCArMSwxMTIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjUwNzI3PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns3NjEzOTYxQi1GRDgyLTQwREItQkY5OS1FRUY1MEJCMjA4ODd9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPmV0Y2guZXhhbXBsZXMuZGlzdG1hcDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkRpc3RNYXBDbGllbnQ8L0Fzc2VtYmx5TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcQmFzZURpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkJhc2VEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcQmFzZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkJhc2VEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcRGlzdHJpYnV0ZWRIYXNoVGFibGUuY3MiPgorICAgICAgPExpbms+RGlzdHJpYnV0ZWRIYXNoVGFibGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxEaXN0cmlidXRlZEhhc2hUYWJsZUhlbHBlci5jcyI+CisgICAgICA8TGluaz5EaXN0cmlidXRlZEhhc2hUYWJsZUhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+RGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+UmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZS5jcyI+CisgICAgICA8TGluaz5TdHViRGlzdHJpYnV0ZWRIYXNoVGFibGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5TdHViRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5TdHViRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFZhbHVlRmFjdG9yeURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzIj4KKyAgICAgIDxMaW5rPlZhbHVlRmFjdG9yeURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLmRpc3RtYXBcSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkltcGxEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC5leGFtcGxlcy5kaXN0bWFwXE1haW5EaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5NYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlwuLlwuLlxiaW5kaW5nLWNzaGFycFxydW50aW1lXHNyY1xtYWluXGNzaGFycFxFdGNoUHJvai5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn08L1Byb2plY3Q+CisgICAgICA8TmFtZT5FdGNoUHJvajwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvRGlzdE1hcENsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9EaXN0TWFwQ2xpZW50UHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2VhOTYyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvRGlzdE1hcENsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorLy8gdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRGlzdE1hcCBDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiRGlzdE1hcCBDbGllbnQgRXhlY3V0YWJsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkNpc2NvIFN5c3RlbXMiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJFdGNoIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgqSAyMDA4IildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCIzZGM5OTNmMi03MmJkLTQ0MzktYTE2NC1lNGZjYTg0YWQ3MGUiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbiAKKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuMC4wLjEiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC4wLjAuMSIpXQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvRGlzdE1hcExpc3RlbmVyUHJvai9EaXN0TWFwTGlzdGVuZXJQcm9qLmNzcHJvaiBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vY3NoYXJwL0Rpc3RNYXBMaXN0ZW5lclByb2ovRGlzdE1hcExpc3RlbmVyUHJvai5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxZjMyOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vY3NoYXJwL0Rpc3RNYXBMaXN0ZW5lclByb2ovRGlzdE1hcExpc3RlbmVyUHJvai5jc3Byb2oKQEAgLTAsMCArMSwxMTIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjUwNzI3PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns3NUY4QTUxMy00NTAwLTRBQzMtOEU5Ny04Qjc2MDlBOEFFQTl9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPmV0Y2guZXhhbXBsZXMuZGlzdG1hcDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkRpc3RNYXBMaXN0ZW5lcjwvQXNzZW1ibHlOYW1lPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxCYXNlRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3MiPgorICAgICAgPExpbms+QmFzZURpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxCYXNlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+QmFzZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxEaXN0cmlidXRlZEhhc2hUYWJsZS5jcyI+CisgICAgICA8TGluaz5EaXN0cmlidXRlZEhhc2hUYWJsZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3MiPgorICAgICAgPExpbms+RGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXERpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPkRpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5EaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGUuY3MiPgorICAgICAgPExpbms+UmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5SZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcU3R1YkRpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcU3R1YkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcU3R1YkRpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcVmFsdWVGYWN0b3J5RGlzdHJpYnV0ZWRIYXNoVGFibGUuY3MiPgorICAgICAgPExpbms+VmFsdWVGYWN0b3J5RGlzdHJpYnV0ZWRIYXNoVGFibGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2guZXhhbXBsZXMuZGlzdG1hcFxJbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+SW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLmRpc3RtYXBcTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+TWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlwuLlwuLlxiaW5kaW5nLWNzaGFycFxydW50aW1lXHNyY1xtYWluXGNzaGFycFxFdGNoUHJvai5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn08L1Byb2plY3Q+CisgICAgICA8TmFtZT5FdGNoUHJvajwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvRGlzdE1hcExpc3RlbmVyUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vY3NoYXJwL0Rpc3RNYXBMaXN0ZW5lclByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0NjNjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vY3NoYXJwL0Rpc3RNYXBMaXN0ZW5lclByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorLy8gdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRGlzdE1hcCBMaXN0ZW5lciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJEaXN0TWFwIExpc3RlbmVyIEV4ZWN1dGFibGUiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJDaXNjbyBTeXN0ZW1zIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiRXRjaCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiNzExNjdiYzMtMjIwZi00OTE1LWI3MDktNzA4Y2Y1OWU3ZDk5IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuZGlzdG1hcC9JbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3MgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmRpc3RtYXAvSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2M2Q4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmRpc3RtYXAvSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzCkBAIC0wLDAgKzEsNDAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcAoreworCS8vLzxzdW1tYXJ5PkltcGxlbWVudGF0aW9uIGZvciBJbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQ8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudCA6IEJhc2VEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudAorCXsKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC48L3N1bW1hcnk+CisgCQkvLy8gPHBhcmFtIG5hbWU9InNlcnZlciI+YSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8KKyAJCS8vLyBzZW5kIGEgbWVzc2FnZSB0byB0aGUgc2VydmVyLjwvcGFyYW0+CisJCXB1YmxpYyBJbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQoUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIgc2VydmVyKQorCQl7CisJCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJfQorCQkKKwkJLy8vIDxzdW1tYXJ5PkEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHNlc3Npb24uIFVzZSB0aGlzIHRvCisgCQkvLy8gc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci48L3N1bW1hcnk+CisJCXByaXZhdGUgcmVhZG9ubHkgUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIgc2VydmVyOworCQorCQkvLyBUT0RPOiBJbXBsZW1lbnQgZGVsZWdhdGVzIG9yIHByb3ZpZGUgaW1wbGVtZW50YXRpb24gb2YgRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQKKwkJLy8gbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyCQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmRpc3RtYXAvSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmNzIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5kaXN0bWFwL0ltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGVmOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5kaXN0bWFwL0ltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jcwpAQCAtMCwwICsxLDEwNyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcC50eXBlcy5EaXN0cmlidXRlZEhhc2hUYWJsZTsKKworbmFtZXNwYWNlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwCit7CisgICAgLy8vPHN1bW1hcnk+SW1wbGVtZW50YXRpb24gZm9yIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlcjwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyIDogQmFzZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnQiPmEgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IHNlc3Npb24uIFVzZSB0aGlzIHRvCisgICAgICAgIC8vLyBzZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWFwIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyKFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50IGNsaWVudCwgSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tYXAgPSBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIElEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiBtYXA7CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIGFsbCBlbGVtZW50cyBpbiBESFQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkFuIGFycmF5IG9mIGVudHJpZXM8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBFbnRyeVtdIGdldEFsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKG1hcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbnRyeVtdIGxpc3QgPSBuZXcgRW50cnlbbWFwLkNvdW50XTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBzdHIgaW4gbWFwLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaXN0W2luZGV4KytdID0gbmV3IEVudHJ5KHN0ciwgbWFwW3N0cl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIGFuIG9iamVjdCBmcm9tIERIVAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBnZXRPYmplY3Qoc3RyaW5nIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IHZhbHVlOworICAgICAgICAgICAgaWYgKCFtYXAuVHJ5R2V0VmFsdWUoa2V5LCBvdXQgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgezB9IG5vdCBmb3VuZCBpbiBESFQgIiwga2V5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHV0cyBvYmplY3QgaW4gTWFwCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHB1dE9iamVjdChzdHJpbmcga2V5LCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hcC5BZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgT2JqZWN0IGZyb20gREhUCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IHJlbW92ZU9iamVjdChzdHJpbmcga2V5KQorICAgICAgICB7CisgICAgICAgICAgICBtYXAuUmVtb3ZlKGtleSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIFNpemUgb2YgREhUCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQ/IHNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWFwLkNvdW50OworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuZGlzdG1hcC9NYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3MgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmRpc3RtYXAvTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWYxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmRpc3RtYXAvTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTYxIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcC50eXBlcy5EaXN0cmlidXRlZEhhc2hUYWJsZTsKKworbmFtZXNwYWNlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwCit7CisgICAgLy8vPHN1bW1hcnk+TWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQgOiBEaXN0cmlidXRlZEhhc2hUYWJsZUhlbHBlci5EaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8vLzxzdW1tYXJ5Pk1haW4gZm9yIERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50PC9zdW1tYXJ5PgorICAgICAgICAvLy88cGFyYW0gbmFtZT0iYXJncyI+Q29tbWFuZCBMaW5lIEFyZ3VtZW50czwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE86IENoYW5nZSB0byBjb3JyZWN0IFVSSQorICAgICAgICAgICAgc3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNyI7CisKKyAgICAgICAgICAgIFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyIHNlcnZlciA9IERpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLk5ld1NlcnZlcih1cmksIG51bGwsIG5ldyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQoKSk7CisKKyAgICAgICAgICAgIC8vIENvbm5lY3QgdG8gdGhlIHNlcnZpY2UKKyAgICAgICAgICAgIHNlcnZlci5fU3RhcnRBbmRXYWl0VXAoNDAwMCk7CisKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgbXlCb29sMSA9IHRydWU7CisgICAgICAgICAgICBjb25zdCBzYnl0ZSBteUJ5dGUxID0gMTsKKyAgICAgICAgICAgIGNvbnN0IHNob3J0IG15U2hvcnQxID0gMjM0OworICAgICAgICAgICAgY29uc3QgaW50IG15SW50MSA9IDM0NTM0NTsKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbXlMb25nMSA9IDQ1NjQ1NjQ1NjQ1Nkw7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBteUZsb2F0MSA9IDEuMjM0ZjsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBteURvdWJsZTEgPSAyLjM0NTsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBteVN0cmluZzEgPSAiYWJjIjsKKworICAgICAgICAgICAgb2JqZWN0IG15T2JqOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiREhUIHNpeGUgaXMgIiArIHNlcnZlci5zaXplKCkpOworCisgICAgICAgICAgICAvLyBnZXRBbGwgLSBESFQgaXMgZW1wdHkKKyAgICAgICAgICAgIGZvcmVhY2ggKEVudHJ5IGVudHJ5IGluIHNlcnZlci5nZXRBbGwoKSkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZ2V0QWxsOiB7MH0sezF9ICIsIGVudHJ5LmtleSwgZW50cnkudmFsdWUpOworCisgICAgICAgICAgICAvLyBwdXRPYmplY3QgZm9yIGVhY2ggY29uc3RhbnQgdHlwZQorICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgiYm9vbGVhbjEiLCBteUJvb2wxKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQdXQgezB9IGluIERIVCIsIG15Qm9vbDEpOworCisgICAgICAgICAgICBzZXJ2ZXIucHV0T2JqZWN0KCJieXRlMSIsIG15Qnl0ZTEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlB1dCB7MH0gaW4gREhUIiwgbXlCeXRlMSk7CisKKworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgic2hvcnQxIiwgbXlTaG9ydDEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlB1dCB7MH0gaW4gREhUIiwgbXlTaG9ydDEpOworCisgICAgICAgICAgICBzZXJ2ZXIucHV0T2JqZWN0KCJpbnQxIiwgbXlJbnQxKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQdXQgezB9IGluIERIVCIsIG15SW50MSk7CisKKyAgICAgICAgICAgIHNlcnZlci5wdXRPYmplY3QoImxvbmcxIiwgbXlMb25nMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUHV0IHswfSBpbiBESFQiLCBteUxvbmcxKTsKKworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgiZmxvYXQxIiwgbXlGbG9hdDEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlB1dCB7MH0gaW4gREhUIiwgbXlGbG9hdDEpOworCisgICAgICAgICAgICBzZXJ2ZXIucHV0T2JqZWN0KCJkb3VibGUxIiwgbXlEb3VibGUxKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQdXQgezB9IGluIERIVCIsIG15RG91YmxlMSk7CisKKyAgICAgICAgICAgIHNlcnZlci5wdXRPYmplY3QoInN0cmluZzEiLCBteVN0cmluZzEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlB1dCB7MH0gaW4gREhUIiwgbXlTdHJpbmcxKTsKKworICAgICAgICAgICAgLy8gc2l6ZSAtIERIVCBoYXMgZW50cmllcworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkRIVCBTaXplIGlzIHswfSAiLCBzZXJ2ZXIuc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gZ2V0QWxsIC0gREhUIGhhcyBlbnRyaWVzCisgICAgICAgICAgICBmb3JlYWNoIChFbnRyeSBlbnRyeSBpbiBzZXJ2ZXIuZ2V0QWxsKCkpCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImdldEFsbDogezB9IHsxfSAiLCBlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTsKKworICAgICAgICAgICAgLy8gZ2V0T2JqZWN0IGZvciBlYWNoIGNvbnN0YW50IHR5cGUKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiYm9vbGVhbjEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJWYWx1ZSBvZiBteUJvb2wxIGlzIHswfSAiLCBteU9iaik7CisKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiYnl0ZTEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJWYWx1ZSBvZiBteUJ5dGUxIGlzIHswfSAiLCBteU9iaik7CisKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgic2hvcnQxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVmFsdWUgb2YgbXlTaG9ydDEgaXMgezB9ICIsIG15T2JqKTsKKworICAgICAgICAgICAgbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJpbnQxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVmFsdWUgb2YgbXlJbnQxIGlzIHswfSAiLCBteU9iaik7CisKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgibG9uZzEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJWYWx1ZSBvZiBteUxvbmcxIGlzIHswfSAiLCBteU9iaik7CisKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiZmxvYXQxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVmFsdWUgb2YgbXlGbG9hdDEgaXMgezB9ICIsIG15T2JqKTsKKworICAgICAgICAgICAgbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJkb3VibGUxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVmFsdWUgb2YgbXlEb3VibGUxIGlzIHswfSAiLCBteU9iaik7CisKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgic3RyaW5nMSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlZhbHVlIG9mIG15U3RyaW5nMSBpcyB7MH0gIiwgbXlPYmopOworCisgICAgICAgICAgICAvLyByZW1vdmVPYmplY3QgZm9yIGVhY2ggY29uc3RhbnQgdHlwZQorICAgICAgICAgICAgc2VydmVyLnJlbW92ZU9iamVjdCgiYm9vbGVhbjEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJyZW1vdmluZyBPYmplY3QgYm9vbGVhbjEgIik7CisKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoImJ5dGUxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicmVtb3ZpbmcgT2JqZWN0IGJ5dGUxICIpOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJzaG9ydDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJyZW1vdmluZyBPYmplY3Qgc2hvcnQxICIpOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJpbnQxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicmVtb3ZpbmcgT2JqZWN0IGludDEgIik7CisKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoImxvbmcxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicmVtb3ZpbmcgT2JqZWN0IGxvbmcxICIpOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJmbG9hdDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJyZW1vdmluZyBPYmplY3QgZmxvYXQxICIpOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJkb3VibGUxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicmVtb3ZpbmcgT2JqZWN0IGRvdWJsZTEgIik7CisKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoInN0cmluZzEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJyZW1vdmluZyBPYmplY3Qgc3RyaW5nMSAiKTsKKworICAgICAgICAgICAgLy8gc2l6ZSAtIFZlcmlmeSB0aGF0IERIVCBpcyBlbXB0eSBhZnRlciByZW1vdmluZyBhbGwgaXRlbXMKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJESFQgU2l6ZSBpcyB7MH0iLCBzZXJ2ZXIuc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gZ2V0QWxsIC0gVmVyaWZ5IHRoYXQgREhUIGlzIGVtcHR5IGFmdGVyIHJlbW92aW5nIGFsbCBpdGVtcworICAgICAgICAgICAgZm9yZWFjaCAoRW50cnkgZW50cnkgaW4gc2VydmVyLmdldEFsbCgpKQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJnZXRBbGw6IHswfSB7MX0gIiwgZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJIYXZlIGEgbmljZSBkYXkhIik7CisKKyAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmljZQorICAgICAgICAgICAgc2VydmVyLl9TdG9wQW5kV2FpdERvd24oNDAwMCk7CisgICAgICAgIH0KKworICAgICAgICAvLy88c3VtbWFyeT5SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuPC9zdW1tYXJ5PgorICAgICAgICAvLy88cGFyYW0gbmFtZT0ic2VydmVyIj5SZWZlcmVuY2UgdG8gcmVtb3RlIHNlcnZpY2U8L3BhcmFtPgorICAgICAgICAvLy88cmV0dXJucz5DbGllbnQgSW1wbGVtZW50YXRpb248L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudCBOZXdEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudChSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlciBzZXJ2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50KHNlcnZlcik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5kaXN0bWFwL01haW5EaXN0cmlidXRlZEhhc2hUYWJsZUxpc3RlbmVyLmNzIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5kaXN0bWFwL01haW5EaXN0cmlidXRlZEhhc2hUYWJsZUxpc3RlbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZmNkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmRpc3RtYXAvTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuY3MKQEAgLTAsMCArMSw1NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcAoreworCS8vLzxzdW1tYXJ5Pk1haW4gaW1wbGVtZW50YXRpb24gZm9yIERpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lciA6IERpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLkRpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyRmFjdG9yeQorCXsKKyAJCS8vLzxzdW1tYXJ5Pk1haW4gZm9yIERpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuPC9zdW1tYXJ5PgorCQkvLy88cGFyYW0gbmFtZT0iYXJncyI+Q29tbWFuZCBMaW5lIEFyZ3VtZW50czwvcGFyYW0+CisJCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisJCXsKKwkJCS8vIFRPRE86IENoYW5nZSB0byBjb3JyZWN0IFVSSQorCQkJc3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNyI7CisKKyAgICAgICAgICAgIFNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBEaXN0cmlidXRlZEhhc2hUYWJsZUhlbHBlci5OZXdMaXN0ZW5lcih1cmksIG51bGwsIG5ldyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lcigpKTsKKwkJCQorCQkJLy8gU3RhcnQgdGhlIExpc3RlbmVyCisJCQlsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxpc3RlbmVyIFN0YXJ0ZWQgISEhIik7CisJCX0KKworICAgICAgICBwcml2YXRlIElEaWN0aW9uYXJ5PHN0cmluZyAsb2JqZWN0ID4gbWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KCk7CisKKwkJLy8vPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLjwvc3VtbWFyeT4KKwkJLy8vPHBhcmFtIG5hbWU9ImNsaWVudCI+UmVmZXJlbmNlIHRvIHJlbW90ZSBzZXJ2aWNlPC9wYXJhbT4KKwkJLy8vPHJldHVybnM+U2VydmVyIEltcGxlbWVudGF0aW9uPC9yZXR1cm5zPgorCQlwdWJsaWMgRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIgTmV3RGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIoIFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50IGNsaWVudCApCisJCXsKKwkJCXJldHVybiBuZXcgSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyKCBjbGllbnQsbWFwICk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9ldGNoL0Rpc3RyaWJ1dGVkSGFzaFRhYmxlLmV0Y2ggYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2V0Y2gvRGlzdHJpYnV0ZWRIYXNoVGFibGUuZXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmEyNDhhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9ldGNoL0Rpc3RyaWJ1dGVkSGFzaFRhYmxlLmV0Y2gKQEAgLTAsMCArMSw3MSBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcAorCisvKioKKyAqIFRoZSBEaXN0cmlidXRlZEhhc2hUYWJsZSBleGFtcGxlIHByb2dyYW0gaW1wbGVtZW50cyBhIHNpbXBsZSBzZXJ2aWNlCisgKiBmb3IgbW9kaWZ5aW5nIGEgZGlzdHJpYnV0ZWQgaGFzaCB0YWJsZS4KKyAqLworc2VydmljZSBEaXN0cmlidXRlZEhhc2hUYWJsZQoreworCS8qKgorCSAqIFB1dHMgYSB2YWx1ZSBpbiB0aGUgaGFzaCB0YWJsZS4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIHZhbHVlLgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGtleS4KKwkgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUgb2YgdGhlIGtleSwgb3IgbnVsbCBpZiB0aGlzIGlzIGEgbmV3IGVudHJ5LgorCSAqLworCW9iamVjdCBwdXRPYmplY3Qoc3RyaW5nIGtleSwgb2JqZWN0IHZhbHVlKQorCisJLyoqCisJICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIGhhc2ggdGFibGUuCisJICoKKwkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgZm9yIHRoZSB2YWx1ZS4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUga2V5LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGUga2V5LgorCSAqLworCW9iamVjdCBnZXRPYmplY3Qoc3RyaW5nIGtleSkKKwkKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB2YWx1ZSBmcm9tIHRoZSBoYXNoIHRhYmxlLgorCSAqCisJICogQHBhcmFtIGtleSB0aGUga2V5IGZvciB0aGUgdmFsdWUuCisJICogQHJldHVybiB0aGUgb2xkIHZhbHVlIG9mIHRoZSBrZXksIG9yIG51bGwgaWYgdGhlcmUgd2FzIG5vIGVudHJ5IGZvcgorCSAqIHRoZSBrZXkuCisJICovCisJb2JqZWN0IHJlbW92ZU9iamVjdChzdHJpbmcga2V5KQorIAkKKwkvKioKKyAJICogQW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuCisgCSAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIHZhbHVlLgorIAkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBrZXkuCisgCSAqLworCXN0cnVjdCBFbnRyeShzdHJpbmcga2V5LCBvYmplY3QgdmFsdWUpCisgCQorCS8qKgorIAkgKiBHZXRzIGFsbCBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLgorIAkgKgorIAkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZS4KKyAJICovCisJRW50cnlbXSBnZXRBbGwoKQorCisJLyoqCisJICogR2V0cyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUuCisJICogQHJldHVybiBzaXplIG9mIHRoZSBoYXNoIHRhYmxlLgorCSAqLworCWludCBzaXplKCkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2V0Y2gvcmVhZG1lLnR4dCBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vZXRjaC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNjljMjkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2V0Y2gvcmVhZG1lLnR4dApAQCAtMCwwICsxLDQgQEAKK2Zyb20gdGhpcyBkaXJlY3RvcnksIGV0Y2ggbGlrZSB0aGlzOgorCitldGNoIC1iIGphdmEgICAtZCAuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL2phdmEgICBEaXN0cmlidXRlZEhhc2hUYWJsZS5ldGNoCitldGNoIC1iIGNoc2FycCAtZCAuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL2NzaGFycCBEaXN0cmlidXRlZEhhc2hUYWJsZS5ldGNoCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2Rpc3RtYXAvSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmphdmEgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2Rpc3RtYXAvSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3YWQxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZGlzdG1hcC9JbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXA7CisKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KKyAqLworcHVibGljIGNsYXNzIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudCBleHRlbmRzIEJhc2VEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC4KKwkgKgorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgc2VydmVyLgorCSAqLworCXB1YmxpYyBJbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQoIFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyIHNlcnZlciApCisJeworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlciBzZXJ2ZXI7CisKKwkvLyBUT0RPIGluc2VydCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQKKwkvLyBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIuCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9kaXN0bWFwL0ltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5qYXZhIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9kaXN0bWFwL0ltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGUwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2Rpc3RtYXAvSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4KKyAqLworcHVibGljIGNsYXNzIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlciBleHRlbmRzIEJhc2VEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBjbGllbnQgYSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgY2xpZW50LgorCSAqIEBwYXJhbSBtYXAgdGhlIGdsb2JhbCBtYXAuCisJICovCisJcHVibGljIEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlciggUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQgY2xpZW50LAorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCApCisJeworCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKKwkJdGhpcy5tYXAgPSBtYXA7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgZmluYWwgUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQgY2xpZW50OworCQorCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXA7CisKKwkvKioKKwkgKiBHZXRzIGFsbCBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLgorCSAqIAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZW50cmllcworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRyeVtdIGdldEFsbCgpCisJeworCQlzeW5jaHJvbml6ZWQgKG1hcCkKKwkJeworCQkJRW50cnlbXSBsaXN0ID0gbmV3IEVudHJ5W21hcC5zaXplKCldOworCQkJaW50IGluZGV4ID0gMDsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBtZSA6IG1hcC5lbnRyeVNldCgpKQorCQkJCWxpc3RbaW5kZXgrK10gPSBuZXcgRW50cnkoIG1lLmdldEtleSgpLCBtZS5nZXRWYWx1ZSgpICk7CisJCQlyZXR1cm4gbGlzdDsKKwkJfQorCX0KKworCS8qKgorCSAqIEdldHMgdGhlIHZhbHVlIHRvIHdoaWNoIGtleSBpcyBtYXBwZWQKKwkgKiAKKwkgKiBAcGFyYW0ga2V5IGtleSBhc3NvY2lhdGVkIHdpdGggdmFsdWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUga2V5IGlzIG1hcHBlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCBTdHJpbmcga2V5ICkKKwl7CisJCXJldHVybiBtYXAuZ2V0KCBrZXkgKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEga2V5LXZhbHVlIG1hcHBpbmcgdG8gdGhlIG1hcAorCSAqIAorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IHB1dE9iamVjdCggU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlICkKKwl7CisJCXJldHVybiBtYXAucHV0KCBrZXksIHZhbHVlICk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyBhIGtleS12YWx1ZSBtYXBwaW5nIGZyb20gdGhlIG1hcAorCSAqIAorCSAqIEBwYXJhbSBrZXkgdGhlIGtleQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBrZXkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IHJlbW92ZU9iamVjdCggU3RyaW5nIGtleSApCisJeworCQlyZXR1cm4gbWFwLnJlbW92ZSgga2V5ICk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIG1hcAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJbnRlZ2VyIHNpemUoKQorCXsKKwkJcmV0dXJuIG1hcC5zaXplKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZGlzdG1hcC9NYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuamF2YSBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZGlzdG1hcC9NYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RmMmZmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9kaXN0bWFwL01haW5EaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcC5EaXN0cmlidXRlZEhhc2hUYWJsZS5FbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CisKKworLyoqCisgKiBNYWluIHByb2dyYW0gZm9yIERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LiBUaGlzIHByb2dyYW0gbWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZQorICogbGlzdGVuZXIgY3JlYXRlZCBieSBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIE1haW5EaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudCBpbXBsZW1lbnRzIERpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50RmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNyI7CisJCQorCQlSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlciBzZXJ2ZXIgPSBEaXN0cmlidXRlZEhhc2hUYWJsZUhlbHBlci5uZXdTZXJ2ZXIoIHVyaSwgbnVsbCwKKwkJCW5ldyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQoKSApOworCisJCXNlcnZlci5fc3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKworCQlmaW5hbCBib29sZWFuIG15Qm9vbDEgPSB0cnVlOworCQlmaW5hbCBieXRlIG15Qnl0ZTEgPSAxOworCQlmaW5hbCBzaG9ydCBteVNob3J0MSA9IDIzNDsKKwkJZmluYWwgaW50IG15SW50MSA9IDM0NTM0NTsKKwkJZmluYWwgbG9uZyBteUxvbmcxID0gNDU2NDU2NDU2NDU2TDsKKwkJZmluYWwgZmxvYXQgbXlGbG9hdDEgPSAxLjIzNGY7CisJCWZpbmFsIGRvdWJsZSBteURvdWJsZTEgPSAyLjM0NTsKKwkJZmluYWwgU3RyaW5nIG15U3RyaW5nMSA9ICJhYmMiOwkKKwkJCisJCU9iamVjdCBteU9iajsKKworCQkvLyBTdGFydCB0ZXN0aW5nCisJCUxvZy5hZGRTaW5rKCBudWxsICk7CisJCQorCQkvLyBzaXplIC0gREhUIGlzIGVtcHR5CisJCUxvZy5yZXBvcnQoIkRIVCIsICJTaXplIiwgc2VydmVyLnNpemUoKSk7CisJCQorCQkvLyBnZXRBbGwgLSBESFQgaXMgZW1wdHkKKwkJZm9yKEVudHJ5IGVudHJ5OiBzZXJ2ZXIuZ2V0QWxsKCkpCisJCQlMb2cucmVwb3J0KCJnZXRBbGw6ICIsIGVudHJ5LmtleSwgZW50cnkudmFsdWUpOworCQkKKwkJLy8gcHV0T2JqZWN0IGZvciBlYWNoIGNvbnN0YW50IHR5cGUKKwkJc2VydmVyLnB1dE9iamVjdCgiYm9vbGVhbjEiLCBteUJvb2wxKTsKKwkJTG9nLnJlcG9ydCgicHV0T2JqZWN0IiwgImJvb2xlYW4gdmFsdWUiLCBteUJvb2wxKTsKKwkJCisJCXNlcnZlci5wdXRPYmplY3QoImJ5dGUxIiwgbXlCeXRlMSk7CisJCUxvZy5yZXBvcnQoInB1dE9iamVjdCIsICJieXRlIHZhbHVlIiwgbXlCeXRlMSk7CisJCQorCQlzZXJ2ZXIucHV0T2JqZWN0KCJzaG9ydDEiLCBteVNob3J0MSk7CisJCUxvZy5yZXBvcnQoInB1dE9iamVjdCIsICJzaG9ydCB2YWx1ZSIsIG15U2hvcnQxKTsKKworCQlzZXJ2ZXIucHV0T2JqZWN0KCJpbnQxIiwgbXlJbnQxKTsKKwkJTG9nLnJlcG9ydCgicHV0T2JqZWN0IiwgImludCB2YWx1ZSIsIG15SW50MSk7CisKKwkJc2VydmVyLnB1dE9iamVjdCgibG9uZzEiLCBteUxvbmcxKTsKKwkJTG9nLnJlcG9ydCgicHV0T2JqZWN0IiwgImxvbmcgdmFsdWUiLCBteUxvbmcxKTsKKworCQlzZXJ2ZXIucHV0T2JqZWN0KCJmbG9hdDEiLCBteUZsb2F0MSk7CisJCUxvZy5yZXBvcnQoInB1dE9iamVjdCIsICJmbG9hdCB2YWx1ZSIsIG15RmxvYXQxKTsKKworCQlzZXJ2ZXIucHV0T2JqZWN0KCJkb3VibGUxIiwgbXlEb3VibGUxKTsKKwkJTG9nLnJlcG9ydCgicHV0T2JqZWN0IiwgImRvdWJsZSB2YWx1ZSIsIG15RG91YmxlMSk7CisJCQorCQlzZXJ2ZXIucHV0T2JqZWN0KCJzdHJpbmcxIiwgbXlTdHJpbmcxKTsKKwkJTG9nLnJlcG9ydCgicHV0T2JqZWN0IiwgInN0cmluZyB2YWx1ZSIsIG15U3RyaW5nMSk7CQorCQkKKwkJLy8gc2l6ZSAtIERIVCBoYXMgZW50cmllcworCQlMb2cucmVwb3J0KCJESFQiLCAiU2l6ZSIsIHNlcnZlci5zaXplKCkpOworCQkKKwkJLy8gZ2V0QWxsIC0gREhUIGhhcyBlbnRyaWVzCisJCWZvcihFbnRyeSBlbnRyeTogc2VydmVyLmdldEFsbCgpKQorCQkJTG9nLnJlcG9ydCgiZ2V0QWxsOiAiLCBlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTsKKwkJCQorCQkvLyBnZXRPYmplY3QgZm9yIGVhY2ggY29uc3RhbnQgdHlwZQorCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImJvb2xlYW4xIik7CisJCUxvZy5yZXBvcnQoImdldE9iamVjdCIsICJteUJvb2wxIiwgbXlPYmopOworCQkKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJieXRlMSIpOworCQlMb2cucmVwb3J0KCJnZXRPYmplY3QiLCAibXlCeXRlMSIsIG15T2JqKTsJCisJCQorCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoInNob3J0MSIpOworCQlMb2cucmVwb3J0KCJnZXRPYmplY3QiLCAibXlTaG9ydDEiLCBteU9iaik7CQorCQkKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJpbnQxIik7CisJCUxvZy5yZXBvcnQoImdldE9iamVjdCIsICJteUludDEiLCBteU9iaik7CQorCQkKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJsb25nMSIpOworCQlMb2cucmVwb3J0KCJnZXRPYmplY3QiLCAibXlMb25nMSIsIG15T2JqKTsJCisJCQorCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImZsb2F0MSIpOworCQlMb2cucmVwb3J0KCJnZXRPYmplY3QiLCAibXlGbG9hdDEiLCBteU9iaik7CQorCQkKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJkb3VibGUxIik7CisJCUxvZy5yZXBvcnQoImdldE9iamVjdCIsICJteURvdWJsZTEiLCBteU9iaik7CQorCQkKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJzdHJpbmcxIik7CisJCUxvZy5yZXBvcnQoImdldE9iamVjdCIsICJteVN0cmluZzEiLCBteU9iaik7CisJCQorCQkvLyByZW1vdmVPYmplY3QgZm9yIGVhY2ggY29uc3RhbnQgdHlwZQorCQlteU9iaiA9IHNlcnZlci5yZW1vdmVPYmplY3QoImJvb2xlYW4xIik7CisJCUxvZy5yZXBvcnQoInJlbW92ZU9iamVjdCIsICJib29sZWFuIHZhbHVlIiwgbXlPYmopOworCQkKKwkJbXlPYmogPSBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJieXRlMSIpOworCQlMb2cucmVwb3J0KCJyZW1vdmVPYmplY3QiLCAiYnl0ZSB2YWx1ZSIsIG15T2JqKTsJCisJCQorCQlteU9iaiA9IHNlcnZlci5yZW1vdmVPYmplY3QoInNob3J0MSIpOworCQlMb2cucmVwb3J0KCJyZW1vdmVPYmplY3QiLCAic2hvcnQgdmFsdWUiLCBteU9iaik7CQorCQkKKwkJbXlPYmogPSBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJpbnQxIik7CisJCUxvZy5yZXBvcnQoInJlbW92ZU9iamVjdCIsICJpbnQgdmFsdWUiLCBteU9iaik7CQorCQkKKwkJbXlPYmogPSBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJsb25nMSIpOworCQlMb2cucmVwb3J0KCJyZW1vdmVPYmplY3QiLCAibG9uZyB2YWx1ZSIsIG15T2JqKTsJCisJCQorCQlteU9iaiA9IHNlcnZlci5yZW1vdmVPYmplY3QoImZsb2F0MSIpOworCQlMb2cucmVwb3J0KCJyZW1vdmVPYmplY3QiLCAiZmxvYXQgdmFsdWUiLCBteU9iaik7CQorCQkKKwkJbXlPYmogPSBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJkb3VibGUxIik7CisJCUxvZy5yZXBvcnQoInJlbW92ZU9iamVjdCIsICJkb3VibGUgdmFsdWUiLCBteU9iaik7CQorCQkJCQorCQlteU9iaiA9IHNlcnZlci5yZW1vdmVPYmplY3QoInN0cmluZzEiKTsKKwkJTG9nLnJlcG9ydCgicmVtb3ZlT2JqZWN0IiwgInN0cmluZyB2YWx1ZSIsIG15T2JqKTsKKwkJCisJCS8vIHNpemUgLSBWZXJpZnkgdGhhdCBESFQgaXMgZW1wdHkgYWZ0ZXIgcmVtb3ZpbmcgYWxsIGl0ZW1zCisJCUxvZy5yZXBvcnQoIkRIVCIsICJTaXplIiwgc2VydmVyLnNpemUoKSk7CisJCQorCQkvLyBnZXRBbGwgLSBWZXJpZnkgdGhhdCBESFQgaXMgZW1wdHkgYWZ0ZXIgcmVtb3ZpbmcgYWxsIGl0ZW1zCisJCWZvcihFbnRyeSBlbnRyeTogc2VydmVyLmdldEFsbCgpKQorCQkJTG9nLnJlcG9ydCgiZ2V0QWxsOiAiLCBlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTsKKwkJCQkKKwkJTG9nLnJlcG9ydCgiSGF2ZSBhIG5pY2UgZGF5ISIpOworCisJCXNlcnZlci5fc3RvcEFuZFdhaXREb3duKCA0MDAwICk7CisJfQorCisJcHVibGljIERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50IG5ld0Rpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50KCBSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlciBzZXJ2ZXIgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudCggc2VydmVyICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9kaXN0bWFwL01haW5EaXN0cmlidXRlZEhhc2hUYWJsZUxpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2Rpc3RtYXAvTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzgzMDNlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9kaXN0bWFwL01haW5EaXN0cmlidXRlZEhhc2hUYWJsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGxpc3RlbmVyIHRvIGFjY2VwdAorICogY29ubmVjdGlvbnMgZnJvbSBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lciBpbXBsZW1lbnRzIERpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLkRpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyRmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly8wLjAuMC4wOjQwMDciOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IERpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsCisJCQluZXcgTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIoKSApOworCisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0KKwkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSApOworCisJcHVibGljIERpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyIG5ld0Rpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyKCBSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIoIGNsaWVudCwgbWFwICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvdGVzdC9jc2hhcnAvRGlzdE1hcFRlc3RQcm9qL0Rpc3RNYXBUZXN0UHJvai5jc3Byb2ogYi9leGFtcGxlcy9kaXN0bWFwL3NyYy90ZXN0L2NzaGFycC9EaXN0TWFwVGVzdFByb2ovRGlzdE1hcFRlc3RQcm9qLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFkZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGlzdG1hcC9zcmMvdGVzdC9jc2hhcnAvRGlzdE1hcFRlc3RQcm9qL0Rpc3RNYXBUZXN0UHJvai5jc3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjUwNzI3PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnszOTY5OUZFRS1EMjFFLTQyQUMtQURENy0yMjQ4NEE5ODVDMjd9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5EaXN0TWFwVGVzdFByb2o8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5EaXN0TWFwVGVzdFByb2o8L0Fzc2VtYmx5TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yaywgVmVyc2lvbj0yLjQuNy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTk2ZDA5YTFlYjdmNDRhNzcsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxIaW50UGF0aD4kKE5VTklUX0hPTUUpXGJpblxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcQmFzZURpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkJhc2VEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcQmFzZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkJhc2VEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcRGlzdHJpYnV0ZWRIYXNoVGFibGUuY3MiPgorICAgICAgPExpbms+RGlzdHJpYnV0ZWRIYXNoVGFibGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxEaXN0cmlidXRlZEhhc2hUYWJsZUhlbHBlci5jcyI+CisgICAgICA8TGluaz5EaXN0cmlidXRlZEhhc2hUYWJsZUhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+RGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcFxSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXBcUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+UmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZS5jcyI+CisgICAgICA8TGluaz5TdHViRGlzdHJpYnV0ZWRIYXNoVGFibGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5TdHViRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFN0dWJEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5TdHViRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwXFZhbHVlRmFjdG9yeURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzIj4KKyAgICAgIDxMaW5rPlZhbHVlRmFjdG9yeURpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLmV4YW1wbGVzLmRpc3RtYXBcSW1wbERpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkltcGxEaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC5leGFtcGxlcy5kaXN0bWFwXEltcGxEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5JbXBsRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2guZXhhbXBsZXMuZGlzdG1hcFxNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQuY3MiPgorICAgICAgPExpbms+TWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLmV4YW1wbGVzLmRpc3RtYXBcTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+TWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2guZXhhbXBsZXMuZGlzdG1hcFxUZXN0RGlzdHJpYnV0ZWRIYXNoVGFibGUuY3MiPgorICAgICAgPExpbms+VGVzdERpc3RyaWJ1dGVkSGFzaFRhYmxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cYmluZGluZy1jc2hhcnBccnVudGltZVxzcmNcbWFpblxjc2hhcnBcRXRjaFByb2ouY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PnswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RXRjaFByb2o8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9kaXN0bWFwL3NyYy90ZXN0L2NzaGFycC9EaXN0TWFwVGVzdFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy90ZXN0L2NzaGFycC9EaXN0TWFwVGVzdFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5ODY2MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL3Rlc3QvY3NoYXJwL0Rpc3RNYXBUZXN0UHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJEaXN0TWFwVGVzdCBQcm9qZWN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkNpc2NvIFN5c3RlbXMsIEluYy4iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJEaXN0TWFwVGVzdFByb2oiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCCpICAyMDA4IildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJkYzgwM2U0NS04MjMyLTQyNTUtYjYxNS1jOTZkMWRlZDlkZjgiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbiAKKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMgCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGlzdG1hcC9zcmMvdGVzdC9jc2hhcnAvZXRjaC5leGFtcGxlcy5kaXN0bWFwL1Rlc3REaXN0cmlidXRlZEhhc2hUYWJsZS5jcyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL3Rlc3QvY3NoYXJwL2V0Y2guZXhhbXBsZXMuZGlzdG1hcC9UZXN0RGlzdHJpYnV0ZWRIYXNoVGFibGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlNjI5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL3Rlc3QvY3NoYXJwL2V0Y2guZXhhbXBsZXMuZGlzdG1hcC9UZXN0RGlzdHJpYnV0ZWRIYXNoVGFibGUuY3MKQEAgLTAsMCArMSwyMzMgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwLnR5cGVzLkRpc3RyaWJ1dGVkSGFzaFRhYmxlOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmRpc3RtYXAKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVW5pdCBUZXN0cyB0byB0ZXN0IERpc3RyaWJ1dGVkSGFzaFRhYmxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3REaXN0cmlidXRlZEhhc2hUYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIgc2VydmVyOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFNlcnZlckZhY3RvcnkgbGlzdGVuZXI7CisKKyAgICAgICAgcHVibGljIGNvbnN0IGJvb2wgbXlCb29sMSA9IHRydWU7CisgICAgICAgIHB1YmxpYyBjb25zdCBzYnl0ZSBteUJ5dGUxID0gMTI3OworICAgICAgICBwdWJsaWMgY29uc3Qgc2hvcnQgbXlTaG9ydDEgPSAzMjc2NzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBteUludDEgPSAyMTQ3NDgzNjQ3OworICAgICAgICBwdWJsaWMgY29uc3QgbG9uZyBteUxvbmcxID0gOTIyMzM3MjAzNjg1NDc3NTgwN0w7CisgICAgICAgIHB1YmxpYyBjb25zdCBmbG9hdCBteUZsb2F0MSA9IDMuNDAyODIzNWUzOGY7CisgICAgICAgIHB1YmxpYyBjb25zdCBkb3VibGUgbXlEb3VibGUxID0gMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOGQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgbXlTdHJpbmcxID0gImFiYyI7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0TGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDEwIjsKKworICAgICAgICAgICAgTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkRpc3RyaWJ1dGVkSGFzaFRhYmxlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIGxpc3RlbmVyID0gRGlzdHJpYnV0ZWRIYXNoVGFibGVIZWxwZXIuTmV3TGlzdGVuZXIodXJpLCBudWxsLCBpbXBsRmFjdG9yeSk7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxpc3RlbmVyIFN0YXJ0ZWQiKTsKKworICAgICAgICB9CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBNYWtlQ29ubmVjdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMTAiOworCisgICAgICAgICAgICBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQgY2xpZW50ID0gbmV3IE1haW5EaXN0cmlidXRlZEhhc2hUYWJsZUNsaWVudCgpOworICAgICAgICAgICAgc2VydmVyID0gRGlzdHJpYnV0ZWRIYXNoVGFibGVIZWxwZXIuTmV3U2VydmVyKHVyaSwgbnVsbCwgY2xpZW50KTsKKworICAgICAgICAgICAgc2VydmVyLl9TdGFydEFuZFdhaXRVcCg0MDAwKTsKKyAgICAgICAgfQorCisgICAgICAgIFsgVGVzdCBdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RCb29sZWFuKCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgiYm9vbGVhbjEiLG15Qm9vbDEpOworICAgICAgICAgICAgT2JqZWN0IG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiYm9vbGVhbjEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChteUJvb2wxLG15T2JqKTsKKworICAgICAgICAgICAgc2VydmVyLnJlbW92ZU9iamVjdCgiYm9vbGVhbjEiKTsKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiYm9vbGVhbjEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwobXlPYmopOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgiYnl0ZTEiLCBteUJ5dGUxKTsKKyAgICAgICAgICAgIE9iamVjdCBteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImJ5dGUxIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXlCeXRlMSwgbXlPYmopOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJieXRlMSIpOworICAgICAgICAgICAgbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJieXRlMSIpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChteU9iaik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFNob3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgic2hvcnQxIiwgbXlTaG9ydDEpOworICAgICAgICAgICAgT2JqZWN0IG15T2JqID0gc2VydmVyLmdldE9iamVjdCgic2hvcnQxIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXlTaG9ydDEsIG15T2JqKTsKKworICAgICAgICAgICAgc2VydmVyLnJlbW92ZU9iamVjdCgic2hvcnQxIik7CisgICAgICAgICAgICBteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoInNob3J0MSIpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChteU9iaik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEludCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlci5wdXRPYmplY3QoImludDEiLCBteUludDEpOworICAgICAgICAgICAgT2JqZWN0IG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiaW50MSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG15SW50MSwgbXlPYmopOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJpbnQxIik7CisgICAgICAgICAgICBteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImludDEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwobXlPYmopOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdExvbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJ2ZXIucHV0T2JqZWN0KCJsb25nMSIsIG15TG9uZzEpOworICAgICAgICAgICAgT2JqZWN0IG15T2JqID0gc2VydmVyLmdldE9iamVjdCgibG9uZzEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChteUxvbmcxLCBteU9iaik7CisKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoImxvbmcxIik7CisgICAgICAgICAgICBteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImxvbmcxIik7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG15T2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RmxvYXQoKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJ2ZXIucHV0T2JqZWN0KCJmbG9hdDEiLCBteUZsb2F0MSk7CisgICAgICAgICAgICBPYmplY3QgbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJmbG9hdDEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChteUZsb2F0MSwgbXlPYmopOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJmbG9hdDEiKTsKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiZmxvYXQxIik7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG15T2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgiZG91YmxlMSIsIG15RG91YmxlMSk7CisgICAgICAgICAgICBPYmplY3QgbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJkb3VibGUxIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobXlEb3VibGUxLCBteU9iaik7CisKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoImRvdWJsZTEiKTsKKyAgICAgICAgICAgIG15T2JqID0gc2VydmVyLmdldE9iamVjdCgiZG91YmxlMSIpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChteU9iaik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlci5wdXRPYmplY3QoInN0cmluZzEiLCBteVN0cmluZzEpOworICAgICAgICAgICAgT2JqZWN0IG15T2JqID0gc2VydmVyLmdldE9iamVjdCgic3RyaW5nMSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG15U3RyaW5nMSwgbXlPYmopOworCisgICAgICAgICAgICBzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJzdHJpbmcxIik7CisgICAgICAgICAgICBteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoInN0cmluZzEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwobXlPYmopOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgiaW50MSIsIG15SW50MSk7CisgICAgICAgICAgICBzZXJ2ZXIucHV0T2JqZWN0KCJzdHJpbmcxIiwgImFiYyIpOworCisgICAgICAgICAgICBpbnQ/IHNpemUgPSBzZXJ2ZXIuc2l6ZSgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsc2l6ZSk7CisKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoImludDEiKTsKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoInN0cmluZzEiKTsKKworICAgICAgICAgICAgc2l6ZSA9IHNlcnZlci5zaXplKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEdldEFsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludD8gc2l6ZSA9IHNlcnZlci5zaXplKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCxzaXplKTsKKworICAgICAgICAgICAgc2VydmVyLnB1dE9iamVjdCgiaW50MSIsIG15SW50MSk7CisgICAgICAgICAgICBzZXJ2ZXIucHV0T2JqZWN0KCJzdHJpbmcxIiwgImFiYyIpOworCisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAoRW50cnkgZW50cnkgaW4gc2VydmVyLmdldEFsbCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5rZXkgIT0gbnVsbCAmJiBlbnRyeS52YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMixjb3VudCk7CisKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoImludDEiKTsKKyAgICAgICAgICAgIHNlcnZlci5yZW1vdmVPYmplY3QoInN0cmluZzEiKTsKKworICAgICAgICAgICAgc2l6ZSA9IHNlcnZlci5zaXplKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCxzaXplKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKworICAgICAgICBbVGVhckRvd25dCisgICAgICAgIHB1YmxpYyB2b2lkIENsb3NlQ29ubmVjdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuX1N0b3AoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKworICAgICAgICBbVGVzdEZpeHR1cmVUZWFyRG93bl0KKyAgICAgICAgcHVibGljIHZvaWQgU3RvcExpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuVHJhbnNwb3J0Q29udHJvbChUcmFuc3BvcnRDb25zdHMuU1RPUF9BTkRfV0FJVF9ET1dOLDQwMDApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kaXN0bWFwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2Rpc3RtYXAvVGVzdFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmphdmEgYi9leGFtcGxlcy9kaXN0bWFwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2Rpc3RtYXAvVGVzdFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjZWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Rpc3RtYXAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZGlzdG1hcC9UZXN0UmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5kaXN0bWFwOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZGlzdG1hcC5EaXN0cmlidXRlZEhhc2hUYWJsZS5FbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdHMgdGhlIFJlbW90ZURpc3RyaWJ1dGVkSGFzaFRhYmxlU2VydmVyIGludGVyZmFjZS4gU3RhcnQgdGhlCisgKiBUZXN0UmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lciBmaXJzdC4KKyAqLworcHVibGljIGNsYXNzIFRlc3RSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZVNlcnZlcgoreworCWZpbmFsIGJvb2xlYW4gbXlCb29sMSA9IHRydWU7CisJZmluYWwgYnl0ZSBteUJ5dGUxID0gMTI3OworCWZpbmFsIHNob3J0IG15U2hvcnQxID0gMzI3Njc7CisJZmluYWwgaW50IG15SW50MSA9IDIxNDc0ODM2NDc7CisJZmluYWwgbG9uZyBteUxvbmcxID0gOTIyMzM3MjAzNjg1NDc3NTgwN2w7CisJZmluYWwgZmxvYXQgbXlGbG9hdDEgPSAzLjQwMjgyMzVlMzhmOworCWZpbmFsIGRvdWJsZSBteURvdWJsZTEgPSAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4ZDsKKwlmaW5hbCBTdHJpbmcgbXlTdHJpbmcxID0gImFiYyI7CisJUmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVTZXJ2ZXIgc2VydmVyOworCQorCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0KKwkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSApOworCQorCS8qKiB0cmFuc3BvcnQgKi8KKwlwdWJsaWMgc3RhdGljIFNlcnZlckZhY3RvcnkgbGlzdGVuZXI7CisKKwkvKioKKwkgKiBDb25uZWN0IHRvIHNlcnZpY2UKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRSZW1vdGVEaXN0cmlidXRlZEhhc2hUYWJsZUxpc3RlbmVyKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLmFkZFNpbmsobnVsbCk7CisJCUxvZy5yZXBvcnQoIlN0YXJ0UmVtb3RlRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lciIpOworCQkJCisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDciOworCQlNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lciBpbXBsRmFjdG9yeSA9IG5ldyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVMaXN0ZW5lcigpOworCQlsaXN0ZW5lciA9IERpc3RyaWJ1dGVkSGFzaFRhYmxlSGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsIGltcGxGYWN0b3J5ICk7CisKKwkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisJCisJCUxvZy5yZXBvcnQoICJTdGFydERpc3RyaWJ1dGVkSGFzaFRhYmxlUmVtb3RlTGlzdGVuZXIiLAorCQkJCSJzdGF0dXMiLCAidXAiLAorCQkJCSJsaXN0ZW5lciIsIGxpc3RlbmVyICk7CisJfQorCisJLyoqCisJICogU2h1dCBkb3duIGxpc3RlbmVyCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0TGlzdGVuZXIoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKKwkJeworCQkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUT1BfQU5EX1dBSVRfRE9XTiwgNDAwMCApOworCQkJbGlzdGVuZXIgPSBudWxsOworCQl9CisJfQkKKwkKKwkvKioKKwkgKiBDb25uZWN0IGNsaWVudCB0byBzZXJ2ZQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIG1ha2VDb25uZWN0aW9uKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNyI7CisKKwkJc2VydmVyID0gRGlzdHJpYnV0ZWRIYXNoVGFibGVIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsIG5ldyBNYWluRGlzdHJpYnV0ZWRIYXNoVGFibGVDbGllbnQoKSApOworCisJCXNlcnZlci5fc3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKwl9CisKKwkvKioKKwkgKiBTaHV0ZG93biBjb25uZWN0aW9uIHRvIHNlcnZlcgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQEFmdGVyCisJcHVibGljIHZvaWQgc2h1dENvbm5lY3Rpb24oKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoc2VydmVyICE9IG51bGwpCisJCXsKKwkJCXNlcnZlci5fc3RvcCgpOworCQl9CisJfQorCisJLyoqCisJICogVmVyaWZ5IHRoYXQgcHV0T2JqZWN0LCBnZXRPYmplY3QgYW5kIHJlbW92ZU9iamVjdAorCSAqIHdvcmsgZm9yIGEgYm9vbGVhbiB0eXBlIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbigpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBteU9iaiA9IHNlcnZlci5wdXRPYmplY3QoImJvb2xlYW4xIiwgbXlCb29sMSk7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJib29sZWFuMSIpOworCQlhc3NlcnRFcXVhbHMoIG15Qm9vbDEsIG15T2JqICk7CisKKwkJc2VydmVyLnJlbW92ZU9iamVjdCgiYm9vbGVhbjEiKTsKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJib29sZWFuMSIpOworCQlhc3NlcnROdWxsKCBteU9iaiApOworCX0KKwkKKwkvKioKKwkgKiBWZXJpZnkgdGhhdCBwdXRPYmplY3QsIGdldE9iamVjdCBhbmQgcmVtb3ZlT2JqZWN0CisJICogd29yayBmb3IgYSBieXRlIHR5cGUgCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCeXRlKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IG15T2JqID0gc2VydmVyLnB1dE9iamVjdCgiYnl0ZTEiLCBteUJ5dGUxKTsKKwkJYXNzZXJ0TnVsbCggbXlPYmogKTsKKworCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImJ5dGUxIik7CisJCWFzc2VydEVxdWFscyggbXlCeXRlMSwgbXlPYmogKTsKKworCQlzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJieXRlMSIpOworCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImJ5dGUxIik7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHRoYXQgcHV0T2JqZWN0LCBnZXRPYmplY3QgYW5kIHJlbW92ZU9iamVjdAorCSAqIHdvcmsgZm9yIGEgc2hvcnQgdHlwZSAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNob3J0KCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IG15T2JqID0gc2VydmVyLnB1dE9iamVjdCgic2hvcnQxIiwgbXlTaG9ydDEpOworCQlhc3NlcnROdWxsKCBteU9iaiApOworCisJCW15T2JqID0gc2VydmVyLmdldE9iamVjdCgic2hvcnQxIik7CisJCWFzc2VydEVxdWFscyggbXlTaG9ydDEsIG15T2JqICk7CisKKwkJc2VydmVyLnJlbW92ZU9iamVjdCgic2hvcnQxIik7CisJCW15T2JqID0gc2VydmVyLmdldE9iamVjdCgic2hvcnQxIik7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHRoYXQgcHV0T2JqZWN0LCBnZXRPYmplY3QgYW5kIHJlbW92ZU9iamVjdAorCSAqIHdvcmsgZm9yIGFuIGludCB0eXBlIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW50KCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IG15T2JqID0gc2VydmVyLnB1dE9iamVjdCgiaW50MSIsIG15SW50MSk7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJpbnQxIik7CisJCWFzc2VydEVxdWFscyggbXlJbnQxLCBteU9iaiApOworCisJCXNlcnZlci5yZW1vdmVPYmplY3QoImludDEiKTsKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJpbnQxIik7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHRoYXQgcHV0T2JqZWN0LCBnZXRPYmplY3QgYW5kIHJlbW92ZU9iamVjdAorCSAqIHdvcmsgZm9yIGEgbG9uZyB0eXBlIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TG9uZygpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBteU9iaiA9IHNlcnZlci5wdXRPYmplY3QoImxvbmcxIiwgbXlMb25nMSk7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJsb25nMSIpOworCQlhc3NlcnRFcXVhbHMoIG15TG9uZzEsIG15T2JqICk7CisKKwkJc2VydmVyLnJlbW92ZU9iamVjdCgibG9uZzEiKTsKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJsb25nMSIpOworCQlhc3NlcnROdWxsKCBteU9iaiApOworCX0KKworCS8qKgorCSAqIFZlcmlmeSB0aGF0IHB1dE9iamVjdCwgZ2V0T2JqZWN0IGFuZCByZW1vdmVPYmplY3QKKwkgKiB3b3JrIGZvciBhIGZsb2F0IHR5cGUgCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGbG9hdCgpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBteU9iaiA9IHNlcnZlci5wdXRPYmplY3QoImZsb2F0MSIsIG15RmxvYXQxKTsKKwkJYXNzZXJ0TnVsbCggbXlPYmogKTsKKworCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImZsb2F0MSIpOworCQlhc3NlcnRFcXVhbHMoIG15RmxvYXQxLCBteU9iaiApOworCisJCXNlcnZlci5yZW1vdmVPYmplY3QoImZsb2F0MSIpOworCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoImZsb2F0MSIpOworCQlhc3NlcnROdWxsKCBteU9iaiApOworCX0KKworCS8qKgorCSAqIFZlcmlmeSB0aGF0IHB1dE9iamVjdCwgZ2V0T2JqZWN0IGFuZCByZW1vdmVPYmplY3QKKwkgKiB3b3JrIGZvciBhIGRvdWJsZSB0eXBlIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IG15T2JqID0gc2VydmVyLnB1dE9iamVjdCgiZG91YmxlMSIsIG15RG91YmxlMSk7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJkb3VibGUxIik7CisJCWFzc2VydEVxdWFscyggbXlEb3VibGUxLCBteU9iaiApOworCisJCXNlcnZlci5yZW1vdmVPYmplY3QoImRvdWJsZTEiKTsKKwkJbXlPYmogPSBzZXJ2ZXIuZ2V0T2JqZWN0KCJkb3VibGUxIik7CisJCWFzc2VydE51bGwoIG15T2JqICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHRoYXQgcHV0T2JqZWN0LCBnZXRPYmplY3QgYW5kIHJlbW92ZU9iamVjdAorCSAqIHdvcmsgZm9yIGEgc3RyaW5nIHR5cGUgCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgbXlPYmogPSBzZXJ2ZXIucHV0T2JqZWN0KCJzdHJpbmcxIiwgbXlTdHJpbmcxKTsKKwkJYXNzZXJ0TnVsbCggbXlPYmogKTsKKworCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoInN0cmluZzEiKTsKKwkJYXNzZXJ0RXF1YWxzKCBteVN0cmluZzEsIG15T2JqICk7CisKKwkJc2VydmVyLnJlbW92ZU9iamVjdCgic3RyaW5nMSIpOworCQlteU9iaiA9IHNlcnZlci5nZXRPYmplY3QoInN0cmluZzEiKTsKKwkJYXNzZXJ0TnVsbCggbXlPYmogKTsKKwl9CisJCisJLyoqCisJICogVmVyaWZ5IHNpemUKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNpemUoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvKgorCQkgKiBWZXJpZnkgdGhhdCBzaXplIGlzIGluaXRpYWxseSB6ZXJvCisJCSAqLworCQlpbnQgc2l6ZSA9IHNlcnZlci5zaXplKCk7CisJCWFzc2VydEVxdWFscyhzaXplLCAwKTsKKworCQkvKgorCQkgKiBBZGQgaXRlbXMgYW5kIHZlcmlmeSBzaXplCisJCSAqLworCQlzZXJ2ZXIucHV0T2JqZWN0KCJzdHJpbmcxIiwgImFiYyIpOworCQlzZXJ2ZXIucHV0T2JqZWN0KCJzdHJpbmcyIiwgInh5eiIpOworCQlzZXJ2ZXIucHV0T2JqZWN0KCJpbnQxIiwgMCk7CisJCXNlcnZlci5wdXRPYmplY3QoImludDIiLCAxMjUpOworCisJCXNpemUgPSBzZXJ2ZXIuc2l6ZSgpOworCQlhc3NlcnRFcXVhbHMoc2l6ZSw0KTsKKwkJCisJCS8qCisJCSAqIFJlbW92ZSBpdGVtcyBhbmQgdmVyaWZ5IHNpemUKKwkJICovCisJCXNlcnZlci5yZW1vdmVPYmplY3QoInN0cmluZzEiKTsKKwkJc2VydmVyLnJlbW92ZU9iamVjdCgic3RyaW5nMiIpOworCQlzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJpbnQxIik7CisJCXNlcnZlci5yZW1vdmVPYmplY3QoImludDIiKTsKKworCQlzaXplID0gc2VydmVyLnNpemUoKTsKKwkJYXNzZXJ0RXF1YWxzKHNpemUsIDApOworCX0KKwkKKwkvKioKKwkgKiBWZXJpZnkgdGhhdCBnZXRBbGwgcmV0dXJucyBhbGwgZW50cmllcyAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldEFsbCgpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCS8qCisJCSAqIFZlcmlmeSB0aGF0IG1hcCBpcyBlbXB0eSB0byBzdGFydAorCQkgKi8KKwkJaW50IHNpemUgPSBzZXJ2ZXIuc2l6ZSgpOworCQlhc3NlcnRFcXVhbHMoc2l6ZSwgMCk7CisKKwkJLyoKKwkJICogUHV0IGl0ZW1zIGluIG1hcAorCQkgKi8KKwkJc2VydmVyLnB1dE9iamVjdCgic3RyaW5nMSIsICJhYmMiKTsKKwkJc2VydmVyLnB1dE9iamVjdCgic3RyaW5nMiIsICJ4eXoiKTsKKwkJc2VydmVyLnB1dE9iamVjdCgiaW50MSIsIDApOworCQlzZXJ2ZXIucHV0T2JqZWN0KCJpbnQyIiwgMTI1KTsKKworCQkvKgorCQkgKiBWZXJpZnkgdGhhdCA0IGl0ZW1zIHdlcmUgaW5zZXJ0ZWQgaW50byB0aGUgbWFwCisJCSAqLworCQlpbnQgY291bnRlciA9IDA7CisJCWZvcihFbnRyeSBlbnRyeTogc2VydmVyLmdldEFsbCgpKQorCQl7CisJCQlpZihlbnRyeS5rZXkgIT0gbnVsbCAmJiBlbnRyeS52YWx1ZSAhPSBudWxsKQorCQkJeworCQkJCWNvdW50ZXIrKzsKKwkJCX0KKwkJfQorCisJCWFzc2VydEVxdWFscyhjb3VudGVyLCA0KTsKKworCQkvKgorCQkgKiBSZW1vdmUgYWxsIGl0ZW1zIGFkZGVkIHRvIG1hcAorCQkgKi8KKwkJc2VydmVyLnJlbW92ZU9iamVjdCgic3RyaW5nMSIpOworCQlzZXJ2ZXIucmVtb3ZlT2JqZWN0KCJzdHJpbmcyIik7CisJCXNlcnZlci5yZW1vdmVPYmplY3QoImludDEiKTsKKwkJc2VydmVyLnJlbW92ZU9iamVjdCgiaW50MiIpOworCisJCS8qCisJCSAqIFZlcmlmeSB0aGF0IG1hcCBpcyBlbXB0eSB3aGVuIGFsbCBrbm93biBpdGVtcyBhcmUgcmVtb3ZlZAorCQkgKi8KKwkJc2l6ZSA9IHNlcnZlci5zaXplKCk7CisJCWFzc2VydEVxdWFscyhzaXplLCAwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL1JFQURNRS50eHQgYi9leGFtcGxlcy9leGFtcGxlL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyMWZhMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4YW1wbGUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDMwIEBACitUbyBnZXQgc3RhcnRlZCB3aXRoIHRoZSBleGFtcGxlIHlvdSB3aWxsIG5lZWQgamRrIDEuNS4wX3gsCit3aGVyZSB4IGlzIHByZXR0eSByZWNlbnQgKD49IDE1KSwgb3IgYW55IHJlbGVhc2Ugb2YgamRrIDEuNi4KK1lvdSB3aWxsIGFsc28gbmVlZCBhbnQgMS43LjAsIHdpdGggYW50IC5uZXQgcGx1Z2luIGlmIHlvdQord2FudCB0byBidWlsZCBjc2hhcnAuIFlvdSB3aWxsIGFsc28gbmVlZCBtaWNyb3NvZnQgLm5ldAorc2RrIDIuMCBmb3IgY3NoYXJwIGJ1aWxkcy4KKworVG8gYnVpbGQ6CisKKz4gYW50CisKK1RoaXMgd2lsbCBydW4gdGhlIGRlZmF1bHQgdGFyZ2V0IHdoaWNoIHdpbGwgYnVpbGQgYm90aCBqYXZhCithbmQgY3NoYXJwIHByb2dyYW1zLiBZb3UgY2FuIGFsc28gdXNlIGJ1aWxkLWphdmEgb3IgYnVpbGQtY3NoYXJwCit0YXJnZXRzIHRvIGJ1aWxkIG9ubHkgamF2YSBvciBvbmx5IGNzaGFycC4KKworVG8gcnVuIGphdmEgZXhhbXBsZSBleGFtcGxlLCBvcGVuIGEgY21kIHdpbmRvdyBhbmQgcnVuIHRoZXNlCitjb21tYW5kczoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IGphdmEgLWNwIGV4YW1wbGUuamFyIGV0Y2guZXhhbXBsZXMuZXhhbXBsZS5NYWluRXhtYXBsZUxpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGV4YW1wbGUuamFyIGV0Y2guZXhhbXBsZXMuZXhhbXBsZS5NYWluRXhhbXBsZUNsaWVudAorCitUbyBydW4gY3NoYXJwIGV4YW1wbGU6CisKKz4gY2QgdGFyZ2V0XGJpbgorPiBzdGFydCBleGFtcGxlTGlzdGVuZXIuZXhlCis+IHN0YXJ0IGV4YW1wbGVDbGllbnQuZXhlCisKK05vdyBtb2RpZnkgdGhlIGV4YW1wbGUgdG8gaW1wbGVtZW50IHRoZSBzZXJ2aWNlIGhvd2V2ZXIgeW91IGxpa2UuCisKK1lvdSBjYW4gbWl4IGFuZCBtYXRjaCB0aGUgdmFyaW91cyBjbGllbnRzIGFuZCBsaXN0ZW5lcnMuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL2J1aWxkLnhtbCBiL2V4YW1wbGVzL2V4YW1wbGUvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzEzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL2J1aWxkLnhtbApAQCAtMCwwICsxLDMyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtZXhhbXBsZS1leGFtcGxlIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIiA+CisgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgRXhhbXBsZTwvZGVzY3JpcHRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYmFzZWRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4iIC8+CisgICAgPGltcG9ydCBmaWxlPSIke0V0Y2guYmFzZWRpcn0vYnVpbGQtc3VwcG9ydC9ldGNoLmluY2x1ZGVzLnhtbCIgLz4KKworICAgIDwhLS0gVE9ETyBiZXR0ZXIgY29tcHV0YXRpb24gb2YgZXRjaC5ob21lLCBldGNoLnZlcnNpb24gLS0+CisgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+CisKKyAgICA8IS0tIGNvbXB1dGUgRVRDSF9IT01FIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5FVENIX0hPTUUiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uL3RhcmdldC9JbnN0YWxsZXJzL2Rpc3QiIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZXRjaC5ob21lIiB2YWx1ZT0iJHtlbnYuRVRDSF9IT01FfSIgPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9IiR7ZW52LkVUQ0hfSE9NRX0iIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZXRjaC5ob21lIiB2YWx1ZT0iJHtidWlsZC5FVENIX0hPTUV9IiA+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJldGNoLmhvbWUiIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5kZXBlbmRlbmN5Lmp1bml0LmphciIKKyAgICAgICAgbG9jYXRpb249IiR7ZGVmYXVsdC5qdW5pdC5saWJ9L2p1bml0LTQuMy4xLmphciIgLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmJ1aWxkU3VwcG9ydERpcmVjdG9yeSIgbG9jYXRpb249Ii4uLy4uL2J1aWxkLXN1cHBvcnQiIC8+CisKKyAgICA8IS0tIGNvbXB1dGUgZXRjaC52ZXJzaW9uIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImV0Y2gudmVyc2lvbiIgdmFsdWU9IiR7RXRjaC52ZXJzaW9ufSIgPgorICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0iZXRjaC52ZXJzaW9uIiAvPjwvbm90PgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPCEtLSBDc2hhcnAgU3VwcG9ydCAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJVU0UuZG90bmV0IiA+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIiAvPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Vudi53aW5kaXJ9L01pY3Jvc29mdC5ORVQvRnJhbWV3b3JrL3YyLjAuNTA3MjcvbXNidWlsZC5leGUiIC8+CisgICAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IlVTRS5tb25vIiA+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8bm90PjxvcyBmYW1pbHk9IndpbmRvd3MiIC8+PC9ub3Q+CisgICAgICAgICAgICA8IS0tIFRPRE8gbW9ubyBzdXBwb3J0IGlzIG5vdCBmdWxseSBiYWtlZCwgdXNlIC1EVVNFLm1vbm8gdG8gdGVzdCAtLT4KKyAgICAgICAgICAgIDwhLS0gPGF2YWlsYWJsZSBmaWxlPSIke2Vudi5NT05PX0hPTUV9L2Jpbi9tZHRvb2wiIC8+IC0tPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJVU0UubW9ubyIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iQlVJTEQuY3NoYXJwIiA+CisgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iVVNFLmRvdG5ldCIgLz4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iVVNFLm1vbm8iIC8+CisgICAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8IS0tIGltcG9ydCBldGNoIHRhc2sgLS0+CisgICAgPHRhc2tkZWYKKyAgICAgICAgb25lcnJvcj0icmVwb3J0IgorICAgICAgICByZXNvdXJjZT0ib3JnL2FwYWNoZS9ldGNoL3Rvb2xzL2FudC9ldGNoLnhtbCIKKyAgICAgICAgY2xhc3NwYXRoPSIke2V0Y2guaG9tZX0vbGliL2V0Y2gtYW50LXBsdWdpbi0ke2V0Y2gudmVyc2lvbn0uamFyIiAvPgorCisgICAgPCEtLSBpbXBvcnQgZG90bmV0IHRhc2sgLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYW50LmRvdG5ldC5qYXIiIHZhbHVlPSJhbnQtZG90bmV0LTEuMC5qYXIiID4KKyAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9ImFudC5kb3RuZXQuamFyIiAvPjwvbm90PgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPHRhc2tkZWYKKyAgICAgICAgb25lcnJvcj0icmVwb3J0IgorICAgICAgICByZXNvdXJjZT0ib3JnL2FwYWNoZS9hbnQvZG90bmV0L2FudGxpYi54bWwiCisgICAgICAgIGNsYXNzcGF0aD0iJHthbnQuZG90bmV0Lmphcn0iIC8+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0ibWR0b29sIiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiAgICAgICAgIGRlZmF1bHQ9Ii4iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIGRlZmF1bHQ9ImZhbHNlIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2plY3QiICAgICBkZWZhdWx0PSJwcm9qZWN0LmNzcHJvaiIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiICAgICAgZGVmYXVsdD0iJHtidWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7ZW52Lk1PTk9fSE9NRX0vYmluL21kdG9vbCIgZGlyPSJAe2Rpcn0iIGZhaWxvbmVycm9yPSJAe2ZhaWxvbmVycm9yfSIgPgorICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9ImJ1aWxkIiAvPgorICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tYnVpbGRmaWxlOkB7cHJvamVjdH0iIC8+CisgICAgICAgICAgICA8L2V4ZWM+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPCEtLSBzZXQgcHJvcGVydGllcyAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3NyYyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWFpbi1zcmMtamF2YSIgICAgIGxvY2F0aW9uPSIke3NyY30vbWFpbi9qYXZhIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LXNyYy1qYXZhIiAgICAgbG9jYXRpb249IiR7c3JjfS90ZXN0L2phdmEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS90YXJnZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRpc3Qtc3JjIiAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2Rpc3Qtc3JjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5lcmF0ZWQtc291cmNlcyIgbG9jYXRpb249IiR7dGFyZ2V0fS9nZW5lcmF0ZWQtc291cmNlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuLXNyYy1qYXZhIiAgICAgIGxvY2F0aW9uPSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvamF2YSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuLXNyYy1jc2hhcnAiICAgIGxvY2F0aW9uPSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvY3NoYXJwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW4iICAgICAgICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9iaW4iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMtdGVzdCIgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMtdGVzdCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC1yZXN1bHRzIiAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vdGVzdC1yZXN1bHRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJudW5pdC1yZXN1bHRzIiAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9udW5pdC1yZXN1bHRzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0IiAgICAgICAgICAgICAgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4vdGFyZ2V0L0luc3RhbGxlcnMvZGlzdCIgLz4KKworICAgIDwhLS0gaW5pdGlhbGl6ZSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiID4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Rpc3Qtc3JjfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQtc291cmNlc30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW4tc3JjLWNzaGFycH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YmlufSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLXRlc3R9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QtcmVzdWx0c30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7bnVuaXQtcmVzdWx0c30iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIGJ1aWxkIHRoZSBzZXJ2ZXIgLS0+CisgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1zb3VyY2VzIiBkZXBlbmRzPSJpbml0IiA+CisgICAgICAgIDwhLS0gZ2VuZXJhdGUgc291cmNlcyAtLT4KKworICAgICAgICA8ZXRjaCBob21lPSIke2V0Y2guaG9tZX0iCisgICAgICAgICAgICAgIGZpbGU9IiR7c3JjfS9tYWluL2V0Y2gvRXhhbXBsZS5ldGNoIgorICAgICAgICAgICAgICBiaW5kaW5nPSJqYXZhIgorICAgICAgICAgICAgICBvdXRwdXREaXI9IiR7Z2VuLXNyYy1qYXZhfSIgLz4KKworICAgICAgICA8ZXRjaCBob21lPSIke2V0Y2guaG9tZX0iCisgICAgICAgICAgICAgIGZpbGU9IiR7c3JjfS9tYWluL2V0Y2gvRXhhbXBsZS5ldGNoIgorICAgICAgICAgICAgICBiaW5kaW5nPSJjc2hhcnAiCisgICAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW4tc3JjLWNzaGFycH0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC1qYXZhLXJ1bnRpbWUtbmFtZSIKKyAgICAgICAgdmFsdWU9ImV0Y2gtamF2YS1ydW50aW1lLSR7ZXRjaC52ZXJzaW9ufS5qYXIiIC8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZSIKKyAgICAgICAgbG9jYXRpb249IiR7ZXRjaC5ob21lfS9saWIvJHtldGNoLWphdmEtcnVudGltZS1uYW1lfSIgLz4KKworICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtamF2YSIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyIgPgorICAgICAgICA8IS0tIGNvbXBpbGUgc291cmNlcyAtLT4KKworICAgICAgICA8amF2YWMgdGFyZ2V0PSIxLjUiIGRlc3RkaXI9IiR7Y2xhc3Nlc30iID4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtnZW4tc3JjLWphdmF9IiAvPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke21haW4tc3JjLWphdmF9IiAvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZX0iIC8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC9qYXZhYz4KKworICAgICAgICA8amF2YWMgdGFyZ2V0PSIxLjUiIGRlc3RkaXI9IiR7Y2xhc3Nlcy10ZXN0fSIgPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke2dlbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7bWFpbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7dGVzdC1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuamF2YS5ydW50aW1lfSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5Lmp1bml0Lmphcn0iIC8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC9qYXZhYz4KKworICAgICAgICA8IS0tIENyZWF0ZSBKYXIgLS0+CisgICAgICAgIDxqYXIgamFyZmlsZT0iJHtiaW59L2V4YW1wbGUuamFyIiA+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iJHtldGNoLWphdmEtcnVudGltZS1uYW1lfSIgLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlc30iID4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2phcj4KKworICAgICAgICA8IS0tIGNvcHkgaW4gZGVwZW5kZW5jaWVzIC0tPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtiaW59IiBmaWxlPSIke0V0Y2guZGVwZW5kZW5jeS5qYXZhLnJ1bnRpbWV9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1jc2hhcnAtd2l0aC1tb25vIiBkZXBlbmRzPSJnZW5lcmF0ZS1zb3VyY2VzIiBpZj0iVVNFLm1vbm8iID4KKyAgICAgICAgPG1kdG9vbCBkaXI9IiR7c3JjfS9tYWluL2NzaGFycC9FeGFtcGxlQ2xpZW50UHJvaiIgcHJvamVjdD0iRXhhbXBsZUNsaWVudFByb2ouY3Nwcm9qIiAvPgorICAgICAgICA8bWR0b29sIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0V4YW1wbGVMaXN0ZW5lclByb2oiIHByb2plY3Q9IkV4YW1wbGVMaXN0ZW5lclByb2ouY3Nwcm9qIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1jc2hhcnAtd2l0aC1kb3RuZXQiIGRlcGVuZHM9ImdlbmVyYXRlLXNvdXJjZXMiIGlmPSJVU0UuZG90bmV0IiA+CisgICAgICAgIDxtc2J1aWxkIGJ1aWxkZmlsZT0iJHtzcmN9L21haW4vY3NoYXJwL0V4YW1wbGVMaXN0ZW5lclByb2ovRXhhbXBsZUxpc3RlbmVyUHJvai5jc3Byb2oiID4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJDb25maWd1cmF0aW9uIiB2YWx1ZT0iJHtidWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8L21zYnVpbGQ+CisgICAgICAgIDxtc2J1aWxkIGJ1aWxkZmlsZT0iJHtzcmN9L21haW4vY3NoYXJwL0V4YW1wbGVDbGllbnRQcm9qL0V4YW1wbGVDbGllbnRQcm9qLmNzcHJvaiIgPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDwvbXNidWlsZD4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vdGVzdC9jc2hhcnAvRXhhbXBsZVRlc3RQcm9qL0V4YW1wbGVUZXN0UHJvai5jc3Byb2oiID4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJDb25maWd1cmF0aW9uIiB2YWx1ZT0iJHtidWlsZC50YXJnZXR9IiAvPgorICAgICAgICA8L21zYnVpbGQ+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Jpbn0iID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0V4YW1wbGVMaXN0ZW5lclByb2ovYmluLyR7YnVpbGQudGFyZ2V0fSIgPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2NzaGFycC9FeGFtcGxlQ2xpZW50UHJvai9iaW4vJHtidWlsZC50YXJnZXR9IiA+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1jc2hhcnAiIGRlcGVuZHM9ImJ1aWxkLWNzaGFycC13aXRoLW1vbm8sYnVpbGQtY3NoYXJwLXdpdGgtZG90bmV0IiAvPgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iYnVpbGQtamF2YSxidWlsZC1jc2hhcnAiIC8+CisKKyAgICA8IS0tIHJ1biB1bml0IHRlc3RzIC0tPgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWphdmEiIGRlcGVuZHM9ImJ1aWxkLWphdmEiID4KKyAgICAgICAgPCEtLSBSdW4gVW5pdCBUZXN0cyAtLT4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyIgZGlyPSIke2NsYXNzZXMtdGVzdH0iCisgICAgICAgICAgICBlcnJvclByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIiBmYWlsdXJlUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiID4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXMtdGVzdH0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qYXZhLnJ1bnRpbWV9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyfSIgLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIC8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InRydWUiIHRvZGlyPSIke3Rlc3QtcmVzdWx0c30iID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC1zcmMtamF2YX0iID4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L2JhdGNodGVzdD4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdC1jc2hhcnAiIGRlcGVuZHM9ImJ1aWxkLWNzaGFycCIgaWY9IkJVSUxELmNzaGFycCIgPgorICAgICAgICAgPG51bml0IHhtbG91dD0iJHtudW5pdC1yZXN1bHRzfS9OVW5pdFJlc3VsdHMueG1sIj4KKyAgICAgICAgICAgICA8dGVzdGFzc2VtYmx5IG5hbWU9IiR7c3JjfS90ZXN0L2NzaGFycC9FeGFtcGxlVGVzdFByb2ovYmluLyR7YnVpbGQudGFyZ2V0fS9FeGFtcGxlVGVzdFByb2ouZGxsIiAvPgorICAgICAgICAgPC9udW5pdD4KKworICAgICAgICAgPHhzbHQgc3R5bGU9IiR7RXRjaC5idWlsZFN1cHBvcnREaXJlY3Rvcnl9L05Vbml0VG9KVW5pdC54c2wiCisgICAgICAgICAgICAgICAgIGluPSIke251bml0LXJlc3VsdHN9L05Vbml0UmVzdWx0cy54bWwiIG91dD0iJHt0ZXN0LXJlc3VsdHN9L1RFU1QtTlVuaXRSZXN1bHRzLnhtbCIgLz4KKyAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJidWlsZCx0ZXN0LWphdmEsdGVzdC1jc2hhcnAsZG9uZSIgPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkb25lIiBkZXBlbmRzPSJidWlsZCIgPgorICAgICAgICA8ZWNobz4KKworQnVpbGQgQ29tcGxldGUhCisKK1RvIHJ1biBqYXZhIGV4YW1wbGUgZXhhbXBsZSwgb3BlbiBhIGNtZCB3aW5kb3cgYW5kIHJ1biB0aGVzZQorY29tbWFuZHM6CisKKz4gY2QgdGFyZ2V0XGJpbgorPiBzdGFydCBqYXZhIC1jcCBleGFtcGxlLmphciBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZS5NYWluRXhtYXBsZUxpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGV4YW1wbGUuamFyIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlLk1haW5FeGFtcGxlQ2xpZW50CisKK1RvIHJ1biBjc2hhcnAgZXhhbXBsZToKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IGV4YW1wbGVMaXN0ZW5lci5leGUKKz4gc3RhcnQgZXhhbXBsZUNsaWVudC5leGUKKworTm93IG1vZGlmeSB0aGUgZXhhbXBsZSB0byBpbXBsZW1lbnQgdGhlIHNlcnZpY2UgaG93ZXZlciB5b3UgbGlrZS4KKworWW91IGNhbiBtaXggYW5kIG1hdGNoIHRoZSB2YXJpb3VzIGNsaWVudHMgYW5kIGxpc3RlbmVycy4KKworICAgICAgICA8L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIGJ1aWxkIGV2ZXJ5dGhpbmcgLS0+CisgICAgPHRhcmdldCBuYW1lPSJpbml0LWRlYnVnIiA+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50YXJnZXQiIHZhbHVlPSJEZWJ1ZyIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1yZWxlYXNlIiA+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50YXJnZXQiIHZhbHVlPSJSZWxlYXNlIiAvPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZGlzdC1zcmMiID4KKyAgICAgICAgPGNvcHkgZmlsZT0iZGlzdC1idWlsZC54bWwiIHRvZmlsZT0iJHtkaXN0LXNyY30vYnVpbGQueG1sIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9IkV0Y2guYnVpbGRUb2tlbnMiIC8+CisgICAgICAgIDwvY29weT4gICAgCisgICAgICAgIDxjb3B5IGZpbGU9IlJFQURNRS50eHQiIHRvZmlsZT0iJHtkaXN0LXNyY30vUkVBRE1FLnR4dCIgb3ZlcndyaXRlPSJ0cnVlIiAvPgorICAgICAgICAKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC1zcmN9L3NyYy9tYWluL2V0Y2giIG92ZXJ3cml0ZT0idHJ1ZSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9ldGNoIiA+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmV0Y2giIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgCisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Rpc3Qtc3JjfS9zcmMvbWFpbi9qYXZhIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSIgPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgICAgIAorICAgICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LXNyY30vc3JjL21haW4vY3NoYXJwIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vY3NoYXJwIiA+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmNzIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgICAgIAorICAgICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0fS9leGFtcGxlcy9leGFtcGxlIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LXNyY30iIC8+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZGVidWciIGRlcGVuZHM9ImRpc3Qtc3JjLGluaXQtZGVidWcsdGVzdCIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9ImRpc3Qtc3JjLGluaXQtcmVsZWFzZSx0ZXN0IiAvPgorCisgICAgPCEtLSBjbGVhbiAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiA+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL0V4YW1wbGVDbGllbnRQcm9qL2JpbiIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvRXhhbXBsZUNsaWVudFByb2ovb2JqIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3JjfS9tYWluL2NzaGFycC9FeGFtcGxlTGlzdGVuZXJQcm9qL2JpbiIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvRXhhbXBsZUxpc3RlbmVyUHJvai9vYmoiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwL0V4YW1wbGVUZXN0UHJvai9iaW4iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwL0V4YW1wbGVUZXN0UHJvai9vYmoiIHF1aWV0PSJ0cnVlIiAvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhhbXBsZS9kaXN0LWJ1aWxkLnhtbCBiL2V4YW1wbGVzL2V4YW1wbGUvZGlzdC1idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiMzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4YW1wbGUvZGlzdC1idWlsZC54bWwKQEAgLTAsMCArMSwxNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtZXhhbXBsZS1leGFtcGxlIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJidWlsZCI+CisgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgRXhhbXBsZTwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC5ob21lIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLnZlcnNpb24iIHZhbHVlPSJARXRjaFZlcnNpb25AIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtamF2YS1ydW50aW1lLW5hbWUiIHZhbHVlPSJldGNoLWphdmEtcnVudGltZS0ke2V0Y2gudmVyc2lvbn0uamFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC1hbnQtcGx1Z2luLmphciIgICBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi9ldGNoLWFudC1wbHVnaW4tJHtldGNoLnZlcnNpb259LmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtcnVudGltZS5qYXIiIGxvY2F0aW9uPSIke2V0Y2guaG9tZX0vbGliLyR7ZXRjaC1qYXZhLXJ1bnRpbWUtbmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC5kbGwiICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi9FdGNoLmRsbCIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLW1haW4tZXRjaCIgICAgIGxvY2F0aW9uPSIke3NyY30vbWFpbi9ldGNoIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYy1tYWluLWphdmEiICAgICBsb2NhdGlvbj0iJHtzcmN9L21haW4vamF2YSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMtbWFpbi1jc2hhcnAiICAgbG9jYXRpb249IiR7c3JjfS9tYWluL2NzaGFycCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQiICAgICAgICAgICAgbG9jYXRpb249IiR7YmFzZWRpcn0vdGFyZ2V0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbmVyYXRlZC1zb3VyY2VzIiBsb2NhdGlvbj0iJHt0YXJnZXR9L2dlbmVyYXRlZC1zb3VyY2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbnNyYy1tYWluLWV0Y2gtamF2YSIgbG9jYXRpb249IiR7Z2VuZXJhdGVkLXNvdXJjZXN9L21haW4vZXRjaC9qYXZhIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbnNyYy1tYWluLWV0Y2gtY3NoYXJwIiBsb2NhdGlvbj0iJHtnZW5lcmF0ZWQtc291cmNlc30vbWFpbi9ldGNoL2NzaGFycCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiAgICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJpbiIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2JpbiIvPgorICAgIAorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IkJVSUxELmNzaGFycCIgPgorICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIiAvPgorICAgIDwvY29uZGl0aW9uPiAgICAKKworICAgIDx0YXNrZGVmCisgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL2V0Y2gvdG9vbHMvYW50L2V0Y2gueG1sIgorICAgICAgICBjbGFzc3BhdGg9IiR7ZXRjaC1hbnQtcGx1Z2luLmphcn0iLz4KKworICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImJ1aWxkLWphdmEsIGJ1aWxkLWNzaGFycCwgZG9uZSIvPgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1qYXZhIiBkZXBlbmRzPSJnZW5zcmMtamF2YSI+CisgICAgICAgIDxqYXZhYyBkZXN0ZGlyPSIke2NsYXNzZXN9IiBzb3VyY2U9IjEuNSIgZGVidWc9InRydWUiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZXRjaC1qYXZhLXJ1bnRpbWUuamFyfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjLW1haW4tamF2YX0iLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtnZW5zcmMtbWFpbi1ldGNoLWphdmF9Ii8+CisgICAgICAgIDwvamF2YWM+CisKKyAgICAgICAgPGphciBqYXJmaWxlPSIke2Jpbn0vZXhhbXBsZS5qYXIiPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIgdmFsdWU9IiR7ZXRjaC1qYXZhLXJ1bnRpbWUtbmFtZX0iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlc30iLz4KKyAgICAgICAgPC9qYXI+CisKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YmlufSIgZmlsZT0iJHtldGNoLWphdmEtcnVudGltZS5qYXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvbmUiPgorICAgICAgICA8ZWNobz4KKworVG8gcnVuIGphdmEgZXhhbXBsZSBleGFtcGxlLCBvcGVuIGEgY21kIHdpbmRvdyBhbmQgcnVuIHRoZXNlCitjb21tYW5kczoKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IGphdmEgLWNwIGV4YW1wbGUuamFyIGV0Y2guZXhhbXBsZXMuZXhhbXBsZS5NYWluRXhtYXBsZUxpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIGV4YW1wbGUuamFyIGV0Y2guZXhhbXBsZXMuZXhhbXBsZS5NYWluRXhhbXBsZUNsaWVudAorCitUbyBydW4gY3NoYXJwIGV4YW1wbGU6CisKKz4gY2QgdGFyZ2V0XGJpbgorPiBzdGFydCBleGFtcGxlTGlzdGVuZXIuZXhlCis+IHN0YXJ0IGV4YW1wbGVDbGllbnQuZXhlCisKK05vdyBtb2RpZnkgdGhlIGV4YW1wbGUgdG8gaW1wbGVtZW50IHRoZSBzZXJ2aWNlIGhvd2V2ZXIgeW91IGxpa2UuCisKK1lvdSBjYW4gbWl4IGFuZCBtYXRjaCB0aGUgdmFyaW91cyBjbGllbnRzIGFuZCBsaXN0ZW5lcnMuCisKKyAgICAgICAgPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1jc2hhcnAiIGRlcGVuZHM9ImdlbnNyYy1jc2hhcnAiIGlmPSJCVUlMRC5jc2hhcnAiID4KKyAgICAgICAgPGNzYworICAgICAgICAgICAgICAgIGRlYnVnPSJ0cnVlIgorICAgICAgICAgICAgICAgIHdhcm5MZXZlbD0iMSIKKyAgICAgICAgICAgICAgICB1bnNhZmU9ImZhbHNlIgorICAgICAgICAgICAgICAgIHRhcmdldFR5cGU9ImV4ZSIKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbD0iZmFsc2UiCisgICAgICAgICAgICAgICAgbWFpbkNsYXNzID0gImV0Y2guZXhhbXBsZXMuZXhhbXBsZS5NYWluRXhhbXBsZUNsaWVudCIKKyAgICAgICAgICAgICAgICBkZXN0RmlsZT0iJHtiaW59L2V4YW1wbGVDbGllbnQuZXhlIj4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vZXhhbXBsZUNsaWVudFByb2oiIGluY2x1ZGVzPSIqKi8qLmNzIi8+CisgICAgICAgICAgICA8c3JjIGRpcj0iJHtzcmMtbWFpbi1jc2hhcnB9L2V0Y2guZXhhbXBsZXMuZXhhbXBsZSIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke2dlbnNyYy1tYWluLWV0Y2gtY3NoYXJwfSIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxyZWZlcmVuY2UgZmlsZT0iJHtldGNoLmRsbH0iLz4KKyAgICAgICAgPC9jc2M+CisKKyAgICAgICAgPGNzYworICAgICAgICAgICAgICAgIGRlYnVnPSJ0cnVlIgorICAgICAgICAgICAgICAgIHdhcm5MZXZlbD0iMSIKKyAgICAgICAgICAgICAgICB1bnNhZmU9ImZhbHNlIgorICAgICAgICAgICAgICAgIHRhcmdldFR5cGU9ImV4ZSIKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbD0iZmFsc2UiCisgICAgICAgICAgICAgICAgbWFpbkNsYXNzID0gImV0Y2guZXhhbXBsZXMuZXhhbXBsZS5NYWluRXhhbXBsZUxpc3RlbmVyIgorICAgICAgICAgICAgICAgIGRlc3RGaWxlPSIke2Jpbn0vZXhhbXBsZUxpc3RlbmVyLmV4ZSI+CisgICAgICAgICAgICA8c3JjIGRpcj0iJHtzcmMtbWFpbi1jc2hhcnB9L2V4YW1wbGVMaXN0ZW5lclByb2oiIGluY2x1ZGVzPSIqKi8qLmNzIi8+CisgICAgICAgICAgICA8c3JjIGRpcj0iJHtzcmMtbWFpbi1jc2hhcnB9L2V0Y2guZXhhbXBsZXMuZXhhbXBsZSIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke2dlbnNyYy1tYWluLWV0Y2gtY3NoYXJwfSIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxyZWZlcmVuY2UgZmlsZT0iJHtldGNoLmRsbH0iLz4KKyAgICAgICAgPC9jc2M+CisKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YmlufSIgZmlsZT0iJHtldGNoLmRsbH0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZ2Vuc3JjIiBkZXBlbmRzPSJnZW5zcmMtamF2YSwgZ2Vuc3JjLWNzaGFycCIvPgorCisgICAgPHRhcmdldCBuYW1lPSJnZW5zcmMtamF2YSIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxldGNoCisgICAgICAgICAgICBob21lPSIke2V0Y2guaG9tZX0iCisgICAgICAgICAgICBiaW5kaW5nPSJqYXZhIgorICAgICAgICAgICAgcXVpZXQ9InRydWUiCisgICAgICAgICAgICBvdXRwdXREaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1qYXZhfSIKKyAgICAgICAgICAgIGZpbGU9IiR7c3JjLW1haW4tZXRjaH0vRXhhbXBsZS5ldGNoIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbnNyYy1jc2hhcnAiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8ZXRjaAorICAgICAgICAgICAgaG9tZT0iJHtldGNoLmhvbWV9IgorICAgICAgICAgICAgYmluZGluZz0iY3NoYXJwIgorICAgICAgICAgICAgcXVpZXQ9InRydWUiCisgICAgICAgICAgICBvdXRwdXREaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9IgorICAgICAgICAgICAgZmlsZT0iJHtzcmMtbWFpbi1ldGNofS9FeGFtcGxlLmV0Y2giLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbmVyYXRlZC1zb3VyY2VzfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbnNyYy1tYWluLWV0Y2gtamF2YX0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWNzaGFycH0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Jpbn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9Ii8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9FeGFtcGxlQ2xpZW50UHJvai9FeGFtcGxlQ2xpZW50UHJvai5jc3Byb2ogYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9FeGFtcGxlQ2xpZW50UHJvai9FeGFtcGxlQ2xpZW50UHJvai5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwZGM5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL0V4YW1wbGVDbGllbnRQcm9qL0V4YW1wbGVDbGllbnRQcm9qLmNzcHJvagpAQCAtMCwwICsxLDExNCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezM4OTUzQkMwLUE4MzQtNDkzOS1BMjVGLThDN0YyQzdGODc1OH08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+ZXRjaC5leGFtcGxlcy5leGFtcGxlPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+RXhhbXBsZUNsaWVudDwvQXNzZW1ibHlOYW1lPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxCYXNlRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5CYXNlRXhhbXBsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcQmFzZUV4YW1wbGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+QmFzZUV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXEV4YW1wbGUuY3MiPgorICAgICAgPExpbms+RXhhbXBsZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5FeGFtcGxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxFeGFtcGxlSGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPkV4YW1wbGVIZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXEV4YW1wbGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+RXhhbXBsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcUmVtb3RlRXhhbXBsZS5jcyI+CisgICAgICA8TGluaz5SZW1vdGVFeGFtcGxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxSZW1vdGVFeGFtcGxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZUV4YW1wbGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFJlbW90ZUV4YW1wbGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+UmVtb3RlRXhhbXBsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcU3R1YkV4YW1wbGUuY3MiPgorICAgICAgPExpbms+U3R1YkV4YW1wbGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFN0dWJFeGFtcGxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlN0dWJFeGFtcGxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxTdHViRXhhbXBsZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5TdHViRXhhbXBsZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcVmFsdWVGYWN0b3J5RXhhbXBsZS5jcyI+CisgICAgICA8TGluaz5WYWx1ZUZhY3RvcnlFeGFtcGxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLmV4YW1wbGVcSW1wbEV4YW1wbGVDbGllbnQuY3MiPgorICAgICAgPExpbms+SW1wbEV4YW1wbGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2guZXhhbXBsZXMuZXhhbXBsZVxNYWluRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5NYWluRXhhbXBsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXC4uXC4uXGJpbmRpbmctY3NoYXJwXHJ1bnRpbWVcc3JjXG1haW5cY3NoYXJwXEV0Y2hQcm9qLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkV0Y2hQcm9qPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvRXhhbXBsZUNsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9FeGFtcGxlQ2xpZW50UHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMzNjhhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvRXhhbXBsZUNsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorLy8gdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRXhhbXBsZSBDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiRXhhbXBsZSBDbGllbnQgRXhlY3V0YWJsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkNpc2NvIFN5c3RlbXMgSW5jIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiRXRjaCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiOGRlMmY2ODMtNmJkYy00NTU5LTg5MGItYjE4OGQ3ZmNjNzkwIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL0V4YW1wbGVMaXN0ZW5lclByb2ovRXhhbXBsZUxpc3RlbmVyUHJvai5jc3Byb2ogYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9FeGFtcGxlTGlzdGVuZXJQcm9qL0V4YW1wbGVMaXN0ZW5lclByb2ouY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGEyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9FeGFtcGxlTGlzdGVuZXJQcm9qL0V4YW1wbGVMaXN0ZW5lclByb2ouY3Nwcm9qCkBAIC0wLDAgKzEsMTE0IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57N0VFQTJGNDctMEQ5Ni00MTg3LUI5RUYtQ0EwQjlFODM5ODQxfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5ldGNoLmV4YW1wbGVzLmV4YW1wbGU8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5FeGFtcGxlTGlzdGVuZXI8L0Fzc2VtYmx5TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcQmFzZUV4YW1wbGVDbGllbnQuY3MiPgorICAgICAgPExpbms+QmFzZUV4YW1wbGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXEJhc2VFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkJhc2VFeGFtcGxlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxFeGFtcGxlLmNzIj4KKyAgICAgIDxMaW5rPkV4YW1wbGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXEV4YW1wbGVDbGllbnQuY3MiPgorICAgICAgPExpbms+RXhhbXBsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcRXhhbXBsZUhlbHBlci5jcyI+CisgICAgICA8TGluaz5FeGFtcGxlSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFJlbW90ZUV4YW1wbGUuY3MiPgorICAgICAgPExpbms+UmVtb3RlRXhhbXBsZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcUmVtb3RlRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVFeGFtcGxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxSZW1vdGVFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZUV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFN0dWJFeGFtcGxlLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJFeGFtcGxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxTdHViRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5TdHViRXhhbXBsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcU3R1YkV4YW1wbGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+U3R1YkV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFZhbHVlRmFjdG9yeUV4YW1wbGUuY3MiPgorICAgICAgPExpbms+VmFsdWVGYWN0b3J5RXhhbXBsZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC5leGFtcGxlcy5leGFtcGxlXEltcGxFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkltcGxFeGFtcGxlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLmV4YW1wbGVcTWFpbkV4YW1wbGVMaXN0ZW5lci5jcyI+CisgICAgICA8TGluaz5NYWluRXhhbXBsZUxpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cYmluZGluZy1jc2hhcnBccnVudGltZVxzcmNcbWFpblxjc2hhcnBcRXRjaFByb2ouY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PnswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RXRjaFByb2o8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9FeGFtcGxlTGlzdGVuZXJQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvRXhhbXBsZUxpc3RlbmVyUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGYzMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvRXhhbXBsZUxpc3RlbmVyUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQ4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJFeGFtcGxlIExpc3RlbmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkV4YW1wbGUgTGlzdGVuZXIgRXhlY3V0YWJsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiRXRjaCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiY2YzMzkyMzMtMTE4OS00M2I4LWI2MDktZGQ3YjdiMmMyYTQyIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuZXhhbXBsZS9JbXBsRXhhbXBsZUNsaWVudC5jcyBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuZXhhbXBsZS9JbXBsRXhhbXBsZUNsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E0YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5leGFtcGxlL0ltcGxFeGFtcGxlQ2xpZW50LmNzCkBAIC0wLDAgKzEsNDAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZQoreworCS8vLzxzdW1tYXJ5PkltcGxlbWVudGF0aW9uIGZvciBJbXBsRXhhbXBsZUNsaWVudDwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgSW1wbEV4YW1wbGVDbGllbnQgOiBCYXNlRXhhbXBsZUNsaWVudAorCXsKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxFeGFtcGxlQ2xpZW50Ljwvc3VtbWFyeT4KKyAJCS8vLyA8cGFyYW0gbmFtZT0ic2VydmVyIj5hIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0bworIAkJLy8vIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuPC9wYXJhbT4KKwkJcHVibGljIEltcGxFeGFtcGxlQ2xpZW50KFJlbW90ZUV4YW1wbGVTZXJ2ZXIgc2VydmVyKQorCQl7CisJCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJfQorCQkKKwkJLy8vIDxzdW1tYXJ5PkEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHNlc3Npb24uIFVzZSB0aGlzIHRvCisgCQkvLy8gc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci48L3N1bW1hcnk+CisJCXByaXZhdGUgcmVhZG9ubHkgUmVtb3RlRXhhbXBsZVNlcnZlciBzZXJ2ZXI7CisJCisJCS8vIFRPRE86IEltcGxlbWVudCBkZWxlZ2F0ZXMgb3IgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBFeGFtcGxlQ2xpZW50CisJCS8vIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlcgkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5leGFtcGxlL0ltcGxFeGFtcGxlU2VydmVyLmNzIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5leGFtcGxlL0ltcGxFeGFtcGxlU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTMwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmV4YW1wbGUvSW1wbEV4YW1wbGVTZXJ2ZXIuY3MKQEAgLTAsMCArMSw0MCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAorbmFtZXNwYWNlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlCit7CisJLy8vPHN1bW1hcnk+SW1wbGVtZW50YXRpb24gZm9yIEltcGxFeGFtcGxlU2VydmVyPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBJbXBsRXhhbXBsZVNlcnZlciA6IEJhc2VFeGFtcGxlU2VydmVyCisJeworCQkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgSW1wbEV4YW1wbGVTZXJ2ZXIuPC9zdW1tYXJ5PgorIAkJLy8vIDxwYXJhbSBuYW1lPSJjbGllbnQiPmEgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IHNlc3Npb24uIFVzZSB0aGlzIHRvCisgCQkvLy8gc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC48L3BhcmFtPgorCQlwdWJsaWMgSW1wbEV4YW1wbGVTZXJ2ZXIoUmVtb3RlRXhhbXBsZUNsaWVudCBjbGllbnQpCisJCXsKKwkJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCQl9CisJCQorCQkvLy8gPHN1bW1hcnk+QSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgc2Vzc2lvbi4gVXNlIHRoaXMgdG8KKyAJCS8vLyBzZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50Ljwvc3VtbWFyeT4KKwkJcHJpdmF0ZSByZWFkb25seSBSZW1vdGVFeGFtcGxlQ2xpZW50IGNsaWVudDsKKwkKKwkJLy8gVE9ETzogSW1wbGVtZW50IGRlbGVnYXRlcyBvciBwcm92aWRlIGltcGxlbWVudGF0aW9uIG9mIEV4YW1wbGVTZXJ2ZXIKKwkJLy8gbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50CQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmV4YW1wbGUvTWFpbkV4YW1wbGVDbGllbnQuY3MgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmV4YW1wbGUvTWFpbkV4YW1wbGVDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3M2NiNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMuZXhhbXBsZS9NYWluRXhhbXBsZUNsaWVudC5jcwpAQCAtMCwwICsxLDUzIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZQoreworCS8vLzxzdW1tYXJ5Pk1haW4gaW1wbGVtZW50YXRpb24gZm9yIEV4YW1wbGVDbGllbnQuPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBNYWluRXhhbXBsZUNsaWVudCA6IEV4YW1wbGVIZWxwZXIuRXhhbXBsZUNsaWVudEZhY3RvcnkKKwl7CisJCS8vLzxzdW1tYXJ5Pk1haW4gZm9yIEV4YW1wbGVDbGllbnQ8L3N1bW1hcnk+CisJCS8vLzxwYXJhbSBuYW1lPSJhcmdzIj5Db21tYW5kIExpbmUgQXJndW1lbnRzPC9wYXJhbT4KKwkJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oU3RyaW5nW10gYXJncykKKwkJeworCQkJLy8gVE9ETzogQ2hhbmdlIHRvIGNvcnJlY3QgVVJJCisJCQlzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAyIjsKKwkJCQorCQkJUmVtb3RlRXhhbXBsZVNlcnZlciBzZXJ2ZXIgPSBFeGFtcGxlSGVscGVyLk5ld1NlcnZlciggdXJpLCBudWxsLCBuZXcgTWFpbkV4YW1wbGVDbGllbnQoKSk7CisJCQorCQkJLy8gQ29ubmVjdCB0byB0aGUgc2VydmljZQorCQkJc2VydmVyLl9TdGFydEFuZFdhaXRVcCggNDAwMCApOworCisJCQkvLyBUT0RPOiBJbnNlcnQgWW91ciBDb2RlIEhlcmUKKworCQkJLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBzZXJ2aWNlCisJCQlzZXJ2ZXIuX1N0b3BBbmRXYWl0RG93biggNDAwMCApOwkJCQorCQl9CisKKwkJLy8vPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIEV4YW1wbGVDbGllbnQuPC9zdW1tYXJ5PgorCQkvLy88cGFyYW0gbmFtZT0ic2VydmVyIj5SZWZlcmVuY2UgdG8gcmVtb3RlIHNlcnZpY2U8L3BhcmFtPgorCQkvLy88cmV0dXJucz5DbGllbnQgSW1wbGVtZW50YXRpb248L3JldHVybnM+CisJCXB1YmxpYyBFeGFtcGxlQ2xpZW50IE5ld0V4YW1wbGVDbGllbnQoIFJlbW90ZUV4YW1wbGVTZXJ2ZXIgc2VydmVyICkKKwkJeworCQkJcmV0dXJuIG5ldyBJbXBsRXhhbXBsZUNsaWVudCggc2VydmVyICk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5leGFtcGxlL01haW5FeGFtcGxlTGlzdGVuZXIuY3MgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9ldGNoLmV4YW1wbGVzLmV4YW1wbGUvTWFpbkV4YW1wbGVMaXN0ZW5lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGYxMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5leGFtcGxlL01haW5FeGFtcGxlTGlzdGVuZXIuY3MKQEAgLTAsMCArMSw1MCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGUKK3sKKwkvLy88c3VtbWFyeT5NYWluIGltcGxlbWVudGF0aW9uIGZvciBFeGFtcGxlTGlzdGVuZXIuPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBNYWluRXhhbXBsZUxpc3RlbmVyIDogRXhhbXBsZUhlbHBlci5FeGFtcGxlU2VydmVyRmFjdG9yeQorCXsKKyAJCS8vLzxzdW1tYXJ5Pk1haW4gZm9yIEV4YW1wbGVMaXN0ZW5lci48L3N1bW1hcnk+CisJCS8vLzxwYXJhbSBuYW1lPSJhcmdzIj5Db21tYW5kIExpbmUgQXJndW1lbnRzPC9wYXJhbT4KKwkJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oU3RyaW5nW10gYXJncykKKwkJeworCQkJLy8gVE9ETzogQ2hhbmdlIHRvIGNvcnJlY3QgVVJJCisJCQlzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAyIjsKKwkJCQorICAgICAgICAgICAgU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IEV4YW1wbGVIZWxwZXIuTmV3TGlzdGVuZXIodXJpLCBudWxsLCBuZXcgTWFpbkV4YW1wbGVMaXN0ZW5lcigpKTsKKwkJCQorCQkJLy8gU3RhcnQgdGhlIExpc3RlbmVyCisJCQlsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwkJfQorCisJCS8vLzxzdW1tYXJ5PlJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBFeGFtcGxlU2VydmVyLjwvc3VtbWFyeT4KKwkJLy8vPHBhcmFtIG5hbWU9ImNsaWVudCI+UmVmZXJlbmNlIHRvIHJlbW90ZSBzZXJ2aWNlPC9wYXJhbT4KKwkJLy8vPHJldHVybnM+U2VydmVyIEltcGxlbWVudGF0aW9uPC9yZXR1cm5zPgorCQlwdWJsaWMgRXhhbXBsZVNlcnZlciBOZXdFeGFtcGxlU2VydmVyKCBSZW1vdGVFeGFtcGxlQ2xpZW50IGNsaWVudCApCisJCXsKKwkJCXJldHVybiBuZXcgSW1wbEV4YW1wbGVTZXJ2ZXIoIGNsaWVudCApOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vZXRjaC9FeGFtcGxlLmV0Y2ggYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2V0Y2gvRXhhbXBsZS5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNmM3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2V0Y2gvRXhhbXBsZS5ldGNoCkBAIC0wLDAgKzEsMTE2IEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlCisKKy8qKgorICogU2VydmljZSB2ZXJzaW9uIG9mIGhlbGxvIHdvcmxkLgorICovCitzZXJ2aWNlIEV4YW1wbGUKK3sKKwkvKiogdGhlIG51bWJlciBvZiB0aW1lcyB0byBwZXJmb3JtIHRoZSBhY3Rpb24gKi8KKwljb25zdCBpbnQgQ09VTlQgPSA0CisJCisJLyoqIGEgc2ltcGxlIHZpZXcgb2YgdGltZSAqLworCWVudW0gVGltZXMKKwkoCisJCS8qKiB0aGUgcGFzdCAqLworCQlZRVNURVJEQVksCisJCS8qKiByaWdodCBub3cgKi8KKwkJVE9EQVksCisJCS8qKiB0aGUgZnV0dXJlICovCisJCVRPTU9SUk9XCisJKQorCQorCS8qKiBhIHdheSB0byBzcGVhayBhYm91dCBwbGFjZXMgKi8KKwlzdHJ1Y3QgUG9pbnQKKwkoCisJCS8qKiB0aGUgeC1jb29yZGluYXRlIHZhbHVlICovCisJCWRvdWJsZSB4LAorCQkvKiogdGhlIHktY29vcmRpbmF0ZSB2YWx1ZSAqLworCQlkb3VibGUgeSwKKwkJLyoqIHRoZSB6LWNvb3JkaW5hdGUgdmFsdWUgKi8KKwkJZG91YmxlIHoKKwkpCisJCisJLyoqCisJICogRXhjZXB0aW9uIHRocm93biBpZiBwaW5nIGRvZXNuJ3Qgd29yay4KKwkgKiBAcGFyYW0gbXNnIHRoZSBleHBsYW5hdGlvbi4KKwkgKi8KKwlleGNlcHRpb24gUG9uZ0V4Y2VwdGlvbiAoIHN0cmluZyBtc2cgKQorCQorCS8qKgorCSAqIFNheXMgaGVsbG8gdG8gdGhlIHNlcnZlci4KKwkgKiBAcGFyYW0gbXNnIGEgZ3JlZXRpbmcgZm9yIHRoZSBzZXJ2ZXIuCisJICogQHBhcmFtIGQgdGhlIGN1cnJlbnQgZGF0ZS4KKwkgKiBAcmV0dXJuIHRoZSBpZCBvZiBvdXIgaGVsbG8KKwkgKi8KKwlAVGltZW91dCggMTIzNCApCisJQERpcmVjdGlvbiggU2VydmVyICkKKwlpbnQgaGVsbG9TZXJ2ZXIoIHN0cmluZyBtc2csIERhdGV0aW1lIGQgKQorCQorCS8qKgorCSAqIFNheXMgaGVsbG8gdG8gdGhlIGNsaWVudC4KKwkgKiBAcGFyYW0gbXNnIGEgZ3JlZXRpbmcgZm9yIHRoZSBjbGllbnQuCisJICogQHJldHVybiB0aGUgaWQgb2Ygb3VyIGhlbGxvCisJICovCisJQFRpbWVvdXQoIDIzNDUgKQorCUBEaXJlY3Rpb24oIENsaWVudCApCisJaW50IGhlbGxvQ2xpZW50KCBzdHJpbmcgbXNnICkKKwkKKwkvKioKKwkgKiBTYXlzIGhlbGxvIHRvIHRoZSBjbGllbnQgb3Igc2VydmVyLgorCSAqIEBwYXJhbSBtc2cgYSBncmVldGluZyBmb3IgdGhlIGNsaWVudCBvciBzZXJ2ZXIuCisJICogQHJldHVybiB0aGUgaWQgb2Ygb3VyIGhlbGxvCisJICovCisJQFRpbWVvdXQoIDM0NTYgKQorCUBEaXJlY3Rpb24oIEJvdGggKQorCWludCBoZWxsbyggc3RyaW5nIG1zZyApCisJCisJLyoqCisJICogU2F5cyBob3dkeSB0byB0aGUgc2VydmVyLiBPbmV3YXkuCisJICogQHBhcmFtIG1zZyBhIGdyZWV0aW5nIGZvciB0aGUgc2VydmVyLgorCSAqLworCUBPbmV3YXkKKwlARGlyZWN0aW9uKCBTZXJ2ZXIgKQorCXZvaWQgaG93ZHlTZXJ2ZXIoIHN0cmluZyBtc2cgKQorCQorCS8qKgorCSAqIFNheXMgaG93ZHkgdG8gdGhlIGNsaWVudC4gT25ld2F5LgorCSAqIEBwYXJhbSBtc2cgYSBncmVldGluZyBmb3IgdGhlIGNsaWVudC4KKwkgKi8KKwlAT25ld2F5CisJQERpcmVjdGlvbiggQ2xpZW50ICkKKwl2b2lkIGhvd2R5Q2xpZW50KCBzdHJpbmcgbXNnICkKKwkKKwkvKioKKwkgKiBTYXlzIGhvd2R5IHRvIHRoZSBjbGllbnQgb3Igc2VydmVyLiBPbmV3YXkuCisJICogQHBhcmFtIG1zZyBhIGdyZWV0aW5nIGZvciB0aGUgY2xpZW50IG9yIHNlcnZlci4KKwkgKi8KKwlAT25ld2F5CisJQERpcmVjdGlvbiggQm90aCApCisJdm9pZCBob3dkeSggc3RyaW5nIG1zZyApCisJCisJLyoqCisJICogUGluZ3MgdGhlIG90aGVyIHNpZGUuCisJICogQHRocm93cyBQb25nRXhjZXB0aW9uCisJICovCisJQFRpbWVvdXQoIDQ1NjcgKQorCUBEaXJlY3Rpb24oIEJvdGggKQorCUBBc3luY1JlY2VpdmVyKCBRdWV1ZWQgKQorCXZvaWQgcGluZygpIHRocm93cyBQb25nRXhjZXB0aW9uCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2V4YW1wbGUvSW1wbEV4YW1wbGVDbGllbnQuamF2YSBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZXhhbXBsZS9JbXBsRXhhbXBsZUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTE2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2V4YW1wbGUvSW1wbEV4YW1wbGVDbGllbnQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGU7CisKKy8qKgorICogWW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgQmFzZUV4YW1wbGVDbGllbnQuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KKyAqLworcHVibGljIGNsYXNzIEltcGxFeGFtcGxlQ2xpZW50IGV4dGVuZHMgQmFzZUV4YW1wbGVDbGllbnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsRXhhbXBsZUNsaWVudC4KKwkgKgorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgc2VydmVyLgorCSAqLworCXB1YmxpYyBJbXBsRXhhbXBsZUNsaWVudCggUmVtb3RlRXhhbXBsZVNlcnZlciBzZXJ2ZXIgKQorCXsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCQorCS8qKgorCSAqIEEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncyggInVudXNlZCIgKQorCXByaXZhdGUgZmluYWwgUmVtb3RlRXhhbXBsZVNlcnZlciBzZXJ2ZXI7CisKKwkvLyBUT0RPIGluc2VydCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgRXhhbXBsZUNsaWVudAorCS8vIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2V4YW1wbGUvSW1wbEV4YW1wbGVTZXJ2ZXIuamF2YSBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZXhhbXBsZS9JbXBsRXhhbXBsZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjYwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2V4YW1wbGUvSW1wbEV4YW1wbGVTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGU7CisKKy8qKgorICogWW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgQmFzZUV4YW1wbGVTZXJ2ZXIuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4KKyAqLworcHVibGljIGNsYXNzIEltcGxFeGFtcGxlU2VydmVyIGV4dGVuZHMgQmFzZUV4YW1wbGVTZXJ2ZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsRXhhbXBsZVNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBjbGllbnQgYSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgY2xpZW50LgorCSAqLworCXB1YmxpYyBJbXBsRXhhbXBsZVNlcnZlciggUmVtb3RlRXhhbXBsZUNsaWVudCBjbGllbnQgKQorCXsKKwkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CisJfQorCQorCS8qKgorCSAqIEEgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncyggInVudXNlZCIgKQorCXByaXZhdGUgZmluYWwgUmVtb3RlRXhhbXBsZUNsaWVudCBjbGllbnQ7CisKKwkvLyBUT0RPIGluc2VydCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgRXhhbXBsZVNlcnZlcgorCS8vIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2V4YW1wbGUvTWFpbkV4YW1wbGVDbGllbnQuamF2YSBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZXhhbXBsZS9NYWluRXhhbXBsZUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzZjODYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL2V4YW1wbGUvTWFpbkV4YW1wbGVDbGllbnQuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGU7CisKKy8qKgorICogTWFpbiBwcm9ncmFtIGZvciBFeGFtcGxlQ2xpZW50LiBUaGlzIHByb2dyYW0gbWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZQorICogbGlzdGVuZXIgY3JlYXRlZCBieSBNYWluRXhhbXBsZUxpc3RlbmVyLgorICovCitwdWJsaWMgY2xhc3MgTWFpbkV4YW1wbGVDbGllbnQgaW1wbGVtZW50cyBFeGFtcGxlSGVscGVyLkV4YW1wbGVDbGllbnRGYWN0b3J5Cit7CisJLyoqCisJICogTWFpbiBwcm9ncmFtIGZvciBFeGFtcGxlQ2xpZW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFRPRE8gQ2hhbmdlIHRvIGNvcnJlY3QgVVJJCisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQkKKwkJUmVtb3RlRXhhbXBsZVNlcnZlciBzZXJ2ZXIgPSBFeGFtcGxlSGVscGVyLm5ld1NlcnZlciggdXJpLCBudWxsLAorCQkJbmV3IE1haW5FeGFtcGxlQ2xpZW50KCkgKTsKKworCQkvLyBDb25uZWN0IHRvIHRoZSBzZXJ2aWNlCisJCXNlcnZlci5fc3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKworCQkvLyBUT0RPIEluc2VydCBZb3VyIENvZGUgSGVyZQorCisJCS8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmljZQorCQlzZXJ2ZXIuX3N0b3BBbmRXYWl0RG93biggNDAwMCApOworCX0KKworCXB1YmxpYyBFeGFtcGxlQ2xpZW50IG5ld0V4YW1wbGVDbGllbnQoIFJlbW90ZUV4YW1wbGVTZXJ2ZXIgc2VydmVyICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBJbXBsRXhhbXBsZUNsaWVudCggc2VydmVyICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9leGFtcGxlL01haW5FeGFtcGxlTGlzdGVuZXIuamF2YSBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZXhhbXBsZS9NYWluRXhhbXBsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4ZGQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZXhhbXBsZS9NYWluRXhhbXBsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgRXhhbXBsZVNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW5FeGFtcGxlQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpbkV4YW1wbGVMaXN0ZW5lciBpbXBsZW1lbnRzIEV4YW1wbGVIZWxwZXIuRXhhbXBsZVNlcnZlckZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIEV4YW1wbGVTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyBDaGFuZ2UgdG8gY29ycmVjdCBVUkkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly8wLjAuMC4wOjQwMDEiOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IEV4YW1wbGVIZWxwZXIubmV3TGlzdGVuZXIoIHVyaSwgbnVsbCwKKwkJCW5ldyBNYWluRXhhbXBsZUxpc3RlbmVyKCkgKTsKKworCQkvLyBTdGFydCB0aGUgTGlzdGVuZXIKKwkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisJfQorCisJcHVibGljIEV4YW1wbGVTZXJ2ZXIgbmV3RXhhbXBsZVNlcnZlciggUmVtb3RlRXhhbXBsZUNsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsRXhhbXBsZVNlcnZlciggY2xpZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhhbXBsZS9zcmMvdGVzdC9jc2hhcnAvRXhhbXBsZVRlc3RQcm9qL0V4YW1wbGVUZXN0UHJvai5jc3Byb2ogYi9leGFtcGxlcy9leGFtcGxlL3NyYy90ZXN0L2NzaGFycC9FeGFtcGxlVGVzdFByb2ovRXhhbXBsZVRlc3RQcm9qLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2M2YThiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvdGVzdC9jc2hhcnAvRXhhbXBsZVRlc3RQcm9qL0V4YW1wbGVUZXN0UHJvai5jc3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjUwNzI3PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnszNjk5MUFDNi0yMURFLTRGN0EtODY3Mi04Q0ZDQzhBRjcwQzd9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5FeGFtcGxlVGVzdFByb2o8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5FeGFtcGxlVGVzdFByb2o8L0Fzc2VtYmx5TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yaywgVmVyc2lvbj0yLjQuNy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTk2ZDA5YTFlYjdmNDRhNzcsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxIaW50UGF0aD4kKE5VTklUX0hPTUUpXGJpblxudW5pdC5mcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcQmFzZUV4YW1wbGVDbGllbnQuY3MiPgorICAgICAgPExpbms+QmFzZUV4YW1wbGVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXEJhc2VFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkJhc2VFeGFtcGxlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxFeGFtcGxlLmNzIj4KKyAgICAgIDxMaW5rPkV4YW1wbGUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXEV4YW1wbGVDbGllbnQuY3MiPgorICAgICAgPExpbms+RXhhbXBsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcRXhhbXBsZUhlbHBlci5jcyI+CisgICAgICA8TGluaz5FeGFtcGxlSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFJlbW90ZUV4YW1wbGUuY3MiPgorICAgICAgPExpbms+UmVtb3RlRXhhbXBsZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcUmVtb3RlRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVFeGFtcGxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxSZW1vdGVFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZUV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFN0dWJFeGFtcGxlLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJFeGFtcGxlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMuZXhhbXBsZVxTdHViRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5TdHViRXhhbXBsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGVcU3R1YkV4YW1wbGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+U3R1YkV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5leGFtcGxlXFZhbHVlRmFjdG9yeUV4YW1wbGUuY3MiPgorICAgICAgPExpbms+VmFsdWVGYWN0b3J5RXhhbXBsZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC5leGFtcGxlcy5leGFtcGxlXEltcGxFeGFtcGxlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkltcGxFeGFtcGxlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLmV4YW1wbGVzLmV4YW1wbGVcSW1wbEV4YW1wbGVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+SW1wbEV4YW1wbGVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2guZXhhbXBsZXMuZXhhbXBsZVxNYWluRXhhbXBsZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5NYWluRXhhbXBsZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC5leGFtcGxlcy5leGFtcGxlXE1haW5FeGFtcGxlTGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+TWFpbkV4YW1wbGVMaXN0ZW5lci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC5leGFtcGxlcy5leGFtcGxlXFRlc3RFeGFtcGxlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlRlc3RFeGFtcGxlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cYmluZGluZy1jc2hhcnBccnVudGltZVxzcmNcbWFpblxjc2hhcnBcRXRjaFByb2ouY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PnswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RXRjaFByb2o8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGFtcGxlL3NyYy90ZXN0L2NzaGFycC9FeGFtcGxlVGVzdFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9leGFtcGxlcy9leGFtcGxlL3NyYy90ZXN0L2NzaGFycC9FeGFtcGxlVGVzdFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlYTdkYQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL3Rlc3QvY3NoYXJwL0V4YW1wbGVUZXN0UHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJFeGFtcGxlVGVzdFByb2oiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiRXhhbXBsZVRlc3RQcm9qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgqSAyMDA4IildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJmNjdjM2IyMS00YjBlLTQxMzUtOTliMi0zMzg2MDM5MDg2YmIiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbiAKKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMgCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhhbXBsZS9zcmMvdGVzdC9jc2hhcnAvZXRjaC5leGFtcGxlcy5leGFtcGxlL1Rlc3RFeGFtcGxlU2VydmVyLmNzIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvdGVzdC9jc2hhcnAvZXRjaC5leGFtcGxlcy5leGFtcGxlL1Rlc3RFeGFtcGxlU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZWJmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGFtcGxlL3NyYy90ZXN0L2NzaGFycC9ldGNoLmV4YW1wbGVzLmV4YW1wbGUvVGVzdEV4YW1wbGVTZXJ2ZXIuY3MKQEAgLTAsMCArMSw5NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGUKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVW5pdCBUZXN0cyB0byB0ZXN0IEV4YW1wbGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RFeGFtcGxlU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBSZW1vdGVFeGFtcGxlU2VydmVyIHNlcnZlcjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBTdGFydExpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAxMCI7CisKKyAgICAgICAgICAgIE1haW5FeGFtcGxlTGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkV4YW1wbGVMaXN0ZW5lcigpOworICAgICAgICAgICAgbGlzdGVuZXIgPSBFeGFtcGxlSGVscGVyLk5ld0xpc3RlbmVyKHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkpOworCisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJMaXN0ZW5lciBTdGFydGVkIik7CisKKyAgICAgICAgfQorCisgICAgICAgIFtTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgTWFrZUNvbm5lY3Rpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDEwIjsKKworICAgICAgICAgICAgTWFpbkV4YW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IE1haW5FeGFtcGxlQ2xpZW50KCk7CisgICAgICAgICAgICBzZXJ2ZXIgPSBFeGFtcGxlSGVscGVyLk5ld1NlcnZlcih1cmksIG51bGwsIGNsaWVudCk7CisKKyAgICAgICAgICAgIHNlcnZlci5fU3RhcnRBbmRXYWl0VXAoNDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdENvbm5lY3Rpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHNlcnZlcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVhckRvd25dCisgICAgICAgIHB1YmxpYyB2b2lkIENsb3NlQ29ubmVjdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuX1N0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Rml4dHVyZVRlYXJEb3duXQorICAgICAgICBwdWJsaWMgdm9pZCBTdG9wTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworCisKKyAgICB9CisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4YW1wbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZXhhbXBsZS9UZXN0RXhhbXBsZVNlcnZlci5qYXZhIGIvZXhhbXBsZXMvZXhhbXBsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9leGFtcGxlL1Rlc3RFeGFtcGxlU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MTZhOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4YW1wbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvZXhhbXBsZS9UZXN0RXhhbXBsZVNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLmV4YW1wbGU7CisKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiAKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RXhhbXBsZVNlcnZlcgoreworCQorCS8qKiB0cmFuc3BvcnQgKi8KKwlwdWJsaWMgc3RhdGljIFNlcnZlckZhY3RvcnkgbGlzdGVuZXI7CisJCisJUmVtb3RlRXhhbXBsZVNlcnZlciBzZXJ2ZXI7CisKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLmFkZFNpbmsobnVsbCk7CisJCUxvZy5yZXBvcnQoIlN0YXJ0RXhhbXBsZUxpc3RlbmVyIik7CisJCQkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDgwMCI7CisJCU1haW5FeGFtcGxlTGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkV4YW1wbGVMaXN0ZW5lcigpOworCQlsaXN0ZW5lciA9IEV4YW1wbGVIZWxwZXIubmV3TGlzdGVuZXIoIHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkgKTsKKworCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwkKKwkJTG9nLnJlcG9ydCggIlN0YXJ0RXhhbXBsZUxpc3RlbmVyIiwKKwkJCQkic3RhdHVzIiwgInVwIiwKKwkJCQkibGlzdGVuZXIiLCBsaXN0ZW5lciApOworCX0KKworCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCXsKKwkJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDAgKTsKKwkJCWxpc3RlbmVyID0gbnVsbDsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBDb25uZWN0IGNsaWVudCB0byBzZXJ2ZQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIG1ha2VDb25uZWN0aW9uKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDgwMCI7CisKKwkJc2VydmVyID0gRXhhbXBsZUhlbHBlci5uZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgbmV3IE1haW5FeGFtcGxlQ2xpZW50KCkgKTsKKworCQlzZXJ2ZXIuX3N0YXJ0QW5kV2FpdFVwKCA0MDAwICk7CisJfQorCisJLyoqCisJICogU2h1dGRvd24gY29ubmVjdGlvbiB0byBzZXJ2ZXIKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBBZnRlcgorCXB1YmxpYyB2b2lkIHNodXRDb25uZWN0aW9uKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQl7CisJCQlzZXJ2ZXIuX3N0b3AoKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoc2VydmVyKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGVyZi9SRUFETUUudHh0IGIvZXhhbXBsZXMvcGVyZi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWVjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9wZXJmL1JFQURNRS50eHQKQEAgLTAsMCArMSwyOCBAQAorVG8gZ2V0IHN0YXJ0ZWQgd2l0aCB0aGUgZXhhbXBsZSB5b3Ugd2lsbCBuZWVkIGpkayAxLjUuMF94LAord2hlcmUgeCBpcyBwcmV0dHkgcmVjZW50ICg+PSAxNSksIG9yIGFueSByZWxlYXNlIG9mIGpkayAxLjYuCitZb3Ugd2lsbCBhbHNvIG5lZWQgYW50IDEuNy4wLCB3aXRoIGFudCAubmV0IHBsdWdpbiBpZiB5b3UKK3dhbnQgdG8gYnVpbGQgY3NoYXJwLiBZb3Ugd2lsbCBhbHNvIG5lZWQgbWljcm9zb2Z0IC5uZXQKK3NkayAyLjAgZm9yIGNzaGFycCBidWlsZHMuCisKK1RvIGJ1aWxkOgorCis+IGFudAorCitUaGlzIHdpbGwgcnVuIHRoZSBkZWZhdWx0IHRhcmdldCB3aGljaCB3aWxsIGJ1aWxkIGJvdGggamF2YQorYW5kIGNzaGFycCBwcm9ncmFtcy4gWW91IGNhbiBhbHNvIHVzZSBidWlsZC1qYXZhIG9yIGJ1aWxkLWNzaGFycAordGFyZ2V0cyB0byBidWlsZCBvbmx5IGphdmEgb3Igb25seSBjc2hhcnAuCisKK1RvIHJ1biBqYXZhIHBlcmZvcm1hbmNlIGV4YW1wbGUsIG9wZW4gYSBjbWQgd2luZG93IGFuZCBydW4gdGhlc2UKK2NvbW1hbmRzOgorCis+IGNkIHRhcmdldFxiaW4KKz4gc3RhcnQgamF2YSAtY3AgcGVyZi5qYXIgZXRjaC5leGFtcGxlcy5wZXJmLk1haW5QZXJmTGlzdGVuZXIKKz4gc3RhcnQgamF2YSAtY3AgcGVyZi5qYXIgZXRjaC5leGFtcGxlcy5wZXJmLk1haW5QZXJmQ2xpZW50CisKK1RvIHJ1biBjc2hhcnAgZXhhbXBsZToKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IHBlcmZMaXN0ZW5lci5leGUKKz4gc3RhcnQgcGVyZkNsaWVudC5leGUKKworWW91IGNhbiBtaXggYW5kIG1hdGNoIHRoZSB2YXJpb3VzIGNsaWVudHMgYW5kIGxpc3RlbmVycy4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvYnVpbGQueG1sIGIvZXhhbXBsZXMvcGVyZi9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5Y2EzMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPHByb2plY3QgbmFtZT0iZXRjaC1wZXJmLWV4YW1wbGUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiID4KKyAgICA8ZGVzY3JpcHRpb24+UGVyZiBFeGFtcGxlPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPCEtLSBUT0RPIGJldHRlciBjb21wdXRhdGlvbiBvZiBldGNoLmhvbWUsIGV0Y2gudmVyc2lvbiAtLT4KKyAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KKworICAgIDwhLS0gY29tcHV0ZSBFVENIX0hPTUUgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLkVUQ0hfSE9NRSIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4vdGFyZ2V0L0luc3RhbGxlcnMvZGlzdCIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJldGNoLmhvbWUiIHZhbHVlPSIke2Vudi5FVENIX0hPTUV9IiA+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iJHtlbnYuRVRDSF9IT01FfSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJldGNoLmhvbWUiIHZhbHVlPSIke2J1aWxkLkVUQ0hfSE9NRX0iID4KKyAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9ImV0Y2guaG9tZSIgLz48L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyIgorICAgICAgICBsb2NhdGlvbj0iJHtkZWZhdWx0Lmp1bml0LmxpYn0vanVuaXQtNC4zLjEuamFyIiAvPgorCisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYnVpbGRTdXBwb3J0RGlyZWN0b3J5IiBsb2NhdGlvbj0iLi4vLi4vYnVpbGQtc3VwcG9ydCIgLz4KKworICAgIDwhLS0gY29tcHV0ZSBldGNoLnZlcnNpb24gLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZXRjaC52ZXJzaW9uIiB2YWx1ZT0iJHtFdGNoLnZlcnNpb259IiA+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJldGNoLnZlcnNpb24iIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8IS0tIENzaGFycCBTdXBwb3J0IC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9IlVTRS5kb3RuZXQiID4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiIC8+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7ZW52LndpbmRpcn0vTWljcm9zb2Z0Lk5FVC9GcmFtZXdvcmsvdjIuMC41MDcyNy9tc2J1aWxkLmV4ZSIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iVVNFLm1vbm8iID4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxub3Q+PG9zIGZhbWlseT0id2luZG93cyIgLz48L25vdD4KKyAgICAgICAgICAgIDwhLS0gVE9ETyBtb25vIHN1cHBvcnQgaXMgbm90IGZ1bGx5IGJha2VkLCB1c2UgLURVU0UubW9ubyB0byB0ZXN0IC0tPgorICAgICAgICAgICAgPCEtLSA8YXZhaWxhYmxlIGZpbGU9IiR7ZW52Lk1PTk9fSE9NRX0vYmluL21kdG9vbCIgLz4gLS0+CisgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9IlVTRS5tb25vIiAvPgorICAgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJCVUlMRC5jc2hhcnAiID4KKyAgICAgICAgPG9yPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJVU0UuZG90bmV0IiAvPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJVU0UubW9ubyIgLz4KKyAgICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDwhLS0gaW1wb3J0IGV0Y2ggdGFzayAtLT4KKyAgICA8dGFza2RlZgorICAgICAgICBvbmVycm9yPSJyZXBvcnQiCisgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL2V0Y2gvdG9vbHMvYW50L2V0Y2gueG1sIgorICAgICAgICBjbGFzc3BhdGg9IiR7ZXRjaC5ob21lfS9saWIvZXRjaC1hbnQtcGx1Z2luLSR7ZXRjaC52ZXJzaW9ufS5qYXIiIC8+CisKKyAgICA8IS0tIGltcG9ydCBkb3RuZXQgdGFzayAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJhbnQuZG90bmV0LmphciIgdmFsdWU9ImFudC1kb3RuZXQtMS4wLmphciIgPgorICAgICAgICA8bm90Pjxpc3NldCBwcm9wZXJ0eT0iYW50LmRvdG5ldC5qYXIiIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8dGFza2RlZgorICAgICAgICBvbmVycm9yPSJyZXBvcnQiCisgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL2FudC9kb3RuZXQvYW50bGliLnhtbCIKKyAgICAgICAgY2xhc3NwYXRoPSIke2FudC5kb3RuZXQuamFyfSIgLz4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJtZHRvb2wiID4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiICAgICAgICAgZGVmYXVsdD0iLiIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgZGVmYXVsdD0iZmFsc2UiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvamVjdCIgICAgIGRlZmF1bHQ9InByb2plY3QuY3Nwcm9qIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgICAgICBkZWZhdWx0PSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHtlbnYuTU9OT19IT01FfS9iaW4vbWR0b29sIiBkaXI9IkB7ZGlyfSIgZmFpbG9uZXJyb3I9IkB7ZmFpbG9uZXJyb3J9IiA+CisgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iYnVpbGQiIC8+CisgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1idWlsZGZpbGU6QHtwcm9qZWN0fSIgLz4KKyAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8IS0tIHNldCBwcm9wZXJ0aWVzIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiICAgICAgICAgICAgICAgbG9jYXRpb249IiR7YmFzZWRpcn0vc3JjIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWluLXNyYy1qYXZhIiAgICAgbG9jYXRpb249IiR7c3JjfS9tYWluL2phdmEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3Qtc3JjLWphdmEiICAgICBsb2NhdGlvbj0iJHtzcmN9L3Rlc3QvamF2YSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiAgICAgICAgICAgIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RhcmdldCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGlzdC1zcmMiICAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vZGlzdC1zcmMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdlbmVyYXRlZC1zb3VyY2VzIiBsb2NhdGlvbj0iJHt0YXJnZXR9L2dlbmVyYXRlZC1zb3VyY2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW4tc3JjLWphdmEiICAgICAgbG9jYXRpb249IiR7Z2VuZXJhdGVkLXNvdXJjZXN9L21haW4vZXRjaC9qYXZhIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW4tc3JjLWNzaGFycCIgICAgbG9jYXRpb249IiR7Z2VuZXJhdGVkLXNvdXJjZXN9L21haW4vZXRjaC9jc2hhcnAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJpbiIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2JpbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgICAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vY2xhc3NlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy10ZXN0IiAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vY2xhc3Nlcy10ZXN0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LXJlc3VsdHMiICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS90ZXN0LXJlc3VsdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Im51bml0LXJlc3VsdHMiICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L251bml0LXJlc3VsdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRpc3QiICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLi90YXJnZXQvSW5zdGFsbGVycy9kaXN0IiAvPgorCisgICAgPCEtLSBpbml0aWFsaXplIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iaW5pdCIgPgorICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7ZGlzdC1zcmN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbmVyYXRlZC1zb3VyY2VzfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW4tc3JjLWphdmF9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbi1zcmMtY3NoYXJwfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtiaW59IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMtdGVzdH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGVzdC1yZXN1bHRzfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtudW5pdC1yZXN1bHRzfSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gYnVpbGQgdGhlIHNlcnZlciAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXNvdXJjZXMiIGRlcGVuZHM9ImluaXQiID4KKyAgICAgICAgPCEtLSBnZW5lcmF0ZSBzb3VyY2VzIC0tPgorCisgICAgICAgIDxldGNoIGhvbWU9IiR7ZXRjaC5ob21lfSIKKyAgICAgICAgICAgICAgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9QZXJmLmV0Y2giCisgICAgICAgICAgICAgIGJpbmRpbmc9ImphdmEiCisgICAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW4tc3JjLWphdmF9IiAvPgorCisgICAgICAgIDxldGNoIGhvbWU9IiR7ZXRjaC5ob21lfSIKKyAgICAgICAgICAgICAgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9QZXJmLmV0Y2giCisgICAgICAgICAgICAgIGJpbmRpbmc9ImNzaGFycCIKKyAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke2dlbi1zcmMtY3NoYXJwfSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtcnVudGltZS1uYW1lIgorICAgICAgICB2YWx1ZT0iZXRjaC1qYXZhLXJ1bnRpbWUtJHtldGNoLnZlcnNpb259LmphciIgLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJFdGNoLmRlcGVuZGVuY3kuamF2YS5ydW50aW1lIgorICAgICAgICBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9IiAvPgorCisgICAgPHRhcmdldCBuYW1lPSJidWlsZC1qYXZhIiBkZXBlbmRzPSJnZW5lcmF0ZS1zb3VyY2VzIiA+CisgICAgICAgIDwhLS0gY29tcGlsZSBzb3VyY2VzIC0tPgorCisgICAgICAgIDxqYXZhYyB0YXJnZXQ9IjEuNSIgZGVzdGRpcj0iJHtjbGFzc2VzfSIgPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke2dlbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7bWFpbi1zcmMtamF2YX0iIC8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuamF2YS5ydW50aW1lfSIgLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDxqYXZhYyB0YXJnZXQ9IjEuNSIgZGVzdGRpcj0iJHtjbGFzc2VzLXRlc3R9IiA+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7Z2VuLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHttYWluLXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHt0ZXN0LXNyYy1qYXZhfSIgLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qYXZhLnJ1bnRpbWV9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLmRlcGVuZGVuY3kuanVuaXQuamFyfSIgLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDwhLS0gQ3JlYXRlIEphciAtLT4KKyAgICAgICAgPGphciBqYXJmaWxlPSIke2Jpbn0vcGVyZi5qYXIiID4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiIHZhbHVlPSIke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9IiAvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzfSIgPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvamFyPgorCisgICAgICAgIDwhLS0gY29weSBpbiBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Jpbn0iIGZpbGU9IiR7RXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycC13aXRoLW1vbm8iIGRlcGVuZHM9ImdlbmVyYXRlLXNvdXJjZXMiIGlmPSJVU0UubW9ubyIgPgorICAgICAgICA8bWR0b29sIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL1BlcmZDbGllbnRQcm9qIiBwcm9qZWN0PSJQZXJmQ2xpZW50UHJvai5jc3Byb2oiIC8+CisgICAgICAgIDxtZHRvb2wgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvUGVyZkxpc3RlbmVyUHJvaiIgcHJvamVjdD0iUGVyZkxpc3RlbmVyUHJvai5jc3Byb2oiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycC13aXRoLWRvdG5ldCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyIgaWY9IlVTRS5kb3RuZXQiID4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vbWFpbi9jc2hhcnAvUGVyZkxpc3RlbmVyUHJvai9QZXJmTGlzdGVuZXJQcm9qLmNzcHJvaiIgPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDwvbXNidWlsZD4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vbWFpbi9jc2hhcnAvUGVyZkNsaWVudFByb2ovUGVyZkNsaWVudFByb2ouY3Nwcm9qIiA+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iQ29uZmlndXJhdGlvbiIgdmFsdWU9IiR7YnVpbGQudGFyZ2V0fSIgLz4KKyAgICAgICAgPC9tc2J1aWxkPgorICAgICAgICA8bXNidWlsZCBidWlsZGZpbGU9IiR7c3JjfS90ZXN0L2NzaGFycC9QZXJmVGVzdFByb2ovUGVyZlRlc3RQcm9qLmNzcHJvaiIgPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke2J1aWxkLnRhcmdldH0iIC8+CisgICAgICAgIDwvbXNidWlsZD4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YmlufSIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvUGVyZkxpc3RlbmVyUHJvai9iaW4vJHtidWlsZC50YXJnZXR9IiA+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL1BlcmZDbGllbnRQcm9qL2Jpbi8ke2J1aWxkLnRhcmdldH0iID4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycCIgZGVwZW5kcz0iYnVpbGQtY3NoYXJwLXdpdGgtbW9ubyxidWlsZC1jc2hhcnAtd2l0aC1kb3RuZXQiIC8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJidWlsZC1qYXZhLGJ1aWxkLWNzaGFycCIgLz4KKworICAgIDwhLS0gcnVuIHVuaXQgdGVzdHMgLS0+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtamF2YSIgZGVwZW5kcz0iYnVpbGQtamF2YSIgPgorICAgICAgICA8IS0tIFJ1biBVbml0IFRlc3RzIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIiBkaXI9IiR7Y2xhc3Nlcy10ZXN0fSIKKyAgICAgICAgICAgIGVycm9yUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiIGZhaWx1cmVQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCIgPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlcy10ZXN0fSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmphdmEucnVudGltZX0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qdW5pdC5qYXJ9IiAvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIgLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0idHJ1ZSIgdG9kaXI9IiR7dGVzdC1yZXN1bHRzfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LXNyYy1qYXZhfSIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNzaGFycCIgZGVwZW5kcz0iYnVpbGQtY3NoYXJwIiBpZj0iQlVJTEQuY3NoYXJwIiA+CisgICAgICAgICA8bnVuaXQgeG1sb3V0PSIke251bml0LXJlc3VsdHN9L05Vbml0UmVzdWx0cy54bWwiPgorICAgICAgICAgICAgIDx0ZXN0YXNzZW1ibHkgbmFtZT0iJHtzcmN9L3Rlc3QvY3NoYXJwL1BlcmZUZXN0UHJvai9iaW4vJHtidWlsZC50YXJnZXR9L1BlcmZUZXN0UHJvai5kbGwiIC8+CisgICAgICAgICA8L251bml0PgorCisgICAgICAgICA8eHNsdCBzdHlsZT0iJHtFdGNoLmJ1aWxkU3VwcG9ydERpcmVjdG9yeX0vTlVuaXRUb0pVbml0LnhzbCIKKyAgICAgICAgICAgICAgICAgaW49IiR7bnVuaXQtcmVzdWx0c30vTlVuaXRSZXN1bHRzLnhtbCIgb3V0PSIke3Rlc3QtcmVzdWx0c30vVEVTVC1OVW5pdFJlc3VsdHMueG1sIiAvPgorICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImJ1aWxkLHRlc3QtamF2YSx0ZXN0LWNzaGFycCxkb25lIiA+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvbmUiIGRlcGVuZHM9ImJ1aWxkIiA+CisgICAgICAgIDxlY2hvPgorCitCdWlsZCBDb21wbGV0ZSEKKworVG8gcnVuIGphdmEgcGVyZm9ybWFuY2UgZXhhbXBsZSwgb3BlbiBhIGNtZCB3aW5kb3cgYW5kIHJ1biB0aGVzZQorY29tbWFuZHM6CisKKz4gY2QgdGFyZ2V0XGJpbgorPiBzdGFydCBqYXZhIC1jcCBwZXJmLmphciBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZi5NYWluUGVyZkxpc3RlbmVyCis+IHN0YXJ0IGphdmEgLWNwIHBlcmYuamFyIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmLk1haW5QZXJmQ2xpZW50CisKK1RvIHJ1biBjc2hhcnAgZXhhbXBsZToKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IHBlcmZMaXN0ZW5lci5leGUKKz4gc3RhcnQgcGVyZkNsaWVudC5leGUKKworWW91IGNhbiBtaXggYW5kIG1hdGNoIHRoZSB2YXJpb3VzIGNsaWVudHMgYW5kIGxpc3RlbmVycy4KKworICAgICAgICA8L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIGJ1aWxkIGV2ZXJ5dGhpbmcgLS0+CisgICAgPHRhcmdldCBuYW1lPSJpbml0LWRlYnVnIiA+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50YXJnZXQiIHZhbHVlPSJEZWJ1ZyIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1yZWxlYXNlIiA+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50YXJnZXQiIHZhbHVlPSJSZWxlYXNlIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICA8dGFyZ2V0IG5hbWU9ImRpc3Qtc3JjIiA+CisgICAgICAgPGNvcHkgZmlsZT0iZGlzdC1idWlsZC54bWwiIHRvZmlsZT0iJHtkaXN0LXNyY30vYnVpbGQueG1sIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgPGZpbHRlcnNldCByZWZpZD0iRXRjaC5idWlsZFRva2VucyIgLz4KKyAgICAgICA8L2NvcHk+ICAgIAorICAgICAgICA8Y29weSBmaWxlPSJSRUFETUUudHh0IiB0b2ZpbGU9IiR7ZGlzdC1zcmN9L1JFQURNRS50eHQiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KKyAgICAgICAgCisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Rpc3Qtc3JjfS9zcmMvbWFpbi9ldGNoIiBvdmVyd3JpdGU9InRydWUiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vZXRjaCIgPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5ldGNoIiAvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgICAgIAorICAgICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LXNyY30vc3JjL21haW4vamF2YSIgb3ZlcndyaXRlPSJ0cnVlIiA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2phdmEiID4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICAKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC1zcmN9L3NyYy9tYWluL2NzaGFycCIgb3ZlcndyaXRlPSJ0cnVlIiA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL2NzaGFycCIgPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jcyIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICAKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7ZGlzdH0vZXhhbXBsZXMvcGVyZiIgb3ZlcndyaXRlPSJ0cnVlIiA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC1zcmN9IiAvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRlYnVnIiBkZXBlbmRzPSJkaXN0LXNyYyxpbml0LWRlYnVnLHRlc3QiIC8+CisgICAgPHRhcmdldCBuYW1lPSJyZWxlYXNlIiBkZXBlbmRzPSJkaXN0LXNyYyxpbml0LXJlbGVhc2UsdGVzdCIgLz4KKworICAgIDwhLS0gY2xlYW4gLS0+CisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9IiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3JjfS9tYWluL2NzaGFycC9QZXJmQ2xpZW50UHJvai9iaW4iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL1BlcmZDbGllbnRQcm9qL29iaiIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vbWFpbi9jc2hhcnAvUGVyZkxpc3RlbmVyUHJvai9iaW4iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L21haW4vY3NoYXJwL1BlcmZMaXN0ZW5lclByb2ovb2JqIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3JjfS90ZXN0L2NzaGFycC9QZXJmVGVzdFByb2ovYmluIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3JjfS90ZXN0L2NzaGFycC9QZXJmVGVzdFByb2ovb2JqIiBxdWlldD0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvZGlzdC1idWlsZC54bWwgYi9leGFtcGxlcy9wZXJmL2Rpc3QtYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGJhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9wZXJmL2Rpc3QtYnVpbGQueG1sCkBAIC0wLDAgKzEsMTU2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLXBlcmYtcGVyZiIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iYnVpbGQiPgorICAgIDxkZXNjcmlwdGlvbj5QZXJmIFBlcmY8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2guaG9tZSIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC52ZXJzaW9uIiB2YWx1ZT0iQEV0Y2hWZXJzaW9uQCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJldGNoLWphdmEtcnVudGltZS1uYW1lIiB2YWx1ZT0iZXRjaC1qYXZhLXJ1bnRpbWUtJHtldGNoLnZlcnNpb259LmphciIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2gtYW50LXBsdWdpbi5qYXIiICAgbG9jYXRpb249IiR7ZXRjaC5ob21lfS9saWIvZXRjaC1hbnQtcGx1Z2luLSR7ZXRjaC52ZXJzaW9ufS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZXRjaC1qYXZhLXJ1bnRpbWUuamFyIiBsb2NhdGlvbj0iJHtldGNoLmhvbWV9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV0Y2guZGxsIiAgICAgICAgICAgICAgbG9jYXRpb249IiR7ZXRjaC5ob21lfS9saWIvRXRjaC5kbGwiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiICAgICAgICAgICAgICAgbG9jYXRpb249IiR7YmFzZWRpcn0vc3JjIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYy1tYWluLWV0Y2giICAgICBsb2NhdGlvbj0iJHtzcmN9L21haW4vZXRjaCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMtbWFpbi1qYXZhIiAgICAgbG9jYXRpb249IiR7c3JjfS9tYWluL2phdmEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLW1haW4tY3NoYXJwIiAgIGxvY2F0aW9uPSIke3NyY30vbWFpbi9jc2hhcnAiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiAgICAgICAgICAgIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RhcmdldCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5lcmF0ZWQtc291cmNlcyIgbG9jYXRpb249IiR7dGFyZ2V0fS9nZW5lcmF0ZWQtc291cmNlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5zcmMtbWFpbi1ldGNoLWphdmEiIGxvY2F0aW9uPSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvamF2YSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5zcmMtbWFpbi1ldGNoLWNzaGFycCIgbG9jYXRpb249IiR7Z2VuZXJhdGVkLXNvdXJjZXN9L21haW4vZXRjaC9jc2hhcnAiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgICAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vY2xhc3NlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW4iICAgICAgICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9iaW4iLz4KKyAgICAKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJCVUlMRC5jc2hhcnAiID4KKyAgICAgICAgPG9zIGZhbWlseT0id2luZG93cyIgLz4KKyAgICA8L2NvbmRpdGlvbj4gICAgCisKKyAgICA8dGFza2RlZgorICAgICAgICByZXNvdXJjZT0ib3JnL2FwYWNoZS9ldGNoL3Rvb2xzL2FudC9ldGNoLnhtbCIKKyAgICAgICAgY2xhc3NwYXRoPSIke2V0Y2gtYW50LXBsdWdpbi5qYXJ9Ii8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJidWlsZC1qYXZhLCBidWlsZC1jc2hhcnAsIGRvbmUiLz4KKworICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtamF2YSIgZGVwZW5kcz0iZ2Vuc3JjLWphdmEiPgorICAgICAgICA8amF2YWMgZGVzdGRpcj0iJHtjbGFzc2VzfSIgc291cmNlPSIxLjUiIGRlYnVnPSJ0cnVlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2V0Y2gtamF2YS1ydW50aW1lLmphcn0iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyYy1tYWluLWphdmF9Ii8+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7Z2Vuc3JjLW1haW4tZXRjaC1qYXZhfSIvPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDxqYXIgamFyZmlsZT0iJHtiaW59L3BlcmYuamFyIj4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiIHZhbHVlPSIke2V0Y2gtamF2YS1ydW50aW1lLW5hbWV9Ii8+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXN9Ii8+CisgICAgICAgIDwvamFyPgorCisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Jpbn0iIGZpbGU9IiR7ZXRjaC1qYXZhLXJ1bnRpbWUuamFyfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkb25lIj4KKyAgICAgICAgPGVjaG8+CisKK1RvIHJ1biBqYXZhIHBlcmZvcm1hbmNlIGV4YW1wbGUsIG9wZW4gYSBjbWQgd2luZG93IGFuZCBydW4gdGhlc2UKK2NvbW1hbmRzOgorCis+IGNkIHRhcmdldFxiaW4KKz4gc3RhcnQgamF2YSAtY3AgcGVyZi5qYXIgZXRjaC5leGFtcGxlcy5wZXJmLk1haW5QZXJmTGlzdGVuZXIKKz4gc3RhcnQgamF2YSAtY3AgcGVyZi5qYXIgZXRjaC5leGFtcGxlcy5wZXJmLk1haW5QZXJmQ2xpZW50CisKK1RvIHJ1biBjc2hhcnAgZXhhbXBsZToKKworPiBjZCB0YXJnZXRcYmluCis+IHN0YXJ0IHBlcmZMaXN0ZW5lci5leGUKKz4gc3RhcnQgcGVyZkNsaWVudC5leGUKKworWW91IGNhbiBtaXggYW5kIG1hdGNoIHRoZSB2YXJpb3VzIGNsaWVudHMgYW5kIGxpc3RlbmVycy4KKworICAgICAgICA8L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNzaGFycCIgZGVwZW5kcz0iZ2Vuc3JjLWNzaGFycCIgaWY9IkJVSUxELmNzaGFycCIgPgorICAgICAgICA8Y3NjCisgICAgICAgICAgICAgICAgZGVidWc9InRydWUiCisgICAgICAgICAgICAgICAgd2FybkxldmVsPSIxIgorICAgICAgICAgICAgICAgIHVuc2FmZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgICAgICAgICAgIGluY3JlbWVudGFsPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBtYWluQ2xhc3MgPSAiZXRjaC5leGFtcGxlcy5wZXJmLk1haW5QZXJmQ2xpZW50IgorICAgICAgICAgICAgICAgIGRlc3RGaWxlPSIke2Jpbn0vcGVyZkNsaWVudC5leGUiPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7c3JjLW1haW4tY3NoYXJwfS9wZXJmQ2xpZW50UHJvaiIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vZXRjaC5leGFtcGxlcy5wZXJmIiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9IiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHJlZmVyZW5jZSBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgICAgICA8L2NzYz4KKworICAgICAgICA8Y3NjCisgICAgICAgICAgICAgICAgZGVidWc9InRydWUiCisgICAgICAgICAgICAgICAgd2FybkxldmVsPSIxIgorICAgICAgICAgICAgICAgIHVuc2FmZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgICAgICAgICAgIGluY3JlbWVudGFsPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBtYWluQ2xhc3MgPSAiZXRjaC5leGFtcGxlcy5wZXJmLk1haW5QZXJmTGlzdGVuZXIiCisgICAgICAgICAgICAgICAgZGVzdEZpbGU9IiR7YmlufS9wZXJmTGlzdGVuZXIuZXhlIj4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vcGVyZkxpc3RlbmVyUHJvaiIgaW5jbHVkZXM9IioqLyouY3MiLz4KKyAgICAgICAgICAgIDxzcmMgZGlyPSIke3NyYy1tYWluLWNzaGFycH0vZXRjaC5leGFtcGxlcy5wZXJmIiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHNyYyBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1jc2hhcnB9IiBpbmNsdWRlcz0iKiovKi5jcyIvPgorICAgICAgICAgICAgPHJlZmVyZW5jZSBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgICAgICA8L2NzYz4KKworICAgICAgICA8Y29weSB0b2Rpcj0iJHtiaW59IiBmaWxlPSIke2V0Y2guZGxsfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJnZW5zcmMiIGRlcGVuZHM9ImdlbnNyYy1qYXZhLCBnZW5zcmMtY3NoYXJwIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbnNyYy1qYXZhIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGV0Y2gKKyAgICAgICAgICAgIGhvbWU9IiR7ZXRjaC5ob21lfSIKKyAgICAgICAgICAgIGJpbmRpbmc9ImphdmEiCisgICAgICAgICAgICBxdWlldD0idHJ1ZSIKKyAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWphdmF9IgorICAgICAgICAgICAgZmlsZT0iJHtzcmMtbWFpbi1ldGNofS9QZXJmLmV0Y2giLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZ2Vuc3JjLWNzaGFycCIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxldGNoCisgICAgICAgICAgICBob21lPSIke2V0Y2guaG9tZX0iCisgICAgICAgICAgICBiaW5kaW5nPSJjc2hhcnAiCisgICAgICAgICAgICBxdWlldD0idHJ1ZSIKKyAgICAgICAgICAgIG91dHB1dERpcj0iJHtnZW5zcmMtbWFpbi1ldGNoLWNzaGFycH0iCisgICAgICAgICAgICBmaWxlPSIke3NyYy1tYWluLWV0Y2h9L1BlcmYuZXRjaCIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuZXJhdGVkLXNvdXJjZXN9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2Vuc3JjLW1haW4tZXRjaC1qYXZhfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbnNyYy1tYWluLWV0Y2gtY3NoYXJwfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXN9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YmlufSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iLz4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL1BlcmZDbGllbnRQcm9qL1BlcmZDbGllbnRQcm9qLmNzcHJvaiBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL1BlcmZDbGllbnRQcm9qL1BlcmZDbGllbnRQcm9qLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmQ4ZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvUGVyZkNsaWVudFByb2ovUGVyZkNsaWVudFByb2ouY3Nwcm9qCkBAIC0wLDAgKzEsMTE3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57RDJBQTAzRDgtMTU1NS00QTlCLTg2MTgtRkYxMkExNUJCQjZFfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5ldGNoLmV4YW1wbGVzLnBlcmY8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5QZXJmQ2xpZW50PC9Bc3NlbWJseU5hbWU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXEJhc2VQZXJmQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkJhc2VQZXJmQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxCYXNlUGVyZlNlcnZlci5jcyI+CisgICAgICA8TGluaz5CYXNlUGVyZlNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUGVyZi5jcyI+CisgICAgICA8TGluaz5QZXJmLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxQZXJmQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlBlcmZDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFBlcmZIZWxwZXIuY3MiPgorICAgICAgPExpbms+UGVyZkhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUGVyZlNlcnZlci5jcyI+CisgICAgICA8TGluaz5QZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxSZW1vdGVQZXJmLmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZVBlcmYuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFJlbW90ZVBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+UmVtb3RlUGVyZkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUmVtb3RlUGVyZlNlcnZlci5jcyI+CisgICAgICA8TGluaz5SZW1vdGVQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxTdHViUGVyZi5jcyI+CisgICAgICA8TGluaz5TdHViUGVyZi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcU3R1YlBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+U3R1YlBlcmZDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFN0dWJQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxWYWx1ZUZhY3RvcnlQZXJmLmNzIj4KKyAgICAgIDxMaW5rPlZhbHVlRmFjdG9yeVBlcmYuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2guZXhhbXBsZXMucGVyZlxJbXBsUGVyZkNsaWVudC5jcyI+CisgICAgICA8TGluaz5JbXBsUGVyZkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC5leGFtcGxlcy5wZXJmXEltcGxQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkltcGxQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLnBlcmZcTWFpblBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+TWFpblBlcmZDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlwuLlwuLlxiaW5kaW5nLWNzaGFycFxydW50aW1lXHNyY1xtYWluXGNzaGFycFxFdGNoUHJvai5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn08L1Byb2plY3Q+CisgICAgICA8TmFtZT5FdGNoUHJvajwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL1BlcmZDbGllbnRQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvUGVyZkNsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlY2Y1YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL1BlcmZDbGllbnRQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKy8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlBlcmYgQ2xpZW50IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIlBlcmYgQ2xpZW50IEV4ZWN1dGFibGUiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJDaXNjbyBTeXN0ZW1zIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiRXRjaCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiNzM2OWViNWMtNmYyMC00ZjI5LTg2NmItMjA0ZTk1YmRiNWNkIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL1BlcmZMaXN0ZW5lclByb2ovUGVyZkxpc3RlbmVyUHJvai5jc3Byb2ogYi9leGFtcGxlcy9wZXJmL3NyYy9tYWluL2NzaGFycC9QZXJmTGlzdGVuZXJQcm9qL1BlcmZMaXN0ZW5lclByb2ouY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYThjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9wZXJmL3NyYy9tYWluL2NzaGFycC9QZXJmTGlzdGVuZXJQcm9qL1BlcmZMaXN0ZW5lclByb2ouY3Nwcm9qCkBAIC0wLDAgKzEsMTE0IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NEI5Q0U3MzItNjAxQS00QTc0LUExRDUtQUY3ODI1MUZFREQyfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5ldGNoLmV4YW1wbGVzLnBlcmY8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5QZXJmTGlzdGVuZXI8L0Fzc2VtYmx5TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcQmFzZVBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+QmFzZVBlcmZDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXEJhc2VQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkJhc2VQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxQZXJmLmNzIj4KKyAgICAgIDxMaW5rPlBlcmYuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+UGVyZkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUGVyZkhlbHBlci5jcyI+CisgICAgICA8TGluaz5QZXJmSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlBlcmZTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFJlbW90ZVBlcmYuY3MiPgorICAgICAgPExpbms+UmVtb3RlUGVyZi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUmVtb3RlUGVyZkNsaWVudC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVQZXJmQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxSZW1vdGVQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZVBlcmZTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFN0dWJQZXJmLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJQZXJmLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxTdHViUGVyZkNsaWVudC5jcyI+CisgICAgICA8TGluaz5TdHViUGVyZkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcU3R1YlBlcmZTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+U3R1YlBlcmZTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFZhbHVlRmFjdG9yeVBlcmYuY3MiPgorICAgICAgPExpbms+VmFsdWVGYWN0b3J5UGVyZi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC5leGFtcGxlcy5wZXJmXEltcGxQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkltcGxQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLmV4YW1wbGVzLnBlcmZcTWFpblBlcmZMaXN0ZW5lci5jcyI+CisgICAgICA8TGluaz5NYWluUGVyZkxpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cYmluZGluZy1jc2hhcnBccnVudGltZVxzcmNcbWFpblxjc2hhcnBcRXRjaFByb2ouY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PnswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RXRjaFByb2o8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9wZXJmL3NyYy9tYWluL2NzaGFycC9QZXJmTGlzdGVuZXJQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvUGVyZkxpc3RlbmVyUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ4NmVhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvUGVyZkxpc3RlbmVyUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQ4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJQZXJmIExpc3RlbmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIlBlcmYgTGlzdGVuZXIgRXhlY3V0YWJsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiRXRjaCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiYzc0Y2YzYmQtNzU4Yi00ZTQwLTk1MzctZTE3OTNmMGZkY2NlIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9JbXBsUGVyZkNsaWVudC5jcyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9JbXBsUGVyZkNsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2I1YzFkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5wZXJmL0ltcGxQZXJmQ2xpZW50LmNzCkBAIC0wLDAgKzEsNDIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK25hbWVzcGFjZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZgoreworCS8vLzxzdW1tYXJ5PkltcGxlbWVudGF0aW9uIGZvciBJbXBsUGVyZkNsaWVudDwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgSW1wbFBlcmZDbGllbnQgOiBCYXNlUGVyZkNsaWVudAorCXsKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxQZXJmQ2xpZW50Ljwvc3VtbWFyeT4KKyAJCS8vLyA8cGFyYW0gbmFtZT0ic2VydmVyIj5hIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0bworIAkJLy8vIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuPC9wYXJhbT4KKwkJcHVibGljIEltcGxQZXJmQ2xpZW50KFJlbW90ZVBlcmZTZXJ2ZXIgc2VydmVyKQorCQl7CisJCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJfQorCQkKKwkJLy8vIDxzdW1tYXJ5PkEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHNlc3Npb24uIFVzZSB0aGlzIHRvCisgCQkvLy8gc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci48L3N1bW1hcnk+CisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAyMTkKKwkJcHJpdmF0ZSByZWFkb25seSBSZW1vdGVQZXJmU2VydmVyIHNlcnZlcjsKKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDIxOQorCQorCQkvLyBUT0RPOiBJbXBsZW1lbnQgZGVsZWdhdGVzIG9yIHByb3ZpZGUgaW1wbGVtZW50YXRpb24gb2YgUGVyZkNsaWVudAorCQkvLyBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIJCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9JbXBsUGVyZlNlcnZlci5jcyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9JbXBsUGVyZlNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUwYWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5wZXJmL0ltcGxQZXJmU2VydmVyLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmCit7CisgICAgcHVibGljIGNsYXNzIEltcGxQZXJmU2VydmVyIDogQmFzZVBlcmZTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBJbXBsUGVyZlNlcnZlcihSZW1vdGVQZXJmQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIH0KKworI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMjE5CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlUGVyZkNsaWVudCBjbGllbnQ7CisjcHJhZ21hIHdhcm5pbmcgcmVzdG9yZSAyMTkKKworICAgICAgICAjcmVnaW9uIFBlcmZTZXJ2ZXIgTWVtYmVycworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQ/IGFkZChpbnQ/IHgsIGludD8geSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHggKyB5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludD8gc3VtKGludFtdIHZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgdmFsdWUgaW4gdmFsdWVzKQorICAgICAgICAgICAgICAgIHN1bSArPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBzdW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCByZXBvcnQoaW50PyBjb2RlLCBzdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdHlwZXMuUGVyZi5Qb2ludCBkaXN0KHR5cGVzLlBlcmYuUG9pbnQgYSwgdHlwZXMuUGVyZi5Qb2ludCBiKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IHR5cGVzLlBlcmYuUG9pbnQoYi54IC0gYS54LCBiLnkgLSBhLnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIERhdGVUaW1lPyBhZGQyKERhdGVUaW1lPyB0cywgbG9uZz8gbXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cy5WYWx1ZSArIG5ldyBUaW1lU3Bhbihtcy5WYWx1ZSoxMDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCByZXBvcnQyKERhdGVUaW1lPyB0cywgaW50PyBjb2RlLCBzdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9NYWluUGVyZkNsaWVudC5jcyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9NYWluUGVyZkNsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmVmMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5wZXJmL01haW5QZXJmQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTQ1IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZi50eXBlcy5QZXJmOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmYKK3sKKyAgICAvLy88c3VtbWFyeT5NYWluIGltcGxlbWVudGF0aW9uIGZvciBQZXJmQ2xpZW50Ljwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgTWFpblBlcmZDbGllbnQgOiBQZXJmSGVscGVyLlBlcmZDbGllbnRGYWN0b3J5LCBQZXJmSGVscGVyLlBlcmZTZXJ2ZXJGYWN0b3J5CisgICAgeworICAgICAgICAvLy88c3VtbWFyeT5NYWluIGZvciBQZXJmQ2xpZW50PC9zdW1tYXJ5PgorICAgICAgICAvLy88cGFyYW0gbmFtZT0iYXJncyI+Q29tbWFuZCBMaW5lIEFyZ3VtZW50czwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDQiOworICAgICAgICAgICAgYm9vbCBzdGFydExpc3RlbmVyID0gZmFsc2U7CisgICAgICAgICAgICBjb25zdCBpbnQgbWF4V2FpdFRpbWUgPSA0MDAwOworCisgICAgICAgICAgICBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworCisgICAgICAgICAgICBpZiAoc3RhcnRMaXN0ZW5lcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IFBlcmZIZWxwZXIuTmV3TGlzdGVuZXIodXJpLCBudWxsLCBuZXcgTWFpblBlcmZDbGllbnQoKSk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuVHJhbnNwb3J0Q29udHJvbChUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIG1heFdhaXRUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1haW5QZXJmQ2xpZW50IGltcGxGYWN0b3J5ID0gbmV3IE1haW5QZXJmQ2xpZW50KCk7CisKKyAgICAgICAgICAgIC8vIHJ1biBhIHByZWxpbWluYXJ5IHRlc3QKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlbW90ZVBlcmZTZXJ2ZXIgc2VydmVyID0gUGVyZkhlbHBlci5OZXdTZXJ2ZXIodXJpLCBudWxsLCBpbXBsRmFjdG9yeSk7CisKKyAgICAgICAgICAgICAgICAvLyBDb25uZWN0IHRvIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICAgICAgc2VydmVyLl9TdGFydEFuZFdhaXRVcChtYXhXYWl0VGltZSk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnRpb24uQ2hlY2soc2VydmVyLmFkZCgyLCAzKSA9PSA1LCAic2VydmVyLmFkZCgyLCAzKSA9PSA1Iik7CisKKyAgICAgICAgICAgICAgICBBc3NlcnRpb24uQ2hlY2soc2VydmVyLmFkZCgzLCA0KSA9PSA3LCAic2VydmVyLmFkZCggMywgNCApID09IDciKTsKKworICAgICAgICAgICAgICAgIEFzc2VydGlvbi5DaGVjayhzZXJ2ZXIuc3VtKG5ldyBpbnRbXSB7MSwgMiwgM30pID09IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIuc3VtKCBuZXcgaW50W10geyAxLCAyLCAzIH0gKSA9PSA2Iik7CisKKyAgICAgICAgICAgICAgICBBc3NlcnRpb24uQ2hlY2soc2VydmVyLnN1bShuZXcgaW50W10gezIsIDMsIDR9KSA9PSA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyLnN1bSggbmV3IGludFtdIHsgMiwgMywgNCB9ICkgPT0gOSIpOworCisgICAgICAgICAgICAgICAgc2VydmVyLnJlcG9ydCgxOCwgInN0YXJ0aW5nIik7CisKKyAgICAgICAgICAgICAgICBzZXJ2ZXIucmVwb3J0KDE5LCAic3RvcHBpbmciKTsKKworICAgICAgICAgICAgICAgIFBvaW50IHIgPSBzZXJ2ZXIuZGlzdChuZXcgUG9pbnQoMSwgMiksIG5ldyBQb2ludCgzLCA1KSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0aW9uLkNoZWNrKHIueCA9PSAyLCAici54ID09IDIiKTsKKyAgICAgICAgICAgICAgICBBc3NlcnRpb24uQ2hlY2soci55ID09IDMsICJyLnkgPT0gMyIpOworCisgICAgICAgICAgICAgICAgciA9IHNlcnZlci5kaXN0KG5ldyBQb2ludCgxMCwgOSksIG5ldyBQb2ludCg0LCA1KSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0aW9uLkNoZWNrKHIueCA9PSAtNiwgInIueCA9PSAtNiIpOworICAgICAgICAgICAgICAgIEFzc2VydGlvbi5DaGVjayhyLnkgPT0gLTQsICJyLnkgPT0gLTQiKTsKKworICAgICAgICAgICAgICAgIERhdGVUaW1lIHQwID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgICAgIGxvbmcgYWRqID0gMzYwMDAwMEw7CisKKyAgICAgICAgICAgICAgICBEYXRlVGltZT8gdDEgPSBzZXJ2ZXIuYWRkMih0MCwgYWRqKTsKKyAgICAgICAgICAgICAgICBUaW1lU3BhbiB0cyA9IHQxLlZhbHVlIC0gdDA7CisgICAgICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSgidHMgPSB7MH0iLCB0cy5UaWNrcyk7CisgICAgICAgICAgICAgICAgQXNzZXJ0aW9uLkNoZWNrKElzTmVhcmx5KHRzLlRpY2tzIC8gMTAwMDAsIGFkaiwgMSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoInNlcnZlci5hZGQyKCB7MH0sIHsxfSApID0+IHsyfSBbYm9ndXMhXSIsIHQwLCBhZGosIHQxKSk7CisKKyAgICAgICAgICAgICAgICB0MSA9IHNlcnZlci5hZGQyKHQwLCAtYWRqKTsKKyAgICAgICAgICAgICAgICB0cyA9IHQxLlZhbHVlIC0gdDA7CisgICAgICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSgidHMgPSB7MH0iLCB0cy5UaWNrcyk7CisgICAgICAgICAgICAgICAgQXNzZXJ0aW9uLkNoZWNrKElzTmVhcmx5KHRzLlRpY2tzIC8gMTAwMDAsIC1hZGosIDEpLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuRm9ybWF0KCJzZXJ2ZXIuYWRkMiggezB9LCB7MX0gKSA9PiB7Mn0gW2JvZ3VzIV0iLCB0MCwgLWFkaiwgdDEpKTsKKworICAgICAgICAgICAgICAgIHNlcnZlci5yZXBvcnQyKERhdGVUaW1lLk5vdywgMjAsICJiZWdpbiIpOworCisgICAgICAgICAgICAgICAgc2VydmVyLnJlcG9ydDIoRGF0ZVRpbWUuTm93LCAyMSwgImVuZCIpOworCisgICAgICAgICAgICAgICAgLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICAgICAgc2VydmVyLl9TdG9wQW5kV2FpdERvd24obWF4V2FpdFRpbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBpbnQgcnVudGltZSA9IDYwOworICAgICAgICAgICAgY29uc3QgaW50IHRyaWFscyA9IDM7CisgICAgICAgICAgICAvL2NvbnN0IGJvb2wgZnVsbCA9IGZhbHNlOworCisJCQluZXcgUGVyZlRlc3QoICJhZGQiLCBydW50aW1lLCB0cmlhbHMsCisgICAgICAgICAgICAgICAgZGVsZWdhdGUobG9uZyBuKQorCQkJICAgIHsKKwkJCQkJICAgIFJlbW90ZVBlcmZTZXJ2ZXIgc2VydmVyID0gUGVyZkhlbHBlci5OZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkgKTsKKwkJCQkJICAgIHNlcnZlci5fU3RhcnRBbmRXYWl0VXAoIG1heFdhaXRUaW1lICk7CisgICAgCQkJCQkKKwkJCQkJICAgIHdoaWxlIChuLS0gPiAwKQorCQkJCQkJICAgIHNlcnZlci5hZGQoIDEwMDAwMDAwMDAsIDIwMDAwMDAwMDAgKTsKKyAgICAJCQkJCQorCQkJCQkgICAgc2VydmVyLl9TdG9wQW5kV2FpdERvd24oIG1heFdhaXRUaW1lICk7CisJCQkgICAgfSkuUnVuKCk7CisKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUT1BfQU5EX1dBSVRfRE9XTiwgbWF4V2FpdFRpbWUpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc05lYXJseShsb25nIGEsIGxvbmcgYiwgbG9uZyBkaWZmKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5BYnMoYSAtIGIpIDw9IGRpZmY7CisgICAgICAgIH0KKworICAgICAgICAvLy88c3VtbWFyeT5SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgUGVyZkNsaWVudC48L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJzZXJ2ZXIiPlJlZmVyZW5jZSB0byByZW1vdGUgc2VydmljZTwvcGFyYW0+CisgICAgICAgIC8vLzxyZXR1cm5zPkNsaWVudCBJbXBsZW1lbnRhdGlvbjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFBlcmZDbGllbnQgTmV3UGVyZkNsaWVudChSZW1vdGVQZXJmU2VydmVyIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBsUGVyZkNsaWVudChzZXJ2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBlcmZTZXJ2ZXIgTmV3UGVyZlNlcnZlcihSZW1vdGVQZXJmQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBsUGVyZlNlcnZlcihjbGllbnQpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9NYWluUGVyZkxpc3RlbmVyLmNzIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9jc2hhcnAvZXRjaC5leGFtcGxlcy5wZXJmL01haW5QZXJmTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyM2ExOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9NYWluUGVyZkxpc3RlbmVyLmNzCkBAIC0wLDAgKzEsNTIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKworbmFtZXNwYWNlIG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmCit7CisJLy8vPHN1bW1hcnk+TWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgUGVyZkxpc3RlbmVyLjwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgTWFpblBlcmZMaXN0ZW5lciA6IFBlcmZIZWxwZXIuUGVyZlNlcnZlckZhY3RvcnkKKwl7CisgCQkvLy88c3VtbWFyeT5NYWluIGZvciBQZXJmTGlzdGVuZXIuPC9zdW1tYXJ5PgorCQkvLy88cGFyYW0gbmFtZT0iYXJncyI+Q29tbWFuZCBMaW5lIEFyZ3VtZW50czwvcGFyYW0+CisJCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisJCXsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDQiOworCQkJCisgICAgICAgICAgICBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyID0gUGVyZkhlbHBlci5OZXdMaXN0ZW5lcih1cmksIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IE1haW5QZXJmTGlzdGVuZXIoKSk7CisJCQkKKwkJCS8vIFN0YXJ0IHRoZSBMaXN0ZW5lcgorCQkJbGlzdGVuZXIuVHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJyZWFkeSIpOworCQl9CisKKwkJLy8vPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIFBlcmZTZXJ2ZXIuPC9zdW1tYXJ5PgorCQkvLy88cGFyYW0gbmFtZT0iY2xpZW50Ij5SZWZlcmVuY2UgdG8gcmVtb3RlIHNlcnZpY2U8L3BhcmFtPgorCQkvLy88cmV0dXJucz5TZXJ2ZXIgSW1wbGVtZW50YXRpb248L3JldHVybnM+CisJCXB1YmxpYyBQZXJmU2VydmVyIE5ld1BlcmZTZXJ2ZXIoIFJlbW90ZVBlcmZDbGllbnQgY2xpZW50ICkKKwkJeworCQkJcmV0dXJuIG5ldyBJbXBsUGVyZlNlcnZlciggY2xpZW50ICk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9ldGNoL1BlcmYuZXRjaCBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vZXRjaC9QZXJmLmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxYWNiNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vZXRjaC9QZXJmLmV0Y2gKQEAgLTAsMCArMSw3NyBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZgorCisvKiogQSBzZXJ2aWNlIHRvIHRlc3QgcGVyZm9ybWFuY2UgKi8KK3NlcnZpY2UgUGVyZgoreworCS8qKgorCSAqIEFkZHMgdHdvIGludGVnZXJzIGFuZCByZXR1cm5zIHRoZSBzdW0uCisJICogQHBhcmFtIHggdGhlIGZpcnN0IGludGVnZXIuCisJICogQHBhcmFtIHkgdGhlIHNlY29uZCBpbnRlZ2VyLgorCSAqIEByZXR1cm4gdGhlIHN1bSBvZiB4IGFuZCB5LgorCSAqLworCWludCBhZGQoIGludCB4LCBpbnQgeSApCisJCisJLyoqCisJICogQWRkcyBhbiBhcnJheSBvZiBpbnRlZ2VycyBhbmQgcmV0dXJucyB0aGUgc3VtLgorCSAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMgdG8gYmUgc3VtbWVkLgorCSAqIEByZXR1cm4gdGhlIHN1bSBvZiB2YWx1ZXMuCisJICovCisJaW50IHN1bSggaW50W10gdmFsdWVzICkKKwkKKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBldmVudCBkZWZpbmVkIGJ5IGNvZGUgYW5kIGEgZGVzY3JpcHRpdmUgbWVzc2FnZS4KKwkgKiBAcGFyYW0gY29kZSBhIHNpbXBsZSBjb2RlIGRlc2NyaWJpbmcgdGhlIGV2ZW50LgorCSAqIEBwYXJhbSBtc2cgYSBkZXNjcmlwdGl2ZSBtZXNzYWdlLgorCSAqLworCUBPbmV3YXkKKwl2b2lkIHJlcG9ydCggaW50IGNvZGUsIHN0cmluZyBtc2cgKQorCQorCS8qKgorCSAqIEEgdHdvIGRpbWVuc2lvbmFsIGNvb3JkaW5hdGUuCisJICogQHBhcmFtIHggdGhlIHgtYXhpcyBjb29yZGluYXRlLgorCSAqIEBwYXJhbSB5IHRoZSB5LWF4aXMgY29vcmRpbmF0ZS4KKwkgKi8KKwlzdHJ1Y3QgUG9pbnQgKCBpbnQgeCwgaW50IHkgKQorCQorCS8qKgorCSAqIENhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cy4KKwkgKiBAcGFyYW0gYSBhIHBvaW50CisJICogQHBhcmFtIGIgYSBwb2ludAorCSAqIEByZXR1cm4gYi1hCisJICovCisJUG9pbnQgZGlzdCggUG9pbnQgYSwgUG9pbnQgYiApCisJCisJLyoqCisJICogQWRkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIHRpbWVzdGFtcC4KKwkgKiBAcGFyYW0gdHMgdGhlIHRpbWVzdGFtcC4KKwkgKiBAcGFyYW0gbXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gYWRkLgorCSAqIEByZXR1cm4gdGhlIGFkanVzdGVkIHRpbWVzdGFtcC4KKwkgKi8KKwlEYXRldGltZSBhZGQyKCBEYXRldGltZSB0cywgbG9uZyBtcyApCisJCisJLyoqCisJICogUmVwb3J0cyB0aGUgZXZlbnQgZGVmaW5lZCBieSB0cywgY29kZSwgYW5kIG1zZy4KKwkgKiBAcGFyYW0gdHMgdGhlIGV2ZW50IHRpbWVzdGFtcAorCSAqIEBwYXJhbSBjb2RlIGEgc2ltcGxlIGNvZGUgZGVzY3JpYmluZyB0aGUgZXZlbnQuCisJICogQHBhcmFtIG1zZyBhIGRlc2NyaXB0aXZlIG1lc3NhZ2UuCisJICovCisJQE9uZXdheQorCXZvaWQgcmVwb3J0MiggRGF0ZXRpbWUgdHMsIGludCBjb2RlLCBzdHJpbmcgbXNnICkKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vZXRjaC9yZWFkbWUudHh0IGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9ldGNoL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyY2JjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vZXRjaC9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNCBAQAorZnJvbSB0aGlzIGRpcmVjdG9yeSwgZXRjaCBsaWtlIHRoaXM6CisKK2V0Y2ggLWIgamF2YSAgIC1kIC4uLy4uLy4uL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gvamF2YSAgIFBlcmYuZXRjaAorZXRjaCAtYiBjaHNhcnAgLWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9jc2hhcnAgUGVyZi5ldGNoCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wZXJmL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL3BlcmYvSW1wbFBlcmZDbGllbnQuamF2YSBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvcGVyZi9JbXBsUGVyZkNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTA2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9wZXJmL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL3BlcmYvSW1wbFBlcmZDbGllbnQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmY7CisKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlUGVyZkNsaWVudC4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgSW1wbFBlcmZDbGllbnQgZXh0ZW5kcyBCYXNlUGVyZkNsaWVudAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxQZXJmQ2xpZW50LgorCSAqCisJICogQHBhcmFtIHNlcnZlciBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCisJICovCisJcHVibGljIEltcGxQZXJmQ2xpZW50KCBSZW1vdGVQZXJmU2VydmVyIHNlcnZlciApCisJeworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVQZXJmU2VydmVyIHNlcnZlcjsKKworCS8vIFRPRE8gaW5zZXJ0IG1ldGhvZHMgaGVyZSB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBQZXJmQ2xpZW50CisJLy8gbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvcGVyZi9JbXBsUGVyZlNlcnZlci5qYXZhIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9wZXJmL0ltcGxQZXJmU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlMGViZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvcGVyZi9JbXBsUGVyZlNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmY7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvbjsKKworCisKKy8qKgorICogWW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgQmFzZVBlcmZTZXJ2ZXIuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4KKyAqLworcHVibGljIGNsYXNzIEltcGxQZXJmU2VydmVyIGV4dGVuZHMgQmFzZVBlcmZTZXJ2ZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsUGVyZlNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBjbGllbnQgYSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgY2xpZW50LgorCSAqLworCXB1YmxpYyBJbXBsUGVyZlNlcnZlciggUmVtb3RlUGVyZkNsaWVudCBjbGllbnQgKQorCXsKKwkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CisvLwkJbmFtZSA9ICJJbXBsUGVyZlNlcnZlckAiK0ludGVnZXIudG9TdHJpbmcoIGhhc2hDb2RlKCksIDM2ICk7CisvLwkJTG9nLnJlcG9ydCggIkltcGxQZXJmU2VydmVyVXAiLCAiaW5zdGFuY2UiLCB0aGlzICk7CisvLwkJdDAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVQZXJmQ2xpZW50IGNsaWVudDsKKwkKKy8vCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJCisvLwlwcml2YXRlIGZpbmFsIGxvbmcgdDA7CisJCisvLwlAT3ZlcnJpZGUKKy8vCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorLy8JeworLy8JCXJldHVybiBuYW1lOworLy8JfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJbnRlZ2VyIGFkZCggSW50ZWdlciB4LCBJbnRlZ2VyIHkgKQorCXsKKy8vCQlhZGRzKys7CisJCXJldHVybiB4ICsgeTsKKwl9CisJCisvLwlwcml2YXRlIGludCBhZGRzOworCisJQE92ZXJyaWRlCisJcHVibGljIEludGVnZXIgc3VtKCBpbnRbXSB2YWx1ZXMgKQorCXsKKy8vCQlzdW1zKys7CisJCWludCBzdW0gPSAwOworCQlmb3IgKGludCB2YWx1ZTogdmFsdWVzKQorCQkJc3VtICs9IHZhbHVlOworCQlyZXR1cm4gc3VtOworCX0KKwkKKy8vCXByaXZhdGUgaW50IHN1bXM7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXBvcnQoIEludGVnZXIgY29kZSwgU3RyaW5nIG1zZyApCisJeworLy8JCXJlcG9ydHMrKzsKKwl9CisJCisvLwlwcml2YXRlIGludCByZXBvcnRzOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBQb2ludCBkaXN0KCBQb2ludCBhLCBQb2ludCBiICkKKwl7CisvLwkJZGlzdHMrKzsKKwkJcmV0dXJuIG5ldyBQb2ludCggYi54IC0gYS54LCBiLnkgLSBhLnkgKTsKKwl9CisJCisvLwlwcml2YXRlIGludCBkaXN0czsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGF0ZSBhZGQyKCBEYXRlIHRzLCBMb25nIG1zICkKKwl7CisvLwkJYWRkMnMrKzsKKwkJcmV0dXJuIG5ldyBEYXRlKCB0cy5nZXRUaW1lKCkrbXMgKTsKKwl9CisJCisvLwlwcml2YXRlIGludCBhZGQyczsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXBvcnQyKCBEYXRlIHRzLCBJbnRlZ2VyIGNvZGUsIFN0cmluZyBtc2cgKQorCXsKKy8vCQlyZXBvcnQycysrOworCX0KKwkKKy8vCXByaXZhdGUgaW50IHJlcG9ydDJzOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgX3Nlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChldmVudCA9PSBTZXNzaW9uLkRPV04pCisJCXsKKy8vCQkJZG91YmxlIHRpbWUgPSAoU3lzdGVtLm5hbm9UaW1lKCkgLSB0MCkgLyAxMDAwMDAwMDAwLjA7CisvLwkJCWludCB0b3RhbCA9IGFkZHMgKyBzdW1zICsgcmVwb3J0cyArIGRpc3RzICsgYWRkMnMgKyByZXBvcnQyczsKKy8vCQkJZG91YmxlIHJhdGUgPSB0b3RhbCAvIHRpbWU7CisvLwkJCUxvZy5yZXBvcnQoICJJbXBsUGVyZlNlcnZlckRvd24iLAorLy8JCQkJImluc3RhbmNlIiwgdGhpcywKKy8vCQkJCSJhZGRzIiwgYWRkcywKKy8vCQkJCSJzdW1zIiwgc3VtcywKKy8vCQkJCSJyZXBvcnRzIiwgcmVwb3J0cywKKy8vCQkJCSJkaXN0cyIsIGRpc3RzLAorLy8JCQkJImFkZDJzIiwgYWRkMnMsCisvLwkJCQkicmVwb3J0MnMiLCByZXBvcnQycywKKy8vCQkJCSJ0b3RhbCIsIHRvdGFsLAorLy8JCQkJInRpbWUiLCB0aW1lLAorLy8JCQkJInJhdGUiLCByYXRlICk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9wZXJmL01haW5QZXJmQ2xpZW50LmphdmEgYi9leGFtcGxlcy9wZXJmL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL3BlcmYvTWFpblBlcmZDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI0YWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9wZXJmL01haW5QZXJmQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzNDYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZjsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZi5QZXJmLlBvaW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmLlBlcmZIZWxwZXIuUGVyZkNsaWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmYuUGVyZkhlbHBlci5QZXJmU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlBlcmZUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisKKy8qKgorICogTWFpbiBwcm9ncmFtIGZvciBQZXJmQ2xpZW50LiBUaGlzIHByb2dyYW0gbWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBsaXN0ZW5lcgorICogY3JlYXRlZCBieSBNYWluUGVyZkxpc3RlbmVyLgorICovCitwdWJsaWMgY2xhc3MgTWFpblBlcmZDbGllbnQgaW1wbGVtZW50cyBQZXJmQ2xpZW50RmFjdG9yeSwgUGVyZlNlcnZlckZhY3RvcnkKK3sKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXJpOworCisJcHJpdmF0ZSBzdGF0aWMgaW50IG1heFdhaXRUaW1lOworCisJcHJpdmF0ZSBzdGF0aWMgaW50IHJ1bnRpbWU7CisKKwlwcml2YXRlIHN0YXRpYyBpbnQgdHJpYWxzOworCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmdWxsOworCisJcHJpdmF0ZSBzdGF0aWMgaW50W10gdGhyZWFkQ291bnRzOworCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdGFydExpc3RlbmVyOworCisJcHJpdmF0ZSBzdGF0aWMgTWFpblBlcmZDbGllbnQgaW1wbEZhY3Rvcnk7CisKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIFBlcmZDbGllbnQuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLmFkZFNpbmsoIG51bGwgKTsKKwkJTG9nLnJlcG9ydCggIk1haW5QZXJmQ2xpZW50IiApOworCisJCXVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwNCI7CisJCW1heFdhaXRUaW1lID0gNDAwMDsKKwkJcnVudGltZSA9IDQ7CisJCXRyaWFscyA9IDM7CisJCWZ1bGwgPSBmYWxzZTsKKwkJdGhyZWFkQ291bnRzID0gbmV3IGludFtdCisJCXsKKwkJCTEKKwkJfTsKKwkJc3RhcnRMaXN0ZW5lciA9IGFyZ3MubGVuZ3RoID09IDEgJiYgYXJnc1swXS5lcXVhbHMoICJzdGFydExpc3RlbmVyIiApOworCisJCWltcGxGYWN0b3J5ID0gbmV3IE1haW5QZXJmQ2xpZW50KCk7CisKKwkJZmluYWwgU2VydmVyRmFjdG9yeSBsaXN0ZW5lcjsKKworCQlpZiAoc3RhcnRMaXN0ZW5lcikKKwkJeworCQkJbGlzdGVuZXIgPSBQZXJmSGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsIGltcGxGYWN0b3J5ICk7CisJCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIG1heFdhaXRUaW1lICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsaXN0ZW5lciA9IG51bGw7CisJCX0KKworCQkvLyBtYWtlIHN1cmUgdGVzdCBpbnRlcmZhY2VzIHdvcmsuCisJCQorCQlxdWFsaWZ5KCk7CisKKwkJLy8gcnVuIHRlc3RzCisKKwkJZm9yIChpbnQgblRocmVhZHMgOiB0aHJlYWRDb3VudHMpCisJCXsKKwkJCXBlcmZBZGQoIG5UaHJlYWRzICk7CisJCQlwZXJmQXN5bmNBZGQoIG5UaHJlYWRzICk7CisJCQlwZXJmUmVwb3J0KCBuVGhyZWFkcyApOworCQkJaWYgKGZ1bGwpCisJCQl7CisJCQkJcGVyZlN1bSggblRocmVhZHMgKTsKKwkJCQlwZXJmRGlzdCggblRocmVhZHMgKTsKKwkJCQlwZXJmQWRkMiggblRocmVhZHMgKTsKKwkJCQlwZXJmUmVwb3J0MiggblRocmVhZHMgKTsKKwkJCX0KKwkJfQorCisJCWlmIChsaXN0ZW5lciAhPSBudWxsKQorCQkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUT1BfQU5EX1dBSVRfRE9XTiwgbWF4V2FpdFRpbWUgKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZSZXBvcnQyKCBpbnQgdGhyZWFkcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW5ldyBQZXJmVGVzdCggInJlcG9ydDIiLCBydW50aW1lLCB0cmlhbHMsIHRocmVhZHMgKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1biggbG9uZyBuICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCVJlbW90ZVBlcmZTZXJ2ZXIgc2VydmVyID0gc3RhcnRTZXJ2ZXIoKTsKKwkJCQkKKwkJCQlmaW5hbCBEYXRlIGQgPSBuZXcgRGF0ZSgpOworCQkJCQorCQkJCXdoaWxlIChuLS0gPiAwKQorCQkJCQlzZXJ2ZXIKKwkJCQkJCS5yZXBvcnQyKCBkLCAyMywKKwkJCQkJCS8vIDUwIGNoYXJhY3RlcnM6CisJCQkJCQkJInRoaXMgbWVzc2FnZSBkZXNjcmliZXMgdGhlIHNwZWNpZmljcyBvZiBhIGNvZGUgMjMuIiApOworCisJCQkJLy8gc3luYyB1cCB3aXRoIG1lc3NhZ2Ugc3RyZWFtLgorCQkJCUFzc2VydGlvbi5jaGVjayggc2VydmVyLmFkZCggOCwgOSApID09IDE3LAorCQkJCQkic2VydmVyLmFkZCggOCwgOSApID09IDE3IiApOworCisJCQkJc3RvcFNlcnZlciggc2VydmVyICk7CisJCQl9CisJCX0ucnVuKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmQWRkMiggaW50IHRocmVhZHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQluZXcgUGVyZlRlc3QoICJhZGQyIiwgcnVudGltZSwgdHJpYWxzLCB0aHJlYWRzICkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oIGxvbmcgbiApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlSZW1vdGVQZXJmU2VydmVyIHNlcnZlciA9IHN0YXJ0U2VydmVyKCk7CisKKwkJCQlmaW5hbCBEYXRlIGQgPSBuZXcgRGF0ZSgpOworCQkJCWZpbmFsIGxvbmcgYWRqID0gMzYwMDAwMEw7IC8vIDEgaG91cgorCisJCQkJd2hpbGUgKG4tLSA+IDApCisJCQkJCXNlcnZlci5hZGQyKCBkLCBhZGogKTsKKworCQkJCXN0b3BTZXJ2ZXIoIHNlcnZlciApOworCQkJfQorCQl9LnJ1bigpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgcGVyZkRpc3QoIGludCB0aHJlYWRzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IFBlcmZUZXN0KCAiZGlzdCIsIHJ1bnRpbWUsIHRyaWFscywgdGhyZWFkcyApCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCBsb25nIG4gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJUmVtb3RlUGVyZlNlcnZlciBzZXJ2ZXIgPSBzdGFydFNlcnZlcigpOworCQkJCQorCQkJCWZpbmFsIGludCBYID0gMTAwMDAwMDAwMDsKKwkJCQlmaW5hbCBpbnQgWSA9IDIwMDAwMDAwMDA7CisKKwkJCQl3aGlsZSAobi0tID4gMCkKKwkJCQkJc2VydmVyLmRpc3QoIG5ldyBQb2ludCggMSwgMiApLCBuZXcgUG9pbnQoIFgsIFkgKSApOworCisJCQkJc3RvcFNlcnZlciggc2VydmVyICk7CisJCQl9CisJCX0ucnVuKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmU3VtKCBpbnQgdGhyZWFkcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIGludFtdIHZhbHVlcyA9IG5ldyBpbnRbMTAwMF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorCQkJdmFsdWVzW2ldID0gaTsKKworCQluZXcgUGVyZlRlc3QoICJzdW0tIiArIHZhbHVlcy5sZW5ndGgsIHJ1bnRpbWUsIHRyaWFscywgdGhyZWFkcyApCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCBsb25nIG4gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJUmVtb3RlUGVyZlNlcnZlciBzZXJ2ZXIgPSBzdGFydFNlcnZlcigpOworCisJCQkJd2hpbGUgKG4tLSA+IDApCisJCQkJCXNlcnZlci5zdW0oIHZhbHVlcyApOworCisJCQkJc3RvcFNlcnZlciggc2VydmVyICk7CisJCQl9CisJCX0ucnVuKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmUmVwb3J0KCBpbnQgdGhyZWFkcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW5ldyBQZXJmVGVzdCggInJlcG9ydCIsIHJ1bnRpbWUsIHRyaWFscywgdGhyZWFkcyApCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCBsb25nIG4gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJUmVtb3RlUGVyZlNlcnZlciBzZXJ2ZXIgPSBzdGFydFNlcnZlcigpOworCisJCQkJd2hpbGUgKG4tLSA+IDApCisJCQkJCXNlcnZlci5yZXBvcnQoIDIzLAorCQkJCQkvLyA1MCBjaGFyYWN0ZXJzOgorCQkJCQkJInRoaXMgbWVzc2FnZSBkZXNjcmliZXMgdGhlIHNwZWNpZmljcyBvZiBhIGNvZGUgMjMuIiApOworCisJCQkJLy8gc3luYyB1cCB3aXRoIG1lc3NhZ2Ugc3RyZWFtLgorCQkJCUFzc2VydGlvbi5jaGVjayggc2VydmVyLmFkZCggOCwgOSApID09IDE3LAorCQkJCQkic2VydmVyLmFkZCggOCwgOSApID09IDE3IiApOworCisJCQkJc3RvcFNlcnZlciggc2VydmVyICk7CisJCQl9CisJCX0ucnVuKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmQXN5bmNBZGQoIGludCB0aHJlYWRzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IFBlcmZUZXN0KCAiYXN5bmMgYWRkIiwgcnVudGltZSwgdHJpYWxzLCB0aHJlYWRzICkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oIGxvbmcgbiApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlSZW1vdGVQZXJmU2VydmVyIHNlcnZlciA9IHN0YXJ0U2VydmVyKCk7CisJCQkJCisJCQkJZmluYWwgaW50IFggPSAxMDAwMDAwMDAwOworCQkJCWZpbmFsIGludCBZID0gMjAwMDAwMDAwMDsKKworCQkJCWlmIChuLS0gPiAwKQorCQkJCXsKKwkJCQkJTWFpbGJveCBtYjEgPSBzZXJ2ZXIuX2FzeW5jLl9iZWdpbl9hZGQoIFgsIFkgKTsKKwkJCQkJd2hpbGUgKG4tLSA+IDApCisJCQkJCXsKKwkJCQkJCU1haWxib3ggbWIyID0gc2VydmVyLl9hc3luYy5fYmVnaW5fYWRkKCBYLCBZICk7CisJCQkJCQlzZXJ2ZXIuX2FzeW5jLl9lbmRfYWRkKCBtYjEgKTsKKwkJCQkJCW1iMSA9IG1iMjsKKwkJCQkJfQorCQkJCQlzZXJ2ZXIuX2FzeW5jLl9lbmRfYWRkKCBtYjEgKTsKKwkJCQl9CisKKwkJCQlzdG9wU2VydmVyKCBzZXJ2ZXIgKTsKKwkJCX0KKwkJfS5ydW4oKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZBZGQoIGludCB0aHJlYWRzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IFBlcmZUZXN0KCAiYWRkIiwgcnVudGltZSwgdHJpYWxzLCB0aHJlYWRzICkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oIGxvbmcgbiApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlSZW1vdGVQZXJmU2VydmVyIHNlcnZlciA9IHN0YXJ0U2VydmVyKCk7CisJCQkJCisJCQkJZmluYWwgaW50IFggPSAxMDAwMDAwMDAwOworCQkJCWZpbmFsIGludCBZID0gMjAwMDAwMDAwMDsKKworCQkJCXdoaWxlIChuLS0gPiAwKQorCQkJCQlzZXJ2ZXIuYWRkKCBYLCBZICk7CisKKwkJCQlzdG9wU2VydmVyKCBzZXJ2ZXIgKTsKKwkJCX0KKwkJfS5ydW4oKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZW1vdGVQZXJmU2VydmVyIHN0YXJ0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUmVtb3RlUGVyZlNlcnZlciBzZXJ2ZXIgPSBQZXJmSGVscGVyLm5ld1NlcnZlciggdXJpLCBudWxsLCBpbXBsRmFjdG9yeSApOworCQlzZXJ2ZXIuX3N0YXJ0QW5kV2FpdFVwKCBtYXhXYWl0VGltZSApOworCQlyZXR1cm4gc2VydmVyOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc3RvcFNlcnZlciggUmVtb3RlUGVyZlNlcnZlciBzZXJ2ZXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzZXJ2ZXIuX3N0b3BBbmRXYWl0RG93biggbWF4V2FpdFRpbWUgKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHF1YWxpZnkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSZW1vdGVQZXJmU2VydmVyIHNlcnZlciA9IHN0YXJ0U2VydmVyKCk7CisKKwkJQXNzZXJ0aW9uLmNoZWNrKCBzZXJ2ZXIuYWRkKCAyLCAzICkgPT0gNSwgInNlcnZlci5hZGQoIDIsIDMgKSA9PSA1IiApOworCisJCUFzc2VydGlvbi5jaGVjayggc2VydmVyLmFkZCggMywgNCApID09IDcsICJzZXJ2ZXIuYWRkKCAzLCA0ICkgPT0gNyIgKTsKKworCQlBc3NlcnRpb24uY2hlY2soIHNlcnZlci5zdW0oIG5ldyBpbnRbXQorCQl7CisJCQkxLCAyLCAzCisJCX0gKSA9PSA2LCAic2VydmVyLnN1bSggbmV3IGludFtdIHsgMSwgMiwgMyB9ICkgPT0gNiIgKTsKKworCQlBc3NlcnRpb24uY2hlY2soIHNlcnZlci5zdW0oIG5ldyBpbnRbXQorCQl7CisJCQkyLCAzLCA0CisJCX0gKSA9PSA5LCAic2VydmVyLnN1bSggbmV3IGludFtdIHsgMiwgMywgNCB9ICkgPT0gOSIgKTsKKworCQlzZXJ2ZXIucmVwb3J0KCAxOCwgInN0YXJ0aW5nIiApOworCisJCXNlcnZlci5yZXBvcnQoIDE5LCAic3RvcHBpbmciICk7CisKKwkJUG9pbnQgciA9IHNlcnZlci5kaXN0KCBuZXcgUG9pbnQoIDEsIDIgKSwgbmV3IFBvaW50KCAzLCA1ICkgKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCByLnggPT0gMiwgInIueCA9PSAyIiApOworCQlBc3NlcnRpb24uY2hlY2soIHIueSA9PSAzLCAici55ID09IDMiICk7CisKKwkJciA9IHNlcnZlci5kaXN0KCBuZXcgUG9pbnQoIDEwLCA5ICksIG5ldyBQb2ludCggNCwgNSApICk7CisJCUFzc2VydGlvbi5jaGVjayggci54ID09IC02LCAici54ID09IC02IiApOworCQlBc3NlcnRpb24uY2hlY2soIHIueSA9PSAtNCwgInIueSA9PSAtNCIgKTsKKworCQlEYXRlIHQwID0gbmV3IERhdGUoKTsKKwkJbG9uZyBhZGogPSAzNjAwMDAwTDsKKworCQlEYXRlIHQxID0gc2VydmVyLmFkZDIoIHQwLCBhZGogKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCB0MS5nZXRUaW1lKCkgLSB0MC5nZXRUaW1lKCkgPT0gYWRqLCBTdHJpbmcuZm9ybWF0KAorCQkJInNlcnZlci5hZGQyKCAlcywgJXMgKSA9PiAlcyBbYm9ndXMhXSIsIHQwLCBhZGosIHQxICkgKTsKKworCQl0MSA9IHNlcnZlci5hZGQyKCB0MCwgLWFkaiApOworCQlBc3NlcnRpb24uY2hlY2soIHQxLmdldFRpbWUoKSAtIHQwLmdldFRpbWUoKSA9PSAtYWRqLCBTdHJpbmcuZm9ybWF0KAorCQkJInNlcnZlci5hZGQyKCAlcywgJXMgKSA9PiAlcyBbYm9ndXMhXSIsIHQwLCAtYWRqLCB0MSApICk7CisKKwkJc2VydmVyLnJlcG9ydDIoIG5ldyBEYXRlKCksIDIwLCAiYmVnaW4iICk7CisKKwkJc2VydmVyLnJlcG9ydDIoIG5ldyBEYXRlKCksIDIxLCAiZW5kIiApOworCisJCXN0b3BTZXJ2ZXIoIHNlcnZlciApOworCX0KKworCXB1YmxpYyBQZXJmQ2xpZW50IG5ld1BlcmZDbGllbnQoIFJlbW90ZVBlcmZTZXJ2ZXIgc2VydmVyICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBJbXBsUGVyZkNsaWVudCggc2VydmVyICk7CisJfQorCisJcHVibGljIFBlcmZTZXJ2ZXIgbmV3UGVyZlNlcnZlciggUmVtb3RlUGVyZkNsaWVudCBjbGllbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IEltcGxQZXJmU2VydmVyKCBjbGllbnQgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9wZXJmL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2V4YW1wbGVzL3BlcmYvTWFpblBlcmZMaXN0ZW5lci5qYXZhIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9wZXJmL01haW5QZXJmTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDA1NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9wZXJmL01haW5QZXJmTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmY7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgUGVyZlNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW5QZXJmQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpblBlcmZMaXN0ZW5lciBpbXBsZW1lbnRzIFBlcmZIZWxwZXIuUGVyZlNlcnZlckZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIFBlcmZTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmcgLi4uIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cuYWRkU2luayggbnVsbCApOworCQlMb2cucmVwb3J0KCAiTWFpblBlcmZMaXN0ZW5lciIgKTsKKwkJCisJCWZpbmFsIFN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDQiOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IFBlcmZIZWxwZXIubmV3TGlzdGVuZXIoIHVyaSwgbnVsbCwKKwkJCW5ldyBNYWluUGVyZkxpc3RlbmVyKCkgKTsKKworCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbiggInJlYWR5IiApOworCX0KKworCXB1YmxpYyBQZXJmU2VydmVyIG5ld1BlcmZTZXJ2ZXIoIFJlbW90ZVBlcmZDbGllbnQgY2xpZW50ICkKKwl7CisJCXJldHVybiBuZXcgSW1wbFBlcmZTZXJ2ZXIoIGNsaWVudCApOworCX0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL3Rlc3QvY3NoYXJwL1BlcmZUZXN0UHJvai9QZXJmVGVzdFByb2ouY3Nwcm9qIGIvZXhhbXBsZXMvcGVyZi9zcmMvdGVzdC9jc2hhcnAvUGVyZlRlc3RQcm9qL1BlcmZUZXN0UHJvai5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0OGRjMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvc3JjL3Rlc3QvY3NoYXJwL1BlcmZUZXN0UHJvai9QZXJmVGVzdFByb2ouY3Nwcm9qCkBAIC0wLDAgKzEsMTI5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NDdGREIxNUMtNkRFMi00MTkxLUE0MUMtMTk5M0I3MTRCNENEfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+UGVyZlRlc3RQcm9qPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+UGVyZlRlc3RQcm9qPC9Bc3NlbWJseU5hbWU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5mcmFtZXdvcmssIFZlcnNpb249Mi40LjcuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05NmQwOWExZWI3ZjQ0YTc3LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8SGludFBhdGg+JChOVU5JVF9IT01FKVxiaW5cbnVuaXQuZnJhbWV3b3JrLmRsbDwvSGludFBhdGg+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXEJhc2VQZXJmQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPkJhc2VQZXJmQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxCYXNlUGVyZlNlcnZlci5jcyI+CisgICAgICA8TGluaz5CYXNlUGVyZlNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUGVyZi5jcyI+CisgICAgICA8TGluaz5QZXJmLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxQZXJmQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPlBlcmZDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFBlcmZIZWxwZXIuY3MiPgorICAgICAgPExpbms+UGVyZkhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUGVyZlNlcnZlci5jcyI+CisgICAgICA8TGluaz5QZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxSZW1vdGVQZXJmLmNzIj4KKyAgICAgIDxMaW5rPlJlbW90ZVBlcmYuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFJlbW90ZVBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+UmVtb3RlUGVyZkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcUmVtb3RlUGVyZlNlcnZlci5jcyI+CisgICAgICA8TGluaz5SZW1vdGVQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxTdHViUGVyZi5jcyI+CisgICAgICA8TGluaz5TdHViUGVyZi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmZcU3R1YlBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+U3R1YlBlcmZDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5leGFtcGxlcy5wZXJmXFN0dWJQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZlxWYWx1ZUZhY3RvcnlQZXJmLmNzIj4KKyAgICAgIDxMaW5rPlZhbHVlRmFjdG9yeVBlcmYuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2guZXhhbXBsZXMucGVyZlxJbXBsUGVyZkNsaWVudC5jcyI+CisgICAgICA8TGluaz5JbXBsUGVyZkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC5leGFtcGxlcy5wZXJmXEltcGxQZXJmU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkltcGxQZXJmU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLmV4YW1wbGVzLnBlcmZcTWFpblBlcmZDbGllbnQuY3MiPgorICAgICAgPExpbms+TWFpblBlcmZDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2guZXhhbXBsZXMucGVyZlxNYWluUGVyZkxpc3RlbmVyLmNzIj4KKyAgICAgIDxMaW5rPk1haW5QZXJmTGlzdGVuZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2guZXhhbXBsZXMucGVyZlxUZXN0UGVyZlNlcnZlci5jcyI+CisgICAgICA8TGluaz5UZXN0UGVyZlNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXC4uXC4uXGJpbmRpbmctY3NoYXJwXHJ1bnRpbWVcc3JjXG1haW5cY3NoYXJwXEV0Y2hQcm9qLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkV0Y2hQcm9qPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGVyZi9zcmMvdGVzdC9jc2hhcnAvUGVyZlRlc3RQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvZXhhbXBsZXMvcGVyZi9zcmMvdGVzdC9jc2hhcnAvUGVyZlRlc3RQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjRjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9wZXJmL3NyYy90ZXN0L2NzaGFycC9QZXJmVGVzdFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1MCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorLy8gdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiUGVyZlRlc3RQcm9qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlBlcmZUZXN0UHJvaiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgMjAwOCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiMjgxNDcyZmYtYjYzNC00ZTJhLTkzZGQtOTU5MWU3Yjg3NWY2IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIFJldmlzaW9uIGFuZCBCdWlsZCBOdW1iZXJzIAorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL3Rlc3QvY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9UZXN0UGVyZlNlcnZlci5jcyBiL2V4YW1wbGVzL3BlcmYvc3JjL3Rlc3QvY3NoYXJwL2V0Y2guZXhhbXBsZXMucGVyZi9UZXN0UGVyZlNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWE1ODk3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZi9zcmMvdGVzdC9jc2hhcnAvZXRjaC5leGFtcGxlcy5wZXJmL1Rlc3RQZXJmU2VydmVyLmNzCkBAIC0wLDAgKzEsMTI3IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2guZXhhbXBsZXMucGVyZi50eXBlcy5QZXJmOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmYKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVW5pdCBUZXN0cyB0byB0ZXN0IFBlcmYKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RQZXJmU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBSZW1vdGVQZXJmU2VydmVyIHNlcnZlcjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBTdGFydExpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAxMCI7CisKKyAgICAgICAgICAgIE1haW5QZXJmTGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpblBlcmZMaXN0ZW5lcigpOworICAgICAgICAgICAgbGlzdGVuZXIgPSBQZXJmSGVscGVyLk5ld0xpc3RlbmVyKHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkpOworCisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJMaXN0ZW5lciBTdGFydGVkIik7CisKKyAgICAgICAgfQorCisgICAgICAgIFtTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgTWFrZUNvbm5lY3Rpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDEwIjsKKworICAgICAgICAgICAgTWFpblBlcmZDbGllbnQgY2xpZW50ID0gbmV3IE1haW5QZXJmQ2xpZW50KCk7CisgICAgICAgICAgICBzZXJ2ZXIgPSBQZXJmSGVscGVyLk5ld1NlcnZlcih1cmksIG51bGwsIGNsaWVudCk7CisKKyAgICAgICAgICAgIHNlcnZlci5fU3RhcnRBbmRXYWl0VXAoNDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2hlY2tDb25uZWN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChzZXJ2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RBZGQoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQ/IHJlc3VsdCA9IHNlcnZlci5hZGQoMywgNSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QWRkMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGVUaW1lPyBkID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgbG9uZz8gbXMgPSAxMDAwOworICAgICAgICAgICAgRGF0ZVRpbWU/IGV4cGVjdGVkRGF0ZSA9IGQuVmFsdWUgKyBuZXcgVGltZVNwYW4obXMuVmFsdWUgKiAxMDAwMCk7CisgICAgICAgICAgICBEYXRlVGltZT8gcmV0RGF0ZSA9IHNlcnZlci5hZGQyKGQsIG1zKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUuVmFsdWUuVG9TdHJpbmcoKSwgcmV0RGF0ZS5WYWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0U3VtKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50W10gYSA9IHsgMSwgMiwgMyB9OworICAgICAgICAgICAgaW50PyByZXN1bHQgPSBzZXJ2ZXIuc3VtKGEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdERpc3RhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgUG9pbnQgYSA9IG5ldyBQb2ludCgyLCAzKTsKKyAgICAgICAgICAgIFBvaW50IGIgPSBuZXcgUG9pbnQoNCwgNSk7CisgICAgICAgICAgICBQb2ludCByZXN1bHQgPSBzZXJ2ZXIuZGlzdChhLCBiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQueCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LnkpOworICAgICAgICB9CisKKworICAgICAgICBbVGVhckRvd25dCisgICAgICAgIHB1YmxpYyB2b2lkIENsb3NlQ29ubmVjdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuX1N0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Rml4dHVyZVRlYXJEb3duXQorICAgICAgICBwdWJsaWMgdm9pZCBTdG9wTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BlcmYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvcGVyZi9UZXN0UGVyZlNlcnZlci5qYXZhIGIvZXhhbXBsZXMvcGVyZi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9leGFtcGxlcy9wZXJmL1Rlc3RQZXJmU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljY2I5ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BlcmYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvZXhhbXBsZXMvcGVyZi9UZXN0UGVyZlNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmY7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmV4YW1wbGVzLnBlcmYuUGVyZi5Qb2ludDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiAqLworcHVibGljIGNsYXNzIFRlc3RQZXJmU2VydmVyCit7CisKKwkvKiogdHJhbnNwb3J0ICovCisJcHVibGljIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworCQorCVJlbW90ZVBlcmZTZXJ2ZXIgc2VydmVyOworCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5hZGRTaW5rKG51bGwpOworCQlMb2cucmVwb3J0KCJTdGFydEV4YW1wbGVMaXN0ZW5lciIpOworCQkJCisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDkiOworCQlNYWluUGVyZkxpc3RlbmVyIGltcGxGYWN0b3J5ID0gbmV3IE1haW5QZXJmTGlzdGVuZXIoKTsKKwkJbGlzdGVuZXIgPSBQZXJmSGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsIGltcGxGYWN0b3J5ICk7CisKKwkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisJCisJCUxvZy5yZXBvcnQoICJTdGFydEV4YW1wbGVMaXN0ZW5lciIsCisJCQkJInN0YXR1cyIsICJ1cCIsCisJCQkJImxpc3RlbmVyIiwgbGlzdGVuZXIgKTsKKwl9CisKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHN0b3BMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChsaXN0ZW5lciAhPSBudWxsKQorCQl7CisJCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RPUF9BTkRfV0FJVF9ET1dOLCA0MDAwICk7CisJCQlsaXN0ZW5lciA9IG51bGw7CisJCX0KKwl9CisJCisJLyoqCisJICogQ29ubmVjdCBjbGllbnQgdG8gc2VydmUKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBtYWtlQ29ubmVjdGlvbigpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDkiOworCisJCXNlcnZlciA9IFBlcmZIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsIG5ldyBNYWluUGVyZkNsaWVudCgpICk7CisKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCX0KKworCS8qKgorCSAqIFNodXRkb3duIGNvbm5lY3Rpb24gdG8gc2VydmVyCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAQWZ0ZXIKKwlwdWJsaWMgdm9pZCBzaHV0Q29ubmVjdGlvbigpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJeworCQkJc2VydmVyLl9zdG9wKCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrQ29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKHNlcnZlcik7CisJfQorCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IHJlc3VsdCA9IHNlcnZlci5hZGQoIDMsIDUgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggOCwgcmVzdWx0KTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRGF0ZSBkID0gbmV3IERhdGUoKTsKKwkJbG9uZyBtcyA9IDEwMDA7CisJCURhdGUgcmV0RGF0ZSA9IHNlcnZlci5hZGQyKCBkLCBtcyApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXcgRGF0ZShkLmdldFRpbWUoKSArIG1zKSwgcmV0RGF0ZSApOworCX0KKwkKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFN1bSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludFtdIGEgPSB7MSwyLDN9OworCQlpbnQgcmVzdWx0ID0gc2VydmVyLnN1bSggYSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA2LCByZXN1bHQgKTsKKwl9CisJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REaXN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBvaW50IGEgPSBuZXcgUG9pbnQoMiwzKTsKKwkJUG9pbnQgYiA9IG5ldyBQb2ludCg0LDUpOworCQlQb2ludCByZXN1bHQgPSBzZXJ2ZXIuZGlzdCggYSwgYiApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCByZXN1bHQuZ2V0WCgpLmludFZhbHVlKCkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgcmVzdWx0LmdldFkoKS5pbnRWYWx1ZSgpICk7CisJCQorCX0KKwkKKworCit9CmRpZmYgLS1naXQgYS9pbnN0YWxsZXJzL2J1aWxkLnhtbCBiL2luc3RhbGxlcnMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDM4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbnN0YWxsZXJzL2J1aWxkLnhtbApAQCAtMCwwICsxLDEwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9Imluc3RhbGxlcnMiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiPgorICAgIDxkZXNjcmlwdGlvbj5JbnN0YWxsZXJzLCAuemlwIGFuZCAudGFyLmd6IHBhY2thZ2VzPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPCEtLSBTdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgc3ViLXByb2plY3QgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InByb2oiICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLmJhc2VkaXJ9L2luc3RhbGxlcnMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtwcm9qfS90YXJnZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InBhY2thZ2VOYW1lIiAgICAgICAgICB2YWx1ZT0iJHtFdGNoLmxvbmduYW1lfSIgLz4KKworICAgIDwhLS0gSU5JVCBUQVJHRVQgLS0+CisgICAgPCEtLSBNb2RpZnkgdGhpcyB0YXJnZXQgdG8gZGVmaW5lIHByb2plY3Qgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNhbiBvbmx5IGJlIHNldCBhdCBydW50aW1lIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8taW5pdCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7RXRjaC5kaXN0fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBDTEVBTiBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1jbGVhbiI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIEJVSUxEIFRBUkdFVCAtLT4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tdHh0cyI+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9MSUNFTlNFLnR4dCIgdG9kaXI9IiR7RXRjaC5kaXN0fSIgLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtFdGNoLmJhc2VkaXJ9L0NoYW5nZUxvZy50eHQiIHRvZGlyPSIke0V0Y2guZGlzdH0iIC8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9SRUFETUUudHh0IiB0b2ZpbGU9IiR7RXRjaC5kaXN0fS9SRUFETUUudHh0IiAvPgorICAgICAgICA8Y29weSBmaWxlPSIke0V0Y2guYmFzZWRpcn0vUkVMRUFTRV9OT1RFUy50eHQiIHRvZmlsZT0iJHtFdGNoLmRpc3R9L1JFTEVBU0VfTk9URVMudHh0IiAvPgorICAgICAgICA8Y29weSBmaWxlPSIke0V0Y2guYmFzZWRpcn0vTk9USUNFLnR4dCIgdG9maWxlPSIke0V0Y2guZGlzdH0vTk9USUNFLnR4dCIgLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtwcm9qfS9ldGNoLW1hdmVuLWluc3RhbGwuYmF0IiB0b2Rpcj0iJHtFdGNoLmRpc3R9L21hdmVuIiA+CisgICAgICAgICAgICA8ZmlsdGVyc2V0IHJlZmlkPSJFdGNoLmJ1aWxkVG9rZW5zIiAvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXppcHMiID4KKyAgICAgICAgPCEtLSBjcmVhdGUgemlwcGVkIGJpbmFyeSBkaXN0cmlidXRpb24gLS0+CisgICAgICAgIDx6aXAgZGVzdGZpbGU9IiR7dGFyZ2V0fS8ke3BhY2thZ2VOYW1lfS56aXAiID4KKyAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtFdGNoLmRpc3R9IiBwcmVmaXg9IiR7cGFja2FnZU5hbWV9LyIgPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJpbi9ldGNoIiAvPgorICAgICAgICAgICAgPC96aXBmaWxlc2V0PgorICAgICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIke0V0Y2guZGlzdH0iIHByZWZpeD0iJHtwYWNrYWdlTmFtZX0vIiBmaWxlbW9kZT0iNzU1IiA+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYmluL2V0Y2giIC8+CisgICAgICAgICAgICA8L3ppcGZpbGVzZXQ+ICAgICAgICAgICAgICAgIAorICAgICAgICA8L3ppcD4KKworICAgICAgICA8IS0tIGNyZWF0ZSB0YXItZ3ppcCBiaW5hcnkgZGlzdHJpYnV0aW9uIC0tPgorICAgICAgICA8dGFyIGRlc3RmaWxlPSIke3RhcmdldH0vJHtwYWNrYWdlTmFtZX0udGFyLmd6IiBjb21wcmVzc2lvbj0iZ3ppcCIgPgorICAgICAgICAgICAgPHRhcmZpbGVzZXQgZGlyPSIke0V0Y2guZGlzdH0iIHByZWZpeD0iJHtwYWNrYWdlTmFtZX0vIj4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJiaW4vZXRjaCIgLz4KKyAgICAgICAgICAgIDwvdGFyZmlsZXNldD4KKyAgICAgICAgICAgIDx0YXJmaWxlc2V0IGRpcj0iJHtFdGNoLmRpc3R9IiBwcmVmaXg9IiR7cGFja2FnZU5hbWV9LyIgZmlsZW1vZGU9Ijc1NSIgPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImJpbi9ldGNoIiAvPgorICAgICAgICAgICAgPC90YXJmaWxlc2V0PgorICAgICAgICA8L3Rhcj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tbnNpcyIgaWY9Ik5TSVMuZW5hYmxlZCIgPgorICAgICAgICA8bWFrZW5zaXMgZGVzdGZpbGU9IiR7dGFyZ2V0fS8ke3BhY2thZ2VOYW1lfS1zZXR1cC5leGUiIHJvb3Q9IiR7RXRjaC5iYXNlZGlyfSIgZGlyPSJpbnN0YWxsZXJzIiBzY3JpcHQ9ImV0Y2gtZnVsbC1pbnN0YWxsZXIiIC8+ICAgICAgICAKKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tYnVpbGQiIGRlcGVuZHM9ImRvLXR4dHMsZG8tbnNpcyxkby16aXBzIiAvPgorCisgICAgPCEtLSBURVNUIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXRlc3QiPgorCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIiBmaWxlPSIke0V0Y2gucnVudGltZS50ZXN0cy5mYWlsfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBQT1NUQlVJTEQgVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8tcG9zdGJ1aWxkIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtFdGNoLmJhc2VkaXJ9L3RhcmdldC9JbnN0YWxsZXJzIiAvPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtFdGNoLmJhc2VkaXJ9L3RhcmdldC9JbnN0YWxsZXJzL3BhY2thZ2VzIiA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGFyZ2V0fSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi56aXAiIC8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5leGUiIC8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi50YXIuZ3oiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG8tcHVibGlzaCIgaWY9ImJ1aWxkLnRlc3RzLmZhaWwiPgorICAgICAgICA8IS0tIFNldCBmbGFnIGZpbGUgaWYgYW55IHRlc3RzIGZhaWxlZCAtLT4KKyAgICAgICAgPHRvdWNoIGZpbGU9IiR7RXRjaC5ydW50aW1lLnRlc3RzLmZhaWx9Ii8+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2luc3RhbGxlcnMvZXRjaC1mdWxsLWluc3RhbGxlci5uc2kgYi9pbnN0YWxsZXJzL2V0Y2gtZnVsbC1pbnN0YWxsZXIubnNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDg3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbnN0YWxsZXJzL2V0Y2gtZnVsbC1pbnN0YWxsZXIubnNpCkBAIC0wLDAgKzEsMjEzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisjIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCishZGVmaW5lIFBST0RVQ1RfTkFNRSAiQXBhY2hlIEV0Y2giCishaWZuZGVmIFBST0RVQ1RfVkVSU0lPTgorICAgICFkZWZpbmUgUFJPRFVDVF9WRVJTSU9OICIxLjAiCishZW5kaWYKKyFkZWZpbmUgUFJPRFVDVF9QVUJMSVNIRVIgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgorIWRlZmluZSBQUk9EVUNUX1dFQl9TSVRFICJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvcHJvamVjdHMvZXRjaC5odG1sIgorIWRlZmluZSBQUk9EVUNUX1VOSU5TVF9LRVkgIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwke1BST0RVQ1RfTkFNRX0tJHtQUk9EVUNUX1ZFUlNJT059IgorIWRlZmluZSBQUk9EVUNUX1VOSU5TVF9ST09UX0tFWSAiSEtMTSIKKyFpZm5kZWYgUk9PVF9ESVJFQ1RPUlkKKyAgICAhZGVmaW5lIFJPT1RfRElSRUNUT1JZICIuLlx0YXJnZXRcSW5zdGFsbGVyc1xkaXN0IgorIWVuZGlmCishaWZuZGVmIE9VVF9GSUxFCisgICAgIWRlZmluZSBPVVRfRklMRSAiYXBhY2hlLWV0Y2gtJHtQUk9EVUNUX1ZFUlNJT059LXdpbjMyLXNldHVwLmV4ZSIKKyFlbmRpZgorCishaW5jbHVkZSBXaW5NZXNzYWdlcy5uc2gKKworTmFtZSAiJHtQUk9EVUNUX05BTUV9ICR7UFJPRFVDVF9WRVJTSU9OfSIKK091dEZpbGUgIiR7T1VUX0ZJTEV9IgorTG9hZExhbmd1YWdlRmlsZSAiJHtOU0lTRElSfVxDb250cmliXExhbmd1YWdlIGZpbGVzXEVuZ2xpc2gubmxmIgorSW5zdGFsbERpciAiJFBST0dSQU1GSUxFU1wke1BST0RVQ1RfUFVCTElTSEVSfVxhcGFjaGUtZXRjaC0ke1BST0RVQ1RfVkVSU0lPTn0iCitJY29uICIke05TSVNESVJ9XENvbnRyaWJcR3JhcGhpY3NcSWNvbnNccGl4ZWwtaW5zdGFsbC5pY28iCitVbmluc3RhbGxJY29uICIke05TSVNESVJ9XENvbnRyaWJcR3JhcGhpY3NcSWNvbnNccGl4ZWwtdW5pbnN0YWxsLmljbyIKK0RpclRleHQgIlNldHVwIHdpbGwgaW5zdGFsbCAkKF5OYW1lKSBpbiB0aGUgZm9sbG93aW5nIGZvbGRlci4kXHIkXG4kXHIkXG5UbyBpbnN0YWxsIGluIGEgZGlmZmVyZW50IGZvbGRlciwgY2xpY2sgQnJvd3NlIGFuZCBzZWxlY3QgYW5vdGhlciBmb2xkZXIuIgorTGljZW5zZVRleHQgIklmIHlvdSBhY2NlcHQgYWxsIHRoZSB0ZXJtcyBvZiB0aGUgYWdyZWVtZW50LCBjaG9vc2UgSSBBZ3JlZSB0byBjb250aW51ZS4gWW91IG11c3QgYWNjZXB0IHRoZSBhZ3JlZW1lbnQgdG8gaW5zdGFsbCAkKF5OYW1lKS4iCitMaWNlbnNlRGF0YSAiJHtST09UX0RJUkVDVE9SWX1cTElDRU5TRS50eHQiCisjQnJhbmRpbmdUZXh0ICIke1BST0RVQ1RfUFVCTElTSEVSfSIKK1hQU3R5bGUgb24KK1Nob3dJbnN0RGV0YWlscyBzaG93CitTaG93VW5JbnN0RGV0YWlscyBzaG93CisjU2V0Q29tcHJlc3NvciAvU09MSUQgemxpYgorTGljZW5zZUJrQ29sb3IgZmZmZmZmCitJbnN0YWxsQ29sb3JzIDAwMDAwMCBmZmZmZmYKKworIyBVc2FnZToKKyMgUHVzaCAiU3Vic3RyaW5nIgorIyBQdXNoICJCb2R5IgorIyBDYWxsIFN0ckNvbnRhaW5zCisjIFBvcCAwLzEKK0Z1bmN0aW9uIGNvbnRhaW5zCisgIEV4Y2ggJFIxIDsgU3Vic3RyaW5nCisgIEV4Y2ggMQorICBFeGNoICRSMiA7IEJvZHkKKyAgUHVzaCAkUjAgOyByZXR1cm4gdmFsdWUKKyAgRXhjaCAyCisgIEV4Y2ggMQorICBQdXNoICRSMyA7IExlbmd0aCBvZiBTdWJzdHJpbmcKKyAgUHVzaCAkUjQgOyBMZW5ndGggb2YgQm9keQorICBQdXNoICRSNSA7IGkKKyAgUHVzaCAkUjYgOyB0ZW1wCisKKyAgU3RyQ3B5ICRSMCAiIgorICBTdHJMZW4gJFIzICRSMQorICBTdHJMZW4gJFI0ICRSMgorICBTdHJDcHkgJFI1IC0xCisgIGxvb3A6CisgICAgSW50T3AgJFI1ICRSNSArIDEgOyArK2kKKyAgICBTdHJDcHkgJFI2ICRSMiAkUjMgJFI1IDsgdGVtcCA9IEJvZHlbaS4uIGkgKyBsZW5ndGggb2YgU3Vic3RyaW5nXQorICAgIFN0ckNtcCAkUjYgJFIxIGZvdW5kIDsgaWYgdGVtcCA9IFN1YnN0cmluZyAtPiBmb3VuZAorICAgIFN0ckNtcCAkUjUgJFI0IGRvbmUgOyBpZiBpID0gbGVuZ3RoIG9mIGJvZHkgLT4gZG9uZQorICAgIEdvVG8gbG9vcAorICBmb3VuZDoKKyAgICBTdHJDcHkgJFIwICRSMQorICBkb25lOgorICBQb3AgJFI2CisgIFBvcCAkUjUKKyAgUG9wICRSNAorICBQb3AgJFIzCisgIFBvcCAkUjIKKyAgUG9wICRSMQorICBFeGNoICRSMAorRnVuY3Rpb25FbmQKKworU2VjdGlvbiAiQ2hlY2tTZWN0aW9uIiBTRUMwMQorICBSZWFkUmVnU3RyICRSMCAke1BST0RVQ1RfVU5JTlNUX1JPT1RfS0VZfSAiJHtQUk9EVUNUX1VOSU5TVF9LRVl9IiAiVW5pbnN0YWxsU3RyaW5nIgorICBTdHJDbXAgJFIwICIiICs0IDAgIyBDaGVjayBpZiBFdGNoIGlzIGluc3RhbGxlZAorICAgIE1lc3NhZ2VCb3ggTUJfSUNPTklORk9STUFUSU9OfE1CX09LQ0FOQ0VMICIke1BST0RVQ1RfTkFNRX0tJHtQUk9EVUNUX1ZFUlNJT059IGlzIGFscmVhZHkgaW5zdGFsbGVkLiBEbyB5b3Ugd2lzaCB0byByZS1pbnN0YWxsPyIgL1NEIElET0sgSURPSyArMyBJRENBTkNFTCAwCisgICAgICBNZXNzYWdlQm94IE1CX0lDT05JTkZPUk1BVElPTnxNQl9PSyAiJHtQUk9EVUNUX05BTUV9IHdhcyBub3QgaW5zdGFsbGVkLiIgL1NEIElET0sKKyAgICAgIFF1aXQKK1NlY3Rpb25FbmQKKworU2VjdGlvbiAiTWFpblNlY3Rpb24iCisgIFNldE91dFBhdGggJElOU1RESVIKKyAgU2V0T3ZlcndyaXRlIHRyeQorICBGaWxlIC9yICIke1JPT1RfRElSRUNUT1JZfVwqIgorICBXcml0ZVJlZ1N0ciBIS0xNICJTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxTZXNzaW9uIE1hbmFnZXJcRW52aXJvbm1lbnQiICJFVENIX0hPTUUiICIkSU5TVERJUiIKKyAgUmVhZFJlZ1N0ciAkUjAgSEtMTSAiU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcU2Vzc2lvbiBNYW5hZ2VyXEVudmlyb25tZW50IiAiUGF0aCIKKyAgU3RyQ3B5ICRSMSAiJUVUQ0hfSE9NRSVcYmluIgorICBQdXNoICRSMAorICBQdXNoICRSMQorICBDYWxsIENvbnRhaW5zCisgIFBvcCAkUjIKKyAgU3RyQ21wICRSMiAiIiAwICsyCisgIFdyaXRlUmVnRXhwYW5kU3RyIEhLTE0gIlNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXFNlc3Npb24gTWFuYWdlclxFbnZpcm9ubWVudCIgIlBhdGgiICIkUjA7JUVUQ0hfSE9NRSVcYmluIgorICAjIFRoaXMgdGVsbHMgd2luZG93cyB0byByZWZyZXNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgU2VuZE1lc3NhZ2UgJHtIV05EX0JST0FEQ0FTVH0gJHtXTV9XSU5JTklDSEFOR0V9IDAgIlNUUjpFbnZpcm9ubWVudCIgL1RJTUVPVVQ9NTAwMAorU2VjdGlvbkVuZAorCitTZWN0aW9uIC1BZGRpdGlvbmFsSWNvbnMKKyAgU2V0T3V0UGF0aCAkSU5TVERJUgorIyAgV3JpdGVJbmlTdHIgIiRJTlNURElSXGV0Y2gtaG9tZXBhZ2UudXJsIiAiSW50ZXJuZXRTaG9ydGN1dCIgIlVSTCIgIiR7UFJPRFVDVF9XRUJfU0lURX0iCisgIENyZWF0ZURpcmVjdG9yeSAiJFNNUFJPR1JBTVNcJCheTmFtZSkiCisjICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcJCheTmFtZSlcQXBhY2hlIEV0Y2ggSG9tZXBhZ2UubG5rIiAiJElOU1RESVJcZXRjaC1ob21lcGFnZS51cmwiCisgIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1wkKF5OYW1lKVxVbmluc3RhbGwgQXBhY2hlIEV0Y2gubG5rIiAiJElOU1RESVJcdW5pbnN0LmV4ZSIKK1NlY3Rpb25FbmQKKworU2VjdGlvbiAtUG9zdAorICBXcml0ZVVuaW5zdGFsbGVyICIkSU5TVERJUlx1bmluc3QuZXhlIgorICBXcml0ZVJlZ1N0ciAke1BST0RVQ1RfVU5JTlNUX1JPT1RfS0VZfSAiJHtQUk9EVUNUX1VOSU5TVF9LRVl9IiAiRGlzcGxheU5hbWUiICIkKF5OYW1lKSIKKyAgV3JpdGVSZWdTdHIgJHtQUk9EVUNUX1VOSU5TVF9ST09UX0tFWX0gIiR7UFJPRFVDVF9VTklOU1RfS0VZfSIgIlVuaW5zdGFsbFN0cmluZyIgIiRJTlNURElSXHVuaW5zdC5leGUiCisgIFdyaXRlUmVnU3RyICR7UFJPRFVDVF9VTklOU1RfUk9PVF9LRVl9ICIke1BST0RVQ1RfVU5JTlNUX0tFWX0iICJEaXNwbGF5VmVyc2lvbiIgIiR7UFJPRFVDVF9WRVJTSU9OfSIKKyAgV3JpdGVSZWdTdHIgJHtQUk9EVUNUX1VOSU5TVF9ST09UX0tFWX0gIiR7UFJPRFVDVF9VTklOU1RfS0VZfSIgIlVSTEluZm9BYm91dCIgIiR7UFJPRFVDVF9XRUJfU0lURX0iCisgIFdyaXRlUmVnU3RyICR7UFJPRFVDVF9VTklOU1RfUk9PVF9LRVl9ICIke1BST0RVQ1RfVU5JTlNUX0tFWX0iICJQdWJsaXNoZXIiICIke1BST0RVQ1RfUFVCTElTSEVSfSIKK1NlY3Rpb25FbmQKKworCitGdW5jdGlvbiB1bi5vblVuaW5zdFN1Y2Nlc3MKKyAgSGlkZVdpbmRvdworICBNZXNzYWdlQm94IE1CX0lDT05JTkZPUk1BVElPTnxNQl9PSyAiJCheTmFtZSkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20geW91ciBjb21wdXRlci4iIC9TRCBJRE9LCitGdW5jdGlvbkVuZAorCitGdW5jdGlvbiB1bi5vbkluaXQKKyAgTWVzc2FnZUJveCBNQl9JQ09OUVVFU1RJT058TUJfWUVTTk98TUJfREVGQlVUVE9OMiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbXBsZXRlbHkgcmVtb3ZlICQoXk5hbWUpIGFuZCBhbGwgb2YgaXRzIGNvbXBvbmVudHM/IiAvU0QgSURPSyBJRFlFUyArMgorICBBYm9ydAorRnVuY3Rpb25FbmQKKworIyBVc2FnZToKKyMgUHVzaCAiU3RyaW5nIHRvIGN1dCIKKyMgUHVzaCAiQm9keSB0ZXh0IgorIyBDYWxsIFNsaWNlCisjIFBvcCAkUjAgOyAiTmV3IFN0cmluZyIKKyMgUG9wICRSMSA7IEN1dCBkb25lPyAwLzEKK0Z1bmN0aW9uIHVuLnNsaWNlCisgIEV4Y2ggJFIwIDsgaW5wdXQgc3RyaW5nCisgIEV4Y2gKKyAgRXhjaCAkUjEgOyB0byBjdXQKKyAgUHVzaCAkUjIKKyAgUHVzaCAkUjMKKyAgUHVzaCAkUjQKKyAgUHVzaCAkUjUKKworICBTdHJMZW4gJFIzICRSMQorICBTdHJDcHkgJFI0IC0xCisgIFN0ckNweSAkUjUgMAorCisgIExvb3A6CisKKyAgICBJbnRPcCAkUjQgJFI0ICsgMQorICAgIFN0ckNweSAkUjIgJFIwICRSMyAkUjQKKyAgICBTdHJDbXAgJFIyICIiIERvbmUKKyAgICBTdHJDbXAgJFIyICRSMSAwIExvb3AKKworICAgIFN0ckNweSAkUjUgMQorCisgICAgU3RyQ21wICRSNCAwIDAgKzMKKyAgICBTdHJDcHkgJFIxICIiCisgICAgR290byArMgorICAgIFN0ckNweSAkUjEgJFIwICRSNAorICAgIFN0ckxlbiAkUjIgJFIwCisgICAgSW50T3AgJFI0ICRSMiAtICRSNAorICAgIEludE9wICRSNCAkUjQgLSAkUjMKKyAgICBJbnRDbXAgJFI0IDAgMCAwICszCisgICAgU3RyQ3B5ICRSMiAiIgorICAgIEdvdG8gKzIKKyAgICBTdHJDcHkgJFIyICRSMCAiIiAtJFI0CisgICAgU3RyQ3B5ICRSMCAkUjEkUjIKKworICBEb25lOgorICBTdHJDcHkgJFIxICRSNQorCisgIFBvcCAkUjUKKyAgUG9wICRSNAorICBQb3AgJFIzCisgIFBvcCAkUjIKKyAgRXhjaCAkUjEgOyBzbGljZT8gMC8xCisgIEV4Y2gKKyAgRXhjaCAkUjAgOyBvdXRwdXQgc3RyaW5nCitGdW5jdGlvbkVuZAorCitTZWN0aW9uIFVuaW5zdGFsbAorICBTZXRPdXRQYXRoICIkUFJPR1JBTUZJTEVTXCR7UFJPRFVDVF9QVUJMSVNIRVJ9IgorICBSTURpciAvciAkSU5TVERJUgorICBSTURpciAvciAiJFNNUFJPR1JBTVNcJCheTmFtZSkiCisgIERlbGV0ZVJlZ0tleSAke1BST0RVQ1RfVU5JTlNUX1JPT1RfS0VZfSAiJHtQUk9EVUNUX1VOSU5TVF9LRVl9IgorICBEZWxldGVSZWdWYWx1ZSBIS0xNICJTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxTZXNzaW9uIE1hbmFnZXJcRW52aXJvbm1lbnQiICJFVENIX0hPTUUiCisgICMgUmVwbGFjZSBQYXRoIHdpdGggZGUtRXRjaCdlZCBwYXRoCisgIFJlYWRSZWdTdHIgJFIwIEhLTE0gIlNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXFNlc3Npb24gTWFuYWdlclxFbnZpcm9ubWVudCIgIlBhdGgiCisgIFN0ckNweSAkUjEgIjslRVRDSF9IT01FJVxiaW4iCisgIFB1c2ggJFIxCisgIFB1c2ggJFIwCisgIENhbGwgdW4uc2xpY2UKKyAgUG9wICRSMAorICBXcml0ZVJlZ0V4cGFuZFN0ciBIS0xNICJTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxTZXNzaW9uIE1hbmFnZXJcRW52aXJvbm1lbnQiICJQYXRoIiAiJFIwIgorICAjIFRoaXMgdGVsbHMgd2luZG93cyB0byByZWZyZXNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgU2VuZE1lc3NhZ2UgJHtIV05EX0JST0FEQ0FTVH0gJHtXTV9XSU5JTklDSEFOR0V9IDAgIlNUUjpFbnZpcm9ubWVudCIgL1RJTUVPVVQ9NTAwMAorICBTZXRBdXRvQ2xvc2UgdHJ1ZQorU2VjdGlvbkVuZApkaWZmIC0tZ2l0IGEvaW5zdGFsbGVycy9ldGNoLW1hdmVuLWluc3RhbGwuYmF0IGIvaW5zdGFsbGVycy9ldGNoLW1hdmVuLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGVjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbnN0YWxsZXJzL2V0Y2gtbWF2ZW4taW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0OSBAQAorQHJlbSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKK0ByZW0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCitAcmVtICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorQHJlbSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKK0ByZW0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCitAcmVtICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorQHJlbSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKK0ByZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0ByZW0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCitAcmVtICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorQHJlbSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKK0ByZW0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCitAcmVtICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorQHJlbSAgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0BlY2hvIG9mZgorCityZW0gVGhpcyAuYmF0IGZpbGUgaW5zdGFsbHMgdGhlIGV0Y2gtamF2YS1ydW50aW1lIGphciBmaWxlIHRvIHRoZSBsb2NhbCBtYXZlbgorcmVtIHJlcG9zaXRvcnkuIEl0IGFzc3VtZXMgZWl0aGVyIE0yX0hPTUUgb3IgTUFWRU5fSE9NRSBpcyBzZXQgaW4gdGhlCityZW0gZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlIG1hdmVuIGluc3RhbGxhdGlvbiwgb3IgIm12biIgY29tbWFuZCBpcyBpbiB0aGUKK3JlbSBzZWFyY2ggcGF0aC4KKworc2V0bG9jYWwKKworcmVtIERlZmluZSB0aGUgZXRjaCBob21lIGRpcmVjdG9yeSBhbmQgYXJ0aWZhY3QgcGFydGljdWxhcnMKKworc2V0IEVUQ0hfSE9NRT0lfmRwMC4uCitzZXQgR1JPVVA9ZXRjaC5ldGNoCitzZXQgQVJUSUZBQ1RTPWV0Y2gtYW50LXBsdWdpbiwgZXRjaC1jb21waWxlciwgZXRjaC1jc2hhcnAtY29tcGlsZXIsIGV0Y2gtamF2YS1jb21waWxlciwgZXRjaC1qYXZhLXJ1bnRpbWUsIGV0Y2gteG1sLWNvbXBpbGVyCitzZXQgVkVSU0lPTj1ARXRjaFZlcnNpb25ACisKK2lmICIlTTJfSE9NRSUiID09ICIiIGdvdG8gdHJ5X21hdmVuX2hvbWUKK3NldCBNVk49JU0yX0hPTUUlXGJpblxtdm4uYmF0CitpZiBub3QgZXhpc3QgIiVNVk4lIiBnb3RvIHRyeV9tYXZlbl9ob21lCitnb3RvIHJ1bl9tdm4KKworOnRyeV9tYXZlbl9ob21lCitpZiAiJU1BVkVOX0hPTUUlIiA9PSAiIiBnb3RvIHRyeV9wYXRoCitzZXQgTVZOPSVNQVZFTl9IT01FJVxiaW5cbXZuLmJhdAoraWYgbm90IGV4aXN0ICIlTVZOJSIgZ290byB0cnlfcGF0aAorZ290byBydW5fbXZuCisKKzp0cnlfcGF0aAorc2V0IE1WTj1tdm4uYmF0CisKKzpydW5fbXZuCitGT1IgJSVBIElOICglQVJUSUZBQ1RTJSkgRE8gQ0FMTCAiJU1WTiUiIGluc3RhbGw6aW5zdGFsbC1maWxlICItRGZpbGU9JUVUQ0hfSE9NRSVcbGliXCUlQS0lVkVSU0lPTiUuamFyIiAtRGdyb3VwSWQ9JUdST1VQJSAtRGFydGlmYWN0SWQ9JSVBIC1EdmVyc2lvbj0lVkVSU0lPTiUgLURwYWNrYWdpbmc9amFyCitGT1IgJSVBIElOICglQVJUSUZBQ1RTJSkgRE8gQ0FMTCAiJU1WTiUiIGluc3RhbGw6aW5zdGFsbC1maWxlICItRGZpbGU9JUVUQ0hfSE9NRSVcbGliXCUlQS0lVkVSU0lPTiUtc3JjLnppcCIgLURncm91cElkPSVHUk9VUCUgLURhcnRpZmFjdElkPSUlQSAtRHZlcnNpb249JVZFUlNJT04lIC1EcGFja2FnaW5nPWphciAtRGNsYXNzaWZpZXI9c291cmNlcwpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9leGFtcGxlL2ludGVyb3B0ZXN0MS54bWwgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvaW50ZXJvcHRlc3QxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJlNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL2ludGVyb3B0ZXN0MS54bWwKQEAgLTAsMCArMSwxOTEgQEAKKzxpbnRlcm9wdGVzdD4KKwk8cnVuIHRlc3Q9ImphdmEtamF2YSI+CisJCTxhcmcgbmFtZT0ic3VyaSIgdmFsdWU9InRjcDovLzEyNy4wLjAuMTo0MDAxIi8+CisJCTxhcmcgbmFtZT0iY3VyaSIgdmFsdWU9InRjcDovLzEyNy4wLjAuMTo0MDAxIi8+CisJPC9ydW4+CisJCisJPHJ1biB0ZXN0PSJqYXZhLWphdmEiPgorCQk8YXJnIG5hbWU9InN1cmkiIHZhbHVlPSJ0Y3A6Ly8xMjcuMC4wLjE6NDAwMj9maWx0ZXI9S2VlcEFsaXZlIi8+CisJCTxhcmcgbmFtZT0iY3VyaSIgdmFsdWU9InRjcDovLzEyNy4wLjAuMTo0MDAyP2ZpbHRlcj1LZWVwQWxpdmUiLz4KKwk8L3J1bj4KKwkKKwk8cnVuIHRlc3Q9ImphdmEtamF2YSI+CisJCTxhcmcgbmFtZT0ic3VyaSIgdmFsdWU9InRsczovLzEyNy4wLjAuMTo0MDAzIi8+CisJCTxhcmcgbmFtZT0ic3ZtYXJnMSIgdmFsdWU9Ii1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT1pbnRlcm9wdGVzdGVyL2V4YW1wbGUva2V5cy9teS5rZXlzdG9yZSIvPgorCQk8YXJnIG5hbWU9InN2bWFyZzIiIHZhbHVlPSItRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD1zbm9ydDEiLz4KKwkJPGFyZyBuYW1lPSJjdXJpIiB2YWx1ZT0idGxzOi8vMTI3LjAuMC4xOjQwMDM/VGxzQ29ubmVjdGlvbi5hdXRoUmVxZD1mYWxzZSIvPgorCTwvcnVuPgorCQorCTxydW4gdGVzdD0iamF2YS1jc2hhcnAiPgorCQk8YXJnIG5hbWU9InN1cmkiIHZhbHVlPSJ0Y3A6Ly8xMjcuMC4wLjE6NDAwMSIvPgorCQk8YXJnIG5hbWU9ImN1cmkiIHZhbHVlPSJ0Y3A6Ly8xMjcuMC4wLjE6NDAwMSIvPgorCTwvcnVuPgorCQorCTxydW4gdGVzdD0iY3NoYXJwLWphdmEiPgorCQk8YXJnIG5hbWU9InN1cmkiIHZhbHVlPSJ0Y3A6Ly8xMjcuMC4wLjE6NDAwMSIvPgorCQk8YXJnIG5hbWU9ImN1cmkiIHZhbHVlPSJ0Y3A6Ly8xMjcuMC4wLjE6NDAwMSIvPgorCTwvcnVuPgorCQorCTxydW4gdGVzdD0iY3NoYXJwLWNzaGFycCI+CisJCTxhcmcgbmFtZT0ic3VyaSIgdmFsdWU9InRjcDovLzEyNy4wLjAuMTo0MDAxIi8+CisJCTxhcmcgbmFtZT0iY3VyaSIgdmFsdWU9InRjcDovLzEyNy4wLjAuMTo0MDAxIi8+CisJPC9ydW4+CisJCisJPHRlc3RzPgorCQk8dGVzdCBuYW1lPSJqYXZhLWphdmEiPgorCQkJPHBhcmFtcz4KKwkJCQk8cGFyYW0gbmFtZT0ic3VyaSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9InN2bWFyZzEiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJzdm1hcmcyIiBkZWZhdWx0PSIiLz4KKwkJCQk8cGFyYW0gbmFtZT0iY3VyaSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9ImN2bWFyZzEiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJjdm1hcmcyIiBkZWZhdWx0PSIiLz4KKwkJCTwvcGFyYW1zPgorCQkJPHN1cHBvcnQ+CisJCQkJPHByb2cgbmFtZT0iamF2YV9NYWluSU9UTGlzdGVuZXIiPgorCQkJCQk8YXJnIG5hbWU9InVyaSIgdmFsdWU9IntzdXJpfSIvPgorCQkJCQk8YXJnIG5hbWU9InZtYXJnMSIgdmFsdWU9Intzdm1hcmcxfSIvPgorCQkJCQk8YXJnIG5hbWU9InZtYXJnMiIgdmFsdWU9Intzdm1hcmcyfSIvPgorCQkJCTwvcHJvZz4KKwkJCTwvc3VwcG9ydD4KKwkJCTxqaWc+CisJCQkJPHByb2cgbmFtZT0iamF2YV9NYWluSU9UQ2xpZW50Ij4KKwkJCQkJPGFyZyBuYW1lPSJ1cmkiIHZhbHVlPSJ7Y3VyaX0iLz4KKwkJCQkJPGFyZyBuYW1lPSJ2bWFyZzEiIHZhbHVlPSJ7Y3ZtYXJnMX0iLz4KKwkJCQkJPGFyZyBuYW1lPSJ2bWFyZzIiIHZhbHVlPSJ7Y3ZtYXJnMn0iLz4KKwkJCQk8L3Byb2c+CisJCQk8L2ppZz4KKwkJPC90ZXN0PgorCQkKKwkJPHRlc3QgbmFtZT0iamF2YS1jc2hhcnAiPgorCQkJPHBhcmFtcz4KKwkJCQk8cGFyYW0gbmFtZT0ic3VyaSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9InN2bWFyZzEiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJzdm1hcmcyIiBkZWZhdWx0PSIiLz4KKwkJCQk8cGFyYW0gbmFtZT0iY3VyaSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9ImN2bWFyZzEiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJjdm1hcmcyIiBkZWZhdWx0PSIiLz4KKwkJCTwvcGFyYW1zPgorCQkJPHN1cHBvcnQ+CisJCQkJPHByb2cgbmFtZT0iY3NoYXJwX01haW5JT1RMaXN0ZW5lciI+CisJCQkJCTxhcmcgbmFtZT0idXJpIiB2YWx1ZT0ie3N1cml9Ii8+CisJCQkJPC9wcm9nPgorCQkJPC9zdXBwb3J0PgorCQkJPGppZz4KKwkJCQk8cHJvZyBuYW1lPSJqYXZhX01haW5JT1RDbGllbnQiPgorCQkJCQk8YXJnIG5hbWU9InVyaSIgdmFsdWU9IntjdXJpfSIvPgorCQkJCQk8YXJnIG5hbWU9InZtYXJnMSIgdmFsdWU9Intjdm1hcmcxfSIvPgorCQkJCQk8YXJnIG5hbWU9InZtYXJnMiIgdmFsdWU9Intjdm1hcmcyfSIvPgorCQkJCTwvcHJvZz4KKwkJCTwvamlnPgorCQk8L3Rlc3Q+CisJCQorCQk8dGVzdCBuYW1lPSJjc2hhcnAtamF2YSI+CisJCQk8cGFyYW1zPgorCQkJCTxwYXJhbSBuYW1lPSJzdXJpIiBkZWZhdWx0PSIiLz4KKwkJCQk8cGFyYW0gbmFtZT0ic3ZtYXJnMSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9InN2bWFyZzIiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJjdXJpIiBkZWZhdWx0PSIiLz4KKwkJCQk8cGFyYW0gbmFtZT0iY3ZtYXJnMSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9ImN2bWFyZzIiIGRlZmF1bHQ9IiIvPgorCQkJPC9wYXJhbXM+CisJCQk8c3VwcG9ydD4KKwkJCQk8cHJvZyBuYW1lPSJqYXZhX01haW5JT1RMaXN0ZW5lciI+CisJCQkJCTxhcmcgbmFtZT0idXJpIiB2YWx1ZT0ie3N1cml9Ii8+CisJCQkJCTxhcmcgbmFtZT0idm1hcmcxIiB2YWx1ZT0ie3N2bWFyZzF9Ii8+CisJCQkJCTxhcmcgbmFtZT0idm1hcmcyIiB2YWx1ZT0ie3N2bWFyZzJ9Ii8+CisJCQkJPC9wcm9nPgorCQkJPC9zdXBwb3J0PgorCQkJPGppZz4KKwkJCQk8cHJvZyBuYW1lPSJjc2hhcnBfTWFpbklPVENsaWVudCI+CisJCQkJCTxhcmcgbmFtZT0idXJpIiB2YWx1ZT0ie2N1cml9Ii8+CisJCQkJPC9wcm9nPgorCQkJPC9qaWc+CisJCTwvdGVzdD4KKwkJCisJCTx0ZXN0IG5hbWU9ImNzaGFycC1jc2hhcnAiPgorCQkJPHBhcmFtcz4KKwkJCQk8cGFyYW0gbmFtZT0ic3VyaSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9InN2bWFyZzEiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJzdm1hcmcyIiBkZWZhdWx0PSIiLz4KKwkJCQk8cGFyYW0gbmFtZT0iY3VyaSIgZGVmYXVsdD0iIi8+CisJCQkJPHBhcmFtIG5hbWU9ImN2bWFyZzEiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJjdm1hcmcyIiBkZWZhdWx0PSIiLz4KKwkJCTwvcGFyYW1zPgorCQkJPHN1cHBvcnQ+CisJCQkJPHByb2cgbmFtZT0iY3NoYXJwX01haW5JT1RMaXN0ZW5lciI+CisJCQkJCTxhcmcgbmFtZT0idXJpIiB2YWx1ZT0ie3N1cml9Ii8+CisJCQkJPC9wcm9nPgorCQkJPC9zdXBwb3J0PgorCQkJPGppZz4KKwkJCQk8cHJvZyBuYW1lPSJjc2hhcnBfTWFpbklPVENsaWVudCI+CisJCQkJCTxhcmcgbmFtZT0idXJpIiB2YWx1ZT0ie2N1cml9Ii8+CisJCQkJPC9wcm9nPgorCQkJPC9qaWc+CisJCTwvdGVzdD4KKwk8L3Rlc3RzPgorCQorCTxwcm9ncmFtcz4KKwkJPHByb2dyYW0gbmFtZT0iamF2YV9NYWluSU9UTGlzdGVuZXIiPgorCQkJPHBhcmFtcz4KKwkJCQk8cGFyYW0gbmFtZT0idXJpIiBkZWZhdWx0PSIiLz4KKwkJCQk8cGFyYW0gbmFtZT0idm1hcmcxIiBkZWZhdWx0PSIiLz4KKwkJCQk8cGFyYW0gbmFtZT0idm1hcmcyIiBkZWZhdWx0PSIiLz4KKwkJCTwvcGFyYW1zPgorCQkJPHN0ZG91dHRhZz5TT1VUPC9zdGRvdXR0YWc+CisJCQk8c3RkZXJydGFnPlNFUlI8L3N0ZGVycnRhZz4KKwkJCTx0b2tlbnM+CisJCQkJPHRva2VuPmphdmE8L3Rva2VuPgorCQkJCTx0b2tlbj57dm1hcmcxfTwvdG9rZW4+CisJCQkJPHRva2VuPnt2bWFyZzJ9PC90b2tlbj4KKwkJCQk8dG9rZW4+LWNwPC90b2tlbj4KKwkJCQk8dG9rZW4+YmluOy4uL2V0Y2gvYmluPC90b2tlbj4KKwkJCQk8dG9rZW4+b3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QuTWFpbklPVExpc3RlbmVyPC90b2tlbj4KKwkJCQk8dG9rZW4+e3VyaX08L3Rva2VuPgorCQkJPC90b2tlbnM+CisJCTwvcHJvZ3JhbT4KKwkJCisJCTxwcm9ncmFtIG5hbWU9ImphdmFfTWFpbklPVENsaWVudCI+CisJCQk8cGFyYW1zPgorCQkJCTxwYXJhbSBuYW1lPSJ1cmkiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJ2bWFyZzEiIGRlZmF1bHQ9IiIvPgorCQkJCTxwYXJhbSBuYW1lPSJ2bWFyZzIiIGRlZmF1bHQ9IiIvPgorCQkJPC9wYXJhbXM+CisJCQk8c3Rkb3V0dGFnPkNPVVQ8L3N0ZG91dHRhZz4KKwkJCTxzdGRlcnJ0YWc+Q0VSUjwvc3RkZXJydGFnPgorCQkJPHRva2Vucz4KKwkJCQk8dG9rZW4+amF2YTwvdG9rZW4+CisJCQkJPHRva2VuPnt2bWFyZzF9PC90b2tlbj4KKwkJCQk8dG9rZW4+e3ZtYXJnMn08L3Rva2VuPgorCQkJCTx0b2tlbj4tY3A8L3Rva2VuPgorCQkJCTx0b2tlbj5iaW47Li4vZXRjaC9iaW47Li4vLi4vd2tzL3Rvb2xzL2p1bml0LzQuMy4xL2p1bml0LTQuMy4xLmphcjwvdG9rZW4+CisJCQkJPHRva2VuPm9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90Lk1haW5JT1RDbGllbnQ8L3Rva2VuPgorCQkJCTx0b2tlbj57dXJpfTwvdG9rZW4+CisJCQk8L3Rva2Vucz4KKwkJPC9wcm9ncmFtPgorCQkKKwkJPHByb2dyYW0gbmFtZT0iY3NoYXJwX01haW5JT1RMaXN0ZW5lciI+CisJCQk8cGFyYW1zPgorCQkJCTxwYXJhbSBuYW1lPSJ1cmkiIGRlZmF1bHQ9IiIvPgorCQkJPC9wYXJhbXM+CisJCQk8c3Rkb3V0dGFnPlNPVVQ8L3N0ZG91dHRhZz4KKwkJCTxzdGRlcnJ0YWc+U0VSUjwvc3RkZXJydGFnPgorCQkJPHRva2Vucz4KKwkJCQk8dG9rZW4+aW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RMaXN0ZW5lclByb2ovYmluL0RlYnVnL0lPVExpc3RlbmVyUHJvai5leGU8L3Rva2VuPgorCQkJCTx0b2tlbj57dXJpfTwvdG9rZW4+CisJCQk8L3Rva2Vucz4KKwkJPC9wcm9ncmFtPgorCQkKKwkJPHByb2dyYW0gbmFtZT0iY3NoYXJwX01haW5JT1RDbGllbnQiPgorCQkJPHBhcmFtcz4KKwkJCQk8cGFyYW0gbmFtZT0idXJpIiBkZWZhdWx0PSIiLz4KKwkJCTwvcGFyYW1zPgorCQkJPHN0ZG91dHRhZz5DT1VUPC9zdGRvdXR0YWc+CisJCQk8c3RkZXJydGFnPkNFUlI8L3N0ZGVycnRhZz4KKwkJCTx0b2tlbnM+CisJCQkJPHRva2VuPmludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvSU9UQ2xpZW50UHJvai9iaW4vRGVidWcvSU9UQ2xpZW50UHJvai5leGU8L3Rva2VuPgorCQkJCTx0b2tlbj57dXJpfTwvdG9rZW4+CisJCQk8L3Rva2Vucz4KKwkJPC9wcm9ncmFtPgorCTwvcHJvZ3JhbXM+Cis8L2ludGVyb3B0ZXN0PgpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9leGFtcGxlL2tleXMvbXkua2V5c3RvcmUgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUva2V5cy9teS5rZXlzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQ4NzNlCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL2tleXMvbXkua2V5c3RvcmUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RDbGllbnRQcm9qL0lPVENsaWVudFByb2ouY3Nwcm9qIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RDbGllbnRQcm9qL0lPVENsaWVudFByb2ouY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YjA5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL0lPVENsaWVudFByb2ovSU9UQ2xpZW50UHJvai5jc3Byb2oKQEAgLTAsMCArMSw5NyBAQAor77u/PFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezE0RDdBOTIzLTBDQjQtNDQyQS05NDk5LTdGMEMyNUMyMzlFRX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+SU9UQ2xpZW50UHJvajwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPklPVENsaWVudFByb2o8L0Fzc2VtYmx5TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3RcQmFzZUlPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5CYXNlSU9UQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdFxCYXNlSU9UU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkJhc2VJT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVC5jcyI+CisgICAgICA8TGluaz5JT1QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5JT1RDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVEhlbHBlci5jcyI+CisgICAgICA8TGluaz5JT1RIZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVFNlcnZlci5jcyI+CisgICAgICA8TGluaz5JT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFJlbW90ZUlPVC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVJT1QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFJlbW90ZUlPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVJT1RDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFJlbW90ZUlPVFNlcnZlci5jcyI+CisgICAgICA8TGluaz5SZW1vdGVJT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFN0dWJJT1QuY3MiPgorICAgICAgPExpbms+U3R1YklPVC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3RcU3R1YklPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5TdHViSU9UQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdFxTdHViSU9UU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJJT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFZhbHVlRmFjdG9yeUlPVC5jcyI+CisgICAgICA8TGluaz5WYWx1ZUZhY3RvcnlJT1QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXEltcGxJT1RDbGllbnQuY3MiPgorICAgICAgPExpbms+SW1wbElPVENsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpbklPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5NYWluSU9UQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cYmluZGluZy1jc2hhcnBccnVudGltZVxzcmNcbWFpblxjc2hhcnBcRXRjaFByb2ouY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PnswRTUxOEYyQS0zMDE2LTRDMkYtQTIxQi05QkQ1MkIyREM4NDZ9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RXRjaFByb2o8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RDbGllbnRQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RDbGllbnRQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTk3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL0lPVENsaWVudFByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzMyBAQAor77u/dXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiSU9UQ2xpZW50UHJvaiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJjb21lciBmYW1pbHkiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJJT1RDbGllbnRQcm9qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgY29tZXIgZmFtaWx5IDIwMDkiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUgCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoImMyMjk5NzcwLWZjNmQtNGY2Yi1iNTE1LTZkMzg4NWVjMGQ5ZiIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL0lPVExpc3RlbmVyUHJvai9JT1RMaXN0ZW5lclByb2ouY3Nwcm9qIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RMaXN0ZW5lclByb2ovSU9UTGlzdGVuZXJQcm9qLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ0ZmIyCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RMaXN0ZW5lclByb2ovSU9UTGlzdGVuZXJQcm9qLmNzcHJvagpAQCAtMCwwICsxLDk3IEBACivvu788UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NUVFRDU1MkEtMDlDMS00MkQwLTlFMEEtNzgyMkIwRUMzNjAzfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5JT1RMaXN0ZW5lclByb2o8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5JT1RMaXN0ZW5lclByb2o8L0Fzc2VtYmx5TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3RcQmFzZUlPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5CYXNlSU9UQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdFxCYXNlSU9UU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPkJhc2VJT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVC5jcyI+CisgICAgICA8TGluaz5JT1QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5JT1RDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVEhlbHBlci5jcyI+CisgICAgICA8TGluaz5JT1RIZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XElPVFNlcnZlci5jcyI+CisgICAgICA8TGluaz5JT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFJlbW90ZUlPVC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVJT1QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFJlbW90ZUlPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5SZW1vdGVJT1RDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFJlbW90ZUlPVFNlcnZlci5jcyI+CisgICAgICA8TGluaz5SZW1vdGVJT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFN0dWJJT1QuY3MiPgorICAgICAgPExpbms+U3R1YklPVC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3RcU3R1YklPVENsaWVudC5jcyI+CisgICAgICA8TGluaz5TdHViSU9UQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdFxTdHViSU9UU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPlN0dWJJT1RTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90XFZhbHVlRmFjdG9yeUlPVC5jcyI+CisgICAgICA8TGluaz5WYWx1ZUZhY3RvcnlJT1QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXEltcGxJT1RTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+SW1wbElPVFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTWFpbklPVExpc3RlbmVyLmNzIj4KKyAgICAgIDxMaW5rPk1haW5JT1RMaXN0ZW5lci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXC4uXC4uXGJpbmRpbmctY3NoYXJwXHJ1bnRpbWVcc3JjXG1haW5cY3NoYXJwXEV0Y2hQcm9qLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57MEU1MThGMkEtMzAxNi00QzJGLUEyMUItOUJENTJCMkRDODQ2fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkV0Y2hQcm9qPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvSU9UTGlzdGVuZXJQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JT1RMaXN0ZW5lclByb2ovUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMWNlZgotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvSU9UTGlzdGVuZXJQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsMzMgQEAKK++7v3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIklPVExpc3RlbmVyUHJvaiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJjb21lciBmYW1pbHkiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJJT1RMaXN0ZW5lclByb2oiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSBjb21lciBmYW1pbHkgMjAwOSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiODMyY2QyMTctMDFmZS00ZjQ3LWFmYzMtNDgzNWFhNTJlYmI2IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvSW1wbElPVENsaWVudC5jcyBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvSW1wbElPVENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFhM2JiCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9JbXBsSU9UQ2xpZW50LmNzCkBAIC0wLDAgKzEsMzYgQEAKKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgQXBhY2hlIEV0Y2ggMS4xLjAtaW5jdWJhdGluZyAoTE9DQUwtMCkgLyBjc2hhcnAgMS4xLjAtaW5jdWJhdGluZyAoTE9DQUwtMCkKKy8vICAgTW9uIEZlYiAxNiAxMToxMzo1MCBDU1QgMjAwOQorLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgeW91ciBjb252ZW5pZW5jZSBhbmQgd2lsbCBub3QgYmUKKy8vIG92ZXJ3cml0dGVuIG9uY2UgaXQgZXhpc3RzISBQbGVhc2UgZWRpdCB0aGlzIGZpbGUgYXMgbmVjZXNzYXJ5IHRvIGltcGxlbWVudAorLy8geW91ciBzZXJ2aWNlIGxvZ2ljLgorCit1c2luZyBTeXN0ZW07CisKKworCit1c2luZyBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdC50eXBlcy5JT1Q7CisKKy8vLzxzdW1tYXJ5PllvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VJT1RDbGllbnQuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorLy8vaW1wbGVtZW50YXRpb24gb2YgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLiA8L3N1bW1hcnk+CituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QKK3sKKwkvLy88c3VtbWFyeT5JbXBsZW1lbnRhdGlvbiBmb3IgSW1wbElPVENsaWVudDwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgSW1wbElPVENsaWVudCA6IEJhc2VJT1RDbGllbnQKKwl7CisJCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJbXBsSU9UQ2xpZW50Ljwvc3VtbWFyeT4KKyAJCS8vLyA8cGFyYW0gbmFtZT0ic2VydmVyIj5hIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0bworIAkJLy8vIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuPC9wYXJhbT4KKwkJcHVibGljIEltcGxJT1RDbGllbnQoUmVtb3RlSU9UU2VydmVyIHNlcnZlcikKKwkJeworCQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCX0KKwkJCisJCS8vLyA8c3VtbWFyeT5BIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0bworIAkJLy8vIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuPC9zdW1tYXJ5PgorCQlwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUlPVFNlcnZlciBzZXJ2ZXI7CisJCisJCS8vIFRPRE86IEltcGxlbWVudCBkZWxlZ2F0ZXMgb3IgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBJT1RDbGllbnQKKwkJLy8gbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyCQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL0ltcGxJT1RTZXJ2ZXIuY3MgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL0ltcGxJT1RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyODA1YwotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvSW1wbElPVFNlcnZlci5jcwpAQCAtMCwwICsxLDQyIEBACisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgIEFwYWNoZSBFdGNoIDEuMS4wLWluY3ViYXRpbmcgKExPQ0FMLTApIC8gY3NoYXJwIDEuMS4wLWluY3ViYXRpbmcgKExPQ0FMLTApCisvLyAgIE1vbiBGZWIgMTYgMTE6MTM6NTAgQ1NUIDIwMDkKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHlvdXIgY29udmVuaWVuY2UgYW5kIHdpbGwgbm90IGJlCisvLyBvdmVyd3JpdHRlbiBvbmNlIGl0IGV4aXN0cyEgUGxlYXNlIGVkaXQgdGhpcyBmaWxlIGFzIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQKKy8vIHlvdXIgc2VydmljZSBsb2dpYy4KKwordXNpbmcgU3lzdGVtOworCisKKwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QudHlwZXMuSU9UOworCisvLy88c3VtbWFyeT5Zb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlSU9UU2VydmVyLiBBZGQgbWV0aG9kcyBoZXJlIHRvIHByb3ZpZGUKKy8vL2ltcGxlbWVudGF0aW9uIG9mIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4gPC9zdW1tYXJ5PgorbmFtZXNwYWNlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90Cit7CisJLy8vPHN1bW1hcnk+SW1wbGVtZW50YXRpb24gZm9yIEltcGxJT1RTZXJ2ZXI8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIEltcGxJT1RTZXJ2ZXIgOiBCYXNlSU9UU2VydmVyCisJeworCQkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgSW1wbElPVFNlcnZlci48L3N1bW1hcnk+CisgCQkvLy8gPHBhcmFtIG5hbWU9ImNsaWVudCI+YSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgc2Vzc2lvbi4gVXNlIHRoaXMgdG8KKyAJCS8vLyBzZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LjwvcGFyYW0+CisJCXB1YmxpYyBJbXBsSU9UU2VydmVyKFJlbW90ZUlPVENsaWVudCBjbGllbnQpCisJCXsKKwkJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCQl9CisJCQorCQkvLy8gPHN1bW1hcnk+QSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgc2Vzc2lvbi4gVXNlIHRoaXMgdG8KKyAJCS8vLyBzZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50Ljwvc3VtbWFyeT4KKwkJcHJpdmF0ZSByZWFkb25seSBSZW1vdGVJT1RDbGllbnQgY2xpZW50OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQ/IGFkZChpbnQ/IHgsIGludD8geSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ4Iik7CisgICAgICAgICAgICBpZiAoeSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInkiKTsKKyAgICAgICAgICAgIHJldHVybiB4ICsgeTsKKyAgICAgICAgfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL01haW5JT1RDbGllbnQuY3MgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vY3NoYXJwL01haW5JT1RDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4ZTI2NwotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvTWFpbklPVENsaWVudC5jcwpAQCAtMCwwICsxLDc4IEBACisvLyBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnk6CisvLyAgIEFwYWNoZSBFdGNoIDEuMS4wLWluY3ViYXRpbmcgKExPQ0FMLTApIC8gY3NoYXJwIDEuMS4wLWluY3ViYXRpbmcgKExPQ0FMLTApCisvLyAgIE1vbiBGZWIgMTYgMTE6MTM6NTAgQ1NUIDIwMDkKKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHlvdXIgY29udmVuaWVuY2UgYW5kIHdpbGwgbm90IGJlCisvLyBvdmVyd3JpdHRlbiBvbmNlIGl0IGV4aXN0cyEgUGxlYXNlIGVkaXQgdGhpcyBmaWxlIGFzIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQKKy8vIHlvdXIgc2VydmljZSBsb2dpYy4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QKK3sKKwkvLy88c3VtbWFyeT5NYWluIGltcGxlbWVudGF0aW9uIGZvciBJT1RDbGllbnQuPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBNYWluSU9UQ2xpZW50IDogSU9USGVscGVyLklPVENsaWVudEZhY3RvcnkKKwl7CisJCS8vLzxzdW1tYXJ5Pk1haW4gZm9yIElPVENsaWVudDwvc3VtbWFyeT4KKwkJLy8vPHBhcmFtIG5hbWU9ImFyZ3MiPkNvbW1hbmQgTGluZSBBcmd1bWVudHM8L3BhcmFtPgorCQlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ1c2FnZTogTWFpbklPVENsaWVudCBbdXJpXSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwkJCisJCQlzdHJpbmcgdXJpID0gYXJncy5MZW5ndGggPiAwID8gYXJnc1swXSA6ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMSI7CisJCQkKKwkJCVJlbW90ZUlPVFNlcnZlciBzZXJ2ZXIgPSBJT1RIZWxwZXIuTmV3U2VydmVyKCB1cmksIG51bGwsIG5ldyBNYWluSU9UQ2xpZW50KCkpOworCQkKKwkJCS8vIENvbm5lY3QgdG8gdGhlIHNlcnZpY2UKKwkJCXNlcnZlci5fU3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKworICAgICAgICAgICAgQXNzZXJ0aW9uLkNoZWNrKHNlcnZlci5hZGQoMiwgMykgPT0gNSwgInNlcnZlci5hZGQoMiwgMykgPT0gNSIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuYWRkKG51bGwsIDMpOworICAgICAgICAgICAgICAgIEFzc2VydGlvbi5DaGVjayhmYWxzZSwgImZhbHNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyLmFkZCgyLCBudWxsKTsKKyAgICAgICAgICAgICAgICBBc3NlcnRpb24uQ2hlY2soZmFsc2UsICJmYWxzZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlci5hZGQobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0aW9uLkNoZWNrKGZhbHNlLCAiZmFsc2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlLgorICAgICAgICAgICAgfQorCisJCQkvLyBEaXNjb25uZWN0IGZyb20gdGhlIHNlcnZpY2UKKwkJCXNlcnZlci5fU3RvcEFuZFdhaXREb3duKCA0MDAwICk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZSIpOworCQl9CisKKwkJLy8vPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElPVENsaWVudC48L3N1bW1hcnk+CisJCS8vLzxwYXJhbSBuYW1lPSJzZXJ2ZXIiPlJlZmVyZW5jZSB0byByZW1vdGUgc2VydmljZTwvcGFyYW0+CisJCS8vLzxyZXR1cm5zPkNsaWVudCBJbXBsZW1lbnRhdGlvbjwvcmV0dXJucz4KKwkJcHVibGljIElPVENsaWVudCBOZXdJT1RDbGllbnQoIFJlbW90ZUlPVFNlcnZlciBzZXJ2ZXIgKQorCQl7CisJCQlyZXR1cm4gbmV3IEltcGxJT1RDbGllbnQoIHNlcnZlciApOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvTWFpbklPVExpc3RlbmVyLmNzIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2NzaGFycC9NYWluSU9UTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2YTg3OAotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9jc2hhcnAvTWFpbklPVExpc3RlbmVyLmNzCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieToKKy8vICAgQXBhY2hlIEV0Y2ggMS4xLjAtaW5jdWJhdGluZyAoTE9DQUwtMCkgLyBjc2hhcnAgMS4xLjAtaW5jdWJhdGluZyAoTE9DQUwtMCkKKy8vICAgTW9uIEZlYiAxNiAxMToxMzo1MCBDU1QgMjAwOQorLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgeW91ciBjb252ZW5pZW5jZSBhbmQgd2lsbCBub3QgYmUKKy8vIG92ZXJ3cml0dGVuIG9uY2UgaXQgZXhpc3RzISBQbGVhc2UgZWRpdCB0aGlzIGZpbGUgYXMgbmVjZXNzYXJ5IHRvIGltcGxlbWVudAorLy8geW91ciBzZXJ2aWNlIGxvZ2ljLgorCit1c2luZyBTeXN0ZW07CisKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKKwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QudHlwZXMuSU9UOworCituYW1lc3BhY2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QKK3sKKwkvLy88c3VtbWFyeT5NYWluIGltcGxlbWVudGF0aW9uIGZvciBJT1RMaXN0ZW5lci48L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIE1haW5JT1RMaXN0ZW5lciA6IElPVEhlbHBlci5JT1RTZXJ2ZXJGYWN0b3J5CisJeworIAkJLy8vPHN1bW1hcnk+TWFpbiBmb3IgSU9UTGlzdGVuZXIuPC9zdW1tYXJ5PgorCQkvLy88cGFyYW0gbmFtZT0iYXJncyI+Q29tbWFuZCBMaW5lIEFyZ3VtZW50czwvcGFyYW0+CisJCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInVzYWdlOiBNYWluSU9UTGlzdGVuZXIgW3VyaV0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisJCQorICAgICAgICAgICAgc3RyaW5nIHVyaSA9IGFyZ3MuTGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQkJCisJCQlTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyID0gSU9USGVscGVyLk5ld0xpc3RlbmVyKCB1cmksIG51bGwsIG5ldyBNYWluSU9UTGlzdGVuZXIoKSk7CisJCQkKKwkJCS8vIFN0YXJ0IHRoZSBMaXN0ZW5lcgorCQkJbGlzdGVuZXIuVHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggImxpc3RlbmVyIHN0YXJ0ZWQ6ICIrbGlzdGVuZXIgKTsKKwkJfQorCisJCS8vLzxzdW1tYXJ5PlJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJT1RTZXJ2ZXIuPC9zdW1tYXJ5PgorCQkvLy88cGFyYW0gbmFtZT0iY2xpZW50Ij5SZWZlcmVuY2UgdG8gcmVtb3RlIHNlcnZpY2U8L3BhcmFtPgorCQkvLy88cmV0dXJucz5TZXJ2ZXIgSW1wbGVtZW50YXRpb248L3JldHVybnM+CisJCXB1YmxpYyBJT1RTZXJ2ZXIgTmV3SU9UU2VydmVyKCBSZW1vdGVJT1RDbGllbnQgY2xpZW50ICkKKwkJeworCQkJcmV0dXJuIG5ldyBJbXBsSU9UU2VydmVyKCBjbGllbnQgKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vZXRjaC9JT1QuZXRjaCBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9ldGNoL0lPVC5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDdmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vZXRjaC9JT1QuZXRjaApAQCAtMCwwICsxLDEzIEBACittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QKKworLyoqIFNpbXBsZSBleGFtcGxlIGZvciB0aGUgaW50ZXJvcHRlc3Rlci4gKi8KK3NlcnZpY2UgSU9UCit7CisJLyoqCisJICogQWRkcyB0d28gbnVtYmVycy4KKwkgKiBAcGFyYW0geCB0aGUgZmlyc3QgbnVtYmVyIHRvIGFkZC4KKwkgKiBAcGFyYW0geSB0aGUgc2Vjb25kIG51bWJlciB0byBhZGQuCisJICogQHJldHVybiB0aGUgc3VtIG9mIHggYW5kIHkuCisJICovCisJaW50IGFkZCggaW50IHgsIGludCB5ICkKK30KZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvaW90L0ltcGxJT1RDbGllbnQuamF2YSBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvaW90L0ltcGxJT1RDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmVmOTRhCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9pb3QvSW1wbElPVENsaWVudC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90LkJhc2VJT1RDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QuUmVtb3RlSU9UU2VydmVyOworCisvKioKKyAqIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VJT1RDbGllbnQuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KKyAqLworcHVibGljIGNsYXNzIEltcGxJT1RDbGllbnQgZXh0ZW5kcyBCYXNlSU9UQ2xpZW50Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbElPVENsaWVudC4KKwkgKgorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgc2VydmVyLgorCSAqLworCXB1YmxpYyBJbXBsSU9UQ2xpZW50KCBSZW1vdGVJT1RTZXJ2ZXIgc2VydmVyICkKKwl7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCX0KKwkKKwkvKioKKwkgKiBBIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoICJ1bnVzZWQiICkKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUlPVFNlcnZlciBzZXJ2ZXI7CisKKwkvLyBUT0RPIGluc2VydCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgSU9UQ2xpZW50CisJLy8gbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvaW90L0ltcGxJT1RTZXJ2ZXIuamF2YSBiL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvaW90L0ltcGxJT1RTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNiZDQzCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9pb3QvSW1wbElPVFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90LkJhc2VJT1RTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QuUmVtb3RlSU9UQ2xpZW50OworCisvKioKKyAqIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VJT1RTZXJ2ZXIuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4KKyAqLworcHVibGljIGNsYXNzIEltcGxJT1RTZXJ2ZXIgZXh0ZW5kcyBCYXNlSU9UU2VydmVyCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbElPVFNlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBjbGllbnQgYSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgY2xpZW50LgorCSAqLworCXB1YmxpYyBJbXBsSU9UU2VydmVyKCBSZW1vdGVJT1RDbGllbnQgY2xpZW50ICkKKwl7CisJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCX0KKwkKKwkvKioKKwkgKiBBIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoICJ1bnVzZWQiICkKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUlPVENsaWVudCBjbGllbnQ7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW50ZWdlciBhZGQoIEludGVnZXIgeCwgSW50ZWdlciB5ICkKKwl7CisJCWlmICh4ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAieCA9PSBudWxsIiApOworCQlpZiAoeSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInkgPT0gbnVsbCIgKTsKKwkJcmV0dXJuIHggKyB5OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBfc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gaWdub3JlIGV2ZW50cy4KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9pb3QvTWFpbklPVENsaWVudC5qYXZhIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9pb3QvTWFpbklPVENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Nzk0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9leGFtcGxlL2lvdC9NYWluSU9UQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuX0V0Y2hfUnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdC5JT1RDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QuSU9USGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90LlJlbW90ZUlPVFNlcnZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkpVbml0Q29yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJlc3VsdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5GYWlsdXJlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLlJ1bkxpc3RlbmVyOworCisKKy8qKgorICogTWFpbiBwcm9ncmFtIGZvciBJT1RDbGllbnQuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlCisgKiBsaXN0ZW5lciBjcmVhdGVkIGJ5IE1haW5JT1RMaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIE1haW5JT1RDbGllbnQgaW1wbGVtZW50cyBJT1RIZWxwZXIuSU9UQ2xpZW50RmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgSU9UQ2xpZW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggIk1haW5JT1RDbGllbnQ6IHN0YXJ0aW5nIiApOworCQkKKwkJaWYgKGFyZ3MubGVuZ3RoID4gMSkKKwkJeworCQkJU3lzdGVtLmVyci5wcmludGxuKCAidXNhZ2U6IE1haW5JT1RDbGllbnQgW3VyaV0iICk7CisJCQlTeXN0ZW0uZXhpdCggMSApOworCQl9CisJCQorCQlpZiAoYXJncy5sZW5ndGggPiAwKQorCQkJdXJpID0gYXJnc1swXTsKKwkJCisJCWRvbnRTdGFydExpc3RlbmVyID0gdHJ1ZTsKKwkJCisJCUpVbml0Q29yZSBjID0gbmV3IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlKCk7CisJCQorCQljLmFkZExpc3RlbmVyKCBuZXcgUnVuTGlzdGVuZXIoKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiApCisJCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggInRlc3RSdW5TdGFydGVkICIrZGVzY3JpcHRpb24gKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnRlZCggRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludCggInRlc3QgIitkZXNjcmlwdGlvbiApOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlKCBGYWlsdXJlIGZhaWx1cmUgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCAiW2ZhaWxlZDogICIrZmFpbHVyZSsiXSIgKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZCggRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCAiIFtpZ25vcmVkXSIgKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB0ZXN0RmluaXNoZWQoIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uICkKKwkJCQl0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCAiIFtva10iICk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgdGVzdFJ1bkZpbmlzaGVkKCBSZXN1bHQgcmVzdWx0ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggInRlc3RSdW5GaW5pc2hlZCIgKTsKKwkJCX0KKwkJfSApOworCQkKKwkJUmVzdWx0IHIgPSBjLnJ1biggTWFpbklPVENsaWVudC5jbGFzcyApOworCQkKKwkJaWYgKCFyLndhc1N1Y2Nlc3NmdWwoKSkKKwkJeworCQkJU3lzdGVtLmVyci5wcmludGYoICJNYWluSU9UQ2xpZW50OiB0ZXN0cyBmYWlsZWQgKCVkLyVkLyVkKSIsCisJCQkJci5nZXRSdW5Db3VudCgpLCByLmdldElnbm9yZUNvdW50KCksIHIuZ2V0RmFpbHVyZUNvdW50KCkgKTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigpOworCQkJU3lzdGVtLmV4aXQoIDEgKTsKKwkJfQorCQkKKwkJU3lzdGVtLm91dC5wcmludGYoICJNYWluSU9UQ2xpZW50OiB0ZXN0cyBzdWNjZWVlZGVkICglZC8lZCkiLAorCQkJci5nZXRSdW5Db3VudCgpLCByLmdldElnbm9yZUNvdW50KCkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJCVN5c3RlbS5leGl0KCAwICk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9udFN0YXJ0TGlzdGVuZXI7CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMSI7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKCFkb250U3RhcnRMaXN0ZW5lcikKKwkJCU1haW5JT1RMaXN0ZW5lci5tYWluKCBuZXcgU3RyaW5nW10ge30gKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5CZWZvcmUKKwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzZXJ2ZXIgPSBJT1RIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsIHRoaXMgKTsKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCX0KKwkKKwlwcml2YXRlIFJlbW90ZUlPVFNlcnZlciBzZXJ2ZXI7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5BZnRlcgorCXB1YmxpYyB2b2lkIGFmdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc2VydmVyLl9zdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKwkJc2VydmVyID0gbnVsbDsKKwl9CisKKwlwdWJsaWMgSU9UQ2xpZW50IG5ld0lPVENsaWVudCggUmVtb3RlSU9UU2VydmVyIHNlcnZlciApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgSW1wbElPVENsaWVudCggc2VydmVyICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IF9FdGNoX1J1bnRpbWVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFkZF9udWxsX251bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzZXJ2ZXIuYWRkKCBudWxsLCBudWxsICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IF9FdGNoX1J1bnRpbWVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFkZF9udWxsXzIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzZXJ2ZXIuYWRkKCBudWxsLCAyICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IF9FdGNoX1J1bnRpbWVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFkZF8xX251bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzZXJ2ZXIuYWRkKCAxLCBudWxsICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkXzFfMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMywgc2VydmVyLmFkZCggMSwgMiApICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9pb3QvTWFpbklPVExpc3RlbmVyLmphdmEgYi9pbnRlcm9wdGVzdGVyL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9leGFtcGxlL2lvdC9NYWluSU9UTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQxODMxCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvZXhhbXBsZS9pb3QvTWFpbklPVExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuZXhhbXBsZS5pb3QuSU9USGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLmV4YW1wbGUuaW90LklPVFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5leGFtcGxlLmlvdC5SZW1vdGVJT1RDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworLyoqCisgKiBNYWluIHByb2dyYW0gZm9yIElPVFNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW5JT1RDbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluSU9UTGlzdGVuZXIgaW1wbGVtZW50cyBJT1RIZWxwZXIuSU9UU2VydmVyRmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgSU9UU2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChhcmdzLmxlbmd0aCA+IDEpCisJCXsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbiggInVzYWdlOiBNYWluSU9UQ2xpZW50IFt1cmldIiApOworCQkJU3lzdGVtLmV4aXQoIDEgKTsKKwkJfQorCQkKKwkJU3RyaW5nIHVyaSA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IElPVEhlbHBlci5uZXdMaXN0ZW5lciggdXJpLCBudWxsLAorCQkJbmV3IE1haW5JT1RMaXN0ZW5lcigpICk7CisKKwkJLy8gU3RhcnQgdGhlIExpc3RlbmVyCisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibGlzdGVuZXIgc3RhcnRlZDogIitsaXN0ZW5lciApOworCX0KKworCXB1YmxpYyBJT1RTZXJ2ZXIgbmV3SU9UU2VydmVyKCBSZW1vdGVJT1RDbGllbnQgY2xpZW50ICkKKwl7CisJCXJldHVybiBuZXcgSW1wbElPVFNlcnZlciggY2xpZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0FyZy5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0FyZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjliZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvQXJnLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLlRhZ0VsZW1lbnQ7CisKKworLyoqCisgKiBBcmcgbW9kZWxzIGFuIG5hbWVkIHZhbHVlIHBhc3NlZCB0byBhIHByb2NlZHVyZSAod2hpY2ggaXMgdXNlZCB0byBpbml0aWFsaXplCisgKiBhIFBhcmFtIG9uY2UgcmVjZWl2ZWQpLgorICovCitwdWJsaWMgY2xhc3MgQXJnCit7CisJLyoqCisJICogQHBhcmFtIHIKKwkgKiBAcmV0dXJuIHRoZSBBcmcgdGhhdCB3YXMgcGFyc2VkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQXJnIHBhcnNlKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJQXNzZXJ0aW9uLmNoZWNrKCByLm1hdGNoZXMoIG51bGwsICJhcmciICksICJ0YWcgaXMgYXJnIiApOworCQkKKwkJU3RyaW5nIG5hbWUgPSByLmdldEF0dHIoIG51bGwsICJuYW1lIiApOworCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJhcmcgdGFnIGhhcyBubyBuYW1lIiApOworCQkKKwkJU3RyaW5nIHZhbHVlID0gci5nZXRBdHRyKCBudWxsLCAidmFsdWUiICk7CisJCWlmICh2YWx1ZSA9PSBudWxsICYmIHIuY291bnRDaGlsZHJlbigpID4gMCkKKwkJCXZhbHVlID0gci5nZXRDZGF0YVZhbHVlKCk7CisJCQorCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJhcmcgJyIrbmFtZSsiJyBoYXMgbm8gdmFsdWUiICk7CisJCQorCQlyZXR1cm4gbmV3IEFyZyggbmFtZSwgdmFsdWUgKTsKKwl9CisKKwlwcml2YXRlIEFyZyggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApCisJeworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYXJnLgorCSAqLworCXB1YmxpYyBTdHJpbmcgbmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFyZ3MgbmFtZWQgdmFsdWVzIHdoaWNoIG1pZ2h0IGJlIHVzZWQgYXMgc3Vic3RpdHV0aW9ucy4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGFyZy4gVGhpcyBtaWdodCBpbnZvbHZlIHN1YnN0aXR1dGluZyBuYW1lZAorCSAqIHZhbHVlcyBmcm9tIGFyZ3MuCisJICovCisJcHVibGljIFN0cmluZyB2YWx1ZSggTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzICkKKwl7CisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlyZXR1cm4gU3Vic3RpdHV0b3Iuc3Vic3QoIHZhbHVlLCBhcmdzICk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJBcmcoICVzLCAlcyApIiwgbmFtZSwgdmFsdWUgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gd2hvCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAcGFyYW0gc3Vic3RzCisJICogQHJldHVybiB0aGUgbWFwIGZvcm1lZCBieSBwcm9jZXNzaW5nIHN1YnN0aXR1dGlvbnMgZnJvbSBzdWJzdHMgaW50byBlYWNoCisJICogdmFsdWUgZnJvbSBhcmdzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9jZXNzU3Vic3QoIFN0cmluZyB3aG8sCisJCU1hcDxTdHJpbmcsIEFyZz4gYXJncywgTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgKQorCXsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBuYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlmb3IgKEFyZyBhOiBhcmdzLnZhbHVlcygpKQorCQl7CisJCQlTdHJpbmcgdiA9IGEudmFsdWUoIHN1YnN0cyApOworCQkJbmFyZ3MucHV0KCBhLm5hbWUoKSwgdiApOworCQl9CisJCXJldHVybiBuYXJnczsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0NoaWxkV2Fsa2VyLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvQ2hpbGRXYWxrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlmZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0NoaWxkV2Fsa2VyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLkNkYXRhRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuVGFnRWxlbWVudDsKKworCisvKioKKyAqIENoaWxkV2Fsa2VyIGNhbGxzIGEgbWV0aG9kIHdpdGggZWFjaCBjaGlsZCBlbGVtZW50IHVuZGVyIGEgZ2l2ZW4gdGFnCisgKiBlbGVtZW50LgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ2hpbGRXYWxrZXIKK3sKKwkvKioKKwkgKiBJdGVyYXRlcyBvdmVyIHRoZSBjaGlsZHJlbiBvZiByIGFuZCBjYWxscyB0YWcgb3IgY2RhdGEgZm9yIGVhY2guCisJICogQHBhcmFtIHIKKwkgKi8KKwlwdWJsaWMgdm9pZCB3YWxrKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJZm9yIChJdGVyYXRvcjxFbGVtZW50PiBpID0gci5nZXRDaGlsZHJlbigpOyBpLmhhc05leHQoKTspCisJCXsKKwkJCUVsZW1lbnQgZSA9IGkubmV4dCgpOworCQkJaWYgKCEoZSBpbnN0YW5jZW9mIFRhZ0VsZW1lbnQpKQorCQkJeworCQkJCWlmICghY2RhdGEoIChDZGF0YUVsZW1lbnQpIGUgKSkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCSJ0YWcgIityLmdldFFOYW1lKCkrIjogY2RhdGEgbm90IGFsbG93ZWQgaGVyZTogJyIrZSsiJyIgKTsKKwkJCQkKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJVGFnRWxlbWVudCB0ZSA9IChUYWdFbGVtZW50KSBlOworCQkJaWYgKCF0YWcoIHRlICkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJInRhZyAiK3IuZ2V0UU5hbWUoKSsiOiB0YWcgIit0ZS5nZXRRTmFtZSgpKyIgbm90IGFsbG93ZWQgaGVyZSIgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSB0ZQorCSAqIEByZXR1cm4gaWYgdGFnIGlzIGFsbG93ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gdGFnKCBUYWdFbGVtZW50IHRlICkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGUKKwkgKiBAcmV0dXJuIHRydWUgaWYgY2RhdGEgaXMgYWxsb3dlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjZGF0YSggQ2RhdGFFbGVtZW50IGUgKQorCXsKKwkJU3RyaW5nIHMgPSBlLmdldENkYXRhKCk7CisJCXJldHVybiBzLnRyaW0oKS5sZW5ndGgoKSA9PSAwOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvRGVmYXVsdFJ1bm5pbmdQcm9nLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvRGVmYXVsdFJ1bm5pbmdQcm9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0Nzk5MAotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9EZWZhdWx0UnVubmluZ1Byb2cuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuUHJvZ3JhbS5Qcm9jZXNzU3RyZWFtUmVhZGVyOworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFJ1bm5pbmdQcm9nfS4KKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRSdW5uaW5nUHJvZyBpbXBsZW1lbnRzIFJ1bm5pbmdQcm9nCit7CisJLyoqCisJICogQHBhcmFtIHRrbnMKKwkgKiBAcGFyYW0gbnZzCisJICogQHBhcmFtIHN0ZG91dFRhZworCSAqIEBwYXJhbSBzdGRlcnJUYWcKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdFJ1bm5pbmdQcm9nKCBMaXN0PFN0cmluZz4gdGtucywgTWFwPFN0cmluZywgU3RyaW5nPiBudnMsCisJCVN0cmluZyBzdGRvdXRUYWcsIFN0cmluZyBzdGRlcnJUYWcgKQorCXsKKwkJdGhpcy50a25zID0gdGtuczsKKwkJdGhpcy5udnMgPSBudnM7CisJCXRoaXMuc3Rkb3V0VGFnID0gc3Rkb3V0VGFnOworCQl0aGlzLnN0ZGVyclRhZyA9IHN0ZGVyclRhZzsKKwl9CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0a25zOworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG52czsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0ZG91dFRhZzsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0ZGVyclRhZzsKKworCXByaXZhdGUgUHJvY2Vzc0J1aWxkZXIgcGI7CisKKwlwcml2YXRlIFByb2Nlc3MgcDsKKworCXByaXZhdGUgUHJvY2Vzc1N0cmVhbVJlYWRlciBvdXRyZHI7CisKKwlwcml2YXRlIFByb2Nlc3NTdHJlYW1SZWFkZXIgZXJycmRyOworCisJcHJpdmF0ZSBJbnRlZ2VyIHN0czsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuICJEZWZhdWx0UnVubmluZ1Byb2dAIiArIEludGVnZXIudG9IZXhTdHJpbmcoIGhhc2hDb2RlKCkgKTsKKwl9CisKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoIHRrbnMgKTsKKwkJcGIuZW52aXJvbm1lbnQoKS5wdXRBbGwoIG52cyApOworCQkKKwkJaCA9IG5ldyBUaHJlYWQoIG5ldyBSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlzdG9wKCk7CisJCQkJfQorCQkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQl9CisJCX0gKTsKKwkJCisJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayggaCApOworCisJCXJlcG9ydCggInN0YXJ0LCB0b2tlbnMgPSAiICsgdGtucyArICIsIG52cyA9ICIgKyBudnMgKTsKKworCQlwID0gcGIuc3RhcnQoKTsKKworCQlyZXBvcnQoICJzdGFydGVkIiApOworCisJCXAuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKKworCQlvdXRyZHIgPSBuZXcgUHJvY2Vzc1N0cmVhbVJlYWRlciggcC5nZXRJbnB1dFN0cmVhbSgpLCBTeXN0ZW0ub3V0LAorCQkJc3Rkb3V0VGFnICk7CisJCW91dHJkci5zdGFydCgpOworCisJCWVycnJkciA9IG5ldyBQcm9jZXNzU3RyZWFtUmVhZGVyKCBwLmdldEVycm9yU3RyZWFtKCksIFN5c3RlbS5vdXQsCisJCQlzdGRlcnJUYWcgKTsKKwkJZXJycmRyLnN0YXJ0KCk7CisJfQorCQorCXByaXZhdGUgVGhyZWFkIGg7CisKKwlwdWJsaWMgSW50ZWdlciBqb2luKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQlpZiAocCAhPSBudWxsKQorCQl7CisJCQlyZXBvcnQoICJqb2luIiApOworCisJCQlzdHMgPSBwLndhaXRGb3IoKTsKKwkJCXAgPSBudWxsOworCQkJCisJCQl0cnkKKwkJCXsKKwkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5yZW1vdmVTaHV0ZG93bkhvb2soIGggKTsKKwkJCX0KKwkJCWNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJaCA9IG51bGw7CisKKwkJCXJlcG9ydCggImpvaW4sIHN0cyA9ICIgKyBzdHMgKTsKKworCQkJaWYgKG91dHJkciAhPSBudWxsKQorCQkJCW91dHJkci5qb2luKCk7CisKKwkJCWlmIChlcnJyZHIgIT0gbnVsbCkKKwkJCQllcnJyZHIuam9pbigpOworCisJCQlyZXR1cm4gc3RzOworCQl9CisKKwkJcmVwb3J0KCAiam9pbjogbm8gcHJvZ3JhbSIgKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEludGVnZXIgc3RvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCXsKKwkJcmVwb3J0KCAic3RvcCIgKTsKKworCQlpZiAocCAhPSBudWxsKQorCQkJcC5kZXN0cm95KCk7CisKKwkJcmV0dXJuIGpvaW4oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVwb3J0KCBTdHJpbmcgbXNnICkKKwl7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCB0aGlzLnRvU3RyaW5nKCkgKyAiOiAiICsgbXNnICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0Vudi5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0Vudi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWQ0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvRW52LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuVGFnRWxlbWVudDsKKworCisvKioKKyAqIEVudiBtb2RlbHMgYSBjb250cmlidXRpb24gdG8gdGhlIGVudmlyb25tZW50IG9mIGEgcnVubmluZyBwcm9ncmFtLgorICovCitwdWJsaWMgY2xhc3MgRW52Cit7CisJLyoqCisJICogQHBhcmFtIHIKKwkgKiBAcmV0dXJuIHRoZSBFbnYgdGhhdCB3YXMgcGFyc2VkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRW52IHBhcnNlKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJQXNzZXJ0aW9uLmNoZWNrKCByLm1hdGNoZXMoIG51bGwsICJlbnYiICksICJ0YWcgaXMgZW52IiApOworCQkKKwkJU3RyaW5nIG5hbWUgPSByLmdldEF0dHIoIG51bGwsICJuYW1lIiApOworCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJlbnYgdGFnIGhhcyBubyBuYW1lIiApOworCQkKKwkJU3RyaW5nIHZhbHVlID0gci5nZXRBdHRyKCBudWxsLCAidmFsdWUiICk7CisJCWlmICh2YWx1ZSA9PSBudWxsICYmIHIuaGFzQ2hpbGRyZW4oKSkKKwkJCXZhbHVlID0gci5nZXRDZGF0YVZhbHVlKCk7CisJCQorCQlyZXR1cm4gbmV3IEVudiggbmFtZSwgdmFsdWUgKTsKKwl9CisJCisJcHJpdmF0ZSBFbnYoIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgbmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisJCisJLyoqCisJICogQHBhcmFtIGFyZ3MgbmFtZWQgdmFsdWVzIHdoaWNoIG1pZ2h0IGJlIHVzZWQgYXMgc3Vic3RpdHV0aW9ucy4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGVudi4gVGhpcyBtaWdodCBpbnZvbHZlIHN1YnN0aXR1dGluZyBuYW1lZAorCSAqIHZhbHVlcyBmcm9tIGFyZ3MuCisJICovCisJcHVibGljIFN0cmluZyB2YWx1ZSggTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzICkKKwl7CisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlyZXR1cm4gU3Vic3RpdHV0b3Iuc3Vic3QoIHZhbHVlLCBhcmdzICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0ludGVyb3BUZXN0LmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvSW50ZXJvcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY2MzhjCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0ludGVyb3BUZXN0LmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworCisKKy8qKiAqLworcHVibGljIGNsYXNzIEludGVyb3BUZXN0IGltcGxlbWVudHMgSW50ZXJvcFRlc3RJbnRmCit7CisJc3RhdGljIEludGVyb3BUZXN0SW50ZiBwYXJzZSggVGFnRWxlbWVudCByICkKKwl7CisJCWlmICghci5tYXRjaGVzKCBudWxsLCAiaW50ZXJvcHRlc3QiICkpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCUludGVyb3BUZXN0IGl0ID0gbmV3IEludGVyb3BUZXN0KCk7CisJCWl0LnBhcnNlQm9keSggciApOworCQlyZXR1cm4gaXQ7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSByCisJICovCisJcHVibGljIHZvaWQgcGFyc2VCb2R5KCBUYWdFbGVtZW50IHIgKQorCXsKKwkJbmV3IENoaWxkV2Fsa2VyKCkKKwkJeworCQkJcHVibGljIGJvb2xlYW4gdGFnKCBUYWdFbGVtZW50IHRlICkKKwkJCXsKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInBhcmFtcyIgKSkKKwkJCQl7CisJCQkJCXBhcnNlUGFyYW1zKCB0ZSApOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHRlLm1hdGNoZXMoIG51bGwsICJwcm9ncmFtcyIgKSkKKwkJCQl7CisJCQkJCXBhcnNlUHJvZ3JhbXMoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInRlc3RzIiApKQorCQkJCXsKKwkJCQkJcGFyc2VUZXN0cyggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAicnVuIiApKQorCQkJCXsKKwkJCQkJcGFyc2VSdW4oIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0ud2FsayggciApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcGFyc2VQYXJhbXMoIFRhZ0VsZW1lbnQgciApCisJeworCQluZXcgQ2hpbGRXYWxrZXIoKQorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiB0YWcoIFRhZ0VsZW1lbnQgdGUgKQorCQkJeworCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAicGFyYW0iICkpCisJCQkJeworCQkJCQlwYXJzZVBhcmFtKCB0ZSApOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9LndhbGsoIHIgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHBhcnNlUHJvZ3JhbXMoIFRhZ0VsZW1lbnQgciApCisJeworCQluZXcgQ2hpbGRXYWxrZXIoKQorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiB0YWcoIFRhZ0VsZW1lbnQgdGUgKQorCQkJeworCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAicHJvZ3JhbSIgKSkKKwkJCQl7CisJCQkJCXBhcnNlUHJvZ3JhbSggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfS53YWxrKCByICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlVGVzdHMoIFRhZ0VsZW1lbnQgciApCisJeworCQluZXcgQ2hpbGRXYWxrZXIoKQorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiB0YWcoIFRhZ0VsZW1lbnQgdGUgKQorCQkJeworCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAidGVzdCIgKSkKKwkJCQl7CisJCQkJCXBhcnNlVGVzdCggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfS53YWxrKCByICk7CisJfQorCQorCXByaXZhdGUgdm9pZCBwYXJzZVBhcmFtKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJUGFyYW0gcCA9IFBhcmFtLnBhcnNlKCByICk7CisJCXBhcmFtcy5wdXQoIHAubmFtZSgpLCBwICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUGFyYW0+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFyYW0+KCk7CisKKwlwcml2YXRlIHZvaWQgcGFyc2VQcm9ncmFtKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJUHJvZ3JhbSBwID0gUHJvZ3JhbS5wYXJzZSggdGhpcywgciApOworCQlwcm9ncmFtcy5wdXQoIHAubmFtZSgpLCBwICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJvZ3JhbT4gcHJvZ3JhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2dyYW0+KCk7CisKKwlwcml2YXRlIHZvaWQgcGFyc2VUZXN0KCBUYWdFbGVtZW50IHIgKQorCXsKKwkJVGVzdCB0ID0gVGVzdC5wYXJzZSggdGhpcywgciApOworCQl0ZXN0cy5wdXQoIHQubmFtZSgpLCB0ICk7CisJfQorCQorCWZpbmFsIE1hcDxTdHJpbmcsIFRlc3Q+IHRlc3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUZXN0PigpOworCisJcHJpdmF0ZSB2b2lkIHBhcnNlUnVuKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJcnVucy5hZGQoIFJ1bi5wYXJzZSggdGhpcywgciApICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgTGlzdDxSdW4+IHJ1bnMgPSBuZXcgQXJyYXlMaXN0PFJ1bj4oKTsKKworCXB1YmxpYyB2b2lkIHJ1biggTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggIkludGVyb3BUZXN0LnJ1bjogb3ZlcnJpZGVzID0gIitvdmVycmlkZXMgKTsKKwkJCisJCS8vIGNvbnN0cnVjdCBzdWJzdHMgb3V0IG9mIHBhcmFtcyArIG92ZXJyaWRlcworCQkKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgPSBQYXJhbS5wcm9jZXNzT3ZlcnJpZGVzKCAiaW50ZXJvcHRlc3QiLAorCQkJcGFyYW1zLCBvdmVycmlkZXMgKTsKKwkJCisJCS8vU3lzdGVtLm91dC5wcmludGxuKCAiSW50ZXJvcFRlc3QucnVuOiBzdWJzdHMgPSAiK3N1YnN0cyApOworCQkKKwkJLy8gcnVuIGVhY2ggInJ1biIgZGVmaW5lZCBpbiBpbnRlcm9wdGVzdAorCQkKKwkJZm9yIChSdW4gcjogcnVucykKKwkJCXIucnVuKCBzdWJzdHMgKTsKKwl9CisKKwlwdWJsaWMgVGVzdEludGYgZ2V0VGVzdCggU3RyaW5nIHRlc3QgKQorCXsKKwkJcmV0dXJuIHRlc3RzLmdldCggdGVzdCApOworCX0KKworCXB1YmxpYyBQcm9ncmFtIGdldFByb2dyYW0oIFN0cmluZyBuYW1lICkKKwl7CisJCXJldHVybiBwcm9ncmFtcy5nZXQoIG5hbWUgKTsKKwl9CisKKwlwdWJsaWMgaW50IG5leHRSdW5JZCgpCisJeworCQlyZXR1cm4gKytydW5JZDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgcnVuSWQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0ludGVyb3BUZXN0SW50Zi5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL0ludGVyb3BUZXN0SW50Zi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzM2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvSW50ZXJvcFRlc3RJbnRmLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBzdWl0ZSBvZiB0ZXN0cyB0byBiZSBydW4uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW50ZXJvcFRlc3RJbnRmCit7CisJLyoqCisJICogQHBhcmFtIHRlc3QgdGhlIG5hbWUgb2YgdGhlIHRlc3QgdG8gZ2V0LgorCSAqIEByZXR1cm4gdGhlIGludGVyZmFjZSB0byB0aGUgdGVzdC4KKwkgKi8KKwlwdWJsaWMgVGVzdEludGYgZ2V0VGVzdCggU3RyaW5nIHRlc3QgKTsKKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgbmFtZWQgUHJvZ3JhbS4KKwkgKi8KKwlwdWJsaWMgUHJvZ3JhbSBnZXRQcm9ncmFtKCBTdHJpbmcgbmFtZSApOworCQorCS8qKgorCSAqIFJ1bnMgYWxsIHRoZSB0ZXN0cyBpbiB0aGUgc3VpdGUuCisJICogCisJICogQHBhcmFtIG92ZXJyaWRlcyByZXBsYWNlbWVudCB2YWx1ZXMgZm9yIGludGVyb3B0ZXN0IHBhcmFtcy4gYW55IHBhcmFtcworCSAqIHdoaWNoIGhhdmUgbm8gZGVmYXVsdCBtdXN0IGJlIHNwZWNpZmllZC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oIE1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzICkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgaWQgb2YgYSBydW4gaW4gdGhpcyBpbnRlcm9wdGVzdC4KKwkgKi8KKwlwdWJsaWMgaW50IG5leHRSdW5JZCgpOworfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL01haW5JbnRlcm9wVGVzdGVyLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvTWFpbkludGVyb3BUZXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2RkNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL01haW5JbnRlcm9wVGVzdGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyogJElkOiBJbnRlcm9wVGVzdGVyLmphdmEgMjU3NSAyMDA5LTAxLTI5IDE2OjUzOjUwWiBzY2NvbWVyICQNCisgKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5BcnJheUl0ZXJhdG9yOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5TdHJpbmdVdGlsOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQuU3RyaW5nQXJyYXlJdGVyYXRvcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuVGFnRWxlbWVudDsNCisNCisNCisvKiogKi8NCitAU3VwcHJlc3NXYXJuaW5ncyggImFsbCIgKQ0KK3B1YmxpYyBjbGFzcyBNYWluSW50ZXJvcFRlc3Rlcg0KK3sNCisJLyoqDQorCSAqIEBwYXJhbSBhcmdzDQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24NCisJew0KKwkJaWYgKGFyZ3MubGVuZ3RoIDwgMSkNCisJCXsNCisJCQlTeXN0ZW0uZXJyLnByaW50bG4oICJ1c2FnZTogSW50ZXJvcFRlc3RlciBmaWxlIFtuYW1lPXZhbHVlIC4uLl0iICk7DQorCQkJU3lzdGVtLmV4aXQoIDEgKTsNCisJCX0NCisNCisJCVN0cmluZ0FycmF5SXRlcmF0b3IgaSA9IG5ldyBTdHJpbmdBcnJheUl0ZXJhdG9yKCBhcmdzICk7DQorDQorCQlUYWdFbGVtZW50IHRlID0gbmV3IFhtbFBhcnNlcigpLnBhcnNlT25lKCBuZXcgRmlsZSggaS5uZXh0KCkgKSwgbnVsbCwNCisJCQkiaW50ZXJvcHRlc3QiICk7DQorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIHRlICk7DQorCQlJbnRlcm9wVGVzdEludGYgaXRlc3QgPSBJbnRlcm9wVGVzdC5wYXJzZSggdGUgKTsNCisJCXRlID0gbnVsbDsNCisNCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQorCQl3aGlsZSAoaS5oYXNOZXh0KCkpDQorCQl7DQorCQkJU3RyaW5nIHMgPSBpLm5leHQoKTsNCisJCQlTdHJpbmdbXSB4ID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIHMsICc9JyApOw0KKwkJCWlmICh4ID09IG51bGwpDQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQorCQkJCQkibWFsZm9ybWVkICduYW1lPXZhbHVlJyB0b2tlbiBvbiBjb21tYW5kIGxpbmUiICk7DQorCQkJb3ZlcnJpZGVzLnB1dCggeFswXSwgeFsxXSApOw0KKwkJfQ0KKw0KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oICJtYWluOiBvdmVycmlkZXMgPSAiICsgb3ZlcnJpZGVzICk7DQorDQorCQluZXcgVGhyZWFkKCBuZXcgUnVubmFibGUoKQ0KKwkJew0KKwkJCXB1YmxpYyB2b2lkIHJ1bigpDQorCQkJew0KKwkJCQl0cnkNCisJCQkJew0KKwkJCQkJaW50IGMgPSBTeXN0ZW0uaW4ucmVhZCgpOw0KKwkJCQkJaWYgKGMgPT0gJ3EnKQ0KKwkJCQkJCVN5c3RlbS5leGl0KCAxICk7DQorCQkJCX0NCisJCQkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkNCisJCQkJew0KKwkJCQkJLy8gaWdub3JlDQorCQkJCX0NCisJCQl9DQorCQl9ICkuc3RhcnQoKTsNCisNCisJCWl0ZXN0LnJ1biggb3ZlcnJpZGVzICk7DQorDQorCQlTeXN0ZW0ub3V0LnByaW50bG4oICJtYWluOiBkb25lIiApOw0KKwkJU3lzdGVtLmV4aXQoIDAgKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvUGFyYW0uamF2YSBiL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9QYXJhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGMxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvUGFyYW0uamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuVGFnRWxlbWVudDsKKworCisvKioKKyAqIFBhcmFtIG1vZGVscyBhIG5hbWVkIHZhbHVlIGluaXRpYWxpemVkIGZyb20gYXJncyBzdXBwbGllZCB0byBhIGZ1bmN0aW9uIGFuZAorICogcGVyaGFwcyBnaXZlbiBhIGRlZmF1bHQgdmFsdWUuIEEgUGFyYW0gbWF5IGJlIHVzZWQgd2hlbiBjYWxsaW5nIGFub3RoZXIKKyAqIGZ1bmN0aW9uIGJ5IHN1YnN0aXR1dGlvbiBpbnRvIGFuIEFyZyBvciBUb2tlbi4KKyAqLworcHVibGljIGNsYXNzIFBhcmFtCit7CisJLyoqCisJICogQHBhcmFtIHIKKwkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgUGFyYW0uCisJICovCisJcHVibGljIHN0YXRpYyBQYXJhbSBwYXJzZSggVGFnRWxlbWVudCByICkKKwl7CisJCUFzc2VydGlvbi5jaGVjayggci5tYXRjaGVzKCBudWxsLCAicGFyYW0iICksICJ0YWcgaXMgcGFyYW0iICk7CisJCQorCQlTdHJpbmcgbmFtZSA9IHIuZ2V0QXR0ciggbnVsbCwgIm5hbWUiICk7CisJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBhcmFtIHRhZyBoYXMgbm8gbmFtZSBhdHRyaWJ1dGUiICk7CisJCQorCQlQYXJhbSBwID0gbmV3IFBhcmFtKCBuYW1lICk7CisJCXAucGFyc2VCb2R5KCByICk7CisJCXJldHVybiBwOworCX0KKworCXByaXZhdGUgUGFyYW0oIFN0cmluZyBuYW1lICkKKwl7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBwYXJhbS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlQm9keSggVGFnRWxlbWVudCByICkKKwl7CisJCWRlZmx0ID0gci5nZXRBdHRyKCBudWxsLCAiZGVmYXVsdCIgKTsKKwkJaWYgKGRlZmx0ID09IG51bGwgJiYgci5jb3VudENoaWxkcmVuKCkgPiAwKQorCQkJZGVmbHQgPSByLmdldENkYXRhVmFsdWUoKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZGVmbHQ7CisKKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBwYXJhbSBpbiBhcmdzLCBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBub3QKKwkgKiBpbiBhcmdzLgorCSAqLworCXB1YmxpYyBTdHJpbmcgdmFsdWUoIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncyApCisJeworCQlTdHJpbmcgdiA9IGFyZ3MuZ2V0KCBuYW1lICk7CisJCWlmICh2ICE9IG51bGwpCisJCQlyZXR1cm4gdjsKKwkJcmV0dXJuIGRlZmx0OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiUGFyYW0oICVzLCAlcyApIiwgbmFtZSwgZGVmbHQgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gd2hvIHRoZSB0YWcgbmFtZSBvZiB0aGUgb3duZXIgb2YgcGFyYW1zLgorCSAqIEBwYXJhbSBwYXJhbXMgYSBtYXAgb2YgcGFyYW1zIChmcm9tIHBhcmFtIHRhZ3MpLgorCSAqIEBwYXJhbSBvdmVycmlkZXMgbmFtZSAvIHZhbHVlIHBhaXJzIHdoaWNoIG92ZXJyaWRlIGRlZmF1bHQgcGFyYW0gdmFsdWVzLgorCSAqIEByZXR1cm4gYSBtYXAgb2YgbmFtZSAvIHZhbHVlIHBhaXJzIHdoaWNoIGFyZSB0aGUgcGFyYW0gdmFsdWVzIGFmdGVyCisJICogb3ZlcnJpZGVzIGhhdmUgYmVlbiBhcHBsaWVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9jZXNzT3ZlcnJpZGVzKCBTdHJpbmcgd2hvLAorCQlNYXA8U3RyaW5nLCBQYXJhbT4gcGFyYW1zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG92ZXJyaWRlcyApCisJeworCQkvLyBlbnN1cmUgbmFtZXMgaW4gb3ZlcnJpZGVzIGFwcGVhciBpbiBwYXJhbXMKKwkJCisJCWZvciAoU3RyaW5nIG5hbWU6IG92ZXJyaWRlcy5rZXlTZXQoKSkKKwkJCWlmICghcGFyYW1zLmNvbnRhaW5zS2V5KCBuYW1lICkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJd2hvKyIgcGFyYW0gJyIrbmFtZSsiJyBpcyBub3QgZGVmaW5lZCwgY2Fubm90IG92ZXJyaWRlIiApOworCQkKKwkJLy8gY29uc3RydWN0IGFyZ3Mgb3V0IG9mIHBhcmFtcyArIG92ZXJyaWRlcworCQkKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWZvciAoUGFyYW0gcCA6IHBhcmFtcy52YWx1ZXMoKSkKKwkJeworCQkJU3RyaW5nIHYgPSBwLnZhbHVlKCBvdmVycmlkZXMgKTsKKwkJCWlmICh2ID09IG51bGwpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJd2hvKyIgcGFyYW0gJyIrcC5uYW1lKCkrIicgaGFzIG5vIHZhbHVlLCBtdXN0IG92ZXJyaWRlIiApOworCQkJYXJncy5wdXQoIHAubmFtZSgpLCB2ICk7CisJCX0KKwkJcmV0dXJuIGFyZ3M7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9Qcm9nLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvUHJvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2I1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvUHJvZy5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworCisKKy8qKgorICogUHJvZyBtb2RlbHMgYSByZWZlcmVuY2UgdG8gYSBQcm9ncmFtIGluIGEgVGVzdC4KKyAqLworcHVibGljIGNsYXNzIFByb2cKKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gdGVzdAorCQkgKiBAcGFyYW0gcgorCQkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgUHJvZy4KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgUHJvZyBwYXJzZSggVGVzdEludGYgdGVzdCwgVGFnRWxlbWVudCByICkKKwkJeworCQkJQXNzZXJ0aW9uLmNoZWNrKCByLm1hdGNoZXMoIG51bGwsICJwcm9nIiApLCAidGFnIGlzIHByb2ciICk7CisJCQkKKwkJCVN0cmluZyBuYW1lID0gci5nZXRBdHRyKCBudWxsLCAibmFtZSIgKTsKKwkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJwcm9nIHRhZyBoYXMgbm8gbmFtZSBhdHRyaWJ1dGUiICk7CisJCQkKKwkJCVByb2cgcCA9IG5ldyBQcm9nKCB0ZXN0LCBuYW1lICk7CisJCQlwLnBhcnNlQm9keSggciApOworCQkJcmV0dXJuIHA7CisJCX0KKwkJCisJCXByaXZhdGUgUHJvZyggVGVzdEludGYgdGVzdCwgU3RyaW5nIG5hbWUgKQorCQl7CisJCQl0aGlzLnRlc3QgPSB0ZXN0OworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJfQorCisJCXByaXZhdGUgZmluYWwgVGVzdEludGYgdGVzdDsKKwkJCisJCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGVuY2xvc2luZyBUZXN0CisJCSAqLworCQlwdWJsaWMgVGVzdEludGYgdGVzdCgpCisJCXsKKwkJCXJldHVybiB0ZXN0OworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIFByb2dyYW0gdG8gcnVuLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBuYW1lKCkKKwkJeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJCisJCXByaXZhdGUgdm9pZCBwYXJzZUJvZHkoIFRhZ0VsZW1lbnQgciApCisJCXsKKwkJCW5ldyBDaGlsZFdhbGtlcigpCisJCQl7CisJCQkJcHVibGljIGJvb2xlYW4gdGFnKCBUYWdFbGVtZW50IHRlICkKKwkJCQl7CisJCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAiYXJnIiApKQorCQkJCQl7CisJCQkJCQlBcmcgYSA9IEFyZy5wYXJzZSggdGUgKTsKKwkJCQkJCWlmIChhcmdzLmNvbnRhaW5zS2V5KCBhLm5hbWUoKSApKQorCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJkdXBsaWNhdGUgbmFtZSBhcmcgIithLm5hbWUoKSApOworCQkJCQkJYXJncy5wdXQoIGEubmFtZSgpLCBhICk7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0ud2FsayggciApOworCQl9CisJCQorCQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEFyZz4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJnPigpOworCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBhcmdzIHRvIGJlIHBhc3NlZCB0byB0aGlzIHByb2cuCisJCSAqLworCQlwdWJsaWMgTWFwPFN0cmluZywgQXJnPiBhcmdzKCkKKwkJeworCQkJcmV0dXJuIGFyZ3M7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIHN1YnN0cworCQkgKiBAcmV0dXJuIGEgcnVubmluZyBpbnN0YW5jZSBvZiBQcm9nLgorCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkJICovCisJCXB1YmxpYyBSdW5uaW5nUHJvZyBzdGFydCggTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzID0gcHJvY2Vzc1N1YnN0KCAic3RhcnQiLCBzdWJzdHMgKTsKKwkJCXJldHVybiBnZXRQcm9ncmFtKCkuc3RhcnQoIG92ZXJyaWRlcyApOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBzdWJzdHMKKwkJICogQHRocm93cyBFeGNlcHRpb24gCisJCSAqLworCQlwdWJsaWMgdm9pZCBydW4oIE1hcDxTdHJpbmcsIFN0cmluZz4gc3Vic3RzICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG92ZXJyaWRlcyA9IHByb2Nlc3NTdWJzdCggInJ1biIsIHN1YnN0cyApOworCQkJZ2V0UHJvZ3JhbSgpLnJ1biggb3ZlcnJpZGVzICk7CisJCX0KKworCQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvY2Vzc1N1YnN0KCBTdHJpbmcgd2hvLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgKQorCQl7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggIlByb2cuIit3aG8rIjogbmFtZSAiK25hbWUrIiwgc3Vic3RzID0gIitzdWJzdHMgKTsKKwkJCQorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMgPSBBcmcucHJvY2Vzc1N1YnN0KCAicHJvZyIsIGFyZ3MsCisJCQkJc3Vic3RzICk7CisJCQkKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCAiUHJvZy4iK3dobysiOiBuYW1lICIrbmFtZSsiLCBvdmVycmlkZXMgPSAiK292ZXJyaWRlcyApOworCQkJCisJCQlyZXR1cm4gb3ZlcnJpZGVzOworCQl9CisKKwkJcHJpdmF0ZSBQcm9ncmFtIGdldFByb2dyYW0oKQorCQl7CisJCQlQcm9ncmFtIHAgPSB0ZXN0LmdldFByb2dyYW0oIG5hbWUgKTsKKwkJCWlmIChwID09IG51bGwpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm5vIHN1Y2ggcHJvZ3JhbSAiK25hbWUgKTsKKwkJCXJldHVybiBwOworCQl9CisJfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9Qcm9ncmFtLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvUHJvZ3JhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MjE0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvUHJvZ3JhbS5qYXZhCkBAIC0wLDAgKzEsNDMwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworCisKKy8qKgorICogUHJvZ3JhbSBtb2RlbHMgYSBwcm9ncmFtIHRvIGJlIHJ1biBhcyBwYXJ0IG9mIGEgdGVzdC4gVGhlIHByb2dyYW0gaGFzCisgKiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGVudmlyb25tZW50LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGFuZCB0aW1lb3V0LgorICovCitwdWJsaWMgY2xhc3MgUHJvZ3JhbQoreworCS8qKgorCSAqIEBwYXJhbSBpdGVzdAorCSAqIEBwYXJhbSByCisJICogQHJldHVybiB0aGUgcGFyc2VkIFByb2dyYW0uCisJICovCisJcHVibGljIHN0YXRpYyBQcm9ncmFtIHBhcnNlKCBJbnRlcm9wVGVzdEludGYgaXRlc3QsIFRhZ0VsZW1lbnQgciApCisJeworCQlBc3NlcnRpb24uY2hlY2soIHIubWF0Y2hlcyggbnVsbCwgInByb2dyYW0iICksICJ0YWcgaXMgcHJvZ3JhbSIgKTsKKwkJCisJCVN0cmluZyBuYW1lID0gci5nZXRBdHRyKCBudWxsLCAibmFtZSIgKTsKKwkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAicHJvZ3JhbSB0YWcgaGFzIG5vIG5hbWUiICk7CisJCQorCQlQcm9ncmFtIHAgPSBuZXcgUHJvZ3JhbSggaXRlc3QsIG5hbWUgKTsKKwkJcC5wYXJzZUJvZHkoIHIgKTsKKwkJcmV0dXJuIHA7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBpdGVzdAorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHJpdmF0ZSBQcm9ncmFtKCBJbnRlcm9wVGVzdEludGYgaXRlc3QsIFN0cmluZyBuYW1lICkKKwl7CisJCXRoaXMuaXRlc3QgPSBpdGVzdDsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIEludGVyb3BUZXN0SW50ZiBpdGVzdDsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgY29udGFpbmluZyBJbnRlcm9wVGVzdEludGYuCisJICovCisJcHVibGljIEludGVyb3BUZXN0SW50ZiBpdGVzdCgpCisJeworCQlyZXR1cm4gaXRlc3Q7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBQcm9ncmFtLgorCSAqLworCXB1YmxpYyBTdHJpbmcgbmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHIKKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoIFRhZ0VsZW1lbnQgciApCisJeworCQluZXcgQ2hpbGRXYWxrZXIoKQorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiB0YWcoIFRhZ0VsZW1lbnQgdGUgKQorCQkJeworCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAicGFyYW1zIiApKQorCQkJCXsKKwkJCQkJcGFyc2VQYXJhbXMoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInRva2VucyIgKSkKKwkJCQl7CisJCQkJCXBhcnNlVG9rZW5zKCB0ZSApOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHRlLm1hdGNoZXMoIG51bGwsICJlbnZpcm9ubWVudCIgKSkKKwkJCQl7CisJCQkJCXBhcnNlRW52aXJvbm1lbnQoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInN0ZGluIiApKQorCQkJCXsKKwkJCQkJcGFyc2VTdGRpbiggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAic3Rkb3V0IiApKQorCQkJCXsKKwkJCQkJcGFyc2VTdGRvdXQoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInN0ZGVyciIgKSkKKwkJCQl7CisJCQkJCXBhcnNlU3RkZXJyKCB0ZSApOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHRlLm1hdGNoZXMoIG51bGwsICJzdGRvdXR0YWciICkpCisJCQkJeworCQkJCQlwYXJzZVN0ZG91dFRhZyggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAic3RkZXJydGFnIiApKQorCQkJCXsKKwkJCQkJcGFyc2VTdGRlcnJUYWcoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInRpbWVvdXQiICkpCisJCQkJeworCQkJCQlwYXJzZVRpbWVvdXQoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0ud2FsayggciApOworCX0KKworCXByaXZhdGUgdm9pZCBwYXJzZVBhcmFtcyggVGFnRWxlbWVudCByICkKKwl7CisJCW5ldyBDaGlsZFdhbGtlcigpCisJCXsKKwkJCXB1YmxpYyBib29sZWFuIHRhZyggVGFnRWxlbWVudCB0ZSApCisJCQl7CisJCQkJaWYgKHRlLm1hdGNoZXMoIG51bGwsICJwYXJhbSIgKSkKKwkJCQl7CisJCQkJCXBhcnNlUGFyYW0oIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfS53YWxrKCByICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW0oIFRhZ0VsZW1lbnQgdGUgKQorCXsKKwkJUGFyYW0gcCA9IFBhcmFtLnBhcnNlKCB0ZSApOworCQlwYXJhbXMucHV0KCBwLm5hbWUoKSwgcCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBhcmFtPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhcmFtPigpOworCisJcHJpdmF0ZSB2b2lkIHBhcnNlVG9rZW5zKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJbmV3IENoaWxkV2Fsa2VyKCkKKwkJeworCQkJcHVibGljIGJvb2xlYW4gdGFnKCBUYWdFbGVtZW50IHRlICkKKwkJCXsKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInRva2VuIiApKQorCQkJCXsKKwkJCQkJcGFyc2VUb2tlbiggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9LndhbGsoIHIgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcGFyc2VUb2tlbiggVGFnRWxlbWVudCByICkKKwl7CisJCXRva2Vucy5hZGQoIFRva2VuLnBhcnNlKCByICkgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBMaXN0PFRva2VuPiB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0PFRva2VuPigpOworCisJcHJpdmF0ZSB2b2lkIHBhcnNlRW52aXJvbm1lbnQoIFRhZ0VsZW1lbnQgciApCisJeworCQluZXcgQ2hpbGRXYWxrZXIoKQorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiB0YWcoIFRhZ0VsZW1lbnQgdGUgKQorCQkJeworCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAiZW52IiApKQorCQkJCXsKKwkJCQkJcGFyc2VFbnYoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfS53YWxrKCByICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlRW52KCBUYWdFbGVtZW50IHIgKQorCXsKKwkJRW52IGUgPSBFbnYucGFyc2UoIHIgKTsKKwkJZW52cy5wdXQoIGUubmFtZSgpLCBlICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRW52PiBlbnZzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFbnY+KCk7CisKKwlwcml2YXRlIHZvaWQgcGFyc2VTdGRpbiggVGFnRWxlbWVudCByICkKKwl7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAicGFyc2VTdGRpbiIgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcGFyc2VTdGRvdXQoIFRhZ0VsZW1lbnQgciApCisJeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInBhcnNlU3Rkb3V0IiApOworCX0KKworCXByaXZhdGUgdm9pZCBwYXJzZVN0ZGVyciggVGFnRWxlbWVudCByICkKKwl7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAicGFyc2VTdGRlcnIiICk7CisJfQorCQorCXByaXZhdGUgdm9pZCBwYXJzZVN0ZG91dFRhZyggVGFnRWxlbWVudCByICkKKwl7CisJCXN0ZG91dFRhZyA9IHIuZ2V0Q2RhdGFWYWx1ZSgpOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBzdGRvdXRUYWcgPSAib3V0IjsKKwkKKwlwcml2YXRlIHZvaWQgcGFyc2VTdGRlcnJUYWcoIFRhZ0VsZW1lbnQgciApCisJeworCQlzdGRlcnJUYWcgPSByLmdldENkYXRhVmFsdWUoKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgc3RkZXJyVGFnID0gImVyciI7CisKKwlwcml2YXRlIHZvaWQgcGFyc2VUaW1lb3V0KCBUYWdFbGVtZW50IHIgKQorCXsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJwYXJzZVRpbWVvdXQiICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG92ZXJyaWRlcworCSAqIEByZXR1cm4gYSBSdW5uaW5nUHJvZyB3aGljaCBhbGxvd3MgdGhlIHJ1bm5pbmcgcHJvZ3JhbSB0byBiZSBjb250cm9sbGVkLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCXB1YmxpYyBSdW5uaW5nUHJvZyBzdGFydCggTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHN1YnN0cyA9IHByb2Nlc3NPdmVycmlkZXMoICJzdGFydCIsIG92ZXJyaWRlcyApOworCQlMaXN0PFN0cmluZz4gdGtucyA9IHByb2Nlc3NUb2tlbnMoIHN1YnN0cyApOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG52cyA9IHByb2Nlc3NFbnZzKCBzdWJzdHMgKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50ZiggIlByb2dyYW0uc3RhcnQ6IHRva2VucyAlcyBlbnZzICVzXG4iLCB0a25zLCBudnMgKTsKKwkJRGVmYXVsdFJ1bm5pbmdQcm9nIHJwID0gbmV3IERlZmF1bHRSdW5uaW5nUHJvZyggdGtucywgbnZzLCBzdGRvdXRUYWcsIHN0ZGVyclRhZyApOworCQl0cnkKKwkJeworCQkJcnAuc3RhcnQoKTsKKwkJCXJldHVybiBycDsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXRyeQorCQkJeworCQkJCXJwLnN0b3AoKTsKKwkJCX0KKwkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEgKQorCQkJeworCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbiggInByb2Nlc3MgZGlkIG5vdCBzdGFydCIgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBvdmVycmlkZXMKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oIE1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgPSBwcm9jZXNzT3ZlcnJpZGVzKCAicnVuIiwgb3ZlcnJpZGVzICk7CisJCUxpc3Q8U3RyaW5nPiB0a25zID0gcHJvY2Vzc1Rva2Vucyggc3Vic3RzICk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gbnZzID0gcHJvY2Vzc0VudnMoIHN1YnN0cyApOworCQkvL1N5c3RlbS5vdXQucHJpbnRmKCAiUHJvZ3JhbS5ydW46IHRva2VucyAlcyBlbnZzICVzXG4iLCB0a25zLCBudnMgKTsKKwkJCisJCURlZmF1bHRSdW5uaW5nUHJvZyBycCA9IG5ldyBEZWZhdWx0UnVubmluZ1Byb2coIHRrbnMsIG52cywgc3Rkb3V0VGFnLCBzdGRlcnJUYWcgKTsKKwkJdHJ5CisJCXsKKwkJCXJwLnN0YXJ0KCk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0cnkKKwkJCXsKKwkJCQlycC5zdG9wKCk7CisJCQl9CisJCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUxICkKKwkJCXsKKwkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCXRocm93IG5ldyBFeGNlcHRpb24oICJwcm9jZXNzIGRpZCBub3Qgc3RhcnQiICk7CisJCX0KKwkJCisJCXRyeQorCQl7CisJCQlJbnRlZ2VyIHN0cyA9IHJwLmpvaW4oKTsKKwkJCWlmIChzdHMgPT0gbnVsbCB8fCBzdHMgIT0gMCkKKwkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAicHJvY2VzcyBkaWVkIHdpdGggYmFkIHN0YXR1czogIitzdHMgKTsKKwkJfQorCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQl7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb2Nlc3NPdmVycmlkZXMoIFN0cmluZyB3aG8sCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzICkKKwl7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCAiUHJvZ3JhbS4iK3dobysiOiBuYW1lICIrbmFtZSsiLCBvdmVycmlkZXMgPSAiK292ZXJyaWRlcyApOworCQkKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgPSBQYXJhbS5wcm9jZXNzT3ZlcnJpZGVzKCAicHJvZ3JhbSIsIHBhcmFtcywKKwkJCW92ZXJyaWRlcyApOworCQkKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oICJQcm9ncmFtLiIrd2hvKyI6IG5hbWUgIituYW1lKyIsIHN1YnN0cyA9ICIrc3Vic3RzICk7CisJCQorCQlyZXR1cm4gc3Vic3RzOworCX0KKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHByb2Nlc3NUb2tlbnMoIE1hcDxTdHJpbmcsIFN0cmluZz4gc3Vic3RzICkKKwl7CisJCUxpc3Q8U3RyaW5nPiBudG9rZW5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoVG9rZW4gdDogdG9rZW5zKQorCQkJbnRva2Vucy5hZGQoIHQudmFsdWUoIHN1YnN0cyApICk7CisJCXJldHVybiBudG9rZW5zOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9jZXNzRW52cyggTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgKQorCXsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBuZW52cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlmb3IgKEVudiBlOiBlbnZzLnZhbHVlcygpKQorCQkJbmVudnMucHV0KCBlLm5hbWUoKSwgZS52YWx1ZSggc3Vic3RzICkgKTsKKwkJcmV0dXJuIG5lbnZzOworCX0KKwkKKwkvKioKKwkgKiBAYXV0aG9yIHdlcnQKKwkgKgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvY2Vzc1N0cmVhbVJlYWRlciBleHRlbmRzIFRocmVhZAorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBpcyBpbnB1dCBzdHJlYW0gdG8gcmVhZCB1bnRpbCBlb2YuCisJCSAqIEBwYXJhbSB0YWcgCisJCSAqIEBwYXJhbSBwcyAKKwkJICogQHRocm93cyBFeGNlcHRpb24gCisJCSAqLworCQlwdWJsaWMgUHJvY2Vzc1N0cmVhbVJlYWRlciggSW5wdXRTdHJlYW0gaXMsIFByaW50U3RyZWFtIHBzLCBTdHJpbmcgdGFnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlyZHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaXMgKSApOworCQkJdGhpcy5wcyA9IHBzOworCQkJdGhpcy50YWcgPSB0YWc7CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmRyOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBwczsKKwkJCisJCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhZzsKKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlTdHJpbmcgczsKKwkJCQl3aGlsZSAoKHMgPSByZHIucmVhZExpbmUoKSkgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXN5bmNocm9uaXplZCAocHMpCisJCQkJCXsKKwkJCQkJCXBzLnByaW50ZiggIlslc10gJXNcbiIsIHRhZywgcyApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCXJkci5jbG9zZSgpOworCQkJCX0KKwkJCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1J1bi5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1J1bi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTg1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvUnVuLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLlRhZ0VsZW1lbnQ7CisKKworLyoqCisgKiBNb2RlbCBvZiBhIHRlc3QgcnVuLiBSdW4gaWRlbnRpZmllcyB0aGUgVGVzdCB0byBiZSBydW4gYW5kIHRoZSBhcmd1bWVudHMKKyAqIChuYW1lIC8gdmFsdWUgcGFpcnMpIHdoaWNoIHdpbGwgYmUgc3VwcGxpZWQgdG8gdGhlIFRlc3Qgd2hlbiBpdCBpcyBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBSdW4KK3sKKwkvKioKKwkgKiBAcGFyYW0gaXRlc3QgCisJICogQHBhcmFtIHIgdGhlIHhtbCB0YWcgd2hpY2ggZGVmaW5lcyB0aGlzIFJ1bi4KKwkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgUnVuIG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJ1biBwYXJzZSggSW50ZXJvcFRlc3RJbnRmIGl0ZXN0LCBUYWdFbGVtZW50IHIgKQorCXsKKwkJQXNzZXJ0aW9uLmNoZWNrKCByLm1hdGNoZXMoIG51bGwsICJydW4iICksICJ0YWcgaXMgcnVuIiApOworCQkKKwkJU3RyaW5nIG5hbWUgPSByLmdldEF0dHIoIG51bGwsICJuYW1lIiApOworCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCW5hbWUgPSAicnVuLSIraXRlc3QubmV4dFJ1bklkKCk7CisJCQorCQlTdHJpbmcgdGVzdCA9IHIuZ2V0QXR0ciggbnVsbCwgInRlc3QiICk7CisJCWlmICh0ZXN0ID09IG51bGwgfHwgdGVzdC5sZW5ndGgoKSA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInJ1biB0YWcgaGFzIG5vIHRlc3QgYXR0cmlidXRlIiApOworCQkKKwkJUnVuIHQgPSBuZXcgUnVuKCBpdGVzdCwgbmFtZSwgdGVzdCApOworCQl0LnBhcnNlQm9keSggciApOworCQlyZXR1cm4gdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaXRlc3QKKwkgKiBAcGFyYW0gdGVzdAorCSAqLworCXByaXZhdGUgUnVuKCBJbnRlcm9wVGVzdEludGYgaXRlc3QsIFN0cmluZyBuYW1lLCBTdHJpbmcgdGVzdCApCisJeworCQl0aGlzLml0ZXN0ID0gaXRlc3Q7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMudGVzdCA9IHRlc3Q7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBJbnRlcm9wVGVzdEludGYgaXRlc3Q7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB0ZXN0OworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5pbmcgSW50ZXJvcFRlc3RJbnRmLgorCSAqLworCXB1YmxpYyBJbnRlcm9wVGVzdEludGYgaXRlc3QoKQorCXsKKwkJcmV0dXJuIGl0ZXN0OworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcnVuLgorCSAqLworCXB1YmxpYyBTdHJpbmcgbmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0ZXN0IG5hbWUuCisJICovCisJcHVibGljIFN0cmluZyB0ZXN0KCkKKwl7CisJCXJldHVybiB0ZXN0OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiAiUnVuICgiK25hbWUrIikiOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcGFyc2VCb2R5KCBUYWdFbGVtZW50IHIgKQorCXsKKwkJbmV3IENoaWxkV2Fsa2VyKCkKKwkJeworCQkJcHVibGljIGJvb2xlYW4gdGFnKCBUYWdFbGVtZW50IHRlICkKKwkJCXsKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgImFyZyIgKSkKKwkJCQl7CisJCQkJCUFyZyBhID0gQXJnLnBhcnNlKCB0ZSApOworCQkJCQlpZiAoYXJncy5jb250YWluc0tleSggYS5uYW1lKCkgKSkKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJkdXBsaWNhdGUgbmFtZSBhcmcgIithLm5hbWUoKSApOworCQkJCQlhcmdzLnB1dCggYS5uYW1lKCksIGEgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAiZGlzYWJsZSIgKSkKKwkJCQl7CisJCQkJCWlmICh0ZS5jb3VudENoaWxkcmVuKCkgPiAwKQorCQkJCQkJZGlzYWJsZSA9IEJvb2xlYW4udmFsdWVPZiggdGUuZ2V0Q2RhdGFWYWx1ZSgpICk7CisJCQkJCWVsc2UKKwkJCQkJCWRpc2FibGUgPSB0cnVlOworCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggInJ1biAiK25hbWUrIiB0ZXN0ICIrdGVzdCsiLCBkaXNhYmxlID0gIitkaXNhYmxlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0ud2FsayggciApOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gZGlzYWJsZTsKKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEFyZz4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJnPigpOworCisJLyoqCisJICogUnVucyB0aGUgdGVzdCBzcGVjaWZpZWQgYnkgdGhpcyBSdW4uCisJICogQHBhcmFtIHN1YnN0cyBwYXJhbXMgZnJvbSBpbnRlcm9wdGVzdCB0byB1c2UgZm9yIHN1YnN0aXR1dGlvbnMgaW50byB0aGlzCisJICogUnVuJ3MgYXJncy4gVGhlIGFyZ3MgYXJlIHRoZW4gdXNlZCB0byBvdmVycmlkZSB0aGUgcGFyYW1zIG9mIHRoZSBSdW4ncworCSAqIHRlc3QuCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJcHVibGljIHZvaWQgcnVuKCBNYXA8U3RyaW5nLCBTdHJpbmc+IHN1YnN0cyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlUZXN0SW50ZiB0ID0gaXRlc3QuZ2V0VGVzdCggdGVzdCApOworCQkJaWYgKHQgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAidGVzdCAiK3Rlc3QrIiBub3QgZm91bmQiICk7CisJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKwkJCQorCQkJaWYgKGRpc2FibGUpCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCAiUnVuLnJ1bjogbmFtZSAiK25hbWUrIiB0ZXN0ICIrdGVzdCsiLCBkaXNhYmxlZCIgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggIlJ1bi5ydW46IG5hbWUgIituYW1lKyIgdGVzdCAiK3Rlc3QrIiwgc3Vic3RzID0gIitzdWJzdHMgKTsKKwkJCQorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMgPSBBcmcucHJvY2Vzc1N1YnN0KCAicnVuIiwgYXJncywgc3Vic3RzICk7CisJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggIlJ1bi5ydW46IG5hbWUgIituYW1lKyIgdGVzdCAiK3Rlc3QrIiwgb3ZlcnJpZGVzID0gIitvdmVycmlkZXMgKTsKKwkJCQorCQkJdC5ydW4oIG92ZXJyaWRlcyApOworCQkJCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJSdW4ucnVuOiBuYW1lICIrbmFtZSsiIHRlc3QgIit0ZXN0KyIsIGRvbmUiICk7CisJCX0KKwkJY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlJ1bi5ydW46IG5hbWUgIituYW1lKyIgdGVzdCAiK3Rlc3QrIiwgY2F1Z2h0IGV4Y2VwdGlvbiIsIGUgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1hcCBvZiBhcmdzIGZvciB0aGlzIHRlc3QgcnVuLgorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBBcmc+IGFyZ3MoKQorCXsKKwkJcmV0dXJuIGFyZ3M7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9SdW5uaW5nUHJvZy5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1J1bm5pbmdQcm9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhY2ViMwotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9SdW5uaW5nUHJvZy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworLyoqCisgKiBSdW5uaW5nUHJvZyBtb2RlbHMgYSBydW5uaW5nIHByb2dyYW0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUnVubmluZ1Byb2cKK3sKKwkvKioKKwkgKiBTdG9wcyB0aGUgcnVubmluZyBwcm9ncmFtLgorCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcHJvZ3JhbS4gMCBtZWFucyBpdCBleGl0ZWQgbm9ybWFsbHkuCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBzdG9wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOworCQorCS8qKgorCSAqIFdhaXRzIGZvciB0aGUgcnVubmluZyBwcm9ncmFtIHRvIHRlcm1pbmF0ZS4KKwkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHByb2dyYW0uIDAgbWVhbnMgaXQgZXhpdGVkIG5vcm1hbGx5LgorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gCisJICovCisJcHVibGljIEludGVnZXIgam9pbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvU3Vic3RpdHV0b3IuamF2YSBiL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9TdWJzdGl0dXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTk5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvU3Vic3RpdHV0b3IuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5DaGFySXRlcmF0b3I7CisKKworLyoqCisgKiBBIGNsYXNzIHRvIHBlcmZvcm0gc3Vic3RpdHV0aW9ucyBpbnRvIGEgc3RyaW5nIGZyb20gYSBtYXAsCisgKiBzbyB0aGF0IHdpdGggaW5wdXQgdmFsdWU9ImFiY3tmb299ZGVmIiBhbmQgbWFwIGhhcyBrZXkgImZvbyIKKyAqIHdpdGggdmFsdWUgIjEyMyIsIHRoZSByZXN1bHQgaXMgImFiYzEyM2RlZiIuCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJzdGl0dXRvcgoreworCXByaXZhdGUgU3Vic3RpdHV0b3IoKQorCXsKKwkJLy8gZG9uJ3QgaW5zdGFudGlhdGUKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHZhbHVlCisJICogQHBhcmFtIG1hcAorCSAqIEByZXR1cm4gdmFsdWUgd2l0aCBzdWJzdGl0dXRpb25zIGZyb20gbWFwCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3Vic3QoIFN0cmluZyB2YWx1ZSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgKQorCXsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlTdHJpbmdCdWZmZXIgc2F2ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJQ2hhckl0ZXJhdG9yIGkgPSBuZXcgQ2hhckl0ZXJhdG9yKCB2YWx1ZSApOworCQlpbnQgc3RhdGUgPSAwOworCQl3aGlsZSAoc3RhdGUgIT0gNCkKKwkJeworCQkJY2hhciBjOworCQkJaW50IGNjOworCQkJaWYgKGkuaGFzTmV4dCgpKQorCQkJeworCQkJCWMgPSBpLm5leHQoKTsKKwkJCQljYyA9IGNoYXJDbGFzcyggYyApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWMgPSAwOworCQkJCWNjID0gRU9GOworCQkJfQorCQkJCisJCQlpbnQgbnN0YXRlID0gbnN0YXRlc1tzdGF0ZV1bY2NdOworCQkJaW50IGFjdGlvbiA9IGFjdGlvbnNbc3RhdGVdW2NjXTsKKwkJCQorCQkJc3dpdGNoIChhY3Rpb24pCisJCQl7CisJCQkJY2FzZSAxOgorCQkJCQlzYi5hcHBlbmQoIGMgKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQkvLyBpZ25vcmUKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQlzYXZlLmFwcGVuZCggYyApOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCXNiLmFwcGVuZCggc2F2ZSApOworCQkJCQlzYXZlLnNldExlbmd0aCggMCApOworCQkJCQlzYi5hcHBlbmQoIGMgKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA1OgorCQkJCQlzYXZlLmFwcGVuZCggYyApOworCQkJCQlzYi5hcHBlbmQoIHN1YnN0MCggc2F2ZS50b1N0cmluZygpLCBtYXAgKSApOworCQkJCQlzYXZlLnNldExlbmd0aCggMCApOworCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJtYWxmb3JtZWQgZXNjYXBlIiApOworCQkJCWNhc2UgNzoKKwkJCQkJc2IuYXBwZW5kKCBzYXZlICk7CisJCQkJCXNhdmUuc2V0TGVuZ3RoKCAwICk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJhY3Rpb24gIithY3Rpb24rIiB1bmtub3duIiApOworCQkJfQorCQkJCisJCQlzdGF0ZSA9IG5zdGF0ZTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHN1YnN0MCggU3RyaW5nIHMsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwICkKKwl7CisJCUFzc2VydGlvbi5jaGVjayggcy5zdGFydHNXaXRoKCAieyIgKSwgInN0YXJ0cyB3aXRoIHsiICk7CisJCUFzc2VydGlvbi5jaGVjayggcy5lbmRzV2l0aCggIn0iICksICJlbmRzIHdpdGggfSIgKTsKKwkJU3RyaW5nIG4gPSBzLnN1YnN0cmluZyggMSApLnN1YnN0cmluZyggMCwgcy5sZW5ndGgoKS0yICk7CisJCWlmIChtYXAuY29udGFpbnNLZXkoIG4gKSkKKwkJCXJldHVybiBtYXAuZ2V0KCBuICk7CisJCXJldHVybiBzOworCX0KKworCXByaXZhdGUgc3RhdGljIGludCBjaGFyQ2xhc3MoIGNoYXIgYyApCisJeworCQlpZiAoYyA9PSAnXFwnKSByZXR1cm4gQlNMOworCQlpZiAoYyA9PSAneycpIHJldHVybiBMQlI7CisJCWlmIChjID09ICd9JykgcmV0dXJuIFJCUjsKKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSByZXR1cm4gQUxOOworCQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHJldHVybiBBTE47CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgcmV0dXJuIEFMTjsKKwkJcmV0dXJuIE9USDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEJTTCA9IDA7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExCUiA9IDE7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJCUiA9IDI7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFMTiA9IDM7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE9USCA9IDQ7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEVPRiA9IDU7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdW10gbnN0YXRlcyA9CisJeworCQkvLyBmaXJzdCBpbmRleCBpcyBjdXJyZW50IHN0YXRlCisJCS8vIHNlY29uZCBpbmRleCBpcyBjaGFyIGNsYXNzOiBCU0wsIExCUiwgUkJSLCBBTE4sIE9USCwgRU9GCisJCXsgMSwgMiwgMCwgMCwgMCwgNCB9LAorCQl7IDAsIDAsIDAsIDAsIDAsIDQgfSwKKwkJeyAwLCAyLCAwLCAzLCAwLCA0IH0sCisJCXsgMCwgMCwgMCwgMywgMCwgNCB9CisJfTsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW11bXSBhY3Rpb25zID0KKwl7CisJCS8vIGZpcnN0IGluZGV4IGlzIGN1cnJlbnQgc3RhdGUKKwkJLy8gc2Vjb25kIGluZGV4IGlzIGNoYXIgY2xhc3M6IEJTTCwgTEJSLCBSQlIsIEFMTiwgT1RILCBFT0YKKwkJeyAyLCAzLCAxLCAxLCAxLCAyIH0sCisJCXsgMSwgMSwgMSwgMSwgMSwgNiB9LAorCQl7IDQsIDEsIDQsIDMsIDQsIDcgfSwKKwkJeyA0LCA0LCA1LCAzLCA0LCA3IH0KKwl9OworfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3QuamF2YSBiL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzYTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0LmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuVGFnRWxlbWVudDsKKworCisvKioKKyAqIFRlc3QgbW9kZWxzIGEgdGVzdCB0aGF0IGNhbiBiZSBydW4uIEEgVGVzdCBoYXMgYSBuYW1lICh1c2VkIGJ5IGEgUnVuIHRvCisgKiBzcGVjaWZ5IHRoZSB0ZXN0KSwgaW5jbHVkZXMgc29tZSBwYXJhbWV0ZXIgdmFsdWVzIGFuZCBzb21lIHByb2dyYW1zIHRvIGJlCisgKiBydW4gZm9yIHNldHVwLCBzdXBwb3J0LCB0aGUgdGVzdCBqaWcgaXRzZWxmLCBhbmQgdGhlbiBjbGVhbnVwLgorICovCitwdWJsaWMgY2xhc3MgVGVzdCBpbXBsZW1lbnRzIFRlc3RJbnRmCit7CisJLyoqCisJICogQHBhcmFtIGl0ZXN0CisJICogQHBhcmFtIHIKKwkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgVGVzdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3QgcGFyc2UoIEludGVyb3BUZXN0SW50ZiBpdGVzdCwgVGFnRWxlbWVudCByICkKKwl7CisJCUFzc2VydGlvbi5jaGVjayggci5tYXRjaGVzKCBudWxsLCAidGVzdCIgKSwgInRhZyBpcyB0ZXN0IiApOworCQkKKwkJU3RyaW5nIG5hbWUgPSByLmdldEF0dHIoIG51bGwsICJuYW1lIiApOworCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJ0ZXN0IHRhZyBoYXMgbm8gbmFtZSBhdHRyaWJ1dGUiICk7CisJCQorCQlUZXN0IHQgPSBuZXcgVGVzdCggaXRlc3QsIG5hbWUgKTsKKwkJdC5wYXJzZUJvZHkoIHIgKTsKKwkJcmV0dXJuIHQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGl0ZXN0CisJICogQHBhcmFtIG5hbWUKKwkgKi8KKwlwcml2YXRlIFRlc3QoIEludGVyb3BUZXN0SW50ZiBpdGVzdCwgU3RyaW5nIG5hbWUgKQorCXsKKwkJdGhpcy5pdGVzdCA9IGl0ZXN0OworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIEludGVyb3BUZXN0SW50ZiBpdGVzdDsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCQorCXB1YmxpYyBJbnRlcm9wVGVzdEludGYgaXRlc3QoKQorCXsKKwkJcmV0dXJuIGl0ZXN0OworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIG5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCQorCXByaXZhdGUgdm9pZCBwYXJzZUJvZHkoIFRhZ0VsZW1lbnQgciApCisJeworCQluZXcgQ2hpbGRXYWxrZXIoKQorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiB0YWcoIFRhZ0VsZW1lbnQgdGUgKQorCQkJeworCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAicGFyYW1zIiApKQorCQkJCXsKKwkJCQkJcGFyc2VQYXJhbXMoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInNldHVwIiApKQorCQkJCXsKKwkJCQkJcGFyc2VTZXR1cCggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAic3VwcG9ydCIgKSkKKwkJCQl7CisJCQkJCXBhcnNlU3VwcG9ydCggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAiamlnIiApKQorCQkJCXsKKwkJCQkJcGFyc2VKaWcoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgImNsZWFudXAiICkpCisJCQkJeworCQkJCQlwYXJzZUNsZWFudXAoIHRlICk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0ud2FsayggciApOworCQkKKwkJaWYgKGppZyA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm5vIGppZyBkZWZpbmVkIGZvciB0ZXN0OiAiK25hbWUgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW1zKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJbmV3IENoaWxkV2Fsa2VyKCkKKwkJeworCQkJcHVibGljIGJvb2xlYW4gdGFnKCBUYWdFbGVtZW50IHRlICkKKwkJCXsKKwkJCQlpZiAodGUubWF0Y2hlcyggbnVsbCwgInBhcmFtIiApKQorCQkJCXsKKwkJCQkJcGFyc2VQYXJhbSggdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfS53YWxrKCByICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW0oIFRhZ0VsZW1lbnQgciApCisJeworCQlQYXJhbSBwID0gUGFyYW0ucGFyc2UoIHIgKTsKKwkJcGFyYW1zLnB1dCggcC5uYW1lKCksIHAgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQYXJhbT4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJhbT4oKTsKKworCXByaXZhdGUgdm9pZCBwYXJzZVNldHVwKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJcGFyc2VQcm9nTGlzdCggc2V0dXAsIHIgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBMaXN0PFByb2c+IHNldHVwID0gbmV3IEFycmF5TGlzdDxQcm9nPigpOworCisJcHJpdmF0ZSB2b2lkIHBhcnNlU3VwcG9ydCggVGFnRWxlbWVudCByICkKKwl7CisJCXBhcnNlUHJvZ0xpc3QoIHN1cHBvcnQsIHIgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBMaXN0PFByb2c+IHN1cHBvcnQgPSBuZXcgQXJyYXlMaXN0PFByb2c+KCk7CisKKwlwcml2YXRlIHZvaWQgcGFyc2VKaWcoIFRhZ0VsZW1lbnQgciApCisJeworCQlMaXN0PFByb2c+IGppZ3MgPSBuZXcgQXJyYXlMaXN0PFByb2c+KCk7CisJCXBhcnNlUHJvZ0xpc3QoIGppZ3MsIHIgKTsKKwkJaWYgKGppZ3Muc2l6ZSgpICE9IDEpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAib25seSBvbmUgdGVzdCBqaWcgcGVyIHRlc3QiICk7CisJCWppZyA9IGppZ3MuZ2V0KCAwICk7CisJfQorCQorCXByaXZhdGUgUHJvZyBqaWc7CisKKwlwcml2YXRlIHZvaWQgcGFyc2VDbGVhbnVwKCBUYWdFbGVtZW50IHIgKQorCXsKKwkJcGFyc2VQcm9nTGlzdCggY2xlYW51cCwgciApOworCX0KKworCXByaXZhdGUgZmluYWwgTGlzdDxQcm9nPiBjbGVhbnVwID0gbmV3IEFycmF5TGlzdDxQcm9nPigpOworCQorCXByaXZhdGUgdm9pZCBwYXJzZVByb2dMaXN0KCBmaW5hbCBMaXN0PFByb2c+IGxpc3QsIFRhZ0VsZW1lbnQgciApCisJeworCQluZXcgQ2hpbGRXYWxrZXIoKQorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiB0YWcoIFRhZ0VsZW1lbnQgdGUgKQorCQkJeworCQkJCWlmICh0ZS5tYXRjaGVzKCBudWxsLCAicHJvZyIgKSkKKwkJCQl7CisJCQkJCXBhcnNlUHJvZyggbGlzdCwgdGUgKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfS53YWxrKCByICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlUHJvZyggTGlzdDxQcm9nPiBsaXN0LCBUYWdFbGVtZW50IHIgKQorCXsKKwkJbGlzdC5hZGQoIFByb2cucGFyc2UoIHRoaXMsIHIgKSApOworCX0KKworCXB1YmxpYyB2b2lkIHJ1biggTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggIlRlc3QucnVuOiAiK25hbWUrIiwgb3ZlcnJpZGVzID0gIitvdmVycmlkZXMgKTsKKwkJCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gc3Vic3RzID0gUGFyYW0ucHJvY2Vzc092ZXJyaWRlcyggInRlc3QiLCBwYXJhbXMsCisJCQlvdmVycmlkZXMgKTsKKwkJCisJCS8vU3lzdGVtLm91dC5wcmludGxuKCAiVGVzdC5ydW46ICIrbmFtZSsiLCBzdWJzdHMgPSAiK3N1YnN0cyApOworCQkKKwkJcnVuUHJvZ3MoIHNldHVwLCBzdWJzdHMgKTsKKwkJdHJ5CisJCXsKKwkJCUxpc3Q8UnVubmluZ1Byb2c+IHJ1bm5pbmdQcm9ncyA9IHN0YXJ0UHJvZ3MoIHN1cHBvcnQsIHN1YnN0cyApOworCQkJdHJ5CisJCQl7CisJCQkJcnVuUHJvZyggamlnLCBzdWJzdHMgKTsKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlzdG9wUHJvZ3MoIHJ1bm5pbmdQcm9ncyApOworCQkJfQorCQl9CisJCWZpbmFsbHkKKwkJeworCQkJcnVuUHJvZ3MoIGNsZWFudXAsIHN1YnN0cyApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHJ1blByb2dzKCBMaXN0PFByb2c+IHByb2dzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHN1YnN0cyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZvciAoUHJvZyBwcm9nOiBwcm9ncykKKwkJCXJ1blByb2coIHByb2csIHN1YnN0cyApOworCX0KKworCXByaXZhdGUgTGlzdDxSdW5uaW5nUHJvZz4gc3RhcnRQcm9ncyggTGlzdDxQcm9nPiBwcm9ncywKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMaXN0PFJ1bm5pbmdQcm9nPiBydW5uaW5nUHJvZ3MgPSBuZXcgQXJyYXlMaXN0PFJ1bm5pbmdQcm9nPigpOworCQlmb3IgKFByb2cgcHJvZzogcHJvZ3MpCisJCQlydW5uaW5nUHJvZ3MuYWRkKCBzdGFydFByb2coIHByb2csIHN1YnN0cyApICk7CisJCXJldHVybiBydW5uaW5nUHJvZ3M7CisJfQorCisJcHJpdmF0ZSB2b2lkIHN0b3BQcm9ncyggTGlzdDxSdW5uaW5nUHJvZz4gcnVubmluZ1Byb2dzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZm9yIChSdW5uaW5nUHJvZyBycDogcnVubmluZ1Byb2dzKQorCQkJc3RvcFByb2coIHJwICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJ1blByb2coIFByb2cgcHJvZywgTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlwcm9nLnJ1biggc3Vic3RzICk7CisJfQorCisJcHJpdmF0ZSBSdW5uaW5nUHJvZyBzdGFydFByb2coIFByb2cgcHJvZywgTWFwPFN0cmluZywgU3RyaW5nPiBzdWJzdHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gcHJvZy5zdGFydCggc3Vic3RzICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHN0b3BQcm9nKCBSdW5uaW5nUHJvZyBycCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJwLnN0b3AoKTsKKwl9CisKKwlwdWJsaWMgUHJvZyBqaWcoKQorCXsKKwkJcmV0dXJuIGppZzsKKwl9CisKKwlwdWJsaWMgTGlzdDxQcm9nPiBjbGVhbnVwKCkKKwl7CisJCXJldHVybiBjbGVhbnVwOworCX0KKworCXB1YmxpYyBMaXN0PFByb2c+IHNldHVwKCkKKwl7CisJCXJldHVybiBzZXR1cDsKKwl9CisKKwlwdWJsaWMgTGlzdDxQcm9nPiBzdXBwb3J0KCkKKwl7CisJCXJldHVybiBzdXBwb3J0OworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBQYXJhbT4gcGFyYW1zKCkKKwl7CisJCXJldHVybiBwYXJhbXM7CisJfQorCisJcHVibGljIFByb2dyYW0gZ2V0UHJvZ3JhbSggU3RyaW5nIG5hbWUgKQorCXsKKwkJcmV0dXJuIGl0ZXN0LmdldFByb2dyYW0oIG5hbWUgKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RJbnRmLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvVGVzdEludGYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ5OWFhCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RJbnRmLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gYSB0ZXN0LiBBIHRlc3QgY29uc2lzdHMgb2Ygc2V0dXAsIHN1cHBvcnQsIGppZywgYW5kIGNsZWFudXAKKyAqIHByb2dyYW1zLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RJbnRmCit7CisJLyoqCisJICogQHJldHVybiB0aGUgY29udGFpbmluZyBJbnRlcm9wVGVzdEludGYuCisJICovCisJcHVibGljIEludGVyb3BUZXN0SW50ZiBpdGVzdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRlc3QuCisJICovCisJcHVibGljIFN0cmluZyBuYW1lKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgcGFyYW1zIG9mIHRoaXMgdGVzdC4KKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgUGFyYW0+IHBhcmFtcygpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHNldHVwIHByb2dyYW1zIG9mIHRoaXMgdGVzdC4KKwkgKi8KKwlwdWJsaWMgTGlzdDxQcm9nPiBzZXR1cCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHN1cHBvcnQgcHJvZ3JhbXMgb2YgdGhpcyB0ZXN0LgorCSAqLworCXB1YmxpYyBMaXN0PFByb2c+IHN1cHBvcnQoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0ZXN0IGppZyBvZiB0aGlzIHRlc3QuIFRoaXMgaXMgdGhlIHByb2dyYW0gdGhhdCBwZXJmb3JtcyB0aGUKKwkgKiB0ZXN0LgorCSAqLworCXB1YmxpYyBQcm9nIGppZygpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGNsZWFudXAgcHJvZ3JhbXMgb2YgdGhpcyB0ZXN0LgorCSAqLworCXB1YmxpYyBMaXN0PFByb2c+IGNsZWFudXAoKTsKKworCS8qKgorCSAqIFJ1bnMgdGhlIHRlc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4KKwkgKiBAcGFyYW0gb3ZlcnJpZGVzIG5hbWUgLyB2YWx1ZSBwYWlycyB3aGljaCBtdXN0IGNvcnJlc3BvbmQgdG8gZGVmaW5lZAorCSAqIHRlc3QgcGFyYW1ldGVycyBhbmQgb3ZlcnJpZGUgdGhlaXIgdmFsdWVzLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1biggTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMgKSB0aHJvd3MgRXhjZXB0aW9uOworCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBuYW1lZCBQcm9ncmFtCisJICovCisJcHVibGljIFByb2dyYW0gZ2V0UHJvZ3JhbSggU3RyaW5nIG5hbWUgKTsKK30KZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9Ub2tlbi5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rva2VuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MzUxZQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLlRhZ0VsZW1lbnQ7CisKKworLyoqCisgKiBUb2tlbiBtb2RlbHMgYW4gdW5uYW1lZCBwb3NpdGlvbmFsIHBhcmFtZXRlciB0byBhIHByb2dyYW0uCisgKi8KK3B1YmxpYyBjbGFzcyBUb2tlbgoreworCS8qKgorCSAqIEBwYXJhbSByCisJICogQHJldHVybiB0aGUgcGFyc2VkIFRva2VuLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVG9rZW4gcGFyc2UoIFRhZ0VsZW1lbnQgciApCisJeworCQlBc3NlcnRpb24uY2hlY2soIHIubWF0Y2hlcyggbnVsbCwgInRva2VuIiApLCAidGFnIGlzIHRva2VuIiApOworCQkKKwkJU3RyaW5nIHZhbHVlID0gci5nZXRBdHRyKCBudWxsLCAidmFsdWUiICk7CisJCWlmICh2YWx1ZSA9PSBudWxsICYmIHIuaGFzQ2hpbGRyZW4oKSkKKwkJCXZhbHVlID0gci5nZXRDZGF0YVZhbHVlKCk7CisJCQorCQlyZXR1cm4gbmV3IFRva2VuKCB2YWx1ZSApOworCX0KKwkKKwlwcml2YXRlIFRva2VuKCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJncyBuYW1lZCB2YWx1ZXMgd2hpY2ggbWlnaHQgYmUgdXNlZCBhcyBzdWJzdGl0dXRpb25zLgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgYXJnLiBUaGlzIG1pZ2h0IGludm9sdmUgc3Vic3RpdHV0aW5nIG5hbWVkCisJICogdmFsdWVzIGZyb20gYXJncy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHZhbHVlKCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MgKQorCXsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBTdWJzdGl0dXRvci5zdWJzdCggdmFsdWUsIGFyZ3MgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvVGVzdEFyZy5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RBcmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGNkYmQwCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RBcmcuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLkFyZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKKworLyoqCisgKiBUZXN0IG9mIEFyZy4KKyAqLworcHVibGljIGNsYXNzIFRlc3RBcmcKK3sKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCXsKKwkJYXJncy5wdXQoICJiYXIiLCAiMTIzIiApOworCQlhcmdzLnB1dCggImJheiIsICI0NTYiICk7CisJfQorCQorCXByaXZhdGUgVGFnRWxlbWVudCBwYXJzZVhtbCggU3RyaW5nIHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IFhtbFBhcnNlcigpLnBhcnNlT25lKCBzICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEFzc2VydGlvbkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGFnIGlzIGFyZworCQlBcmcucGFyc2UoIHBhcnNlWG1sKCAiPGZvby8+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gYXJnIHRhZyBoYXMgbm8gbmFtZQorCQlBcmcucGFyc2UoIHBhcnNlWG1sKCAiPGFyZy8+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gYXJnIHRhZyBoYXMgbm8gbmFtZQorCQlBcmcucGFyc2UoIHBhcnNlWG1sKCAiPGFyZyBuYW1lPVwiXCIvPiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGFyZyAnZm9vJyBoYXMgbm8gdmFsdWUKKwkJQXJnLnBhcnNlKCBwYXJzZVhtbCggIjxhcmcgbmFtZT1cImZvb1wiLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYXJzZTUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBhcmcgJ2ZvbycgaGFzIG5vIHZhbHVlCisJCUFyZy5wYXJzZSggcGFyc2VYbWwoICI8YXJnIG5hbWU9XCJmb29cIj48L2FyZz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBcmcgYSA9IEFyZy5wYXJzZSggcGFyc2VYbWwoICI8YXJnIG5hbWU9XCJmb29cIj5hYmM8L2FyZz4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZm9vIiwgYS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYWJjIiwgYS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2U3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQXJnIGEgPSBBcmcucGFyc2UoIHBhcnNlWG1sKCAiPGFyZyBuYW1lPVwiZm9vXCIgdmFsdWU9XCJcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggImZvbyIsIGEubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggIiIsIGEudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFyZyBhID0gQXJnLnBhcnNlKCBwYXJzZVhtbCggIjxhcmcgbmFtZT1cImZvb1wiIHZhbHVlPVwiYWJjXCIvPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBhLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICJhYmMiLCBhLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBcmcgYSA9IEFyZy5wYXJzZSggcGFyc2VYbWwoICI8YXJnIG5hbWU9XCJmdVwiPntiYXJ9PC9hcmc+IiApICk7CisJCWFzc2VydEVxdWFscyggImZ1IiwgYS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMTIzIiwgYS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2UxMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFyZyBhID0gQXJnLnBhcnNlKCBwYXJzZVhtbCggIjxhcmcgbmFtZT1cImZ1XCIgdmFsdWU9XCJ7YmFyfVwiLz4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZnUiLCBhLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICIxMjMiLCBhLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQXJnIGEgPSBBcmcucGFyc2UoIHBhcnNlWG1sKCAiPGFyZyBuYW1lPVwidG9mdVwiPnh7YmF6fXk8L2FyZz4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAidG9mdSIsIGEubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggIng0NTZ5IiwgYS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2UxMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFyZyBhID0gQXJnLnBhcnNlKCBwYXJzZVhtbCggIjxhcmcgbmFtZT1cInRvZnVcIiB2YWx1ZT1cInh7YmF6fXlcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggInRvZnUiLCBhLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICJ4NDU2eSIsIGEudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlMTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBcmcgYSA9IEFyZy5wYXJzZSggcGFyc2VYbWwoICI8YXJnIG5hbWU9XCJzbmFmdVwiPnh7YmFyZn15PC9hcmc+IiApICk7CisJCWFzc2VydEVxdWFscyggInNuYWZ1IiwgYS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAieHtiYXJmfXkiLCBhLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTE0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQXJnIGEgPSBBcmcucGFyc2UoIHBhcnNlWG1sKCAiPGFyZyBuYW1lPVwic25hZnVcIiB2YWx1ZT1cInh7YmFyZn15XCIvPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJzbmFmdSIsIGEubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggInh7YmFyZn15IiwgYS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdG9TdHJpbmcxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQXJnIGEgPSBBcmcucGFyc2UoIHBhcnNlWG1sKCAiPGFyZyBuYW1lPVwidG9mdVwiIHZhbHVlPVwieHtiYXp9eVwiLz4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiQXJnKCB0b2Z1LCB4e2Jhen15ICkiLCBhLnRvU3RyaW5nKCkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvVGVzdEVudi5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RFbnYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg5ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RFbnYuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuRW52OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLlRhZ0VsZW1lbnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCisKKy8qKiBUZXN0IG9mIEVudiAqLworcHVibGljIGNsYXNzIFRlc3RFbnYKK3sKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCXsKKwkJYXJncy5wdXQoICJiYXIiLCAiMTIzIiApOworCQlhcmdzLnB1dCggImJheiIsICI0NTYiICk7CisJfQorCQorCXByaXZhdGUgVGFnRWxlbWVudCBwYXJzZVhtbCggU3RyaW5nIHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IFhtbFBhcnNlcigpLnBhcnNlT25lKCBzICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEFzc2VydGlvbkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGFnIGlzIGVudgorCQlFbnYucGFyc2UoIHBhcnNlWG1sKCAiPGJsYWgvPiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGVudiB0YWcgaGFzIG5vIG5hbWUKKwkJRW52LnBhcnNlKCBwYXJzZVhtbCggIjxlbnYvPiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGVudiB0YWcgaGFzIG5vIG5hbWUKKwkJRW52LnBhcnNlKCBwYXJzZVhtbCggIjxlbnYgbmFtZT1cIlwiLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlFbnYgZSA9IEVudi5wYXJzZSggcGFyc2VYbWwoICI8ZW52IG5hbWU9XCJmb29cIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggImZvbyIsIGUubmFtZSgpICk7CisJCWFzc2VydE51bGwoIGUudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUVudiBlID0gRW52LnBhcnNlKCBwYXJzZVhtbCggIjxlbnYgbmFtZT1cImZvb1wiPjwvZW52PiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBlLm5hbWUoKSApOworCQlhc3NlcnROdWxsKCBlLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlFbnYgZSA9IEVudi5wYXJzZSggcGFyc2VYbWwoICI8ZW52IG5hbWU9XCJiYXJcIj5hYmM8L2Vudj4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgZS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYWJjIiwgZS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2U3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRW52IGUgPSBFbnYucGFyc2UoIHBhcnNlWG1sKCAiPGVudiBuYW1lPVwiZm9vXCIgdmFsdWU9XCJcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggImZvbyIsIGUubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggIiIsIGUudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUVudiBlID0gRW52LnBhcnNlKCBwYXJzZVhtbCggIjxlbnYgbmFtZT1cImZvb1wiIHZhbHVlPVwiYWJjXCIvPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBlLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICJhYmMiLCBlLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlFbnYgZSA9IEVudi5wYXJzZSggcGFyc2VYbWwoICI8ZW52IG5hbWU9XCJiYXJcIj57YmxhaH08L2Vudj4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgZS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAie2JsYWh9IiwgZS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2UxMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUVudiBlID0gRW52LnBhcnNlKCBwYXJzZVhtbCggIjxlbnYgbmFtZT1cImZvb1wiIHZhbHVlPVwie2JsYWh9XCIvPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBlLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICJ7YmxhaH0iLCBlLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRW52IGUgPSBFbnYucGFyc2UoIHBhcnNlWG1sKCAiPGVudiBuYW1lPVwiYmFyXCI+c3tibGFnfXQ8L2Vudj4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgZS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAic3tibGFnfXQiLCBlLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRW52IGUgPSBFbnYucGFyc2UoIHBhcnNlWG1sKCAiPGVudiBuYW1lPVwiZm9vXCIgdmFsdWU9XCJze2JsYWd9dFwiLz4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZm9vIiwgZS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAic3tibGFnfXQiLCBlLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTEzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRW52IGUgPSBFbnYucGFyc2UoIHBhcnNlWG1sKCAiPGVudiBuYW1lPVwiYmFyXCI+e2Jhcn08L2Vudj4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgZS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMTIzIiwgZS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2UxNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUVudiBlID0gRW52LnBhcnNlKCBwYXJzZVhtbCggIjxlbnYgbmFtZT1cImZvb1wiIHZhbHVlPVwie2Jhcn1cIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggImZvbyIsIGUubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggIjEyMyIsIGUudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlMTUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlFbnYgZSA9IEVudi5wYXJzZSggcGFyc2VYbWwoICI8ZW52IG5hbWU9XCJiYXJcIj54e2Jhen15PC9lbnY+IiApICk7CisJCWFzc2VydEVxdWFscyggImJhciIsIGUubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggIng0NTZ5IiwgZS52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2UxNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUVudiBlID0gRW52LnBhcnNlKCBwYXJzZVhtbCggIjxlbnYgbmFtZT1cImZvb1wiIHZhbHVlPVwieHtiYXp9eVwiLz4iICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZm9vIiwgZS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAieDQ1NnkiLCBlLnZhbHVlKCBhcmdzICkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9pbnRlcm9wdGVzdGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvVGVzdFBhcmFtLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvVGVzdFBhcmFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNjQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0UGFyYW0uamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuUGFyYW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuVGFnRWxlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKKworLyoqICovCitwdWJsaWMgY2xhc3MgVGVzdFBhcmFtCit7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwl7CisJCWFyZ3MucHV0KCAiYmFyIiwgIjEyMyIgKTsKKwkJYXJncy5wdXQoICJiYXoiLCAiNDU2IiApOworCX0KKwkKKwlwcml2YXRlIFRhZ0VsZW1lbnQgcGFyc2VYbWwoIFN0cmluZyBzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBYbWxQYXJzZXIoKS5wYXJzZU9uZSggcyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBBc3NlcnRpb25FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRhZyBpcyBwYXJhbQorCQlQYXJhbS5wYXJzZSggcGFyc2VYbWwoICI8Zm9vLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYXJzZTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBwYXJhbSB0YWcgaGFzIG5vIG5hbWUgYXR0cmlidXRlCisJCVBhcmFtLnBhcnNlKCBwYXJzZVhtbCggIjxwYXJhbS8+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2UzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUGFyYW0gcCA9IFBhcmFtLnBhcnNlKCBwYXJzZVhtbCggIjxwYXJhbSBuYW1lPVwiZm9vXCIvPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBwLm5hbWUoKSApOworCQlhc3NlcnROdWxsKCBwLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQYXJhbSBwID0gUGFyYW0ucGFyc2UoIHBhcnNlWG1sKCAiPHBhcmFtIG5hbWU9XCJmb29cIj48L3BhcmFtPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBwLm5hbWUoKSApOworCQlhc3NlcnROdWxsKCBwLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQYXJhbSBwID0gUGFyYW0ucGFyc2UoIHBhcnNlWG1sKCAiPHBhcmFtIG5hbWU9XCJmb29cIj43ODk8L3BhcmFtPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBwLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICI3ODkiLCBwLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQYXJhbSBwID0gUGFyYW0ucGFyc2UoIHBhcnNlWG1sKCAiPHBhcmFtIG5hbWU9XCJmb29cIiBkZWZhdWx0PVwiXCIvPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBwLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICIiLCBwLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQYXJhbSBwID0gUGFyYW0ucGFyc2UoIHBhcnNlWG1sKCAiPHBhcmFtIG5hbWU9XCJmb29cIiBkZWZhdWx0PVwiNzg5XCIvPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBwLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICI3ODkiLCBwLnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQYXJhbSBwID0gUGFyYW0ucGFyc2UoIHBhcnNlWG1sKCAiPHBhcmFtIG5hbWU9XCJiYXJcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggImJhciIsIHAubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggIjEyMyIsIHAudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlOSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBhcmFtIHAgPSBQYXJhbS5wYXJzZSggcGFyc2VYbWwoICI8cGFyYW0gbmFtZT1cImJhelwiIGRlZmF1bHQ9XCIyMzRcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggImJheiIsIHAubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggIjQ1NiIsIHAudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRvU3RyaW5nMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVBhcmFtIHAgPSBQYXJhbS5wYXJzZSggcGFyc2VYbWwoICI8cGFyYW0gbmFtZT1cImJhelwiIGRlZmF1bHQ9XCIyMzRcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggIlBhcmFtKCBiYXosIDIzNCApIiwgcC50b1N0cmluZygpICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RQcm9nLmphdmEgYi9pbnRlcm9wdGVzdGVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL2ludGVyb3B0ZXN0ZXIvVGVzdFByb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VhMTIwCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RQcm9nLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5JbnRlcm9wVGVzdEludGY7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuUGFyYW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuUHJvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5Qcm9ncmFtOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLlRlc3RJbnRmOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyLlRhZ0VsZW1lbnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCisKKy8qKiBUZXN0IG9mIFByb2cgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UHJvZworeworCXByaXZhdGUgZmluYWwgVGVzdEludGYgdGVzdCA9IG5ldyBNeVRlc3QoKTsKKwkKKwlwcml2YXRlIFRhZ0VsZW1lbnQgcGFyc2VYbWwoIFN0cmluZyBzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBYbWxQYXJzZXIoKS5wYXJzZU9uZSggcyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QoIGV4cGVjdGVkID0gQXNzZXJ0aW9uRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYXJzZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB0YWcgaXMgcHJvZworCQlQcm9nLnBhcnNlKCB0ZXN0LCBwYXJzZVhtbCggIjxibGFoLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gcHJvZyB0YWcgaGFzIG5vIG5hbWUgYXR0cmlidXRlCisJCVByb2cucGFyc2UoIHRlc3QsIHBhcnNlWG1sKCAiPHByb2cvPiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYXJzZTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBwcm9nIHRhZyBoYXMgbm8gbmFtZSBhdHRyaWJ1dGUKKwkJUHJvZy5wYXJzZSggdGVzdCwgcGFyc2VYbWwoICI8cHJvZyBuYW1lPVwiXCIvPiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlQcm9nIHAgPSBQcm9nLnBhcnNlKCB0ZXN0LCBwYXJzZVhtbCggIjxwcm9nIG5hbWU9XCJmb29cIi8+IiApICk7CisJCWFzc2VydFNhbWUoIHRlc3QsIHAudGVzdCgpICk7CisJCWFzc2VydEVxdWFscyggImZvbyIsIHAubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggMCwgcC5hcmdzKCkuc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVByb2cucGFyc2UoIHRlc3QsIHBhcnNlWG1sKCAiPHByb2cgbmFtZT1cImZvb1wiPjxhcmcgbmFtZT1cImJhclwiLz48L3Byb2c+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGR1cGxpY2F0ZSBuYW1lIGFyZyBiYXIKKwkJUHJvZy5wYXJzZSggdGVzdCwgcGFyc2VYbWwoICI8cHJvZyBuYW1lPVwiZm9vXCI+PGFyZyBuYW1lPVwiYmFyXCIvPjxhcmcgbmFtZT1cImJhclwiLz48L3Byb2c+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVByb2cucGFyc2UoIHRlc3QsIHBhcnNlWG1sKCAiPHByb2cgbmFtZT1cImZvb1wiPjxhcmcgbmFtZT1cImJhclwiLz48YXJnIG5hbWU9XCJiYXpcIi8+PC9wcm9nPiIgKSApOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVRlc3QgaW1wbGVtZW50cyBUZXN0SW50ZgorCXsKKwkJcHVibGljIExpc3Q8UHJvZz4gY2xlYW51cCgpCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgSW50ZXJvcFRlc3RJbnRmIGl0ZXN0KCkKKwkJeworCQkJLy8gaWdub3JlCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBQcm9nIGppZygpCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIG5hbWUoKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIE1hcDxTdHJpbmcsIFBhcmFtPiBwYXJhbXMoKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCisJCXB1YmxpYyBMaXN0PFByb2c+IHNldHVwKCkKKwkJeworCQkJLy8gaWdub3JlCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBMaXN0PFByb2c+IHN1cHBvcnQoKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFByb2dyYW0gZ2V0UHJvZ3JhbSggU3RyaW5nIG5hbWUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RSdW4uamF2YSBiL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0UnVuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0UnVuLmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3RlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuSW50ZXJvcFRlc3RJbnRmOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLlBhcmFtOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLlByb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuUHJvZ3JhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5SdW47CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuVGVzdEludGY7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbC5YbWxQYXJzZXIuVGFnRWxlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKiogKi8KK3B1YmxpYyBjbGFzcyBUZXN0UnVuCit7CisJcHJpdmF0ZSBJbnRlcm9wVGVzdEludGYgaXRlc3QgPSBuZXcgTXlJbnRlcm9wVGVzdEludGYoKTsKKwkKKwlwcml2YXRlIFRhZ0VsZW1lbnQgcGFyc2VYbWwoIFN0cmluZyBzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBYbWxQYXJzZXIoKS5wYXJzZU9uZSggcyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQ9QXNzZXJ0aW9uRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYXJzZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSdW4ucGFyc2UoIGl0ZXN0LCBwYXJzZVhtbCggIjxibGFoLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkPUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkPUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuIHRlc3Q9XCJcIi8+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2U0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUnVuIHIgPSBSdW4ucGFyc2UoIGl0ZXN0LCBwYXJzZVhtbCggIjxydW4gdGVzdD1cImZvb1wiLz4iICkgKTsKKwkJYXNzZXJ0U2FtZSggaXRlc3QsIHIuaXRlc3QoKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCByLnRlc3QoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHIuYXJncygpLnNpemUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVJ1biByID0gUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuIHRlc3Q9XCJiYXJcIj48L3J1bj4iICkgKTsKKwkJYXNzZXJ0U2FtZSggaXRlc3QsIHIuaXRlc3QoKSApOworCQlhc3NlcnRFcXVhbHMoICJiYXIiLCByLnRlc3QoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHIuYXJncygpLnNpemUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYXJzZTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB1bmtub3duIHRhZyBibGFoIGluIHJ1bi4KKwkJUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuIHRlc3Q9XCJmb29cIj48YmxhaC8+PC9ydW4+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGFyZyB0YWcgaGFzIG5vIG5hbWUuCisJCVJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiZm9vXCI+PGFyZy8+PC9ydW4+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGFyZyB0YWcgaGFzIG5vIG5hbWUuCisJCVJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiZm9vXCI+PGFyZyBuYW1lPVwiXCIvPjwvcnVuPiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlOSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGFyZyBhMSBoYXMgbm8gdmFsdWUKKwkJUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuIHRlc3Q9XCJmb29cIj48YXJnIG5hbWU9XCJhMVwiLz48L3J1bj4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkPUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UxMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGR1cGxpY2F0ZSBuYW1lIGFyZyBhMQorCQlSdW4ucGFyc2UoIGl0ZXN0LCBwYXJzZVhtbCggIjxydW4gdGVzdD1cImZvb1wiPjxhcmcgbmFtZT1cImExXCIvPjxhcmcgbmFtZT1cImExXCIvPjwvcnVuPiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlMTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBhcmcgYTEgaGFzIG5vIHZhbHVlCisJCVJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiZm9vXCI+PGFyZyBuYW1lPVwiYTFcIi8+PGFyZyBuYW1lPVwiYTJcIi8+PC9ydW4+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZD1SdW50aW1lRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBydW4xKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGVzdCBiYWQgbm90IGZvdW5kCisJCVJ1biByID0gUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuIHRlc3Q9XCJiYWRcIi8+IiApICk7CisJCXIucnVuKCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJ1bjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSdW4gciA9IFJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiZm9vXCIvPiIgKSApOworCQlhc3NlcnROdWxsKCB0ZXN0ICk7CisJCXIucnVuKCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCB0ZXN0Lm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHRlc3QuYXJncy5zaXplKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBydW4zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gYXJnICdhYmMnIGhhcyBubyB2YWx1ZQorCQlSdW4ucGFyc2UoIGl0ZXN0LCBwYXJzZVhtbCggIjxydW4gdGVzdD1cImZvb1wiPjxhcmcgbmFtZT1cImFiY1wiLz48L3J1bj4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBydW40KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUnVuIHIgPSBSdW4ucGFyc2UoIGl0ZXN0LCBwYXJzZVhtbCggIjxydW4gdGVzdD1cImZvb1wiPjxhcmcgbmFtZT1cImFiY1wiIHZhbHVlPVwiMjM0XCIvPjwvcnVuPiIgKSApOworCQlhc3NlcnROdWxsKCB0ZXN0ICk7CisJCXIucnVuKCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCB0ZXN0Lm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHRlc3QuYXJncy5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMjM0IiwgdGVzdC5hcmdzLmdldCggImFiYyIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJ1bjUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSdW4gciA9IFJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiZm9vXCI+PGFyZyBuYW1lPVwiYWJjXCI+MzQ1PC9hcmc+PC9ydW4+IiApICk7CisJCWFzc2VydE51bGwoIHRlc3QgKTsKKwkJci5ydW4oIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpICk7CisJCWFzc2VydEVxdWFscyggImZvbyIsIHRlc3QubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggMSwgdGVzdC5hcmdzLnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoICIzNDUiLCB0ZXN0LmFyZ3MuZ2V0KCAiYWJjIiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcnVuNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVJ1biByID0gUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuIHRlc3Q9XCJiYXJcIi8+IiApICk7CisJCWFzc2VydE51bGwoIHRlc3QgKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWFyZ3MucHV0KCAiYWJjIiwgIjEyMyIgKTsKKwkJci5ydW4oIGFyZ3MgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgdGVzdC5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCB0ZXN0LmFyZ3Muc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcnVuNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVJ1biByID0gUnVuLnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8cnVuIHRlc3Q9XCJiYXJcIj48YXJnIG5hbWU9XCJhYmNcIiB2YWx1ZT1cInh5XCIvPjwvcnVuPiIgKSApOworCQlhc3NlcnROdWxsKCB0ZXN0ICk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlhcmdzLnB1dCggInAxIiwgIjEyMyIgKTsKKwkJci5ydW4oIGFyZ3MgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgdGVzdC5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCB0ZXN0LmFyZ3Muc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggInh5IiwgdGVzdC5hcmdzLmdldCggImFiYyIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJ1bjgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSdW4gciA9IFJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiYmFyXCI+PGFyZyBuYW1lPVwiYWJjXCIgdmFsdWU9XCJ4e3AyfXlcIi8+PC9ydW4+IiApICk7CisJCWFzc2VydE51bGwoIHRlc3QgKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWFyZ3MucHV0KCAicDEiLCAiMTIzIiApOworCQlyLnJ1biggYXJncyApOworCQlhc3NlcnRFcXVhbHMoICJiYXIiLCB0ZXN0Lm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHRlc3QuYXJncy5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAieHtwMn15IiwgdGVzdC5hcmdzLmdldCggImFiYyIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJ1bjkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSdW4gciA9IFJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiYmFyXCI+PGFyZyBuYW1lPVwiYWJjXCIgdmFsdWU9XCJ4e3AxfXlcIi8+PC9ydW4+IiApICk7CisJCWFzc2VydE51bGwoIHRlc3QgKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWFyZ3MucHV0KCAicDEiLCAiMTIzIiApOworCQlyLnJ1biggYXJncyApOworCQlhc3NlcnRFcXVhbHMoICJiYXIiLCB0ZXN0Lm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHRlc3QuYXJncy5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAieDEyM3kiLCB0ZXN0LmFyZ3MuZ2V0KCAiYWJjIiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcnVuMTAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSdW4gciA9IFJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiYmFyXCI+PGFyZyBuYW1lPVwiYWJjXCIgdmFsdWU9XCJ4XFx7cDF9eVwiLz48L3J1bj4iICkgKTsKKwkJYXNzZXJ0TnVsbCggdGVzdCApOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJYXJncy5wdXQoICJwMSIsICIxMjMiICk7CisJCXIucnVuKCBhcmdzICk7CisJCWFzc2VydEVxdWFscyggImJhciIsIHRlc3QubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggMSwgdGVzdC5hcmdzLnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoICJ4e3AxfXkiLCB0ZXN0LmFyZ3MuZ2V0KCAiYWJjIiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcnVuMTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlSdW4gciA9IFJ1bi5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHJ1biB0ZXN0PVwiYmFyXCI+PGFyZyBuYW1lPVwiYWJjXCIgdmFsdWU9XCJ4XFxcXHlcIi8+PC9ydW4+IiApICk7CisJCWFzc2VydE51bGwoIHRlc3QgKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWFyZ3MucHV0KCAicDEiLCAiMTIzIiApOworCQlyLnJ1biggYXJncyApOworCQlhc3NlcnRFcXVhbHMoICJiYXIiLCB0ZXN0Lm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHRlc3QuYXJncy5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAieFxceSIsIHRlc3QuYXJncy5nZXQoICJhYmMiICkgKTsKKwl9CisJCisJcHJpdmF0ZSBjbGFzcyBNeUludGVyb3BUZXN0SW50ZiBpbXBsZW1lbnRzIEludGVyb3BUZXN0SW50ZgorCXsKKwkJcHVibGljIFRlc3RJbnRmIGdldFRlc3QoIFN0cmluZyB0ZXN0ICkKKwkJeworCQkJaWYgKHRlc3QuZXF1YWxzKCAiYmFkIiApKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlyZXR1cm4gbmV3IE15VGVzdCggdGhpcywgdGVzdCApOworCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MgKQorCQl7CisJCQkvLyBpZ25vcmUuCisJCX0KKworCQlwdWJsaWMgUHJvZ3JhbSBnZXRQcm9ncmFtKCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCS8vIGlnbm9yZS4KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGludCBuZXh0UnVuSWQoKQorCQl7CisJCQlyZXR1cm4gKytydW5JZDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBpbnQgcnVuSWQ7CisJfQorCQorCXByaXZhdGUgY2xhc3MgTXlUZXN0IGltcGxlbWVudHMgVGVzdEludGYKKwl7CisJCXB1YmxpYyBNeVRlc3QoIEludGVyb3BUZXN0SW50ZiBpdGVzdCwgU3RyaW5nIG5hbWUgKQorCQl7CisJCQl0aGlzLml0ZXN0ID0gaXRlc3Q7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQl9CisJCQorCQlwcml2YXRlIGZpbmFsIEludGVyb3BUZXN0SW50ZiBpdGVzdDsKKwkJCisJCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJCQorCQlwdWJsaWMgSW50ZXJvcFRlc3RJbnRmIGl0ZXN0KCkKKwkJeworCQkJcmV0dXJuIGl0ZXN0OworCQl9CisJCQorCQlwdWJsaWMgU3RyaW5nIG5hbWUoKQorCQl7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJ1biggTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzICkKKwkJeworCQkJVGVzdFJ1bi50aGlzLnRlc3QgPSB0aGlzOworCQkJdGhpcy5hcmdzID0gYXJnczsKKwkJfQorCQkKKwkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3M7CisKKwkJcHVibGljIExpc3Q8UHJvZz4gY2xlYW51cCgpCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgUHJvZyBqaWcoKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIE1hcDxTdHJpbmcsIFBhcmFtPiBwYXJhbXMoKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIExpc3Q8UHJvZz4gc2V0dXAoKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIExpc3Q8UHJvZz4gc3VwcG9ydCgpCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgUHJvZ3JhbSBnZXRQcm9ncmFtKCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBNeVRlc3QgdGVzdDsKK30KZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0U3Vic3RpdHV0b3IuamF2YSBiL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0U3Vic3RpdHV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjI4ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RTdWJzdGl0dXRvci5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5TdWJzdGl0dXRvcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKKy8qKiAqLworcHVibGljIGNsYXNzIFRlc3RTdWJzdGl0dXRvcgoreworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwl7CisJCW1hcC5wdXQoICJhIiwgIjEiICk7CisJCW1hcC5wdXQoICJiIiwgIjIiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic3QxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAiIiwgU3Vic3RpdHV0b3Iuc3Vic3QoICIiLCBtYXAgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YnN0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggImEiLCBTdWJzdGl0dXRvci5zdWJzdCggImEiLCBtYXAgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YnN0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggIjEiLCBTdWJzdGl0dXRvci5zdWJzdCggInthfSIsIG1hcCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic3Q0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAieDJ5IiwgU3Vic3RpdHV0b3Iuc3Vic3QoICJ4e2J9eSIsIG1hcCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic3Q1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAie2N9IiwgU3Vic3RpdHV0b3Iuc3Vic3QoICJ7Y30iLCBtYXAgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YnN0NWEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoICJ7e2N9fSIsIFN1YnN0aXR1dG9yLnN1YnN0KCAie3tjfX0iLCBtYXAgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YnN0NigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggInsxfSIsIFN1YnN0aXR1dG9yLnN1YnN0KCAie3thfX0iLCBtYXAgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YnN0NygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggInthIiwgU3Vic3RpdHV0b3Iuc3Vic3QoICJ7YSIsIG1hcCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic3Q3YSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggImF9IiwgU3Vic3RpdHV0b3Iuc3Vic3QoICJhfSIsIG1hcCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic3Q4KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAie2F9IiwgU3Vic3RpdHV0b3Iuc3Vic3QoICJcXHthfSIsIG1hcCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAiYSIsIFN1YnN0aXR1dG9yLnN1YnN0KCAiXFxhIiwgbWFwICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJzdDEwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAiXFwiLCBTdWJzdGl0dXRvci5zdWJzdCggIlxcXFwiLCBtYXAgKSApOworCX0KK30KZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0VGVzdC5qYXZhIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlOGMwZAotLS0gL2Rldi9udWxsCisrKyBiL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuSW50ZXJvcFRlc3RJbnRmOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5pbnRlcm9wdGVzdGVyLlByb2dyYW07CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXIuVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5UZXN0SW50ZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworCisKKy8qKiBUZXN0IG9mIFRlc3QgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VGVzdAoreworCXByaXZhdGUgZmluYWwgSW50ZXJvcFRlc3RJbnRmIGl0ZXN0ID0gbmV3IE15SW50ZXJvcFRlc3QoKTsKKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCXsKKwkJYXJncy5wdXQoICJiYXIiLCAiMTIzIiApOworCQlhcmdzLnB1dCggImJheiIsICI0NTYiICk7CisJfQorCQorCXByaXZhdGUgVGFnRWxlbWVudCBwYXJzZVhtbCggU3RyaW5nIHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IFhtbFBhcnNlcigpLnBhcnNlT25lKCBzICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdCggZXhwZWN0ZWQgPSBBc3NlcnRpb25FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRhZyBpcyB0ZXN0CisJCVRlc3QucGFyc2UoIGl0ZXN0LCBwYXJzZVhtbCggIjxibGFoLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGVzdCB0YWcgaGFzIG5vdCBuYW1lIGF0dHJpYnV0ZQorCQlUZXN0LnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8dGVzdC8+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5vIGppZyBkZWZpbmVkIGZvciB0ZXN0OiBmb28KKwkJVGVzdC5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKCAiPHRlc3QgbmFtZT1cImZvb1wiLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2U0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm8gamlnIGRlZmluZWQgZm9yIHRlc3Q6IGZvbworCQlUZXN0LnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoICI8dGVzdCBuYW1lPVwiZm9vXCI+PGppZz48L2ppZz48L3Rlc3Q+IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHBhcnNlNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG9ubHkgb25lIHRlc3QgamlnIHBlciB0ZXN0CisJCVRlc3QucGFyc2UoIGl0ZXN0LCBwYXJzZVhtbCgKKwkJCSI8dGVzdCBuYW1lPVwiZm9vXCI+PGppZz48cHJvZyBuYW1lPVwiYmFyXCIvPjxwcm9nIG5hbWU9XCJiYXpcIi8+PC9qaWc+PC90ZXN0PiIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUZXN0IHQgPSBUZXN0LnBhcnNlKCBpdGVzdCwgcGFyc2VYbWwoCisJCQkiPHRlc3QgbmFtZT1cImZvb1wiPjxqaWc+PHByb2cgbmFtZT1cImJhclwiLz48L2ppZz48L3Rlc3Q+IiApICk7CisJCWFzc2VydFNhbWUoIGl0ZXN0LCB0Lml0ZXN0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZm9vIiwgdC5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCB0LnBhcmFtcygpLnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHQuc2V0dXAoKS5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCB0LnN1cHBvcnQoKS5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYmFyIiwgdC5qaWcoKS5uYW1lKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCB0LmNsZWFudXAoKS5zaXplKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgcGFyc2U3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVGVzdCB0ID0gVGVzdC5wYXJzZSggaXRlc3QsIHBhcnNlWG1sKAorCQkJIjx0ZXN0IG5hbWU9XCJiYXJcIj48cGFyYW1zPjxwYXJhbSBuYW1lPVwicGFyYW0xXCIvPjxwYXJhbSBuYW1lPVwicGFyYW0yXCIvPjwvcGFyYW1zPjxzZXR1cD48cHJvZyBuYW1lPVwic2V0dXAxXCIvPjxwcm9nIG5hbWU9XCJzZXR1cDJcIi8+PC9zZXR1cD48c3VwcG9ydD48cHJvZyBuYW1lPVwic3VwcG9ydDFcIi8+PHByb2cgbmFtZT1cInN1cHBvcnQyXCIvPjwvc3VwcG9ydD48amlnPjxwcm9nIG5hbWU9XCJqaWcxXCIvPjwvamlnPjxjbGVhbnVwPjxwcm9nIG5hbWU9XCJjbGVhbnVwMVwiLz48cHJvZyBuYW1lPVwiY2xlYW51cDJcIi8+PC9jbGVhbnVwPjwvdGVzdD4iICkgKTsKKwkJYXNzZXJ0U2FtZSggaXRlc3QsIHQuaXRlc3QoKSApOworCQlhc3NlcnRFcXVhbHMoICJiYXIiLCB0Lm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHQucGFyYW1zKCkuc2l6ZSgpICk7CisJCWFzc2VydFRydWUoIHQucGFyYW1zKCkuY29udGFpbnNLZXkoICJwYXJhbTEiICkgKTsKKwkJYXNzZXJ0VHJ1ZSggdC5wYXJhbXMoKS5jb250YWluc0tleSggInBhcmFtMiIgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHQuc2V0dXAoKS5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAic2V0dXAxIiwgdC5zZXR1cCgpLmdldCggMCApLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICJzZXR1cDIiLCB0LnNldHVwKCkuZ2V0KCAxICkubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggMiwgdC5zdXBwb3J0KCkuc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggInN1cHBvcnQxIiwgdC5zdXBwb3J0KCkuZ2V0KCAwICkubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggInN1cHBvcnQyIiwgdC5zdXBwb3J0KCkuZ2V0KCAxICkubmFtZSgpICk7CisJCWFzc2VydEVxdWFscyggImppZzEiLCB0LmppZygpLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHQuY2xlYW51cCgpLnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoICJjbGVhbnVwMSIsIHQuY2xlYW51cCgpLmdldCggMCApLm5hbWUoKSApOworCQlhc3NlcnRFcXVhbHMoICJjbGVhbnVwMiIsIHQuY2xlYW51cCgpLmdldCggMSApLm5hbWUoKSApOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUludGVyb3BUZXN0IGltcGxlbWVudHMgSW50ZXJvcFRlc3RJbnRmCisJeworCQlwdWJsaWMgVGVzdEludGYgZ2V0VGVzdCggU3RyaW5nIHRlc3QgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCisJCXB1YmxpYyBQcm9ncmFtIGdldFByb2dyYW0oIFN0cmluZyBuYW1lICkKKwkJeworCQkJLy8gaWdub3JlCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBpbnQgbmV4dFJ1bklkKCkKKwkJeworCQkJcmV0dXJuICsrcnVuSWQ7CisJCX0KKwkJCisJCXByaXZhdGUgaW50IHJ1bklkOworCX0KK30KZGlmZiAtLWdpdCBhL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0VG9rZW4uamF2YSBiL2ludGVyb3B0ZXN0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvaW50ZXJvcHRlc3Rlci9UZXN0VG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzVmZmNkCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJvcHRlc3Rlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC9pbnRlcm9wdGVzdGVyL1Rlc3RUb2tlbi5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLmludGVyb3B0ZXN0ZXI7CisKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guaW50ZXJvcHRlc3Rlci5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS54bWwuWG1sUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKKworLyoqIFRlc3Qgb2YgVG9rZW4gKi8KK3B1YmxpYyBjbGFzcyBUZXN0VG9rZW4KK3sKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCXsKKwkJYXJncy5wdXQoICJiYXIiLCAiMTIzIiApOworCQlhcmdzLnB1dCggImJheiIsICI0NTYiICk7CisJfQorCQorCXByaXZhdGUgVGFnRWxlbWVudCBwYXJzZVhtbCggU3RyaW5nIHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IFhtbFBhcnNlcigpLnBhcnNlT25lKCBzICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEFzc2VydGlvbkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcGFyc2UxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGFnIGlzIHRva2VuCisJCVRva2VuLnBhcnNlKCBwYXJzZVhtbCggIjxibGFoLz4iICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUb2tlbiB0ID0gVG9rZW4ucGFyc2UoIHBhcnNlWG1sKCAiPHRva2VuLz4iICkgKTsKKwkJYXNzZXJ0TnVsbCggdC52YWx1ZSggYXJncyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyc2UzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVG9rZW4gdCA9IFRva2VuLnBhcnNlKCBwYXJzZVhtbCggIjx0b2tlbj48L3Rva2VuPiIgKSApOworCQlhc3NlcnROdWxsKCB0LnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUb2tlbiB0ID0gVG9rZW4ucGFyc2UoIHBhcnNlWG1sKCAiPHRva2VuPmFiYzwvdG9rZW4+IiApICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHQudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRva2VuIHQgPSBUb2tlbi5wYXJzZSggcGFyc2VYbWwoICI8dG9rZW4gdmFsdWU9XCJcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggIiIsIHQudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRva2VuIHQgPSBUb2tlbi5wYXJzZSggcGFyc2VYbWwoICI8dG9rZW4gdmFsdWU9XCJhYmNcIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHQudmFsdWUoIGFyZ3MgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcnNlNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRva2VuIHQgPSBUb2tlbi5wYXJzZSggcGFyc2VYbWwoICI8dG9rZW4+e2Jhcn08L3Rva2VuPiIgKSApOworCQlhc3NlcnRFcXVhbHMoICIxMjMiLCB0LnZhbHVlKCBhcmdzICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwYXJzZTgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUb2tlbiB0ID0gVG9rZW4ucGFyc2UoIHBhcnNlWG1sKCAiPHRva2VuIHZhbHVlPVwie2Jhcn1cIi8+IiApICk7CisJCWFzc2VydEVxdWFscyggIjEyMyIsIHQudmFsdWUoIGFyZ3MgKSApOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvUkVBRE1FLnR4dCBiL3BsdWdpbnMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU0YjBhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNCBAQAordmlzdWFsc3R1ZGlvcGx1Z2luCit2aW0KK2FudAorCmRpZmYgLS1naXQgYS9wbHVnaW5zL2FudC9idWlsZC54bWwgYi9wbHVnaW5zL2FudC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5NWY3NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvYW50L2J1aWxkLnhtbApAQCAtMCwwICsxLDIyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtYW50LXRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiPgorICAgIDxkZXNjcmlwdGlvbj5FdGNoLUFudC1UYXNrIGltcGxlbWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPCEtLSBTdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgc3ViLXByb2plY3QgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InByb2oiICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLmJhc2VkaXJ9L3BsdWdpbnMvYW50IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQiICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vdGFyZ2V0IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiICAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7cHJvan0vc3JjIiAvPiAgICAgICAgCisgICAgPHByb3BlcnR5IG5hbWU9ImdlbmVyYXRlZFNyYyIgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2dlbmVyYXRlZC1zb3VyY2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzRGlyZWN0b3J5IiAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9jbGFzc2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0UmVzdWx0c0RpcmVjdG9yeSIgbG9jYXRpb249IiR7dGFyZ2V0fS90ZXN0LXJlc3VsdHMiIC8+CisKKyAgICA8IS0tIE1BQ1JPOiBpbml0LXRhcmdldCAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iaW5pdC10YXJnZXQiID4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgICBmYWlsb25lcnJvcj0iZmFsc2UiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vdGVzdCIgLz4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8IS0tIE1BQ1JPOiBjb21waWxlLXNvdXJjZXMgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImNvbXBpbGUtc291cmNlcyIgPgorICAgICAgICA8c2VxdWVudGlhbD4gICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gY29tcGlsZSBhbnQgcGx1Z2luIC0tPgorICAgICAgICAgICAgPGphdmFjICBkZWJ1Zz0iJHtFdGNoLmphdmFjLmRlYnVnfSIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjUiCisgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPSIke0V0Y2guamF2YWMub3B0aW1pemV9IgorICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iID4KKyAgICAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfS9tYWluL2phdmEiIC8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLnN2bi8qKiIgLz4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJFdGNoLmRlcGVuZGVuY2llcy5qYXIucGF0aHMiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guSE9NRX0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiAvPgorICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5IT01FfS9saWIvJHtldGNoLXV0aWwuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwvamF2YWM+CisKKyAgICAgICAgICAgIDwhLS0gY29tcGlsZXIgcGx1Z2luIHJlc291cmNlcyAtLT4KKyAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS9tYWluL3Jlc291cmNlcyIgZXhjbHVkZXM9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICA8L2NvcHk+CisKKyAgICAgICAgICAgIDwhLS0gQ29tcGlsZSBUZXN0cyAtLT4KKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgIDxqYXZhYyAgZGVidWc9IiR7RXRjaC5qYXZhYy5kZWJ1Z30iCisgICAgICAgICAgICAgICAgICAgIHRhcmdldD0iMS41IgorICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtFdGNoLmphdmFjLm9wdGltaXplfSIKKyAgICAgICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiA+CisgICAgICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30vdGVzdC9qYXZhIiAvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iRXRjaC5kZXBlbmRlbmNpZXMuamFyLnBhdGhzIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5IT01FfS9saWIvJHtldGNoLWNvbXBpbGVyLmphcn0iIC8+CisgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8L2phdmFjPgorICAgICAgICAgICAgLS0+CisKKyAgICAgICAgICAgIDwhLS0gY29tcGlsZXIgcGx1Z2luIHJlc291cmNlcyAtLT4KKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiID4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS90ZXN0L3Jlc291cmNlcyIgZXhjbHVkZXM9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgICAgICAtLT4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgCisgICAgPCEtLSBNQUNSTzogYnVuZGxlLWphcnMgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImJ1bmRsZS1qYXJzIiA+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzdCIgZGVmYXVsdD0iJHtFdGNoLmRpc3R9IiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IkB7ZGlzdH0vbGliIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8IS0tIENSRUFURSBqYXJzIC0tPgorCisgICAgICAgICAgICA8IS0tIFBhY2thZ2UgdXAgZXRjaC1hbnQtdGFzayBqYXIgLS0+CisgICAgICAgICAgICA8amFyIGphcmZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1hbnQtdGFzay5qYXJ9IiA+CisgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNvcHlyaWdodCIgICAgdmFsdWU9IiR7RXRjaC5jb3B5cmlnaHROb3RpY2V9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlZlcnNpb24iICAgICAgdmFsdWU9IiR7RXRjaC52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJMb25nVmVyc2lvbiIgIHZhbHVlPSIke0V0Y2gubG9uZ3ZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWxkLVRhZyIgICAgdmFsdWU9IiR7RXRjaC5idWlsZFRhZ30iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU1ZOLVJldmlzaW9uIiB2YWx1ZT0iJHtFdGNoLnJ1bnRpbWUucmV2aXNpb25OdW1iZXJ9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiICAgdmFsdWU9IiR7ZXRjaC1jb21waWxlci5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPG1ldGFpbmYgZGlyPSIke0V0Y2guYmFzZWRpcn0iPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICA8L21ldGFpbmY+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iLz4KKyAgICAgICAgICAgIDwvamFyPgorCisgICAgICAgICAgICA8IS0tIENSRUFURSBzb3VyY2UgYXJjaGl2ZXMgLS0+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gcGFja2FnZSB1cCBldGNoLWFudC10YXNrIHNyYyAtLT4KKyAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1hbnQtdGFzay1zcmMuemlwfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSIgZXhjbHVkZXM9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9yZXNvdXJjZXMiIGV4Y2x1ZGVzPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgPC96aXA+CisKKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgCisgICAgPCEtLSBJTklUIFRBUkdFVCAtLT4KKyAgICA8IS0tIE1vZGlmeSB0aGlzIHRhcmdldCB0byBkZWZpbmUgcHJvamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzIHRoYXQgY2FuIG9ubHkgYmUgc2V0IGF0IHJ1bnRpbWUgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby1pbml0Ij4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKworICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuZXJhdGVkU3JjfSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0UmVzdWx0c0RpcmVjdG9yeX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIENMRUFOIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLWNsZWFuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gQlVJTEQgVEFSR0VUIC0tPgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtc291cmNlcyIgPgorICAgICAgICA8IS0tIEdlbmVyYXRlIHZlcnNpb24gaW5mbyAtLT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS1mb3ItZGlzdCIgPgorICAgICAgICA8IS0tIEluaXRpYWxpemUgdGFyZ2V0IGRpcmVjdG9yaWVzIC0tPgorICAgICAgICA8aW5pdC10YXJnZXQgLz4KKworICAgICAgICA8IS0tIENvbXBpbGUgU291cmNlIC0tPgorICAgICAgICA8Y29tcGlsZS1zb3VyY2VzIC8+CisKKyAgICAgICAgPCEtLSBCdW5kbGUgSmFycyAtLT4KKyAgICAgICAgPGJ1bmRsZS1qYXJzIGRpc3Q9IiR7RXRjaC5kaXN0fSIgLz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtZm9yLWNsb3ZlciIgaWY9IkNsb3Zlci5lbmFibGVkIiA+CisKKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iUmVidWlsZGluZyB3aXRoIGNsb3ZlciIgLz4KKworICAgICAgICA8IS0tIGluaXRpYWxpemUtY2xvdmVyIC0tPgorICAgICAgICA8aW5pdGlhbGl6ZS1jbG92ZXIgc3VmZml4PSJldGNoYW50dGFzayIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9qYXZhIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICA8dGVzdHNvdXJjZXMgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L3Rlc3Rzb3VyY2VzPgorICAgICAgICAgICAgLS0+CisgICAgICAgIDwvaW5pdGlhbGl6ZS1jbG92ZXI+CisgICAgICAgIAorICAgICAgICA8IS0tIEluaXRpYWxpemUgdGFyZ2V0IGRpcmVjdG9yaWVzIC0tPgorICAgICAgICA8aW5pdC10YXJnZXQgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gQ29tcGlsZSBTb3VyY2UgLS0+CisgICAgICAgIDxjb21waWxlLXNvdXJjZXMgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0gQnVuZGxlIEphcnMgLS0+CisgICAgICAgIDxidW5kbGUtamFycyBkaXN0PSIke0V0Y2guY2xvdmVyLWRpc3R9IiAvPgorCisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJkby1idWlsZCIgZGVwZW5kcz0iZ2VuZXJhdGUtc291cmNlcyxjb21waWxlLWZvci1kaXN0LGNvbXBpbGUtZm9yLWNsb3ZlciIgLz4KKworICAgIDwhLS0gVEVTVCBUQVJHRVQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkby10ZXN0Ij4KKyAgICAgICAgCisgICAgICAgIDwhLS0gUnVuIFVuaXQgVGVzdHMgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IgorICAgICAgICAgICAgZXJyb3JQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCIgZmFpbHVyZVByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L21haW4iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXNEaXJlY3Rvcnl9L3Rlc3QiIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qdW5pdC5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLkhPTUV9L2xpYi8ke2V0Y2gtY29tcGlsZXIuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmNsb3Zlci5qYXJ9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InRydWUiIHRvZGlyPSIke3Rlc3RSZXN1bHRzRGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgICAgICAtLT4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gUE9TVEJVSUxEIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXBvc3RidWlsZCI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXB1Ymxpc2giIGlmPSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgPCEtLSBTZXQgZmxhZyBmaWxlIGlmIGFueSB0ZXN0cyBmYWlsZWQgLS0+CisgICAgICAgIDx0b3VjaCBmaWxlPSIke0V0Y2gucnVudGltZS50ZXN0cy5mYWlsfSIvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL2FudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90b29scy9hbnQvRXRjaENvbXBpbGVUYXNrLmphdmEgYi9wbHVnaW5zL2FudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90b29scy9hbnQvRXRjaENvbXBpbGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzNTMzMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvYW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rvb2xzL2FudC9FdGNoQ29tcGlsZVRhc2suamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5DbWRMaW5lT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guY29tcGlsZXIuRXRjaENvbXBpbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EaXJTZXQ7CisKKworLyoqCisgKiBBbnQgdGFzayBmb3IgY29tcGlsaW5nIEV0Y2ggc291cmNlcyBmaWxlcy4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRXRjaENvbXBpbGVUYXNrIGV4dGVuZHMgVGFzaworeworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYW50IHRhc2sgZm9yIHJ1bm5pbmcgdGhlIEV0Y2ggY29tcGlsZXIuCisJICovCisJcHVibGljIEV0Y2hDb21waWxlVGFzaygpCisJeworCQkvLyBub3RoaW5nIHRvIGRvLgorCX0KKworCXByaXZhdGUgQ21kTGluZU9wdGlvbnMgY2xvID0gbmV3IENtZExpbmVPcHRpb25zKCk7CisKKwkvLy8vLy8vLy8KKworCS8qKgorCSAqIFRoZSBsaXN0IG9mIHBhdGhzIHRvIHNlYXJjaCBmb3IgaW5jbHVkZWQgb3IgbWl4ZWQgaW4gZmlsZXMgKC1JIG9wdGlvbikuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRJbmNsdWRlcyggRGlyU2V0IHZhbHVlICkKKwl7CisJCURpcmVjdG9yeVNjYW5uZXIgZHMgPSB2YWx1ZS5nZXREaXJlY3RvcnlTY2FubmVyKCBnZXRQcm9qZWN0KCkgKTsKKwkJZm9yIChTdHJpbmcgZGlyIDogZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKQorCQkJY2xvLmluY2x1ZGVQYXRoLmFkZCggbmV3IEZpbGUoIGRzLmdldEJhc2VkaXIoKSwgZGlyICkgKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc291cmNlIGZpbGUgdG8gY29tcGlsZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbGUoIEZpbGUgdmFsdWUgKQorCXsKKwkJaWYgKGNsby5zb3VyY2VGaWxlICE9IG51bGwpCisJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJvbmx5IG9uZSBzb3VyY2UgZmlsZSBhdCBhIHRpbWUsIHBsZWFzZSIgKTsKKwkJY2xvLnNvdXJjZUZpbGUgPSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKC1kIG9wdGlvbikuIElmIG5vdAorCSAqIHNwZWNpZmllZCwgdGhlIHNhbWUgZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2UgZmlsZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldE91dHB1dERpciggRmlsZSB2YWx1ZSApCisJeworCQljbG8ub3V0cHV0RGlyID0gdmFsdWU7CisJfQorCisJLyoqCisJICogVGhlIGJpbmRpbmcgbmFtZS4gRXhhbXBsZSB2YWx1ZXMgYXJlIGphdmEsIGNzaGFycCwgcHl0aG9uLCBydWJ5LCBjLCBhbmQKKwkgKiB4bWwgKC1iIG9wdGlvbikuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJY2xvLmJpbmRpbmcgPSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyB0aGUgZmlsZShzKSB3ZSBuZWVkIHRvIGdlbmVyYXRlICgtdyBvcHRpb24pLiBWYWxpZCB2YWx1ZXMKKwkgKiBkZXBlbmQgdXBvbiB0aGUgYmluZGluZywgYnV0IGV4YW1wbGVzIGluY2x1ZGUgQk9USCwgU0VSVkVSLCBDTElFTlQsIEFMTCwKKwkgKiBJTlRGLCBJTVBMLCBNQUlOLCBOT05FLCBhbmQgRk9SQ0UuIEhFTFAgbWlnaHQgZ2l2ZSB5b3Ugc29tZS4gU2VwYXJhdGUKKwkgKiB2YWx1ZXMgdXNpbmcgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBmcm9tICIsOzogIiAoZS5nLiwgIkJPVEgsIElOVEYiLAorCSAqIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQgZm9yIG1hbnkgYmluZGluZ3MpLgorCSAqCisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgc2V0V2hhdCggU3RyaW5nIHZhbHVlICkKKwl7CisJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHZhbHVlLAorCQkJQ21kTGluZU9wdGlvbnMuV0hBVF9ERUxJTUVURVIgKTsKKwkJd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQorCQkJY2xvLndoYXQuYWRkKCBzdC5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpICk7CisJfQorCisJLyoqCisJICogRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBpZ25vcmUgdGhlIGdsb2JhbGx5IHJlc2VydmVkIHdvcmQgbGlzdCAoLWcKKwkgKiBvcHRpb24pLgorCSAqCisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgc2V0SWdub3JlR2xvYmFsV29yZHNMaXN0KCBib29sZWFuIHZhbHVlICkKKwl7CisJCWNsby5pZ25vcmVHbG9iYWxXb3Jkc0xpc3QgPSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIGlnbm9yZSB0aGUgbG9jYWxseSByZXNlcnZlZCB3b3JkIGxpc3QgKC1sCisJICogb3B0aW9uKS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldElnbm9yZUxvY2FsV29yZHNMaXN0KCBib29sZWFuIHZhbHVlICkKKwl7CisJCWNsby5pZ25vcmVMb2NhbFdvcmRzTGlzdCA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIFRoZSBwYXRoIG9mIHRoZSB1c2VyLWRlZmluZWQgcmVzZXJ2ZWQgd29yZHMgbGlzdCAoLVcgb3B0aW9uKS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZXJXb3Jkc0xpc3QoIEZpbGUgdmFsdWUgKQorCXsKKwkJY2xvLnVzZXJXb3Jkc0xpc3QgPSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBJZ25vcmUgdGhlIEVUQ0hfSU5DTFVERV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlICgtaSBvcHRpb24pLgorCSAqCisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgc2V0SWdub3JlSW5jbHVkZVBhdGgoIGJvb2xlYW4gdmFsdWUgKQorCXsKKwkJY2xvLmlnbm9yZUluY2x1ZGVQYXRoID0gdmFsdWU7CisJfQorCisJLyoqCisJICogRmxhZyBpbmRpY2F0ZXMgdGhhdCBtaXhpbiBhcnRpZmFjdHMgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgKC1uIG9wdGlvbikuCisJICogSWYgZmFsc2UsIG1peGluIGFydGlmYWN0cyBhcmUgZ2VuZXJhdGVkIGludG8gbWl4aW5PdXRwdXREaXIuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROb01peGluQXJ0aWZhY3RzKCBib29sZWFuIHZhbHVlICkKKwl7CisJCWNsby5ub01peGluQXJ0aWZhY3RzID0gdmFsdWU7CisJfQorCisJLyoqCisJICogVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgZ2VuZXJhdGVkIG1peGluIGZpbGVzICgtbSBvcHRpb24pLiBJZgorCSAqIG5vdCBzcGVjaWZpZWQsIGFuZCBpZiBub01peGluQXJ0aWZhY3RzIGFsbG93cywgbWl4aW4gYXJ0aWZhY3RzIGFyZQorCSAqIGdlbmVyYXRlZCBpbnRvIG91dHB1dERpci4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1peGluT3V0cHV0RGlyKCBGaWxlIHZhbHVlICkKKwl7CisJCWNsby5taXhpbk91dHB1dERpciA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1vZHVsZSBuYW1lIHNob3VsZCBzaG91bGQgYmUgZmxhdHRlbmVkIHRvCisJICogcHJvZHVjZSBhIHNpbmdsZSBkaXJlY3Rvcnkgb3IgYSBkaXJlY3RvcnkgdHJlZSAoZS5nLiwgZm9yIGNzaGFycCkgKC1mCisJICogb3B0aW9uKS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldE5vRmxhdHRlblBhY2thZ2VzKCBib29sZWFuIHZhbHVlICkKKwl7CisJCWNsby5ub0ZsYXR0ZW5QYWNrYWdlcyA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIERlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgdXNlciBlZGl0YWJsZSB0ZW1wbGF0ZSBmaWxlcyAoLXQgb3B0aW9uKS4KKwkgKiBJZiBub3Qgc3BlY2lmaWVkLCBzYW1lIGFzIG91dHB1dERpci4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFRlbXBsYXRlT3V0cHV0RGlyKCBGaWxlIHZhbHVlICkKKwl7CisJCWNsby50ZW1wbGF0ZU91dHB1dERpciA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIEZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QgcmVwb3J0IHByb2dyZXNzICgtcSBvcHRpb24pLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFF1aWV0KCBib29sZWFuIHZhbHVlICkKKwl7CisJCWNsby5xdWlldCA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIFdlJ3JlIGp1c3QgdGVzdGluZyB0aGUgY29tcGlsZXIsIGRvbid0IHdyaXRlIGFueSBmaWxlcyAoLS10ZXN0aW5nIG9wdGlvbikuCisJICogCisJICogQHBhcmFtIHZhbHVlIAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRlc3RpbmcoIGJvb2xlYW4gdmFsdWUgKQorCXsKKwkJY2xvLnRlc3RpbmcgPSB2YWx1ZTsKKwl9CisKKwkvKiogCisJICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGV0Y2ggaW5zdGFsbGF0aW9uICh0aGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hpY2gKKwkgKiBjb250YWlucyBiaW4gYW5kIGxpYikgKG5vIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBsaW5lIG9wdGlvbikuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIb21lKCBGaWxlIHZhbHVlICkKKwl7CisJCWhvbWUgPSB2YWx1ZTsKKwl9CisKKwlwcml2YXRlIEZpbGUgaG9tZTsKKworCS8qKiBFWEVDVVRJT04gKiovCisKKwlAT3ZlcnJpZGUKKwkvKioKKwkgKiBleGVjdXRlCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorCXsKKwkJQ2xhc3NMb2FkZXIgY2w7CisKKwkJdHJ5CisJCXsKKwkJCWNsID0gRXRjaENvbXBpbGVyLnNldHVwQ2xhc3NMb2FkZXIoIGhvbWUgKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKwkJCQkicHJvYmxlbSBzZXR0aW5nIHVwIGV0Y2ggY29tcGlsZXIgY2xhc3MgbG9hZGVyIiwgZSApOworCQl9CisKKwkJRXRjaENvbXBpbGVyIGV0Y2hDb21waWxlcjsKKworCQl0cnkKKwkJeworCQkJLy8gSW5zdGFudGlhdGUgYSBuZXcgY29tcGlsZXIgaW5zdGFuY2UKKwkJCWV0Y2hDb21waWxlciA9IG5ldyBFdGNoQ29tcGlsZXIoIGNsICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJwcm9ibGVtIHNldHRpbmcgdXAgZXRjaCBjb21waWxlciIsIGUgKTsKKwkJfQorCisJCXRyeQorCQl7CisJCQlldGNoQ29tcGlsZXIucnVuKCBjbG8gKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiggInByb2JsZW0gcnVubmluZyBldGNoIGNvbXBpbGVyIiwgZSApOworCQl9CisJCQorCQlpZiAoY2xvLmxoLmhhc0Vycm9yKCkpCisJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJwcm9ibGVtIHJ1bm5pbmcgZXRjaCBjb21waWxlciIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL2FudC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL3Rvb2xzL2FudC9ldGNoLnhtbCBiL3BsdWdpbnMvYW50L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvdG9vbHMvYW50L2V0Y2gueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNWQ5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL2FudC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9ldGNoL3Rvb2xzL2FudC9ldGNoLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPGFudGxpYj4KKwk8dGFza2RlZiBuYW1lPSJldGNoIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuZXRjaC50b29scy5hbnQuRXRjaENvbXBpbGVUYXNrIi8+Cis8L2FudGxpYj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvdmltL1JFQURNRS50eHQgYi9wbHVnaW5zL3ZpbS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTdlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3ZpbS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTYgQEAKK0Fib3V0CistLS0tLQorCitldGNoLnZpbSBpcyBhIHN5bnRheCBkZWZpbml0aW9uIGZvciAuZXRjaCBmaWxlcy4gSXQgaXMgYmFzZWQgb24gdGhlIGphdmEudmltIHN5bnRheCBmaWxlIHRoYXQgc2hpcHMgdy8gdmltNzAuCisKKworVG8gSW5zdGFsbAorLS0tLS0tLS0tLQorCisxLiBDb3B5IGV0Y2gudmltIHRvIFZJTV9IT01FL3N5bnRheAorMi4gQWRkIHRoZSBmb2xsb3dpbmcgbGluZSB5b3VyIC52aW1yYyB0byByZWNvZ2l6ZSAuZXRjaCBmaWxlczoKKworICAgYXUgQnVmTmV3RmlsZSxCdWZSZWFkICouZXRjaCBzZXRmIGV0Y2gKKworMy4gRW5qb3khCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvdmltL2V0Y2gudmltIGIvcGx1Z2lucy92aW0vZXRjaC52aW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwZjg4OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvdmltL2V0Y2gudmltCkBAIC0wLDAgKzEsMjk1IEBACisiIFZpbSBzeW50YXggZmlsZQorIiBMYW5ndWFnZTogICAgIEV0Y2ggCisiIE1haW50YWluZXI6ICAgSmFtZXMgRGl4c29uIDxkaXhzb25AYXBhY2hlLm9yZz4KKyIgVVJMOgkJaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3Byb2plY3RzL2V0Y2guaHRtbAorIiBMYXN0IENoYW5nZTogIDEzIE5vdiAyMDA3CisiCisiIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisiIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisiIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisiIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisiIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisiIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyIgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyIgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyIgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyIgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyIgXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorIiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorIiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorIiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIgorIgorIiAgQmFzZWQgb24gamF2YS52aW0gYnkgQ2xhdWRpbyBGbGVpbmVyIDxjbGF1ZGlvQGZsZWluZXIuY29tPgorIgorIiBQbGVhc2UgY2hlY2sgOmhlbHAgZXRjaC52aW0gZm9yIGNvbW1lbnRzIG9uIHNvbWUgb2YgdGhlIG9wdGlvbnMgYXZhaWxhYmxlLgorCisiIFF1aXQgd2hlbiBhIHN5bnRheCBmaWxlIHdhcyBhbHJlYWR5IGxvYWRlZAoraWYgIWV4aXN0cygibWFpbl9zeW50YXgiKQorICBpZiB2ZXJzaW9uIDwgNjAwCisgICAgc3ludGF4IGNsZWFyCisgIGVsc2VpZiBleGlzdHMoImI6Y3VycmVudF9zeW50YXgiKQorICAgIGZpbmlzaAorICBlbmRpZgorICAiIHdlIGRlZmluZSBpdCBoZXJlIHNvIHRoYXQgaW5jbHVkZWQgZmlsZXMgY2FuIHRlc3QgZm9yIGl0CisgIGxldCBtYWluX3N5bnRheD0nZXRjaCcKK2VuZGlmCisKKyIgZG9uJ3QgdXNlIHN0YW5kYXJkIEhpTGluaywgaXQgd2lsbCBub3Qgd29yayB3aXRoIGluY2x1ZGVkIHN5bnRheCBmaWxlcworaWYgdmVyc2lvbiA8IDUwOAorICBjb21tYW5kISAtbmFyZ3M9KyBFdGNoSGlMaW5rIGhpIGxpbmsgPGFyZ3M+CitlbHNlCisgIGNvbW1hbmQhIC1uYXJncz0rIEV0Y2hIaUxpbmsgaGkgZGVmIGxpbmsgPGFyZ3M+CitlbmRpZgorCisiIHNvbWUgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSBpbiBhIGV0Y2ggaWRsIChvdXRzaWRlIGEgc3RyaW5nKQorc3luIG1hdGNoIGV0Y2hFcnJvciAiW1xcQGBdIgorc3luIG1hdGNoIGV0Y2hFcnJvciAiPDw8XHxcLlwuXHw9Plx8PD5cfHx8PVx8JiY9XHxbXi1dLT5cfFwqXC8iCitzeW4gbWF0Y2ggZXRjaE9LICJcLlwuXC4iCisKKyIgdXNlIHNlcGFyYXRlIG5hbWUgc28gdGhhdCBpdCBjYW4gYmUgZGVsZXRlZCBpbiBldGNoY2MudmltCitzeW4gbWF0Y2ggICBldGNoRXJyb3IyICIjXHw9PCIKK0V0Y2hIaUxpbmsgZXRjaEVycm9yMiBldGNoRXJyb3IKKworIiBrZXl3b3JkIGRlZmluaXRpb25zCitzeW4ga2V5d29yZCBldGNoT3B0aW9uQXN5bmNSZWNlaXZlciBwb29sIHF1ZXVlZCBub25lIGZyZWUKK3N5biBrZXl3b3JkIGV0Y2hPcHRpb25BdXRob3JpemUgdHJ1ZSBmYWxzZSAKKyJzeW4ga2V5d29yZCBldGNoT3B0aW9uQXV0aG9yaXplIHRydWUgZmFsc2UgPGlkPiA8aW50ZWdlcj4KK3N5biBrZXl3b3JkIGV0Y2hPcHRpb25EaXJlY3Rpb24gY2xpZW50IHNlcnZlciBib3RoCisic3luIGtleXdvcmQgZXRjaE9wdGlvbkV4dGVybiA8aWQ+W10KK3N5biBrZXl3b3JkIGV0Y2hPcHRpb25PbmV3YXkgdHJ1ZSBmYWxzZQorInN5biBrZXl3b3JkIGV0Y2hPcHRpb25UaW1lb3V0IDxpbnRlZ2VyPgorInN5biBrZXl3b3JkIGV0Y2hPcHRpb25Ub1N0cmluZyA8c3RyaW5nPgorc3luIGtleXdvcmQgZXRjaE9wdGlvblVuY2hlY2tlZCB0cnVlIGZhbHNlCisKK3N5biBrZXl3b3JkIGV0Y2hFeHRlcm5hbCBtb2R1bGUKK3N5biBtYXRjaCBldGNoRXh0ZXJuYWwgIlw8aW1wb3J0XD5cKFxzXCtzdGF0aWNcPlwpXD8iCitzeW4ga2V5d29yZCBldGNoQ29uc3RhbnQgbnVsbAorc3luIGtleXdvcmQgZXRjaFR5cGUgYm9vbGVhbiBieXRlIGNvbnN0IGRvdWJsZSBlbnVtIGV4Y2VwdGlvbiBleHRlcm4gZmxvYXQgaW50IGxvbmcgbWl4aW4gb2JqZWN0IHNlcnZpY2Ugc2hvcnQgc3RyaW5nIHN0cnVjdCB2b2lkCitzeW4ga2V5d29yZCBldGNoQm9vbGVhbiB0cnVlIGZhbHNlCitzeW4ga2V5d29yZCBldGNoTWV0aG9kRGVjbCB0aHJvd3MKK3N5biBtYXRjaCAgIGV0Y2hBbm5vdGF0aW9uICAgICAgIkBbXyRhLXpBLVpdW18kYS16QS1aMC05X10qXD4iCisKK2lmIGV4aXN0cygiZXRjaF9zcGFjZV9lcnJvcnMiKQorICBpZiAhZXhpc3RzKCJldGNoX25vX3RyYWlsX3NwYWNlX2Vycm9yIikKKyAgICBzeW4gbWF0Y2ggICBldGNoU3BhY2VFcnJvciAgIlxzXCskIgorICBlbmRpZgorICBpZiAhZXhpc3RzKCJldGNoX25vX3RhYl9zcGFjZV9lcnJvciIpCisgICAgc3luIG1hdGNoICAgZXRjaFNwYWNlRXJyb3IgICIgXCtcdCJtZT1lLTEKKyAgZW5kaWYKK2VuZGlmCisKK3N5biByZWdpb24gIGV0Y2hMYWJlbFJlZ2lvbiAgICAgdHJhbnNwYXJlbnQgbWF0Y2hncm91cD1ldGNoTGFiZWwgc3RhcnQ9Ilw8Y2FzZVw+IiBtYXRjaGdyb3VwPU5PTkUgZW5kPSI6IiBjb250YWlucz1ldGNoTnVtYmVyLGV0Y2hDaGFyYWN0ZXIKK3N5biBtYXRjaCAgIGV0Y2hVc2VyTGFiZWwgICAgICAgIl5ccypbXyRhLXpBLVpdW18kYS16QS1aMC05X10qXHMqOiJoZT1lLTEgY29udGFpbnM9ZXRjaExhYmVsCitzeW4ga2V5d29yZCBldGNoTGFiZWwJCWRlZmF1bHQKKworIiBUaGUgZm9sbG93aW5nIGNsdXN0ZXIgY29udGFpbnMgYWxsIGV0Y2ggZ3JvdXBzIGV4Y2VwdCB0aGUgY29udGFpbmVkIG9uZXMKK3N5biBjbHVzdGVyIGV0Y2hUb3AgYWRkPWV0Y2hFcnJvcixldGNoRXJyb3IyLGV0Y2hPcHRpb25Bc3luY1JlY2VpdmVyLGV0Y2hPcHRpb25EaXJlY3Rpb24sZXRjaEV4dGVybmFsLGV0Y2hDb25zdGFudCxldGNoVHlwZSxldGNoQm9vbGVhbixldGNoTWV0aG9kRGVjbCxldGNoQW5ub3RhdGlvbgorCisiIENvbW1lbnRzCitzeW4ga2V5d29yZCBldGNoVG9kbwkJIGNvbnRhaW5lZCBUT0RPIEZJWE1FIFhYWAoraWYgZXhpc3RzKCJldGNoX2NvbW1lbnRfc3RyaW5ncyIpCisgIHN5biByZWdpb24gIGV0Y2hDb21tZW50U3RyaW5nICAgIGNvbnRhaW5lZCBzdGFydD0rIisgZW5kPSsiKyBlbmQ9KyQrIGVuZD0rXCovK21lPXMtMSxoZT1zLTEgY29udGFpbnM9ZXRjaFNwZWNpYWwsZXRjaENvbW1lbnRTdGFyLGV0Y2hTcGVjaWFsQ2hhcixAU3BlbGwKKyAgc3luIHJlZ2lvbiAgZXRjaENvbW1lbnQyU3RyaW5nICAgY29udGFpbmVkIHN0YXJ0PSsiKyAgZW5kPSskXHwiKyAgY29udGFpbnM9ZXRjaFNwZWNpYWwsZXRjaFNwZWNpYWxDaGFyLEBTcGVsbAorICBzeW4gbWF0Y2ggICBldGNoQ29tbWVudENoYXJhY3RlciBjb250YWluZWQgIidcXFteJ11cezEsNlx9JyIgY29udGFpbnM9ZXRjaFNwZWNpYWxDaGFyCisgIHN5biBtYXRjaCAgIGV0Y2hDb21tZW50Q2hhcmFjdGVyIGNvbnRhaW5lZCAiJ1xcJyciIGNvbnRhaW5zPWV0Y2hTcGVjaWFsQ2hhcgorICBzeW4gbWF0Y2ggICBldGNoQ29tbWVudENoYXJhY3RlciBjb250YWluZWQgIidbXlxcXSciCisgIHN5biBjbHVzdGVyIGV0Y2hDb21tZW50U3BlY2lhbCBhZGQ9ZXRjaENvbW1lbnRTdHJpbmcsZXRjaENvbW1lbnRDaGFyYWN0ZXIsZXRjaE51bWJlcgorICBzeW4gY2x1c3RlciBldGNoQ29tbWVudFNwZWNpYWwyIGFkZD1ldGNoQ29tbWVudDJTdHJpbmcsZXRjaENvbW1lbnRDaGFyYWN0ZXIsZXRjaE51bWJlcgorZW5kaWYKK3N5biByZWdpb24gIGV0Y2hDb21tZW50CQkgc3RhcnQ9Ii9cKiIgIGVuZD0iXCovIiBjb250YWlucz1AZXRjaENvbW1lbnRTcGVjaWFsLGV0Y2hUb2RvLEBTcGVsbAorc3luIG1hdGNoICAgZXRjaENvbW1lbnRTdGFyICAgICAgY29udGFpbmVkICJeXHMqXCpbXi9dIm1lPWUtMQorc3luIG1hdGNoICAgZXRjaENvbW1lbnRTdGFyICAgICAgY29udGFpbmVkICJeXHMqXCokIgorc3luIG1hdGNoICAgZXRjaExpbmVDb21tZW50ICAgICAgIi8vLioiIGNvbnRhaW5zPUBldGNoQ29tbWVudFNwZWNpYWwyLGV0Y2hUb2RvLEBTcGVsbAorRXRjaEhpTGluayBldGNoQ29tbWVudFN0cmluZyBldGNoU3RyaW5nCitFdGNoSGlMaW5rIGV0Y2hDb21tZW50MlN0cmluZyBldGNoU3RyaW5nCitFdGNoSGlMaW5rIGV0Y2hDb21tZW50Q2hhcmFjdGVyIGV0Y2hDaGFyYWN0ZXIKKworc3luIGNsdXN0ZXIgZXRjaFRvcCBhZGQ9ZXRjaENvbW1lbnQsZXRjaExpbmVDb21tZW50CisKK2lmICFleGlzdHMoImV0Y2hfaWdub3JlX2phdmFkb2MiKSAKKyAgc3ludGF4IGNhc2UgaWdub3JlCisgICIgc3ludGF4IGNvbG9yaW5nIGZvciBqYXZhZG9jIGNvbW1lbnRzIChIVE1MKQorICBzeW50YXggaW5jbHVkZSBAZXRjaEh0bWwgPHNmaWxlPjpwOmgvaHRtbC52aW0KKyAgdW5sZXQgYjpjdXJyZW50X3N5bnRheAorICBzeW4gcmVnaW9uICBldGNoRG9jQ29tbWVudCAgICBzdGFydD0iL1wqXCoiICBlbmQ9IlwqLyIga2VlcGVuZCBjb250YWlucz1ldGNoQ29tbWVudFRpdGxlLEBldGNoSHRtbCxldGNoRG9jVGFncyxldGNoRG9jU2VlVGFnLGV0Y2hUb2RvLEBTcGVsbAorICBzeW4gcmVnaW9uICBldGNoQ29tbWVudFRpdGxlICBjb250YWluZWQgbWF0Y2hncm91cD1ldGNoRG9jQ29tbWVudCBzdGFydD0iL1wqXCoiICAgbWF0Y2hncm91cD1ldGNoQ29tbWVudFRpdGxlIGtlZXBlbmQgZW5kPSJcLiQiIGVuZD0iXC5bIFx0XHI8Jl0ibWU9ZS0xIGVuZD0iW157XUAibWU9cy0yLGhlPXMtMSBlbmQ9IlwqLyJtZT1zLTEsaGU9cy0xIGNvbnRhaW5zPUBldGNoSHRtbCxldGNoQ29tbWVudFN0YXIsZXRjaFRvZG8sQFNwZWxsLGV0Y2hEb2NUYWdzLGV0Y2hEb2NTZWVUYWcKKworICBzeW4gcmVnaW9uIGV0Y2hEb2NUYWdzICAgICAgICAgY29udGFpbmVkIHN0YXJ0PSJ7QFwobGlua1x8bGlua3BsYWluXHxpbmhlcml0W0RkXW9jXHxkb2NbclJdb290XHx2YWx1ZVwpIiBlbmQ9In0iCisgIHN5biBtYXRjaCAgZXRjaERvY1RhZ3MgICAgICAgICBjb250YWluZWQgIkBcKHBhcmFtXHxleGNlcHRpb25cfHRocm93c1x8c2luY2VcKVxzXCtcU1wrIiBjb250YWlucz1ldGNoRG9jUGFyYW0KKyAgc3luIG1hdGNoICBldGNoRG9jUGFyYW0gICAgICAgIGNvbnRhaW5lZCAiXHNcU1wrIgorICBzeW4gbWF0Y2ggIGV0Y2hEb2NUYWdzICAgICAgICAgY29udGFpbmVkICJAXCh2ZXJzaW9uXHxhdXRob3JcfHJldHVyblx8ZGVwcmVjYXRlZFx8c2VyaWFsXHxzZXJpYWxGaWVsZFx8c2VyaWFsRGF0YVwpXD4iCisgIHN5biByZWdpb24gZXRjaERvY1NlZVRhZyAgICAgICBjb250YWluZWQgbWF0Y2hncm91cD1ldGNoRG9jVGFncyBzdGFydD0iQHNlZVxzXCsiIG1hdGNoZ3JvdXA9Tk9ORSBlbmQ9IlxfLiJyZT1lLTEgY29udGFpbnM9ZXRjaERvY1NlZVRhZ1BhcmFtCisgIHN5biBtYXRjaCAgZXRjaERvY1NlZVRhZ1BhcmFtICBjb250YWluZWQgQCJcX1teIl1cKyJcfDxhXHNcK1xfLlx7LX08L2E+XHxcKFxrXHxcLlwpKlwoI1xrXCtcKChcX1teKV1cKylcKVw9XClcPUAgZXh0ZW5kCisgIHN5bnRheCBjYXNlIG1hdGNoCitlbmRpZgorCisiIG1hdGNoIHRoZSBzcGVjaWFsIGNvbW1lbnQgLyoqLworc3luIG1hdGNoICAgZXRjaENvbW1lbnQJCSAiL1wqXCovIgorCisiIFN0cmluZ3MgYW5kIGNvbnN0YW50cworc3luIG1hdGNoICAgZXRjaFNwZWNpYWxFcnJvciAgICAgY29udGFpbmVkICJcXC4iCitzeW4gbWF0Y2ggICBldGNoU3BlY2lhbENoYXJFcnJvciBjb250YWluZWQgIlteJ10iCitzeW4gbWF0Y2ggICBldGNoU3BlY2lhbENoYXIgICAgICBjb250YWluZWQgIlxcXChbNC05XVxkXHxbMC0zXVxkXGRcfFtcIlxcJ250YnJmXVx8dVx4XHs0XH1cKSIKK3N5biByZWdpb24gIGV0Y2hTdHJpbmcJCXN0YXJ0PSsiKyBlbmQ9KyIrIGVuZD0rJCsgY29udGFpbnM9ZXRjaFNwZWNpYWxDaGFyLGV0Y2hTcGVjaWFsRXJyb3IsQFNwZWxsCisiIG5leHQgbGluZSBkaXNhYmxlZCwgaXQgY2FuIGNhdXNlIGEgY3Jhc2ggZm9yIGEgbG9uZyBsaW5lCisic3luIG1hdGNoICAgZXRjaFN0cmluZ0Vycm9yCSAgKyJcKFteIlxcXVx8XFwuXCkqJCsKK3N5biBtYXRjaCAgIGV0Y2hDaGFyYWN0ZXIJICInW14nXSonIiBjb250YWlucz1ldGNoU3BlY2lhbENoYXIsZXRjaFNwZWNpYWxDaGFyRXJyb3IKK3N5biBtYXRjaCAgIGV0Y2hDaGFyYWN0ZXIJICInXFwnJyIgY29udGFpbnM9ZXRjaFNwZWNpYWxDaGFyCitzeW4gbWF0Y2ggICBldGNoQ2hhcmFjdGVyCSAiJ1teXFxdJyIKK3N5biBtYXRjaCAgIGV0Y2hOdW1iZXIJCSAiXDxcKDBbMC03XSpcfDBbeFhdXHhcK1x8XGRcK1wpW2xMXVw9XD4iCitzeW4gbWF0Y2ggICBldGNoTnVtYmVyCQkgIlwoXDxcZFwrXC5cZCpcfFwuXGRcK1wpXChbZUVdWy0rXVw9XGRcK1wpXD1bZkZkRF1cPSIKK3N5biBtYXRjaCAgIGV0Y2hOdW1iZXIJCSAiXDxcZFwrW2VFXVstK11cPVxkXCtbZkZkRF1cPVw+Igorc3luIG1hdGNoICAgZXRjaE51bWJlcgkJICJcPFxkXCtcKFtlRV1bLStdXD1cZFwrXClcPVtmRmREXVw+IgorCisiIHVuaWNvZGUgY2hhcmFjdGVycworc3luIG1hdGNoICAgZXRjaFNwZWNpYWwgIlxcdVxkXHs0XH0iCisKK3N5biBjbHVzdGVyIGV0Y2hUb3AgYWRkPWV0Y2hTdHJpbmcsZXRjaENoYXJhY3RlcixldGNoTnVtYmVyLGV0Y2hTcGVjaWFsLGV0Y2hTdHJpbmdFcnJvcgorCitpZiBleGlzdHMoImV0Y2hfaGlnaGxpZ2h0X2Z1bmN0aW9ucyIpCisgIGlmIGV0Y2hfaGlnaGxpZ2h0X2Z1bmN0aW9ucyA9PSAiaW5kZW50IgorICAgIHN5biBtYXRjaCAgZXRjaEZ1bmNEZWYgIl5cKFx0XHwgXHs4XH1cKVtfJGEtekEtWl1bXyRhLXpBLVowLTlfLiBcW1xdXSooW14tKyovKCldKikiIGNvbnRhaW5zPWV0Y2hTY29wZURlY2wsZXRjaFR5cGUsZXRjaFN0b3JhZ2VDbGFzcyxAZXRjaENsYXNzZXMKKyAgICBzeW4gcmVnaW9uIGV0Y2hGdW5jRGVmIHN0YXJ0PSteXChcdFx8IFx7OFx9XClbJF9hLXpBLVpdWyRfYS16QS1aMC05Xy4gXFtcXV0qKFteLSsqLygpXSosXHMqKyBlbmQ9KykrIGNvbnRhaW5zPWV0Y2hTY29wZURlY2wsZXRjaFR5cGUsZXRjaFN0b3JhZ2VDbGFzcyxAZXRjaENsYXNzZXMKKyAgICBzeW4gbWF0Y2ggIGV0Y2hGdW5jRGVmICJeICBbJF9hLXpBLVpdWyRfYS16QS1aMC05Xy4gXFtcXV0qKFteLSsqLygpXSopIiBjb250YWlucz1ldGNoU2NvcGVEZWNsLGV0Y2hUeXBlLGV0Y2hTdG9yYWdlQ2xhc3MsQGV0Y2hDbGFzc2VzCisgICAgc3luIHJlZ2lvbiBldGNoRnVuY0RlZiBzdGFydD0rXiAgWyRfYS16QS1aXVskX2EtekEtWjAtOV8uIFxbXF1dKihbXi0rKi8oKV0qLFxzKisgZW5kPSspKyBjb250YWlucz1ldGNoU2NvcGVEZWNsLGV0Y2hUeXBlLGV0Y2hTdG9yYWdlQ2xhc3MsQGV0Y2hDbGFzc2VzCisgIGVsc2UKKyAgICAiIFRoaXMgbGluZSBjYXRjaGVzIG1ldGhvZCBkZWNsYXJhdGlvbnMgYXQgYW55IGluZGVudGF0aW9uPjAsIGJ1dCBpdCBhc3N1bWVzCisgICAgIiB0d28gdGhpbmdzOgorICAgICIgICAxLiBjbGFzcyBuYW1lcyBhcmUgYWx3YXlzIGNhcGl0YWxpemVkIChpZTogQnV0dG9uKQorICAgICIgICAyLiBtZXRob2QgbmFtZXMgYXJlIG5ldmVyIGNhcGl0YWxpemVkIChleGNlcHQgY29uc3RydWN0b3JzLCBvZiBjb3Vyc2UpCisgICAgc3luIHJlZ2lvbiBldGNoRnVuY0RlZiBzdGFydD0rXlxzXCtcKFwodm9pZFx8Ym9vbGVhblx8ZW51bVx8b2JqZWN0XHxzdHJpbmdcfGJ5dGVcfHNob3J0XHxpbnRcfGxvbmdcfGZsb2F0XHxkb3VibGVcfFwoW0EtWmEtel9dW0EtWmEtejAtOV8kXSpcLlwpKltBLVpdW0EtWmEtejAtOV8kXSpcKVwoPFtePl0qPlwpXD1cKFxbXF1cKSpcc1wrW2Etel1bQS1aYS16MC05XyRdKlx8W0EtWl1bQS1aYS16MC05XyRdKlwpXHMqKFteMC05XSsgZW5kPSspKyBjb250YWlucz1ldGNoVHlwZSxldGNoQ29tbWVudCxldGNoTGluZUNvbW1lbnQsQGV0Y2hDbGFzc2VzCisgIGVuZGlmCisgIHN5biBtYXRjaCAgZXRjaEJyYWNlcyAgIlt7fV0iCisgIHN5biBjbHVzdGVyIGV0Y2hUb3AgYWRkPWV0Y2hGdW5jRGVmLGV0Y2hCcmFjZXMKK2VuZGlmCisKK2lmIGV4aXN0cygiZXRjaF9oaWdobGlnaHRfZGVidWciKQorCisgICIgU3RyaW5ncyBhbmQgY29uc3RhbnRzCisgIHN5biBtYXRjaCAgIGV0Y2hEZWJ1Z1NwZWNpYWwJCWNvbnRhaW5lZCAiXFxcZFxkXGRcfFxcLiIKKyAgc3luIHJlZ2lvbiAgZXRjaERlYnVnU3RyaW5nCQljb250YWluZWQgc3RhcnQ9KyIrICBlbmQ9KyIrICBjb250YWlucz1ldGNoRGVidWdTcGVjaWFsCisgIHN5biBtYXRjaCAgIGV0Y2hEZWJ1Z1N0cmluZ0Vycm9yICAgICAgKyJcKFteIlxcXVx8XFwuXCkqJCsKKyAgc3luIG1hdGNoICAgZXRjaERlYnVnQ2hhcmFjdGVyCWNvbnRhaW5lZCAiJ1teXFxdJyIKKyAgc3luIG1hdGNoICAgZXRjaERlYnVnU3BlY2lhbENoYXJhY3RlciBjb250YWluZWQgIidcXC4nIgorICBzeW4gbWF0Y2ggICBldGNoRGVidWdTcGVjaWFsQ2hhcmFjdGVyIGNvbnRhaW5lZCAiJ1xcJyciCisgIHN5biBtYXRjaCAgIGV0Y2hEZWJ1Z051bWJlcgkJY29udGFpbmVkICJcPFwoMFswLTddKlx8MFt4WF1ceFwrXHxcZFwrXClbbExdXD1cPiIKKyAgc3luIG1hdGNoICAgZXRjaERlYnVnTnVtYmVyCQljb250YWluZWQgIlwoXDxcZFwrXC5cZCpcfFwuXGRcK1wpXChbZUVdWy0rXVw9XGRcK1wpXD1bZkZkRF1cPSIKKyAgc3luIG1hdGNoICAgZXRjaERlYnVnTnVtYmVyCQljb250YWluZWQgIlw8XGRcK1tlRV1bLStdXD1cZFwrW2ZGZERdXD1cPiIKKyAgc3luIG1hdGNoICAgZXRjaERlYnVnTnVtYmVyCQljb250YWluZWQgIlw8XGRcK1woW2VFXVstK11cPVxkXCtcKVw9W2ZGZERdXD4iCisgIHN5biBrZXl3b3JkIGV0Y2hEZWJ1Z0Jvb2xlYW4JCWNvbnRhaW5lZCB0cnVlIGZhbHNlCisgIHN5biBrZXl3b3JkIGV0Y2hEZWJ1Z1R5cGUJCWNvbnRhaW5lZCBudWxsIHRoaXMgc3VwZXIKKyAgc3luIHJlZ2lvbiBldGNoRGVidWdQYXJlbiAgc3RhcnQ9KygrIGVuZD0rKSsgY29udGFpbmVkIGNvbnRhaW5zPWV0Y2hEZWJ1Zy4qLGV0Y2hEZWJ1Z1BhcmVuCisKKyAgIiB0byBtYWtlIHRoaXMgd29yayB5b3UgbXVzdCBkZWZpbmUgdGhlIGhpZ2hsaWdodGluZyBmb3IgdGhlc2UgZ3JvdXBzCisgIHN5biBtYXRjaCBldGNoRGVidWcgIlw8U3lzdGVtXC5cKG91dFx8ZXJyXClcLnByaW50XChsblwpKlxzKigibWU9ZS0xIGNvbnRhaW5zPWV0Y2hEZWJ1Zy4qIG5leHRncm91cD1ldGNoRGVidWdQYXJlbgorICBzeW4gbWF0Y2ggZXRjaERlYnVnICJcPHBccyooIm1lPWUtMSBjb250YWlucz1ldGNoRGVidWcuKiBuZXh0Z3JvdXA9ZXRjaERlYnVnUGFyZW4KKyAgc3luIG1hdGNoIGV0Y2hEZWJ1ZyAiW0EtWmEtel1bYS16QS1aMC05X10qXC5wcmludFN0YWNrVHJhY2VccyooIm1lPWUtMSBjb250YWlucz1ldGNoRGVidWcuKiBuZXh0Z3JvdXA9ZXRjaERlYnVnUGFyZW4KKyAgc3luIG1hdGNoIGV0Y2hEZWJ1ZyAiXDx0cmFjZVtTTF1cPVxzKigibWU9ZS0xIGNvbnRhaW5zPWV0Y2hEZWJ1Zy4qIG5leHRncm91cD1ldGNoRGVidWdQYXJlbgorCisgIHN5biBjbHVzdGVyIGV0Y2hUb3AgYWRkPWV0Y2hEZWJ1ZworCisgIGlmIHZlcnNpb24gPj0gNTA4IHx8ICFleGlzdHMoImRpZF9jX3N5bl9pbml0cyIpCisgICAgRXRjaEhpTGluayBldGNoRGVidWcJCSBEZWJ1ZworICAgIEV0Y2hIaUxpbmsgZXRjaERlYnVnU3RyaW5nCQkgRGVidWdTdHJpbmcKKyAgICBFdGNoSGlMaW5rIGV0Y2hEZWJ1Z1N0cmluZ0Vycm9yCSBldGNoRXJyb3IKKyAgICBFdGNoSGlMaW5rIGV0Y2hEZWJ1Z1R5cGUJCSBEZWJ1Z1R5cGUKKyAgICBFdGNoSGlMaW5rIGV0Y2hEZWJ1Z0Jvb2xlYW4JCSBEZWJ1Z0Jvb2xlYW4KKyAgICBFdGNoSGlMaW5rIGV0Y2hEZWJ1Z051bWJlcgkJIERlYnVnCisgICAgRXRjaEhpTGluayBldGNoRGVidWdTcGVjaWFsCQkgRGVidWdTcGVjaWFsCisgICAgRXRjaEhpTGluayBldGNoRGVidWdTcGVjaWFsQ2hhcmFjdGVyIERlYnVnU3BlY2lhbAorICAgIEV0Y2hIaUxpbmsgZXRjaERlYnVnQ2hhcmFjdGVyCSBEZWJ1Z1N0cmluZworICAgIEV0Y2hIaUxpbmsgZXRjaERlYnVnUGFyZW4JCSBEZWJ1ZworCisgICAgRXRjaEhpTGluayBEZWJ1Z1N0cmluZwkJIFN0cmluZworICAgIEV0Y2hIaUxpbmsgRGVidWdTcGVjaWFsCQkgU3BlY2lhbAorICAgIEV0Y2hIaUxpbmsgRGVidWdCb29sZWFuCQkgQm9vbGVhbgorICAgIEV0Y2hIaUxpbmsgRGVidWdUeXBlCQkgVHlwZQorICBlbmRpZgorZW5kaWYKKworaWYgZXhpc3RzKCJldGNoX21hcmtfYnJhY2VzX2luX3BhcmVuc19hc19lcnJvcnMiKQorICBzeW4gbWF0Y2ggZXRjaEluUGFyZW4JCSBjb250YWluZWQgIlt7fV0iCisgIEV0Y2hIaUxpbmsgZXRjaEluUGFyZW4JZXRjaEVycm9yCisgIHN5biBjbHVzdGVyIGV0Y2hUb3AgYWRkPWV0Y2hJblBhcmVuCitlbmRpZgorCisiIGNhdGNoIGVycm9ycyBjYXVzZWQgYnkgd3JvbmcgcGFyZW50aGVzaXMKK3N5biByZWdpb24gIGV0Y2hQYXJlblQgIHRyYW5zcGFyZW50IG1hdGNoZ3JvdXA9ZXRjaFBhcmVuICBzdGFydD0iKCIgIGVuZD0iKSIgY29udGFpbnM9QGV0Y2hUb3AsZXRjaFBhcmVuVDEKK3N5biByZWdpb24gIGV0Y2hQYXJlblQxIHRyYW5zcGFyZW50IG1hdGNoZ3JvdXA9ZXRjaFBhcmVuMSBzdGFydD0iKCIgZW5kPSIpIiBjb250YWlucz1AZXRjaFRvcCxldGNoUGFyZW5UMiBjb250YWluZWQKK3N5biByZWdpb24gIGV0Y2hQYXJlblQyIHRyYW5zcGFyZW50IG1hdGNoZ3JvdXA9ZXRjaFBhcmVuMiBzdGFydD0iKCIgZW5kPSIpIiBjb250YWlucz1AZXRjaFRvcCxldGNoUGFyZW5UICBjb250YWluZWQKK3N5biBtYXRjaCAgIGV0Y2hQYXJlbkVycm9yICAgICAgICIpIgorIiBjYXRjaCBlcnJvcnMgY2F1c2VkIGJ5IHdyb25nIHNxdWFyZSBwYXJlbnRoZXNpcworc3luIHJlZ2lvbiAgZXRjaFBhcmVuVCAgdHJhbnNwYXJlbnQgbWF0Y2hncm91cD1ldGNoUGFyZW4gIHN0YXJ0PSJcWyIgIGVuZD0iXF0iIGNvbnRhaW5zPUBldGNoVG9wLGV0Y2hQYXJlblQxCitzeW4gcmVnaW9uICBldGNoUGFyZW5UMSB0cmFuc3BhcmVudCBtYXRjaGdyb3VwPWV0Y2hQYXJlbjEgc3RhcnQ9IlxbIiBlbmQ9IlxdIiBjb250YWlucz1AZXRjaFRvcCxldGNoUGFyZW5UMiBjb250YWluZWQKK3N5biByZWdpb24gIGV0Y2hQYXJlblQyIHRyYW5zcGFyZW50IG1hdGNoZ3JvdXA9ZXRjaFBhcmVuMiBzdGFydD0iXFsiIGVuZD0iXF0iIGNvbnRhaW5zPUBldGNoVG9wLGV0Y2hQYXJlblQgIGNvbnRhaW5lZAorc3luIG1hdGNoICAgZXRjaFBhcmVuRXJyb3IgICAgICAgIlxdIgorCitFdGNoSGlMaW5rIGV0Y2hQYXJlbkVycm9yICAgICAgIGV0Y2hFcnJvcgorCitpZiAhZXhpc3RzKCJldGNoX21pbmxpbmVzIikKKyAgbGV0IGV0Y2hfbWlubGluZXMgPSAxMAorZW5kaWYKK2V4ZWMgInN5biBzeW5jIGNjb21tZW50IGV0Y2hDb21tZW50IG1pbmxpbmVzPSIgLiBldGNoX21pbmxpbmVzCisKKyIgVGhlIGRlZmF1bHQgaGlnaGxpZ2h0aW5nLgoraWYgdmVyc2lvbiA+PSA1MDggfHwgIWV4aXN0cygiZGlkX2V0Y2hfc3luX2luaXRzIikKKyAgaWYgdmVyc2lvbiA8IDUwOAorICAgIGxldCBkaWRfZXRjaF9zeW5faW5pdHMgPSAxCisgIGVuZGlmCisgIEV0Y2hIaUxpbmsgZXRjaEZ1bmNEZWYJCUZ1bmN0aW9uCisgIEV0Y2hIaUxpbmsgZXRjaFZhckFyZyAgICAgICAgICAgICAgICAgRnVuY3Rpb24KKyAgRXRjaEhpTGluayBldGNoQnJhY2VzCQkJRnVuY3Rpb24KKyAgRXRjaEhpTGluayBldGNoQnJhbmNoCQkJQ29uZGl0aW9uYWwKKyAgRXRjaEhpTGluayBldGNoVXNlckxhYmVsUmVmCQlldGNoVXNlckxhYmVsCisgIEV0Y2hIaUxpbmsgZXRjaExhYmVsCQkJTGFiZWwKKyAgRXRjaEhpTGluayBldGNoVXNlckxhYmVsCQlMYWJlbAorICBFdGNoSGlMaW5rIGV0Y2hFeGNlcHRpb25zCQlFeGNlcHRpb24KKyAgRXRjaEhpTGluayBldGNoTWV0aG9kRGVjbAkJZXRjaFN0b3JhZ2VDbGFzcworICBFdGNoSGlMaW5rIGV0Y2hCb29sZWFuCQlCb29sZWFuCisgIEV0Y2hIaUxpbmsgZXRjaFNwZWNpYWwJCVNwZWNpYWwKKyAgRXRjaEhpTGluayBldGNoU3BlY2lhbEVycm9yCQlFcnJvcgorICBFdGNoSGlMaW5rIGV0Y2hTcGVjaWFsQ2hhckVycm9yCUVycm9yCisgIEV0Y2hIaUxpbmsgZXRjaFN0cmluZwkJCVN0cmluZworICBFdGNoSGlMaW5rIGV0Y2hDaGFyYWN0ZXIJCUNoYXJhY3RlcgorICBFdGNoSGlMaW5rIGV0Y2hTcGVjaWFsQ2hhcgkJU3BlY2lhbENoYXIKKyAgRXRjaEhpTGluayBldGNoTnVtYmVyCQkJTnVtYmVyCisgIEV0Y2hIaUxpbmsgZXRjaEVycm9yCQkJRXJyb3IKKyAgRXRjaEhpTGluayBldGNoU3RyaW5nRXJyb3IJCUVycm9yCisgIEV0Y2hIaUxpbmsgZXRjaFN0YXRlbWVudAkJU3RhdGVtZW50CisgIEV0Y2hIaUxpbmsgZXRjaE9wZXJhdG9yCQlPcGVyYXRvcgorICBFdGNoSGlMaW5rIGV0Y2hDb21tZW50CQlDb21tZW50CisgIEV0Y2hIaUxpbmsgZXRjaERvY0NvbW1lbnQJCUNvbW1lbnQKKyAgRXRjaEhpTGluayBldGNoTGluZUNvbW1lbnQJCUNvbW1lbnQKKyAgRXRjaEhpTGluayBldGNoQ29uc3RhbnQJCUNvbnN0YW50CisgIEV0Y2hIaUxpbmsgZXRjaFR5cGVkZWYJCVR5cGVkZWYKKyAgRXRjaEhpTGluayBldGNoVG9kbwkJCVRvZG8KKyAgRXRjaEhpTGluayBldGNoQW5ub3RhdGlvbiAgICAgICAgICAgICBQcmVQcm9jCisKKyAgRXRjaEhpTGluayBldGNoQ29tbWVudFRpdGxlCQlTcGVjaWFsQ29tbWVudAorICBFdGNoSGlMaW5rIGV0Y2hEb2NUYWdzCQlTcGVjaWFsCisgIEV0Y2hIaUxpbmsgZXRjaERvY1BhcmFtCQlGdW5jdGlvbgorICBFdGNoSGlMaW5rIGV0Y2hEb2NTZWVUYWdQYXJhbQkJRnVuY3Rpb24KKyAgRXRjaEhpTGluayBldGNoQ29tbWVudFN0YXIJCWV0Y2hDb21tZW50CisKKyAgRXRjaEhpTGluayBldGNoVHlwZQkJCVR5cGUKKyAgRXRjaEhpTGluayBldGNoRXh0ZXJuYWwJCUluY2x1ZGUKKworICBFdGNoSGlMaW5rIGh0bWxDb21tZW50CQlTcGVjaWFsCisgIEV0Y2hIaUxpbmsgaHRtbENvbW1lbnRQYXJ0CQlTcGVjaWFsCisgIEV0Y2hIaUxpbmsgZXRjaFNwYWNlRXJyb3IJCUVycm9yCitlbmRpZgorCitkZWxjb21tYW5kIEV0Y2hIaUxpbmsKKworbGV0IGI6Y3VycmVudF9zeW50YXggPSAiZXRjaCIKKworaWYgbWFpbl9zeW50YXggPT0gJ2V0Y2gnCisgIHVubGV0IG1haW5fc3ludGF4CitlbmRpZgorCitsZXQgYjpzcGVsbF9vcHRpb25zPSJjb250YWluZWQiCisKKyIgdmltOiB0cz04CmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9ldGNoLWFkZGluL0Fzc2VtYmx5SW5mby5jcyBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL2V0Y2gtYWRkaW4vQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNGMzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9ldGNoLWFkZGluL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDY3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7DQorDQorLy8NCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIA0KKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KKy8vDQorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJWaXN1YWwgU3R1ZGlvIFBsdWdpbiBGb3IgRXRjaCIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiVmlzdWFsIFN0dWRpbyBQbHVnaW4gRm9yIEV0Y2giKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkNpc2NvIFN5c3RlbXMsIEluYyIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJFdGNoIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IKkgQ2lzY28gU3lzdGVtcyAyMDA4IildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQ0KKw0KKy8vDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbiANCisvLyAgICAgIFJldmlzaW9uDQorLy8gICAgICBCdWlsZCBOdW1iZXINCisvLw0KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMgDQorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoNCisNCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0NCisNCisvLw0KKy8vIEluIG9yZGVyIHRvIHNpZ24geW91ciBhc3NlbWJseSB5b3UgbXVzdCBzcGVjaWZ5IGEga2V5IHRvIHVzZS4gUmVmZXIgdG8gdGhlIA0KKy8vIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGFzc2VtYmx5IHNpZ25pbmcuDQorLy8NCisvLyBVc2UgdGhlIGF0dHJpYnV0ZXMgYmVsb3cgdG8gY29udHJvbCB3aGljaCBrZXkgaXMgdXNlZCBmb3Igc2lnbmluZy4gDQorLy8NCisvLyBOb3RlczogDQorLy8gICAoKikgSWYgbm8ga2V5IGlzIHNwZWNpZmllZCAtIHRoZSBhc3NlbWJseSBjYW5ub3QgYmUgc2lnbmVkLg0KKy8vICAgKCopIEtleU5hbWUgcmVmZXJzIHRvIGEga2V5IHRoYXQgaGFzIGJlZW4gaW5zdGFsbGVkIGluIHRoZSBDcnlwdG8gU2VydmljZQ0KKy8vICAgICAgIFByb3ZpZGVyIChDU1ApIG9uIHlvdXIgbWFjaGluZS4gDQorLy8gICAoKikgSWYgdGhlIGtleSBmaWxlIGFuZCBhIGtleSBuYW1lIGF0dHJpYnV0ZXMgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGUgDQorLy8gICAgICAgZm9sbG93aW5nIHByb2Nlc3Npbmcgb2NjdXJzOg0KKy8vICAgICAgICgxKSBJZiB0aGUgS2V5TmFtZSBjYW4gYmUgZm91bmQgaW4gdGhlIENTUCAtIHRoYXQga2V5IGlzIHVzZWQuDQorLy8gICAgICAgKDIpIElmIHRoZSBLZXlOYW1lIGRvZXMgbm90IGV4aXN0IGFuZCB0aGUgS2V5RmlsZSBkb2VzIGV4aXN0LCB0aGUga2V5IA0KKy8vICAgICAgICAgICBpbiB0aGUgZmlsZSBpcyBpbnN0YWxsZWQgaW50byB0aGUgQ1NQIGFuZCB1c2VkLg0KKy8vICAgKCopIERlbGF5IFNpZ25pbmcgaXMgYW4gYWR2YW5jZWQgb3B0aW9uIC0gc2VlIHRoZSBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsNCisvLyAgICAgICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMuDQorLy8NCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUtleU5hbWUoIiIpXQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL2V0Y2gtYWRkaW4vQ29tbWFuZEJhci5yZXN4IGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vZXRjaC1hZGRpbi9Db21tYW5kQmFyLnJlc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmMTJhNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL2V0Y2gtYWRkaW4vQ29tbWFuZEJhci5yZXN4CkBAIC0wLDAgKzEsMTAzMiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorIDxyb290PgorICA8IS0tIAorICAgIE1pY3Jvc29mdCBSZXNYIFNjaGVtYSAKKyAgICAKKyAgICBWZXJzaW9uIDIuMAorICAgIAorICAgIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgZm9ybWF0IGlzIHRvIGFsbG93IGEgc2ltcGxlIFhNTCBmb3JtYXQgCisgICAgdGhhdCBpcyBtb3N0bHkgaHVtYW4gcmVhZGFibGUuIFRoZSBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nIG9mIHRoZSAKKyAgICB2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAorICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcy4KKyAgICAKKyAgICBFeGFtcGxlOgorICAgIAorICAgIC4uLiBhZG8ubmV0L1hNTCBoZWFkZXJzICYgc2NoZW1hIC4uLgorICAgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPnRleHQvbWljcm9zb2Z0LXJlc3g8L3Jlc2hlYWRlcj4KKyAgICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjIuMDwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgorICAgIDxkYXRhIG5hbWU9Ik5hbWUxIj48dmFsdWU+dGhpcyBpcyBteSBsb25nIHN0cmluZzwvdmFsdWU+PGNvbW1lbnQ+dGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+PC9kYXRhPgorICAgIDxkYXRhIG5hbWU9IkNvbG9yMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuQ29sb3IsIFN5c3RlbS5EcmF3aW5nIj5CbHVlPC9kYXRhPgorICAgIDxkYXRhIG5hbWU9IkJpdG1hcDEiIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQiPgorICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc2VyaWFsaXplZCAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KKyAgICA8L2RhdGE+CisgICAgPGRhdGEgbmFtZT0iSWNvbjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkljb24sIFN5c3RlbS5EcmF3aW5nIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0Ij4KKyAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBieXRlIGFycmF5IGZvcm0gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgorICAgICAgICA8Y29tbWVudD5UaGlzIGlzIGEgY29tbWVudDwvY29tbWVudD4KKyAgICA8L2RhdGE+CisgICAgICAgICAgICAgICAgCisgICAgVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAorICAgIG5hbWUvdmFsdWUgcGFpcnMuCisgICAgCisgICAgRWFjaCBkYXRhIHJvdyBjb250YWlucyBhIG5hbWUsIGFuZCB2YWx1ZS4gVGhlIHJvdyBhbHNvIGNvbnRhaW5zIGEgCisgICAgdHlwZSBvciBtaW1ldHlwZS4gVHlwZSBjb3JyZXNwb25kcyB0byBhIC5ORVQgY2xhc3MgdGhhdCBzdXBwb3J0IAorICAgIHRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCisgICAgQ2xhc3NlcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhpcyBhcmUgc2VyaWFsaXplZCBhbmQgc3RvcmVkIHdpdGggdGhlIAorICAgIG1pbWV0eXBlIHNldC4KKyAgICAKKyAgICBUaGUgbWltZXR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzLCBhbmQgdGVsbHMgdGhlIAorICAgIFJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKKyAgICBleHRlbnNpYmxlLiBGb3IgYSBnaXZlbiBtaW1ldHlwZSB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHk6CisgICAgCisgICAgTm90ZSAtIGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCBpcyB0aGUgZm9ybWF0IAorICAgIHRoYXQgdGhlIFJlc1hSZXNvdXJjZVdyaXRlciB3aWxsIGdlbmVyYXRlLCBob3dldmVyIHRoZSByZWFkZXIgY2FuIAorICAgIHJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KKyAgICAKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCisgICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5CaW5hcnkuQmluYXJ5Rm9ybWF0dGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisgICAgCisgICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3Quc29hcC5iYXNlNjQKKyAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKKyAgICAgICAgICAgIDogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlNvYXAuU29hcEZvcm1hdHRlcgorICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgorCisgICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYnl0ZWFycmF5LmJhc2U2NAorICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbnRvIGEgYnl0ZSBhcnJheSAKKyAgICAgICAgICAgIDogdXNpbmcgYSBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuVHlwZUNvbnZlcnRlcgorICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgorICAgIC0tPgorICA8eHNkOnNjaGVtYSBpZD0icm9vdCIgeG1sbnM9IiIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiPgorICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290IiBtc2RhdGE6SXNEYXRhU2V0PSJ0cnVlIj4KKyAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0YWRhdGEiPgorICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5Ij4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSI0IiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc2hlYWRlciI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8L3hzZDplbGVtZW50PgorICA8L3hzZDpzY2hlbWE+CisgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPgorICAgIDx2YWx1ZT50ZXh0L21pY3Jvc29mdC1yZXN4PC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+CisgICAgPHZhbHVlPjIuMDwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+CisgICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPgorICAgIDx2YWx1ZT5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5PC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxkYXRhIG5hbWU9ImVuQWN0aW9uIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+QWN0aW9uPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlbkFkZGlucyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkFkZGluczwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5CdWlsZCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkJ1aWxkPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlbkNsYXNzIERpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5DbGFzcyBEaWFncmFtPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlbkNvbW11bml0eSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkNvbW11bml0eTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5EYXRhIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGF0YTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5EYXRhYmFzZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRhdGFiYXNlPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlbkRhdGFiYXNlIERpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EYXRhYmFzZSBEaWFncmFtPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlbkRlYnVnIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGVidWc8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuRGlhZ3JhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRpYWdyYW08L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuRWRpdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkVkaXQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuRmlsZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkZpbGU8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuRm9ybWF0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Rm9ybWF0PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlbkZyYW1lcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkZyYW1lczwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5IZWxwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+SGVscDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5JbWFnZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkltYWdlPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlbkxheW91dCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkxheW91dDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5NYWNyb3MiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5NYWNyb3M8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuUHJvamVjdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlByb2plY3Q8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuUXVlcnkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5RdWVyeTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5RdWVyeSBEZXNpZ25lciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlF1ZXJ5IERlc2lnbmVyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlblJlZmFjdG9yIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UmVmYWN0b3I8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuUmVzb3VyY2VzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UmVzb3VyY2VzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlblNjaGVtYSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlNjaGVtYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5TdHlsZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5TdHlsZXM8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuVGVhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlRlYW08L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuVGFibGUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5UYWJsZTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZW5UYWJsZSBEZXNpZ25lciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlRhYmxlIERlc2lnbmVyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlblRlc3QiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5UZXN0PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlblRvb2xzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+VG9vbHM8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuVmlldyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlZpZXc8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVuV2luZG93IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+V2luZG93PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlblhNTCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlhNTDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFBY3Rpb24iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7mk43kvZw8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphQWRkaW5zIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44Ki44OJ44Kk44OzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYUJ1aWxkIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44OT44Or44OJPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYUNsYXNzIERpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jgq/jg6njgrkg44OA44Kk44Ki44Kw44Op44OgPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYUNvbW11bml0eSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuOCs+ODn+ODpeODi+ODhuOCozwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFEYXRhIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44OH44O844K/PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYURhdGFiYXNlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44OH44O844K/44OZ44O844K5PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYURhdGFiYXNlIERpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg4fjg7zjgr/jg5njg7zjgrkg44OA44Kk44Ki44Kw44Op44OgPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYURlYnVnIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44OH44OQ44OD44KwPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYURpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg4DjgqTjgqLjgrDjg6njg6A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphRWRpdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPue3qOmbhjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFGaWxlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44OV44Kh44Kk44OrPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYUZvcm1hdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuabuOW8jzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFGcmFtZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg5Xjg6zjg7zjg6A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphSGVscCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuODmOODq+ODlzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFJbWFnZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuOCpOODoeODvOOCuDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFMYXlvdXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg6zjgqTjgqLjgqbjg4g8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphTWFjcm9zIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44Oe44Kv44OtPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYVByb2plY3QiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg5fjg63jgrjjgqfjgq/jg4g8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphUXVlcnkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jgq/jgqjjg6o8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphUXVlcnkgRGVzaWduZXIiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jgq/jgqjjg6og44OH44K244Kk44OKPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYVJlZmFjdG9yIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44Oq44OV44Kh44Kv44K/PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYVJlc291cmNlcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuODquOCveODvOOCuTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFTY2hlbWEiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jgrnjgq3jg7zjg548L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphU3R5bGVzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+44K544K/44Kk44OrPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYVRlYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg4Hjg7zjg6A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphVGFibGUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg4bjg7zjg5bjg6s8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphVGFibGUgRGVzaWduZXIiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg4bjg7zjg5bjg6sg44OH44K244Kk44OKPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJqYVRlc3QiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg4bjgrnjg4g8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphVG9vbHMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jg4Tjg7zjg6s8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphVmlldyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuihqOekujwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iamFXaW5kb3ciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7jgqbjgqPjg7Pjg4njgqY8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImphWE1MIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+WE1MPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZUFjdGlvbiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkFrdGlvbjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVBZGRpbnMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5BZGQtSW5zPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZUJ1aWxkIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RXJzdGVsbGVuPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZUNsYXNzIERpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5LbGFzc2VuZGlhZ3JhbW08L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlQ29tbXVuaXR5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Q29tbXVuaXR5PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZURhdGEiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EYXRlbjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVEYXRhYmFzZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRhdGVuYmFuazwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVEYXRhYmFzZSBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGF0ZW5iYW5rZGlhZ3JhbW08L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlRGVidWciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EZWJ1Z2dlbjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGlhZ3JhbW08L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlRWRpdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkJlYXJiZWl0ZW48L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlRmlsZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRhdGVpPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZUZvcm1hdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkZvcm1hdDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVGcmFtZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5SYWhtZW48L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlSGVscCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkhpbGZlPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZUltYWdlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+QmlsZDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVMYXlvdXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5MYXlvdXQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlTWFjcm9zIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+TWFrcm9zPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZVByb2plY3QiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5Qcm9qZWt0PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZVF1ZXJ5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UXVlcnk8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlUXVlcnkgRGVzaWduZXIiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5BYmZyYWdlLURlc2lnbmVyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZVJlZmFjdG9yIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+VW1nZXN0YWx0ZW48L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlUmVzb3VyY2VzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UmVzc291cmNlbjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVTY2hlbWEiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5TY2hlbWE8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlU3R5bGVzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Rm9ybWF0ZTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVUZWFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+VGVhbTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVUYWJsZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlRhYmVsbGU8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlVGFibGUgRGVzaWduZXIiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5UYWJlbGxlbi1EZXNpZ25lcjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZGVUZXN0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+VGVzdGVuPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZVRvb2xzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RXh0cmFzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZVZpZXciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5BbnNpY2h0PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJkZVdpbmRvdyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkZlbnN0ZXI8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImRlWE1MIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+WE1MPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc0FjdGlvbiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkFjY2nDs248L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzQWRkaW5zIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Q29tcGxlbWVudG9zPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc0J1aWxkIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+R2VuZXJhcjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNDbGFzcyBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGlhZ3JhbWEgZGUgY2xhc2U8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzQ29tbXVuaXR5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Q29tdW5pZGFkPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc0RhdGEiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EYXRvczwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNEYXRhYmFzZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkJhc2UgZGUgZGF0b3M8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzRGF0YWJhc2UgRGlhZ3JhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRpYWdyYW1hIGRlIGJhc2UgZGUgZGF0b3M8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzRGVidWciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EZXB1cmFyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc0RpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EaWFncmFtYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNFZGl0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RWRpdGFyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc0ZpbGUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5BcmNoaXZvPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc0Zvcm1hdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkZvcm1hdG88L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzRnJhbWVzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+TWFyY29zPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc0hlbHAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5BeXVkYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNJbWFnZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkltYWdlbjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNMYXlvdXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EaXNlw7FvPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc01hY3JvcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPk1hY3JvczwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNQcm9qZWN0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UHJveWVjdG88L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzUXVlcnkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5Db25zdWx0YTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNRdWVyeSBEZXNpZ25lciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRpc2XDsWFkb3IgZGUgY29uc3VsdGFzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc1JlZmFjdG9yIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UmVmYWN0b3JpemFyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc1Jlc291cmNlcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlJlY3Vyc29zPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc1NjaGVtYSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkVzcXVlbWE8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzU3R5bGVzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RXN0aWxvczwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNUZWFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RXF1aXBvPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc1RhYmxlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+VGFibGE8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzVGFibGUgRGVzaWduZXIiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EaXNlw7FhZG9yIGRlIHRhYmxhczwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNUZXN0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UHJ1ZWJhPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc1Rvb2xzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+SGVycmFtaWVudGFzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJlc1ZpZXciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5WZXI8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImVzV2luZG93IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+VmVudGFuYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZXNYTUwiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5YTUw8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyQWN0aW9uIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+QWN0aW9uPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmckFkZGlucyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkNvbXBsw6ltZW50czwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJCdWlsZCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkfDqW7DqXJlcjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJDbGFzcyBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGlhZ3JhbW1lIGRlIGNsYXNzZXM8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyQ29tbXVuaXR5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Q29tbXVuYXV0w6k8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyRGF0YSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRvbm7DqWVzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmckRhdGFiYXNlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+QmFzZSBkZSBkb25uw6llczwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJEYXRhYmFzZSBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+U2Now6ltYSBkZSBiYXNlIGRlIGRvbm7DqWVzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmckRlYnVnIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RMOpYm9ndWVyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmckRpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5TY2jDqW1hPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmckVkaXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5Nb2RpZmllcjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJGaWxlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RmljaGllcjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJGb3JtYXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5Gb3JtYXQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyRnJhbWVzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RnJhbWVzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmckhlbHAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT4/PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmckltYWdlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+SW1hZ2U8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyTGF5b3V0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGlzcG9zaXRpb248L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyTWFjcm9zIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+TWFjcm9zPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmclByb2plY3QiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5Qcm9qZXQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyUXVlcnkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5SZXF1w6p0ZTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJRdWVyeSBEZXNpZ25lciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkNvbmNlcHRldXIgZGUgcmVxdcOqdGVzPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmclJlZmFjdG9yIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UmVmYWN0b3Jpc2VyPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmclJlc291cmNlcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlJlc3NvdXJjZXM8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyU2NoZW1hIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+U2Now6ltYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJTdHlsZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5TdHlsZXM8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyVGVhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPsOpcXVpcGU8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyVGFibGUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5UYWJsZWF1PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJmclRhYmxlIERlc2lnbmVyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Q29uY2VwdGV1ciBkZSB0YWJsZXM8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyVGVzdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlRlc3Q8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyVG9vbHMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5PdXRpbHM8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImZyVmlldyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkFmZmljaGFnZTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJXaW5kb3ciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5GZW7DqnRyZTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iZnJYTUwiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5YTUw8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0QWN0aW9uIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+QXppb25lPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdEFkZGlucyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkNvbXBvbmVudGkgYWdnaXVudGl2aTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRCdWlsZCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkdlbmVyYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRDbGFzcyBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGlhZ3JhbW1hIGNsYXNzaTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRDb21tdW5pdHkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5Db211bml0w6A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0RGF0YSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRhdGk8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0RGF0YWJhc2UiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5EYXRhYmFzZTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXREYXRhYmFzZSBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGlhZ3JhbW1hIGRhdGFiYXNlPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdERlYnVnIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+RGVidWc8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0RGlhZ3JhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkRpYWdyYW1tYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRFZGl0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+TW9kaWZpY2E8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0RmlsZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkZpbGU8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0Rm9ybWF0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+Rm9ybWF0bzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRGcmFtZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5GcmFtZTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRIZWxwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+PzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRJbWFnZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkltbWFnaW5lPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdExheW91dCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkxheW91dDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRNYWNyb3MiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5NYWNybzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRQcm9qZWN0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+UHJvZ2V0dG88L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0UXVlcnkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5RdWVyeTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRRdWVyeSBEZXNpZ25lciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlByb2dldHRhemlvbmUgcXVlcnk8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0UmVmYWN0b3IiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5FZmZldHR1YSByZWZhY3RvcmluZzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRSZXNvdXJjZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5SaXNvcnNlPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdFNjaGVtYSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlNjaGVtYTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRTdHlsZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5TdGlsaTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRUZWFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+VGVhbTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iaXRUYWJsZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlRhYmVsbGE8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0VGFibGUgRGVzaWduZXIiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5Qcm9nZXR0YXppb25lIHRhYmVsbGU8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9Iml0VGVzdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlByb3ZhPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdFRvb2xzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+U3RydW1lbnRpPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdFZpZXciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5WaXN1YWxpenphPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdFdpbmRvdyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPkZpbmVzdHJhPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJpdFhNTCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlhNTDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29BY3Rpb24iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7snpHsl4U8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvQWRkaW5zIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7LaU6rCAIOq4sOuKpTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29CdWlsZCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuu5jOuTnDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29DbGFzcyBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7YG0656Y7IqkIOuLpOydtOyWtOq3uOueqDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29Db21tdW5pdHkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7su6TrrqTri4jti7A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvRGF0YSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuuNsOydtO2EsDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29EYXRhYmFzZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuuNsOydtO2EsOuyoOydtOyKpDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29EYXRhYmFzZSBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+642w7J207YSw67Kg7J207IqkIOuLpOydtOyWtOq3uOueqDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29EZWJ1ZyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuuUlOuyhOq3uDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29EaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+64uk7J207Ja06re4656oPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb0VkaXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7tjrjsp5E8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvRmlsZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPu2MjOydvDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29Gb3JtYXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7shJzsi508L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvRnJhbWVzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7ZSE66CI7J6EPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb0hlbHAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7rj4Tsm4Drp5A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvSW1hZ2UiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7snbTrr7jsp4A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvTGF5b3V0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+66CI7J207JWE7JuDPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb01hY3JvcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuunpO2BrOuhnDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29Qcm9qZWN0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7ZSE66Gc7KCd7Yq4PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1F1ZXJ5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7L+866asPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1F1ZXJ5IERlc2lnbmVyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7L+866asIOuUlOyekOydtOuEiDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29SZWZhY3RvciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuumrO2Mqe2EsOungTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29SZXNvdXJjZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7rpqzshozsiqQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvU2NoZW1hIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7Iqk7YKk66eIPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1N0eWxlcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuyKpO2DgOydvDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29UZWFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7YyAPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1RhYmxlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7YWM7J2067iUPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1RhYmxlIERlc2lnbmVyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7YWM7J2067iUIOuUlOyekOydtOuEiDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0ia29UZXN0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7YWM7Iqk7Yq4PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1Rvb2xzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+64+E6rWsPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1ZpZXciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7rt7A8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9ImtvV2luZG93IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+7LC9PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJrb1hNTCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPlhNTDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTQWN0aW9uIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5pON5L2cPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNBZGRpbnMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7lpJbmjqXnqIvluo88L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU0J1aWxkIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+55Sf5oiQPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNDbGFzcyBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+57G75YWz57O75Zu+PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNDb21tdW5pdHkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7npL7ljLo8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU0RhdGEiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7mlbDmja48L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU0RhdGFiYXNlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5pWw5o2u5bqTPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNEYXRhYmFzZSBEaWFncmFtIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5pWw5o2u5bqT5YWz57O75Zu+PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNEZWJ1ZyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuiwg+ivlTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTRGlhZ3JhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuWFs+ezu+WbvjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTRWRpdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPue8lui+kTwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTRmlsZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuaWh+S7tjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTRm9ybWF0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5qC85byPPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNGcmFtZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7moYbmnrY8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU0hlbHAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7luK7liqk8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU0ltYWdlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5Zu+5YOPPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNMYXlvdXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7luIPlsYA8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU01hY3JvcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuWujzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTUHJvamVjdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPumhueebrjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTUXVlcnkiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7mn6Xor6I8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU1F1ZXJ5IERlc2lnbmVyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5p+l6K+i6K6+6K6h5ZmoPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNSZWZhY3RvciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPumHjeaehDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTUmVzb3VyY2VzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+6LWE5rqQPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNTY2hlbWEiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7mnrbmnoQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU1N0eWxlcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuagt+W8jzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTVGVhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuW3peS9nOe7hDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTVGFibGUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7ooag8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIU1RhYmxlIERlc2lnbmVyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+6KGo6K6+6K6h5ZmoPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNUZXN0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5rWL6K+VPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNUb29scyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuW3peWFtzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTVmlldyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuinhuWbvjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hTV2luZG93IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+56qX5Y+jPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFNYTUwiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT5YTUw8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVEFjdGlvbiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuWLleS9nDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUQWRkaW5zIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5aKe55uK6ZuGPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFRCdWlsZCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuW7uue9rjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUQ2xhc3MgRGlhZ3JhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPumhnuWIpeWcluihqDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUQ29tbXVuaXR5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+56S+576kPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFREYXRhIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+6LOH5paZPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFREYXRhYmFzZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuizh+aWmeW6qzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hURGF0YWJhc2UgRGlhZ3JhbSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuizh+aWmeW6q+WcluihqDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hURGVidWciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7lgbXpjK88L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVERpYWdyYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7lnJbooag8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVEVkaXQiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7nt6jovK88L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVEZpbGUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7mqpTmoYg8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVEZvcm1hdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuagvOW8jzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hURnJhbWVzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5qGG5p62PC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFRIZWxwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+6Kqq5piOPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFRJbWFnZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuW9seWDjzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUTGF5b3V0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+6YWN572uPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFRNYWNyb3MiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7lt6jpm4Y8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVFByb2plY3QiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7lsIjmoYg8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVFF1ZXJ5IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+5p+l6KmiPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFRRdWVyeSBEZXNpZ25lciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuafpeipouioreioiOW3peWFtzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUUmVmYWN0b3IiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7ph43mlbQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVFJlc291cmNlcyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuizh+a6kDwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUU2NoZW1hIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+57WQ5qeL5o+P6L+wPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFRTdHlsZXMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7mqKPlvI88L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVFRlYW0iIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7lsI/ntYQ8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVFRhYmxlIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+6LOH5paZ6KGoPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJ6aC1DSFRUYWJsZSBEZXNpZ25lciIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuizh+aWmeihqOioreioiOW3peWFtzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUVGVzdCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPua4rOippjwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUVG9vbHMiIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7lt6Xlhbc8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVFZpZXciIHhtbDpzcGFjZT0icHJlc2VydmUiPgorICAgIDx2YWx1ZT7mqqLoppY8L3ZhbHVlPgorICA8L2RhdGE+CisgIDxkYXRhIG5hbWU9InpoLUNIVFdpbmRvdyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CisgICAgPHZhbHVlPuimlueqlzwvdmFsdWU+CisgIDwvZGF0YT4KKyAgPGRhdGEgbmFtZT0iemgtQ0hUWE1MIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+WE1MPC92YWx1ZT4KKyAgPC9kYXRhPgorICA8ZGF0YSBuYW1lPSJTdHJpbmcxIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKyAgICA8dmFsdWU+SGVsbG88L3ZhbHVlPgorICA8L2RhdGE+Cis8L3Jvb3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9ldGNoLWFkZGluL0Nvbm5lY3QuY3MgYi9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9ldGNoLWFkZGluL0Nvbm5lY3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyYjZiNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL2V0Y2gtYWRkaW4vQ29ubmVjdC5jcwpAQCAtMCwwICsxLDI1MyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgRXh0ZW5zaWJpbGl0eTsKK3VzaW5nIEVudkRURTsKK3VzaW5nIEVudkRURTgwOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5Db21tYW5kQmFyczsKKworbmFtZXNwYWNlIEV0Y2gKK3sKKwkvLy8gPHN1bW1hcnk+VGhlIG9iamVjdCBmb3IgaW1wbGVtZW50aW5nIGFuIEFkZC1pbi48L3N1bW1hcnk+CisJLy8vIDxzZWVhbHNvIGNsYXNzPSdJRFRFeHRlbnNpYmlsaXR5MicgLz4KKyAgICBwdWJsaWMgY2xhc3MgQ29ubmVjdCA6IElEVEV4dGVuc2liaWxpdHkyLCBJRFRDb21tYW5kVGFyZ2V0CisJeworCQkvLy8gPHN1bW1hcnk+SW1wbGVtZW50cyB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBBZGQtaW4gb2JqZWN0LiBQbGFjZSB5b3VyIGluaXRpYWxpemF0aW9uIGNvZGUgd2l0aGluIHRoaXMgbWV0aG9kLjwvc3VtbWFyeT4KKwkJcHVibGljIENvbm5lY3QoKQorCQl7CisJCX0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaW5kTmFtZWRDb21tYW5kCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29tbWFuZE5hbWUiPmNvbW1hbmQgbmFtZSBvZiB0aGUgYWRkaW48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbW1hbmQiPnRoZSBjb21tYW5kIHRvIGZpbmQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBGaW5kTmFtZWRDb21tYW5kKHN0cmluZyBjb21tYW5kTmFtZSwgb3V0IENvbW1hbmQgY29tbWFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29tbWFuZHMgY29tbWFuZHMgPSBfYXBwbGljYXRpb25PYmplY3QuQ29tbWFuZHM7CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmRzLkl0ZW0oY29tbWFuZE5hbWUsIC0xKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tbWFuZCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworCQkvLy8gPHN1bW1hcnk+SW1wbGVtZW50cyB0aGUgT25Db25uZWN0aW9uIG1ldGhvZCBvZiB0aGUgSURURXh0ZW5zaWJpbGl0eTIgaW50ZXJmYWNlLiBSZWNlaXZlcyBub3RpZmljYXRpb24gdGhhdCB0aGUgQWRkLWluIGlzIGJlaW5nIGxvYWRlZC48L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gdGVybT0nYXBwbGljYXRpb24nPlJvb3Qgb2JqZWN0IG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uLjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gdGVybT0nY29ubmVjdE1vZGUnPkRlc2NyaWJlcyBob3cgdGhlIEFkZC1pbiBpcyBiZWluZyBsb2FkZWQuPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSB0ZXJtPSdhZGRJbkluc3QnPk9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBBZGQtaW4uPC9wYXJhbT4KKwkJLy8vIDxzZWVhbHNvIGNsYXNzPSdJRFRFeHRlbnNpYmlsaXR5MicgLz4KKwkJcHVibGljIHZvaWQgT25Db25uZWN0aW9uKG9iamVjdCBhcHBsaWNhdGlvbiwgZXh0X0Nvbm5lY3RNb2RlIGNvbm5lY3RNb2RlLCBvYmplY3QgYWRkSW5JbnN0LCByZWYgQXJyYXkgY3VzdG9tKQorCQl7CisJCQlfYXBwbGljYXRpb25PYmplY3QgPSAoRFRFMilhcHBsaWNhdGlvbjsKKwkJCV9hZGRJbkluc3RhbmNlID0gKEFkZEluKWFkZEluSW5zdDsKKworICAgICAgICAgICAgaWYgKGNvbm5lY3RNb2RlID09IEV4dGVuc2liaWxpdHkuZXh0X0Nvbm5lY3RNb2RlLmV4dF9jbV9TdGFydHVwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbW1hbmQgY29tbWFuZCwgY29tbWFuZFMsIGNvbW1hbmRDLCBjb21tYW5kWDsKKyAgICAgICAgICAgICAgICBDb21tYW5kQmFyIGl0ZW1DbWRCYXI7CisgICAgICAgICAgICAgICAgb2JqZWN0W10gY29udGV4dEdVSURTID0gbmV3IG9iamVjdFtdIHsgfTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbUNtZEJhciA9ICgoQ29tbWFuZEJhcnMpX2FwcGxpY2F0aW9uT2JqZWN0LkNvbW1hbmRCYXJzKVsiSXRlbSJdOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUNtZEJhciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94LlNob3coIkNhbm5vdCBnZXQgU29sdXRpb24gRXhwbG9yZXIgSXRlbSBtZW51YmFyIiwgIkVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9ucy5PSywgU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb24uRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgQ29tbWFuZCB3aXRoIG5hbWUgRXRjaCBhbmQgdGhlbiBhZGQgaXQgdG8gdGhlICJJdGVtIiBtZW51YmFyIGZvciB0aGUgU29sdXRpb25FeHBsb3JlcgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGaW5kTmFtZWRDb21tYW5kKCJFdGNoLkNvbm5lY3QuRXRjaCIsIG91dCBjb21tYW5kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gX2FwcGxpY2F0aW9uT2JqZWN0LkNvbW1hbmRzLkFkZE5hbWVkQ29tbWFuZChfYWRkSW5JbnN0YW5jZSwgIkV0Y2giLCAiRXRjaCAoQm90aCkiLCAiR2VuZXJhdGUgRXRjaCBiaW5kaW5ncyIsIHRydWUsIDYsIHJlZiBjb250ZXh0R1VJRFMsIChpbnQpdnNDb21tYW5kU3RhdHVzLnZzQ29tbWFuZFN0YXR1c1N1cHBvcnRlZCArIChpbnQpdnNDb21tYW5kU3RhdHVzLnZzQ29tbWFuZFN0YXR1c0VuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRCYXJDb250cm9sIGNiID0gY29tbWFuZC5BZGRDb250cm9sKGl0ZW1DbWRCYXIsIDQpIGFzIENvbW1hbmRCYXJDb250cm9sOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLkJlZ2luR3JvdXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGaW5kTmFtZWRDb21tYW5kKCJFdGNoLkNvbm5lY3QuRXRjaFMiLCBvdXQgY29tbWFuZFMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRTID0gX2FwcGxpY2F0aW9uT2JqZWN0LkNvbW1hbmRzLkFkZE5hbWVkQ29tbWFuZChfYWRkSW5JbnN0YW5jZSwgIkV0Y2hTIiwgIkV0Y2ggKFNlcnZlcikiLCAiRXhlY3V0ZXMgRXRjaCBzZXJ2ZXIgYmluZGluZyIsIHRydWUsIDM5LCByZWYgY29udGV4dEdVSURTLCAoaW50KXZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNTdXBwb3J0ZWQgKyAoaW50KXZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUy5BZGRDb250cm9sKGl0ZW1DbWRCYXIsIDUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGaW5kTmFtZWRDb21tYW5kKCJFdGNoLkNvbm5lY3QuRXRjaEMiLCBvdXQgY29tbWFuZEMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRDID0gX2FwcGxpY2F0aW9uT2JqZWN0LkNvbW1hbmRzLkFkZE5hbWVkQ29tbWFuZChfYWRkSW5JbnN0YW5jZSwgIkV0Y2hDIiwgIkV0Y2ggKENsaWVudCkiLCAiRXhlY3V0ZXMgRXRjaCBjbGllbnQgYmluZGluZyIsIHRydWUsIDQxLCByZWYgY29udGV4dEdVSURTLCAoaW50KXZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNTdXBwb3J0ZWQgKyAoaW50KXZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQy5BZGRDb250cm9sKGl0ZW1DbWRCYXIsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFGaW5kTmFtZWRDb21tYW5kKCJFdGNoLkNvbm5lY3QuRXRjaE0iLCBvdXQgY29tbWFuZE0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNID0gX2FwcGxpY2F0aW9uT2JqZWN0LkNvbW1hbmRzLkFkZE5hbWVkQ29tbWFuZChfYWRkSW5JbnN0YW5jZSwgIkV0Y2hNIiwgIkV0Y2ggTWl4aW4gKEJvdGgpIiwgIkV4ZWN1dGVzIEV0Y2ggTWl4aW4gYmluZGluZ3MiLCB0cnVlLCA2LCByZWYgY29udGV4dEdVSURTLCAoaW50KSB2c0NvbW1hbmRTdGF0dXMudnNDb21tYW5kU3RhdHVzU3VwcG9ydGVkICsgKGludCkgdnNDb21tYW5kU3RhdHVzLnZzQ29tbWFuZFN0YXR1c0VuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNLkFkZENvbnRyb2woaXRlbUNtZEJhciwgNyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZighRmluZE5hbWVkQ29tbWFuZCgiRXRjaC5Db25uZWN0LkV0Y2hNUyIsIG91dCBjb21tYW5kTVMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNUyA9IF9hcHBsaWNhdGlvbk9iamVjdC5Db21tYW5kcy5BZGROYW1lZENvbW1hbmQoX2FkZEluSW5zdGFuY2UsICJFdGNoTVMiLCAiRXRjaCBNaXhpbiAoU2VydmVyKSIsICJFeGVjdXRlcyBFdGNoIE1peGluIHNlcnZlciBiaW5kaW5nIiwgdHJ1ZSwgMzksIHJlZiBjb250ZXh0R1VJRFMsIChpbnQpIHZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNTdXBwb3J0ZWQgKyAoaW50KSB2c0NvbW1hbmRTdGF0dXMudnNDb21tYW5kU3RhdHVzRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1TLkFkZENvbnRyb2woaXRlbUNtZEJhciwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZighRmluZE5hbWVkQ29tbWFuZCgiRXRjaC5Db25uZWN0LkV0Y2hNQyIsIG91dCBjb21tYW5kTVMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNQyA9IF9hcHBsaWNhdGlvbk9iamVjdC5Db21tYW5kcy5BZGROYW1lZENvbW1hbmQoX2FkZEluSW5zdGFuY2UsICJFdGNoTUMiLCAiRXRjaCBNaXhpbiAoQ2xpZW50KSIsICJFeGVjdXRlcyBFdGNoIE1peGluIGNsaWVudCBiaW5kaW5nIiwgdHJ1ZSwgNDEsIHJlZiBjb250ZXh0R1VJRFMsIChpbnQpIHZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNTdXBwb3J0ZWQgKyAoaW50KSB2c0NvbW1hbmRTdGF0dXMudnNDb21tYW5kU3RhdHVzRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1DLkFkZENvbnRyb2woaXRlbUNtZEJhciwgOSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFGaW5kTmFtZWRDb21tYW5kKCJFdGNoLkNvbm5lY3QuRXRjaFgiLCBvdXQgY29tbWFuZFgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRYID0gX2FwcGxpY2F0aW9uT2JqZWN0LkNvbW1hbmRzLkFkZE5hbWVkQ29tbWFuZChfYWRkSW5JbnN0YW5jZSwgIkV0Y2hYIiwgIkV0Y2ggKFhNTCkiLCAiRXhlY3V0ZXMgRXRjaCBYTUwgYmluZGluZyIsIHRydWUsIDYsIHJlZiBjb250ZXh0R1VJRFMsIChpbnQpIHZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNTdXBwb3J0ZWQgKyAoaW50KSB2c0NvbW1hbmRTdGF0dXMudnNDb21tYW5kU3RhdHVzRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFguQWRkQ29udHJvbChpdGVtQ21kQmFyLCAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3guU2hvdyhleC5Ub1N0cmluZygpLCAiRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnMuT0ssIFN5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uLkVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CQkJCisJCX0KKworCQkvLy8gPHN1bW1hcnk+SW1wbGVtZW50cyB0aGUgT25EaXNjb25uZWN0aW9uIG1ldGhvZCBvZiB0aGUgSURURXh0ZW5zaWJpbGl0eTIgaW50ZXJmYWNlLiBSZWNlaXZlcyBub3RpZmljYXRpb24gdGhhdCB0aGUgQWRkLWluIGlzIGJlaW5nIHVubG9hZGVkLjwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSB0ZXJtPSdkaXNjb25uZWN0TW9kZSc+RGVzY3JpYmVzIGhvdyB0aGUgQWRkLWluIGlzIGJlaW5nIHVubG9hZGVkLjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gdGVybT0nY3VzdG9tJz5BcnJheSBvZiBwYXJhbWV0ZXJzIHRoYXQgYXJlIGhvc3QgYXBwbGljYXRpb24gc3BlY2lmaWMuPC9wYXJhbT4KKwkJLy8vIDxzZWVhbHNvIGNsYXNzPSdJRFRFeHRlbnNpYmlsaXR5MicgLz4KKwkJcHVibGljIHZvaWQgT25EaXNjb25uZWN0aW9uKGV4dF9EaXNjb25uZWN0TW9kZSBkaXNjb25uZWN0TW9kZSwgcmVmIEFycmF5IGN1c3RvbSkKKwkJeworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PkltcGxlbWVudHMgdGhlIE9uQWRkSW5zVXBkYXRlIG1ldGhvZCBvZiB0aGUgSURURXh0ZW5zaWJpbGl0eTIgaW50ZXJmYWNlLiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiB0aGUgY29sbGVjdGlvbiBvZiBBZGQtaW5zIGhhcyBjaGFuZ2VkLjwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSB0ZXJtPSdjdXN0b20nPkFycmF5IG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgaG9zdCBhcHBsaWNhdGlvbiBzcGVjaWZpYy48L3BhcmFtPgorCQkvLy8gPHNlZWFsc28gY2xhc3M9J0lEVEV4dGVuc2liaWxpdHkyJyAvPgkJCisJCXB1YmxpYyB2b2lkIE9uQWRkSW5zVXBkYXRlKHJlZiBBcnJheSBjdXN0b20pCisJCXsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT5JbXBsZW1lbnRzIHRoZSBPblN0YXJ0dXBDb21wbGV0ZSBtZXRob2Qgb2YgdGhlIElEVEV4dGVuc2liaWxpdHkyIGludGVyZmFjZS4gUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHRoYXQgdGhlIGhvc3QgYXBwbGljYXRpb24gaGFzIGNvbXBsZXRlZCBsb2FkaW5nLjwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSB0ZXJtPSdjdXN0b20nPkFycmF5IG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgaG9zdCBhcHBsaWNhdGlvbiBzcGVjaWZpYy48L3BhcmFtPgorCQkvLy8gPHNlZWFsc28gY2xhc3M9J0lEVEV4dGVuc2liaWxpdHkyJyAvPgorCQlwdWJsaWMgdm9pZCBPblN0YXJ0dXBDb21wbGV0ZShyZWYgQXJyYXkgY3VzdG9tKQorCQl7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+SW1wbGVtZW50cyB0aGUgT25CZWdpblNodXRkb3duIG1ldGhvZCBvZiB0aGUgSURURXh0ZW5zaWJpbGl0eTIgaW50ZXJmYWNlLiBSZWNlaXZlcyBub3RpZmljYXRpb24gdGhhdCB0aGUgaG9zdCBhcHBsaWNhdGlvbiBpcyBiZWluZyB1bmxvYWRlZC48L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gdGVybT0nY3VzdG9tJz5BcnJheSBvZiBwYXJhbWV0ZXJzIHRoYXQgYXJlIGhvc3QgYXBwbGljYXRpb24gc3BlY2lmaWMuPC9wYXJhbT4KKwkJLy8vIDxzZWVhbHNvIGNsYXNzPSdJRFRFeHRlbnNpYmlsaXR5MicgLz4KKwkJcHVibGljIHZvaWQgT25CZWdpblNodXRkb3duKHJlZiBBcnJheSBjdXN0b20pCisJCXsKKwkJfQorCQkKKwkJcHJpdmF0ZSBEVEUyIF9hcHBsaWNhdGlvbk9iamVjdDsKKwkJcHJpdmF0ZSBBZGRJbiBfYWRkSW5JbnN0YW5jZTsKKworICAgICAgICAjcmVnaW9uIElEVENvbW1hbmRUYXJnZXQgTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWMoc3RyaW5nIENtZE5hbWUsIHZzQ29tbWFuZEV4ZWNPcHRpb24gRXhlY3V0ZU9wdGlvbiwgcmVmIG9iamVjdCBWYXJpYW50SW4sIHJlZiBvYmplY3QgVmFyaWFudE91dCwgcmVmIGJvb2wgSGFuZGxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgSGFuZGxlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKEV4ZWN1dGVPcHRpb24gPT0gdnNDb21tYW5kRXhlY09wdGlvbi52c0NvbW1hbmRFeGVjT3B0aW9uRG9EZWZhdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChDbWROYW1lID09ICJFdGNoLkNvbm5lY3QuRXRjaCIgfHwgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hTIiB8fCBDbWROYW1lID09ICJFdGNoLkNvbm5lY3QuRXRjaEMiIHx8CisgICAgICAgICAgICAgICAgICAgIENtZE5hbWUgPT0gIkV0Y2guQ29ubmVjdC5FdGNoTSIgfHwgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hNUyIgfHwgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hNQyIgfHwKKyAgICAgICAgICAgICAgICAgICAgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hYIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVSUhpZXJhcmNoeSB1aWggPSBfYXBwbGljYXRpb25PYmplY3QuVG9vbFdpbmRvd3MuU29sdXRpb25FeHBsb3JlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJSGllcmFyY2h5SXRlbSBpdGVtID0gKHVpaC5TZWxlY3RlZEl0ZW1zIGFzIFN5c3RlbS5BcnJheSkuR2V0VmFsdWUoMCkgYXMgVUlIaWVyYXJjaHlJdGVtOworICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdEl0ZW0gcHJqSXRlbSA9IGl0ZW0uT2JqZWN0IGFzIFByb2plY3RJdGVtOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhdGggPSBwcmpJdGVtLlByb3BlcnRpZXMuSXRlbSgiRnVsbFBhdGgiKS5WYWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGRpciA9IFN5c3RlbS5JTy5QYXRoLkdldERpcmVjdG9yeU5hbWUocGF0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGFydEluZm8gcHNpID0gbmV3IFByb2Nlc3NTdGFydEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzaS5Vc2VTaGVsbEV4ZWN1dGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcHNpLldvcmtpbmdEaXJlY3RvcnkgPSBkaXI7CisgICAgICAgICAgICAgICAgICAgICAgICBwc2kuRmlsZU5hbWUgPSAiZXRjaC5iYXQiOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihDbWROYW1lID09ICJFdGNoLkNvbm5lY3QuRXRjaFgiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaS5Bcmd1bWVudHMgPSAiLWIgeG1sIC13IGFsbCAiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaS5Bcmd1bWVudHMgPSAiLWIgY3NoYXJwICI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihDbWROYW1lID09ICJFdGNoLkNvbm5lY3QuRXRjaEMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2kuQXJndW1lbnRzICs9ICItdyBjbGllbnQsbWFpbixpbXBsLGhlbHBlciAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hTIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNpLkFyZ3VtZW50cyArPSAiLXcgc2VydmVyLG1haW4saW1wbCxoZWxwZXIgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKENtZE5hbWUgPT0gIkV0Y2guQ29ubmVjdC5FdGNoIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNpLkFyZ3VtZW50cyArPSAiLXcgYWxsICI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzaS5Bcmd1bWVudHMgKz0gIlwiIiArIHBhdGggKyAiXCIiOworCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2VzcyBwID0gU3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MuU3RhcnQocHNpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAuV2FpdEZvckV4aXQoNjAwMDApOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3guU2hvdyhleC5Ub1N0cmluZygpLCAiRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zLk9LLCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbi5FcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBIYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFF1ZXJ5U3RhdHVzKHN0cmluZyBDbWROYW1lLCB2c0NvbW1hbmRTdGF0dXNUZXh0V2FudGVkIE5lZWRlZFRleHQsIHJlZiB2c0NvbW1hbmRTdGF0dXMgU3RhdHVzT3B0aW9uLCByZWYgb2JqZWN0IENvbW1hbmRUZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTmVlZGVkVGV4dCA9PSB2c0NvbW1hbmRTdGF0dXNUZXh0V2FudGVkLnZzQ29tbWFuZFN0YXR1c1RleHRXYW50ZWROb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChDbWROYW1lID09ICJFdGNoLkNvbm5lY3QuRXRjaCIgfHwgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hTIiB8fCBDbWROYW1lID09ICJFdGNoLkNvbm5lY3QuRXRjaEMiIHx8CisgICAgICAgICAgICAgICAgICAgIENtZE5hbWUgPT0gIkV0Y2guQ29ubmVjdC5FdGNoTSIgfHwgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hNUyIgfHwgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hNQyIgfHwgQ21kTmFtZSA9PSAiRXRjaC5Db25uZWN0LkV0Y2hYIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRHluYW1pY2FsbHkgZW5hYmxlICYgZGlzYWJsZSB0aGUgY29tbWFuZC4gSWYgdGhlIHNlbGVjdGVkIGZpbGUgbmFtZSBpcyAqLmV0Y2gsIHRoZW4gbWFrZSB0aGUgY29tbWFuZCB2aXNpYmxlLgorICAgICAgICAgICAgICAgICAgICBVSUhpZXJhcmNoeSB1aWggPSBfYXBwbGljYXRpb25PYmplY3QuVG9vbFdpbmRvd3MuU29sdXRpb25FeHBsb3JlcjsKKyAgICAgICAgICAgICAgICAgICAgVUlIaWVyYXJjaHlJdGVtIGl0ZW0gPSAodWloLlNlbGVjdGVkSXRlbXMgYXMgU3lzdGVtLkFycmF5KS5HZXRWYWx1ZSgwKSBhcyBVSUhpZXJhcmNoeUl0ZW07CisgICAgICAgICAgICAgICAgICAgIFN0YXR1c09wdGlvbiA9IHZzQ29tbWFuZFN0YXR1cy52c0NvbW1hbmRTdGF0dXNTdXBwb3J0ZWQ7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gaXRlbS5OYW1lLlRvTG93ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLkVuZHNXaXRoKCIuZXRjaCIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNPcHRpb24gfD0gdnNDb21tYW5kU3RhdHVzLnZzQ29tbWFuZFN0YXR1c0ludmlzaWJsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c09wdGlvbiB8PSB2c0NvbW1hbmRTdGF0dXMudnNDb21tYW5kU3RhdHVzRW5hYmxlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXNPcHRpb24gPSB2c0NvbW1hbmRTdGF0dXMudnNDb21tYW5kU3RhdHVzVW5zdXBwb3J0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9ldGNoLWFkZGluL0V0Y2gtQWRkSW4uY3Nwcm9qIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vZXRjaC1hZGRpbi9FdGNoLUFkZEluLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmI2NDUwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vZXRjaC1hZGRpbi9FdGNoLUFkZEluLmNzcHJvagpAQCAtMCwwICsxLDEyMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezc3RUJDNTE0LTY4MzQtNDg2RC1CNUUyLUNFMTdCMjZCRjIwMn08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPFN0YXJ0dXBPYmplY3Q+CisgICAgPC9TdGFydHVwT2JqZWN0PgorICAgIDxOb1N0YW5kYXJkTGlicmFyaWVzPmZhbHNlPC9Ob1N0YW5kYXJkTGlicmFyaWVzPgorICAgIDxBc3NlbWJseU5hbWU+RXRjaEFkZEluPC9Bc3NlbWJseU5hbWU+CisgICAgPFJvb3ROYW1lc3BhY2U+RXRjaEFkZEluPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXDwvT3V0cHV0UGF0aD4KKyAgICA8RW5hYmxlVW5tYW5hZ2VkRGVidWdnaW5nPmZhbHNlPC9FbmFibGVVbm1hbmFnZWREZWJ1Z2dpbmc+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxJbmNyZW1lbnRhbEJ1aWxkPmZhbHNlPC9JbmNyZW1lbnRhbEJ1aWxkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz5mYWxzZTwvRGVidWdTeW1ib2xzPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxFbmFibGVVbm1hbmFnZWREZWJ1Z2dpbmc+ZmFsc2U8L0VuYWJsZVVubWFuYWdlZERlYnVnZ2luZz4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPEluY3JlbWVudGFsQnVpbGQ+ZmFsc2U8L0luY3JlbWVudGFsQnVpbGQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IkV4dGVuc2liaWxpdHksIFZlcnNpb249Ny4wLjMzMDAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Gb3JtcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzc2VtYmx5SW5mby5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25uZWN0LmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJDb21tYW5kQmFyLnJlc3giPgorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+CisgICAgPC9FbWJlZGRlZFJlc291cmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q09NUmVmZXJlbmNlIEluY2x1ZGU9IkVudkRURSI+CisgICAgICA8R3VpZD57ODBDQzlGNjYtRTdEOC00RERELTg1QjYtRDlFNkNEMEU5M0UyfTwvR3VpZD4KKyAgICAgIDxWZXJzaW9uTWFqb3I+ODwvVmVyc2lvbk1ham9yPgorICAgICAgPFZlcnNpb25NaW5vcj4wPC9WZXJzaW9uTWlub3I+CisgICAgICA8TGNpZD4wPC9MY2lkPgorICAgICAgPFdyYXBwZXJUb29sPnByaW1hcnk8L1dyYXBwZXJUb29sPgorICAgICAgPElzb2xhdGVkPkZhbHNlPC9Jc29sYXRlZD4KKyAgICA8L0NPTVJlZmVyZW5jZT4KKyAgICA8Q09NUmVmZXJlbmNlIEluY2x1ZGU9IkVudkRURTgwIj4KKyAgICAgIDxHdWlkPnsxQTMxMjg3QS00RDdELTQxM0UtOEUzMi0zQjM3NDkzMUJEODl9PC9HdWlkPgorICAgICAgPFZlcnNpb25NYWpvcj44PC9WZXJzaW9uTWFqb3I+CisgICAgICA8VmVyc2lvbk1pbm9yPjA8L1ZlcnNpb25NaW5vcj4KKyAgICAgIDxMY2lkPjA8L0xjaWQ+CisgICAgICA8V3JhcHBlclRvb2w+cHJpbWFyeTwvV3JhcHBlclRvb2w+CisgICAgICA8SXNvbGF0ZWQ+RmFsc2U8L0lzb2xhdGVkPgorICAgIDwvQ09NUmVmZXJlbmNlPgorICAgIDxDT01SZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5Db21tYW5kQmFycyI+CisgICAgICA8R3VpZD57MUNCQTQ5MkUtNzI2My00N0JCLTg3RkUtNjM5MDAwNjE5QjE1fTwvR3VpZD4KKyAgICAgIDxWZXJzaW9uTWFqb3I+ODwvVmVyc2lvbk1ham9yPgorICAgICAgPFZlcnNpb25NaW5vcj4wPC9WZXJzaW9uTWlub3I+CisgICAgICA8TGNpZD4wPC9MY2lkPgorICAgICAgPFdyYXBwZXJUb29sPnByaW1hcnk8L1dyYXBwZXJUb29sPgorICAgICAgPElzb2xhdGVkPkZhbHNlPC9Jc29sYXRlZD4KKyAgICA8L0NPTVJlZmVyZW5jZT4KKyAgICA8Q09NUmVmZXJlbmNlIEluY2x1ZGU9InN0ZG9sZSI+CisgICAgICA8R3VpZD57MDAwMjA0MzAtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fTwvR3VpZD4KKyAgICAgIDxWZXJzaW9uTWFqb3I+MjwvVmVyc2lvbk1ham9yPgorICAgICAgPFZlcnNpb25NaW5vcj4wPC9WZXJzaW9uTWlub3I+CisgICAgICA8TGNpZD4wPC9MY2lkPgorICAgICAgPFdyYXBwZXJUb29sPnByaW1hcnk8L1dyYXBwZXJUb29sPgorICAgICAgPElzb2xhdGVkPkZhbHNlPC9Jc29sYXRlZD4KKyAgICA8L0NPTVJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iRXRjaC5BZGRJbiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTSEFSUC5UYXJnZXRzIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgICAgPFBvc3RCdWlsZEV2ZW50PgorICAgIDwvUG9zdEJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxWaXN1YWxTdHVkaW8+CisgICAgPC9WaXN1YWxTdHVkaW8+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9ldGNoLWFkZGluL0V0Y2guQWRkSW4gYi9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9ldGNoLWFkZGluL0V0Y2guQWRkSW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxZTMwMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL2V0Y2gtYWRkaW4vRXRjaC5BZGRJbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9pbnN0YWxsZXIvVlMyMDA1X0FkZEluX1VzZXJfR3VpZGUucnRmIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vaW5zdGFsbGVyL1ZTMjAwNV9BZGRJbl9Vc2VyX0d1aWRlLnJ0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFkYmMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vaW5zdGFsbGVyL1ZTMjAwNV9BZGRJbl9Vc2VyX0d1aWRlLnJ0ZgpAQCAtMCwwICsxLDE0NCBAQAore1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcY29jb2FydGY5NDlcY29jb2FzdWJydGY0MzAKK3tcZm9udHRibFxmMFxmc3dpc3NcZmNoYXJzZXQwIEFyaWFsTVQ7XGYxXGZyb21hblxmY2hhcnNldDAgVGltZXNOZXdSb21hblBTTVQ7XGYyXGZtb2Rlcm5cZmNoYXJzZXQwIENvdXJpZXJOZXdQU01UOworfQore1xjb2xvcnRibDtccmVkMjU1XGdyZWVuMjU1XGJsdWUyNTU7fQorXHZpZXd3MTIwMDBcdmlld2gxNTg0MFx2aWV3a2luZDAKK1xkZWZ0YWI3MjAKK1xwYXJkXHBhcmRlZnRhYjcyMFxzYjI0MFxzYTYwXHFjCisKK1xmMFxiXGZzMzIgXGNmMCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDA1IEFkZC1JbiBVc2VycyBHdWlkZVwKK1xwYXJkXHBhcmRlZnRhYjcyMFxxYworCitcZjFcYjBcZnMyNCBcY2YwIFxleHBuZDBcZXhwbmR0dzBca2VybmluZzAKK35EcmFmdH5cCitccGFyZFxwYXJkZWZ0YWI3MjBcc2IyNDBcc2E2MFxxbFxxbmF0dXJhbAorCitcZjBcaVxiXGZzMjggXGNmMCBMaWNlbnNlXAorXHBhcmRcdHg1NjBcdHgxMTIwXHR4MTY4MFx0eDIyNDBcdHgyODAwXHR4MzM2MFx0eDM5MjBcdHg0NDgwXHR4NTA0MFx0eDU2MDBcdHg2MTYwXHR4NjcyMFxxbFxxbmF0dXJhbFxwYXJkaXJuYXR1cmFsCisKK1xpMFxiMFxmczI0IFxjZjAgXGtlcm5pbmcxXGV4cG5kMFxleHBuZHR3MCBcCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKlwKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqXAorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICpcCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKlwKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqXAorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICpcCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXAorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICpcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlwKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqXAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICpcCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKlwKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqXAorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICpcCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXGZzMjggXAorCitcaVxiIFxleHBuZDBcZXhwbmR0dzBca2VybmluZzAKK1wKK1xwYXJkXHBhcmRlZnRhYjcyMFxzYjI0MFxzYTYwXHFsXHFuYXR1cmFsCitcY2YwIEFib3V0IHRoZSBBZGQtSW5cCitccGFyZFxwYXJkZWZ0YWI3MjBccWxccW5hdHVyYWwKKworXGYxXGZzMjQgXGNmMCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDA1IEFkZC1JbgorXGkwXGIwICBpcyBhIHBsdWdpbiBwcm92aWRlZCBieSBFdGNoIGZyYW1ld29yayB0byBpbnRlZ3JhdGUgRXRjaCBDb21waWxlciBhbmQgRXRjaCBDIyBydW50aW1lIGxpYnJhcnkgaW50byBWaXN1YWwgU3R1ZGlvIDIwMDUgSURFLiAgRGV2ZWxvcGVycyB3aG8gdXNlIEMjIHRvIGRldmVsb3AgRXRjaCBuZXR3b3JrIHNlcnZpY2UgYW5kIGNsaWVudCBjYW4gdXNlIHRoaXMgQWRkLUluIHRvIGdlbmVyYXRlIEV0Y2ggQyMgYmluZGluZyBhbmQgc3R1YiBjb2RlIHdpdGhvdXQgbGVhdmluZyB0aGUgSURFLiAgQWxzbywgRXRjaCBDIyBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlzdCBvZiBzdGFuZGFyZCAuTmV0IGNvbXBvbmVudHMuICBEZXZlbG9wZXJzIGNhbiByZWZlcmVuY2UgdGhlIGxpYnJhcnkgd2l0aG91dCBicm93c2luZyBpbnRvIHRoZSBFdGNoIGxpYnJhcnkgZGlyZWN0b3J5LiAgXAorXHBhcmRccGFyZGVmdGFiNzIwXHNiMjQwXHNhNjBccWxccW5hdHVyYWwKKworXGYwXGlcYlxmczI4IFxjZjAgSW5zdGFsbGF0aW9uIGFuZCBVbmluc3RhbGxhdGlvblwKK1xwYXJkXHBhcmRlZnRhYjcyMFxzYTEyMFxxbFxxbmF0dXJhbAorCitcZjFcaTBcYjBcZnMyNCBcY2YwIEEgd2l6YXJkLWRyaXZlbiBpbnN0YWxsZXIgaXMgYXZhaWxhYmxlIGZvciBkZXZlbG9wZXJzIHRvIGluc3RhbGwgYW5kIHVuaW5zdGFsbCB0aGUgQWRkLUluIGVmZm9ydGxlc3NseS4gIFRoZSBpbnN0YWxsZXIsIAorXGlcYiBWU0FkZEluU2V0dXAuZXhlCitcaTBcYjAgLCBpcyBpbiB0aGUgCitcaVxiIHBsdWdpbnMKK1xpMFxiMCAgZm9sZGVyIGluc2lkZSBFdGNoIGhvbWUgZGlyZWN0b3J5LiAgXAorVG8gaW5zdGFsbCB0aGUgQWRkLUluLCBydW4gCitcaVxiIFZTQWRkSW5TZXR1cC5leGUKK1xpMFxiMCAgYW5kIHNwZWNpZmllZCB5b3VyIEV0Y2ggaG9tZSBkaXJlY3RvcnkgYW5kIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBmb3IgdGhlIEFkZC1Jbi4gIFBsZWFzZSBjbG9zZSBhbGwgaW5zdGFuY2VzIG9mIFZpc3VhbCBTdHVkaW8gMjAwNSBiZWZvcmUgaW5zdGFsbGF0aW9uLiAgQWZ0ZXIgaW5zdGFsbGF0aW9uLCB5b3UgY2FuIGZpbmQgCitcaVxiIEV0Y2gKK1xpMFxiMCAgbGlzdGVkIGFzIG9uZSBvZiB0aGUgQWRkLUlucyBpbiB0aGUgCitcaVxiIEFkZC1JbiBNYW5hZ2VyCitcaTBcYjAgICgKK1xpXGIgVG9vbHMsIEFkZC1pbiBNYW5hZ2VyXCc4NQorXGkwXGIwICkuICAgICBcCitccGFyZFxwYXJkZWZ0YWI3MjBcc2ExMjBccWMKKworXGYyXGZzMjAgXGNmMCBcCitccGFyZFxwYXJkZWZ0YWI3MjBcc2ExMjBccWxccW5hdHVyYWwKKworXGYxXGZzMjQgXGNmMCBUbyB1bmluc3RhbGwgdGhlIEFkZC1JbiwgdXNlciBjYW4gZWl0aGVyIHBlcmZvcm0gdGhlIGFjdGlvbiBmcm9tIAorXGlcYiBDb250cm9sIFBhbmVsCitcaTBcYjAgLCAKK1xpXGIgQWRkIG9yIFJlbW92ZSBQcm9ncmFtcywgVmlzdWFsIFN0dWRpbyBmb3IgRXRjaAorXGkwXGIwICBvciAKK1xpXGIgU3RhcnQKK1xpMFxiMCAsIAorXGlcYiBBbGwgUHJvZ3JhbXMKK1xpMFxiMCAsIAorXGlcYiBWaXN1YWwgU3R1ZGlvIEFkZC1JbiBmb3IgRXRjaAorXGkwXGIwICwgCitcaVxiIFVuaW5zdGFsbAorXGkwXGIwIC4gIEFsbCBpbnN0YW5jZXMgb2YgVmlzdWFsIFN0dWRpbyAyMDA1IG11c3QgYmUgY2xvc2VkIGJlZm9yZSB1bmluc3RhbGxhdGlvbi4gIFRoZSB1bmluc3RhbGxlciByZXN0YXJ0cyBWaXN1YWwgU3R1ZGlvIDIwMDUgd2hlbiB0aGUgdW5pbnN0YWxsYXRpb24gcHJvY2VzcyBpcyBkb25lLlwKK1xwYXJkXHBhcmRlZnRhYjcyMFxzYjI0MFxzYTYwXHFsXHFuYXR1cmFsCisKK1xmMFxpXGJcZnMyOCBcY2YwIEV0Y2ggQyMgUnVudGltZSBSZWZlcmVuY2VcCitccGFyZFxwYXJkZWZ0YWI3MjBccWxccW5hdHVyYWwKKworXGYxXGkwXGIwXGZzMjQgXGNmMCBUaGUgQWRkLUluIGFkZHMgdGhlIGxpYnJhcnkgcGF0aCBvZiBFdGNoIGluc3RhbGxhdGlvbiBpbnRvIFZpc3VhbCBTdHVkaW8gMjAwNVwnOTJzIGRlZmF1bHQgYXNzZW1ibHkgZm9sZGVycy4gIFdoZW4gZGV2ZWxvcGVycyBuZWVkIHRvIGFkZCBFdGNoIEMjIHJ1bnRpbWUgYXMgb25lIG9mIHRoZSByZWZlcmVuY2VzIGludG8gdGhlIHByb2plY3QsIHRoZSAKK1xpXGIgRXRjaDRDUworXGkwXGIwICBsaWJyYXJ5IGNhbiBiZSBlYXNpbHkgbG9jYXRlZCBpbiB0aGUgCitcaVxiIC5ORVQKK1xpMFxiMCAgdGFiIG9mIAorXGlcYiBBZGQgUmVmZXJlbmNlCitcaTBcYjAgIHdpbmRvdy4gICAgXAorXHBhcmRccGFyZGVmdGFiNzIwXHNiMjQwXHNhNjBccWMKK1xjZjAgXAorXHBhcmRccGFyZGVmdGFiNzIwXHNiMjQwXHNhNjBccWxccW5hdHVyYWwKK1xjZjAgXAorXHBhcmRccGFyZGVmdGFiNzIwXHNiMjQwXHNhNjBccWxccW5hdHVyYWwKKworXGYwXGlcYlxmczI4IFxjZjAgR2VuZXJhdGUgRXRjaCBDIyBCaW5kaW5nXAorXHBhcmRccGFyZGVmdGFiNzIwXHFsXHFuYXR1cmFsCisKK1xmMVxpMFxiMFxmczI0IFxjZjAgVGhlIEFkZC1JbiBpbnRlZ3JhdGVzIHdpdGggRXRjaCBDb21waWxlciBmb3IgZGV2ZWxvcGVycyB0byBnZW5lcmF0ZSBFdGNoIEMjIGJpbmRpbmcgYW5kIHN0dWIgY29kZSBpbnNpZGUgCitcaVxiIFZpc3VhbCBTdHVkaW8gMjAwNSBJREUKK1xpMFxiMCAuICBUaGUgQWRkLUluIHByb3ZpZGVzIHRocmVlIGNvbnRleHQgbWVudSBpdGVtcyBpbiAKK1xpXGIgU29sdXRpb24gRXhwbG9yZXIKK1xpMFxiMCA7IGRldmVsb3BlcnMgY2FuIHJpZ2h0LW1vdXNlIGNsaWNrIG9uIGFuIEV0Y2ggbmV0d29yayBzZXJ2aWNlIGRlZmluaXRpb24gZmlsZSAoCitcaVxiIC5ldGNoCitcaTBcYjAgKSAgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoZW4gY3JlYXRlIHRoZSBiaW5kaW5ncyBhbmQgc3R1YiBjb2RlIGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIHRocmVlIEV0Y2ggcmVsYXRlZCBtZW51IGl0ZW1zLlwKK1wKKworXGlcYiBFdGNoIChCb3RoKQorXGkwXGIwIDogR2VuZXJhdGUgYm90aCBzZXJ2ZXIgYW5kIGNsaWVudCBiaW5kaW5nIGFuZCBzdHViIGNvZGUuXAorCitcaVxiIEV0Y2ggKFNlcnZlcikKK1xpMFxiMCA6IEdlbmVyYXRlIHNlcnZlciBzaWRlIGJpbmRpbmcgYW5kIHN0dWIgY29kZS5cCisKK1xpXGIgRXRjaCAoQ2xpZW50KQorXGkwXGIwIDogR2VuZXJhdGUgY2xpZW50IHNpZGUgYmluZGluZyBhbmQgc3R1YiBjb2RlLlwKK1wKK1RoZSBFdGNoIGNvbXBpbGVyIGdlbmVyYXRlZCBmaWxlcyByZXNpZGUgdW5kZXIgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIEV0Y2ggbmV0d29yayBzZXJ2aWNlIGRlZmluaXRpb24gZmlsZSAoCitcaVxiIC5ldGNoKQorXGkwXGIwICBmaWxlLiAgXAorXAorXHBhcmRccGFyZGVmdGFiNzIwXHFjCisKK1xmMlxmczIwIFxjZjAgXAorXAorXAorXAorXAorXHBhcmRccGFyZGVmdGFiNzIwXHFsXHFuYXR1cmFsCisKK1xmMVxmczI0IFxjZjAgVG8gdmlldyBFdGNoIGNvbXBpbGVyIGdlbmVyYXRlZCBmaWxlcywgZGV2ZWxvcGVycyBjYW4gY2xpY2sgb24gXCc5MworXGlcYiBTaG93IEFsbCBGaWxlcworXGkwXGIwIFwnOTQgdG9vbGJhciBidXR0b24gb24gCitcaVxiIFNvbHV0aW9uIEV4cGxvcmVyCitcaTBcYjAgIHRoZW4gc2VsZWN0IGZpbGVzIGFuZCBpbmNsdWRlIHRoZW0gaW50byB0aGUgd29ya2luZyBwcm9qZWN0LiAgXAorXAorXHBhcmRccGFyZGVmdGFiNzIwXHFjCitcY2YwICAKK1xmMlxmczIwIFwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9pbnN0YWxsZXIvbW9kZXJuLWluc3RhbGwuaWNvIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vaW5zdGFsbGVyL21vZGVybi1pbnN0YWxsLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI1ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vaW5zdGFsbGVyL21vZGVybi1pbnN0YWxsLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9pbnN0YWxsZXIvbW9kZXJuLXVuaW5zdGFsbC5pY28gYi9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9pbnN0YWxsZXIvbW9kZXJuLXVuaW5zdGFsbC5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjY2UyMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL2luc3RhbGxlci9tb2Rlcm4tdW5pbnN0YWxsLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9pbnN0YWxsZXIvdmlzdWFsc3R1ZGlvLm5zaSBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL2luc3RhbGxlci92aXN1YWxzdHVkaW8ubnNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTk3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9pbnN0YWxsZXIvdmlzdWFsc3R1ZGlvLm5zaQpAQCAtMCwwICsxLDEzNSBAQAorOyBTY3JpcHQgZ2VuZXJhdGVkIGJ5IHRoZSBITSBOSVMgRWRpdCBTY3JpcHQgV2l6YXJkLgorCis7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCis7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCis7IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCis7IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCis7IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCis7ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCis7IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCis7ICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCis7IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCis7ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCis7IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCis7IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCis7IHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKzsgSE0gTklTIEVkaXQgV2l6YXJkIGhlbHBlciBkZWZpbmVzCishZGVmaW5lIFBST0RVQ1RfTkFNRSAiVmlzdWFsIFN0dWRpbyBBZGQtSW4gZm9yIEFwYWNoZSBFdGNoIgorIWRlZmluZSBQUk9EVUNUX1ZFUlNJT04gIjEuMCIKKyFkZWZpbmUgUFJPRFVDVF9QVUJMSVNIRVIgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgorIWRlZmluZSBQUk9EVUNUX1dFQl9TSVRFICJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvcHJvamVjdHMvZXRjaC5odG1sIgorIWRlZmluZSBQUk9EVUNUX1VOSU5TVF9LRVkgIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwke1BST0RVQ1RfTkFNRX0iCishZGVmaW5lIFBST0RVQ1RfVU5JTlNUX1JPT1RfS0VZICJIS0xNIgorIWRlZmluZSBFVENIX0NTX0FTU0VNQkxZX0ZPTERFUiAiU09GVFdBUkVcTWljcm9zb2Z0XC5ORVRGcmFtZXdvcmtcQXNzZW1ibHlGb2xkZXJzXEV0Y2giCishZGVmaW5lIFNIRUxMX0ZPTERFUlMgIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMiCishZGVmaW5lIFZTX0ZPTERFUiAiU09GVFdBUkVcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1w4LjAiCisKKzsgTVVJIDEuNjcgY29tcGF0aWJsZSAtLS0tLS0KKyFpbmNsdWRlICJNVUkubnNoIgorCis7IE1VSSBTZXR0aW5ncworIWRlZmluZSBNVUlfQUJPUlRXQVJOSU5HCishZGVmaW5lIE1VSV9JQ09OICJtb2Rlcm4taW5zdGFsbC5pY28iCishZGVmaW5lIE1VSV9VTklDT04gIm1vZGVybi11bmluc3RhbGwuaWNvIgorIWRlZmluZSBNVUlfV0VMQ09NRVBBR0VfVElUTEVfM0xJTkVTCisKKzsgV2VsY29tZSBwYWdlCishaW5zZXJ0bWFjcm8gTVVJX1BBR0VfV0VMQ09NRQorCis7IEV0Y2ggSW5zdGFsbGF0aW9uIEZvbGRlcgorVmFyIEVUQ0hfSE9NRQorIWRlZmluZSBNVUlfRElSRUNUT1JZUEFHRV9WQVJJQUJMRSAkRVRDSF9IT01FCishZGVmaW5lIE1VSV9QQUdFX0hFQURFUl9URVhUICJBcGFjaGUgRXRjaCBIb21lIERpcmVjdG9yeS4iCishZGVmaW5lIE1VSV9QQUdFX0hFQURFUl9TVUJURVhUICJDaG9vc2UgdGhlIGZvbGRlciBpbiB3aGljaCBFdGNoIHBhY2thZ2UgaXMgaW5zdGFsbGVkLiIKKyFkZWZpbmUgTVVJX0RJUkVDVE9SWVBBR0VfVEVYVF9UT1AgIlBsZWFzZSBicm93c2UgdG8gQXBhY2hlIEV0Y2ggaG9tZSBkaXJlY3RvcnkuIgorIWRlZmluZSBNVUlfRElSRUNUT1JZUEFHRV9URVhUX0RFU1RJTkFUSU9OICJBcGFjaGUgRXRjaCBob21lIGRpcmVjdG9yeSIKKyFpbnNlcnRtYWNybyBNVUlfUEFHRV9ESVJFQ1RPUlkKKworOyBEaXJlY3RvcnkgcGFnZQorIWluc2VydG1hY3JvIE1VSV9QQUdFX0RJUkVDVE9SWQorCis7IEluc3RmaWxlcyBwYWdlCishaW5zZXJ0bWFjcm8gTVVJX1BBR0VfSU5TVEZJTEVTCisKKzsgRmluaXNoIHBhZ2UKKyFpbnNlcnRtYWNybyBNVUlfUEFHRV9GSU5JU0gKKworOyBVbmluc3RhbGxlciBwYWdlcworIWluc2VydG1hY3JvIE1VSV9VTlBBR0VfSU5TVEZJTEVTCisKKzsgTGFuZ3VhZ2UgZmlsZXMKKyFpbnNlcnRtYWNybyBNVUlfTEFOR1VBR0UgIkVuZ2xpc2giCisKKzsgTVVJIGVuZCAtLS0tLS0KKworTmFtZSAiJHtQUk9EVUNUX05BTUV9IgorT3V0RmlsZSAiVlNBZGRJblNldHVwLmV4ZSIKK0luc3RhbGxEaXIgIiRQUk9HUkFNRklMRVNcVmlzdWFsIFN0dWRpbyBBZGQtSW4gZm9yIEFwYWNoZSBFdGNoIgorU2hvd0luc3REZXRhaWxzIGhpZGUKK1Nob3dVbkluc3REZXRhaWxzIGhpZGUKK1hQU3R5bGUgIm9uIgorUmVxdWVzdEV4ZWN1dGlvbkxldmVsIGFkbWluCisKK1NlY3Rpb24gIlZpc3VhbCBTdHVkaW8gQWRkLUluIGZvciBBcGFjaGUgRXRjaCIgU0VDMDEKKyAgU2V0T3V0UGF0aCAiJElOU1RESVIiCisgIFNldE92ZXJ3cml0ZSB0cnkKKyAgRmlsZSAiRXRjaEFkZEluLmRsbCIKKyAgRmlsZSAiRXRjaC5BZGRJbiIKKyAgRmlsZSAiVlMyMDA1X0FkZEluX1VzZXJfR3VpZGUucnRmIgorICBXcml0ZVJlZ1N0ciBIS0xNICIke0VUQ0hfQ1NfQVNTRU1CTFlfRk9MREVSfSIgIiIgIiRFVENIX0hPTUVcbGliIgorICBSZWFkUmVnU3RyICQwIEhLQ1UgIiR7U0hFTExfRk9MREVSU30iIFBlcnNvbmFsCisgIFNldE91dFBhdGggIiQwXFZpc3VhbCBTdHVkaW8gMjAwNVxBZGRpbnNcIgorICBTZXRPdmVyd3JpdGUgdHJ5CisgIEZpbGUgIkV0Y2hBZGRJbi5kbGwiCisgIEZpbGUgIkV0Y2guQWRkSW4iCitTZWN0aW9uRW5kCisKK1NlY3Rpb24gLUFkZGl0aW9uYWxJY29ucworICBTZXRPdXRQYXRoICRJTlNURElSCisgIENyZWF0ZURpcmVjdG9yeSAiJFNNUFJPR1JBTVNcVmlzdWFsIFN0dWRpbyBBZGQtSW4gZm9yIEFwYWNoZSBFdGNoIgorICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcVmlzdWFsIFN0dWRpbyBBZGQtSW4gZm9yIEFwYWNoZSBFdGNoXFVzZXIgR3VpZGUubG5rIiAiJElOU1RESVJcVlMyMDA1X0FkZEluX1VzZXJfR3VpZGUucnRmIgorICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcVmlzdWFsIFN0dWRpbyBBZGQtSW4gZm9yIEFwYWNoZSBFdGNoXFVuaW5zdGFsbC5sbmsiICIkSU5TVERJUlx1bmluc3QuZXhlIgorU2VjdGlvbkVuZAorCitTZWN0aW9uIC1Qb3N0CisgIFdyaXRlVW5pbnN0YWxsZXIgIiRJTlNURElSXHVuaW5zdC5leGUiCisgIFdyaXRlUmVnU3RyICR7UFJPRFVDVF9VTklOU1RfUk9PVF9LRVl9ICIke1BST0RVQ1RfVU5JTlNUX0tFWX0iICJEaXNwbGF5TmFtZSIgIiQoXk5hbWUpIgorICBXcml0ZVJlZ1N0ciAke1BST0RVQ1RfVU5JTlNUX1JPT1RfS0VZfSAiJHtQUk9EVUNUX1VOSU5TVF9LRVl9IiAiVW5pbnN0YWxsU3RyaW5nIiAiJElOU1RESVJcdW5pbnN0LmV4ZSIKKyAgV3JpdGVSZWdTdHIgJHtQUk9EVUNUX1VOSU5TVF9ST09UX0tFWX0gIiR7UFJPRFVDVF9VTklOU1RfS0VZfSIgIkRpc3BsYXlWZXJzaW9uIiAiJHtQUk9EVUNUX1ZFUlNJT059IgorICBXcml0ZVJlZ1N0ciAke1BST0RVQ1RfVU5JTlNUX1JPT1RfS0VZfSAiJHtQUk9EVUNUX1VOSU5TVF9LRVl9IiAiVVJMSW5mb0Fib3V0IiAiJHtQUk9EVUNUX1dFQl9TSVRFfSIKKyAgV3JpdGVSZWdTdHIgJHtQUk9EVUNUX1VOSU5TVF9ST09UX0tFWX0gIiR7UFJPRFVDVF9VTklOU1RfS0VZfSIgIlB1Ymxpc2hlciIgIiR7UFJPRFVDVF9QVUJMSVNIRVJ9IgorU2VjdGlvbkVuZAorCitGdW5jdGlvbiB1bi5vblVuaW5zdFN1Y2Nlc3MKKyAgSGlkZVdpbmRvdworICBNZXNzYWdlQm94IE1CX0lDT05JTkZPUk1BVElPTnxNQl9PSyAiJCheTmFtZSkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20geW91ciBjb21wdXRlci4iCisgIFJlYWRSZWdTdHIgJDAgSEtMTSAiJHtWU19GT0xERVJ9IiBJbnN0YWxsRGlyCisgIEV4ZWNXYWl0ICckMFxkZXZlbnYuZXhlIC9SZXNldEFkZGluIEV0Y2gnCitGdW5jdGlvbkVuZAorCitGdW5jdGlvbiB1bi5vbkluaXQKKyAgTWVzc2FnZUJveCBNQl9JQ09OUVVFU1RJT058TUJfWUVTTk98TUJfREVGQlVUVE9OMiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbXBsZXRlbHkgcmVtb3ZlICQoXk5hbWUpPyIgSURZRVMgKzIKKyAgQWJvcnQKK0Z1bmN0aW9uRW5kCisKK1NlY3Rpb24gVW5pbnN0YWxsCisgIE1lc3NhZ2VCb3ggTUJfSUNPTkVYQ0xBTUFUSU9OfE1CX09LfE1CX1RPUE1PU1QgIlBsZWFzZSBjbG9zZSBWaXN1YWwgU3R1ZGlvIDIwMDUgYW5kIGNsaWNrIE9LIHRvIGNvbnRpbnVlLiIKKyAgRGVsZXRlUmVnVmFsdWUgSEtMTSAiJHtFVENIX0NTX0FTU0VNQkxZX0ZPTERFUn0iICIiCisgIERlbGV0ZVJlZ0tleSBIS0xNICIke0VUQ0hfQ1NfQVNTRU1CTFlfRk9MREVSfSIKKyAgUmVhZFJlZ1N0ciAkMCBIS0NVICIke1NIRUxMX0ZPTERFUlN9IiBQZXJzb25hbAorICBEZWxldGUgIiQwXFZpc3VhbCBTdHVkaW8gMjAwNVxBZGRpbnNcRXRjaEFkZEluLmRsbCIKKyAgRGVsZXRlICIkMFxWaXN1YWwgU3R1ZGlvIDIwMDVcQWRkaW5zXEV0Y2guQWRkSW4iCisgIERlbGV0ZSAiJElOU1RESVJcRXRjaEFkZEluLmRsbCIKKyAgRGVsZXRlICIkSU5TVERJUlxFdGNoLkFkZEluIgorICBEZWxldGUgIiRJTlNURElSXFZTMjAwNV9BZGRJbl9Vc2VyX0d1aWRlLnJ0ZiIKKyAgRGVsZXRlICIkSU5TVERJUlx1bmluc3QuZXhlIgorICBEZWxldGUgIiRTTVBST0dSQU1TXFZpc3VhbCBTdHVkaW8gQWRkLUluIGZvciBBcGFjaGUgRXRjaFxVc2VyIEd1aWRlLmxuayIKKyAgRGVsZXRlICIkU01QUk9HUkFNU1xWaXN1YWwgU3R1ZGlvIEFkZC1JbiBmb3IgQXBhY2hlIEV0Y2hcVW5pbnN0YWxsLmxuayIKKyAgUk1EaXIgIiRTTVBST0dSQU1TXFZpc3VhbCBTdHVkaW8gQWRkLUluIGZvciBBcGFjaGUgRXRjaCIKKyAgRGVsZXRlUmVnS2V5ICR7UFJPRFVDVF9VTklOU1RfUk9PVF9LRVl9ICIke1BST0RVQ1RfVU5JTlNUX0tFWX0iCisgIFNldEF1dG9DbG9zZSB0cnVlCitTZWN0aW9uRW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9wb3N0YnVpbGQvQXNzZW1ibHlJbmZvLmNzIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vcG9zdGJ1aWxkL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc3ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vcG9zdGJ1aWxkL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOworCisvLworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisvLworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQkJCisKKy8vCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBSZXZpc2lvbiBhbmQgQnVpbGQgTnVtYmVycyAKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorCisvLworLy8gSW4gb3JkZXIgdG8gc2lnbiB5b3VyIGFzc2VtYmx5IHlvdSBtdXN0IHNwZWNpZnkgYSBrZXkgdG8gdXNlLiBSZWZlciB0byB0aGUgCisvLyBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhc3NlbWJseSBzaWduaW5nLgorLy8KKy8vIFVzZSB0aGUgYXR0cmlidXRlcyBiZWxvdyB0byBjb250cm9sIHdoaWNoIGtleSBpcyB1c2VkIGZvciBzaWduaW5nLiAKKy8vCisvLyBOb3RlczogCisvLyAgICgqKSBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCB0aGUgYXNzZW1ibHkgaXMgbm90IHNpZ25lZC4KKy8vICAgKCopIEtleU5hbWUgcmVmZXJzIHRvIGEga2V5IHRoYXQgaGFzIGJlZW4gaW5zdGFsbGVkIGluIHRoZSBDcnlwdG8gU2VydmljZQorLy8gICAgICAgUHJvdmlkZXIgKENTUCkgb24geW91ciBtYWNoaW5lLiBLZXlGaWxlIHJlZmVycyB0byBhIGZpbGUgd2hpY2ggY29udGFpbnMKKy8vICAgICAgIGEga2V5LgorLy8gICAoKikgSWYgdGhlIEtleUZpbGUgYW5kIHRoZSBLZXlOYW1lIHZhbHVlcyBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZSAKKy8vICAgICAgIGZvbGxvd2luZyBwcm9jZXNzaW5nIG9jY3VyczoKKy8vICAgICAgICgxKSBJZiB0aGUgS2V5TmFtZSBjYW4gYmUgZm91bmQgaW4gdGhlIENTUCwgdGhhdCBrZXkgaXMgdXNlZC4KKy8vICAgICAgICgyKSBJZiB0aGUgS2V5TmFtZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhlIEtleUZpbGUgZG9lcyBleGlzdCwgdGhlIGtleSAKKy8vICAgICAgICAgICBpbiB0aGUgS2V5RmlsZSBpcyBpbnN0YWxsZWQgaW50byB0aGUgQ1NQIGFuZCB1c2VkLgorLy8gICAoKikgSW4gb3JkZXIgdG8gY3JlYXRlIGEgS2V5RmlsZSwgeW91IGNhbiB1c2UgdGhlIHNuLmV4ZSAoU3Ryb25nIE5hbWUpIHV0aWxpdHkuCisvLyAgICAgICBXaGVuIHNwZWNpZnlpbmcgdGhlIEtleUZpbGUsIHRoZSBsb2NhdGlvbiBvZiB0aGUgS2V5RmlsZSBzaG91bGQgYmUKKy8vICAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IG91dHB1dCBkaXJlY3Rvcnkgd2hpY2ggaXMKKy8vICAgICAgICVQcm9qZWN0IERpcmVjdG9yeSVcb2JqXDxjb25maWd1cmF0aW9uPi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgS2V5RmlsZSBpcworLy8gICAgICAgbG9jYXRlZCBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHlvdSB3b3VsZCBzcGVjaWZ5IHRoZSBBc3NlbWJseUtleUZpbGUgCisvLyAgICAgICBhdHRyaWJ1dGUgYXMgW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIi4uXFwuLlxcbXlrZXkuc25rIildCisvLyAgICgqKSBEZWxheSBTaWduaW5nIGlzIGFuIGFkdmFuY2VkIG9wdGlvbiAtIHNlZSB0aGUgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrCisvLyAgICAgICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMuCisvLworW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldCitbYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5S2V5TmFtZSgiIildCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9wb3N0YnVpbGQvUG9zdEJ1aWxkLmJhdCBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL3Bvc3RidWlsZC9Qb3N0QnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYTBjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9wb3N0YnVpbGQvUG9zdEJ1aWxkLmJhdApAQCAtMCwwICsxLDU3IEBACitAcmVtICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorQHJlbSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKK0ByZW0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCitAcmVtICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorQHJlbSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKK0ByZW0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCitAcmVtICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKK0ByZW0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCitAcmVtICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorQHJlbSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKK0ByZW0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCitAcmVtICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQGVjaG8gb2ZmCitzZXRsb2NhbAorCitpZiAiJTEiID09ICIiIGdvdG8gdXNhZ2UKKworY2FsbCAiJVZTNzFDT01OVE9PTFMlXHZzdmFyczMyLmJhdCIgPm51bAorc2V0IERlcGxveURpcj0uLlxpbnN0YWxsZXIKKworaWYgbm90IGV4aXN0ICVEZXBsb3lEaXIlCW1rZGlyICVEZXBsb3lEaXIlCisKK2lmIGV4aXN0IHBvc3RidWlsZC50eHQgZGVsIHBvc3RidWlsZC50eHQgL0YgL1EKKworUkVNIENsZWFyIHNoYWRvdyBjb3BpZXMgb2YgZGxscworZ2FjdXRpbCAvY2RsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gcG9zdGJ1aWxkLnR4dAorCitAZWNobyAqKioqKiogUmVtb3ZpbmcgYXNzZW1ibGllcyBmcm9tIEdBQyAqKioqKiogICAgICAgICAgICAgICAgICAgICAgICA+PiBwb3N0YnVpbGQudHh0CitnYWN1dGlsIC91ZiBFdGNoQWRkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBwb3N0YnVpbGQudHh0CisKK0BlY2hvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IHBvc3RidWlsZC50eHQKKworQGVjaG8gKioqKioqIEluc3RhbGxpbmcgY29tbW9uIGFzc2VtYmxpZXMgKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgPj4gcG9zdGJ1aWxkLnR4dAoreGNvcHkgLi5cZXRjaC1hZGRpblxiaW5cRXRjaEFkZEluLmRsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJURlcGxveURpciUgICAgIC9ZICAgICA+PiBwb3N0YnVpbGQudHh0Cit4Y29weSAuLlxldGNoLWFkZGluXEV0Y2guQWRkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGVwbG95RGlyJSAgICAgL1kgICAgID4+IHBvc3RidWlsZC50eHQKKworQGVjaG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gcG9zdGJ1aWxkLnR4dAorCitnYWN1dGlsIC9pICVEZXBsb3lEaXIlXEV0Y2hBZGRJbi5kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBwb3N0YnVpbGQudHh0CisKK2VjaG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IHBvc3RidWlsZC50eHQKKworZ290byBkb25lCisKK2dvdG8gZG9uZQorCis6dXNhZ2UKK2VjaG8gVXNhZ2U6IFBvc3RCdWlsZC5iYXQgW0NPTkZJR1VSQVRJT05dCitlY2hvIENvbmZpZ3VyYXRpb24gaXMgYW55IHZhbGlkIFZTLk5FVCBjb25maWd1cmF0aW9uIChEZWJ1ZywgUmVsZWFzZSwgZXRjKS4KKworZ290byBkb25lCisKKzpkb25lCmRpZmYgLS1naXQgYS9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9wb3N0YnVpbGQvUG9zdEJ1aWxkLmNzcHJvaiBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL3Bvc3RidWlsZC9Qb3N0QnVpbGQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDk1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3Zpc3VhbHN0dWRpby1hZGRpbi9wb3N0YnVpbGQvUG9zdEJ1aWxkLmNzcHJvagpAQCAtMCwwICsxLDEwNyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByb2plY3RUeXBlPkxvY2FsPC9Qcm9qZWN0VHlwZT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjUwNzI3PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnsyRDg2MUE4OC0wNjNBLTRFMTAtQjQxNC1FRUI0RTlEOTE1QTF9PC9Qcm9qZWN0R3VpZD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPEFwcGxpY2F0aW9uSWNvbj4KKyAgICA8L0FwcGxpY2F0aW9uSWNvbj4KKyAgICA8QXNzZW1ibHlLZXlDb250YWluZXJOYW1lPgorICAgIDwvQXNzZW1ibHlLZXlDb250YWluZXJOYW1lPgorICAgIDxBc3NlbWJseU5hbWU+UG9zdEJ1aWxkPC9Bc3NlbWJseU5hbWU+CisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+CisgICAgPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgorICAgIDxEZWZhdWx0Q2xpZW50U2NyaXB0PkpTY3JpcHQ8L0RlZmF1bHRDbGllbnRTY3JpcHQ+CisgICAgPERlZmF1bHRIVE1MUGFnZUxheW91dD5HcmlkPC9EZWZhdWx0SFRNTFBhZ2VMYXlvdXQ+CisgICAgPERlZmF1bHRUYXJnZXRTY2hlbWE+SUU1MDwvRGVmYXVsdFRhcmdldFNjaGVtYT4KKyAgICA8RGVsYXlTaWduPmZhbHNlPC9EZWxheVNpZ24+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8Um9vdE5hbWVzcGFjZT5Qb3N0QnVpbGQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPFJ1blBvc3RCdWlsZEV2ZW50Pk9uQnVpbGRTdWNjZXNzPC9SdW5Qb3N0QnVpbGRFdmVudD4KKyAgICA8U3RhcnR1cE9iamVjdD4KKyAgICA8L1N0YXJ0dXBPYmplY3Q+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24+CisgICAgPC9VcGdyYWRlQmFja3VwTG9jYXRpb24+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPE91dHB1dFBhdGg+Llw8L091dHB1dFBhdGg+CisgICAgPEFsbG93VW5zYWZlQmxvY2tzPmZhbHNlPC9BbGxvd1Vuc2FmZUJsb2Nrcz4KKyAgICA8QmFzZUFkZHJlc3M+Mjg1MjEyNjcyPC9CYXNlQWRkcmVzcz4KKyAgICA8Q2hlY2tGb3JPdmVyZmxvd1VuZGVyZmxvdz5mYWxzZTwvQ2hlY2tGb3JPdmVyZmxvd1VuZGVyZmxvdz4KKyAgICA8Q29uZmlndXJhdGlvbk92ZXJyaWRlRmlsZT4KKyAgICA8L0NvbmZpZ3VyYXRpb25PdmVycmlkZUZpbGU+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4KKyAgICA8L0RvY3VtZW50YXRpb25GaWxlPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxGaWxlQWxpZ25tZW50PjQwOTY8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPE5vU3RkTGliPmZhbHNlPC9Ob1N0ZExpYj4KKyAgICA8Tm9XYXJuPgorICAgIDwvTm9XYXJuPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPFJlZ2lzdGVyRm9yQ29tSW50ZXJvcD5mYWxzZTwvUmVnaXN0ZXJGb3JDb21JbnRlcm9wPgorICAgIDxSZW1vdmVJbnRlZ2VyQ2hlY2tzPmZhbHNlPC9SZW1vdmVJbnRlZ2VyQ2hlY2tzPgorICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+ZmFsc2U8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxPdXRwdXRQYXRoPi5cPC9PdXRwdXRQYXRoPgorICAgIDxBbGxvd1Vuc2FmZUJsb2Nrcz5mYWxzZTwvQWxsb3dVbnNhZmVCbG9ja3M+CisgICAgPEJhc2VBZGRyZXNzPjI4NTIxMjY3MjwvQmFzZUFkZHJlc3M+CisgICAgPENoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3c+ZmFsc2U8L0NoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3c+CisgICAgPENvbmZpZ3VyYXRpb25PdmVycmlkZUZpbGU+CisgICAgPC9Db25maWd1cmF0aW9uT3ZlcnJpZGVGaWxlPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+CisgICAgPC9Eb2N1bWVudGF0aW9uRmlsZT4KKyAgICA8RGVidWdTeW1ib2xzPmZhbHNlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPEZpbGVBbGlnbm1lbnQ+NDA5NjwvRmlsZUFsaWdubWVudD4KKyAgICA8Tm9TdGRMaWI+ZmFsc2U8L05vU3RkTGliPgorICAgIDxOb1dhcm4+CisgICAgPC9Ob1dhcm4+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxSZWdpc3RlckZvckNvbUludGVyb3A+ZmFsc2U8L1JlZ2lzdGVyRm9yQ29tSW50ZXJvcD4KKyAgICA8UmVtb3ZlSW50ZWdlckNoZWNrcz5mYWxzZTwvUmVtb3ZlSW50ZWdlckNoZWNrcz4KKyAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPmZhbHNlPC9UcmVhdFdhcm5pbmdzQXNFcnJvcnM+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPERlYnVnVHlwZT5ub25lPC9EZWJ1Z1R5cGU+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJQb3N0QnVpbGQuYmF0IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICAgIDxQb3N0QnVpbGRFdmVudD5Qb3N0QnVpbGQuYmF0ICQoQ29uZmlndXJhdGlvbk5hbWUpPC9Qb3N0QnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy92aXN1YWxzdHVkaW8tYWRkaW4vdmlzdWFsc3R1ZGlvLWFkZGluLnNsbiBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL3Zpc3VhbHN0dWRpby1hZGRpbi5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiMGM5NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvdmlzdWFsc3R1ZGlvLWFkZGluL3Zpc3VhbHN0dWRpby1hZGRpbi5zbG4KQEAgLTAsMCArMSw0NSBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwCisjIFZpc3VhbCBTdHVkaW8gMjAwNQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorIyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJFdGNoLUFkZEluIiwgImV0Y2gtYWRkaW5cRXRjaC1BZGRJbi5jc3Byb2oiLCAiezc3RUJDNTE0LTY4MzQtNDg2RC1CNUUyLUNFMTdCMjZCRjIwMn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlBvc3RCdWlsZCIsICJwb3N0YnVpbGRcUG9zdEJ1aWxkLmNzcHJvaiIsICJ7MkQ4NjFBODgtMDYzQS00RTEwLUI0MTQtRUVCNEU5RDkxNUExfSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXs3N0VCQzUxNC02ODM0LTQ4NkQtQjVFMi1DRTE3QjI2QkYyMDJ9ID0gezc3RUJDNTE0LTY4MzQtNDg2RC1CNUUyLUNFMTdCMjZCRjIwMn0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs3N0VCQzUxNC02ODM0LTQ4NkQtQjVFMi1DRTE3QjI2QkYyMDJ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzdFQkM1MTQtNjgzNC00ODZELUI1RTItQ0UxN0IyNkJGMjAyfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3N0VCQzUxNC02ODM0LTQ4NkQtQjVFMi1DRTE3QjI2QkYyMDJ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc3RUJDNTE0LTY4MzQtNDg2RC1CNUUyLUNFMTdCMjZCRjIwMn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezJEODYxQTg4LTA2M0EtNEUxMC1CNDE0LUVFQjRFOUQ5MTVBMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyRDg2MUE4OC0wNjNBLTRFMTAtQjQxNC1FRUI0RTlEOTE1QTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezJEODYxQTg4LTA2M0EtNEUxMC1CNDE0LUVFQjRFOUQ5MTVBMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MkQ4NjFBODgtMDYzQS00RTEwLUI0MTQtRUVCNEU5RDkxNUExfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvQmFtYm9vLmJhdCBiL3NjcmlwdHMvQmFtYm9vLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Y0MWQyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9CYW1ib28uYmF0CkBAIC0wLDAgKzEsMzMgQEAKK0ByZW0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCitAcmVtICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorQHJlbSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKK0ByZW0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCitAcmVtICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorQHJlbSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKK0ByZW0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorQHJlbSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKK0ByZW0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCitAcmVtICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorQHJlbSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKK0ByZW0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAZWNobyBvZmYKKzo6IFRoaXMgYmF0Y2ggZmlsZSBpcyBhIHdyYXBwZXIgc28gdGhhdCB3ZSBjYW4gc2V0IHVwIG91ciBlbnZpcm9ubWVudCwgYW5kIHRoZW4KKzo6IGtpY2sgb2ZmIGEgYnVpbGQgaW4gYmFtYm9vCis6OiAgKGRpeHNvbikgdGhpcyByZWFsbHkgb25seSB1c2VmdWwgaW4gdGhlIEV0Y2ggY29tbWl0dGVycyBidWlsZC1lbnYKKworCis6OiBSdW4gb3VyIGVudiBzZXR1cCBzY3JpcHQKK2NhbGwgJVRPT0xTX0RJUiVcRW52aXJvbm1lbnQuYmF0IC1xbmMgLXAgRVRDSAorc2V0IEVUQ0hfSE9NRT0KKworOjogSGFjayB0byBnZXQgRE9UTkVUIGRlZmluZWQuIEVudmlyb25tZW50LmJhdCBzaG91bGQgZG8gaXQuCitzZXQgRE9UTkVUX0hPTUU9QzpcV0lORE9XU1xNaWNyb3NvZnQuTkVUXEZyYW1ld29ya1x2Mi4wLjUwNzI3CisKKzo6IENhbGwgYW50IHdpdGggdGhlIGFyZ3VtZW50cyB0aGF0IHdlIHBhc3MgaW4KK2NkIC4uCitjYWxsIGFudCAlKgorCmRpZmYgLS1naXQgYS9zY3JpcHRzL0NvbXBpbGUgQ3NoYXJwIEV0Y2ggRmlsZXMgTG54LmxhdW5jaCBiL3NjcmlwdHMvQ29tcGlsZSBDc2hhcnAgRXRjaCBGaWxlcyBMbngubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMWRkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0NvbXBpbGUgQ3NoYXJwIEV0Y2ggRmlsZXMgTG54LmxhdW5jaApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCisgPCEtLQ0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorIC0tPg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuUHJvZ3JhbUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3Byb2plY3RfbG9jfS9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JDc2hhcnAuYmFzaCIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIke3Byb2plY3RfbG9jfSIvPg0KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4NCmRpZmYgLS1naXQgYS9zY3JpcHRzL0NvbXBpbGUgQ3NoYXJwIEV0Y2ggRmlsZXMgV2luLmxhdW5jaCBiL3NjcmlwdHMvQ29tcGlsZSBDc2hhcnAgRXRjaCBGaWxlcyBXaW4ubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTU4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0NvbXBpbGUgQ3NoYXJwIEV0Y2ggRmlsZXMgV2luLmxhdW5jaApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCisgPCEtLQ0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorIC0tPg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuUHJvZ3JhbUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuZmF2b3JpdGVHcm91cHMiPg0KKzxsaXN0RW50cnkgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMubGF1bmNoR3JvdXAiLz4NCis8L2xpc3RBdHRyaWJ1dGU+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7cHJvamVjdF9sb2N9L3NjcmlwdHMvY29tcEV0Y2hGaWxlc0ZvckNzaGFycC5iYXQiLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30iLz4NCis8L2xhdW5jaENvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9Db21waWxlIEphdmEgRXRjaCBGaWxlcyBMbngubGF1bmNoIGIvc2NyaXB0cy9Db21waWxlIEphdmEgRXRjaCBGaWxlcyBMbngubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWEwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0NvbXBpbGUgSmF2YSBFdGNoIEZpbGVzIExueC5sYXVuY2gKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQorIDwhLS0NCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAtLT4NCis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlByb2dyYW1MYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3Byb2plY3RfbG9jfS9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JKYXZhLmJhc2giLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30iLz4NCis8L2xhdW5jaENvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9Db21waWxlIEphdmEgRXRjaCBGaWxlcyBXaW4ubGF1bmNoIGIvc2NyaXB0cy9Db21waWxlIEphdmEgRXRjaCBGaWxlcyBXaW4ubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODBhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0NvbXBpbGUgSmF2YSBFdGNoIEZpbGVzIFdpbi5sYXVuY2gKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQorIDwhLS0NCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAtLT4NCis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlByb2dyYW1MYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPg0KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuZmF2b3JpdGVHcm91cHMiPg0KKzxsaXN0RW50cnkgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMubGF1bmNoR3JvdXAiLz4NCis8L2xpc3RBdHRyaWJ1dGU+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7cHJvamVjdF9sb2N9L3NjcmlwdHMvY29tcEV0Y2hGaWxlc0ZvckphdmEuYmF0Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSIgdmFsdWU9IiR7cHJvamVjdF9sb2N9Ii8+DQorPC9sYXVuY2hDb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvQ29tcGlsZSBYbWwgRXRjaCBGaWxlcyBMbngubGF1bmNoIGIvc2NyaXB0cy9Db21waWxlIFhtbCBFdGNoIEZpbGVzIExueC5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5ZWYwMgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvQ29tcGlsZSBYbWwgRXRjaCBGaWxlcyBMbngubGF1bmNoCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pg0KKyA8IS0tDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgLS0+DQorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5Qcm9ncmFtTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30vc2NyaXB0cy9jb21wRXRjaEZpbGVzRm9yWG1sLmJhc2giLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30iLz4NCis8L2xhdW5jaENvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9Db21waWxlIFhtbCBFdGNoIEZpbGVzIFdpbi5sYXVuY2ggYi9zY3JpcHRzL0NvbXBpbGUgWG1sIEV0Y2ggRmlsZXMgV2luLmxhdW5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQ0Zjc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9Db21waWxlIFhtbCBFdGNoIEZpbGVzIFdpbi5sYXVuY2gKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQorIDwhLS0NCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAtLT4NCis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlByb2dyYW1MYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPg0KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuZmF2b3JpdGVHcm91cHMiPg0KKzxsaXN0RW50cnkgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMubGF1bmNoR3JvdXAiLz4NCis8L2xpc3RBdHRyaWJ1dGU+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7cHJvamVjdF9sb2N9L3NjcmlwdHMvY29tcEV0Y2hGaWxlc0ZvclhtbC5iYXQiLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30iLz4NCis8L2xhdW5jaENvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9FdGNoIC0gY3NoYXJwLCBhbGwsIGZvcmNlLmxhdW5jaCBiL3NjcmlwdHMvRXRjaCAtIGNzaGFycCwgYWxsLCBmb3JjZS5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkOTU3MwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvRXRjaCAtIGNzaGFycCwgYWxsLCBmb3JjZS5sYXVuY2gKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQorIDwhLS0NCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAtLT4NCis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlByb2dyYW1MYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPg0KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuZmF2b3JpdGVHcm91cHMiPg0KKzxsaXN0RW50cnkgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMubGF1bmNoR3JvdXAiLz4NCis8L2xpc3RBdHRyaWJ1dGU+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7cHJvamVjdF9sb2N9L3NjcmlwdHMvZXRjaC1lY2xpcHNlLmJhdCIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVE9PTF9BUkdVTUVOVFMiIHZhbHVlPSItcSYjMTM7JiMxMDstYiBjc2hhcnAmIzEzOyYjMTA7LXcgYWxsLGZvcmNlJiMxMzsmIzEwOy1uJiMxMzsmIzEwOy1kIC4uLy4uLy4uL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gvY3NoYXJwJiMxMzsmIzEwOyR7cmVzb3VyY2VfbmFtZX0iLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtjb250YWluZXJfbG9jfSIvPg0KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4NCmRpZmYgLS1naXQgYS9zY3JpcHRzL0V0Y2ggLSBjc2hhcnAsIGFsbC5sYXVuY2ggYi9zY3JpcHRzL0V0Y2ggLSBjc2hhcnAsIGFsbC5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5YWM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvRXRjaCAtIGNzaGFycCwgYWxsLmxhdW5jaApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCisgPCEtLQ0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorIC0tPg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuUHJvZ3JhbUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+DQorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5mYXZvcml0ZUdyb3VwcyI+DQorPGxpc3RFbnRyeSB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5sYXVuY2hHcm91cCIvPg0KKzwvbGlzdEF0dHJpYnV0ZT4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30vc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmF0Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UT09MX0FSR1VNRU5UUyIgdmFsdWU9Ii1xJiMxMzsmIzEwOy1iIGNzaGFycCYjMTM7JiMxMDstdyBhbGwmIzEzOyYjMTA7LW4mIzEzOyYjMTA7LWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9jc2hhcnAmIzEzOyYjMTA7JHtyZXNvdXJjZV9uYW1lfSIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIke2NvbnRhaW5lcl9sb2N9Ii8+DQorPC9sYXVuY2hDb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvRXRjaCAtIGNzaGFycC5sYXVuY2ggYi9zY3JpcHRzL0V0Y2ggLSBjc2hhcnAubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2NkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0V0Y2ggLSBjc2hhcnAubGF1bmNoCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pg0KKyA8IS0tDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgLS0+DQorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5Qcm9ncmFtTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4NCis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmZhdm9yaXRlR3JvdXBzIj4NCis8bGlzdEVudHJ5IHZhbHVlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmxhdW5jaEdyb3VwIi8+DQorPC9saXN0QXR0cmlidXRlPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3Byb2plY3RfbG9jfS9zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXQiLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RPT0xfQVJHVU1FTlRTIiB2YWx1ZT0iLXEmIzEzOyYjMTA7LWIgY3NoYXJwJiMxMzsmIzEwOy1uJiMxMzsmIzEwOy1kIC4uLy4uLy4uL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gvY3NoYXJwJiMxMzsmIzEwOyR7cmVzb3VyY2VfbmFtZX0iLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtjb250YWluZXJfbG9jfSIvPg0KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4NCmRpZmYgLS1naXQgYS9zY3JpcHRzL0V0Y2ggLSBqYXZhLCBhbGwsIGNsaWVudC5sYXVuY2ggYi9zY3JpcHRzL0V0Y2ggLSBqYXZhLCBhbGwsIGNsaWVudC5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1YjdjMAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvRXRjaCAtIGphdmEsIGFsbCwgY2xpZW50LmxhdW5jaApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCisgPCEtLQ0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorIC0tPg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuUHJvZ3JhbUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+DQorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5mYXZvcml0ZUdyb3VwcyI+DQorPGxpc3RFbnRyeSB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5sYXVuY2hHcm91cCIvPg0KKzwvbGlzdEF0dHJpYnV0ZT4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30vc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmF0Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UT09MX0FSR1VNRU5UUyIgdmFsdWU9Ii1xJiMxMzsmIzEwOy1iIGphdmEmIzEzOyYjMTA7LXcgYWxsLGNsaWVudCYjMTM7JiMxMDstbiYjMTM7JiMxMDstZCAuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL2phdmEmIzEzOyYjMTA7JHtyZXNvdXJjZV9uYW1lfSIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIke2NvbnRhaW5lcl9sb2N9Ii8+DQorPC9sYXVuY2hDb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvRXRjaCAtIGphdmEsIGFsbCwgZm9yY2UubGF1bmNoIGIvc2NyaXB0cy9FdGNoIC0gamF2YSwgYWxsLCBmb3JjZS5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4NTk2NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvRXRjaCAtIGphdmEsIGFsbCwgZm9yY2UubGF1bmNoCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pg0KKyA8IS0tDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgLS0+DQorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5Qcm9ncmFtTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4NCis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmZhdm9yaXRlR3JvdXBzIj4NCis8bGlzdEVudHJ5IHZhbHVlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmxhdW5jaEdyb3VwIi8+DQorPC9saXN0QXR0cmlidXRlPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3Byb2plY3RfbG9jfS9zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXQiLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RPT0xfQVJHVU1FTlRTIiB2YWx1ZT0iLXEmIzEzOyYjMTA7LWIgamF2YSYjMTM7JiMxMDstdyBhbGwsZm9yY2UmIzEzOyYjMTA7LW4mIzEzOyYjMTA7LWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhJiMxMzsmIzEwOyR7cmVzb3VyY2VfbmFtZX0iLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtjb250YWluZXJfbG9jfSIvPg0KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4NCmRpZmYgLS1naXQgYS9zY3JpcHRzL0V0Y2ggLSBqYXZhLCBhbGwsIHNlcnZlci5sYXVuY2ggYi9zY3JpcHRzL0V0Y2ggLSBqYXZhLCBhbGwsIHNlcnZlci5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NGY4NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvRXRjaCAtIGphdmEsIGFsbCwgc2VydmVyLmxhdW5jaApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCisgPCEtLQ0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorIC0tPg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuUHJvZ3JhbUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+DQorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5mYXZvcml0ZUdyb3VwcyI+DQorPGxpc3RFbnRyeSB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5sYXVuY2hHcm91cCIvPg0KKzwvbGlzdEF0dHJpYnV0ZT4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30vc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmF0Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UT09MX0FSR1VNRU5UUyIgdmFsdWU9Ii1xJiMxMzsmIzEwOy1iIGphdmEmIzEzOyYjMTA7LXcgYWxsLHNlcnZlciYjMTM7JiMxMDstbiYjMTM7JiMxMDstZCAuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL2phdmEmIzEzOyYjMTA7JHtyZXNvdXJjZV9uYW1lfSIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIke2NvbnRhaW5lcl9sb2N9Ii8+DQorPC9sYXVuY2hDb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvRXRjaCAtIGphdmEsIGFsbC5sYXVuY2ggYi9zY3JpcHRzL0V0Y2ggLSBqYXZhLCBhbGwubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTliNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0V0Y2ggLSBqYXZhLCBhbGwubGF1bmNoCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pg0KKyA8IS0tDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgLS0+DQorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5Qcm9ncmFtTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4NCis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmZhdm9yaXRlR3JvdXBzIj4NCis8bGlzdEVudHJ5IHZhbHVlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmxhdW5jaEdyb3VwIi8+DQorPC9saXN0QXR0cmlidXRlPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3Byb2plY3RfbG9jfS9zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXQiLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RPT0xfQVJHVU1FTlRTIiB2YWx1ZT0iLXEmIzEzOyYjMTA7LWIgamF2YSYjMTM7JiMxMDstdyBhbGwmIzEzOyYjMTA7LW4mIzEzOyYjMTA7LWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhJiMxMzsmIzEwOyR7cmVzb3VyY2VfbmFtZX0iLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtjb250YWluZXJfbG9jfSIvPg0KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4NCmRpZmYgLS1naXQgYS9zY3JpcHRzL0V0Y2ggLSBqYXZhLmxhdW5jaCBiL3NjcmlwdHMvRXRjaCAtIGphdmEubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2ViY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0V0Y2ggLSBqYXZhLmxhdW5jaApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCisgPCEtLQ0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorIC0tPg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuUHJvZ3JhbUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+DQorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5mYXZvcml0ZUdyb3VwcyI+DQorPGxpc3RFbnRyeSB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5sYXVuY2hHcm91cCIvPg0KKzwvbGlzdEF0dHJpYnV0ZT4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30vc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmF0Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UT09MX0FSR1VNRU5UUyIgdmFsdWU9Ii1xJiMxMzsmIzEwOy1iIGphdmEmIzEzOyYjMTA7LW4mIzEzOyYjMTA7LWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhJiMxMzsmIzEwOyR7cmVzb3VyY2VfbmFtZX0iLz4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHtjb250YWluZXJfbG9jfSIvPg0KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4NCmRpZmYgLS1naXQgYS9zY3JpcHRzL0V0Y2ggLSB4bWwubGF1bmNoIGIvc2NyaXB0cy9FdGNoIC0geG1sLmxhdW5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjljODk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9FdGNoIC0geG1sLmxhdW5jaApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCisgPCEtLQ0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorIC0tPg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuUHJvZ3JhbUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+DQorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5mYXZvcml0ZUdyb3VwcyI+DQorPGxpc3RFbnRyeSB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5sYXVuY2hHcm91cCIvPg0KKzwvbGlzdEF0dHJpYnV0ZT4NCis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHtwcm9qZWN0X2xvY30vc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmF0Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UT09MX0FSR1VNRU5UUyIgdmFsdWU9Ii1xJiMxMzsmIzEwOy1iIHhtbCYjMTM7JiMxMDstbiYjMTM7JiMxMDstZCAuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL3htbCYjMTM7JiMxMDske3Jlc291cmNlX25hbWV9Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSIgdmFsdWU9IiR7Y29udGFpbmVyX2xvY30iLz4NCis8L2xhdW5jaENvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9SRUFETUUudHh0IGIvc2NyaXB0cy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWRlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNSBAQAorVGhlc2Ugc2NyaXB0cyBhbmQgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggZWNsaXBzZS4KKworTk9URTogVGhlc2UgYXJlIHdpbmRvd3MgdmVyc2lvbnMuIElmIHlvdSBhcmUgdXNpbmcgdW5peCwgeW91J2xsIGhhdmUgdG8gY29tZSB1cAord2l0aCB5b3VyIG93biB2ZXJzaW9ucyBvZiB0aGVzZS4KKworSW4gb3JkZXIgZm9yIHRoZXNlIHNjcmlwdHMgdG8gd29yayBwcm9wZXJseSwgeW91IGFsc28gbmVlZCB0byBhZGQgYSB2YXJpYWJsZSB0bworeW91ciBlbnZpcm9ubWVudCBiZWZvcmUgc3RhcnRpbmcgZWNsaXBzZToKKworRVRDSF9ERVBFTkRFTlRfSkFSUz1DOlx3b3Jrc3BhY2UtZXRjaFx0b29sc1x2ZWxvY2l0eVwxLjVcdmVsb2NpdHktZGVwLTEuNS5qYXIKKworSWYgeW91J3JlIHVzaW5nIGNsb3ZlciwgeW91J2xsIG5lZWQgdG8gYWRkIGNsb3ZlciB0byB0aGF0OgorCitFVENIX0RFUEVOREVOVF9KQVJTPUM6XHdvcmtzcGFjZS1ldGNoXHRvb2xzXHZlbG9jaXR5XDEuNVx2ZWxvY2l0eS1kZXAtMS41LmphcjtDOlx3b3Jrc3BhY2UtZXRjaFx0b29sc1xjbG92ZXItYW50XDIuMy4yXGxpYlxjbG92ZXIuamFyCisKK0luIHRoZSBhYm92ZSwgcGxlYXNlIGVkaXQgdGhlIHBhdGggYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgbG9jYWwgZW52aXJvbm1lbnQuCmRpZmYgLS1naXQgYS9zY3JpcHRzL2FudHNldHVwLmJhdCBiL3NjcmlwdHMvYW50c2V0dXAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmQ0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2FudHNldHVwLmJhdApAQCAtMCwwICsxLDUwIEBACitAcmVtICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorQHJlbSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKK0ByZW0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCitAcmVtICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorQHJlbSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKK0ByZW0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCitAcmVtICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKK0ByZW0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCitAcmVtICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorQHJlbSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKK0ByZW0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCitAcmVtICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCityZW0gLS0gamF2YSBidWlsZHMgLS0KKworc2V0IFRPT0xTX0RJUj1DOlx3a3NcdG9vbHMKK3NldCBBTlRfSE9NRT0lVE9PTFNfRElSJVxhcGFjaGUtYW50XDEuNy4wCityZW0gc2V0IEpBVkFfSE9NRT1DOlxQcm9ncmFtIEZpbGVzXEphdmFcamRrMS42LjBfMDYKK3JlbSBvcHRpb25hbAorcmVtIHNldCBDTE9WRVJfSE9NRT0lVE9PTFNfRElSJVxjbG92ZXItYW50XDIuMy4yCityZW0gL29wdGlvbmFsCitQQVRIICVBTlRfSE9NRSVcYmluOyVKQVZBX0hPTUUlXGJpbjslUEFUSCUKKworcmVtIC0tIGRvdG5ldCBidWlsZHMgLS0KKworcmVtIG9wdGlvbmFsCitzZXQgRE9UTkVUX0hPTUU9QzpcV0lORE9XU1xNaWNyb3NvZnQuTkVUXEZyYW1ld29ya1x2Mi4wLjUwNzI3CitzZXQgTlVOSVRfSE9NRT0lVE9PTFNfRElSJVxOVW5pdFwyLjQuNworUEFUSCAlRE9UTkVUX0hPTUUlOyVOVU5JVF9IT01FJVxiaW47JVBBVEglCityZW0gL29wdGlvbmFsCisKK3JlbSAtLSBtb25vIGJ1aWxkcyAtLQorCityZW0gb3B0aW9uYWwKK3JlbSBzZXQgTU9OT19IT01FPS4uLgorcmVtIC9vcHRpb25hbAorCityZW0gLS0gaW5zdGFsbGVyIGJ1aWxkcyAtLQorCityZW0gb3B0aW9uYWwKK3NldCBOU0lTX0hPTUU9JVRPT0xTX0RJUiVcbnNpc1wyLjIzCityZW0gL29wdGlvbmFsCisKK3JlbSAtLSBzdGFuZGFsb25lIGV4YW1wbGUgYnVpbGRzIC0tCisKK3JlbSBzZXQgRVRDSF9IT01FPS4uLgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb21wRXRjaEZpbGVzRm9yQ3NoYXJwLmJhc2ggYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JDc2hhcnAuYmFzaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NmUwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb21wRXRjaEZpbGVzRm9yQ3NoYXJwLmJhc2gKQEAgLTAsMCArMSw3MyBAQAorIyEvdXNyL2xvY2FsL2Jpbi9iYXNoCisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorIyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisjICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisjICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyMgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisjICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorIyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisjICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCitzZXQgLWUKKyNzZXQgLXgKKworcT0tcQorYj0iLWIgY3NoYXJwIgorZD0iLWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9jc2hhcnAiCitpPSItSSAuIgorbj0tbgorCit3YWxmPSItdyBhbGwsZm9yY2UiCisgCit0ZXN0c2Rpcj10ZXN0cy9zcmMvbWFpbi9ldGNoCitleGFtcGxlc2Rpcj1leGFtcGxlcworCit4PWBwd2RgLworCitwdXNoZCAkdGVzdHNkaXIgPiAvZGV2L251bGwKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBBc3luYy5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQmFyLmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBCYXouZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIEJpZ0lkbC5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQ2xvc2luZy5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQ3VhZS5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgRm9vLmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBJbmhlcml0YW5jZS5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAkd2FsZiAgVGVzdDEuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIFRlc3QyLmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBUZXN0My5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgVGVzdDQuZXRjaAorIyAqKiogVGVzdDUuZXRjaCBpcyBhIG5lZ2F0aXZlIHRlc3QgKioqCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgVGVzdDYuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgJHdhbGYgIFRlc3RJbmNsdWRlcy5ldGNoCisjICoqKiBUZXN0UmVzZXJ2ZWRXb3Jkcy5ldGNoIGlzIGEgbmVnYXRpdmUgdGVzdCAqKioKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBUeXBlcy5ldGNoCitwb3BkID4gL2Rldi9udWxsCisKK3B1c2hkICRleGFtcGxlc2RpciA+IC9kZXYvbnVsbAorCitwdXNoZCBjaGF0L3NyYy9tYWluL2V0Y2ggPiAvZGV2L251bGwKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBDaGF0LmV0Y2gKK3BvcGQgPiAvZGV2L251bGwKKworcHVzaGQgZGlzdG1hcC9zcmMvbWFpbi9ldGNoID4gL2Rldi9udWxsCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgRGlzdHJpYnV0ZWRIYXNoVGFibGUuZXRjaAorcG9wZCA+IC9kZXYvbnVsbAorCitwdXNoZCBleGFtcGxlL3NyYy9tYWluL2V0Y2ggPiAvZGV2L251bGwKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBFeGFtcGxlLmV0Y2gKK3BvcGQgPiAvZGV2L251bGwKKworcHVzaGQgcGVyZi9zcmMvbWFpbi9ldGNoID4gL2Rldi9udWxsCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgUGVyZi5ldGNoCitwb3BkID4gL2Rldi9udWxsCisKK3BvcGQgPiAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29tcEV0Y2hGaWxlc0ZvckNzaGFycC5iYXQgYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JDc2hhcnAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3N2ZmYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JDc2hhcnAuYmF0CkBAIC0wLDAgKzEsNzIgQEAKK0ByZW0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCitAcmVtICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorQHJlbSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKK0ByZW0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCitAcmVtICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorQHJlbSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKK0ByZW0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorQHJlbSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKK0ByZW0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCitAcmVtICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorQHJlbSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKK0ByZW0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAc2V0IHE9LXEKK0BzZXQgYj0tYiBjc2hhcnAKK0BzZXQgZD0tZCAuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL2NzaGFycAorQHNldCBpPS1JIC4KK0BzZXQgbj0tbgorCitAc2V0IHdhbGY9LXcgYWxsLGZvcmNlCisKK0BzZXQgdGVzdHNkaXI9dGVzdHNcc3JjXG1haW5cZXRjaAorQHNldCBleGFtcGxlc2Rpcj1leGFtcGxlcworCitAc2V0IHg9JUNEJVwKK0BwdXNoZCAldGVzdHNkaXIlCisKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBBc3luYy5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQmFyLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBCYXouZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIEJpZ0lkbC5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ2xvc2luZy5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ3VhZS5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgRm9vLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBJbmhlcml0YW5jZS5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAld2FsZiUgVGVzdDEuZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIFRlc3QyLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBUZXN0My5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgVGVzdDQuZXRjaAorQHJlbSAqKiogVGVzdDUuZXRjaCBpcyBhIG5lZ2F0aXZlIHRlc3QgKioqCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgVGVzdDYuZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgJXdhbGYlIFRlc3RJbmNsdWRlcy5ldGNoCitAcmVtICoqKiBUZXN0UmVzZXJ2ZWRXb3Jkcy5ldGNoIGlzIGEgbmVnYXRpdmUgdGVzdCAqKioKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBUeXBlcy5ldGNoCisKK0Bwb3BkCitAcHVzaGQgJWV4YW1wbGVzZGlyJQorCitAcHVzaGQgY2hhdFxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ2hhdC5ldGNoCitAcG9wZAorCitAcHVzaGQgZGlzdG1hcFxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgRGlzdHJpYnV0ZWRIYXNoVGFibGUuZXRjaAorQHBvcGQKKworQHB1c2hkIGV4YW1wbGVcc3JjXG1haW5cZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIEV4YW1wbGUuZXRjaAorQHBvcGQKKworQHB1c2hkIHBlcmZcc3JjXG1haW5cZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIFBlcmYuZXRjaAorQHBvcGQKKworQHBvcGQKKworQHB1c2hkIGludGVyb3B0ZXN0ZXJcZXhhbXBsZVxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgSU9ULmV0Y2gKK0Bwb3BkCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JKYXZhLmJhc2ggYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JKYXZhLmJhc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjYzMDc5NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY29tcEV0Y2hGaWxlc0ZvckphdmEuYmFzaApAQCAtMCwwICsxLDczIEBACisjIS91c3IvbG9jYWwvYmluL2Jhc2gKKyMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisjICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisjICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyMgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyMgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisjICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyMgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKK3NldCAtZQorI3NldCAteAorCitxPS1xCitiPSItYiBqYXZhIgorZD0iLWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC9qYXZhIgoraT0iLUkgLiIKK249LW4KKword2FsZj0iLXcgYWxsLGZvcmNlIgorIAordGVzdHNkaXI9dGVzdHMvc3JjL21haW4vZXRjaAorZXhhbXBsZXNkaXI9ZXhhbXBsZXMKKworeD1gcHdkYC8KKworcHVzaGQgJHRlc3RzZGlyID4gL2Rldi9udWxsCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQXN5bmMuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIEJhci5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQmF6LmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBCaWdJZGwuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIENsb3NpbmcuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIEN1YWUuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIEZvby5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgSW5oZXJpdGFuY2UuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgJHdhbGYgIFRlc3QxLmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBUZXN0Mi5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgVGVzdDMuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIFRlc3Q0LmV0Y2gKKyMgKioqIFRlc3Q1LmV0Y2ggaXMgYSBuZWdhdGl2ZSB0ZXN0ICoqKgorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIFRlc3Q2LmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICR3YWxmICBUZXN0SW5jbHVkZXMuZXRjaAorIyAqKiogVGVzdFJlc2VydmVkV29yZHMuZXRjaCBpcyBhIG5lZ2F0aXZlIHRlc3QgKioqCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgVHlwZXMuZXRjaAorcG9wZCA+IC9kZXYvbnVsbAorCitwdXNoZCAkZXhhbXBsZXNkaXIgPiAvZGV2L251bGwKKworcHVzaGQgY2hhdC9zcmMvbWFpbi9ldGNoID4gL2Rldi9udWxsCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQ2hhdC5ldGNoCitwb3BkID4gL2Rldi9udWxsCisKK3B1c2hkIGRpc3RtYXAvc3JjL21haW4vZXRjaCA+IC9kZXYvbnVsbAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIERpc3RyaWJ1dGVkSGFzaFRhYmxlLmV0Y2gKK3BvcGQgPiAvZGV2L251bGwKKworcHVzaGQgZXhhbXBsZS9zcmMvbWFpbi9ldGNoID4gL2Rldi9udWxsCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgRXhhbXBsZS5ldGNoCitwb3BkID4gL2Rldi9udWxsCisKK3B1c2hkIHBlcmYvc3JjL21haW4vZXRjaCA+IC9kZXYvbnVsbAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIFBlcmYuZXRjaAorcG9wZCA+IC9kZXYvbnVsbAorCitwb3BkID4gL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JKYXZhLmJhdCBiL3NjcmlwdHMvY29tcEV0Y2hGaWxlc0ZvckphdmEuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTY3YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JKYXZhLmJhdApAQCAtMCwwICsxLDc3IEBACitAcmVtICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorQHJlbSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKK0ByZW0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCitAcmVtICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorQHJlbSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKK0ByZW0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCitAcmVtICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKK0ByZW0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCitAcmVtICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorQHJlbSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKK0ByZW0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCitAcmVtICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHNldCBxPS1xCitAc2V0IGI9LWIgamF2YQorQHNldCBkPS1kIC4uLy4uLy4uL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gvamF2YQorQHNldCBpPS1JIC4KK0BzZXQgbj0tbgorCitAc2V0IHdhbGY9LXcgYWxsLGZvcmNlCisKK0BzZXQgdGVzdHNkaXI9dGVzdHNcc3JjXG1haW5cZXRjaAorQHNldCBleGFtcGxlc2Rpcj1leGFtcGxlcworCitAc2V0IHg9JUNEJVwKK0BwdXNoZCAldGVzdHNkaXIlCisKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBBc3luYy5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQmFyLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBCYXouZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIEJpZ0lkbC5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ2xvc2luZy5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ3VhZS5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgRm9vLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBJbmhlcml0YW5jZS5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAld2FsZiUgVGVzdDEuZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIFRlc3QyLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBUZXN0My5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgVGVzdDQuZXRjaAorQHJlbSAqKiogVGVzdDUuZXRjaCBpcyBhIG5lZ2F0aXZlIHRlc3QgKioqCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgVGVzdDYuZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgJXdhbGYlIFRlc3RJbmNsdWRlcy5ldGNoCitAcmVtICoqKiBUZXN0UmVzZXJ2ZWRXb3Jkcy5ldGNoIGlzIGEgbmVnYXRpdmUgdGVzdCAqKioKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBUeXBlcy5ldGNoCisKK0Bwb3BkCitAcHVzaGQgJWV4YW1wbGVzZGlyJQorCitAcHVzaGQgY2hhdFxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ2hhdC5ldGNoCitAcG9wZAorCitAcHVzaGQgZGlzdG1hcFxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgRGlzdHJpYnV0ZWRIYXNoVGFibGUuZXRjaAorQHBvcGQKKworQHB1c2hkIGV4YW1wbGVcc3JjXG1haW5cZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIEV4YW1wbGUuZXRjaAorQHBvcGQKKworQHB1c2hkIHBlcmZcc3JjXG1haW5cZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIFBlcmYuZXRjaAorQHBvcGQKKworQHBvcGQKKworQHB1c2hkIHNlcnZpY2VzXGNvbmZpZ1xzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ29uZmlndXJhdGlvbi5ldGNoCitAcG9wZAorCitAcHVzaGQgaW50ZXJvcHRlc3RlclxleGFtcGxlXHNyY1xtYWluXGV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBJT1QuZXRjaAorQHBvcGQKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb21wRXRjaEZpbGVzRm9yWG1sLmJhc2ggYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JYbWwuYmFzaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWMzZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb21wRXRjaEZpbGVzRm9yWG1sLmJhc2gKQEAgLTAsMCArMSw3MyBAQAorIyEvdXNyL2xvY2FsL2Jpbi9iYXNoCisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorIyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisjICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisjICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyMgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisjICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorIyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisjICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCitzZXQgLWUKKyNzZXQgLXgKKworcT0tcQorYj0iLWIgeG1sIgorZD0iLWQgLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL21haW4vZXRjaC94bWwiCitpPSItSSAuIgorbj0tbgorCit3YWxmPSItdyBhbGwsZm9yY2UiCisgCit0ZXN0c2Rpcj10ZXN0cy9zcmMvbWFpbi9ldGNoCitleGFtcGxlc2Rpcj1leGFtcGxlcworCit4PWBwd2RgLworCitwdXNoZCAkdGVzdHNkaXIgPiAvZGV2L251bGwKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBBc3luYy5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQmFyLmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBCYXouZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIEJpZ0lkbC5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQ2xvc2luZy5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgQ3VhZS5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgRm9vLmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBJbmhlcml0YW5jZS5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAkd2FsZiAgVGVzdDEuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgICAgICAgIFRlc3QyLmV0Y2gKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBUZXN0My5ldGNoCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgVGVzdDQuZXRjaAorIyAqKiogVGVzdDUuZXRjaCBpcyBhIG5lZ2F0aXZlIHRlc3QgKioqCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgVGVzdDYuZXRjaAorJHt4fXNjcmlwdHMvZXRjaC1lY2xpcHNlLmJhc2ggJHEgJGIgJG4gJGQgJGkgJHdhbGYgIFRlc3RJbmNsdWRlcy5ldGNoCisjICoqKiBUZXN0UmVzZXJ2ZWRXb3Jkcy5ldGNoIGlzIGEgbmVnYXRpdmUgdGVzdCAqKioKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBUeXBlcy5ldGNoCitwb3BkID4gL2Rldi9udWxsCisKK3B1c2hkICRleGFtcGxlc2RpciA+IC9kZXYvbnVsbAorCitwdXNoZCBjaGF0L3NyYy9tYWluL2V0Y2ggPiAvZGV2L251bGwKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBDaGF0LmV0Y2gKK3BvcGQgPiAvZGV2L251bGwKKworcHVzaGQgZGlzdG1hcC9zcmMvbWFpbi9ldGNoID4gL2Rldi9udWxsCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgRGlzdHJpYnV0ZWRIYXNoVGFibGUuZXRjaAorcG9wZCA+IC9kZXYvbnVsbAorCitwdXNoZCBleGFtcGxlL3NyYy9tYWluL2V0Y2ggPiAvZGV2L251bGwKKyR7eH1zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoICRxICRiICRuICRkICRpICAgICAgICBFeGFtcGxlLmV0Y2gKK3BvcGQgPiAvZGV2L251bGwKKworcHVzaGQgcGVyZi9zcmMvbWFpbi9ldGNoID4gL2Rldi9udWxsCiske3h9c2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaCAkcSAkYiAkbiAkZCAkaSAgICAgICAgUGVyZi5ldGNoCitwb3BkID4gL2Rldi9udWxsCisKK3BvcGQgPiAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29tcEV0Y2hGaWxlc0ZvclhtbC5iYXQgYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JYbWwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTgxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvbXBFdGNoRmlsZXNGb3JYbWwuYmF0CkBAIC0wLDAgKzEsNzIgQEAKK0ByZW0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCitAcmVtICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorQHJlbSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKK0ByZW0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCitAcmVtICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorQHJlbSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKK0ByZW0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorQHJlbSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKK0ByZW0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCitAcmVtICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorQHJlbSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKK0ByZW0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAc2V0IHE9LXEKK0BzZXQgYj0tYiB4bWwKK0BzZXQgZD0tZCAuLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL3htbAorQHNldCBpPS1JIC4KK0BzZXQgbj0tbgorCitAc2V0IHdhbGY9LXcgYWxsLGZvcmNlCisKK0BzZXQgdGVzdHNkaXI9dGVzdHNcc3JjXG1haW5cZXRjaAorQHNldCBleGFtcGxlc2Rpcj1leGFtcGxlcworCitAc2V0IHg9JUNEJVwKK0BwdXNoZCAldGVzdHNkaXIlCisKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBBc3luYy5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQmFyLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBCYXouZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIEJpZ0lkbC5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ2xvc2luZy5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ3VhZS5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgRm9vLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBJbmhlcml0YW5jZS5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAld2FsZiUgVGVzdDEuZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIFRlc3QyLmV0Y2gKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBUZXN0My5ldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgVGVzdDQuZXRjaAorQHJlbSAqKiogVGVzdDUuZXRjaCBpcyBhIG5lZ2F0aXZlIHRlc3QgKioqCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgVGVzdDYuZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgJXdhbGYlIFRlc3RJbmNsdWRlcy5ldGNoCitAcmVtICoqKiBUZXN0UmVzZXJ2ZWRXb3Jkcy5ldGNoIGlzIGEgbmVnYXRpdmUgdGVzdCAqKioKK0BjYWxsICV4JXNjcmlwdHNcZXRjaC1lY2xpcHNlLmJhdCAlcSUgJWIlICVuJSAlZCUgJWklICAgICAgICBUeXBlcy5ldGNoCisKK0Bwb3BkCitAcHVzaGQgJWV4YW1wbGVzZGlyJQorCitAcHVzaGQgY2hhdFxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgQ2hhdC5ldGNoCitAcG9wZAorCitAcHVzaGQgZGlzdG1hcFxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgRGlzdHJpYnV0ZWRIYXNoVGFibGUuZXRjaAorQHBvcGQKKworQHB1c2hkIGV4YW1wbGVcc3JjXG1haW5cZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIEV4YW1wbGUuZXRjaAorQHBvcGQKKworQHB1c2hkIHBlcmZcc3JjXG1haW5cZXRjaAorQGNhbGwgJXglc2NyaXB0c1xldGNoLWVjbGlwc2UuYmF0ICVxJSAlYiUgJW4lICVkJSAlaSUgICAgICAgIFBlcmYuZXRjaAorQHBvcGQKKworQHBvcGQKKworQHB1c2hkIGludGVyb3B0ZXN0ZXJcZXhhbXBsZVxzcmNcbWFpblxldGNoCitAY2FsbCAleCVzY3JpcHRzXGV0Y2gtZWNsaXBzZS5iYXQgJXElICViJSAlbiUgJWQlICVpJSAgICAgICAgSU9ULmV0Y2gKK0Bwb3BkCmRpZmYgLS1naXQgYS9zY3JpcHRzL2V0Y2gtZWNsaXBzZS5iYXNoIGIvc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NDI3NGJlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmFzaApAQCAtMCwwICsxLDQzIEBACisjIS91c3IvbG9jYWwvYmluL2Jhc2gKKyMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisjICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisjICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyMgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyMgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisjICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyMgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisKKyNzZXQgLXgKK3NldCAtZQorCisjZWNobyBldGNoICQqCisjZXhpdAorCisjIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMKKyMgVGhpcyBzY3JpcHQgaXMgZm9yIHRoZSBzdXBwb3J0IG9mIHRoZSB2YXJpb3VzIGxhdW5jaCBjb25maWd1cmF0aW9ucworIyB1c2VkIHdpdGggZWNsaXBzZS4KKworaWYgdGVzdCAteiAiJEVUQ0hfREVQRU5ERU5UX0pBUlMiOyB0aGVuCitlY2hvIEVudmlyb25tZW50IHZhcmlhYmxlIEVUQ0hfREVQRU5ERU5UX0pBUlMgbm90IHNldC4KK2V4aXQgMQorZmkKKworRVRDSF9IT01FPWBkaXJuYW1lICIkMCJgLy4uCisKK2lmIHRlc3QgXCEgLWQgIiRFVENIX0hPTUUvYmluL2V0Y2giOyB0aGVuCisjZWNobyBDYW5ub3QgZmluZCBldGNoIGNsYXNzZXMuCitleGl0IDEKK2ZpCisKKyNlY2hvIGphdmEgLWNwICIkRVRDSF9IT01FL2JpbjokRVRDSF9ERVBFTkRFTlRfSkFSUyIgZXRjaC5jb21waWxlci5FdGNoTWFpbiAkezErIiRAIn0KK2VjaG8gZXRjaCAkezErIiRAIn0KK2phdmEgLWNwICIkRVRDSF9IT01FL2JpbjokRVRDSF9ERVBFTkRFTlRfSkFSUyIgZXRjaC5jb21waWxlci5FdGNoTWFpbiAkezErIiRAIn0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZXRjaC1lY2xpcHNlLmJhdCBiL3NjcmlwdHMvZXRjaC1lY2xpcHNlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWIzYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ldGNoLWVjbGlwc2UuYmF0CkBAIC0wLDAgKzEsMzUgQEAKK0ByZW0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCitAcmVtICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorQHJlbSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKK0ByZW0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCitAcmVtICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorQHJlbSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKK0ByZW0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCitAcmVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKK0ByZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorQHJlbSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKK0ByZW0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCitAcmVtICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorQHJlbSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKK0ByZW0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAZWNobyBvZmYKKworcmVtIFRoaXMgc2NyaXB0IGlzIGZvciB0aGUgc3VwcG9ydCBvZiB0aGUgdmFyaW91cyBsYXVuY2ggY29uZmlndXJhdGlvbnMKK3JlbSB1c2VkIHdpdGggZWNsaXBzZS4KKworaWYgIiVFVENIX0RFUEVOREVOVF9KQVJTJSIgbmVxICIiIGdvdG8gdGVzdF9ldGNoX2V4aXN0CitlY2hvIEVudmlyb25tZW50IHZhcmlhYmxlIEVUQ0hfREVQRU5ERU5UX0pBUlMgbm90IHNldC4KK2V4aXQgL2IgMQorZ290byA6ZW9mCisKKzp0ZXN0X2V0Y2hfZXhpc3QKK2lmIGV4aXN0ICIlfmRwMC4uXGJpblxvcmdcYXBhY2hlXGV0Y2giIGdvdG8gcnVuX2V0Y2gKK2VjaG8gQ2Fubm90IGZpbmQgZXRjaCBjbGFzc2VzLgorZXhpdCAvYiAxCitnb3RvIDplb2YKKworOnJ1bl9ldGNoCitlY2hvIGV0Y2ggJSoKK2phdmEgLWNwICIlfmRwMC4uXGJpbjslRVRDSF9ERVBFTkRFTlRfSkFSUyUiIG9yZy5hcGFjaGUuZXRjaC5jb21waWxlci5FdGNoTWFpbiAlKgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy92cy0yazUtdGFzay5iYXQgYi9zY3JpcHRzL3ZzLTJrNS10YXNrLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U4NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy92cy0yazUtdGFzay5iYXQKQEAgLTAsMCArMSw2NiBAQAorQHJlbSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKK0ByZW0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCitAcmVtICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorQHJlbSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKK0ByZW0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCitAcmVtICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorQHJlbSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKK0ByZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK0ByZW0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCitAcmVtICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorQHJlbSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKK0ByZW0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCitAcmVtICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorQHJlbSAgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKworQHJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAcmVtIEJ1aWxkIGEgc3RhbmRhcmQgVmlzdWFsIFN0dWRpbyAuTkVUIHNvbHV0aW9uLgorQHJlbQorQHJlbSBDb21tYW5kIGxpbmUgYXJndW1lbnRzOgorQHJlbSAgICAlMSAtPiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvbHV0aW9uIHRvIGJ1aWxkCitAcmVtICAgICUyIC0+IFRoZSBjb25maWd1cmF0aW9uIHRvIGJ1aWxkCitAcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQHNldGxvY2FsCitAc2V0IExJQj0KK0BzZXQgSU5DTFVERT0KK0BzZXQgVnNEb3ROZXQ9ZGV2ZW52LmNvbQorQGlmICIlVnNEb3ROZXREaXIlIj09IiIgIHNldCBWc0RvdE5ldERpcj0lVlM4MENPTU5UT09MUyUKK2NhbGwgIiVWc0RvdE5ldERpciVcdnN2YXJzMzIuYmF0IiA+bnVsCisKK0BpZiAiJTMiPT0iIiBnb3RvIHdpdGhvdXRwcm9qZWN0CisKK0BpZiAvaSAiJTIiPT0iY2xlYW4iIGdvdG8gY2xlYW4KK0BpZiAvaSAiJTIiPT0iQ2xlYW4iIGdvdG8gY2xlYW4KKworJVZzRG90TmV0JSAlMSAvYnVpbGQgJTIgL3Byb2plY3QgJTMKK0Bnb3RvIGVuZAorCis6Y2xlYW4KKyVWc0RvdE5ldCUgJTEgL2NsZWFuIERlYnVnIC9wcm9qZWN0ICUzCitAaWYgTk9UICVFUlJPUkxFVkVMJT09MCBAZ290byBlbmQKKworJVZzRG90TmV0JSAlMSAvY2xlYW4gUmVsZWFzZSAvcHJvamVjdCAlMworQGdvdG8gZW5kCisKKzp3aXRob3V0cHJvamVjdAorCitAaWYgL2kgIiUyIj09ImNsZWFuIiBnb3RvIGNsZWFubm9wcm9qZWN0CitAaWYgL2kgIiUyIj09IkNsZWFuIiBnb3RvIGNsZWFubm9wcm9qZWN0CisKKyVWc0RvdE5ldCUgJTEgL2J1aWxkICUyCitAZ290byBlbmQKKworOmNsZWFubm9wcm9qZWN0CislVnNEb3ROZXQlICUxIC9jbGVhbiBEZWJ1ZworQGlmIE5PVCAlRVJST1JMRVZFTCU9PTAgQGdvdG8gZW5kCisKKyVWc0RvdE5ldCUgJTEgL2NsZWFuIFJlbGVhc2UKK0Bnb3RvIGVuZAorCis6ZW5kCitAZWNoby4KK0BlY2hvIEVSUk9STEVWRUwgPSAlRVJST1JMRVZFTCUKK0BleGl0ICVFUlJPUkxFVkVMJQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL2NvbmZpZ3Rlc3RwbGFuLnR4dCBiL3NlcnZpY2VzL2NvbmZpZy9jb25maWd0ZXN0cGxhbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzYWUyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9jb25maWd0ZXN0cGxhbi50eHQKQEAgLTAsMCArMSwzNyBAQAorcG9zc2libGUgeWFtbCB1cGRhdGVzOgorCit1cGRhdGUga2V5IHZhbHVlIGluIG1hcDogc2NhbGFyIC0+IHNjYWxhciBbdXBkYXRlMV0KK2FkZCBzY2FsYXIga2V5IHRvIG1hcCBbdXBkYXRlMl0KK3JlbW92ZSBzY2FsYXIga2V5IGZyb20gbWFwIFt1cGRhdGUzXQorCit1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBzY2FsYXIgLT4gc2NhbGFyIFt1cGRhdGU0XQorYWRkIHNjYWxhciBlbGVtZW50IHRvIGxpc3QgW3VwZGF0ZTVdCityZW1vdmUgc2NhbGFyIGVsZW1lbnQgZnJvbSBsaXN0IFt1cGRhdGU2XQorCithZGQgbWFwIGtleSB0byBtYXAgW3VwZGF0ZTddCithZGQgbGlzdCBrZXkgdG8gbWFwIFt1cGRhdGU4XQorcmVtb3ZlIG1hcCBrZXkgZnJvbSBtYXAgW3VwZGF0ZTldCityZW1vdmUgbGlzdCBrZXkgZnJvbSBtYXAgW3VwZGF0ZTEwXQorCithZGQgbWFwIGVsZW1lbnQgdG8gbGlzdCBbdXBkYXRlMTFdCithZGQgbGlzdCBlbGVtZW50IHRvIGxpc3QgW3VwZGF0ZTEyXQorcmVtb3ZlIG1hcCBlbGVtZW50IGZyb20gbGlzdCBbdXBkYXRlMTNdCityZW1vdmUgbGlzdCBlbGVtZW50IGZyb20gbGlzdCBbdXBkYXRlMTRdCisKK3VwZGF0ZSBrZXkgdmFsdWUgaW4gbWFwOiBzY2FsYXIgLT4gbWFwIFt1cGRhdGUxNV0KK3VwZGF0ZSBrZXkgdmFsdWUgaW4gbWFwOiBzY2FsYXIgLT4gbGlzdCBbdXBkYXRlMTZdCit1cGRhdGUga2V5IHZhbHVlIGluIG1hcDogbWFwIC0+IHNjYWxhciBbdXBkYXRlMTddCit1cGRhdGUga2V5IHZhbHVlIGluIG1hcDogbWFwIC0+IG1hcCBbdXBkYXRlMThdCit1cGRhdGUga2V5IHZhbHVlIGluIG1hcDogbWFwIC0+IGxpc3QgW3VwZGF0ZTE5XQordXBkYXRlIGtleSB2YWx1ZSBpbiBtYXA6IGxpc3QgLT4gc2NhbGFyIFt1cGRhdGUyMF0KK3VwZGF0ZSBrZXkgdmFsdWUgaW4gbWFwOiBsaXN0IC0+IG1hcCBbdXBkYXRlMjFdCit1cGRhdGUga2V5IHZhbHVlIGluIG1hcDogbGlzdCAtPiBsaXN0IFt1cGRhdGUyMl0KKwordXBkYXRlIGVsZW1lbnQgaW4gbGlzdDogc2NhbGFyIC0+IG1hcCBbdXBkYXRlMjNdCit1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBzY2FsYXIgLT4gbGlzdCBbdXBkYXRlMjRdCit1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBtYXAgLT4gc2NhbGFyIFt1cGRhdGUyNV0KK3VwZGF0ZSBlbGVtZW50IGluIGxpc3Q6IG1hcCAtPiBtYXAgW3VwZGF0ZTI2XQordXBkYXRlIGVsZW1lbnQgaW4gbGlzdDogbWFwIC0+IGxpc3QgW3VwZGF0ZTI3XQordXBkYXRlIGVsZW1lbnQgaW4gbGlzdDogbGlzdCAtPiBzY2FsYXIgW3VwZGF0ZTI4XQordXBkYXRlIGVsZW1lbnQgaW4gbGlzdDogbGlzdCAtPiBtYXAgW3VwZGF0ZTI5XQordXBkYXRlIGVsZW1lbnQgaW4gbGlzdDogbGlzdCAtPiBsaXN0IFt1cGRhdGUzMF0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9lbXB0eS55bWwgYi9zZXJ2aWNlcy9jb25maWcvZW1wdHkueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvZW1wdHkueW1sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9sb2NhbC55bWwgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9sb2NhbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkNjg1YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL2xvY2FsLnltbApAQCAtMCwwICsxLDIgQEAKK2NvbmZpZ1VyaTogdGNwOi8vbG9jYWxob3N0OjQwMDEvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvcmVtb3RlP1RjcFRyYW5zcG9ydC5yZWNvbm5lY3REZWxheT00MDAwDQorYmxhaDogMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL2xvY2FsMi55bWwgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9sb2NhbDIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZDgyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9sb2NhbDIueW1sCkBAIC0wLDAgKzEgQEAKK2xpc3RlblVyaTogdGNwOi8vMC4wLjAuMDo0MDAyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvcmVtb3RlLnltbCBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3JlbW90ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkODIwYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3JlbW90ZS55bWwKQEAgLTAsMCArMSBAQAorbGlzdGVuVXJpOiB0Y3A6Ly8wLjAuMC4wOjQwMDINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9ldGNoL0NvbmZpZ0V4YW1wbGUuZXRjaCBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2V0Y2gvQ29uZmlnRXhhbXBsZS5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDNjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9ldGNoL0NvbmZpZ0V4YW1wbGUuZXRjaApAQCAtMCwwICsxLDYgQEAKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLmV4YW1wbGUKKworc2VydmljZSBDb25maWdFeGFtcGxlCit7CisJaW50IGFkZCggaW50IHgsIGludCB5ICkKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL0ltcGxDb25maWdFeGFtcGxlQ2xpZW50LmphdmEgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9JbXBsQ29uZmlnRXhhbXBsZUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2U3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9JbXBsQ29uZmlnRXhhbXBsZUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLmV4YW1wbGU7CisKKy8qKgorICogWW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgQmFzZUNvbmZpZ0V4YW1wbGVDbGllbnQuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KKyAqLworcHVibGljIGNsYXNzIEltcGxDb25maWdFeGFtcGxlQ2xpZW50IGV4dGVuZHMgQmFzZUNvbmZpZ0V4YW1wbGVDbGllbnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsQ29uZmlnRXhhbXBsZUNsaWVudC4KKwkgKgorCSAqIEBwYXJhbSBzZXJ2ZXIgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgc2VydmVyLgorCSAqLworCXB1YmxpYyBJbXBsQ29uZmlnRXhhbXBsZUNsaWVudCggUmVtb3RlQ29uZmlnRXhhbXBsZVNlcnZlciBzZXJ2ZXIgKQorCXsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCQorCS8qKgorCSAqIEEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncyggInVudXNlZCIgKQorCXByaXZhdGUgZmluYWwgUmVtb3RlQ29uZmlnRXhhbXBsZVNlcnZlciBzZXJ2ZXI7CisKKwkvLyBUT0RPIGluc2VydCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgQ29uZmlnRXhhbXBsZUNsaWVudAorCS8vIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9JbXBsQ29uZmlnRXhhbXBsZVNlcnZlci5qYXZhIGIvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvSW1wbENvbmZpZ0V4YW1wbGVTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU3MGQxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvSW1wbENvbmZpZ0V4YW1wbGVTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5leGFtcGxlOworCisvKioKKyAqIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VDb25maWdFeGFtcGxlU2VydmVyLiBBZGQgbWV0aG9kcyBoZXJlIHRvIHByb3ZpZGUKKyAqIGltcGxlbWVudGF0aW9ucyBvZiBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsQ29uZmlnRXhhbXBsZVNlcnZlciBleHRlbmRzIEJhc2VDb25maWdFeGFtcGxlU2VydmVyCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbENvbmZpZ0V4YW1wbGVTZXJ2ZXIuCisJICoKKwkgKiBAcGFyYW0gY2xpZW50IGEgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4KKwkgKi8KKwlwdWJsaWMgSW1wbENvbmZpZ0V4YW1wbGVTZXJ2ZXIoIFJlbW90ZUNvbmZpZ0V4YW1wbGVDbGllbnQgY2xpZW50ICkKKwl7CisJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCX0KKwkKKwkvKioKKwkgKiBBIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoICJ1bnVzZWQiICkKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUNvbmZpZ0V4YW1wbGVDbGllbnQgY2xpZW50OworCisJQE92ZXJyaWRlCisJcHVibGljIEludGVnZXIgYWRkKCBJbnRlZ2VyIHgsIEludGVnZXIgeSApCisJeworCQlyZXR1cm4geCArIHk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvTWFpbkNvbmZpZ0V4YW1wbGVDbGllbnQuamF2YSBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL01haW5Db25maWdFeGFtcGxlQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzZDNmMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL01haW5Db25maWdFeGFtcGxlQ2xpZW50LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC5zZXJ2aWNlcy5jb25maWcuZXhhbXBsZTsKKworLyoqCisgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ0V4YW1wbGVDbGllbnQuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlCisgKiBsaXN0ZW5lciBjcmVhdGVkIGJ5IE1haW5Db25maWdFeGFtcGxlTGlzdGVuZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluQ29uZmlnRXhhbXBsZUNsaWVudCBpbXBsZW1lbnRzIENvbmZpZ0V4YW1wbGVIZWxwZXIuQ29uZmlnRXhhbXBsZUNsaWVudEZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ0V4YW1wbGVDbGllbnQuCisJICogCisJICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyBDaGFuZ2UgdG8gY29ycmVjdCBVUkkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMiI7CisJCQorCQlSZW1vdGVDb25maWdFeGFtcGxlU2VydmVyIHNlcnZlciA9IENvbmZpZ0V4YW1wbGVIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsCisJCQluZXcgTWFpbkNvbmZpZ0V4YW1wbGVDbGllbnQoKSApOworCisJCS8vIENvbm5lY3QgdG8gdGhlIHNlcnZpY2UKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCisJCUludGVnZXIgeiA9IHNlcnZlci5hZGQoIDQsIDUgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYWRkIDQsIDUgPT4gIit6ICk7CisKKwkJLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBzZXJ2aWNlCisJCXNlcnZlci5fc3RvcEFuZFdhaXREb3duKCA0MDAwICk7CisJfQorCisJcHVibGljIENvbmZpZ0V4YW1wbGVDbGllbnQgbmV3Q29uZmlnRXhhbXBsZUNsaWVudCggUmVtb3RlQ29uZmlnRXhhbXBsZVNlcnZlciBzZXJ2ZXIgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IEltcGxDb25maWdFeGFtcGxlQ2xpZW50KCBzZXJ2ZXIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9NYWluQ29uZmlnRXhhbXBsZUxpc3RlbmVyMS5qYXZhIGIvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvTWFpbkNvbmZpZ0V4YW1wbGVMaXN0ZW5lcjEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhjYTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvTWFpbkNvbmZpZ0V4YW1wbGVMaXN0ZW5lcjEuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogJElkJAorICogCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5leGFtcGxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5zZXJ2aWNlcy5jb25maWcuZXhhbXBsZS5Db25maWdFeGFtcGxlSGVscGVyLkNvbmZpZ0V4YW1wbGVTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgQ29uZmlnRXhhbXBsZVNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW5Db25maWdFeGFtcGxlQ2xpZW50LiBUaGlzIGlzIGEgc3RhbmRhcmQgZXRjaCBsaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIE1haW5Db25maWdFeGFtcGxlTGlzdGVuZXIxIGltcGxlbWVudHMgQ29uZmlnRXhhbXBsZVNlcnZlckZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ0V4YW1wbGVTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gRGVmaW5lIHRoZSBsaXN0ZW5lciB1cmkuCisJCVN0cmluZyB1cmkgPSAidGNwOi8vMC4wLjAuMDo0MDAyIjsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibGlzdGVuIHVyaSA9ICIgKyB1cmkgKTsKKworCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIHN0YWNrLgorCQlTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyID0gQ29uZmlnRXhhbXBsZUhlbHBlci5uZXdMaXN0ZW5lciggdXJpLCBudWxsLAorCQkJbmV3IE1haW5Db25maWdFeGFtcGxlTGlzdGVuZXIxKCkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibGlzdGVuZXIgY3JlYXRlZCAiICsgbGlzdGVuZXIgKTsKKworCQkvLyBTdGFydCB0aGUgbGlzdGVuZXIgc3RhY2suCisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsaXN0ZW5lciBzdGFydGVkICIgKyBsaXN0ZW5lciApOworCX0KKworCXB1YmxpYyBDb25maWdFeGFtcGxlU2VydmVyIG5ld0NvbmZpZ0V4YW1wbGVTZXJ2ZXIoCisJCVJlbW90ZUNvbmZpZ0V4YW1wbGVDbGllbnQgY2xpZW50ICkKKwl7CisJCXJldHVybiBuZXcgSW1wbENvbmZpZ0V4YW1wbGVTZXJ2ZXIoIGNsaWVudCApOworCX0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL01haW5Db25maWdFeGFtcGxlTGlzdGVuZXIyLmphdmEgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9NYWluQ29uZmlnRXhhbXBsZUxpc3RlbmVyMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDg2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9NYWluQ29uZmlnRXhhbXBsZUxpc3RlbmVyMi5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiAkSWQkCisgKiAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLmV4YW1wbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5Db25maWd1cmF0aW9uU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5zZXJ2aWNlcy5jb25maWcuWWFtbENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLmV4YW1wbGUuQ29uZmlnRXhhbXBsZUhlbHBlci5Db25maWdFeGFtcGxlU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKKworLyoqCisgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ0V4YW1wbGVTZXJ2ZXIuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGxpc3RlbmVyIHRvIGFjY2VwdAorICogY29ubmVjdGlvbnMgZnJvbSBNYWluQ29uZmlnRXhhbXBsZUNsaWVudC4gVGhpcyBpcyBhIHN0YW5kYXJkIGV0Y2ggbGlzdGVuZXIKKyAqIG1vZGlmaWVkIHRvIGxvYWQgdGhlIGxpc3RlbiB1cmkgZnJvbSBhIGxvY2FsIGNvbmZpZyBhdCBzdGFydHVwLgorICovCitwdWJsaWMgY2xhc3MgTWFpbkNvbmZpZ0V4YW1wbGVMaXN0ZW5lcjIgaW1wbGVtZW50cyBDb25maWdFeGFtcGxlU2VydmVyRmFjdG9yeQoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTCA9ICJzZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9sb2NhbDIiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RFTl9VUkkgPSAibGlzdGVuVXJpIjsKKworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgQ29uZmlnRXhhbXBsZVNlcnZlci4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBPcGVuIHRoZSBsb2NhbCBjb25maWcuCisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgbG9jYWwgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgTE9DQUwgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibG9hZGVkIGxvY2FsIGNvbmZpZ3VyYXRpb24gbmFtZWQgJyIgKyBMT0NBTCArICInIiApOworCisJCS8vIEdldCB0aGUgbGlzdGVuZXIgdXJpIGZyb20gdGhlIGxvY2FsIGNvbmZpZy4KKwkJU3RyaW5nIHVyaSA9IGxvY2FsLmdldFN0cmluZ1BhdGgoIGxvY2FsLmdldFJvb3QoKSwgTElTVEVOX1VSSSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsaXN0ZW4gdXJpID0gIiArIHVyaSApOworCisJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgc3RhY2suCisJCVNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBDb25maWdFeGFtcGxlSGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsCisJCQluZXcgTWFpbkNvbmZpZ0V4YW1wbGVMaXN0ZW5lcjIoKSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsaXN0ZW5lciBjcmVhdGVkICIgKyBsaXN0ZW5lciApOworCisJCS8vIFN0YXJ0IHRoZSBsaXN0ZW5lciBzdGFjay4KKwkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImxpc3RlbmVyIHN0YXJ0ZWQgIiArIGxpc3RlbmVyICk7CisJfQorCisJcHVibGljIENvbmZpZ0V4YW1wbGVTZXJ2ZXIgbmV3Q29uZmlnRXhhbXBsZVNlcnZlcigKKwkJUmVtb3RlQ29uZmlnRXhhbXBsZUNsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsQ29uZmlnRXhhbXBsZVNlcnZlciggY2xpZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL2V4YW1wbGUvTWFpbkNvbmZpZ0V4YW1wbGVMaXN0ZW5lcjMuamF2YSBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL01haW5Db25maWdFeGFtcGxlTGlzdGVuZXIzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiODkyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL01haW5Db25maWdFeGFtcGxlTGlzdGVuZXIzLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiAkSWQkCisgKiAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRgorICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLmV4YW1wbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5Db25maWd1cmF0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5zZXJ2aWNlcy5jb25maWcuQ29uZmlndXJhdGlvblNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLllhbWxDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5leGFtcGxlLkNvbmZpZ0V4YW1wbGVIZWxwZXIuQ29uZmlnRXhhbXBsZVNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKy8qKgorICogTWFpbiBwcm9ncmFtIGZvciBDb25maWdFeGFtcGxlU2VydmVyLiBUaGlzIHByb2dyYW0gbWFrZXMgYSBsaXN0ZW5lciB0byBhY2NlcHQKKyAqIGNvbm5lY3Rpb25zIGZyb20gTWFpbkNvbmZpZ0V4YW1wbGVDbGllbnQuIFRoaXMgaXMgYSBzdGFuZGFyZCBldGNoIGxpc3RlbmVyCisgKiBtb2RpZmllZCB0byBsb2FkIHRoZSBsaXN0ZW4gdXJpIGZyb20gYSBsb2NhbCBjb25maWcgZmlsZSBhdCBzdGFydHVwIGFuZAorICogd2hlbmV2ZXIgdGhlIGZpbGUgY2hhbmdlcy4KKyAqLworcHVibGljIGNsYXNzIE1haW5Db25maWdFeGFtcGxlTGlzdGVuZXIzIGltcGxlbWVudHMgQ29uZmlnRXhhbXBsZVNlcnZlckZhY3RvcnkKK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUwgPSAic2VydmljZXMvY29uZmlnL2V4YW1wbGUvbG9jYWwyIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU5fVVJJID0gImxpc3RlblVyaSI7CisKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ0V4YW1wbGVTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQ3JlYXRlIHRoZSBzZXJ2ZXIgc2Vzc2lvbiBmYWN0b3J5LgorCQlmYWN0b3J5ID0gbmV3IE1haW5Db25maWdFeGFtcGxlTGlzdGVuZXIzKCk7CisJCQorCQkvLyBPcGVuIHRoZSBsb2NhbCBjb25maWcuCisJCWxvY2FsID0gbmV3IFlhbWxDb25maWcoIG5ldyBNeUxvY2FsQ29uZmlndXJhdGlvbkNsaWVudCgpLCBMT0NBTCApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsb2FkZWQgbG9jYWwgY29uZmlndXJhdGlvbiBuYW1lZCAnIiArIExPQ0FMICsgIiciICk7CisKKwkJLy8gU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gdGhlIGxvY2FsIGNvbmZpZy4KKwkJbG9jYWwuc3Vic2NyaWJlKCBsb2NhbC5nZXRSb290KCkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAic3Vic2NyaWJlZCB0byBjaGFuZ2VzIGluICciICsgTE9DQUwgKyAiJyIgKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlnRXhhbXBsZVNlcnZlckZhY3RvcnkgZmFjdG9yeTsKKwkKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uU2VydmVyIGxvY2FsOworCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIE15TG9jYWxDb25maWd1cmF0aW9uQ2xpZW50IGltcGxlbWVudHMKKwkJQ29uZmlndXJhdGlvbkNsaWVudAorCXsKKwkJcHVibGljIHZvaWQgY29uZmlnVmFsdWVzQ2hhbmdlZCggT2JqZWN0W10gdXBkYXRlZCApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggImxvY2FsIGNvbmZpZyBjaGFuZ2VkIiApOworCQkJdHJ5CisJCQl7CisJCQkJcmVzZXRMaXN0ZW5lcigpOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzZXRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFN0b3AgdGhlIG9sZCBsaXN0ZW5lci4KKwkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInN0b3BwaW5nIGxpc3RlbmVyICIgKyBsaXN0ZW5lciApOworCQkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUT1BfQU5EX1dBSVRfRE9XTiwgNDAwMCApOworCQkJbGlzdGVuZXIgPSBudWxsOworCQl9CisJCQorCQkvLyBHZXQgdGhlIGxpc3RlbmVyIHVyaSBmcm9tIHRoZSBsb2NhbCBjb25maWcuCisJCVN0cmluZyB1cmkgPSBsb2NhbC5nZXRTdHJpbmdQYXRoKCBsb2NhbC5nZXRSb290KCksIExJU1RFTl9VUkkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibGlzdGVuIHVyaSA9ICIgKyB1cmkgKTsKKwkJCisJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgc3RhY2suCisJCWxpc3RlbmVyID0gQ29uZmlnRXhhbXBsZUhlbHBlci5uZXdMaXN0ZW5lciggdXJpLCBudWxsLCBmYWN0b3J5ICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImxpc3RlbmVyIGNyZWF0ZWQgIiArIGxpc3RlbmVyICk7CisKKwkJLy8gU3RhcnQgdGhlIGxpc3RlbmVyIHN0YWNrLgorCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibGlzdGVuZXIgc3RhcnRlZCAiICsgbGlzdGVuZXIgKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU2VydmVyRmFjdG9yeSBsaXN0ZW5lcjsKKworCXB1YmxpYyBDb25maWdFeGFtcGxlU2VydmVyIG5ld0NvbmZpZ0V4YW1wbGVTZXJ2ZXIoCisJCVJlbW90ZUNvbmZpZ0V4YW1wbGVDbGllbnQgY2xpZW50ICkKKwl7CisJCXJldHVybiBuZXcgSW1wbENvbmZpZ0V4YW1wbGVTZXJ2ZXIoIGNsaWVudCApOworCX0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9leGFtcGxlL01haW5Db25maWdFeGFtcGxlTGlzdGVuZXI0LmphdmEgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9NYWluQ29uZmlnRXhhbXBsZUxpc3RlbmVyNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTQ3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvZXhhbXBsZS9NYWluQ29uZmlnRXhhbXBsZUxpc3RlbmVyNC5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogJElkJAorICogCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKKyAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5leGFtcGxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5zZXJ2aWNlcy5jb25maWcuQmFzZUNvbmZpZ3VyYXRpb25DbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5Db25maWd1cmF0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5zZXJ2aWNlcy5jb25maWcuQ29uZmlndXJhdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLkNvbmZpZ3VyYXRpb25TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5SZW1vdGVDb25maWd1cmF0aW9uU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5zZXJ2aWNlcy5jb25maWcuWWFtbENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLkNvbmZpZ3VyYXRpb25IZWxwZXIuQ29uZmlndXJhdGlvbkNsaWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5leGFtcGxlLkNvbmZpZ0V4YW1wbGVIZWxwZXIuQ29uZmlnRXhhbXBsZVNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKKworLyoqCisgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ0V4YW1wbGVTZXJ2ZXIuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGxpc3RlbmVyIHRvIGFjY2VwdAorICogY29ubmVjdGlvbnMgZnJvbSBNYWluQ29uZmlnRXhhbXBsZUNsaWVudC4gVGhpcyBpcyBhIHN0YW5kYXJkIGV0Y2ggbGlzdGVuZXIKKyAqIG1vZGlmaWVkIHRvIGxvYWQgdGhlIGxpc3RlbiB1cmkgZnJvbSBhIHJlbW90ZSBjb25maWcgd2hlbmV2ZXIgaXQgY2hhbmdlcy4KKyAqIFRoZSByZW1vdGUgY29uZmlnIGlzIGRlZmluZWQgaW4gYSBsb2NhbCBjb25maWcsIHdoaWNoIGlzIGFsc28gbW9uaXRvcmVkIGZvcgorICogY2hhbmdlcy4KKyAqLworcHVibGljIGNsYXNzIE1haW5Db25maWdFeGFtcGxlTGlzdGVuZXI0IGltcGxlbWVudHMgQ29uZmlnRXhhbXBsZVNlcnZlckZhY3RvcnkKK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUwgPSAic2VydmljZXMvY29uZmlnL2V4YW1wbGUvbG9jYWwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19VUkkgPSAiY29uZmlnVXJpIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU5fVVJJID0gImxpc3RlblVyaSI7CisKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ0V4YW1wbGVTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQ3JlYXRlIHRoZSBzZXJ2ZXIgc2Vzc2lvbiBmYWN0b3J5LgorCQlmYWN0b3J5ID0gbmV3IE1haW5Db25maWdFeGFtcGxlTGlzdGVuZXI0KCk7CisJCQorCQkvLyBDcmVhdGUgdGhlIHJlbW90ZSBjb25maWcgY2xpZW50IGZhY3RvcnkuCisJCWNvbmZpZ0NsaWVudEZhY3RvcnkgPSBuZXcgTXlDb25maWd1cmF0aW9uQ2xpZW50RmFjdG9yeSgpOworCQkKKwkJLy8gT3BlbiB0aGUgbG9jYWwgY29uZmlnLgorCQlsb2NhbCA9IG5ldyBZYW1sQ29uZmlnKCBuZXcgTXlMb2NhbENvbmZpZ3VyYXRpb25DbGllbnQoKSwgTE9DQUwgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibG9hZGVkIGxvY2FsIGNvbmZpZ3VyYXRpb24gbmFtZWQgJyIgKyBMT0NBTCArICInIiApOworCisJCS8vIFN1YnNjcmliZSB0byBjaGFuZ2VzIGluIHRoZSBsb2NhbCBjb25maWcuCisJCWxvY2FsLnN1YnNjcmliZSggbG9jYWwuZ2V0Um9vdCgpICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggInN1YnNjcmliZWQgdG8gY2hhbmdlcyBpbiAnIiArIExPQ0FMICsgIiciICk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlnRXhhbXBsZVNlcnZlckZhY3RvcnkgZmFjdG9yeTsKKwkKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uQ2xpZW50RmFjdG9yeSBjb25maWdDbGllbnRGYWN0b3J5OworCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvblNlcnZlciBsb2NhbDsKKworCXByaXZhdGUgc3RhdGljIGNsYXNzIE15TG9jYWxDb25maWd1cmF0aW9uQ2xpZW50IGltcGxlbWVudHMKKwkJQ29uZmlndXJhdGlvbkNsaWVudAorCXsKKwkJcHVibGljIHZvaWQgY29uZmlnVmFsdWVzQ2hhbmdlZCggT2JqZWN0W10gdXBkYXRlZCApCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggImxvY2FsIGNvbmZpZyBjaGFuZ2VkIiApOworCQkJdHJ5CisJCQl7CisJCQkJcmVzZXRSZW1vdGVDb25maWcoKTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc2V0UmVtb3RlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHJlbW90ZSAhPSBudWxsKQorCQl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJzdG9wcGluZyByZW1vdGUgY29uZmlnIiApOworCQkJcmVtb3RlLl9zdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKwkJCXJlbW90ZSA9IG51bGw7CisJCX0KKwkJCisJCS8vIEdldCB0aGUgcmVtb3RlIGNvbmZpZyB1cmkgZnJvbSB0aGUgbG9jYWwgY29uZmlnLgorCQljb25maWdVcmkgPSBsb2NhbC5nZXRTdHJpbmdQYXRoKCBsb2NhbC5nZXRSb290KCksIENPTkZJR19VUkkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAicmVtb3RlIGNvbmZpZyB1cmkgPSAiICsgY29uZmlnVXJpICk7CisKKwkJLy8gQ3JlYXRlIHRoZSByZW1vdGUgY29uZmlnIHN0YWNrLgorCQlyZW1vdGUgPSBDb25maWd1cmF0aW9uSGVscGVyLm5ld1NlcnZlciggY29uZmlnVXJpLCBudWxsLCBjb25maWdDbGllbnRGYWN0b3J5ICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggInJlbW90ZSBjb25maWcgY3JlYXRlZCAiK3JlbW90ZSApOworCQkKKwkJLy8gU3RhcnQgdGhlIHJlbW90ZSBjb25maWcgc3RhY2suCisJCVN5c3RlbS5vdXQucHJpbnRsbiggInN0YXJ0aW5nIHJlbW90ZSBjb25maWcgIityZW1vdGUgKTsKKwkJcmVtb3RlLl9zdGFydCgpOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb25maWdVcmk7CisJCisJcHJpdmF0ZSBzdGF0aWMgUmVtb3RlQ29uZmlndXJhdGlvblNlcnZlciByZW1vdGU7CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUNvbmZpZ3VyYXRpb25DbGllbnRGYWN0b3J5IGltcGxlbWVudHMKKwkJQ29uZmlndXJhdGlvbkNsaWVudEZhY3RvcnkKKwl7CisJCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xpZW50IG5ld0NvbmZpZ3VyYXRpb25DbGllbnQoCisJCQlSZW1vdGVDb25maWd1cmF0aW9uU2VydmVyIHNlcnZlciApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJcmV0dXJuIG5ldyBNeVJlbW90ZUNvbmZpZ3VyYXRpb25DbGllbnQoKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIE15UmVtb3RlQ29uZmlndXJhdGlvbkNsaWVudCBleHRlbmRzCisJCUJhc2VDb25maWd1cmF0aW9uQ2xpZW50CisJeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgX3Nlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJaWYgKGV2ZW50ID09IFNlc3Npb24uVVApCisJCQl7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCAicmVtb3RlIGNvbmZpZyBzZXJ2aWNlIGNvbm5lY3Rpb24gaXMgdXAiICk7CisJCQkJCisJCQkJU3RyaW5nIGNvbmZpZ05hbWUgPSBuZXcgVVJMKCBjb25maWdVcmkgKS5nZXRVcmkoKTsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJyZW1vdGUgY29uZmlnIG5hbWUgPSAnIgorCQkJCQkrIGNvbmZpZ05hbWUgKyAiJyIgKTsKKwkJCQkKKwkJCQlyb290ID0gcmVtb3RlLmxvYWRDb25maWcoIGNvbmZpZ05hbWUgKTsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsb2FkZWQgcmVtb3RlIGNvbmZpZyBuYW1lZCAnIgorCQkJCQkrIGNvbmZpZ05hbWUgKyAiJyIgKTsKKwkJCQkKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJzdWJzY3JpYmluZyB0byByZW1vdGUgY29uZmlnIiApOworCQkJCXJlbW90ZS5zdWJzY3JpYmUoIHJvb3QgKTsKKwkJCX0KKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBjb25maWdWYWx1ZXNDaGFuZ2VkKCBPYmplY3RbXSB1cGRhdGVkICkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJcmVzZXRMaXN0ZW5lcigpOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBPYmplY3Qgcm9vdDsKKworCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzZXRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIFN0b3AgdGhlIG9sZCBsaXN0ZW5lci4KKwkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInN0b3BwaW5nIGxpc3RlbmVyICIgKyBsaXN0ZW5lciApOworCQkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUT1BfQU5EX1dBSVRfRE9XTiwgNDAwMCApOworCQkJbGlzdGVuZXIgPSBudWxsOworCQl9CisJCQorCQkvLyBHZXQgdGhlIGxpc3RlbmVyIHVyaSBmcm9tIHRoZSByZW1vdGUgY29uZmlnLgorCQlTdHJpbmcgdXJpID0gcmVtb3RlLmdldFN0cmluZ1BhdGgoIHJvb3QsIExJU1RFTl9VUkkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibGlzdGVuIHVyaSA9ICIgKyB1cmkgKTsKKworCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIHN0YWNrLgorCQlsaXN0ZW5lciA9IENvbmZpZ0V4YW1wbGVIZWxwZXIubmV3TGlzdGVuZXIoIHVyaSwgbnVsbCwgZmFjdG9yeSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsaXN0ZW5lciBjcmVhdGVkICIgKyBsaXN0ZW5lciApOworCQkKKwkJLy8gU3RhcnQgdGhlIExpc3RlbmVyCisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsaXN0ZW5lciBzdGFydGVkICIgKyBsaXN0ZW5lciApOworCX0KKworCXByaXZhdGUgc3RhdGljIFNlcnZlckZhY3RvcnkgbGlzdGVuZXI7CisKKwlwdWJsaWMgQ29uZmlnRXhhbXBsZVNlcnZlciBuZXdDb25maWdFeGFtcGxlU2VydmVyKAorCQlSZW1vdGVDb25maWdFeGFtcGxlQ2xpZW50IGNsaWVudCApCisJeworCQlyZXR1cm4gbmV3IEltcGxDb25maWdFeGFtcGxlU2VydmVyKCBjbGllbnQgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvbG9jYWwueW1sIGIvc2VydmljZXMvY29uZmlnL2xvY2FsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUxZDFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL2xvY2FsLnltbApAQCAtMCwwICsxLDIgQEAKKy0tLQ0KK2NvbmZpZ1VyaTogdGNwOi8vbG9jYWxob3N0OjQwMDEvc2VydmljZXMvY29uZmlnL3JlbW90ZQ0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9yZW1vdGUueW1sIGIvc2VydmljZXMvY29uZmlnL3JlbW90ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5NDM4NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9yZW1vdGUueW1sCkBAIC0wLDAgKzEsMjYgQEAKK2Jvb2w6IHRydWUNCitib29sMjogImZhbHNlIg0KK2ludDogMjMNCitpbnQyOiAiMzQiDQoraW50MzogYWJjDQorZGJsOiA0LjUNCitkYmwyOiAiNS42Ig0KK2RibDM6IDY3DQorZGJsNDogYWJjDQorc3RyOiBib28NCitzdHIyOiBmYWxzZQ0KK2RhdGU6IDEyLzE5LzIwMDgNCitkYXRlMjogIWphdmEudXRpbC5EYXRlIDEyLzIzLzIwMDgNCit1c2VyczoNCisgIGZyZWQ6IDEyMzQNCisgIG1hcnk6IDIzNDUNCisgIGFsaWNlOiA5ODc2DQorICBqYWNrOiA4NzY1DQorcHJpbWVzOg0KKyAgLSAxDQorICAtIDINCisgIC0gMw0KKyAgLSA1DQorICAtIDcNCisgIC0gMTENCisgIC0gMTMNCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvc3JjL21haW4vZXRjaC9Db25maWd1cmF0aW9uLmV0Y2ggYi9zZXJ2aWNlcy9jb25maWcvc3JjL21haW4vZXRjaC9Db25maWd1cmF0aW9uLmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1MWZjNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9zcmMvbWFpbi9ldGNoL0NvbmZpZ3VyYXRpb24uZXRjaApAQCAtMCwwICsxLDQyNiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZworCisvKioKKyAqIENvbmZpZ3VyYXRpb24gc2VydmljZSBwcm92aWRlcyBhY2Nlc3MgdG8gY29uZmlndXJhdGlvbiBkYXRhLiBUaGUgZGF0YSBpcworICogbW9kZWxlZCBhcyBhIGdlbmVyYWwgdHJlZSBzdHJ1Y3R1cmUgd2l0aCBhIHJvb3Qgbm9kZSB3aGljaCBtaWdodCBiZSBhIHNjYWxhcgorICogKGJvb2xlYW4sIGludCwgZG91YmxlLCBzdHJpbmcsIERhdGV0aW1lKSwgYSBMaXN0LCBvciBhIE1hcC4gQSBMaXN0IGlzCisgKiBpbmRleGVkIGJ5IGludCBzdGFydGluZyBhdCAwLCB3aGlsZSBhIE1hcCBpcyBpbmRleGVkIGJ5IG5vbi1lbXB0eSBzdHJpbmcsCisgKiBnZW5lcmFsbHkgZm9sbG93aW5nIGlkZW50aWZpZXIgc3ludGF4IChjYXNlLXNlbnNpdGl2ZSwgaW5pdGlhbCBhbHBoYSB0aGVuCisgKiBhbHBoYW51bWVyaWMpIGJ1dCBub3QgcmVxdWlyZWQgdG8uIEVhY2ggbm9kZSBpbiB0aGlzIHRyZWUgaXMgYXNzaWduZWQgYW4gaWQuCisgKiBUaGUgaWQgb2YgdGhlIHJvb3Qgbm9kZSBpcyBudWxsLgorICoKKyAqIEF0IGEgZ2l2ZW4gbm9kZSBpbiB0aGUgdHJlZSwgeW91IG1heSBuYXZpZ2F0ZSB1cCB0byB0aGUgcGFyZW50LCBkb3duIHRvIHRoZQorICogY2hpbGRyZW4sIGdldCB0aGUgbmFtZSwgZ2V0IHRoZSBwYXRoIChhYnNvbHV0ZSwgZnJvbSB0aGUgcm9vdCksIGdldCB0aGUgdmFsdWUKKyAqIGlmIGEgc2NhbGFyLCBlbnVtZXJhdGUgdGhlIGNoaWxkcmVuIGlmIGEgTGlzdCBvciBNYXAsIHRlc3QgaWYgaXQgaXMgdGhlIHJvb3QsCisgKiBhIExpc3QsIG9yIGEgTWFwLgorICoKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG9ubHkgdXNlZCB0byBxdWVyeSBjb25maWd1cmF0aW9uIGRhdGEsIGl0IGRvZXMgbm90IGluY2x1ZGUKKyAqIGEgZmFjaWxpdHkgdG8gbGlzdCBhdmFpbGFibGUgY29uZmlndXJhdGlvbnMsIG5vciB0byBtYW5hZ2UgY29uZmlndXJhdGlvbnMuIEl0CisgKiBhbHNvIGRvZXMgbm90IGluY2x1ZGUgbWV0aG9kcyB0byBhbHRlciBleGlzdGluZyBjb25maWd1cmF0aW9uIGRhdGEsIGJ1dCBpdAorICogZG9lcyBhbGxvdyB5b3UgdG8gc3Vic2NyaWJlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCisgKgorICogQ29uZmlndXJhdGlvbiBkYXRhIGlzIG9yZ2FuaXplZCBpbnRvIHNlcGFyYXRlIHNwYWNlcy4gVGhlIHNwYWNlIGlzIGNhbGxlZCBvdXQKKyAqIGJ5IG5hbWUuIFlvdSBtdXN0IGhhdmUgYXV0aG9yaXphdGlvbiB0byBhY2Nlc3MgdGhlIG5hbWVkIHNwYWNlLiBUaGVyZSBpcyBubworICogcGFydGljdWxhciBtZWFuaW5nIHRvIHRoZSBuYW1lIG91dHNpZGUgdGhlIGludGVycHJldGF0aW9uIGdpdmVuIGJ5IHRoZSB0YXJnZXQKKyAqIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uIFRoZSBjb25maWd1cmF0aW9ucyBtaWdodCBjb21lIGZyb20gYSBkYXRhYmFzZSwgYQorICogZGlyZWN0b3J5IHRyZWUgb2YgeWFtbCBmaWxlcywgZXRjLiBGb3Igc2VydmljZXMsIGFueXdheSwgYSBnb29kIGlkZWEgd291bGQgYmUKKyAqIHRvIHVzZSB0aGUgc2VydmljZSBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIG5hbWUgc2VydmljZSBkaXJlY3RvcnkgZW50cnkuCisgKgorICogSGVyZSBpcyBhbiBleGFtcGxlIHVzZSBvZiB0aGVzZSBpbnRlcmZhY2VzOgorICoKKyAqIFJlbW90ZUNvbmZpZ3VyYXRpb25TZXJ2ZXIgc2VydmVyID0gQ29uZmlndXJhdGlvbkhlbHBlci5uZXdTZXJ2ZXIoIC4uLiApOworICogc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworICogc2VydmVyLmxvYWRDb25maWcoICJvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMubnMuTmFtZVNlcnZpY2UvdGl0YW4iICk7CisgKiBTdHJpbmcgaG9zdCA9IHNlcnZlci5nZXRTdHJpbmdQYXRoKCBudWxsLCAiaG9zdCIgKTsKKyAqIGludCBwb3J0ID0gc2VydmVyLmdldEludGVnZXJQYXRoKCBudWxsLCAicG9ydCIgKTsKKyAqCisgKiBBIHBhdGggaXMgYSBzdHJpbmcgZGVsaW1pdGVkIHdpdGggJy8nIGNoYXJhY3RlcnMsIG11Y2ggbGlrZSBhIGZpbGUgc3lzdGVtCisgKiBwYXRoLiBBIHBhdGggd2hpY2ggYmVnaW5zIHdpdGggYSAnLycgaXMgYWJzb2x1dGUgYW5kIGJlZ2lucyBhdCB0aGUgcm9vdC4KKyAqIE90aGVyd2lzZSB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byBhIHNwZWNpZmllZCBub2RlLiBUaGUgc3BlY2lhbCBuYW1lcyAnLicKKyAqIGFuZCAnLi4nIG1heSBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IG5vZGUgYW5kIHRoZSBwYXJlbnQgbm9kZS4KKyAqIFdoZW4gYSBwYXRoIHRyYXZlcnNlcyBhIExpc3QsIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBpcyBnaXZlIGFzIGFuIGludGVnZXIgaW4KKyAqIHRoZSBwYXRoIChlLmcuLCAvdXNlcnMvMS9hZ2UpLiBUaGlzIHdvdWxkIHJlZmVyIHRvIHRoZSBhZ2Ugb2YgdGhlIDJuZCB1c2VyCisgKiBpbiBhIGxpc3Qgb2YgdXNlcnMuIFdoZW4gYSBwYXRoIGlzIHNwZWNpZmllZCBhcyBudWxsIG9yIGJsYW5rLCBpdCBpcyB0aGUgc2FtZQorICogYXMgJy4nLgorICovCitAVGltZW91dCggMzAwMDAgKQorc2VydmljZSBDb25maWd1cmF0aW9uCit7CisJLyoqCisJICogQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpcyB1c2VkIHRvIHJlcG9ydCBhbnkgcHJvYmxlbSBsb2FkaW5nIGEKKwkgKiBDb25maWd1cmF0aW9uLgorCSAqIEBwYXJhbSBtc2cgYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtLgorCSAqLworCWV4Y2VwdGlvbiBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCBzdHJpbmcgbXNnICkKKwkKKwkvKioKKwkgKiBMb2FkcyBhIGNvbmZpZ3VyYXRpb24uIEFueSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGlzIGRpc2NhcmRlZCBhbG9uZworCSAqIHdpdGggYW55IHN1YnNjcmlwdGlvbnMuIERlcGVuZGluZyB1cG9uIHRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UKKwkgKiBjYXBhYmlsaXRpZXMsIGl0IG1heSBiZSBhYmxlIHRvIG1vbml0b3IgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5nZXMKKwkgKiBhbmQgYXV0b21hdGljYWxseSBsb2FkIHRoZW0uCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24uCisJICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHJvb3Qgbm9kZS4KKwkgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW55IHByb2JsZW0uCisJICovCisJQEF1dGhvcml6ZSggY2FuTG9hZCwgbmFtZSApCisJb2JqZWN0IGxvYWRDb25maWcoIHN0cmluZyBuYW1lICkKKwkJdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKwkKKwkvKioKKwkgKiBVbmxvYWRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaWYgYW55LgorCSAqLworCXZvaWQgdW5sb2FkQ29uZmlnKCkKKwkKKwkvKioKKwkgKiBUZXN0cyB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGV4aXN0cyBhbmQgY2FuIGJlIGxvYWRlZCBieSB0aGlzIHVzZXIuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24uCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25maWd1cmF0aW9uIGV4aXN0cyBhbmQgY2FuIGJlIGxvYWRlZCBieSB0aGlzIHVzZXIuCisJICovCisJYm9vbGVhbiBjYW5Mb2FkKCBzdHJpbmcgbmFtZSApCisJCisJLyoqCisJICogVGVzdHMgd2hldGhlciBhIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbG9hZGVkLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbG9hZGVkLgorCSAqLworCWJvb2xlYW4gaXNMb2FkZWQoKQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSByb290IG5vZGUuCisJICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHJvb3Qgbm9kZS4KKwkgKi8KKwlvYmplY3QgZ2V0Um9vdCgpCisJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9ERSBQUk9QRVJUSUVTIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogR2V0cyB0aGUgcGFyZW50IG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoZSBub2RlLCBvciBudWxsIGlmIGl0IGlzIHRoZSByb290LgorCSAqLworCW9iamVjdCBnZXRQYXJlbnQoIG9iamVjdCBpZCApCisJCisJLyoqCisJICogR2V0cyB0aGUgbmFtZSBvZiBhIG5vZGUgd2hpY2ggaXMgYSBjaGlsZCBvZiBhIG1hcCBvciBsaXN0LgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBuYW1lIGlzIGEgc3RyaW5nIGlmIHRoZSBwYXJlbnQgaXMgYQorCSAqIE1hcCBvciBhIExpc3QsIG9yICIiICh0aGUgZW1wdHkgc3RyaW5nKSBpZiB0aGUgdmFsdWUgaXMgdGhlIHJvb3QuCisJICovCisJc3RyaW5nIGdldE5hbWUoIG9iamVjdCBpZCApCisJCisJLyoqCisJICogR2V0cyB0aGUgaW5kZXggb2YgYSBub2RlIHdoaWNoIGlzIGEgY2hpbGQgb2YgYSBsaXN0LgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBub2RlIGlmIHRoZSBwYXJlbnQgaXMgYSBsaXN0LCBvciBudWxsIG90aGVyd2lzZS4KKwkgKi8KKwlpbnQgZ2V0SW5kZXgoIG9iamVjdCBpZCApCisJCisJLyoqCisJICogR2V0cyB0aGUgcGF0aCBvZiBhIG5vZGUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbmFtZXMgb2YgdGhlIGFuY2VzdG9ycyBvZiB0aGUgbm9kZQorCSAqIHdpdGggIi8iIGJldHdlZW4gdGhlIG5hbWVzLgorCSAqLworCXN0cmluZyBnZXRQYXRoKCBvYmplY3QgaWQgKQorCQorCS8qKgorCSAqIFRlc3RzIHdoZXRoZXIgYSBub2RlIGlzIHRoZSByb290LgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyB0aGUgcm9vdC4KKwkgKi8KKwlib29sZWFuIGlzUm9vdCggb2JqZWN0IGlkICkKKwkKKwkvKioKKwkgKiBUZXN0cyB3aGV0aGVyIGEgbm9kZSBpcyBhIExpc3QuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBub2RlIGlzIGEgTGlzdC4KKwkgKi8KKwlib29sZWFuIGlzTGlzdCggb2JqZWN0IGlkICkKKwkKKwkvKioKKwkgKiBUZXN0cyB3aGV0aGVyIGEgbm9kZSBpcyBhIE1hcC4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgYSBNYXAuCisJICovCisJYm9vbGVhbiBpc01hcCggb2JqZWN0IGlkICkKKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgYSBub2RlIHdoaWNoIGlzIGEgTGlzdCBvciBNYXAuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuLgorCSAqLworCWludCBzaXplKCBvYmplY3QgaWQgKQorCQorCS8vLy8vLy8vLy8vLy8vCisJLy8gQ0hJTERSRU4gLy8KKwkvLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIExpc3RzIHRoZSBpZHMgb2YgdGhlIGNoaWxkcmVuIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gb2Zmc2V0IGluZGV4IGludG8gdGhlIHJlc3VsdCBzZXQgb2YgdGhlIGZpcnN0IGl0ZW0gdG8gcmV0dXJuLiBJZgorCSAqIG51bGwsIDAgaXMgdXNlZC4KKwkgKiBAcGFyYW0gY291bnQgY291bnQgb2YgaXRlbXMgdG8gcmV0dXJuLiBJZiBudWxsLCBhbGwgcmVtYWluaW5nIGl0ZW1zIGFyZQorCSAqIHJldHVybmVkLgorCSAqIEByZXR1cm4gYXJyYXkgb2YgY2hpbGQgaWRzLCBvciBudWxsIGlmIHRoZSBub2RlIGlzIGEgc2NhbGFyIG5vZGUuCisJICovCisJb2JqZWN0W10gbGlzdENvbmZpZ0lkcyggb2JqZWN0IGlkLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQgKQorCQorCS8qKgorCSAqIExpc3RzIHRoZSBpZHMgb2YgdGhlIGNoaWxkcmVuIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIG5vZGUuCisJICogQHBhcmFtIG9mZnNldCBpbmRleCBpbnRvIHRoZSByZXN1bHQgc2V0IG9mIHRoZSBmaXJzdCBpdGVtIHRvIHJldHVybi4gSWYKKwkgKiBudWxsLCAwIGlzIHVzZWQuCisJICogQHBhcmFtIGNvdW50IGNvdW50IG9mIGl0ZW1zIHRvIHJldHVybi4gSWYgbnVsbCwgYWxsIHJlbWFpbmluZyBpdGVtcyBhcmUKKwkgKiByZXR1cm5lZC4KKwkgKiBAcmV0dXJuIGFycmF5IG9mIGNoaWxkIGlkcywgb3IgbnVsbCBpZiB0aGUgbm9kZSBpcyBhIHNjYWxhciBub2RlLgorCSAqLworCW9iamVjdFtdIGxpc3RDb25maWdQYXRoSWRzKCBvYmplY3QgaWQsIHN0cmluZyBwYXRoLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQgKQorCQorCS8qKgorCSAqIEdldHMgdGhlIGlkIG9mIGEgY2hpbGQgb2YgYSBub2RlIGJ5IGluZGV4LiBUaGUgbm9kZSBtdXN0IGJlIGEgTGlzdC4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXggb2YgdGhlIGNoaWxkIG5vZGUuIFN0YXJ0cyBhdCAwLgorCSAqIEByZXR1cm4gaWQgb2YgdGhlIGNoaWxkLgorCSAqLworCW9iamVjdCBnZXRDb25maWdJbmRleCggb2JqZWN0IGlkLCBpbnQgaW5kZXggKQorCisJLyoqCisJICogR2V0cyB0aGUgaWQgb2YgYSBjaGlsZCBvZiBhIG5vZGUgYnkgcGF0aC4gVGhlIG5vZGVzIGFsb25nIHRoZSBwYXRoIG11c3QKKwkgKiBhbGwgYmUgYSBMaXN0IG9yIE1hcCBleGNlcHQgdGhlIGxhc3QuIFdoZW5ldmVyIGEgcGF0aCBlbGVtZW50IGlzIGJlaW5nCisJICogYXBwbGllZCB0byBhIGxpc3Qgbm9kZSwgaXQgbXVzdCBiZSBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBwYXRoIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgbm9kZS4KKwkgKiBAcmV0dXJuIGlkIG9mIHRoZSBjaGlsZC4KKwkgKi8KKwlvYmplY3QgZ2V0Q29uZmlnUGF0aCggb2JqZWN0IGlkLCBzdHJpbmcgcGF0aCApCisJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9ERSAvIFBBVEggQUNDRVNTIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogVGVzdHMgd2hldGhlciBhIG5vZGUgaGFzIGEgdmFsdWUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHBhcmFtIHBhdGggYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBub2RlLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgYSB2YWx1ZS4KKyAgICAgKi8KKwlib29sZWFuIGhhc1ZhbHVlUGF0aCggb2JqZWN0IGlkLCBzdHJpbmcgcGF0aCApCisJCisJLyoqCisJICogR2V0cyB0aGUgdmFsdWUgdmFsdWUgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBwYXRoIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgbm9kZS4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSwgb3IgbnVsbCBpZiBub25lLiBOb3RlIHRoYXQgdGhlIHZhbHVlIG1heQorCSAqIG5vdCBiZSB0aGUgZXhwZWN0ZWQgdHlwZS4gVGhhdCBkZXBlbmRzIHVwb24gdGhlIHVuZGVybHlpbmcKKwkgKiBpbXBsZW1lbnRhdGlvbi4gSWYgeW91IHdhbnQgdGhlIHZhbHVlIGFzIGEgc3BlY2lmaWMgdHlwZSwgdXNlCisJICogZ2V0VHlwZVBhdGgoKSBtZXRob2RzIGJlbG93LgorICAgICAqLworCW9iamVjdCBnZXRWYWx1ZVBhdGgoIG9iamVjdCBpZCwgc3RyaW5nIHBhdGggKQorCisJLyoqCisJICogR2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIG5vZGUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHBhcmFtIHBhdGggYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBub2RlLgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBub2RlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisJYm9vbGVhbiBnZXRCb29sZWFuUGF0aCggb2JqZWN0IGlkLCBzdHJpbmcgcGF0aCApCisKKwkvKioKKwkgKiBHZXRzIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIG5vZGUuCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKwlpbnQgZ2V0SW50ZWdlclBhdGgoIG9iamVjdCBpZCwgc3RyaW5nIHBhdGggKQorCisJLyoqCisJICogR2V0cyB0aGUgZG91YmxlIHZhbHVlIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIG5vZGUuCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKwlkb3VibGUgZ2V0RG91YmxlUGF0aCggb2JqZWN0IGlkLCBzdHJpbmcgcGF0aCApCisKKwkvKioKKwkgKiBHZXRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBwYXRoIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgbm9kZS4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworCXN0cmluZyBnZXRTdHJpbmdQYXRoKCBvYmplY3QgaWQsIHN0cmluZyBwYXRoICkKKworCS8qKgorCSAqIEdldHMgdGhlIERhdGV0aW1lIHZhbHVlIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIG5vZGUuCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKwlEYXRldGltZSBnZXREYXRlUGF0aCggb2JqZWN0IGlkLCBzdHJpbmcgcGF0aCApCisJCisJLyoqCisJICogR2V0cyB0aGUgTGlzdCB2YWx1ZSBvZiBhIG5vZGUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHBhcmFtIHBhdGggYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBub2RlLgorCSAqIEBwYXJhbSBkZXB0aCBpZiBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgdGhlbXNlbHZlcyBtYXBzIG9yCisJICogbGlzdHMsIHJlY3Vyc2l2ZWx5IGdldCB0aG9zZSB2YWx1ZXMgdG9vIHVwIHRvIHRoZSBzcGVjaWZpZWQgZGVwdGguIERlcHRoCisJICogdmFsdWUgb2YgMCBtZWFucyBvbmx5IGdldCB0aGUgdmFsdWVzIG9mIHRoZSBub2RlIGl0c2VsZi4KKwkgKiBAcmV0dXJuIHRoZSBMaXN0IHZhbHVlIG9mIHRoZSBub2RlLgorCSAqLworCUxpc3QgZ2V0TGlzdFBhdGgoIG9iamVjdCBpZCwgc3RyaW5nIHBhdGgsIGludCBkZXB0aCApCisJCisJLyoqCisJICogR2V0cyB0aGUgTWFwIHZhbHVlIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIG5vZGUuCisJICogQHBhcmFtIGRlcHRoIGlmIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoZSBtYXAgYXJlIHRoZW1zZWx2ZXMgbWFwcyBvcgorCSAqIGxpc3RzLCByZWN1cnNpdmVseSBnZXQgdGhvc2UgdmFsdWVzIHRvbyB1cCB0byB0aGUgc3BlY2lmaWVkIGRlcHRoLiBEZXB0aAorCSAqIHZhbHVlIG9mIDAgbWVhbnMgb25seSBnZXQgdGhlIHZhbHVlcyBvZiB0aGUgbm9kZSBpdHNlbGYuCisJICogQHJldHVybiB0aGUgTWFwIHZhbHVlIG9mIHRoZSBub2RlLgorCSAqLworCU1hcCBnZXRNYXBQYXRoKCBvYmplY3QgaWQsIHN0cmluZyBwYXRoLCBpbnQgZGVwdGggKQorCQorCS8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9ERSBBQ0NFU1MgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogVGVzdHMgd2hldGhlciBhIG5vZGUgaGFzIGEgdmFsdWUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBub2RlIGhhcyBhIHZhbHVlLgorICAgICAqLworCWJvb2xlYW4gaGFzVmFsdWUoIG9iamVjdCBpZCApCisJCisJLyoqCisJICogR2V0cyB0aGUgdmFsdWUgdmFsdWUgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBub2RlLCBvciBudWxsIGlmIG5vbmUuIE5vdGUgdGhhdCB0aGUgdmFsdWUgbWF5CisJICogbm90IGJlIHRoZSBleHBlY3RlZCB0eXBlLiBUaGF0IGRlcGVuZHMgdXBvbiB0aGUgdW5kZXJseWluZworCSAqIGltcGxlbWVudGF0aW9uLiBJZiB5b3Ugd2FudCB0aGUgdmFsdWUgYXMgYSBzcGVjaWZpYyB0eXBlLCB1c2UgZ2V0VHlwZSgpCisJICogbWV0aG9kcyBiZWxvdy4KKyAgICAgKi8KKwlvYmplY3QgZ2V0VmFsdWUoIG9iamVjdCBpZCApCisKKwkvKioKKwkgKiBHZXRzIHRoZSBib29sZWFuIHZhbHVlIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworCWJvb2xlYW4gZ2V0Qm9vbGVhbiggb2JqZWN0IGlkICkKKworCS8qKgorCSAqIEdldHMgdGhlIGludGVnZXIgdmFsdWUgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBub2RlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisJaW50IGdldEludGVnZXIoIG9iamVjdCBpZCApCisKKwkvKioKKwkgKiBHZXRzIHRoZSBkb3VibGUgdmFsdWUgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBub2RlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisJZG91YmxlIGdldERvdWJsZSggb2JqZWN0IGlkICkKKworCS8qKgorCSAqIEdldHMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIG5vZGUuCisJICogQHBhcmFtIGlkIHRoZSBpZCBvZiBhIG5vZGUuCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKwlzdHJpbmcgZ2V0U3RyaW5nKCBvYmplY3QgaWQgKQorCisJLyoqCisJICogR2V0cyB0aGUgRGF0ZXRpbWUgdmFsdWUgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBub2RlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisJRGF0ZXRpbWUgZ2V0RGF0ZSggb2JqZWN0IGlkICkKKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBMaXN0IHZhbHVlIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gZGVwdGggaWYgYW55IG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGxpc3QgYXJlIHRoZW1zZWx2ZXMgbWFwcyBvcgorCSAqIGxpc3RzLCByZWN1cnNpdmVseSBnZXQgdGhvc2UgdmFsdWVzIHRvbyB1cCB0byB0aGUgc3BlY2lmaWVkIGRlcHRoLiBEZXB0aAorCSAqIHZhbHVlIG9mIDAgbWVhbnMgb25seSBnZXQgdGhlIHZhbHVlcyBvZiB0aGUgbm9kZSBpdHNlbGYuCisJICogQHJldHVybiB0aGUgTGlzdCB2YWx1ZSBvZiB0aGUgbm9kZS4KKwkgKi8KKwlMaXN0IGdldExpc3QoIG9iamVjdCBpZCwgaW50IGRlcHRoICkKKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBNYXAgdmFsdWUgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBkZXB0aCBpZiBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgbWFwIGFyZSB0aGVtc2VsdmVzIG1hcHMgb3IKKwkgKiBsaXN0cywgcmVjdXJzaXZlbHkgZ2V0IHRob3NlIHZhbHVlcyB0b28gdXAgdG8gdGhlIHNwZWNpZmllZCBkZXB0aC4gRGVwdGgKKwkgKiB2YWx1ZSBvZiAwIG1lYW5zIG9ubHkgZ2V0IHRoZSB2YWx1ZXMgb2YgdGhlIG5vZGUgaXRzZWxmLgorCSAqIEByZXR1cm4gdGhlIE1hcCB2YWx1ZSBvZiB0aGUgbm9kZS4KKwkgKi8KKwlNYXAgZ2V0TWFwKCBvYmplY3QgaWQsIGludCBkZXB0aCApCisJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENIQU5HRSBOT1RJRklDQVRJT04gLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogU3Vic2NyaWJlcyB0byBjaGFuZ2VzIGF0IG9yIGJlbG93IGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKi8KKwl2b2lkIHN1YnNjcmliZSggb2JqZWN0IGlkICkKKwkKKwkvKioKKwkgKiBTdWJzY3JpYmVzIHRvIGNoYW5nZXMgYXQgb3IgYmVsb3cgYSBub2RlLgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgYSBub2RlLgorCSAqIEBwYXJhbSBwYXRoIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgbm9kZS4KKwkgKi8KKwl2b2lkIHN1YnNjcmliZVBhdGgoIG9iamVjdCBpZCwgc3RyaW5nIHBhdGggKQorCQorCS8qKgorCSAqIFVuc3Vic2NyaWJlcyB0byBjaGFuZ2VzIGF0IG9yIGJlbG93IGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKi8KKwl2b2lkIHVuc3Vic2NyaWJlKCBvYmplY3QgaWQgKQorCQorCS8qKgorCSAqIFVuc3Vic2NyaWJlcyB0byBjaGFuZ2VzIGF0IG9yIGJlbG93IGEgbm9kZS4KKwkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIGEgbm9kZS4KKwkgKiBAcGFyYW0gcGF0aCBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIG5vZGUuCisJICovCisJdm9pZCB1bnN1YnNjcmliZVBhdGgoIG9iamVjdCBpZCwgc3RyaW5nIHBhdGggKQorCQorCS8qKgorCSAqIFVuc3Vic2NyaWJlcyB0byBhbGwgY2hhbmdlcy4KKwkgKi8KKwl2b2lkIHVuc3Vic2NyaWJlQWxsKCkKKwkKKwkvKioKKwkgKiBOb3RpZmllcyBjbGllbnQgb2YgY2hhbmdlcyB0byB0aGUgdmFsdWVzIG9mIG5vZGVzLiBBZGRlZCBvciBkZWxldGVkIG5vZGVzCisJICogYXJlIHRyZWF0ZWQgYXMgdXBkYXRlcyB0byB0aGUgcGFyZW50LiBSZXBvcnRpbmcgaXMgZG9uZSBvbiBhIGJlc3QgZWZmb3J0CisJICogYmFzaXMuIFRoZSBub2RlcyByZXBvcnRlZCBtaWdodCBiZSBhbiBhbmNlc3RvciBvZiB0aGUgbm9kZXMgd2hpY2gKKwkgKiBhY3R1YWxseSBjaGFuZ2VkLgorCSAqIEBwYXJhbSB1cGRhdGVkIHRoZSBpZHMgb2Ygbm9kZXMgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZC4KKwkgKi8KKwlARGlyZWN0aW9uKCBDbGllbnQgKQorCUBBc3luY1JlY2VpdmVyKCBRdWV1ZWQgKQorCXZvaWQgY29uZmlnVmFsdWVzQ2hhbmdlZCggb2JqZWN0W10gdXBkYXRlZCApCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL0ltcGxDb25maWd1cmF0aW9uQ2xpZW50LmphdmEgYi9zZXJ2aWNlcy9jb25maWcvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL0ltcGxDb25maWd1cmF0aW9uQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxMjU5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvSW1wbENvbmZpZ3VyYXRpb25DbGllbnQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZzsKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlQ29uZmlndXJhdGlvbkNsaWVudC4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgSW1wbENvbmZpZ3VyYXRpb25DbGllbnQgZXh0ZW5kcyBCYXNlQ29uZmlndXJhdGlvbkNsaWVudAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxDb25maWd1cmF0aW9uQ2xpZW50LgorCSAqCisJICogQHBhcmFtIHNlcnZlciBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCisJICovCisJcHVibGljIEltcGxDb25maWd1cmF0aW9uQ2xpZW50KCBSZW1vdGVDb25maWd1cmF0aW9uU2VydmVyIHNlcnZlciApCisJeworCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwl9CisJCisJLyoqCisJICogQSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gVXNlIHRoaXMgdG8gc2VuZCBhCisJICogbWVzc2FnZSB0byB0aGUgc2VydmVyLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCAidW51c2VkIiApCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVDb25maWd1cmF0aW9uU2VydmVyIHNlcnZlcjsKKworCS8vIFRPRE8gaW5zZXJ0IG1ldGhvZHMgaGVyZSB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBDb25maWd1cmF0aW9uQ2xpZW50CisJLy8gbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvTWFpbkNvbmZpZ3VyYXRpb25DbGllbnQuamF2YSBiL3NlcnZpY2VzL2NvbmZpZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvTWFpbkNvbmZpZ3VyYXRpb25DbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEzMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9NYWluQ29uZmlndXJhdGlvbkNsaWVudC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgQ29uZmlndXJhdGlvbkNsaWVudC4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUKKyAqIGxpc3RlbmVyIGNyZWF0ZWQgYnkgTWFpbkNvbmZpZ3VyYXRpb25MaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIE1haW5Db25maWd1cmF0aW9uQ2xpZW50IGltcGxlbWVudHMKKwlDb25maWd1cmF0aW9uSGVscGVyLkNvbmZpZ3VyYXRpb25DbGllbnRGYWN0b3J5Cit7CisJLyoqCisJICogTWFpbiBwcm9ncmFtIGZvciBDb25maWd1cmF0aW9uQ2xpZW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGdldCBvdXIgY29uZmlnVXJpIGZyb20gYSBsb2NhbCBjb25maWcgZmlsZS4KKwkJQ29uZmlndXJhdGlvblNlcnZlciBsb2NhbCA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCAic2VydmljZXMvY29uZmlnL2xvY2FsIiApOworCQlTdHJpbmcgY29uZmlnVXJpID0gbG9jYWwuZ2V0U3RyaW5nUGF0aCggbG9jYWwuZ2V0Um9vdCgpLCAiY29uZmlnVXJpIiApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJjb25maWdVcmkgPSAiK2NvbmZpZ1VyaSApOworCQlsb2NhbC51bmxvYWRDb25maWcoKTsKKwkJbG9jYWwgPSBudWxsOworCQkKKwkJUmVtb3RlQ29uZmlndXJhdGlvblNlcnZlciBzZXJ2ZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLm5ld1NlcnZlcigKKwkJCWNvbmZpZ1VyaSwgbnVsbCwgbmV3IE1haW5Db25maWd1cmF0aW9uQ2xpZW50KCkgKTsKKworCQkvLyBDb25uZWN0IHRvIHRoZSBzZXJ2aWNlLgorCQlzZXJ2ZXIuX3N0YXJ0QW5kV2FpdFVwKCA0MDAwICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImNvbm5lY3RlZCB0byBjb25maWcgc2VydmljZSIgKTsKKwkJCisJCVN0cmluZyBuYW1lID0gbmV3IFVSTCggY29uZmlnVXJpICkuZ2V0VXJpKCk7CisJCU9iamVjdCByb290ID0gc2VydmVyLmxvYWRDb25maWcoIG5hbWUgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibG9hZGVkIGNvbmZpZ3VyYXRpb24gbmFtZWQgJyIrbmFtZSsiJyIgKTsKKwkJCisJCS8vIExvYWQgYSBjb25maWcgYW5kIHBsYXkgd2l0aCBpdC4KKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYm9vbCA9ICIrc2VydmVyLmdldEJvb2xlYW5QYXRoKCByb290LCAiYm9vbCIgKSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJpbnQgPSAiK3NlcnZlci5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImludCIgKSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJkYmwgPSAiK3NlcnZlci5nZXREb3VibGVQYXRoKCByb290LCAiZGJsIiApICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggInN0ciA9ICIrc2VydmVyLmdldFN0cmluZ1BhdGgoIHJvb3QsICJzdHIiICkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiZGF0ZSA9ICIrc2VydmVyLmdldERhdGVQYXRoKCByb290LCAiZGF0ZSIgKSApOworCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCAidXNlcnMvbWFyeSA9ICIrc2VydmVyLmdldFN0cmluZ1BhdGgoIHJvb3QsICJ1c2Vycy9tYXJ5IiApICk7CisJCQorCQlPYmplY3QgdXNlcnMgPSBzZXJ2ZXIuZ2V0Q29uZmlnUGF0aCggcm9vdCwgInVzZXJzIiApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ1c2Vycy9tYXJ5ID0gIitzZXJ2ZXIuZ2V0U3RyaW5nUGF0aCggdXNlcnMsICJtYXJ5IiApICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggInVzZXJzL2FsaWNlID0gIitzZXJ2ZXIuZ2V0U3RyaW5nUGF0aCggdXNlcnMsICJhbGljZSIgKSApOworCisJCVN5c3RlbS5vdXQucHJpbnRsbiggInByaW1lcy80ID0gIitzZXJ2ZXIuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJwcmltZXMvNCIgKSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJwcmltZXMvNSA9ICIrc2VydmVyLmdldEludGVnZXJQYXRoKCByb290LCAicHJpbWVzLzUiICkgKTsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbiggInBhdGhzOiIgKTsKKwkJZm9yIChPYmplY3Qgbzogc2VydmVyLmxpc3RDb25maWdJZHMoIHJvb3QsIG51bGwsIG51bGwgKSkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggc2VydmVyLmdldFBhdGgoIG8gKSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJkb25lLiIgKTsKKwkJCisJCS8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmljZS4KKwkJc2VydmVyLl9zdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKwl9CisKKwlwdWJsaWMgQ29uZmlndXJhdGlvbkNsaWVudCBuZXdDb25maWd1cmF0aW9uQ2xpZW50KAorCQlSZW1vdGVDb25maWd1cmF0aW9uU2VydmVyIHNlcnZlciApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgSW1wbENvbmZpZ3VyYXRpb25DbGllbnQoIHNlcnZlciApOworCX0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvTWFpbkNvbmZpZ3VyYXRpb25MaXN0ZW5lci5qYXZhIGIvc2VydmljZXMvY29uZmlnL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9NYWluQ29uZmlndXJhdGlvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiZGVkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC9zZXJ2aWNlcy9jb25maWcvTWFpbkNvbmZpZ3VyYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5PYmpTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guc2VydmljZXMuY29uZmlnLkNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgQ29uZmlndXJhdGlvblNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW5Db25maWd1cmF0aW9uQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpbkNvbmZpZ3VyYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25IZWxwZXIuQ29uZmlndXJhdGlvblNlcnZlckZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIENvbmZpZ3VyYXRpb25TZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gVE9ETyBDaGFuZ2UgdG8gY29ycmVjdCBVUkkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly8wLjAuMC4wOjQwMDEiOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IENvbmZpZ3VyYXRpb25IZWxwZXIubmV3TGlzdGVuZXIoIHVyaSwgbnVsbCwKKwkJCW5ldyBNYWluQ29uZmlndXJhdGlvbkxpc3RlbmVyKCkgKTsKKworCQkvLyBTdGFydCB0aGUgTGlzdGVuZXIKKwkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisJfQorCisJcHVibGljIENvbmZpZ3VyYXRpb25TZXJ2ZXIgbmV3Q29uZmlndXJhdGlvblNlcnZlcigKKwkJUmVtb3RlQ29uZmlndXJhdGlvbkNsaWVudCBjbGllbnQgKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBNeVlhbWxDb25maWcoIGNsaWVudCApOworCX0KKwkKKwkvKioKKwkgKiBXcmFwcGVyIGFyb3VuZCBZYW1sQ29uZmlnIHdoaWNoIHdhdGNoZXMgZm9yIHtAbGluayBTZXNzaW9uI0RPV059IGFuZAorCSAqIHVubG9hZHMgdGhlIGNvbmZpZyAodGh1cyBjYW5jZWxpbmcgYWxsIHN1YnNjcmlwdGlvbnMpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlZYW1sQ29uZmlnIGV4dGVuZHMgWWFtbENvbmZpZyBpbXBsZW1lbnRzIE9ialNlc3Npb24KKwl7CisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIE15WWFtbENvbmZpZy4KKwkJICogQHBhcmFtIGNsaWVudAorCQkgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKwkJICovCisJCXB1YmxpYyBNeVlhbWxDb25maWcoIENvbmZpZ3VyYXRpb25DbGllbnQgY2xpZW50ICkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKwkJeworCQkJc3VwZXIoIGNsaWVudCApOworCQl9CisKKwkJcHVibGljIE9iamVjdCBfc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnkgIitxdWVyeSApOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBfc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBfc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlpZiAoZXZlbnQgPT0gU2Vzc2lvbi5ET1dOKQorCQkJCXVubG9hZENvbmZpZygpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9ZYW1sQ29uZmlnLmphdmEgYi9zZXJ2aWNlcy9jb25maWcvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL1lhbWxDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQzNTUzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9ZYW1sQ29uZmlnLmphdmEKQEAgLTAsMCArMSwxMzk1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQWxhcm1MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5BbGFybU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLklkR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRvZG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVG9kb01hbmFnZXI7CitpbXBvcnQgb3JnLmhvLnlhbWwuWWFtbDsKK2ltcG9ydCBvcmcuaG8ueWFtbC5leGNlcHRpb24uWWFtbEV4Y2VwdGlvbjsKKworCisvKiogTG9jYWwgWWFtbCBpbXBsZW1lbnRhdGlvbiBvZiBDb25maWd1cmF0aW9uU2VydmVyICovCitwdWJsaWMgY2xhc3MgWWFtbENvbmZpZyBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25TZXJ2ZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IFlhbWxDb25maWd1cmF0aW9uU2VydmVyLgorCSAqIEBwYXJhbSBjbGllbnQgCisJICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIAorCSAqLworCXB1YmxpYyBZYW1sQ29uZmlnKCBDb25maWd1cmF0aW9uQ2xpZW50IGNsaWVudCApCisJCXRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisJeworCQl0aGlzKCBjbGllbnQsIG51bGwgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIFlhbWxDb25maWd1cmF0aW9uU2VydmVyLCB0aGVuIGxvYWRzIHRoZSBjb25maWcuCisJICogQHBhcmFtIGNsaWVudCAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBZYW1sQ29uZmlnKCBDb25maWd1cmF0aW9uQ2xpZW50IGNsaWVudCwgU3RyaW5nIG5hbWUgKQorCQl0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorCXsKKwkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CisJCWlmIChuYW1lID09IG51bGwpCisJCQlyZXR1cm47CisJCWxvYWRDb25maWcoIG5hbWUgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uQ2xpZW50IGNsaWVudDsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFVCTElDIE1FVEhPRFMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIE9iamVjdCBsb2FkQ29uZmlnKCBTdHJpbmcgbmFtZSApCisJCXRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisJeworCQl1bmxvYWRDb25maWcoKTsKKwkJCisJCUZpbGUgZiA9IG1rZmlsZSggbmFtZSApOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCisJCXsKKwkJCWxvbmcgdDAgPSBmLmxhc3RNb2RpZmllZCgpOworCQkJT2JqZWN0IG8gPSBsb2FkQ29uZmlnMCggZiApOworCQkJbG9uZyB0MSA9IGYubGFzdE1vZGlmaWVkKCk7CisJCQkKKwkJCWlmICh0MSA9PSB0MCkKKwkJCXsKKwkJCQljb25maWdzID0gaW1wb3J0Q29uZmlncyggbyApOworCQkJCWZpbGUgPSBmOworCQkJCWxhc3RNb2RpZmllZCA9IHQwOworCQkJCXN1YnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQoIG5ldyBIYXNoU2V0PEludGVnZXI+KCkgKTsKKwkJCQlyZXR1cm4gZ2V0Um9vdCgpOworCQkJfQorCQkJCisJCQl0cnkKKwkJCXsKKwkJCQlUaHJlYWQuc2xlZXAoIDEwMDAgKTsKKwkJCX0KKwkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCXRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiY29uZmlnIGlzIGNoYW5naW5nOiAiK25hbWUgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1bmxvYWRDb25maWcoKQorCXsKKwkJdW5zdWJzY3JpYmVBbGwoKTsKKwkJZmlsZSA9IG51bGw7CisJCWxhc3RNb2RpZmllZCA9IG51bGw7CisJCWNvbmZpZ3MgPSBudWxsOworCQlzdWJzID0gbnVsbDsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBjYW5Mb2FkKCBTdHJpbmcgbmFtZSApCisJeworCQl0cnkKKwkJeworCQkJbWtmaWxlKCBuYW1lICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQljYXRjaCAoIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXB1YmxpYyBCb29sZWFuIGlzTG9hZGVkKCkKKwl7CisJCXJldHVybiBjb25maWdzICE9IG51bGw7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRSb290KCkKKwl7CisJCWlmICghaXNMb2FkZWQoKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJubyBjb25maWcgbG9hZGVkIiApOworCQkKKwkJaWYgKGNvbmZpZ3Muc2l6ZSgpID09IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiY29uZmlnIGlzIGVtcHR5IiApOworCQkKKwkJcmV0dXJuIHRvSWQoIDAgKTsKKwl9CisJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9ERSBQUk9QRVJUSUVTIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCggT2JqZWN0IGlkICkKKwl7CisJCXJldHVybiB0b0lkKCBnZXRDb25mKCBpZCApLnBhcmVudCApOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSggT2JqZWN0IGlkICkKKwl7CisJCXJldHVybiBnZXRDb25mKCBpZCApLm5hbWUoKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRJbmRleCggT2JqZWN0IGlkICkKKwl7CisJCXJldHVybiBnZXRDb25mKCBpZCApLmluZGV4KCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYXRoKCBPYmplY3QgaWQgKQorCXsKKwkJcmV0dXJuIGdldENvbmYoIGlkICkuZ2V0UGF0aCgpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGlzUm9vdCggT2JqZWN0IGlkICkKKwl7CisJCXJldHVybiBnZXRDb25mKCBpZCApLmlzUm9vdCgpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGlzTGlzdCggT2JqZWN0IGlkICkKKwl7CisJCXJldHVybiBnZXRDb25mKCBpZCApLmlzTGlzdCgpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGlzTWFwKCBPYmplY3QgaWQgKQorCXsKKwkJcmV0dXJuIGdldENvbmYoIGlkICkuaXNNYXAoKTsKKwl9CisJCisJcHVibGljIEludGVnZXIgc2l6ZSggT2JqZWN0IGlkICkKKwl7CisJCXJldHVybiBnZXRDb25mKCBpZCApLnNpemUoKTsKKwl9CisJCisJLy8vLy8vLy8vLy8vLy8KKwkvLyBDSElMRFJFTiAvLworCS8vLy8vLy8vLy8vLy8vCisKKwlwdWJsaWMgT2JqZWN0W10gbGlzdENvbmZpZ0lkcyggT2JqZWN0IGlkLCBJbnRlZ2VyIG9mZnNldCwgSW50ZWdlciBjb3VudCApCisJeworCQlDb25mIGMgPSBnZXRDb25mKCBpZCApOworCQkKKwkJaWYgKGMuaXNMaXN0KCkpCisJCQlyZXR1cm4gdG9JZEFycmF5KCBjLmxpc3QoKSwgb2Zmc2V0LCBjb3VudCApOworCQkKKwkJaWYgKGMuaXNNYXAoKSkKKwkJCXJldHVybiB0b0lkQXJyYXkoIGMubWFwKCkudmFsdWVzKCksIG9mZnNldCwgY291bnQgKTsKKwkJCisJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCAidmFsdWUgaXMgbm90IGEgTGlzdCBvciBhIE1hcCIgKTsKKwl9CisJCisJcHVibGljIE9iamVjdFtdIGxpc3RDb25maWdQYXRoSWRzKCBPYmplY3QgaWQsIFN0cmluZyBwYXRoLCBJbnRlZ2VyIG9mZnNldCwKKwkJSW50ZWdlciBjb3VudCApCisJeworCQlyZXR1cm4gbGlzdENvbmZpZ0lkcyggZ2V0Q29uZmlnUGF0aCggaWQsIHBhdGggKSwgb2Zmc2V0LCBjb3VudCApOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlnSW5kZXgoIE9iamVjdCBpZCwgSW50ZWdlciBpbmRleCApCisJeworCQlpZiAoaW5kZXggPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJpbmRleCA9PSBudWxsIiApOworCQkKKwkJQ29uZiBjID0gZ2V0Q29uZiggaWQgKTsKKwkJCisJCWlmIChjLmlzTGlzdCgpKQorCQl7CisJCQlMaXN0PEludGVnZXI+IGxpc3QgPSBjLmxpc3QoKTsKKwkJCQorCQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsaXN0LnNpemUoKSkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiaW5kZXggPCAwIHx8IGluZGV4ID49IGxpc3Quc2l6ZSgpIiApOworCQkJCisJCQlyZXR1cm4gdG9JZCggYy5saXN0KCkuZ2V0KCBpbmRleCApICk7CisJCX0KKwkJCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJ2YWx1ZSBpcyBub3QgYSBMaXN0IiApOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlnUGF0aCggT2JqZWN0IGlkLCBTdHJpbmcgcGF0aCApCisJeworCQljaGVja1BhdGgoIHBhdGggKTsKKwkJLy8gcGF0aCBpcyBub3QgbnVsbC4KKwkJCisJCS8vIGlkID09IG51bGw6IHBhdGggbXVzdCBiZSBhYnNvbHV0ZS4KKwkJLy8gaWQgIT0gbnVsbDogcGF0aCBtYXkgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuCisJCQorCQlpZiAoaWQgPT0gbnVsbCkKKwkJeworCQkJaWYgKCFpc0Fic29sdXRlKCBwYXRoICkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJInBhdGggbXVzdCBiZSBhYnNvbHV0ZSB3aGVuIGlkID09IG51bGwiICk7CisJCQkKKwkJCWlkID0gZ2V0Um9vdCgpOworCQkJcGF0aCA9IGFiczJyZWwoIHBhdGggKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpc0Fic29sdXRlKCBwYXRoICkpCisJCQl7CisJCQkJaWQgPSBnZXRSb290KCk7CisJCQkJcGF0aCA9IGFiczJyZWwoIHBhdGggKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlnZXRDb25mKCBpZCApOworCQkJfQorCQl9CisJCQorCQkvLyBpZCBpcyBub3QgbnVsbAorCQkKKwkJSW50ZWdlciBpaWQgPSBmcm9tSWQoIGlkICk7CisJCQorCQkvLyBpZiB3ZSBoYXZlIGEgc2ltcGxlIHBhdGgganVzdCBsZXQgZ2V0Q29uZmlnMCBoYW5kbGUgaXQKKwkJCisJCWlmIChwYXRoLmluZGV4T2YoICcvJyApIDwgMCkKKwkJCXJldHVybiB0b0lkKCBnZXRDb25maWdOYW1lKCBpaWQsIHBhdGggKSApOworCQkKKwkJLy8gY29tcGxleCBwYXRoCisJCQorCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBwYXRoLCAiLyIgKTsKKwkJd2hpbGUgKGlpZCAhPSBudWxsICYmIHN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJCWlpZCA9IGdldENvbmZpZ05hbWUoIGlpZCwgc3QubmV4dFRva2VuKCkgKTsKKwkJCisJCXJldHVybiB0b0lkKCBpaWQgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBOT0RFIC8gUEFUSCBBQ0NFU1MgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXB1YmxpYyBCb29sZWFuIGhhc1ZhbHVlUGF0aCggT2JqZWN0IGlkLCBTdHJpbmcgcGF0aCApCisJeworCQlyZXR1cm4gaGFzVmFsdWUoIGdldENvbmZpZ1BhdGgoIGlkLCBwYXRoICkgKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlUGF0aCggT2JqZWN0IGlkLCBTdHJpbmcgcGF0aCApCisJeworCQlyZXR1cm4gZ2V0VmFsdWUoIGdldENvbmZpZ1BhdGgoIGlkLCBwYXRoICkgKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuUGF0aCggT2JqZWN0IGlkLCBTdHJpbmcgcGF0aCApCisJeworCQlyZXR1cm4gZ2V0Qm9vbGVhbiggZ2V0Q29uZmlnUGF0aCggaWQsIHBhdGggKSApOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXJQYXRoKCBPYmplY3QgaWQsIFN0cmluZyBwYXRoICkKKwl7CisJCXJldHVybiBnZXRJbnRlZ2VyKCBnZXRDb25maWdQYXRoKCBpZCwgcGF0aCApICk7CisJfQorCisJcHVibGljIERvdWJsZSBnZXREb3VibGVQYXRoKCBPYmplY3QgaWQsIFN0cmluZyBwYXRoICkKKwl7CisJCXJldHVybiBnZXREb3VibGUoIGdldENvbmZpZ1BhdGgoIGlkLCBwYXRoICkgKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1BhdGgoIE9iamVjdCBpZCwgU3RyaW5nIHBhdGggKQorCXsKKwkJcmV0dXJuIGdldFN0cmluZyggZ2V0Q29uZmlnUGF0aCggaWQsIHBhdGggKSApOworCX0KKworCXB1YmxpYyBEYXRlIGdldERhdGVQYXRoKCBPYmplY3QgaWQsIFN0cmluZyBwYXRoICkKKwl7CisJCXJldHVybiBnZXREYXRlKCBnZXRDb25maWdQYXRoKCBpZCwgcGF0aCApICk7CisJfQorCisJcHVibGljIExpc3Q8Pz4gZ2V0TGlzdFBhdGgoIE9iamVjdCBpZCwgU3RyaW5nIHBhdGgsIEludGVnZXIgZGVwdGggKQorCXsKKwkJcmV0dXJuIGdldExpc3QoIGdldENvbmZpZ1BhdGgoIGlkLCBwYXRoICksIGRlcHRoICk7CisJfQorCisJcHVibGljIE1hcDw/LCA/PiBnZXRNYXBQYXRoKCBPYmplY3QgaWQsIFN0cmluZyBwYXRoLCBJbnRlZ2VyIGRlcHRoICkKKwl7CisJCXJldHVybiBnZXRNYXAoIGdldENvbmZpZ1BhdGgoIGlkLCBwYXRoICksIGRlcHRoICk7CisJfQorCQorCS8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9ERSBWQUxVRVMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIEJvb2xlYW4gaGFzVmFsdWUoIE9iamVjdCBpZCApCisJeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIGdldENvbmYoIGlkICkuaGFzVmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCBPYmplY3QgaWQgKQorCXsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGdldENvbmYoIGlkICkuZ2V0VmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuKCBPYmplY3QgaWQgKQorCXsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGdldENvbmYoIGlkICkuZ2V0Qm9vbGVhbigpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoIE9iamVjdCBpZCApCisJeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gZ2V0Q29uZiggaWQgKS5nZXRJbnRlZ2VyKCk7CisJfQorCisJcHVibGljIERvdWJsZSBnZXREb3VibGUoIE9iamVjdCBpZCApCisJeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gZ2V0Q29uZiggaWQgKS5nZXREb3VibGUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyggT2JqZWN0IGlkICkKKwl7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBnZXRDb25mKCBpZCApLmdldFN0cmluZygpOworCX0KKworCXB1YmxpYyBEYXRlIGdldERhdGUoIE9iamVjdCBpZCApCisJeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gZ2V0Q29uZiggaWQgKS5nZXREYXRlKCk7CisJfQorCisJcHVibGljIExpc3Q8Pz4gZ2V0TGlzdCggT2JqZWN0IGlkLCBJbnRlZ2VyIGRlcHRoICkKKwl7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBnZXRDb25mKCBpZCApLmdldExpc3QoIGRlcHRoICk7CisJfQorCisJcHVibGljIE1hcDw/LCA/PiBnZXRNYXAoIE9iamVjdCBpZCwgSW50ZWdlciBkZXB0aCApCisJeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gZ2V0Q29uZiggaWQgKS5nZXRNYXAoIGRlcHRoICk7CisJfQorCQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDSEFOR0UgTk9USUZJQ0FUSU9OIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIHZvaWQgc3Vic2NyaWJlKCBPYmplY3QgaWQgKQorCXsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpbnQgaWlkID0gZnJvbUlkKCBpZCApOworCQlnZXRDb25mMCggaWlkICk7CisJCQorCQlzeW5jaHJvbml6ZWQgKHN1YnMpCisJCXsKKwkJCWlmIChzdWJzLmlzRW1wdHkoKSkKKwkJCQlBbGFybU1hbmFnZXIuc3RhdGljQWRkKCBMSVNURU5FUiwgbnVsbCwgSU5URVJWQUwgKTsKKwkJCQorCQkJc3Vicy5hZGQoIGlpZCApOworCQl9CisJCQorCQlmaXJlQ29uZmlnVmFsdWVzQ2hhbmdlZCggbmV3IE9iamVjdFtdIHsgaWQgfSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZmlyZUNvbmZpZ1ZhbHVlc0NoYW5nZWQoIGZpbmFsIE9iamVjdFtdIHVwZGF0ZWQgKQorCXsKKwkJVG9kb01hbmFnZXIuYWRkVG9kbyggbmV3IFRvZG8oKQorCQl7CisKKwkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG1nciApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQljbGllbnQuY29uZmlnVmFsdWVzQ2hhbmdlZCggdXBkYXRlZCApOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBleGNlcHRpb24oIFRvZG9NYW5hZ2VyIG1nciwgRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0gKTsKKwl9CisJCisJcHVibGljIHZvaWQgc3Vic2NyaWJlUGF0aCggT2JqZWN0IGlkLCBTdHJpbmcgcGF0aCApCisJeworCQlzdWJzY3JpYmUoIGdldENvbmZpZ1BhdGgoIGlkLCBwYXRoICkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1bnN1YnNjcmliZSggT2JqZWN0IGlkICkKKwl7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJaW50IGlpZCA9IGZyb21JZCggaWQgKTsKKwkJZ2V0Q29uZjAoIGlpZCApOworCQkKKwkJc3luY2hyb25pemVkIChzdWJzKQorCQl7CisJCQlpZiAoIXN1YnMucmVtb3ZlKCBpaWQgKSkKKwkJCQlyZXR1cm47CisJCQkKKwkJCWlmIChzdWJzLmlzRW1wdHkoKSkKKwkJCQlBbGFybU1hbmFnZXIuc3RhdGljUmVtb3ZlKCBMSVNURU5FUiApOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdW5zdWJzY3JpYmVQYXRoKCBPYmplY3QgaWQsIFN0cmluZyBwYXRoICkKKwl7CisJCXVuc3Vic2NyaWJlKCBnZXRDb25maWdQYXRoKCBpZCwgcGF0aCApICk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlQWxsKCkKKwl7CisJCWlmIChzdWJzID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlBbGFybU1hbmFnZXIuc3RhdGljUmVtb3ZlKCBMSVNURU5FUiApOworCQkKKwkJc3luY2hyb25pemVkIChzdWJzKQorCQl7CisJCQlmb3IgKEludGVnZXIgaWlkOiBzdWJzKQorCQkJCWdldENvbmYwKCBpaWQgKTsKKwkJCXN1YnMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8vLy8vLy8vLy8vLy8KKwkvLyBQUklWQVRFIC8vCisJLy8vLy8vLy8vLy8vLworCQorCS8vL0NMT1ZFUjpPRkYKKwkKKwkvKioKKwkgKiBEdW1wcyB0aGUgY29uZmlnIHNwYWNlLgorCSAqLworCXB1YmxpYyB2b2lkIGR1bXAoKQorCXsKKwkJZm9yIChNYXAuRW50cnk8SW50ZWdlciwgQ29uZj4gbWU6IGNvbmZpZ3MuZW50cnlTZXQoKSkKKwkJCVN5c3RlbS5vdXQucHJpbnRmKCAiJWQ6ICVzXG4iLCBtZS5nZXRLZXkoKSwgbWUuZ2V0VmFsdWUoKSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJkb25lIiApOworCX0KKwkKKwkvLy9DTE9WRVI6T04KKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFESVggPSBDaGFyYWN0ZXIuTUFYX1JBRElYOworCQorCXByaXZhdGUgU3RyaW5nIGFiczJyZWwoIFN0cmluZyBwYXRoICkKKwl7CisJCUFzc2VydGlvbi5jaGVjayggaXNBYnNvbHV0ZSggcGF0aCApLCAicGF0aCBpcyBhYnNvbHV0ZSIgKTsKKwkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKCAxICk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlKCBTdHJpbmcgcGF0aCApCisJeworCQljaGVja1BhdGgoIHBhdGggKTsKKwkJcmV0dXJuIHBhdGguc3RhcnRzV2l0aCggIi8iICk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQYXRoKCBTdHJpbmcgcGF0aCApCisJeworCQlpZiAocGF0aCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBhdGggPT0gbnVsbCIgKTsKKwl9CisKKwlwcml2YXRlIE9iamVjdCB0b0lkKCBJbnRlZ2VyIGlpZCApCisJeworCQlpZiAoaWlkID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuICIjIitJbnRlZ2VyLnRvU3RyaW5nKCBpaWQsIElEX1JBRElYICkrIiMiOworCX0KKworCXByaXZhdGUgaW50IGZyb21JZCggT2JqZWN0IGlkICkKKwl7CisJCWlmIChpZCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImlkID09IG51bGwiICk7CisJCQorCQlpZiAoIShpZCBpbnN0YW5jZW9mIFN0cmluZykpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaWQgaXMgbm90IHZhbGlkOiAiK2lkICk7CisJCQorCQlTdHJpbmcgcyA9IChTdHJpbmcpIGlkOworCQkKKwkJaWYgKCFzLnN0YXJ0c1dpdGgoICIjIiApKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImlkIGlzIG5vdCB2YWxpZDogIitpZCApOworCQkKKwkJaWYgKCFzLmVuZHNXaXRoKCAiIyIgKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJpZCBpcyBub3QgdmFsaWQ6ICIraWQgKTsKKwkJCisJCXRyeQorCQl7CisJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCggcy5zdWJzdHJpbmcoIDEgKQorCQkJCS5zdWJzdHJpbmcoIDAsIHMubGVuZ3RoKCktMiApLCBJRF9SQURJWCApOworCQl9CisJCWNhdGNoICggU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImlkIGlzIG5vdCB2YWxpZDogIitpZCApOworCQl9CisJCWNhdGNoICggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaWQgaXMgbm90IHZhbGlkOiAiK2lkICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBpbnQgSU5URVJWQUwgPSA1KjEwMDA7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZBSUxfSU5URVJWQUwgPSA2MCoxMDAwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbmZpZ0RpciA9ICIuIjsKKwkKKwlwcml2YXRlIGZpbmFsIEFsYXJtTGlzdGVuZXIgTElTVEVORVIgPSBuZXcgQWxhcm1MaXN0ZW5lcigpCisJeworCQlwdWJsaWMgaW50IHdha2V1cCggQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIE9iamVjdCBzdGF0ZSwgbG9uZyBkdWUgKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQl1cGRhdGVDb25maWcoKTsKKwkJCQlyZXR1cm4gSU5URVJWQUw7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCXJldHVybiBGQUlMX0lOVEVSVkFMOworCQkJfQorCQl9CisJfTsKKwkKKwlwcml2YXRlIEZpbGUgbWtmaWxlKCBTdHJpbmcgbmFtZSApIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisJeworCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAibmFtZSBpcyBudWxsIG9yIGJsYW5rIiApOworCQkKKwkJLy8gZmlsdGVyIG91dCByZWZlcmVuY2VzIHRvIG5vbi1leGlzdGVudCBjb25maWdzLgorCQkKKwkJRmlsZSBmID0gbmV3IEZpbGUoIG5hbWUrIi55bWwiICk7CisJCWlmICghZi5pc0ZpbGUoKSB8fCAhZi5jYW5SZWFkKCkpCisJCQl0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggImNvdWxkIG5vdCB2ZXJpZnkgbmFtZTogIituYW1lICk7CisJCQorCQkvLyBtYWtlIHN1cmUgdGhlIGNvbmZpZyBpcyBpbiB0aGUgY29uZmlnIGRpcmVjdG9yeS4KKwkJCisJCXRyeQorCQl7CisJCQlTdHJpbmcgZmNwID0gZi5nZXRDYW5vbmljYWxQYXRoKCk7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbiggImZjcCA9ICIrZmNwICk7CisJCQkKKwkJCVN0cmluZyBjZCA9IG5ldyBGaWxlKCBjb25maWdEaXIgKS5nZXRDYW5vbmljYWxQYXRoKCkgKyBGaWxlLnNlcGFyYXRvckNoYXI7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbiggImNkID0gIitjZCApOworCQkJCisJCQlpZiAoIWZjcC5zdGFydHNXaXRoKCBjZCApKQorCQkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiY291bGQgbm90IHZlcmlmeSBuYW1lOiAiK25hbWUgKTsKKwkJfQorCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggImNvdWxkIG5vdCB2ZXJpZnkgbmFtZTogIituYW1lICk7CisJCX0KKwkJCisJCXJldHVybiBmOworCX0KKworCXByaXZhdGUgRmlsZSBmaWxlOworCQorCXByaXZhdGUgTG9uZyBsYXN0TW9kaWZpZWQ7CisKKwlwcml2YXRlIE1hcDxJbnRlZ2VyLCBDb25mPiBjb25maWdzOworCQorCXByaXZhdGUgSWRHZW5lcmF0b3IgaWRnZW4gPSBuZXcgSWRHZW5lcmF0b3IoIDAgKTsKKwkKKwlwcml2YXRlIFNldDxJbnRlZ2VyPiBzdWJzOworCQorCXByaXZhdGUgc3RhdGljIE9iamVjdCBsb2FkQ29uZmlnMCggRmlsZSBmaWxlICkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlPYmplY3QgbyA9IFlhbWwubG9hZCggZmlsZSApOworCQkJcmV0dXJuIG87CisJCX0KKwkJY2F0Y2ggKCBGaWxlTm90Rm91bmRFeGNlcHRpb24gZSApCisJCXsKKwkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCAiZmlsZSBub3QgZm91bmQ6ICIgKyBmaWxlICk7CisJCX0KKwkJY2F0Y2ggKCBZYW1sRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiggImZpbGUgbm90IGxvYWRlZDogIiArIGZpbGUgKyAiOyAiK2UgKTsKKwkJfQorCX0KKworCXByaXZhdGUgTWFwPEludGVnZXIsIENvbmY+IGltcG9ydENvbmZpZ3MoIE9iamVjdCByb290ICkKKwl7CisJCU1hcDxJbnRlZ2VyLCBDb25mPiBuZXdDb25maWdzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQ29uZj4oKTsKKwkJaW1wb3J0T2JqZWN0KCBuZXdDb25maWdzLCBudWxsLCBudWxsLCByb290ICk7CisJCXJldHVybiBuZXdDb25maWdzOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGlzIHB1cmVseSBmb3IgdGVzdGluZy4KKwkgKi8KKwl2b2lkIHNldENvbmZpZyggU3RyaW5nIG5hbWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlmaWxlID0gbWtmaWxlKCBuYW1lICk7CisJCWxhc3RNb2RpZmllZCA9IExvbmcuTUlOX1ZBTFVFOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29uZmlnKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKwl7CisJCWlmIChmaWxlLmxhc3RNb2RpZmllZCgpID09IGxhc3RNb2RpZmllZCkKKwkJCXJldHVybjsKKwkJCisJCWxvbmcgdDAgPSBmaWxlLmxhc3RNb2RpZmllZCgpOworCQlPYmplY3QgbyA9IGxvYWRDb25maWcwKCBmaWxlICk7CisJCWxvbmcgdDEgPSBmaWxlLmxhc3RNb2RpZmllZCgpOworCQkKKwkJaWYgKHQxICE9IHQwKQorCQkJcmV0dXJuOworCQkKKwkJU2V0PE9iamVjdD4gY2hhbmdlSWRzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOworCQkKKwkJc3luY2hyb25pemVkIChzdWJzKQorCQl7CisJCQlNYXA8SW50ZWdlciwgQ29uZj4gbmV3Q29uZmlncyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIENvbmY+KCBjb25maWdzICk7CisJCQlTZXQ8SW50ZWdlcj4gbmV3U3VicyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldCgKKwkJCQluZXcgSGFzaFNldDxJbnRlZ2VyPiggc3VicyApICk7CisJCQlTZXQ8SW50ZWdlcj4gY2hhbmdlU2V0ID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKwkJCQorCQkJdXBkYXRlT2JqZWN0KCBuZXdDb25maWdzLCBuZXdTdWJzLCBjaGFuZ2VTZXQsIDAsCisJCQkJbnVsbCwgbnVsbCwgbyApOworCQkJCisJCQkvLyBjb21wdXRlIHRob3NlIGlkcyBpbiBjaGFuZ2VTZXQgb3IgdGhlaXIgYW5jZXN0b3JzIHRoYXQKKwkJCS8vIGFyZSBzdWJzY3JpYmVkIHRvLgorCQkJY29tcHV0ZUNoYW5nZUlkcyggY2hhbmdlSWRzLCBuZXdDb25maWdzLCBuZXdTdWJzLCBjaGFuZ2VTZXQgKTsKKworCQkJbGFzdE1vZGlmaWVkID0gdDA7CisJCQljb25maWdzID0gbmV3Q29uZmlnczsKKwkJCXN1YnMgPSBuZXdTdWJzOworCQl9CisJCQorCQlmaXJlQ29uZmlnVmFsdWVzQ2hhbmdlZCggY2hhbmdlSWRzLnRvQXJyYXkoKSApOworCX0KKworCXByaXZhdGUgdm9pZCBjb21wdXRlQ2hhbmdlSWRzKCBTZXQ8T2JqZWN0PiBjaGFuZ2VJZHMsCisJCU1hcDxJbnRlZ2VyLCBDb25mPiBuZXdDb25maWdzLCBTZXQ8SW50ZWdlcj4gbmV3U3VicywgU2V0PEludGVnZXI+IGNoYW5nZVNldCApCisJeworCQlmb3IgKGludCBpaWQ6IGNoYW5nZVNldCkKKwkJCWNvbXB1dGVDaGFuZ2VJZHMoIGNoYW5nZUlkcywgbmV3Q29uZmlncywgbmV3U3VicywgaWlkICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbXB1dGVDaGFuZ2VJZHMoIFNldDxPYmplY3Q+IGNoYW5nZUlkcywKKwkJTWFwPEludGVnZXIsIENvbmY+IG5ld0NvbmZpZ3MsIFNldDxJbnRlZ2VyPiBuZXdTdWJzLCBpbnQgaWlkICkKKwl7CisJCWlmIChuZXdTdWJzLmNvbnRhaW5zKCBpaWQgKSkKKwkJeworCQkJY2hhbmdlSWRzLmFkZCggdG9JZCggaWlkICkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUNvbmYgYyA9IG5ld0NvbmZpZ3MuZ2V0KCBpaWQgKTsKKwkJCWlmIChjLnBhcmVudCAhPSBudWxsKQorCQkJCWNvbXB1dGVDaGFuZ2VJZHMoIGNoYW5nZUlkcywgbmV3Q29uZmlncywgbmV3U3VicywgYy5wYXJlbnQgKTsKKwkJfQorCX0KKworCXByaXZhdGUgaW50IGltcG9ydE9iamVjdCggTWFwPEludGVnZXIsIENvbmY+IG5ld0NvbmZpZ3MsIEludGVnZXIgcGFyZW50LCBPYmplY3QgbmFtZU9ySW5kZXgsCisJCU9iamVjdCB2YWx1ZSApCisJeworCQlpZiAodmFsdWVJc0xpc3QoIHZhbHVlICkpCisJCQlyZXR1cm4gaW1wb3J0TGlzdCggbmV3Q29uZmlncywgcGFyZW50LCBuYW1lT3JJbmRleCwgKExpc3Q8Pz4pIHZhbHVlICk7CisJCQorCQlpZiAodmFsdWVJc01hcCggdmFsdWUgKSkKKwkJCXJldHVybiBpbXBvcnRNYXAoIG5ld0NvbmZpZ3MsIHBhcmVudCwgbmFtZU9ySW5kZXgsIChNYXA8PywgPz4pIHZhbHVlICk7CisJCQorCQlpZiAodmFsdWVJc1NjYWxhciggdmFsdWUgKSkKKwkJeworCQkJaW50IGsgPSAoaW50KSBpZGdlbi5uZXh0KCk7CisJCQluZXdDb25maWdzLnB1dCggaywgbmV3IENvbmYoIGssIHBhcmVudCwgbmFtZU9ySW5kZXgsIHZhbHVlICkgKTsKKwkJCXJldHVybiBrOworCQl9CisJCQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJImRvbid0IGtub3cgaG93IHRvIGltcG9ydCB0eXBlICIrdmFsdWUuZ2V0Q2xhc3MoKSApOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHZhbHVlSXNTY2FsYXIoIE9iamVjdCB2YWx1ZSApCisJeworCQlyZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8CisJCQl2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHZhbHVlSXNMaXN0KCBPYmplY3QgdmFsdWUgKQorCXsKKwkJcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTGlzdDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsdWVJc01hcCggT2JqZWN0IHZhbHVlICkKKwl7CisJCXJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE1hcDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlT2JqZWN0KCBNYXA8SW50ZWdlciwgQ29uZj4gbmV3Q29uZmlncywgU2V0PEludGVnZXI+IG5ld1N1YnMsCisJCVNldDxJbnRlZ2VyPiBjaGFuZ2VTZXQsIGludCBpaWQsIEludGVnZXIgcGFyZW50LCBPYmplY3QgbmFtZU9ySW5kZXgsCisJCU9iamVjdCB2YWx1ZSApCisJeworCQlDb25mIGMgPSBuZXdDb25maWdzLmdldCggaWlkICk7CisJCQorCQlBc3NlcnRpb24uY2hlY2soIChwYXJlbnQgPT0gbnVsbCAmJiBjLnBhcmVudCA9PSBudWxsKSB8fAorCQkJKHBhcmVudCAhPSBudWxsICYmIGMucGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmVxdWFscyggYy5wYXJlbnQgKSksCisJCQkJInBhcmVudHMgbWF0Y2giICk7CisJCQorCQlBc3NlcnRpb24uY2hlY2soIChuYW1lT3JJbmRleCA9PSBudWxsICYmIGMubmFtZU9ySW5kZXggPT0gbnVsbCkgfHwKKwkJCShuYW1lT3JJbmRleCAhPSBudWxsICYmIGMubmFtZU9ySW5kZXggIT0gbnVsbCAmJiBuYW1lT3JJbmRleC5lcXVhbHMoIGMubmFtZU9ySW5kZXggKSksCisJCQkibmFtZU9ySW5kZXggbWF0Y2giICk7CisJCQorCQlpZiAodmFsdWVJc0xpc3QoIHZhbHVlICkpCisJCXsKKwkJCWlmIChjLmlzTGlzdCgpKQorCQkJeworCQkJCXVwZGF0ZUxpc3QoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGNoYW5nZVNldCwgaWlkLCBwYXJlbnQsIG5hbWVPckluZGV4LCAoTGlzdDw/PikgdmFsdWUsIGMgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoYy5pc01hcCgpKQorCQkJeworCQkJCWRlc3Ryb3lNYXAoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGlpZCwgYyApOworCQkJCWltcG9ydExpc3QoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGNoYW5nZVNldCwgaWlkLCBwYXJlbnQsIG5hbWVPckluZGV4LCAoTGlzdDw/PikgdmFsdWUgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoYy5pc1NjYWxhcigpKQorCQkJeworCQkJCWltcG9ydExpc3QoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGNoYW5nZVNldCwgaWlkLCBwYXJlbnQsIG5hbWVPckluZGV4LCAoTGlzdDw/PikgdmFsdWUgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJkb24ndCBrbm93IGhvdyB0byB1cGRhdGUgdG8gbGlzdCBmcm9tIHR5cGUgIiArIGMudmFsdWUuZ2V0Q2xhc3MoKSApOworCQl9CisJCQorCQlpZiAodmFsdWVJc01hcCggdmFsdWUgKSkKKwkJeworCQkJaWYgKGMuaXNNYXAoKSkKKwkJCXsKKwkJCQl1cGRhdGVNYXAoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGNoYW5nZVNldCwgaWlkLCBwYXJlbnQsIG5hbWVPckluZGV4LCAoTWFwPD8sID8+KSB2YWx1ZSwgYyApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjLmlzTGlzdCgpKQorCQkJeworCQkJCWRlc3Ryb3lMaXN0KCBuZXdDb25maWdzLCBuZXdTdWJzLCBpaWQsIGMgKTsKKwkJCQlpbXBvcnRNYXAoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGNoYW5nZVNldCwgaWlkLCBwYXJlbnQsIG5hbWVPckluZGV4LCAoTWFwPD8sID8+KSB2YWx1ZSApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjLmlzU2NhbGFyKCkpCisJCQl7CisJCQkJaW1wb3J0TWFwKCBuZXdDb25maWdzLCBuZXdTdWJzLCBjaGFuZ2VTZXQsIGlpZCwgcGFyZW50LCBuYW1lT3JJbmRleCwgKE1hcDw/LCA/PikgdmFsdWUgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJkb24ndCBrbm93IGhvdyB0byB1cGRhdGUgdG8gbWFwIGZyb20gdHlwZSAiICsgYy52YWx1ZS5nZXRDbGFzcygpICk7CisJCX0KKwkJCisJCWlmICh2YWx1ZUlzU2NhbGFyKCB2YWx1ZSApKQorCQl7CisJCQlpZiAoYy5pc01hcCgpKQorCQkJeworCQkJCWRlc3Ryb3lNYXAoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGlpZCwgYyApOworCQkJCW5ld0NvbmZpZ3MucHV0KCBpaWQsIG5ldyBDb25mKCBpaWQsIHBhcmVudCwgbmFtZU9ySW5kZXgsIHZhbHVlICkgKTsKKwkJCQlhZGQoIG5ld0NvbmZpZ3MsIGNoYW5nZVNldCwgaWlkICk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQlpZiAoYy5pc0xpc3QoKSkKKwkJCXsKKwkJCQlkZXN0cm95TGlzdCggbmV3Q29uZmlncywgbmV3U3VicywgaWlkLCBjICk7CisJCQkJbmV3Q29uZmlncy5wdXQoIGlpZCwgbmV3IENvbmYoIGlpZCwgcGFyZW50LCBuYW1lT3JJbmRleCwgdmFsdWUgKSApOworCQkJCWFkZCggbmV3Q29uZmlncywgY2hhbmdlU2V0LCBpaWQgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCWlmIChjLmlzU2NhbGFyKCkpCisJCQl7CisJCQkJaWYgKHZhbHVlLmVxdWFscyggYy52YWx1ZSApKQorCQkJCQlyZXR1cm47CisJCQkJCisJCQkJbmV3Q29uZmlncy5wdXQoIGlpZCwgbmV3IENvbmYoIGlpZCwgcGFyZW50LCBuYW1lT3JJbmRleCwgdmFsdWUgKSApOworCQkJCWFkZCggbmV3Q29uZmlncywgY2hhbmdlU2V0LCBpaWQgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJkb24ndCBrbm93IGhvdyB0byB1cGRhdGUgdG8gIiArCisJCQl2YWx1ZS5nZXRDbGFzcygpICsgIiBmcm9tICIgKyBjLnZhbHVlLmdldENsYXNzKCkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkKCBNYXA8SW50ZWdlciwgQ29uZj4gbmV3Q29uZmlncywgU2V0PEludGVnZXI+IGNoYW5nZVNldCwgaW50IGlpZCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJjaGFuZ2VTZXQuYWRkKCAiK2lpZCsiICkiICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggIiAgY29uZjogIituZXdDb25maWdzLmdldCggaWlkICkgKTsKKy8vCQluZXcgVGhyb3dhYmxlKCkucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0ub3V0ICk7CisJCQorCQljaGFuZ2VTZXQuYWRkKCBpaWQgKTsKKwl9CisKKwlwcml2YXRlIGludCBpbXBvcnRMaXN0KCBNYXA8SW50ZWdlciwgQ29uZj4gbmV3Q29uZmlncywgSW50ZWdlciBwYXJlbnQsIE9iamVjdCBuYW1lT3JJbmRleCwgTGlzdDw/PiB2YWx1ZSApCisJeworCQlMaXN0PEludGVnZXI+IHYgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCB2YWx1ZS5zaXplKCkgKTsKKwkJaW50IGsgPSAoaW50KSBpZGdlbi5uZXh0KCk7CisJCW5ld0NvbmZpZ3MucHV0KCBrLCBuZXcgQ29uZiggaywgcGFyZW50LCBuYW1lT3JJbmRleCwgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggdiApICkgKTsKKwkJCisJCWludCBpID0gMDsKKwkJZm9yIChPYmplY3QgbzogdmFsdWUgKQorCQkJdi5hZGQoIGltcG9ydE9iamVjdCggbmV3Q29uZmlncywgaywgaSsrLCBvICkgKTsKKwkJCisJCXJldHVybiBrOworCX0KKworCXByaXZhdGUgdm9pZCBpbXBvcnRMaXN0KCBNYXA8SW50ZWdlciwgQ29uZj4gbmV3Q29uZmlncywgU2V0PEludGVnZXI+IG5ld1N1YnMsCisJCVNldDxJbnRlZ2VyPiBjaGFuZ2VTZXQsIGludCBpaWQsIEludGVnZXIgcGFyZW50LCBPYmplY3QgbmFtZU9ySW5kZXgsCisJCUxpc3Q8Pz4gdmFsdWUgKQorCXsKKwkJTGlzdDxJbnRlZ2VyPiB2ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPiggdmFsdWUuc2l6ZSgpICk7CisJCW5ld0NvbmZpZ3MucHV0KCBpaWQsIG5ldyBDb25mKCBpaWQsIHBhcmVudCwgbmFtZU9ySW5kZXgsIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIHYgKSApICk7CisJCWFkZCggbmV3Q29uZmlncywgY2hhbmdlU2V0LCBpaWQgKTsKKwkJCisJCWludCBpID0gMDsKKwkJZm9yIChPYmplY3QgbzogdmFsdWUgKQorCQkJdi5hZGQoIGltcG9ydE9iamVjdCggbmV3Q29uZmlncywgaWlkLCBpKyssIG8gKSApOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVMaXN0KCBNYXA8SW50ZWdlciwgQ29uZj4gbmV3Q29uZmlncywgU2V0PEludGVnZXI+IG5ld1N1YnMsCisJCVNldDxJbnRlZ2VyPiBjaGFuZ2VTZXQsIGludCBpaWQsIEludGVnZXIgcGFyZW50LCBPYmplY3QgbmFtZU9ySW5kZXgsCisJCUxpc3Q8Pz4gdmFsdWUsIENvbmYgYyApCisJeworCQlMaXN0PEludGVnZXI+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCBjLmxpc3QoKSApOworCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKwkJCisJCWludCBuID0gTWF0aC5tYXgoIHZhbHVlLnNpemUoKSwgbmV3TGlzdC5zaXplKCkgKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCXsKKwkJCWlmIChpIDwgdmFsdWUuc2l6ZSgpICYmIGkgPCBuZXdMaXN0LnNpemUoKSkKKwkJCXsKKwkJCQl1cGRhdGVPYmplY3QoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGNoYW5nZVNldCwgbmV3TGlzdC5nZXQoIGkgKSwgaWlkLCBpLCB2YWx1ZS5nZXQoIGkgKSApOworCQkJfQorCQkJZWxzZSBpZiAoaSA8IG5ld0xpc3Quc2l6ZSgpKSAvLyByYW4gb3V0IG9mIG5ldyB2YWx1ZXMgKG5ld0xpc3QgdG9vIGxvbmcpCisJCQl7CisJCQkJZGVzdHJveSggbmV3Q29uZmlncywgbmV3U3VicywgbmV3TGlzdC5nZXQoIGkgKSApOworCQkJCW5ld0xpc3Quc2V0KCBpLCBudWxsICk7CisJCQkJY2hhbmdlZCA9IHRydWU7CisJCQkJLy8gdGhpcyBlbnRyeSB3aWxsIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZC4uLgorCQkJfQorCQkJZWxzZSAvLyBpIDwgdmFsdWUuc2l6ZSgpIC8vIGV4dGVuZGluZyBuZXdMaXN0CisJCQl7CisJCQkJbmV3TGlzdC5hZGQoIGltcG9ydE9iamVjdCggbmV3Q29uZmlncywgaWlkLCBpLCB2YWx1ZS5nZXQoIGkgKSApICk7CisJCQkJY2hhbmdlZCA9IHRydWU7CisJCQl9CisJCX0KKwkJCisJCS8vIHRyaW0gbmV3TGlzdCBpZiBpdCBpcyB0b28gbG9uZy4KKwkJCisJCXdoaWxlIChuZXdMaXN0LnNpemUoKSA+IHZhbHVlLnNpemUoKSkKKwkJCW5ld0xpc3QucmVtb3ZlKCBuZXdMaXN0LnNpemUoKSAtIDEgKTsKKwkJCisJCW5ld0NvbmZpZ3MucHV0KCBpaWQsIG5ldyBDb25mKCBpaWQsIHBhcmVudCwgbmFtZU9ySW5kZXgsIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIG5ld0xpc3QgKSApICk7CisJCQorCQlpZiAoY2hhbmdlZCkKKwkJCWFkZCggbmV3Q29uZmlncywgY2hhbmdlU2V0LCBpaWQgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVzdHJveUxpc3QoIE1hcDxJbnRlZ2VyLCBDb25mPiBuZXdDb25maWdzLCBTZXQ8SW50ZWdlcj4gbmV3U3VicywgaW50IGlpZCwgQ29uZiBjICkKKwl7CisJCW5ld0NvbmZpZ3MucmVtb3ZlKCBpaWQgKTsKKwkJbmV3U3Vicy5yZW1vdmUoIGlpZCApOworCQlmb3IgKGludCBpOiBjLmxpc3QoKSkKKwkJCWRlc3Ryb3koIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGkgKTsKKwl9CisJCisJcHJpdmF0ZSBpbnQgaW1wb3J0TWFwKCBNYXA8SW50ZWdlciwgQ29uZj4gbmV3Q29uZmlncywgSW50ZWdlciBwYXJlbnQsIE9iamVjdCBuYW1lT3JJbmRleCwgTWFwPD8sID8+IHZhbHVlICkKKwl7CisJCU1hcDxTdHJpbmcsIEludGVnZXI+IHYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCB2YWx1ZS5zaXplKCkgKiA0IC8gMyArIDEgKTsKKwkJaW50IGsgPSAoaW50KSBpZGdlbi5uZXh0KCk7CisJCW5ld0NvbmZpZ3MucHV0KCBrLCBuZXcgQ29uZiggaywgcGFyZW50LCBuYW1lT3JJbmRleCwgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCB2ICkgKSApOworCQkKKwkJZm9yIChNYXAuRW50cnk8PywgPz4gbWU6IHZhbHVlLmVudHJ5U2V0KCkgKQorCQl7CisJCQlTdHJpbmcgbiA9IChTdHJpbmcpIG1lLmdldEtleSgpOworCQkJdi5wdXQoIG4sIGltcG9ydE9iamVjdCggbmV3Q29uZmlncywgaywgbiwgbWUuZ2V0VmFsdWUoKSApICk7CisJCX0KKwkJCisJCXJldHVybiBrOworCX0KKworCXByaXZhdGUgdm9pZCBpbXBvcnRNYXAoIE1hcDxJbnRlZ2VyLCBDb25mPiBuZXdDb25maWdzLCBTZXQ8SW50ZWdlcj4gbmV3U3VicywKKwkJU2V0PEludGVnZXI+IGNoYW5nZVNldCwgaW50IGlpZCwgSW50ZWdlciBwYXJlbnQsIE9iamVjdCBuYW1lT3JJbmRleCwKKwkJTWFwPD8sID8+IHZhbHVlICkKKwl7CisJCU1hcDxTdHJpbmcsIEludGVnZXI+IHYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCB2YWx1ZS5zaXplKCkgKiA0IC8gMyArIDEgKTsKKwkJbmV3Q29uZmlncy5wdXQoIGlpZCwgbmV3IENvbmYoIGlpZCwgcGFyZW50LCBuYW1lT3JJbmRleCwgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCB2ICkgKSApOworCQlhZGQoIG5ld0NvbmZpZ3MsIGNoYW5nZVNldCwgaWlkICk7CisJCQorCQlmb3IgKE1hcC5FbnRyeTw/LCA/PiBtZTogdmFsdWUuZW50cnlTZXQoKSApCisJCXsKKwkJCVN0cmluZyBuID0gKFN0cmluZykgbWUuZ2V0S2V5KCk7CisJCQl2LnB1dCggbiwgaW1wb3J0T2JqZWN0KCBuZXdDb25maWdzLCBpaWQsIG4sIG1lLmdldFZhbHVlKCkgKSApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcCggTWFwPEludGVnZXIsIENvbmY+IG5ld0NvbmZpZ3MsIFNldDxJbnRlZ2VyPiBuZXdTdWJzLAorCQlTZXQ8SW50ZWdlcj4gY2hhbmdlU2V0LCBpbnQgaWlkLCBJbnRlZ2VyIHBhcmVudCwgT2JqZWN0IG5hbWVPckluZGV4LAorCQlNYXA8PywgPz4gdmFsdWUsIENvbmYgYyApCisJeworCQlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBuZXdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCBjLm1hcCgpICk7CisJCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworCQkKKwkJLy8gTG9vayBmb3IgbmFtZXMgaW4gdGhlIGN1cnJlbnQgbWFwIHdoaWNoIGFyZSBub3QgaW4gdGhlIG5ldy4KKwkJCisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gbWU6IGMubWFwKCkuZW50cnlTZXQoKSkKKwkJeworCQkJU3RyaW5nIG5hbWUgPSBtZS5nZXRLZXkoKTsKKwkJCUludGVnZXIgc2lpZCA9IG1lLmdldFZhbHVlKCk7CisJCQlpZiAoIXZhbHVlLmNvbnRhaW5zS2V5KCBuYW1lICkpCisJCQl7CisJCQkJLy8gdGhpcyBuYW1lIHdpbGwgaGF2ZSB0byBiZSBkZWxldGVkLgorCQkJCW5ld01hcC5yZW1vdmUoIG5hbWUgKTsKKwkJCQlkZXN0cm95KCBuZXdDb25maWdzLCBuZXdTdWJzLCBzaWlkICk7CisJCQkJY2hhbmdlZCA9IHRydWU7CisJCQl9CisJCX0KKwkJCisJCS8vIExvb2sgZm9yIG5hbWVzIGluIHRoZSBuZXcgbWFwIHdoaWNoIGFyZSBub3QgaW4gdGhlIGN1cnJlbnQuCisJCQorCQlmb3IgKE1hcC5FbnRyeTw/LCA/PiBtZTogdmFsdWUuZW50cnlTZXQoKSkKKwkJeworCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBtZS5nZXRLZXkoKTsKKwkJCU9iamVjdCB2ID0gbWUuZ2V0VmFsdWUoKTsKKwkJCWlmICghbmV3TWFwLmNvbnRhaW5zS2V5KCBuYW1lICkpCisJCQl7CisJCQkJLy8gaW1wb3J0IHRoZSBvYmplY3QKKwkJCQlpbnQgayA9IGltcG9ydE9iamVjdCggbmV3Q29uZmlncywgaWlkLCBuYW1lLCB2ICk7CisJCQkJbmV3TWFwLnB1dCggbmFtZSwgayApOworCQkJCWNoYW5nZWQgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIHVwZGF0ZSB0aGUgb2JqZWN0CisJCQkJSW50ZWdlciBzaWlkID0gbmV3TWFwLmdldCggbmFtZSApOworCQkJCXVwZGF0ZU9iamVjdCggbmV3Q29uZmlncywgbmV3U3VicywgY2hhbmdlU2V0LCBzaWlkLCBpaWQsIG5hbWUsIHYgKTsKKwkJCX0KKwkJfQorCQkKKwkJbmV3Q29uZmlncy5wdXQoIGlpZCwgbmV3IENvbmYoIGlpZCwgcGFyZW50LCBuYW1lT3JJbmRleCwgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCBuZXdNYXAgKSApICk7CisJCQorCQlpZiAoY2hhbmdlZCkKKwkJCWFkZCggbmV3Q29uZmlncywgY2hhbmdlU2V0LCBpaWQgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVzdHJveSggTWFwPEludGVnZXIsIENvbmY+IG5ld0NvbmZpZ3MsIFNldDxJbnRlZ2VyPiBuZXdTdWJzLCBpbnQgaWlkICkKKwl7CisJCUNvbmYgYyA9IG5ld0NvbmZpZ3MuZ2V0KCBpaWQgKTsKKwkJaWYgKGMuaXNNYXAoKSkKKwkJCWRlc3Ryb3lNYXAoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGlpZCwgYyApOworCQllbHNlIGlmIChjLmlzTGlzdCgpKQorCQkJZGVzdHJveUxpc3QoIG5ld0NvbmZpZ3MsIG5ld1N1YnMsIGlpZCwgYyApOworCQllbHNlIGlmIChjLmlzU2NhbGFyKCkpCisJCXsKKwkJCW5ld0NvbmZpZ3MucmVtb3ZlKCBpaWQgKTsKKwkJCW5ld1N1YnMucmVtb3ZlKCBpaWQgKTsKKwkJfQorCQllbHNlCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisJCQkJImRvbid0IGtub3cgaG93IHRvIGRlc3Ryb3kgIitjLnZhbHVlLmdldENsYXNzKCkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVzdHJveU1hcCggTWFwPEludGVnZXIsIENvbmY+IG5ld0NvbmZpZ3MsIFNldDxJbnRlZ2VyPiBuZXdTdWJzLCBpbnQgaWlkLCBDb25mIGMgKQorCXsKKwkJbmV3Q29uZmlncy5yZW1vdmUoIGlpZCApOworCQluZXdTdWJzLnJlbW92ZSggaWlkICk7CisJCWZvciAoaW50IGk6IGMubWFwKCkudmFsdWVzKCkpCisJCQlkZXN0cm95KCBuZXdDb25maWdzLCBuZXdTdWJzLCBpICk7CisJfQorCQorCXByaXZhdGUgQ29uZiBnZXRDb25mMCggaW50IGlpZCApCisJeworCQlpZiAoIWlzTG9hZGVkKCkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAibm8gY29uZmlnIGxvYWRlZCIgKTsKKwkJCisJCUNvbmYgYyA9IGNvbmZpZ3MuZ2V0KCBpaWQgKTsKKwkJaWYgKGMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJubyBzdWNoIGNvbmYiICk7CisJCXJldHVybiBjOworCX0KKwkKKwlwcml2YXRlIENvbmYgZ2V0Q29uZiggT2JqZWN0IGlkICkKKwl7CisJCXJldHVybiBnZXRDb25mMCggZnJvbUlkKCBpZCApICk7CisJfQorCisJcHJpdmF0ZSBPYmplY3RbXSB0b0lkQXJyYXkoIENvbGxlY3Rpb248SW50ZWdlcj4gdmFsdWUsIEludGVnZXIgb2Zmc2V0LAorCQlJbnRlZ2VyIGNvdW50ICkKKwl7CisJCWludCBzaXplID0gdmFsdWUuc2l6ZSgpOworCQkKKwkJaWYgKG9mZnNldCA9PSBudWxsKQorCQkJb2Zmc2V0ID0gMDsKKwkJZWxzZSBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzaXplKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkib2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzaXplIiApOworCQkKKwkJaWYgKGNvdW50ID09IG51bGwpCisJCQljb3VudCA9IEludGVnZXIuTUFYX1ZBTFVFOworCQllbHNlIGlmIChjb3VudCA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJjb3VudCA8IDAiICk7CisJCQorCQlpbnQgcmVtYWluaW5nID0gc2l6ZSAtIG9mZnNldDsKKwkJaWYgKGNvdW50ID4gcmVtYWluaW5nKQorCQkJY291bnQgPSByZW1haW5pbmc7CisJCQorCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtjb3VudF07CisJCQorCQlpbnQgaSA9IDA7CisJCWZvciAoaW50IHY6IHZhbHVlKQorCQl7CisJCQlpZiAob2Zmc2V0ID4gMCkKKwkJCXsKKwkJCQlvZmZzZXQtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJaWYgKGkgPj0gYS5sZW5ndGgpCisJCQkJYnJlYWs7CisJCQkKKwkJCWFbaSsrXSA9IHRvSWQoIHYgKTsKKwkJfQorCQkKKwkJcmV0dXJuIGE7CisJfQorCQorCXByaXZhdGUgSW50ZWdlciBnZXRDb25maWdOYW1lKCBpbnQgaWlkLCBTdHJpbmcgbmFtZSApCisJeworCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIGlpZDsKKwkJCisJCWlmIChuYW1lLmVxdWFscyggIi4iICkpCisJCQlyZXR1cm4gaWlkOworCQkKKwkJQ29uZiBjID0gZ2V0Q29uZjAoIGlpZCApOworCQkKKwkJaWYgKG5hbWUuZXF1YWxzKCAiLi4iICkpCisJCQlyZXR1cm4gYy5wYXJlbnQ7CisJCQorCQlpZiAoYy5pc0xpc3QoKSkKKwkJeworCQkJaW50IGkgPSBJbnRlZ2VyLnZhbHVlT2YoIG5hbWUgKTsKKwkJCS8vIGkgbWlnaHQgYmUgb3V0IG9mIHJhbmdlLgorCQkJTGlzdDxJbnRlZ2VyPiBsaXN0ID0gYy5saXN0KCk7CisJCQlpZiAoaSA8IDAgfHwgaSA+PSBsaXN0LnNpemUoKSkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaSA8IDAgfHwgaSA+PSBsaXN0LnNpemUoKSIgKTsKKwkJCXJldHVybiBsaXN0LmdldCggaSApOworCQl9CisJCQorCQlpZiAoYy5pc01hcCgpKQorCQl7CisJCQlJbnRlZ2VyIGkgPSBjLm1hcCgpLmdldCggbmFtZSApOworCQkJLy8gaSBtaWdodCBiZSBudWxsLgorCQkJcmV0dXJuIGk7CisJCX0KKwkJCisJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCBuYW1lICk7CisJfQorCQorCXByaXZhdGUgY2xhc3MgQ29uZgorCXsKKwkJcHVibGljIENvbmYoIGludCBpZCwgSW50ZWdlciBwYXJlbnQsIE9iamVjdCBuYW1lT3JJbmRleCwgT2JqZWN0IHZhbHVlICkKKwkJeworCQkJaWYgKHBhcmVudCA9PSBudWxsICYmIG5hbWVPckluZGV4ICE9IG51bGwpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJInBhcmVudCA9PSBudWxsICYmIG5hbWVPckluZGV4ICE9IG51bGwiICk7CisJCQkKKwkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBuYW1lT3JJbmRleCA9PSBudWxsKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJwYXJlbnQgIT0gbnVsbCAmJiBuYW1lT3JJbmRleCA9PSBudWxsIiApOworCQkJCisJCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAidmFsdWUgPT0gbnVsbCIgKTsKKwkJCQorCQkJdGhpcy5pZCA9IGlkOworCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJCQl0aGlzLm5hbWVPckluZGV4ID0gbmFtZU9ySW5kZXg7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgaW50IGlkOworCisJCXB1YmxpYyBib29sZWFuIGlzU2NhbGFyKCkKKwkJeworCQkJcmV0dXJuIHZhbHVlSXNTY2FsYXIoIHZhbHVlICk7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKQorCQl7CisJCQlpZiAoaXNSb290KCkpCisJCQkJcmV0dXJuICIvIjsKKwkJCQorCQkJU3RyaW5nIHMgPSBnZXRDb25mMCggcGFyZW50ICkuZ2V0UGF0aCgpOworCQkJCisJCQlpZiAocy5lcXVhbHMoICIvIiApKQorCQkJCXJldHVybiBzICsgbmFtZU9ySW5kZXg7CisJCQkKKwkJCXJldHVybiBzICsgJy8nICsgbmFtZU9ySW5kZXg7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBzaXplKCkKKwkJeworCQkJaWYgKGlzTGlzdCgpKQorCQkJCXJldHVybiBsaXN0KCkuc2l6ZSgpOworCQkJCisJCQlpZiAoaXNNYXAoKSkKKwkJCQlyZXR1cm4gbWFwKCkuc2l6ZSgpOworCQkJCisJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiggInZhbHVlIGlzIG5vdCBhIExpc3Qgb3IgYSBNYXAiICk7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBpbmRleCgpCisJCXsKKwkJCWlmIChuYW1lT3JJbmRleCA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlpZiAobmFtZU9ySW5kZXggaW5zdGFuY2VvZiBJbnRlZ2VyKQorCQkJCXJldHVybiAoSW50ZWdlcikgbmFtZU9ySW5kZXg7CisJCQkKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBuYW1lKCkKKwkJeworCQkJaWYgKG5hbWVPckluZGV4ID09IG51bGwpCisJCQkJcmV0dXJuICIiOworCQkJCisJCQlpZiAobmFtZU9ySW5kZXggaW5zdGFuY2VvZiBTdHJpbmcpCisJCQkJcmV0dXJuIChTdHJpbmcpIG5hbWVPckluZGV4OworCQkJCisJCQlyZXR1cm4gbmFtZU9ySW5kZXgudG9TdHJpbmcoKTsKKwkJfQorCisJCXB1YmxpYyBmaW5hbCBJbnRlZ2VyIHBhcmVudDsKKwkJCisJCXB1YmxpYyBmaW5hbCBPYmplY3QgbmFtZU9ySW5kZXg7CisJCQorCQlwdWJsaWMgZmluYWwgT2JqZWN0IHZhbHVlOworCQkKKwkJLy8vQ0xPVkVSOk9GRgorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCQl7CisJCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIkNvbmYgJWQgcGFyZW50ICVzIG5hbWVPckluZGV4ICVzLCB2YWx1ZSAlcyIsIGlkLCBwYXJlbnQsIG5hbWVPckluZGV4LCB2YWx1ZSApOworCQl9CisJCQorCQkvLy9DTE9WRVI6T04KKworCQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoKQorCQl7CisJCQlyZXR1cm4gbmFtZU9ySW5kZXggPT0gbnVsbDsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNMaXN0KCkKKwkJeworCQkJcmV0dXJuIHZhbHVlSXNMaXN0KCB2YWx1ZSApOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNNYXAoKQorCQl7CisJCQlyZXR1cm4gdmFsdWVJc01hcCggdmFsdWUgKTsKKwkJfQorCQkKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCXB1YmxpYyBMaXN0PEludGVnZXI+IGxpc3QoKQorCQl7CisJCQlyZXR1cm4gKExpc3Q8SW50ZWdlcj4pIHZhbHVlOworCQl9CisJCQorCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCgpCisJCXsKKwkJCXJldHVybiAoTWFwPFN0cmluZywgSW50ZWdlcj4pIHZhbHVlOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZSgpCisJCXsKKwkJCXJldHVybiB2YWx1ZSAhPSBudWxsOworCQl9CisJCQorCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkKKwkJeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJCQorCQlwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuKCkKKwkJeworCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKKwkJCQlyZXR1cm4gKEJvb2xlYW4pIHZhbHVlOworCQkJCisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZiggKFN0cmluZykgdmFsdWUgKTsKKwkJCQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIEJvb2xlYW4iICk7CisJCX0KKwkJCisJCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoKQorCQl7CisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQorCQkJCXJldHVybiAoSW50ZWdlcikgdmFsdWU7CisJCQkKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoIChTdHJpbmcpIHZhbHVlICk7CisJCQkJfQorCQkJCWNhdGNoICggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIEludGVnZXI6ICIrdmFsdWUgKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJjYW5ub3QgY29udmVydCB2YWx1ZSB0byBJbnRlZ2VyIiApOworCQl9CisJCQorCQlwdWJsaWMgRG91YmxlIGdldERvdWJsZSgpCisJCXsKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkKKwkJCQlyZXR1cm4gKERvdWJsZSkgdmFsdWU7CisJCQkKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikKKwkJCQlyZXR1cm4gKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpOworCQkJCisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2YoIChTdHJpbmcpIHZhbHVlICk7CisJCQkJfQorCQkJCWNhdGNoICggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIERvdWJsZTogIit2YWx1ZSApOworCQkJCX0KKwkJCX0KKwkJCQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIERvdWJsZSIgKTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKQorCQl7CisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKQorCQkJCXJldHVybiB2YWx1ZS50b1N0cmluZygpOworCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKQorCQkJCXJldHVybiB2YWx1ZS50b1N0cmluZygpOworCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkKKwkJCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKKwkJCQlyZXR1cm4gKFN0cmluZykgdmFsdWU7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiY2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gU3RyaW5nIiApOworCQl9CisJCQorCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCQlwdWJsaWMgRGF0ZSBnZXREYXRlKCkKKwkJeworCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkKKwkJCQlyZXR1cm4gKERhdGUpIHZhbHVlOworCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQorCQkJCXJldHVybiBuZXcgRGF0ZSggKFN0cmluZykgdmFsdWUgKTsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJjYW5ub3QgY29udmVydCB2YWx1ZSB0byBEYXRlIiApOworCQl9CisJCQorCQlwdWJsaWMgTGlzdDw/PiBnZXRMaXN0KCBJbnRlZ2VyIGRlcHRoICkKKwkJeworCQkJaWYgKGlzTGlzdCgpKQorCQkJCXJldHVybiBnZXRMaXN0MCggZGVwdGggKTsKKwkJCQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIExpc3QiICk7CisJCX0KKwkJCisJCXByaXZhdGUgTGlzdDw/PiBnZXRMaXN0MCggSW50ZWdlciBkZXB0aCApCisJCXsKKwkJCWlmIChkZXB0aCA9PSBudWxsKQorCQkJCWRlcHRoID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCQkKKwkJCWlmIChkZXB0aCA8PSAwKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlMaXN0PE9iamVjdD4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PiggbGlzdCgpLnNpemUoKSApOworCQkJZm9yIChJbnRlZ2VyIGlpZDogbGlzdCgpKQorCQkJeworCQkJCUNvbmYgYyA9IGdldENvbmYwKCBpaWQgKTsKKwkJCQlpZiAoYy5pc0xpc3QoKSkKKwkJCQkJbC5hZGQoIGMuZ2V0TGlzdDAoIGRlcHRoLTEgKSApOworCQkJCWVsc2UgaWYgKGMuaXNNYXAoKSkKKwkJCQkJbC5hZGQoIGMuZ2V0TWFwMCggZGVwdGgtMSApICk7CisJCQkJZWxzZQorCQkJCQlsLmFkZCggYy5nZXRWYWx1ZSgpICk7CisJCQl9CisJCQlyZXR1cm4gbDsKKwkJfQorCisJCXB1YmxpYyBNYXA8PywgPz4gZ2V0TWFwKCBJbnRlZ2VyIGRlcHRoICkKKwkJeworCQkJaWYgKGlzTWFwKCkpCisJCQkJcmV0dXJuIGdldE1hcDAoIGRlcHRoICk7CisJCQkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJjYW5ub3QgY29udmVydCB2YWx1ZSB0byBNYXA6ICIrdmFsdWUuZ2V0Q2xhc3MoKSApOworCQl9CisKKwkJcHJpdmF0ZSBNYXA8PywgPz4gZ2V0TWFwMCggSW50ZWdlciBkZXB0aCApCisJCXsKKwkJCWlmIChkZXB0aCA9PSBudWxsKQorCQkJCWRlcHRoID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCQkKKwkJCWlmIChkZXB0aCA8PSAwKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oIChtYXAoKS5zaXplKCkgKiA0ICsgMikgLyAzICk7CisJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IGU6IG1hcCgpLmVudHJ5U2V0KCkpCisJCQl7CisJCQkJQ29uZiBjID0gZ2V0Q29uZjAoIGUuZ2V0VmFsdWUoKSApOworCQkJCWlmIChjLmlzTGlzdCgpKQorCQkJCQltLnB1dCggZS5nZXRLZXkoKSwgYy5nZXRMaXN0MCggZGVwdGgtMSApICk7CisJCQkJZWxzZSBpZiAoYy5pc01hcCgpKQorCQkJCQltLnB1dCggZS5nZXRLZXkoKSwgYy5nZXRNYXAwKCBkZXB0aC0xICkgKTsKKwkJCQllbHNlCisJCQkJCW0ucHV0KCBlLmdldEtleSgpLCBjLmdldFZhbHVlKCkgKTsKKwkJCX0KKwkJCXJldHVybiBtOworCQl9CisJfQorCisJdm9pZCBzZXRJbnRlcnZhbCggaW50IG5ld0ludGVydmFsICkKKwl7CisJCUlOVEVSVkFMID0gbmV3SW50ZXJ2YWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9UZXN0WWFtbENvbmZpZy5qYXZhIGIvc2VydmljZXMvY29uZmlnL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3NlcnZpY2VzL2NvbmZpZy9UZXN0WWFtbENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2E0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvc2VydmljZXMvY29uZmlnL1Rlc3RZYW1sQ29uZmlnLmphdmEKQEAgLTAsMCArMSwxNzM2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnNlcnZpY2VzLmNvbmZpZy5Db25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqIFRlc3Qgb2YgWWFtbENvbmZpZyAqLworcHVibGljIGNsYXNzIFRlc3RZYW1sQ29uZmlnCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URSA9ICJzZXJ2aWNlcy9jb25maWcvcmVtb3RlIjsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9HVVMgPSAic2VydmljZXMvY29uZmlnL2JvZ3VzIjsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxBTksgPSAiIjsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAic2VydmljZXMvY29uZmlnL2VtcHR5IjsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSID0gInNlcnZpY2VzL2NvbmZpZy9kaXIiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURSA9ICJzZXJ2aWNlcy9jb25maWcvdXBkYXRlIjsKKwkKKwlwcml2YXRlIGZpbmFsIE15Q29uZmlndXJhdGlvbkNsaWVudCBjbGllbnQgPSBuZXcgTXlDb25maWd1cmF0aW9uQ2xpZW50KCk7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKCBjLmlzTG9hZGVkKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gbmV3IFlhbWxDb25maWcoIGNsaWVudCApOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaXNMb2FkZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgbnVsbCApOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaXNMb2FkZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBuZXcgWWFtbENvbmZpZyggY2xpZW50LCBudWxsICk7CisJCUFzc2VydC5hc3NlcnRGYWxzZSggYy5pc0xvYWRlZCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0NSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNMb2FkZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBuZXcgWWFtbENvbmZpZyggY2xpZW50LCBSRU1PVEUgKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNMb2FkZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQluZXcgWWFtbENvbmZpZyggbnVsbCwgQkxBTksgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Q4KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IFlhbWxDb25maWcoIGNsaWVudCwgQkxBTksgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IFlhbWxDb25maWcoIG51bGwsIEVNUFRZICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgY29uc3RydWN0MTAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQluZXcgWWFtbENvbmZpZyggY2xpZW50LCBFTVBUWSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IFlhbWxDb25maWcoIG51bGwsIERJUiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IFlhbWxDb25maWcoIGNsaWVudCwgRElSICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2FubG9hZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsICk7CisJCUFzc2VydC5hc3NlcnRGYWxzZSggYy5jYW5Mb2FkKCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIGMuY2FuTG9hZCggUkVNT1RFICkgKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKCBjLmNhbkxvYWQoIEJPR1VTICkgKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKCBjLmNhbkxvYWQoIEJMQU5LICkgKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIGMuY2FuTG9hZCggRU1QVFkgKSApOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuY2FuTG9hZCggRElSICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBsb2FkQ29uZmlnMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsICk7CisJCWMubG9hZENvbmZpZyggbnVsbCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxvYWRDb25maWcyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJYy5sb2FkQ29uZmlnKCBSRU1PVEUgKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNMb2FkZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGxvYWRDb25maWczKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJYy5sb2FkQ29uZmlnKCBCT0dVUyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGxvYWRDb25maWc0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJYy5sb2FkQ29uZmlnKCBCTEFOSyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGxvYWRDb25maWc1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJYy5sb2FkQ29uZmlnKCBFTVBUWSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGxvYWRDb25maWc2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJYy5sb2FkQ29uZmlnKCBESVIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpc0xvYWRlZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RMb2FkQ29uZmlnKCBudWxsLCBmYWxzZSApOworCQl0ZXN0TG9hZENvbmZpZyggUkVNT1RFLCB0cnVlICk7CisJCXRlc3RMb2FkQ29uZmlnKCBCT0dVUywgZmFsc2UgKTsKKwkJdGVzdExvYWRDb25maWcoIEJMQU5LLCBmYWxzZSApOworCQl0ZXN0TG9hZENvbmZpZyggRU1QVFksIGZhbHNlICk7CisJCXRlc3RMb2FkQ29uZmlnKCBESVIsIGZhbHNlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1bmxvYWRDb25maWcxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIG51bGwgKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKCBjLmlzTG9hZGVkKCkgKTsKKwkJYy51bmxvYWRDb25maWcoKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKCBjLmlzTG9hZGVkKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVubG9hZENvbmZpZzIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgbnVsbCApOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaXNMb2FkZWQoKSApOworCQljLnVubG9hZENvbmZpZygpOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaXNMb2FkZWQoKSApOworCQljLnVubG9hZENvbmZpZygpOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaXNMb2FkZWQoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdW5sb2FkQ29uZmlnMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBudWxsICk7CisJCUFzc2VydC5hc3NlcnRGYWxzZSggYy5pc0xvYWRlZCgpICk7CisJCWMubG9hZENvbmZpZyggUkVNT1RFICk7CisJCUFzc2VydC5hc3NlcnRUcnVlKCBjLmlzTG9hZGVkKCkgKTsKKwkJYy51bmxvYWRDb25maWcoKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKCBjLmlzTG9hZGVkKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9wczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyB0ZXN0IHByb3BlcnRpZXMgb24gdGhlIHJvb3Qgbm9kZQorCQkKKwkJdGVzdFByb3BzKCBjLCByLCBudWxsLCAiIiwgbnVsbCwgIi8iLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgMTUgKTsKKwkJCQkKKwkJLy8gdGVzdCBwcm9wZXJ0aWVzIG9uIHRoZSB1c2VycyBub2RlCisJCQorCQl0ZXN0UHJvcHMoIGMsIGMuZ2V0Q29uZmlnUGF0aCggciwgInVzZXJzIiApLCByLCAidXNlcnMiLCBudWxsLCAiL3VzZXJzIiwKKwkJCWZhbHNlLCBmYWxzZSwgdHJ1ZSwgNCApOworCQkJCQorCQkvLyB0ZXN0IHByb3BlcnRpZXMgb24gdGhlIHByaW1lcyBub2RlCisJCQorCQl0ZXN0UHJvcHMoIGMsIGMuZ2V0Q29uZmlnUGF0aCggciwgInByaW1lcyIgKSwgciwgInByaW1lcyIsIG51bGwsCisJCQkiL3ByaW1lcyIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgNyApOworCQkJCQorCQkvLyB0ZXN0IHByb3BlcnRpZXMgb24gdGhlIHByaW1lcy80IG5vZGUKKwkJCisJCXRlc3RQcm9wcyggYywgYy5nZXRDb25maWdQYXRoKCByLCAicHJpbWVzLzQiICksCisJCQljLmdldENvbmZpZ1BhdGgoIHIsICJwcmltZXMiICksICI0IiwgNCwgIi9wcmltZXMvNCIsIGZhbHNlLCBmYWxzZSwKKwkJCWZhbHNlLCBudWxsICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHByb3BzMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIHZhbHVlIGlzIG5vdCBhIExpc3Qgb3IgYSBNYXAKKwkJYy5zaXplKCBjLmdldENvbmZpZ1BhdGgoIHIsICJwcmltZXMvNCIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHByb3BzMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJLy8gaWQgPT0gbnVsbAorCQljLnNpemUoIG51bGwgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwcm9wczQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCS8vIGlkID09IG51bGwKKwkJYy5zaXplKCAiIyIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwcm9wczUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCS8vIGlkID09IG51bGwKKwkJYy5zaXplKCAiIzAiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcHJvcHM2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJLy8gaWQgPT0gbnVsbAorCQljLnNpemUoICIjMCMiICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByb290MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQkvLyB0cnkgYWJzb2x1dGUgcGF0aHMgZm9yIHJvb3QKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHIsIGMuZ2V0Q29uZmlnUGF0aCggbnVsbCwgIi8iICkgKTsgLy8gcm9vdAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCByLCBjLmdldENvbmZpZ1BhdGgoIC0xLCAiLyIgKSApOyAvLyByb290CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHIsIGMuZ2V0Q29uZmlnUGF0aCggImFiYyIsICIvIiApICk7IC8vIHJvb3QKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggciwgYy5nZXRDb25maWdQYXRoKCBmYWxzZSwgIi8iICkgKTsgLy8gcm9vdAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCByLCBjLmdldENvbmZpZ1BhdGgoIHIsICIvIiApICk7IC8vIHJvb3QKKwkJCisJCS8vIHRyeSByZWxhdGl2ZSBwYXRocyBmb3Igcm9vdAorCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHIsIGMuZ2V0Q29uZmlnUGF0aCggciwgIiIgKSApOyAvLyByb290CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHIsIGMuZ2V0Q29uZmlnUGF0aCggciwgIi4iICkgKTsgLy8gcm9vdAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCByLCBjLmdldENvbmZpZ1BhdGgoIHIsICIuLy4iICkgKTsgLy8gcm9vdAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCByLCBjLmdldENvbmZpZ1BhdGgoIHIsICIuLy4vLiIgKSApOyAvLyByb290CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHIsIGMuZ2V0Q29uZmlnUGF0aCggciwgImJvb2wvLi4iICkgKTsgLy8gcm9vdAorCQkKKwkJLy8gb3RoZXIgcmVsYXRpdmUgcGF0aHMKKwkJCisJCUFzc2VydC5hc3NlcnROdWxsKCBjLmdldENvbmZpZ1BhdGgoIHIsICIuLiIgKSApOyAvLyBwYXJlbnQKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIGMuZ2V0Q29uZmlnUGF0aCggciwgImJvb2wiICkgKTsgLy8gY2hpbGQKKwkJCisJCS8vIGJhZCBwYXRocworCisJCUFzc2VydC5hc3NlcnROdWxsKCBjLmdldENvbmZpZ1BhdGgoIHIsICJibGFoIiApICk7CisJCUFzc2VydC5hc3NlcnROdWxsKCBjLmdldENvbmZpZ1BhdGgoIHIsICJibGFoL2JsYWgiICkgKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIGMuZ2V0Q29uZmlnUGF0aCggciwgInByaW1lcy80IiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcm9vdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBwYXRoID09IG51bGwKKwkJYy5nZXRDb25maWdQYXRoKCByLCBudWxsICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcm9vdDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBwYXRoIG11c3QgYmUgYWJzb2x1dGUgd2hlbiBpZCA9PSBudWxsCisJCWMuZ2V0Q29uZmlnUGF0aCggbnVsbCwgImZvbyIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCByb290NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIGlkIGlzIG5vdCB2YWxpZAorCQljLmdldENvbmZpZ1BhdGgoIC0xLCAiZm9vIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHJvb3Q1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gaWQgaXMgbm90IHZhbGlkCisJCWMuZ2V0Q29uZmlnUGF0aCggMCwgImZvbyIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCByb290NigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIGlkIGlzIG5vdCB2YWxpZAorCQljLmdldENvbmZpZ1BhdGgoIDk5LCAiZm9vIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHJvb3Q3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gaWQgaXMgbm90IHZhbGlkCisJCWMuZ2V0Q29uZmlnUGF0aCggImFiYyIsICJmb28iICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcm9vdDgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBpZCBpcyBub3QgdmFsaWQKKwkJYy5nZXRDb25maWdQYXRoKCAiI2FiYyMiLCAiZm9vIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHJvb3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gaWQgaXMgbm90IHZhbGlkCisJCWMuZ2V0Q29uZmlnUGF0aCggIiM/IyIsICJmb28iICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcm9vdDEwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gaWQgaXMgbm90IHZhbGlkCisJCWMuZ2V0Q29uZmlnUGF0aCggZmFsc2UsICJmb28iICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcm9vdDExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gaSA8IDAgfHwgaSA+PSBsaXN0LnNpemUoKQorCQljLmdldENvbmZpZ1BhdGgoIHIsICJwcmltZXMvMTIiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcm9vdDEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwgKTsKKwkJYy5nZXRSb290KCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHJvb3QxMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIGFiYworCQljLmdldENvbmZpZ1BhdGgoIHIsICJwcmltZXMvNC9hYmMiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgaGFzVmFsdWVQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCisJCUFzc2VydC5hc3NlcnRUcnVlKCBjLmhhc1ZhbHVlUGF0aCggciwgIi4iICkgKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIGMuaGFzVmFsdWVQYXRoKCByLCAiYm9vbCIgKSApOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaGFzVmFsdWVQYXRoKCByLCAiYmxhaCIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFZhbHVlUGF0aCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggYy5nZXRWYWx1ZVBhdGgoIHIsICIuIiApICk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCBjLmdldFZhbHVlUGF0aCggciwgImJvb2wiICkgKTsKKwkJQXNzZXJ0LmFzc2VydE51bGwoIGMuZ2V0VmFsdWVQYXRoKCByLCAiYmxhaCIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEJvb2xlYW5QYXRoMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCB0cnVlLCBjLmdldEJvb2xlYW5QYXRoKCByLCAiYm9vbCIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBmYWxzZSwgYy5nZXRCb29sZWFuUGF0aCggciwgImJvb2wyIiApICk7CisJCUFzc2VydC5hc3NlcnROdWxsKCBjLmdldEJvb2xlYW5QYXRoKCByLCAiYmxhaCIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldEJvb2xlYW5QYXRoMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQkvLyBjYW5ub3QgY29udmVydCB2YWx1ZSB0byBCb29sZWFuCisJCWMuZ2V0Qm9vbGVhblBhdGgoIHIsICIuIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldEJvb2xlYW5QYXRoMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIGNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIEJvb2xlYW4KKwkJYy5nZXRCb29sZWFuUGF0aCggciwgImludCIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRJbnRlZ2VyUGF0aDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMjMsIGMuZ2V0SW50ZWdlclBhdGgoIHIsICJpbnQiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMzQsIGMuZ2V0SW50ZWdlclBhdGgoIHIsICJpbnQyIiApICk7CisJCUFzc2VydC5hc3NlcnROdWxsKCBjLmdldEludGVnZXJQYXRoKCByLCAiYmxhaCIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldEludGVnZXJQYXRoMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQkvLyBjYW5ub3QgY29udmVydCB2YWx1ZSB0byBJbnRlZ2VyCisJCWMuZ2V0SW50ZWdlclBhdGgoIHIsICIuIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldEludGVnZXJQYXRoMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIGNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIEludGVnZXIKKwkJYy5nZXRJbnRlZ2VyUGF0aCggciwgImJvb2wiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0SW50ZWdlclBhdGg0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gY2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gSW50ZWdlcgorCQljLmdldEludGVnZXJQYXRoKCByLCAiaW50MyIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXREb3VibGVQYXRoMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LjUsIGMuZ2V0RG91YmxlUGF0aCggciwgImRibCIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LjYsIGMuZ2V0RG91YmxlUGF0aCggciwgImRibDIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNjcsIGMuZ2V0RG91YmxlUGF0aCggciwgImRibDMiICkgKTsKKwkJQXNzZXJ0LmFzc2VydE51bGwoIGMuZ2V0RG91YmxlUGF0aCggciwgImJsYWgiICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXREb3VibGVQYXRoMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQkvLyBjYW5ub3QgY29udmVydCB2YWx1ZSB0byBEb3VibGUKKwkJYy5nZXREb3VibGVQYXRoKCByLCAiLiIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXREb3VibGVQYXRoMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIGNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIERvdWJsZQorCQljLmdldERvdWJsZVBhdGgoIHIsICJib29sIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldERvdWJsZVBhdGg0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gY2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gRG91YmxlCisJCWMuZ2V0RG91YmxlUGF0aCggciwgImRibDQiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXREYXRlUGF0aDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbmV3IERhdGUoICIxMi8xOS8yMDA4IiApLCBjLmdldERhdGVQYXRoKCByLCAiZGF0ZSIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXcgRGF0ZSggIjEyLzIzLzIwMDgiICksIGMuZ2V0RGF0ZVBhdGgoIHIsICJkYXRlMiIgKSApOworCQlBc3NlcnQuYXNzZXJ0TnVsbCggYy5nZXREYXRlUGF0aCggciwgImJsYWgiICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXREYXRlUGF0aDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisKKwkJLy8gY2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gRGF0ZQorCQljLmdldERhdGVQYXRoKCByLCAiLiIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXREYXRlUGF0aDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBjYW5ub3QgY29udmVydCB2YWx1ZSB0byBEYXRlCisJCWMuZ2V0RGF0ZVBhdGgoIHIsICJib29sIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFN0cmluZ1BhdGgxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoICJ0cnVlIiwgYy5nZXRTdHJpbmdQYXRoKCByLCAiYm9vbCIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAiMjMiLCBjLmdldFN0cmluZ1BhdGgoIHIsICJpbnQiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggIjQuNSIsIGMuZ2V0U3RyaW5nUGF0aCggciwgImRibCIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAiYm9vIiwgYy5nZXRTdHJpbmdQYXRoKCByLCAic3RyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoICIxMi8xOS8yMDA4IiwgYy5nZXRTdHJpbmdQYXRoKCByLCAiZGF0ZSIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAiVHVlIERlYyAyMyAwMDowMDowMCBDU1QgMjAwOCIsIGMuZ2V0U3RyaW5nUGF0aCggciwgImRhdGUyIiApICk7CisJCUFzc2VydC5hc3NlcnROdWxsKCBjLmdldFN0cmluZ1BhdGgoIHIsICJibGFoIiApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0U3RyaW5nUGF0aDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisKKwkJLy8gY2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gU3RyaW5nCisJCWMuZ2V0U3RyaW5nUGF0aCggciwgIi4iICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0U3RyaW5nUGF0aDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBjYW5ub3QgY29udmVydCB2YWx1ZSB0byBTdHJpbmcKKwkJYy5nZXRTdHJpbmdQYXRoKCByLCAicHJpbWVzIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldFN0cmluZ1BhdGg0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gY2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gU3RyaW5nCisJCWMuZ2V0U3RyaW5nUGF0aCggciwgInVzZXJzIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldExpc3RQYXRoMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCUxpc3Q8SW50ZWdlcj4gbCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKwkJbC5hZGQoIDEgKTsKKwkJbC5hZGQoIDIgKTsKKwkJbC5hZGQoIDMgKTsKKwkJbC5hZGQoIDUgKTsKKwkJbC5hZGQoIDcgKTsKKwkJbC5hZGQoIDExICk7CisJCWwuYWRkKCAxMyApOworCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGwsIGMuZ2V0TGlzdFBhdGgoIHIsICJwcmltZXMiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbCwgYy5nZXRMaXN0UGF0aCggciwgInByaW1lcyIsIDEgKSApOworCQlBc3NlcnQuYXNzZXJ0TnVsbCggYy5nZXRMaXN0UGF0aCggciwgInByaW1lcyIsIDAgKSApOworCQlBc3NlcnQuYXNzZXJ0TnVsbCggYy5nZXRMaXN0UGF0aCggciwgImJsYWgiLCBudWxsICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRMaXN0UGF0aDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBjYW5ub3QgY29udmVydCB2YWx1ZSB0byBMaXN0CisJCWMuZ2V0TGlzdFBhdGgoIHIsICJ1c2VycyIsIG51bGwgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRMaXN0UGF0aDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBjYW5ub3QgY29udmVydCB2YWx1ZSB0byBMaXN0CisJCWMuZ2V0TGlzdFBhdGgoIHIsICJpbnQiLCBudWxsICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0TWFwUGF0aDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJbS5wdXQoICJmcmVkIiwgMTIzNCApOworCQltLnB1dCggIm1hcnkiLCAyMzQ1ICk7CisJCW0ucHV0KCAiYWxpY2UiLCA5ODc2ICk7CisJCW0ucHV0KCAiamFjayIsIDg3NjUgKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG0sIGMuZ2V0TWFwUGF0aCggciwgInVzZXJzIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG0sIGMuZ2V0TWFwUGF0aCggciwgInVzZXJzIiwgMSApICk7CisJCUFzc2VydC5hc3NlcnROdWxsKCBjLmdldE1hcFBhdGgoIHIsICJ1c2VycyIsIDAgKSApOworCQlBc3NlcnQuYXNzZXJ0TnVsbCggYy5nZXRNYXBQYXRoKCByLCAiYmxhaCIsIG51bGwgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldE1hcFBhdGgyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJLy8gY2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gTWFwCisJCWMuZ2V0TWFwUGF0aCggciwgInByaW1lcyIsIG51bGwgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRNYXBQYXRoMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIGNhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIE1hcAorCQljLmdldE1hcFBhdGgoIHIsICJpbnQiLCBudWxsICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0Q29uZmlnSW5kZXgxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJT2JqZWN0IHAgPSBjLmdldENvbmZpZ1BhdGgoIHIsICJwcmltZXMiICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDcsIGMuZ2V0SW50ZWdlciggYy5nZXRDb25maWdJbmRleCggcCwgNCApICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRDb25maWdJbmRleDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQlPYmplY3QgcCA9IGMuZ2V0Q29uZmlnUGF0aCggciwgInByaW1lcyIgKTsKKwkJYy5nZXRDb25maWdJbmRleCggcCwgLTEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRDb25maWdJbmRleDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQlPYmplY3QgcCA9IGMuZ2V0Q29uZmlnUGF0aCggciwgInByaW1lcyIgKTsKKwkJYy5nZXRDb25maWdJbmRleCggcCwgOTkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRDb25maWdJbmRleDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQlPYmplY3QgcCA9IGMuZ2V0Q29uZmlnUGF0aCggciwgInByaW1lcyIgKTsKKwkJYy5nZXRDb25maWdJbmRleCggcCwgbnVsbCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldENvbmZpZ0luZGV4NSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCWMuZ2V0Q29uZmlnSW5kZXgoIHIsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRDb25maWdJbmRleDYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQljLmdldENvbmZpZ0luZGV4KCBudWxsLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbGlzdENvbmZpZ1BhdGhJZHMxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJT2JqZWN0W10gaWRzID0gYy5saXN0Q29uZmlnUGF0aElkcyggciwgInVzZXJzIiwgbnVsbCwgbnVsbCApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBpZHMubGVuZ3RoICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbGlzdENvbmZpZ1BhdGhJZHMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJT2JqZWN0W10gaWRzID0gYy5saXN0Q29uZmlnUGF0aElkcyggciwgInByaW1lcyIsIG51bGwsIG51bGwgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNywgaWRzLmxlbmd0aCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBsaXN0Q29uZmlnUGF0aElkczMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyB2YWx1ZSBpcyBub3QgYSBMaXN0IG9yIGEgTWFwCisJCWMubGlzdENvbmZpZ1BhdGhJZHMoIHIsICJwcmltZXMvNCIsIG51bGwsIG51bGwgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsaXN0Q29uZmlnUGF0aElkczQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQlPYmplY3RbXSBpZHMgPSBjLmxpc3RDb25maWdQYXRoSWRzKCByLCAicHJpbWVzIiwgMSwgMyApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAzLCBpZHMubGVuZ3RoICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbGlzdENvbmZpZ1BhdGhJZHM1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJT2JqZWN0W10gaWRzID0gYy5saXN0Q29uZmlnUGF0aElkcyggciwgInByaW1lcyIsIDUsIDQgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgaWRzLmxlbmd0aCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGxpc3RDb25maWdQYXRoSWRzNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIG9mZnNldCA8IDAKKwkJYy5saXN0Q29uZmlnUGF0aElkcyggciwgInByaW1lcyIsIC0xLCA0ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbGlzdENvbmZpZ1BhdGhJZHM3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIG51bGwsIFJFTU9URSApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJT2JqZWN0W10gaWRzID0gYy5saXN0Q29uZmlnUGF0aElkcyggciwgInByaW1lcyIsIDcsIDQgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMCwgaWRzLmxlbmd0aCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGxpc3RDb25maWdQYXRoSWRzOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBudWxsLCBSRU1PVEUgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCS8vIG9mZnNldCA+IHNpemUKKwkJYy5saXN0Q29uZmlnUGF0aElkcyggciwgInByaW1lcyIsIDgsIDQgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBsaXN0Q29uZmlnUGF0aElkczkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCwgUkVNT1RFICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisJCQorCQkvLyBjb3VudCA8IDAKKwkJYy5saXN0Q29uZmlnUGF0aElkcyggciwgInByaW1lcyIsIDAsIC0xICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic2NyaWJlUGF0aDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggY2xpZW50LCBSRU1PVEUgKTsKKwkJY2xpZW50LnNldFNlcnZlciggYyApOworCQkKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQljLnN1YnNjcmliZVBhdGgoIHIsICJ1c2VycyIgKTsKKwkJYy5zdWJzY3JpYmVQYXRoKCByLCAidXNlcnMiICk7CisJCQorCQljLnN1YnNjcmliZVBhdGgoIHIsICJwcmltZXMiICk7CisJCWMuc3Vic2NyaWJlUGF0aCggciwgInByaW1lcyIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJzY3JpYmVQYXRoMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBjbGllbnQsIFJFTU9URSApOworCQljbGllbnQuc2V0U2VydmVyKCBjICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisKKwkJYy5zdWJzY3JpYmVQYXRoKCByLCAiYmxhaCIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1bnN1YnNjcmliZVBhdGgxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIGNsaWVudCwgUkVNT1RFICk7CisJCWNsaWVudC5zZXRTZXJ2ZXIoIGMgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKworCQljLnN1YnNjcmliZVBhdGgoIHIsICJ1c2VycyIgKTsKKwkJYy51bnN1YnNjcmliZVBhdGgoIHIsICJ1c2VycyIgKTsKKwkJCisJCWMuc3Vic2NyaWJlUGF0aCggciwgInByaW1lcyIgKTsKKwkJYy51bnN1YnNjcmliZVBhdGgoIHIsICJwcmltZXMiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdW5zdWJzY3JpYmVQYXRoMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbmZpZ3VyYXRpb25TZXJ2ZXIgYyA9IG5ldyBZYW1sQ29uZmlnKCBjbGllbnQsIFJFTU9URSApOworCQljbGllbnQuc2V0U2VydmVyKCBjICk7CisJCU9iamVjdCByID0gYy5nZXRSb290KCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCByICk7CisKKwkJYy51bnN1YnNjcmliZVBhdGgoIHIsICJibGFoIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbmZpZ1ZhbHVlc0NoYW5nZWQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ29uZmlndXJhdGlvblNlcnZlciBjID0gbmV3IFlhbWxDb25maWcoIGNsaWVudCwgUkVNT1RFICk7CisJCWNsaWVudC5zZXRTZXJ2ZXIoIGMgKTsKKwkJT2JqZWN0IHIgPSBjLmdldFJvb3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHIgKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHNldCgpLCBjbGllbnQuY2hhbmdlZCApOworCQkKKwkJYy5zdWJzY3JpYmUoIHIgKTsKKwkJVGhyZWFkLnNsZWVwKCAxMDAgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggc2V0KCByICksIGNsaWVudC5jaGFuZ2VkICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uZmlnVmFsdWVzQ2hhbmdlZDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggY2xpZW50LCBSRU1PVEUgKTsKKwkJY2xpZW50LnNldFNlcnZlciggYyApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJT2JqZWN0IHggPSBjLmdldENvbmZpZ1BhdGgoIHIsICJ1c2VycyIgKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHggKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHNldCgpLCBjbGllbnQuY2hhbmdlZCApOworCQkKKwkJYy5zdWJzY3JpYmUoIHggKTsKKwkJVGhyZWFkLnNsZWVwKCAxMDAgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggc2V0KCB4ICksIGNsaWVudC5jaGFuZ2VkICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uZmlnVmFsdWVzQ2hhbmdlZDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggY2xpZW50LCBSRU1PVEUgKTsKKwkJY2xpZW50LnNldFNlcnZlciggYyApOworCQlPYmplY3QgciA9IGMuZ2V0Um9vdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggciApOworCQkKKwkJT2JqZWN0IHggPSBjLmdldENvbmZpZ1BhdGgoIHIsICJ1c2VycyIgKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHggKTsKKwkJCisJCU9iamVjdCB5ID0gYy5nZXRDb25maWdQYXRoKCByLCAicHJpbWVzIiApOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggeSApOworCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHNldCgpLCBjbGllbnQuY2hhbmdlZCApOworCisJCWMuc3Vic2NyaWJlKCB4ICk7CisJCVRocmVhZC5zbGVlcCggMTAwICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHNldCggeCApLCBjbGllbnQuY2hhbmdlZCApOworCisJCWMuc3Vic2NyaWJlKCB5ICk7CisJCVRocmVhZC5zbGVlcCggMTAwICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHNldCggeSApLCBjbGllbnQuY2hhbmdlZCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBuZXcgWWFtbENvbmZpZyggY2xpZW50LCBVUERBVEUrMCApOworCQljbGllbnQuc2V0U2VydmVyKCBjICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrMSApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNSwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMywgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDQgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzIgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDYsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDMsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXoiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzMgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrNCApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNSwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDUgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzUgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDUsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0LCA1ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGxpc3QoIDEsIDIsIDMgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGU2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSs2ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMyApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrNyApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNiwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDQgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAieCIsIDYsICJ5IiwgNywgInoiLCA4ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcDEiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzggKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDYsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDMsIDQsIDUgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5MSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlOSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrOSApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDQgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGxpc3QoIDEsIDIsIDMgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGUxMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrMTAgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGxpc3QoIDEsIDIsIDMgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGUxMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrMTEgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDUsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIG1hcCggImQiLCA4LCAiZSIsIDksICJmIiwgMTAgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSsxMiApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNSwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDQgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCBsaXN0KCA0LCA1LCA2ICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzEzICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIGxpc3QoIDEsIDIsIDMgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGUxNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrMTQgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDUsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMTUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzE1ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggIngiLCA0LCAieSIsIDUsICJ6IiwgNiApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJiYXIiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzE2ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDQsIDUsIDYgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImJhciIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGxpc3QoIDEsIDIsIDMgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGUxNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrMTcgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDUsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAxNywgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgIm1hcCIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMTgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzE4ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAieCIsIDgsICJ5IiwgOSwgInoiLCAxMCApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTE5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSsxOSApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNSwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDQgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDMsIDQsIDUgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMjAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzIwICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMTcsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJhcnJheSIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGxpc3QoIDEsIDIsIDMgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGUyMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrMjEgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDUsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJpIiwgOSwgImoiLCA4ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTIyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSsyMiApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNSwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDQsIDUsIDYgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTIzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSsyMyApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNSwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDQgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgbGlzdCggMSwgMiwgMyApLCBtYXAoICJ4IiwgOCwgInkiLCA3LCAieiIsIDYgKSApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMjQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzI0ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBsaXN0KCAxLCAyLCAzICksIGxpc3QoIDIsIDMsIDQgKSApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMjUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzI1ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIDI1LCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMjYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzI2ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggIngiLCA2LCAieSIsIDcsICJ6IiwgOCApLCBsaXN0KCAxLCAyLCAzICksICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMjcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzI3ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIGxpc3QoIDIsIDMsIDQgKSwgbGlzdCggMSwgMiwgMyApLCAiYmVhciIgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImxpc3QiLCBudWxsICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZTI4KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSsyOCApOworCQlPYmplY3Qgcm9vdCA9IGMuZ2V0Um9vdCgpOworCQkKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNSwgYy5zaXplKCByb290ICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggMiwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImZvbyIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0LCBjLmdldEludGVnZXJQYXRoKCByb290LCAiYmFyIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoIDIsIDMsIDQgKSwgYy5nZXRMaXN0UGF0aCggcm9vdCwgImFycmF5IiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBjLmdldE1hcFBhdGgoIHJvb3QsICJtYXAiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggImZpc2giLCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgMzQsICJiZWFyIiApLCBjLmdldExpc3RQYXRoKCByb290LCAibGlzdCIsIG51bGwgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlMjkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlZYW1sQ29uZmlnIGMgPSBzZXR1cFVwZGF0ZSggVVBEQVRFKzI5ICk7CisJCU9iamVjdCByb290ID0gYy5nZXRSb290KCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1LCBjLnNpemUoIHJvb3QgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCAyLCBjLmdldEludGVnZXJQYXRoKCByb290LCAiZm9vIiApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDQsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJiYXIiICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbGlzdCggMiwgMywgNCApLCBjLmdldExpc3RQYXRoKCByb290LCAiYXJyYXkiLCBudWxsICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGMuZ2V0TWFwUGF0aCggcm9vdCwgIm1hcCIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAiZmlzaCIsIG1hcCggImEiLCA1LCAiYiIsIDYsICJjIiwgNyApLCBtYXAoICJ4IiwgNywgInkiLCA4LCAieiIsIDkgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGUzMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IHNldHVwVXBkYXRlKCBVUERBVEUrMzAgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDUsIGMuc2l6ZSggcm9vdCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIDIsIGMuZ2V0SW50ZWdlclBhdGgoIHJvb3QsICJmb28iICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggNCwgYy5nZXRJbnRlZ2VyUGF0aCggcm9vdCwgImJhciIgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBsaXN0KCAyLCAzLCA0ICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJhcnJheSIsIG51bGwgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBtYXAoICJhIiwgNSwgImIiLCA2LCAiYyIsIDcgKSwgYy5nZXRNYXBQYXRoKCByb290LCAibWFwIiwgbnVsbCApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGxpc3QoICJmaXNoIiwgbWFwKCAiYSIsIDUsICJiIiwgNiwgImMiLCA3ICksIGxpc3QoIDIsIDMsIDQgKSwgImJlYXIiICksIGMuZ2V0TGlzdFBhdGgoIHJvb3QsICJsaXN0IiwgbnVsbCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3Vic2NyaWJlVXBkYXRlMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNldHVwVXBkYXRlKCBVUERBVEUrMCwgIi4iICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHNldCgpLCBjbGllbnQuY2hhbmdlZCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YnNjcmliZVVwZGF0ZTFhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSsxLCAiLiIgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggc2V0KCBjLmdldENvbmZpZ1BhdGgoIGMuZ2V0Um9vdCgpLCAiLiIgKSApLCBjbGllbnQuY2hhbmdlZCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YnNjcmliZVVwZGF0ZTFiKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJWWFtbENvbmZpZyBjID0gc2V0dXBVcGRhdGUoIFVQREFURSsxLCAiZm9vIiApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBzZXQoIGMuZ2V0Q29uZmlnUGF0aCggYy5nZXRSb290KCksICJmb28iICkgKSwgY2xpZW50LmNoYW5nZWQgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJzY3JpYmVVcGRhdGUxYygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNldHVwVXBkYXRlKCBVUERBVEUrMSwgImJhciIgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggc2V0KCksIGNsaWVudC5jaGFuZ2VkICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0TG9hZENvbmZpZyggU3RyaW5nIG5hbWUsIGJvb2xlYW4gZXhwZWN0ZWQgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDb25maWd1cmF0aW9uU2VydmVyIGMgPSBuZXcgWWFtbENvbmZpZyggbnVsbCApOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaXNMb2FkZWQoKSApOworCQl0cnkgeyBjLmxvYWRDb25maWcoIG5hbWUgKTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiBlICkge30KKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggZXhwZWN0ZWQsIGMuaXNMb2FkZWQoKSApOworCQljLnVubG9hZENvbmZpZygpOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoIGMuaXNMb2FkZWQoKSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFByb3BzKCBDb25maWd1cmF0aW9uU2VydmVyIGMsIE9iamVjdCBub2RlLCBPYmplY3QgcGFyZW50LAorCQlTdHJpbmcgbmFtZSwgSW50ZWdlciBpbmRleCwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gaXNSb290LCBib29sZWFuIGlzTGlzdCwKKwkJYm9vbGVhbiBpc01hcCwgSW50ZWdlciBzaXplICkKKwl7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHBhcmVudCwgYy5nZXRQYXJlbnQoIG5vZGUgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuYW1lLCBjLmdldE5hbWUoIG5vZGUgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbmRleCwgYy5nZXRJbmRleCggbm9kZSApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIHBhdGgsIGMuZ2V0UGF0aCggbm9kZSApICk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIGlzUm9vdCwgYy5pc1Jvb3QoIG5vZGUgKSApOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpc0xpc3QsIGMuaXNMaXN0KCBub2RlICkgKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyggaXNNYXAsIGMuaXNNYXAoIG5vZGUgKSApOworCQlpZiAoc2l6ZSAhPSBudWxsKQorCQkJQXNzZXJ0LmFzc2VydEVxdWFscyggc2l6ZSwgYy5zaXplKCBub2RlICkgKTsKKwl9CisJCisJcHJpdmF0ZSBZYW1sQ29uZmlnIHNldHVwVXBkYXRlKCBTdHJpbmcgdXBkYXRlQ29uZmlnLCBTdHJpbmcgcGF0aCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVlhbWxDb25maWcgYyA9IG5ldyBZYW1sQ29uZmlnKCBjbGllbnQsIFVQREFURSswICk7CisJCWNsaWVudC5zZXRTZXJ2ZXIoIGMgKTsKKwkJT2JqZWN0IHJvb3QgPSBjLmdldFJvb3QoKTsKKwkJCisJCWMuc2V0SW50ZXJ2YWwoIDUwICk7CisJCWMuc3Vic2NyaWJlUGF0aCggcm9vdCwgcGF0aCApOworCQljLnNldENvbmZpZyggdXBkYXRlQ29uZmlnICk7CisJCVRocmVhZC5zbGVlcCggMTAwMCApOworCQljLnVuc3Vic2NyaWJlQWxsKCk7CisJCQorCQlyZXR1cm4gYzsKKwl9CisJCisJcHJpdmF0ZSBZYW1sQ29uZmlnIHNldHVwVXBkYXRlKCBTdHJpbmcgdXBkYXRlQ29uZmlnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHNldHVwVXBkYXRlKCB1cGRhdGVDb25maWcsICIuIiApOworCX0KKwkKKwlwcml2YXRlIExpc3Q8Pz4gbGlzdCggT2JqZWN0IC4uLiBvYmpzICkKKwl7CisJCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCBvYmpzLmxlbmd0aCApOworCQlmb3IgKE9iamVjdCBvYmo6IG9ianMpCisJCQlsaXN0LmFkZCggb2JqICk7CisJCXJldHVybiBsaXN0OworCX0KKwkKKwlwcml2YXRlIE1hcDw/LCA/PiBtYXAoIE9iamVjdCAuLi4gb2JqcyApCisJeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigKKwkJCShvYmpzLmxlbmd0aCAqIDIgKyAyKSAvIDMgKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSArPSAyKQorCQkJbWFwLnB1dCggKFN0cmluZykgb2Jqc1tpXSwgb2Jqc1tpICsgMV0gKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisJCisJcHJpdmF0ZSBTZXQ8Pz4gc2V0KCBPYmplY3QgLi4uIG9ianMgKQorCXsKKwkJU2V0PE9iamVjdD4gc2V0ID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOworCQlmb3IgKE9iamVjdCBvOiBvYmpzKQorCQkJc2V0LmFkZCggbyApOworCQlyZXR1cm4gc2V0OworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUNvbmZpZ3VyYXRpb25DbGllbnQgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uQ2xpZW50CisJeworCQlwdWJsaWMgdm9pZCBjb25maWdWYWx1ZXNDaGFuZ2VkKCBPYmplY3RbXSB1cGRhdGVkICkKKwkJeworCQkJU2V0PE9iamVjdD4gY2hhbmdlZCA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKKwkJCWZvciAoT2JqZWN0IGlkOiB1cGRhdGVkKQorCQkJeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggImlkIGNoYW5nZWQ6ICIraWQgKTsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJwYXRoIGNoYW5nZWQ6ICIrc2VydmVyLmdldFBhdGgoIGlkICkgKTsKKwkJCQljaGFuZ2VkLmFkZCggaWQgKTsKKwkJCX0KKwkJCXRoaXMuY2hhbmdlZCA9IGNoYW5nZWQ7CisJCX0KKwkJCisJCXByaXZhdGUgU2V0PE9iamVjdD4gY2hhbmdlZCA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKKworCQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoIENvbmZpZ3VyYXRpb25TZXJ2ZXIgc2VydmVyICkKKwkJeworCQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCX0KKwkJCisJCXByaXZhdGUgQ29uZmlndXJhdGlvblNlcnZlciBzZXJ2ZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTAueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTU3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMC55bWwKQEAgLTAsMCArMSwxMCBAQAorIyBzdGFydGluZyBwb2ludCBmb3IgdXBkYXRlIHRlc3RzDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWVmYTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTEueW1sCkBAIC0wLDAgKzEsMTAgQEAKKyMgdXBkYXRlIGtleSB2YWx1ZSBpbiBtYXA6IHNjYWxhciAtPiBzY2FsYXINCitmb286IDMNCitiYXI6IDQNCithcnJheTogWzIsIDMsIDRdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxMC55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZGQ5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTAueW1sCkBAIC0wLDAgKzEsOSBAQAorIyByZW1vdmUgbGlzdCBrZXkgZnJvbSBtYXANCitmb286IDINCitiYXI6IDQNCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTExLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxMS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMjYwOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxMS55bWwKQEAgLTAsMCArMSwxMSBAQAorIyBhZGQgbWFwIGVsZW1lbnQgdG8gbGlzdA0KK2ZvbzogMg0KK2JhcjogNA0KK2FycmF5OiBbIDIsIDMsIDQgXQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIHsgZDogOCwgZTogOSwgZjogMTAgfQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTEyLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxMi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzOWJiYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxMi55bWwKQEAgLTAsMCArMSwxMSBAQAorIyBhZGQgbGlzdCBlbGVtZW50IHRvIGxpc3QNCitmb286IDINCitiYXI6IDQNCithcnJheTogWyAyLCAzLCA0IF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBbIDQsIDUsIDYgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTEzLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxMy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlMzM3NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxMy55bWwKQEAgLTAsMCArMSw5IEBACisjIHJlbW92ZSBtYXAgZWxlbWVudCBmcm9tIGxpc3QNCitmb286IDINCitiYXI6IDQNCithcnJheTogWyAyLCAzLCA0IF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTE0LnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxNC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1ZGRkOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxNC55bWwKQEAgLTAsMCArMSw5IEBACisjIHJlbW92ZSBsaXN0IGVsZW1lbnQgZnJvbSBsaXN0DQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxNS55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNmI1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTUueW1sCkBAIC0wLDAgKzEsMTAgQEAKKyMgdXBkYXRlIGtleSB2YWx1ZSBpbiBtYXA6IHNjYWxhciAtPiBtYXANCitmb286IDINCitiYXI6IHsgeDogNCwgeTogNSwgejogNiB9DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxNi55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTYueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzlhODUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTYueW1sCkBAIC0wLDAgKzEsMTAgQEAKKyMgdXBkYXRlIGtleSB2YWx1ZSBpbiBtYXA6IHNjYWxhciAtPiBsaXN0DQorZm9vOiAyDQorYmFyOiBbIDQsIDUsIDYgXQ0KK2FycmF5OiBbIDIsIDMsIDQgXQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIFsgMSwgMiwgMyBdDQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTcueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTE3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZhMzAzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTE3LnltbApAQCAtMCwwICsxLDEwIEBACisjIHVwZGF0ZSBrZXkgdmFsdWUgaW4gbWFwOiBtYXAgLT4gc2NhbGFyDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiAxNw0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxOC55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTgueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTM3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTgueW1sCkBAIC0wLDAgKzEsMTAgQEAKKyMgdXBkYXRlIGtleSB2YWx1ZSBpbiBtYXA6IG1hcCAtPiBtYXANCitmb286IDINCitiYXI6IDQNCithcnJheTogWyAyLCAzLCA0IF0NCittYXA6IHsgeDogOCwgeTogOSwgejogMTAgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUxOS55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTkueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1M2NjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMTkueW1sCkBAIC0wLDAgKzEsMTAgQEAKKyMgdXBkYXRlIGtleSB2YWx1ZSBpbiBtYXA6IG1hcCAtPiBsaXN0DQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiBbIDMsIDQsIDUgXQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY1NDMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIueW1sCkBAIC0wLDAgKzEsMTEgQEAKKyMgYWRkIHNjYWxhciBrZXkgdG8gbWFwDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsyLCAzLCA0XQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitiYXo6IDMNCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIFsgMSwgMiwgMyBdDQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjAueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIwLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJkOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIwLnltbApAQCAtMCwwICsxLDEwIEBACisjIHVwZGF0ZSBrZXkgdmFsdWUgaW4gbWFwOiBsaXN0IC0+IHNjYWxhcg0KK2ZvbzogMg0KK2JhcjogNA0KK2FycmF5OiAxNw0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIFsgMSwgMiwgMyBdDQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjEueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIxLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc5YmUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIxLnltbApAQCAtMCwwICsxLDEwIEBACisjIHVwZGF0ZSBrZXkgdmFsdWUgaW4gbWFwOiBsaXN0IC0+IG1hcA0KK2ZvbzogMg0KK2JhcjogNA0KK2FycmF5OiB7IGk6IDksIGo6IDggfQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIFsgMSwgMiwgMyBdDQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjIueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIyZDBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIyLnltbApAQCAtMCwwICsxLDEwIEBACisjIHVwZGF0ZSBrZXkgdmFsdWUgaW4gbWFwOiBsaXN0IC0+IGxpc3QNCitmb286IDINCitiYXI6IDQNCithcnJheTogWyA0LCA1LCA2IF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTIzLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyMy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ZGViZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyMy55bWwKQEAgLTAsMCArMSwxMCBAQAorIyB1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBzY2FsYXIgLT4gbWFwDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0geyB4OiA4LCB5OiA3LCB6OiA2IH0NCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjQueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWE0MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI0LnltbApAQCAtMCwwICsxLDEwIEBACisjIHVwZGF0ZSBlbGVtZW50IGluIGxpc3Q6IHNjYWxhciAtPiBsaXN0DQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gWyAyLCAzLCA0IF0NCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjUueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI1LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmUzYmYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI1LnltbApAQCAtMCwwICsxLDEwIEBACisjIHVwZGF0ZSBlbGVtZW50IGluIGxpc3Q6IG1hcCAtPiBzY2FsYXINCitmb286IDINCitiYXI6IDQNCithcnJheTogWyAyLCAzLCA0IF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSAyNQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI2LnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyNi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3Y2MyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyNi55bWwKQEAgLTAsMCArMSwxMCBAQAorIyB1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBtYXAgLT4gbWFwDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyB4OiA2LCB5OiA3LCB6OiA4IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyNy55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjcueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzJiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjcueW1sCkBAIC0wLDAgKzEsMTAgQEAKKyMgdXBkYXRlIGVsZW1lbnQgaW4gbGlzdDogbWFwIC0+IGxpc3QNCitmb286IDINCitiYXI6IDQNCithcnJheTogWyAyLCAzLCA0IF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSBbIDIsIDMsIDQgXQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI4LnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyOC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0ZjI1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUyOC55bWwKQEAgLTAsMCArMSwxMCBAQAorIyB1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBsaXN0IC0+IHNjYWxhcg0KK2ZvbzogMg0KK2JhcjogNA0KK2FycmF5OiBbIDIsIDMsIDQgXQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIDM0DQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlMjkueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQxNzNlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTI5LnltbApAQCAtMCwwICsxLDEwIEBACisjIHVwZGF0ZSBlbGVtZW50IGluIGxpc3Q6IGxpc3QgLT4gbWFwDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsgMiwgMywgNCBdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0geyB4OiA3LCB5OiA4LCB6OiA5IH0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUzLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ1ZTliCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTMueW1sCkBAIC0wLDAgKzEsOSBAQAorIyByZW1vdmUgc2NhbGFyIGtleSBmcm9tIG1hcA0KK2JhcjogNA0KK2FycmF5OiBbMiwgMywgNF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTMwLnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUzMC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjYTA4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGUzMC55bWwKQEAgLTAsMCArMSwxMCBAQAorIyB1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBsaXN0IC0+IGxpc3QNCitmb286IDINCitiYXI6IDQNCithcnJheTogWyAyLCAzLCA0IF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KKyAgLSBbIDIsIDMsIDQgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29uZmlnL3VwZGF0ZTQueW1sIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDMxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlNC55bWwKQEAgLTAsMCArMSwxMCBAQAorIyB1cGRhdGUgZWxlbWVudCBpbiBsaXN0OiBzY2FsYXIgLT4gc2NhbGFyDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsyLCAzLCA1XQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIFsgMSwgMiwgMyBdDQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlNS55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlNS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmODkyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGU1LnltbApAQCAtMCwwICsxLDEwIEBACisjIGFkZCBzY2FsYXIgZWxlbWVudCB0byBsaXN0DQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsyLCAzLCA0LCA1XQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIFsgMSwgMiwgMyBdDQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlNi55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlNi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3MTM3NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGU2LnltbApAQCAtMCwwICsxLDEwIEBACisjIHJlbW92ZSBzY2FsYXIgZWxlbWVudCBmcm9tIGxpc3QNCitmb286IDINCitiYXI6IDQNCithcnJheTogWzIsIDNdDQorbWFwOiB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGU3LnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGU3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFkZjgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTcueW1sCkBAIC0wLDAgKzEsMTEgQEAKKyMgYWRkIG1hcCBrZXkgdG8gbWFwDQorZm9vOiAyDQorYmFyOiA0DQorYXJyYXk6IFsyLCAzLCA0XQ0KK21hcDogeyBhOiA1LCBiOiA2LCBjOiA3IH0NCittYXAxOiB7IHg6IDYsIHk6IDcsIHo6IDggfQ0KK2xpc3Q6DQorICAtIGZpc2gNCisgIC0geyBhOiA1LCBiOiA2LCBjOiA3IH0NCisgIC0gWyAxLCAyLCAzIF0NCisgIC0gYmVhcg0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbmZpZy91cGRhdGU4LnltbCBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGU4LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY1ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY29uZmlnL3VwZGF0ZTgueW1sCkBAIC0wLDAgKzEsMTEgQEAKKyMgYWRkIGxpc3Qga2V5IHRvIG1hcA0KK2ZvbzogMg0KK2JhcjogNA0KK2FycmF5OiBbMiwgMywgNF0NCittYXA6IHsgYTogNSwgYjogNiwgYzogNyB9DQorYXJyYXkxOiBbMywgNCwgNV0NCitsaXN0Og0KKyAgLSBmaXNoDQorICAtIHsgYTogNSwgYjogNiwgYzogNyB9DQorICAtIFsgMSwgMiwgMyBdDQorICAtIGJlYXINCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb25maWcvdXBkYXRlOS55bWwgYi9zZXJ2aWNlcy9jb25maWcvdXBkYXRlOS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyYjgyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NvbmZpZy91cGRhdGU5LnltbApAQCAtMCwwICsxLDkgQEAKKyMgcmVtb3ZlIG1hcCBrZXkgZnJvbSBtYXANCitmb286IDINCitiYXI6IDQNCithcnJheTogWzIsIDMsIDRdDQorbGlzdDoNCisgIC0gZmlzaA0KKyAgLSB7IGE6IDUsIGI6IDYsIGM6IDcgfQ0KKyAgLSBbIDEsIDIsIDMgXQ0KKyAgLSBiZWFyDQpkaWZmIC0tZ2l0IGEvdGVzdHMvYnVpbGQueG1sIGIvdGVzdHMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNmFlODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9idWlsZC54bWwKQEAgLTAsMCArMSwyMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorIDwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgLS0+Cis8cHJvamVjdCBuYW1lPSJldGNoLXRlc3RzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIj4KKyAgICA8ZGVzY3JpcHRpb24+RnVuY3Rpb25hbCBUZXN0czwvZGVzY3JpcHRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9IkV0Y2guYmFzZWRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4iIC8+CisgICAgPGltcG9ydCBmaWxlPSIke0V0Y2guYmFzZWRpcn0vYnVpbGQtc3VwcG9ydC9ldGNoLmluY2x1ZGVzLnhtbCIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImhlbHAiPjxlY2hvPlBsZWFzZSBzZWxlY3QgYSB0YXJnZXQuLi48L2VjaG8+PC90YXJnZXQ+CisgICAgCisgICAgPCEtLSBpbXBvcnQgZXRjaCB0YXNrIC0tPgorICAgIDx0YXNrZGVmCisgICAgICAgIG9uZXJyb3I9InJlcG9ydCIKKyAgICAgICAgcmVzb3VyY2U9Im9yZy9hcGFjaGUvZXRjaC90b29scy9hbnQvZXRjaC54bWwiCisgICAgICAgIGNsYXNzcGF0aD0iJHtFdGNoLkhPTUV9L2xpYi8ke2V0Y2gtYW50LXRhc2suamFyfSIgLz4KKworICAgIDwhLS0gc2V0IHByb3BlcnRpZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS90YXJnZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJpbiIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2JpbiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkLXNvdXJjZXMiIGxvY2F0aW9uPSIke3RhcmdldH0vZ2VuZXJhdGVkLXNvdXJjZXMvIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiAgICAgICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS9jbGFzc2VzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LXJlc3VsdHMiICAgICAgbG9jYXRpb249IiR7dGFyZ2V0fS90ZXN0LXJlc3VsdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Im51bml0LXJlc3VsdHMiICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L251bml0LXJlc3VsdHMiIC8+CisKKyAgICA8IS0tIG1hY3JvcyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iZXRjaC10ZXN0Ij4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJob21lIiBkZWZhdWx0PSIke0V0Y2guSE9NRX0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmluZGluZyIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndoYXQiIGRlZmF1bHQ9ImJvdGgsIGludGYiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0RGlyIiBkZWZhdWx0PSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvQHtiaW5kaW5nfSIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZW1wbGF0ZU91dHB1dERpciIgZGVmYXVsdD0iJHtzcmN9L21haW4vQHtiaW5kaW5nfSIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZXRjaGVsZW1lbnRzIiBpbXBsaWNpdD0idHJ1ZSIgb3B0aW9uYWw9InRydWUiIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGV0Y2ggaG9tZT0iQHtob21lfSIgYmluZGluZz0iQHtiaW5kaW5nfSIgb3V0cHV0RGlyPSJAe291dHB1dERpcn0iIHdoYXQ9IkB7d2hhdH0iIGZpbGU9IkB7ZmlsZX0iID4KKyAgICAgICAgICAgICAgICA8ZXRjaGVsZW1lbnRzIC8+CisgICAgICAgICAgICA8L2V0Y2g+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIAorICAgIDxtYWNyb2RlZiBuYW1lPSJnZW5lcmF0ZS1zb3VyY2VzIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nIiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSBzb3VyY2VzIC0tPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQtc291cmNlc30vbWFpbi9ldGNoL0B7YmluZGluZ30iIC8+CisgICAgICAgICAgICA8ZXRjaC10ZXN0IGJpbmRpbmc9IkB7YmluZGluZ30iIGZpbGU9IiR7c3JjfS9tYWluL2V0Y2gvQXN5bmMuZXRjaCIgLz4KKyAgICAgICAgICAgIDxldGNoLXRlc3QgYmluZGluZz0iQHtiaW5kaW5nfSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9CYXIuZXRjaCIgLz4KKyAgICAgICAgICAgIDxldGNoLXRlc3QgYmluZGluZz0iQHtiaW5kaW5nfSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9CYXouZXRjaCIgLz4KKyAgICAgICAgICAgIDxldGNoLXRlc3QgYmluZGluZz0iQHtiaW5kaW5nfSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9CaWdJZGwuZXRjaCIgLz4KKyAgICAgICAgICAgIDxldGNoLXRlc3QgYmluZGluZz0iQHtiaW5kaW5nfSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9DbG9zaW5nLmV0Y2giIC8+CisgICAgICAgICAgICA8ZXRjaC10ZXN0IGJpbmRpbmc9IkB7YmluZGluZ30iIGZpbGU9IiR7c3JjfS9tYWluL2V0Y2gvQ3VhZS5ldGNoIiAvPgorICAgICAgICAgICAgPGV0Y2gtdGVzdCBiaW5kaW5nPSJAe2JpbmRpbmd9IiBmaWxlPSIke3NyY30vbWFpbi9ldGNoL0Zvby5ldGNoIiAvPgorICAgICAgICAgICAgPGV0Y2gtdGVzdCBiaW5kaW5nPSJAe2JpbmRpbmd9IiBmaWxlPSIke3NyY30vbWFpbi9ldGNoL0luaGVyaXRhbmNlLmV0Y2giIC8+CisgICAgICAgICAgICA8ZXRjaC10ZXN0IGJpbmRpbmc9IkB7YmluZGluZ30iIHdoYXQ9ImFsbCxmb3JjZSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9UZXN0MS5ldGNoIiAvPgorICAgICAgICAgICAgPGV0Y2gtdGVzdCBiaW5kaW5nPSJAe2JpbmRpbmd9IiBmaWxlPSIke3NyY30vbWFpbi9ldGNoL1Rlc3QyLmV0Y2giIC8+CisgICAgICAgICAgICA8ZXRjaC10ZXN0IGJpbmRpbmc9IkB7YmluZGluZ30iIGZpbGU9IiR7c3JjfS9tYWluL2V0Y2gvVGVzdDMuZXRjaCIgLz4KKyAgICAgICAgICAgIDxldGNoLXRlc3QgYmluZGluZz0iQHtiaW5kaW5nfSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9UZXN0NC5ldGNoIiAvPgorICAgICAgICAgICAgPGV0Y2gtdGVzdCBiaW5kaW5nPSJAe2JpbmRpbmd9IiBmaWxlPSIke3NyY30vbWFpbi9ldGNoL1Rlc3Q2LmV0Y2giIC8+CisgICAgICAgICAgICA8ZXRjaC10ZXN0IGJpbmRpbmc9IkB7YmluZGluZ30iIHdoYXQ9ImFsbCxmb3JjZSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9UZXN0SW5jbHVkZXMuZXRjaCIgLz4KKyAgICAgICAgICAgIDxldGNoLXRlc3QgYmluZGluZz0iQHtiaW5kaW5nfSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9UeXBlcy5ldGNoIiAvPgorICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gbmVnYXRpdmUgdGVzdHMgLS0+CisgICAgICAgICAgICA8IS0tIDxldGNoLXRlc3QgYmluZGluZz0iQHtiaW5kaW5nfSIgZmlsZT0iJHtzcmN9L21haW4vZXRjaC9UZXN0NS5ldGNoIiAvPiAtLT4KKyAgICAgICAgICAgIDwhLS0gPGV0Y2gtdGVzdCBiaW5kaW5nPSJAe2JpbmRpbmd9IiBmaWxlPSIke3NyY30vbWFpbi9ldGNoL1Rlc3RSZXNlcnZlZFdvcmRzLmV0Y2giIC8+IC0tPgorCisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIAorICAgIDwhLS0gaW5pdGlhbGl6ZSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiID4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Jpbn0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z2VuZXJhdGVkLXNvdXJjZXN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXN9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QtcmVzdWx0c30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7bnVuaXQtcmVzdWx0c30iIC8+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPCEtLSBidWlsZCB0aGUgc2VydmVyIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtamF2YSIgPgorICAgICAgICA8Z2VuZXJhdGUtc291cmNlcyBiaW5kaW5nPSJqYXZhIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS14bWwiID4KKyAgICAgICAgPGdlbmVyYXRlLXNvdXJjZXMgYmluZGluZz0ieG1sIiAvPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtY3NoYXJwIiA+CisgICAgICAgIDxnZW5lcmF0ZS1zb3VyY2VzIGJpbmRpbmc9ImNzaGFycCIgLz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQtc291cmNlcy1mb3ItY2xvdmVyIiBpZj0iQ2xvdmVyLmVuYWJsZWQiPgorICAgICAgICA8aW5pdGlhbGl6ZS1jbG92ZXIgc3VmZml4PSJldGNodGVzdHMiID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSIgPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtnZW5lcmF0ZWQtc291cmNlc30vbWFpbi9ldGNoL2phdmEiID4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKkJpZ0lkbCouamF2YSIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDx0ZXN0c291cmNlcyBkaXI9IiR7c3JjfS90ZXN0L2phdmEiID4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L3Rlc3Rzb3VyY2VzPgorICAgICAgICA8L2luaXRpYWxpemUtY2xvdmVyPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtamF2YSIgZGVwZW5kcz0iZ2VuZXJhdGUtamF2YSxpbml0LXNvdXJjZXMtZm9yLWNsb3ZlciI+CisgICAgICAgIDwhLS0gY29tcGlsZSBzb3VyY2VzIC0tPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXN9IiAvPgorICAgICAgICA8amF2YWMgdGFyZ2V0PSIxLjUiIGRlc3RkaXI9IiR7Y2xhc3Nlc30iPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke2dlbmVyYXRlZC1zb3VyY2VzfS9tYWluL2V0Y2gvamF2YSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9L21haW4vamF2YSIgLz4KKyAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9L3Rlc3QvamF2YSIgLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guSE9NRX0vbGliLyR7ZXRjaC1qYXZhLXJ1bnRpbWUuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5Lmp1bml0Lmphcn0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guSE9NRX0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiAvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvamF2YWM+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWphdmEiIGRlcGVuZHM9ImJ1aWxkLWphdmEiID4KKyAgICAgICAgPCEtLSBSdW4gVW5pdCBUZXN0cyAtLT4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyIgZGlyPSIke2NsYXNzZXN9IgorICAgICAgICAgICAgZXJyb3JQcm9wZXJ0eT0iYnVpbGQudGVzdHMuZmFpbCIgZmFpbHVyZVByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXN9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLkhPTUV9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLmphcn0iIC8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0V0Y2guZGVwZW5kZW5jeS5qdW5pdC5qYXJ9IiAvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtFdGNoLkhPTUV9L2xpYi8ke2V0Y2gtY29tcGlsZXIuamFyfSIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlbW92ZSBpZiBjbG92ZXIgbm90IGF2YWlsYWJsZSAtLT4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmNsb3Zlci5qYXJ9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InRydWUiIHRvZGlyPSIke3Rlc3QtcmVzdWx0c30iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L3Rlc3QvamF2YSI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiIC8+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gVE9ETyAgIGRlYnVnIFRlc3QqWG1sIGZhaWx1cmVzIC0tPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9UZXN0KlhtbC5qYXZhIiAvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY3NoYXJwIiBkZXBlbmRzPSJnZW5lcmF0ZS1jc2hhcnAsYnVpbGQtdGVzdHMtY3NoYXJwIgorICAgICAgICBpZj0iQlVJTEQuY3NoYXJwIiAvPgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdHMtY3NoYXJwIgorICAgICAgICBkZXBlbmRzPSJidWlsZC10ZXN0cy1jc2hhcnAtZG90bmV0LGJ1aWxkLXRlc3RzLWNzaGFycC1tb25vIiAvPgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdHMtY3NoYXJwLWRvdG5ldCIgaWY9IlVTRS5kb3RuZXQiID4KKyAgICAgICAgPG1zYnVpbGQgYnVpbGRmaWxlPSIke3NyY30vdGVzdC9jc2hhcnAvVGVzdHNQcm9qL1Rlc3RzUHJvai5jc3Byb2oiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IkNvbmZpZ3VyYXRpb24iIHZhbHVlPSIke0V0Y2guYnVpbGQudGFyZ2V0fSIgLz4KKyAgICAgICAgPC9tc2J1aWxkPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdHMtY3NoYXJwLW1vbm8iIGlmPSJVU0UubW9ubyIgPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJUT0RPOiBidWlsZCB3LyBtb25vIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNzaGFycCIgZGVwZW5kcz0iYnVpbGQtY3NoYXJwIiBpZj0iQlVJTEQuY3NoYXJwIiA+CisgICAgICAgIDxta2RpciBkaXI9IiR7bnVuaXQtcmVzdWx0c30iIC8+CisKKyAgICAgICAgPG51bml0IHhtbG91dD0iJHtudW5pdC1yZXN1bHRzfS9OVW5pdFJlc3VsdHMueG1sIj4KKyAgICAgICAgICAgIDx0ZXN0YXNzZW1ibHkgbmFtZT0iJHtzcmN9L3Rlc3QvY3NoYXJwL1Rlc3RzUHJvai9iaW4vJHtFdGNoLmJ1aWxkLnRhcmdldH0vVGVzdHMuZGxsIiAvPgorICAgICAgICA8L251bml0PgorCisgICAgICAgIDx4c2x0IHN0eWxlPSIke0V0Y2guYnVpbGRTdXBwb3J0RGlyZWN0b3J5fS9OVW5pdFRvSlVuaXQueHNsIgorICAgICAgICAgICAgICAgIGluPSIke251bml0LXJlc3VsdHN9L05Vbml0UmVzdWx0cy54bWwiIG91dD0iJHt0ZXN0LXJlc3VsdHN9L1RFU1QtTlVuaXRSZXN1bHRzLnhtbCIgLz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXhtbCIgZGVwZW5kcz0iZ2VuZXJhdGUteG1sIiA+CisgICAgCisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXhtbCIgZGVwZW5kcz0iYnVpbGQteG1sIiA+CisgICAgCisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPCEtLSBidWlsZCBzb3VyY2VzIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImluaXQsYnVpbGQtamF2YSxidWlsZC1jc2hhcnAsYnVpbGQteG1sIiAvPgorCisgICAgPCEtLSBydW4gdW5pdCB0ZXN0cyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImJ1aWxkLHRlc3QtamF2YSx0ZXN0LWNzaGFycCx0ZXN0LXhtbCIgLz4KKyAgICAgICAgCisgICAgPCEtLSBjbGVhbiAtLT4gICAgCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzcmN9L3Rlc3QvY3NoYXJwL1Rlc3RzUHJvai9vYmoiIC8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3NyY30vdGVzdC9jc2hhcnAvVGVzdHNQcm9qL2JpbiIgLz4KKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbEFzeW5jQ2xpZW50LmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbEFzeW5jQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZjMwN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsQXN5bmNDbGllbnQuY3MKQEAgLTAsMCArMSw3NyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciBBc3luY0NsaWVudC4KKyAqLworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKworCXB1YmxpYyBjbGFzcyBJbXBsQXN5bmNDbGllbnQgOiBCYXNlQXN5bmNDbGllbnQKKwl7CisKKwkJLy8vIAorCQkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgSW1wbEFzeW5jQ2xpZW50Ljwvc3VtbWFyeT4KKwkJLy8vCisgCQkvLy8gPHBhcmFtIG5hbWU9c2VydmVyPjwvcGFyYW0+CisgCQkvLy8KKwkJcHVibGljIEltcGxBc3luY0NsaWVudChSZW1vdGVBc3luY1NlcnZlciBzZXJ2ZXIgKQorCQl7CisJCSAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9zeW5jID0gbXlfc3luYzsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9hc3luY19mcmVlID0gbXlfYXN5bmNfZnJlZTsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9hc3luY19xdWV1ZWQgPSBteV9hc3luY19xdWV1ZWQ7CisKKwkJfQorCisJICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlQXN5bmNTZXJ2ZXIgc2VydmVyOworCisgICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+QmVnaW5zIHRoZSBjYWxsIHRvIHN5bmMuPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIGludD8gbXlfc3luYygKKyAgICAgICAgICAgICAgICBpbnQ/IGNvdW50CisgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCA+IDAgPyBzZXJ2ZXIuc3luYyhjb3VudCAtIDEpICsgMSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c3VtbWFyeT5CZWdpbnMgdGhlIGNhbGwgdG8gYXN5bmNfcXVldWVkLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBpbnQ/IG15X2FzeW5jX3F1ZXVlZCgKKyAgICAgICAgICAgICAgICBpbnQ/IGNvdW50CisgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCA+IDAgPyBzZXJ2ZXIuYXN5bmNfcXVldWVkKGNvdW50IC0gMSkgKyAxIDogMDsKKyAgICAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBhc3luY19mcmVlLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBpbnQ/IG15X2FzeW5jX2ZyZWUoCisgICAgICAgICAgICAgICAgaW50PyBjb3VudAorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY291bnQgPiAwID8gc2VydmVyLmFzeW5jX2ZyZWUoY291bnQgLSAxKSArIDEgOiAwOworICAgICAgICB9CisKKwkJCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxBc3luY1NlcnZlci5jcyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxBc3luY1NlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhkODU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbEFzeW5jU2VydmVyLmNzCkBAIC0wLDAgKzEsNzggQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworLyoqCisgKiBDYWxsIHRvIG1lc3NhZ2UgdHJhbnNsYXRvciBmb3IgQXN5bmNTZXJ2ZXIuCisgKi8KK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisKKwlwdWJsaWMgY2xhc3MgSW1wbEFzeW5jU2VydmVyIDogQmFzZUFzeW5jU2VydmVyCisJeworCisJCS8vLyAKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxBc3luY1NlcnZlci48L3N1bW1hcnk+CisJCS8vLworIAkJLy8vIDxwYXJhbSBuYW1lPWNsaWVudD48L3BhcmFtPgorIAkJLy8vCisJCXB1YmxpYyBJbXBsQXN5bmNTZXJ2ZXIoUmVtb3RlQXN5bmNDbGllbnQgY2xpZW50ICkKKwkJeworCQkgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICBfZGVsZWdhdGVfYXN5bmNfZnJlZSA9IG15X2FzeW5jX2ZyZWU7CisgICAgICAgICAgICBfZGVsZWdhdGVfYXN5bmNfcXVldWVkID0gbXlfYXN5bmNfcXVldWVkOworICAgICAgICAgICAgX2RlbGVnYXRlX3N5bmMgPSBteV9zeW5jOyAgICAgIAorCQl9CisKKwkgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVBc3luY0NsaWVudCBjbGllbnQ7CisKKworICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBzeW5jLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBpbnQ/IG15X3N5bmMoCisgICAgICAgICAgICAgICAgaW50PyBjb3VudAorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY291bnQgPiAwID8gY2xpZW50LnN5bmMoY291bnQgLSAxKSArIDEgOiAwOworICAgICAgICB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+QmVnaW5zIHRoZSBjYWxsIHRvIGFzeW5jX3F1ZXVlZC48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgaW50PyBteV9hc3luY19xdWV1ZWQoCisgICAgICAgICAgICAgICAgaW50PyBjb3VudAorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY291bnQgPiAwID8gY2xpZW50LmFzeW5jX3F1ZXVlZChjb3VudCAtIDEpICsgMSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c3VtbWFyeT5CZWdpbnMgdGhlIGNhbGwgdG8gYXN5bmNfZnJlZS48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgaW50PyBteV9hc3luY19mcmVlKAorICAgICAgICAgICAgICAgIGludD8gY291bnQKKyAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50ID4gMCA/IGNsaWVudC5hc3luY19mcmVlKGNvdW50IC0gMSkgKyAxIDogMDsKKyAgICAgICAgfQorCisJCQorCQkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbENsb3NpbmdDbGllbnQuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsQ2xvc2luZ0NsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWYxNWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbENsb3NpbmdDbGllbnQuY3MKQEAgLTAsMCArMSw1NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciBDbG9zaW5nQ2xpZW50LgorICovCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisJcHVibGljIGNsYXNzIEltcGxDbG9zaW5nQ2xpZW50IDogQmFzZUNsb3NpbmdDbGllbnQsIE9ialNlc3Npb24KKwl7CisKKwkJLy8vIAorCQkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgSW1wbENsb3NpbmdDbGllbnQuPC9zdW1tYXJ5PgorCQkvLy8KKyAJCS8vLyA8cGFyYW0gbmFtZT1zZXJ2ZXI+PC9wYXJhbT4KKyAJCS8vLworCQlwdWJsaWMgSW1wbENsb3NpbmdDbGllbnQoUmVtb3RlQ2xvc2luZ1NlcnZlciBzZXJ2ZXIgKQorCQl7CisJCSAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKKwkJfQorCisJICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlQ2xvc2luZ1NlcnZlciBzZXJ2ZXI7CisKKyAgICAgIAorCisgICAgICAgIHB1YmxpYyBuZXcgdm9pZCBfU2Vzc2lvbk5vdGlmeShPYmplY3QgZXZlbnRPYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbXBsQ2xvc2luZ0NsaWVudC5fc2Vzc2lvbk5vdGlmeSIgKyBldmVudE9iaik7CisgICAgICAgIH0KKworCQkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbENsb3NpbmdTZXJ2ZXIuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsQ2xvc2luZ1NlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZlN2VjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbENsb3NpbmdTZXJ2ZXIuY3MKQEAgLTAsMCArMSw2NSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciBDbG9zaW5nU2VydmVyLgorICovCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisJcHVibGljIGNsYXNzIEltcGxDbG9zaW5nU2VydmVyIDogQmFzZUNsb3NpbmdTZXJ2ZXIsT2JqU2Vzc2lvbgorCXsKKworCQkvLy8gCisJCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJbXBsQ2xvc2luZ1NlcnZlci48L3N1bW1hcnk+CisJCS8vLworIAkJLy8vIDxwYXJhbSBuYW1lPWNsaWVudD48L3BhcmFtPgorIAkJLy8vCisJCXB1YmxpYyBJbXBsQ2xvc2luZ1NlcnZlcihSZW1vdGVDbG9zaW5nQ2xpZW50IGNsaWVudCApCisJCXsKKwkJICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgX2RlbGVnYXRlX2Nsb3NlID0gTXljbG9zZTsKKworCQl9CisKKwkgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDbG9zaW5nQ2xpZW50IGNsaWVudDsKKworICAgICAgICBwdWJsaWMgdm9pZCBNeWNsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkltcGxDbG9zaW5nU2VydmVyLnNheWluZ1N0b3BUb0NsaWVudCIpOworICAgICAgICAgICAgY2xpZW50Ll9UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QLCBudWxsKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkltcGxDbG9zaW5nU2VydmVyLnNhaWRTdG9wVG9DbGllbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgCisKKyAgICAgICAgcHVibGljIG5ldyB2b2lkIF9TZXNzaW9uTm90aWZ5KE9iamVjdCBldmVudE9iaikKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkltcGxDbG9zaW5nU2VydmVyIF9zZXNzaW9uTm90aWZ5IiArIGV2ZW50T2JqKTsKKyAgICAgICAgfQorCisJCQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsQ3VhZUNsaWVudC5jcyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxDdWFlQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjlmNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsQ3VhZUNsaWVudC5jcwpAQCAtMCwwICsxLDYwIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuQ3VhZTsKKworLyoqCisgKiBDYWxsIHRvIG1lc3NhZ2UgdHJhbnNsYXRvciBmb3IgQ3VhZUNsaWVudC4KKyAqLworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKworCXB1YmxpYyBjbGFzcyBJbXBsQ3VhZUNsaWVudCA6IEJhc2VDdWFlQ2xpZW50CisJeworCisJCS8vLyAKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxDdWFlQ2xpZW50Ljwvc3VtbWFyeT4KKwkJLy8vCisgCQkvLy8gPHBhcmFtIG5hbWU9c2VydmVyPjwvcGFyYW0+CisgCQkvLy8KKwkJcHVibGljIEltcGxDdWFlQ2xpZW50KFJlbW90ZUN1YWVTZXJ2ZXIgc2VydmVyICkKKwkJeworCQkgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgICAgICBfZGVsZWdhdGVfZG9pdDIgPSBNeWRvaXQyOworCQl9CisKKwkgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDdWFlU2VydmVyIHNlcnZlcjsKKworICAgICAgICBwdWJsaWMgUmVzcG9uc2UgTXlkb2l0MigKKyAgICAgICAgUmVxdWVzdCByZXEKKyAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludD8gcmVxTm8gPSByZXEuR2V0Q29kZSgpOworICAgICAgICAgICAgc3dpdGNoIChyZXFOby5HZXRWYWx1ZU9yRGVmYXVsdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIG5ldyBSZXNwb25zZSgiYXBwbGUiKTsKKyAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gbmV3IFJlc3BXaXRoQ29kZSgiYmFuYW5hIiwgMzcpOworICAgICAgICAgICAgICAgIGNhc2UgOTk6IHJldHVybiBuZXcgUmVzcG9uc2UoInBydW5lIik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG5ldyBSZXNwV2l0aENvZGUoIm1lIHB1dHogIiArIHJlcS5jb2RlICsgIiBpbiB0ZWggYnVra2l0IiwgMTAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbEN1YWVTZXJ2ZXIuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsQ3VhZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJiY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbEN1YWVTZXJ2ZXIuY3MKQEAgLTAsMCArMSw0NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciBDdWFlU2VydmVyLgorICovCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisJcHVibGljIGNsYXNzIEltcGxDdWFlU2VydmVyIDogQmFzZUN1YWVTZXJ2ZXIKKwl7CisKKwkJLy8vIAorCQkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgSW1wbEN1YWVTZXJ2ZXIuPC9zdW1tYXJ5PgorCQkvLy8KKyAJCS8vLyA8cGFyYW0gbmFtZT1jbGllbnQ+PC9wYXJhbT4KKyAJCS8vLworCQlwdWJsaWMgSW1wbEN1YWVTZXJ2ZXIoUmVtb3RlQ3VhZUNsaWVudCBjbGllbnQgKSA6IGJhc2UoKQorCQl7CisJCQorCQl9CisJCisJCS8vIEltcGxlbWVudCBkZWxlZ2F0ZXMgb3IgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBjbGllbnQKKwkJCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxGb29DbGllbnQuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsRm9vQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YzQ0MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsRm9vQ2xpZW50LmNzCkBAIC0wLDAgKzEsNDYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworLyoqCisgKiBDYWxsIHRvIG1lc3NhZ2UgdHJhbnNsYXRvciBmb3IgRm9vQ2xpZW50LgorICovCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisJcHVibGljIGNsYXNzIEltcGxGb29DbGllbnQgOiBCYXNlRm9vQ2xpZW50CisJeworCisJCS8vLyAKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxGb29DbGllbnQuPC9zdW1tYXJ5PgorCQkvLy8KKyAJCS8vLyA8cGFyYW0gbmFtZT1zZXJ2ZXI+PC9wYXJhbT4KKyAJCS8vLworCQlwdWJsaWMgSW1wbEZvb0NsaWVudChSZW1vdGVGb29TZXJ2ZXIgc2VydmVyICkKKwkJeworCQkgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCX0KKworCSAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUZvb1NlcnZlciBzZXJ2ZXI7CisJCisJCS8vIEltcGxlbWVudCBkZWxlZ2F0ZXMgb3IgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBzZXJ2ZXIKKwkJCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxGb29TZXJ2ZXIuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsRm9vU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDk1NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsRm9vU2VydmVyLmNzCkBAIC0wLDAgKzEsMTEyIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuQmFyOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLnR5cGVzLkJhejsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy50eXBlcy5Gb287CisKKy8qKgorICogQ2FsbCB0byBtZXNzYWdlIHRyYW5zbGF0b3IgZm9yIEZvb1NlcnZlci4KKyAqLworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKworCXB1YmxpYyBjbGFzcyBJbXBsRm9vU2VydmVyIDogQmFzZUZvb1NlcnZlcgorCXsKKworCQkvLy8gCisJCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJbXBsRm9vU2VydmVyLjwvc3VtbWFyeT4KKwkJLy8vCisgCQkvLy8gPHBhcmFtIG5hbWU9Y2xpZW50PjwvcGFyYW0+CisgCQkvLy8KKwkJcHVibGljIEltcGxGb29TZXJ2ZXIoUmVtb3RlRm9vQ2xpZW50IGNsaWVudCApCisJCXsKKwkJICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgX2RlbGVnYXRlX2ZvbzEgPSBNeWZvbzE7CisgICAgICAgICAgICBfZGVsZWdhdGVfZm9vMiA9IE15Zm9vMjsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9iYXIxID0gTXliYXIxOworICAgICAgICAgICAgX2RlbGVnYXRlX2JhcjIgPSBNeWJhcjI7CisgICAgICAgICAgICBfZGVsZWdhdGVfYmF6MSA9IE15YmF6MTsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9iYXoyID0gTXliYXoyOworCQl9CisKKwkgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVGb29DbGllbnQgY2xpZW50OworCisgICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+QmVnaW5zIHRoZSBjYWxsIHRvIGZvbzEuPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIGJvb2w/IE15Zm9vMSgKKyAgICAgICAgICAgICAgICBGb29EYXRhIGZvb0RhdGEKKyAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZm9vMSBjYWxsZWQgd2l0aCAiICsgZm9vRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBmb28yLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBib29sPyBNeWZvbzIoCisgICAgICAgICAgICAgICAgRm9vRGF0YSBmb29EYXRhCisgICAgICAgICAgICApCisgICAgICAgIHsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImZvbzIgY2FsbGVkIHdpdGggIiArIGZvb0RhdGEpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKworCisgICAgICAgIHB1YmxpYyBib29sPyBNeWJhejEoCisgICAgICAgICAgIEJhekRhdGEgYmF6RGF0YQorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJiYXoxIGNhbGxlZCB3aXRoICIgKyBiYXpEYXRhKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2w/IE15YmF6MigKKyAgICAgICAgICAgQmF6RGF0YSBiYXpEYXRhCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImJhejIgY2FsbGVkIHdpdGggIiArIGJhekRhdGEpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgYm9vbD8gTXliYXIxKAorICAgICAgICAgICAgQmFyRGF0YSBiYXJEYXRhCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImJhcjEgY2FsbGVkIHdpdGggIiArIGJhckRhdGEpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbD8gTXliYXIyKAorICAgICAgICAgICAgQmFyRGF0YSBiYXJEYXRhCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImJhcjIgY2FsbGVkIHdpdGggIiArIGJhckRhdGEpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisJCQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsSW5oZXJpdGFuY2VDbGllbnQuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsSW5oZXJpdGFuY2VDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlZTBjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxJbmhlcml0YW5jZUNsaWVudC5jcwpAQCAtMCwwICsxLDQ2IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKKy8qKgorICogQ2FsbCB0byBtZXNzYWdlIHRyYW5zbGF0b3IgZm9yIEluaGVyaXRhbmNlQ2xpZW50LgorICovCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisJcHVibGljIGNsYXNzIEltcGxJbmhlcml0YW5jZUNsaWVudCA6IEJhc2VJbmhlcml0YW5jZUNsaWVudAorCXsKKworCQkvLy8gCisJCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJbXBsSW5oZXJpdGFuY2VDbGllbnQuPC9zdW1tYXJ5PgorCQkvLy8KKyAJCS8vLyA8cGFyYW0gbmFtZT1zZXJ2ZXI+PC9wYXJhbT4KKyAJCS8vLworCQlwdWJsaWMgSW1wbEluaGVyaXRhbmNlQ2xpZW50KFJlbW90ZUluaGVyaXRhbmNlU2VydmVyIHNlcnZlciApCisJCXsKKwkJICAgIHRoaXMuc2VydmVyID0gc2VydmVyOworCQl9CisKKwkgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVJbmhlcml0YW5jZVNlcnZlciBzZXJ2ZXI7CisJCisJCS8vIEltcGxlbWVudCBkZWxlZ2F0ZXMgb3IgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBzZXJ2ZXIKKwkJCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxJbmhlcml0YW5jZVNlcnZlci5jcyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL0ltcGxJbmhlcml0YW5jZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzZjOTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbEluaGVyaXRhbmNlU2VydmVyLmNzCkBAIC0wLDAgKzEsMTI4IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuSW5oZXJpdGFuY2U7CisKKy8qKgorICogQ2FsbCB0byBtZXNzYWdlIHRyYW5zbGF0b3IgZm9yIEluaGVyaXRhbmNlU2VydmVyLgorICovCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisJcHVibGljIGNsYXNzIEltcGxJbmhlcml0YW5jZVNlcnZlciA6IEJhc2VJbmhlcml0YW5jZVNlcnZlcgorCXsKKworCQkvLy8gCisJCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBJbXBsSW5oZXJpdGFuY2VTZXJ2ZXIuPC9zdW1tYXJ5PgorCQkvLy8KKyAJCS8vLyA8cGFyYW0gbmFtZT1jbGllbnQ+PC9wYXJhbT4KKyAJCS8vLworCQlwdWJsaWMgSW1wbEluaGVyaXRhbmNlU2VydmVyKFJlbW90ZUluaGVyaXRhbmNlQ2xpZW50IGNsaWVudCApCisJCXsKKwkJICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgX2RlbGVnYXRlX2YxID0gTXlmMTsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9mMiA9IE15ZjI7CisgICAgICAgICAgICBfZGVsZWdhdGVfZjMgPSBNeWYzOworICAgICAgICAgICAgX2RlbGVnYXRlX2Y0ID0gTXlmNDsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9mNSA9IE15ZjU7CisgICAgICAgICAgICBfZGVsZWdhdGVfZjYgPSBNeWY2OworICAgICAgICAgICAgX2RlbGVnYXRlX2Y3ID0gTXlmNzsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV9mOCA9IE15Zjg7CisJCX0KKworCSAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUluaGVyaXRhbmNlQ2xpZW50IGNsaWVudDsKKwkKKwkJLy8gSW1wbGVtZW50IGRlbGVnYXRlcyBvciBwcm92aWRlIGltcGxlbWVudGF0aW9uIG9mIGNsaWVudAorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBmMS48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgT2JqZWN0IE15ZjEoCisgICAgICAgICAgICAgICAgT2JqZWN0IHYKKyAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c3VtbWFyeT5CZWdpbnMgdGhlIGNhbGwgdG8gZjIuPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIFMxIE15ZjIoCisgICAgICAgICAgICAgICAgUzEgdgorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBmMy48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgUzIgTXlmMygKKyAgICAgICAgICAgICAgICBTMiB2CisgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+QmVnaW5zIHRoZSBjYWxsIHRvIGY0Ljwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBTMyBNeWY0KAorICAgICAgICAgICAgICAgIFMzIHYKKyAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c3VtbWFyeT5CZWdpbnMgdGhlIGNhbGwgdG8gZjUuPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIE9iamVjdFtdIE15ZjUoCisgICAgICAgICAgICAgICAgT2JqZWN0W10gdgorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBmNi48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgUzFbXSBNeWY2KAorICAgICAgICAgICAgICAgIFMxW10gdgorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBmNy48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgUzJbXSBNeWY3KAorICAgICAgICAgICAgICAgIFMyW10gdgorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkJlZ2lucyB0aGUgY2FsbCB0byBmOC48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgUzNbXSBNeWY4KAorICAgICAgICAgICAgICAgIFMzW10gdgorICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCQkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbFR5cGVzQ2xpZW50LmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbFR5cGVzQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjhmM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsVHlwZXNDbGllbnQuY3MKQEAgLTAsMCArMSw0NiBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciBUeXBlc0NsaWVudC4KKyAqLworbmFtZXNwYWNlIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLnR5cGVzCit7CisKKwlwdWJsaWMgY2xhc3MgSW1wbFR5cGVzQ2xpZW50IDogQmFzZVR5cGVzQ2xpZW50CisJeworCisJCS8vLyAKKwkJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxUeXBlc0NsaWVudC48L3N1bW1hcnk+CisJCS8vLworIAkJLy8vIDxwYXJhbSBuYW1lPXNlcnZlcj48L3BhcmFtPgorIAkJLy8vCisJCXB1YmxpYyBJbXBsVHlwZXNDbGllbnQoUmVtb3RlVHlwZXNTZXJ2ZXIgc2VydmVyICkKKwkJeworCQkgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJCX0KKworCSAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZVR5cGVzU2VydmVyIHNlcnZlcjsKKwkKKwkJLy8gSW1wbGVtZW50IGRlbGVnYXRlcyBvciBwcm92aWRlIGltcGxlbWVudGF0aW9uIG9mIHNlcnZlcgorCQkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbFR5cGVzU2VydmVyLmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvSW1wbFR5cGVzU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZDkxNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9JbXBsVHlwZXNTZXJ2ZXIuY3MKQEAgLTAsMCArMSw4NyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciBUeXBlc1NlcnZlci4KKyAqLworbmFtZXNwYWNlIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLnR5cGVzCit7CisKKyAgICBwdWJsaWMgY2xhc3MgSW1wbFR5cGVzU2VydmVyIDogQmFzZVR5cGVzU2VydmVyCisgICAgeworCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIEltcGxUeXBlc1NlcnZlci48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Y2xpZW50PjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgSW1wbFR5cGVzU2VydmVyKFJlbW90ZVR5cGVzQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICBfZGVsZWdhdGVfdGVzdDEgPSBUZXN0TWFwOworICAgICAgICAgICAgX2RlbGVnYXRlX3Rlc3QyID0gVGVzdFNldDsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZV90ZXN0MyA9IFRlc3RMaXN0OworICAgICAgICAgICAgX2RlbGVnYXRlX3Rlc3Q0ID0gVGVzdERhdGVUaW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVUeXBlc0NsaWVudCBjbGllbnQ7CisKKyAgICAgICAgLy8gSW1wbGVtZW50IGRlbGVnYXRlcyBvciBwcm92aWRlIGltcGxlbWVudGF0aW9uIG9mIGNsaWVudAorCisgICAgICAgIHB1YmxpYyBTeXN0ZW0uQ29sbGVjdGlvbnMuSURpY3Rpb25hcnkgVGVzdE1hcChTeXN0ZW0uQ29sbGVjdGlvbnMuSURpY3Rpb25hcnkgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibWFwID0gIiArIG1hcCk7CisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qga2V5IGluIG1hcC5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IChzdHJpbmcpbWFwW2tleV07CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiBUaGUga2V5IGlzIHswfSBhbmQgdmFsdWUgaXMgezF9Iiwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN5c3RlbS5Db2xsZWN0aW9ucy5JTGlzdCBUZXN0TGlzdChTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxpc3QgPSAiICsgbGlzdCk7CisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qga2V5IGluIGxpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiBUaGUgdmFsdWUgaW4gbGlzdCBpcyB7MH0iLCBrZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3lzdGVtLkRhdGVUaW1lPyBUZXN0RGF0ZVRpbWUoU3lzdGVtLkRhdGVUaW1lPyBkYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRGF0ZVRpbWUgPSAiICsgZGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gZGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlIFRlc3RTZXQoU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZSB0YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IGtleSBpbiB0YWJsZS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgVGhlIHZhbHVlIGluIHNldCBpcyB7MH0iLCBrZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkFzeW5jQ2xpZW50LmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkFzeW5jQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MmNmOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluQXN5bmNDbGllbnQuY3MKQEAgLTAsMCArMSw3MyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisvLy8KKy8vLzxzdW1tYXJ5PiBNYWluIGltcGxlbWVudGF0aW9uIGZvciBBc3luY0NsaWVudC4gPC9zdW1tYXJ5PgorLy8vCitwdWJsaWMgY2xhc3MgTWFpbkFzeW5jQ2xpZW50IDogQXN5bmNIZWxwZXIuQXN5bmNDbGllbnRGYWN0b3J5Cit7CisJLy8vCisJLy8vIDxzdW1tYXJ5Pk1haW4gZm9yIEFzeW5jQ2xpZW50PC9zdW1tYXJ5PgorCS8vLyA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4KKwkvLy8KKwlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihTdHJpbmdbXSBhcmdzKQorCXsKKwkJc3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMSI7CisJCWlmIChhcmdzLkxlbmd0aCA+IDApCisJCQl1cmkgPSBhcmdzWzBdOworCisJCU1haW5Bc3luY0NsaWVudCBpbXBsRmFjdG9yeSA9IG5ldyBNYWluQXN5bmNDbGllbnQoKTsKKwkJUmVtb3RlQXN5bmNTZXJ2ZXIgc2VydmVyID0gQXN5bmNIZWxwZXIuTmV3U2VydmVyKCB1cmksIG51bGwsIGltcGxGYWN0b3J5ICk7CisJCQorCQlzZXJ2ZXIuX1RyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisKKwkJLy8gSW5zZXJ0IFlvdXIgQ29kZSBIZXJlCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJc2VydmVyLl9UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDAgKTsKKworCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBNYWluQXN5bmNDbGllbnQuPC9zdW1tYXJ5PgorCS8vLworCXB1YmxpYyBNYWluQXN5bmNDbGllbnQoKQorCXsKKwkJLy8gTm90aGluZyB0byBkby4KKwl9CisKKwkvLy8KKwkvLy8gPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIEFzeW5jQ2xpZW50Ljwvc3VtbWFyeT4KKwkvLy8gQHBhcmFtIHNlcnZlcgorCS8vLworCXB1YmxpYyBBc3luY0NsaWVudCBOZXdBc3luY0NsaWVudCggUmVtb3RlQXN5bmNTZXJ2ZXIgc2VydmVyICkKKwl7CisJCXJldHVybiBuZXcgSW1wbEFzeW5jQ2xpZW50KCBzZXJ2ZXIgKTsKKwl9CisKK30KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5Bc3luY0xpc3RlbmVyLmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkFzeW5jTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxYzNkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5Bc3luY0xpc3RlbmVyLmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKworLy8vCisvLy88c3VtbWFyeT4gTWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgQXN5bmNMaXN0ZW5lci4gPC9zdW1tYXJ5PgorLy8vCitwdWJsaWMgY2xhc3MgTWFpbkFzeW5jTGlzdGVuZXIgOiBBc3luY0hlbHBlci5Bc3luY1NlcnZlckZhY3RvcnkKK3sKKwkvLy8KKyAJLy8vIDxzdW1tYXJ5Pk1haW4gZm9yIEFzeW5jTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLyA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4KKwkvLy8KKwlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihTdHJpbmdbXSBhcmdzKQorCXsKKwkJc3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMSI7CisJCWlmIChhcmdzLkxlbmd0aCA+IDApCisJCQl1cmkgPSBhcmdzWzBdOworCisJCU1haW5Bc3luY0xpc3RlbmVyIGltcGxGYWN0b3J5ID0gbmV3IE1haW5Bc3luY0xpc3RlbmVyKCk7CisgICAgICAgIFNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBBc3luY0hlbHBlci5OZXdMaXN0ZW5lcih1cmksIG51bGwsIGltcGxGYWN0b3J5KTsKKworCQlsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwl9CisKKwkvLy8KKwkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgTWFpbkFzeW5jTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLworCXB1YmxpYyBNYWluQXN5bmNMaXN0ZW5lcigpCisJeworCQkvLyBOb3RoaW5nIHRvIGRvLgorCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgQXN5bmNTZXJ2ZXIuPC9zdW1tYXJ5PgorCS8vLyBAcGFyYW0gY2xpZW50CisJLy8vCisJcHVibGljIEFzeW5jU2VydmVyIE5ld0FzeW5jU2VydmVyKCBSZW1vdGVBc3luY0NsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsQXN5bmNTZXJ2ZXIoIGNsaWVudCApOworCX0KK30KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5DbG9zaW5nQ2xpZW50LmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkNsb3NpbmdDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1ZGVkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5DbG9zaW5nQ2xpZW50LmNzCkBAIC0wLDAgKzEsOTAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBldGNoLnRlc3RzOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCituYW1lc3BhY2UgZXRjaC5iaW5kaW5ncy5jc2hhcnAuZXhhbXBsZXMuY2xvc2luZworeworCisvLy8KKy8vLzxzdW1tYXJ5PiBNYWluIGltcGxlbWVudGF0aW9uIGZvciBDbG9zaW5nQ2xpZW50LiA8L3N1bW1hcnk+CisvLy8KK3B1YmxpYyBjbGFzcyBNYWluQ2xvc2luZ0NsaWVudCA6IENsb3NpbmdIZWxwZXIuQ2xvc2luZ0NsaWVudEZhY3RvcnkKK3sKKwkvLy8KKwkvLy8gPHN1bW1hcnk+TWFpbiBmb3IgQ2xvc2luZ0NsaWVudDwvc3VtbWFyeT4KKwkvLy8gPHBhcmFtIG5hbWU9ImFyZ3MiPjwvcGFyYW0+CisJLy8vCisJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oU3RyaW5nW10gYXJncykKKwl7CisJCXN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQlpZiAoYXJncy5MZW5ndGggPiAwKQorCQkJdXJpID0gYXJnc1swXTsKKyAgICAgICAKKworCisJCU1haW5DbG9zaW5nQ2xpZW50IGltcGxGYWN0b3J5ID0gbmV3IE1haW5DbG9zaW5nQ2xpZW50KCk7CisJCVJlbW90ZUNsb3NpbmdTZXJ2ZXIgc2VydmVyID0gQ2xvc2luZ0hlbHBlci5OZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkgKTsKKworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiTWFpbkNsb3NpbmdDbGllbnQuc3RhcnRpbmdTZXJ2ZXIiKTsKKyAgICAgICAgCisgICAgICAKKyAgICAgICAgc2VydmVyLl9TdGFydEFuZFdhaXRVcCg0MDAwKTsKKworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiTWFpbkNsb3NpbmdDbGllbnQuc2VydmVyVXAiKTsKKworICAgICAgICBUaHJlYWQuU2xlZXAoMTAwKTsKKworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiTWFpbkNsb3NpbmdDbGllbnQuc2F5aW5nQ2xvc2VUb1NlcnZlciIpOworICAgICAgICBzZXJ2ZXIuY2xvc2UoKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk1haW5DbG9zaW5nQ2xpZW50LnNhaWRDbG9zZVRvU2VydmVyIik7CisKKyAgICAgICAgVGhyZWFkLlNsZWVwKDEwMCk7CisKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk1haW5DbG9zaW5nQ2xpZW50LndhaXRpbmdTZXJ2ZXJEb3duIik7CisKKyAgICAgICAgc2VydmVyLl9XYWl0RG93big0MDAwKTsKKworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiTWFpbkNsb3NpbmdDbGllbnQuc2VydmVyRG93biIpOworCisJfQorCisJLy8vCisJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIE1haW5DbG9zaW5nQ2xpZW50Ljwvc3VtbWFyeT4KKwkvLy8KKwlwdWJsaWMgTWFpbkNsb3NpbmdDbGllbnQoKQorCXsKKwkJLy8gTm90aGluZyB0byBkby4KKwl9CisKKwkvLy8KKwkvLy8gPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIENsb3NpbmdDbGllbnQuPC9zdW1tYXJ5PgorCS8vLyBAcGFyYW0gc2VydmVyCisJLy8vCisJcHVibGljIENsb3NpbmdDbGllbnQgTmV3Q2xvc2luZ0NsaWVudCggUmVtb3RlQ2xvc2luZ1NlcnZlciBzZXJ2ZXIgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsQ2xvc2luZ0NsaWVudCggc2VydmVyICk7CisJfQorCit9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluQ2xvc2luZ0xpc3RlbmVyLmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkNsb3NpbmdMaXN0ZW5lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWY4ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkNsb3NpbmdMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDcwIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBldGNoLnRlc3RzOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCituYW1lc3BhY2UgZXRjaC5iaW5kaW5ncy5jc2hhcnAuZXhhbXBsZXMuY2xvc2luZworeworCisvLy8KKy8vLzxzdW1tYXJ5PiBNYWluIGltcGxlbWVudGF0aW9uIGZvciBDbG9zaW5nTGlzdGVuZXIuIDwvc3VtbWFyeT4KKy8vLworcHVibGljIGNsYXNzIE1haW5DbG9zaW5nTGlzdGVuZXIgOiBDbG9zaW5nSGVscGVyLkNsb3NpbmdTZXJ2ZXJGYWN0b3J5Cit7CisJLy8vCisgCS8vLyA8c3VtbWFyeT5NYWluIGZvciBDbG9zaW5nTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLyA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4KKwkvLy8KKwlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihTdHJpbmdbXSBhcmdzKQorCXsKKwkJc3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMSI7CisJLyoJaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKwkJCXVyaSA9IGFyZ3NbMF07ICovCisKKwkJTWFpbkNsb3NpbmdMaXN0ZW5lciBpbXBsRmFjdG9yeSA9IG5ldyBNYWluQ2xvc2luZ0xpc3RlbmVyKCk7CisgICAgICAgIFNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBDbG9zaW5nSGVscGVyLk5ld0xpc3RlbmVyKHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkpOworCisJCWxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydENvbnN0cy5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJMaXN0ZW5lciBTdGFydGVkIik7CisJfQorCisJLy8vCisJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIE1haW5DbG9zaW5nTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLworCXB1YmxpYyBNYWluQ2xvc2luZ0xpc3RlbmVyKCkKKwl7CisJCS8vIE5vdGhpbmcgdG8gZG8uCisJfQorCisJLy8vCisJLy8vIDxzdW1tYXJ5PlJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBDbG9zaW5nU2VydmVyLjwvc3VtbWFyeT4KKwkvLy8gQHBhcmFtIGNsaWVudAorCS8vLworCXB1YmxpYyBDbG9zaW5nU2VydmVyIE5ld0Nsb3NpbmdTZXJ2ZXIoIFJlbW90ZUNsb3NpbmdDbGllbnQgY2xpZW50ICkKKwl7CisJCXJldHVybiBuZXcgSW1wbENsb3NpbmdTZXJ2ZXIoIGNsaWVudCApOworCX0KK30KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5DdWFlQ2xpZW50LmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkN1YWVDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3NGYwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5DdWFlQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuQ3VhZTsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKworLy8vCisvLy88c3VtbWFyeT4gTWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgQ3VhZUNsaWVudC4gPC9zdW1tYXJ5PgorLy8vCitwdWJsaWMgY2xhc3MgTWFpbkN1YWVDbGllbnQgOiBDdWFlSGVscGVyLkN1YWVDbGllbnRGYWN0b3J5Cit7CisJLy8vCisJLy8vIDxzdW1tYXJ5Pk1haW4gZm9yIEN1YWVDbGllbnQ8L3N1bW1hcnk+CisJLy8vIDxwYXJhbSBuYW1lPSJhcmdzIj48L3BhcmFtPgorCS8vLworCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisJeworCQlzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAxIjsKKwkJaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKwkJCXVyaSA9IGFyZ3NbMF07CisKKyAgICAgICAgTWFpbkN1YWVMaXN0ZW5lci5NYWluMShuZXcgU3RyaW5nW10geyB9KTsKKworCisJCU1haW5DdWFlQ2xpZW50IGltcGxGYWN0b3J5ID0gbmV3IE1haW5DdWFlQ2xpZW50KCk7CisJCVJlbW90ZUN1YWVTZXJ2ZXIgc2VydmVyID0gQ3VhZUhlbHBlci5OZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkgKTsKKwkJCisJCXNlcnZlci5fVHJhbnNwb3J0Q29udHJvbChUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiLS0tLS0tLS1kb2l0KDIzKS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvaXQoIDIzICkgPT4gezB9XG4iLAorICAgICAgICAgICAgc2VydmVyLmRvaXQxKG5ldyBSZXF1ZXN0KDIzKSkpOworCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCItLS0tLS0tLWRvaXQoMjMsXCJza2lkZG9vXCIpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9pdCggMjMsXCJza2lkZG9vXCIgKSA9PiB7MH1cbiIsCisgICAgICAgICAgICBzZXJ2ZXIuZG9pdDEobmV3IFJlcVdpdGhNZXNzYWdlKDIzLCAic2tpZGRvbyIpKSk7CisKKworCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCItLS0tLS0tLS0tLS1kb2l0KCAxOSApLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvaXQoIDE5ICkgPT4gezB9XG4iLAorICAgICAgICAgICAgc2VydmVyLmRvaXQxKG5ldyBSZXF1ZXN0KDE5KSkpOworCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCItLS0tLS0tLS0tLS1kb2l0KCAxMyApLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvaXQoIDEzLFwidW5sdWNreSBmcmlkYXlcIiApID0+IHswfVxuIiwKKyAgICAgICAgICAgIHNlcnZlci5kb2l0MShuZXcgUmVxV2l0aE1lc3NhZ2UoMTMsICJ1bmx1Y2t5IGZyaWRheSIpKSk7CisKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvaXQoIDEzICkgPT4gezB9XG4iLAorICAgICAgICAgICAgc2VydmVyLmRvaXQxKG5ldyBSZXF1ZXN0KDEzKSkpOworCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCItLS0gZG9pdCggMjMgKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb2l0KCBbMjNdICkgPT4gezB9XG4iLAorICAgICAgICAgICAgc2VydmVyLmRvaXQzKG5ldyBSZXF1ZXN0W10geyBuZXcgUmVxdWVzdCgyMykgfSlbMF0pOworCisKKwkJc2VydmVyLl9UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDAgKTsKKworCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBNYWluQ3VhZUNsaWVudC48L3N1bW1hcnk+CisJLy8vCisJcHVibGljIE1haW5DdWFlQ2xpZW50KCkKKwl7CisJCS8vIE5vdGhpbmcgdG8gZG8uCisJfQorCisJLy8vCisJLy8vIDxzdW1tYXJ5PlJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBDdWFlQ2xpZW50Ljwvc3VtbWFyeT4KKwkvLy8gQHBhcmFtIHNlcnZlcgorCS8vLworCXB1YmxpYyBDdWFlQ2xpZW50IE5ld0N1YWVDbGllbnQoIFJlbW90ZUN1YWVTZXJ2ZXIgc2VydmVyICkKKwl7CisJCXJldHVybiBuZXcgSW1wbEN1YWVDbGllbnQoIHNlcnZlciApOworCX0KKworfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkN1YWVMaXN0ZW5lci5jcyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5DdWFlTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2N2ZkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5DdWFlTGlzdGVuZXIuY3MKQEAgLTAsMCArMSw2NCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisKKy8vLworLy8vPHN1bW1hcnk+IE1haW4gaW1wbGVtZW50YXRpb24gZm9yIEN1YWVMaXN0ZW5lci4gPC9zdW1tYXJ5PgorLy8vCitwdWJsaWMgY2xhc3MgTWFpbkN1YWVMaXN0ZW5lciA6IE15Q3VhZUhlbHBlci5NeUN1YWVTZXJ2ZXJGYWN0b3J5Cit7CisJLy8vCisgCS8vLyA8c3VtbWFyeT5NYWluIGZvciBDdWFlTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLyA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4KKwkvLy8KKwlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbjEoU3RyaW5nW10gYXJncykKKwl7CisJCXN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQkvKmlmIChhcmdzLkxlbmd0aCA+IDApCisJCQl1cmkgPSBhcmdzWzBdOyAqLworCisJCU1haW5DdWFlTGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkN1YWVMaXN0ZW5lcigpOworICAgICAgICBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyID0gTXlDdWFlSGVscGVyLk5ld0xpc3RlbmVyKHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkpOworCisJCWxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydENvbnN0cy5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBNYWluQ3VhZUxpc3RlbmVyLjwvc3VtbWFyeT4KKwkvLy8KKwlwdWJsaWMgTWFpbkN1YWVMaXN0ZW5lcigpCisJeworCQkvLyBOb3RoaW5nIHRvIGRvLgorCX0KKworCisgICAgcHVibGljIFNlc3Npb25NZXNzYWdlIE5ld015Q3VhZVNlcnZlcihEZWxpdmVyeVNlcnZpY2UgZCwgUG9vbCBxdWV1ZWQsIFBvb2wgZnJlZSwgTXlWYWx1ZUZhY3RvcnlDdWFlIHZmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUN1YWVTZXJ2ZXJTdHViKGQsIHF1ZXVlZCwgZnJlZSwgdmYpOworICAgIH0KK30KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5Gb29DbGllbnQuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluRm9vQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWZjZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluRm9vQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTA3IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuQmFyOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLnR5cGVzLkJhejsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy50eXBlcy5Gb287CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisKKy8vLworLy8vPHN1bW1hcnk+IE1haW4gaW1wbGVtZW50YXRpb24gZm9yIEZvb0NsaWVudC4gPC9zdW1tYXJ5PgorLy8vCitwdWJsaWMgY2xhc3MgTWFpbkZvb0NsaWVudCA6IEZvb0hlbHBlci5Gb29DbGllbnRGYWN0b3J5Cit7CisJLy8vCisJLy8vIDxzdW1tYXJ5Pk1haW4gZm9yIEZvb0NsaWVudDwvc3VtbWFyeT4KKwkvLy8gPHBhcmFtIG5hbWU9ImFyZ3MiPjwvcGFyYW0+CisJLy8vCisJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oU3RyaW5nW10gYXJncykKKwl7CisJCXN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworICAgICAgICBNYWluRm9vTGlzdGVuZXIuTWFpbjEobnVsbCk7CisKKwkJTWFpbkZvb0NsaWVudCBpbXBsRmFjdG9yeSA9IG5ldyBNYWluRm9vQ2xpZW50KCk7CisJCVJlbW90ZUZvb1NlcnZlciBzZXJ2ZXIgPSBGb29IZWxwZXIuTmV3U2VydmVyKCB1cmksIG51bGwsIGltcGxGYWN0b3J5ICk7CisJCQorCQlzZXJ2ZXIuX1RyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisKKyAgICAgICAgLy8gSW5zZXJ0IFlvdXIgQ29kZSBIZXJlCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFN0clN0ckhhc2hNYXAgYmF6VGFibGUgPSBuZXcgU3RyU3RySGFzaE1hcCgpOworICAgICAgICBiYXpUYWJsZS5BZGQoImRlZiIsICJiYXoiKTsKKworICAgICAgICBTdHJTdHJIYXNoTWFwIGJhclRhYmxlID0gbmV3IFN0clN0ckhhc2hNYXAoKTsKKyAgICAgICAgYmFyVGFibGUuQWRkKCJkZWYiLCAiYmFyIik7CisKKyAgICAgICAgU3RyU3RySGFzaE1hcCBmb29UYWJsZSA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisgICAgICAgIGZvb1RhYmxlLkFkZCgiZGVmIiwgImZvbyIpOworCisgICAgICAgIEJhekRhdGEgYmF6RGF0YSA9IG5ldyBCYXpEYXRhKDEsIGJhelRhYmxlKTsKKyAgICAgICAgQmFyRGF0YSBiYXJEYXRhID0gbmV3IEJhckRhdGEoMiwgYmFyVGFibGUsIGJhekRhdGEpOworICAgICAgICBGb29EYXRhIGZvb0RhdGEgPSBuZXcgRm9vRGF0YSgzLCBmb29UYWJsZSwgYmFyRGF0YSwgYmF6RGF0YSk7CisKKyAgICAgICAgYm9vbD8gb2s7CisKKyAgICAgICAgb2sgPSBzZXJ2ZXIuYmF6MShiYXpEYXRhKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImJhejEgPT4gIiArIG9rKTsKKworICAgICAgICBvayA9IHNlcnZlci5iYXoyKGJhekRhdGEpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiYmF6MiA9PiAiICsgb2spOworCisgICAgICAgIG9rID0gc2VydmVyLmJhcjEoYmFyRGF0YSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJiYXIxID0+ICIgKyBvayk7CisKKyAgICAgICAgb2sgPSBzZXJ2ZXIuYmFyMihiYXJEYXRhKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImJhcjIgPT4gIiArIG9rKTsKKworICAgICAgICBvayA9IHNlcnZlci5mb28xKGZvb0RhdGEpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZm9vMSA9PiAiICsgb2spOworCisgICAgICAgIG9rID0gc2VydmVyLmZvbzIoZm9vRGF0YSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJmb28yID0+ICIgKyBvayk7CisKKwkJc2VydmVyLl9UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDAgKTsKKworCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBNYWluRm9vQ2xpZW50Ljwvc3VtbWFyeT4KKwkvLy8KKwlwdWJsaWMgTWFpbkZvb0NsaWVudCgpCisJeworCQkvLyBOb3RoaW5nIHRvIGRvLgorCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgRm9vQ2xpZW50Ljwvc3VtbWFyeT4KKwkvLy8gQHBhcmFtIHNlcnZlcgorCS8vLworCXB1YmxpYyBGb29DbGllbnQgTmV3Rm9vQ2xpZW50KCBSZW1vdGVGb29TZXJ2ZXIgc2VydmVyICkKKwl7CisJCXJldHVybiBuZXcgSW1wbEZvb0NsaWVudCggc2VydmVyICk7CisJfQorCit9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluRm9vTGlzdGVuZXIuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluRm9vTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyYmI5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5Gb29MaXN0ZW5lci5jcwpAQCAtMCwwICsxLDY2IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisKKy8vLworLy8vPHN1bW1hcnk+IE1haW4gaW1wbGVtZW50YXRpb24gZm9yIEZvb0xpc3RlbmVyLiA8L3N1bW1hcnk+CisvLy8KK3B1YmxpYyBjbGFzcyBNYWluRm9vTGlzdGVuZXIgOiBGb29IZWxwZXIuRm9vU2VydmVyRmFjdG9yeQoreworCS8vLworIAkvLy8gPHN1bW1hcnk+TWFpbiBmb3IgRm9vTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLyA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4KKwkvLy8KKwlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbjEoU3RyaW5nW10gYXJncykKKwl7CisJCXN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQorCisJCU1haW5Gb29MaXN0ZW5lciBpbXBsRmFjdG9yeSA9IG5ldyBNYWluRm9vTGlzdGVuZXIoKTsKKyAgICAgICAgU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IEZvb0hlbHBlci5OZXdMaXN0ZW5lcih1cmksIG51bGwsIGltcGxGYWN0b3J5KTsKKworCQlsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwl9CisKKwkvLy8KKwkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgTWFpbkZvb0xpc3RlbmVyLjwvc3VtbWFyeT4KKwkvLy8KKwlwdWJsaWMgTWFpbkZvb0xpc3RlbmVyKCkKKwl7CisJCS8vIE5vdGhpbmcgdG8gZG8uCisJfQorCisJLy8vCisJLy8vIDxzdW1tYXJ5PlJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBGb29TZXJ2ZXIuPC9zdW1tYXJ5PgorCS8vLyBAcGFyYW0gY2xpZW50CisJLy8vCisJcHVibGljIEZvb1NlcnZlciBOZXdGb29TZXJ2ZXIoIFJlbW90ZUZvb0NsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsRm9vU2VydmVyKCBjbGllbnQgKTsKKwl9Cit9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluSW5oZXJpdGFuY2VDbGllbnQuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluSW5oZXJpdGFuY2VDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxOTUwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5Jbmhlcml0YW5jZUNsaWVudC5jcwpAQCAtMCwwICsxLDczIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisKKy8vLworLy8vPHN1bW1hcnk+IE1haW4gaW1wbGVtZW50YXRpb24gZm9yIEluaGVyaXRhbmNlQ2xpZW50LiA8L3N1bW1hcnk+CisvLy8KK3B1YmxpYyBjbGFzcyBNYWluSW5oZXJpdGFuY2VDbGllbnQgOiBJbmhlcml0YW5jZUhlbHBlci5Jbmhlcml0YW5jZUNsaWVudEZhY3RvcnkKK3sKKwkvLy8KKwkvLy8gPHN1bW1hcnk+TWFpbiBmb3IgSW5oZXJpdGFuY2VDbGllbnQ8L3N1bW1hcnk+CisJLy8vIDxwYXJhbSBuYW1lPSJhcmdzIj48L3BhcmFtPgorCS8vLworCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKFN0cmluZ1tdIGFyZ3MpCisJeworCQlzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAxIjsKKwkJaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKwkJCXVyaSA9IGFyZ3NbMF07CisKKwkJTWFpbkluaGVyaXRhbmNlQ2xpZW50IGltcGxGYWN0b3J5ID0gbmV3IE1haW5Jbmhlcml0YW5jZUNsaWVudCgpOworCQlSZW1vdGVJbmhlcml0YW5jZVNlcnZlciBzZXJ2ZXIgPSBJbmhlcml0YW5jZUhlbHBlci5OZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkgKTsKKwkJCisJCXNlcnZlci5fVHJhbnNwb3J0Q29udHJvbChUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKworCQkvLyBJbnNlcnQgWW91ciBDb2RlIEhlcmUKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlzZXJ2ZXIuX1RyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUT1BfQU5EX1dBSVRfRE9XTiwgNDAwMCApOworCisJfQorCisJLy8vCisJLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIE1haW5Jbmhlcml0YW5jZUNsaWVudC48L3N1bW1hcnk+CisJLy8vCisJcHVibGljIE1haW5Jbmhlcml0YW5jZUNsaWVudCgpCisJeworCQkvLyBOb3RoaW5nIHRvIGRvLgorCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSW5oZXJpdGFuY2VDbGllbnQuPC9zdW1tYXJ5PgorCS8vLyBAcGFyYW0gc2VydmVyCisJLy8vCisJcHVibGljIEluaGVyaXRhbmNlQ2xpZW50IE5ld0luaGVyaXRhbmNlQ2xpZW50KCBSZW1vdGVJbmhlcml0YW5jZVNlcnZlciBzZXJ2ZXIgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsSW5oZXJpdGFuY2VDbGllbnQoIHNlcnZlciApOworCX0KKworfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkluaGVyaXRhbmNlTGlzdGVuZXIuY3MgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NYWluSW5oZXJpdGFuY2VMaXN0ZW5lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmI1YTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpbkluaGVyaXRhbmNlTGlzdGVuZXIuY3MKQEAgLTAsMCArMSw2NyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworCisvLy8KKy8vLzxzdW1tYXJ5PiBNYWluIGltcGxlbWVudGF0aW9uIGZvciBJbmhlcml0YW5jZUxpc3RlbmVyLiA8L3N1bW1hcnk+CisvLy8KK3B1YmxpYyBjbGFzcyBNYWluSW5oZXJpdGFuY2VMaXN0ZW5lciA6IEluaGVyaXRhbmNlSGVscGVyLkluaGVyaXRhbmNlU2VydmVyRmFjdG9yeQoreyAKKwkvLy8KKyAJLy8vIDxzdW1tYXJ5Pk1haW4gZm9yIEluaGVyaXRhbmNlTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLyA8cGFyYW0gbmFtZT0iYXJncyI+PC9wYXJhbT4KKwkvLy8KKwlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihTdHJpbmdbXSBhcmdzKQorCXsKKwkJc3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMSI7CisJCWlmIChhcmdzLkxlbmd0aCA+IDApCisJCQl1cmkgPSBhcmdzWzBdOworCisJCU1haW5Jbmhlcml0YW5jZUxpc3RlbmVyIGltcGxGYWN0b3J5ID0gbmV3IE1haW5Jbmhlcml0YW5jZUxpc3RlbmVyKCk7CisgICAgICAgIFNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBJbmhlcml0YW5jZUhlbHBlci5OZXdMaXN0ZW5lcih1cmksIG51bGwsIGltcGxGYWN0b3J5KTsKKworCQlsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwl9CisKKwkvLy8KKwkvLy8gPHN1bW1hcnk+Q29uc3RydWN0cyB0aGUgTWFpbkluaGVyaXRhbmNlTGlzdGVuZXIuPC9zdW1tYXJ5PgorCS8vLworCXB1YmxpYyBNYWluSW5oZXJpdGFuY2VMaXN0ZW5lcigpCisJeworCQkvLyBOb3RoaW5nIHRvIGRvLgorCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5SZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSW5oZXJpdGFuY2VTZXJ2ZXIuPC9zdW1tYXJ5PgorCS8vLyBAcGFyYW0gY2xpZW50CisJLy8vCisJcHVibGljIEluaGVyaXRhbmNlU2VydmVyIE5ld0luaGVyaXRhbmNlU2VydmVyKCBSZW1vdGVJbmhlcml0YW5jZUNsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsSW5oZXJpdGFuY2VTZXJ2ZXIoIGNsaWVudCApOworCX0KK30KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5UeXBlc0NsaWVudC5jcyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5UeXBlc0NsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTZiYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpblR5cGVzQ2xpZW50LmNzCkBAIC0wLDAgKzEsOTQgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworbmFtZXNwYWNlIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLnR5cGVzCit7CisKKyAgICAvLy8KKyAgICAvLy88c3VtbWFyeT4gTWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgVHlwZXNDbGllbnQuIDwvc3VtbWFyeT4KKyAgICAvLy8KKyAgICBwdWJsaWMgY2xhc3MgTWFpblR5cGVzQ2xpZW50IDogVHlwZXNIZWxwZXIuVHlwZXNDbGllbnRGYWN0b3J5CisgICAgeworICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pk1haW4gZm9yIFR5cGVzQ2xpZW50PC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3MiPjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAxIjsKKworICAgICAgICAgICAgTWFpblR5cGVzTGlzdGVuZXIuTWFpbjEobnVsbCk7CisgICAgICAgICAgICBNYWluVHlwZXNDbGllbnQgaW1wbEZhY3RvcnkgPSBuZXcgTWFpblR5cGVzQ2xpZW50KCk7CisgICAgICAgICAgICBSZW1vdGVUeXBlc1NlcnZlciBzZXJ2ZXIgPSBUeXBlc0hlbHBlci5OZXdTZXJ2ZXIodXJpLCBudWxsLCBpbXBsRmFjdG9yeSk7CisKKyAgICAgICAgICAgIHNlcnZlci5fVHJhbnNwb3J0Q29udHJvbChUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDApOworCisgICAgICAgICAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICB0YWJsZS5BZGQoIjEiLCAiRW50cnkxIik7CisgICAgICAgICAgICB0YWJsZS5BZGQoIjIiLCAiRW50cnkyIik7CisKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5IG1hcDEgPSBzZXJ2ZXIudGVzdDEodGFibGUpOworCisKKyAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgICAgICBsaXN0LkFkZCgiTGlzdDEiKTsKKyAgICAgICAgICAgIElMaXN0IGxpc3QxID0gc2VydmVyLnRlc3QzKGxpc3QpOworCisKKworICAgICAgICAgICAgRGF0ZVRpbWU/IGRhdGUgPSBzZXJ2ZXIudGVzdDQoRGF0ZVRpbWUuTm93KTsKKworCisgICAgICAgICAgICBIYXNodGFibGUgc2V0ID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgc2V0LkFkZCgiMSIsIG51bGwpOworICAgICAgICAgICAgc2V0LkFkZCgiMiIsIG51bGwpOworCisKKyAgICAgICAgICAgIEhhc2h0YWJsZSByZXRzZXQgPSBzZXJ2ZXIudGVzdDIoc2V0KTsKKworICAgICAgICAgICAgc2VydmVyLl9UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDApOworCisgICAgICAgIH0KKworICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdHMgdGhlIE1haW5UeXBlc0NsaWVudC48L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgTWFpblR5cGVzQ2xpZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90aGluZyB0byBkby4KKyAgICAgICAgfQorCisgICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+UmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIFR5cGVzQ2xpZW50Ljwvc3VtbWFyeT4KKyAgICAgICAgLy8vIEBwYXJhbSBzZXJ2ZXIKKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBUeXBlc0NsaWVudCBOZXdUeXBlc0NsaWVudChSZW1vdGVUeXBlc1NlcnZlciBzZXJ2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW1wbFR5cGVzQ2xpZW50KHNlcnZlcik7CisgICAgICAgIH0KKworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5UeXBlc0xpc3RlbmVyLmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTWFpblR5cGVzTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2NGVlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL01haW5UeXBlc0xpc3RlbmVyLmNzCkBAIC0wLDAgKzEsNjYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworbmFtZXNwYWNlIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLnR5cGVzCit7CisKKy8vLworLy8vPHN1bW1hcnk+IE1haW4gaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzTGlzdGVuZXIuIDwvc3VtbWFyeT4KKy8vLworcHVibGljIGNsYXNzIE1haW5UeXBlc0xpc3RlbmVyIDogVHlwZXNIZWxwZXIuVHlwZXNTZXJ2ZXJGYWN0b3J5Cit7CisJLy8vCisgCS8vLyA8c3VtbWFyeT5NYWluIGZvciBUeXBlc0xpc3RlbmVyLjwvc3VtbWFyeT4KKwkvLy8gPHBhcmFtIG5hbWU9ImFyZ3MiPjwvcGFyYW0+CisJLy8vCisJcHVibGljIHN0YXRpYyB2b2lkIE1haW4xKFN0cmluZ1tdIGFyZ3MpCisJeworCQlzdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAxIjsKKwkJCisKKwkJTWFpblR5cGVzTGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpblR5cGVzTGlzdGVuZXIoKTsKKyAgICAgICAgU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IFR5cGVzSGVscGVyLk5ld0xpc3RlbmVyKHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkpOworCisJCWxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydENvbnN0cy5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCX0KKworCS8vLworCS8vLyA8c3VtbWFyeT5Db25zdHJ1Y3RzIHRoZSBNYWluVHlwZXNMaXN0ZW5lci48L3N1bW1hcnk+CisJLy8vCisJcHVibGljIE1haW5UeXBlc0xpc3RlbmVyKCkKKwl7CisJCS8vIE5vdGhpbmcgdG8gZG8uCisJfQorCisJLy8vCisJLy8vIDxzdW1tYXJ5PlJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBUeXBlc1NlcnZlci48L3N1bW1hcnk+CisJLy8vIEBwYXJhbSBjbGllbnQKKwkvLy8KKwlwdWJsaWMgVHlwZXNTZXJ2ZXIgTmV3VHlwZXNTZXJ2ZXIoIFJlbW90ZVR5cGVzQ2xpZW50IGNsaWVudCApCisJeworCQlyZXR1cm4gbmV3IEltcGxUeXBlc1NlcnZlciggY2xpZW50ICk7CisJfQorfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTXlDdWFlSGVscGVyLmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTXlDdWFlSGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDU2OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NeUN1YWVIZWxwZXIuY3MKQEAgLTAsMCArMSw3OSBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKyAgICBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgTXlDdWFlSGVscGVyIDogQ3VhZUhlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IE5ld0xpc3RlbmVyKHN0cmluZyB1cmksCisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzLCBNeUN1YWVTZXJ2ZXJGYWN0b3J5IGltcGxGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gSW5pdFJlc291cmNlcyhyZXNvdXJjZXMpOworICAgICAgICAgICAgVHJhbnNwb3J0PFNlcnZlckZhY3Rvcnk+IGxpc3RlbmVyID0gVHJhbnNwb3J0RmFjdG9yeS5HZXRMaXN0ZW5lcih1cmksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15U2VydmVyRmFjdG9yeShsaXN0ZW5lciwgaW1wbEZhY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG5ldyBjbGFzcyBNeVNlcnZlckZhY3RvcnkgOiBEZWZhdWx0U2VydmVyRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgTXlTZXJ2ZXJGYWN0b3J5KFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBsaXN0ZW5lciwgTXlDdWFlU2VydmVyRmFjdG9yeSBpbXBsRmFjdG9yeSkKKyAgICAgICAgICAgICAgICA6IGJhc2UobGlzdGVuZXIsIGltcGxGYWN0b3J5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9saXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgICAgIF9pbXBsRmFjdG9yeSA9IGltcGxGYWN0b3J5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRyYW5zcG9ydDxTZXJ2ZXJGYWN0b3J5PiBfbGlzdGVuZXI7CisKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTXlDdWFlU2VydmVyRmFjdG9yeSBfaW1wbEZhY3Rvcnk7CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE5ld1NlcnZlcihUcmFuc3BvcnRNZXNzYWdlIG0sIHN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5IHZmID0gKFZhbHVlRmFjdG9yeSlyZXNvdXJjZXMuR2V0KFRyYW5zcG9ydENvbnN0cy5WQUxVRV9GQUNUT1JZKTsKKyAgICAgICAgICAgICAgICBNYWlsYm94TWFuYWdlciB4ID0gbmV3IFBsYWluTWFpbGJveE1hbmFnZXIobSwgdXJpLCByZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIERlbGl2ZXJ5U2VydmljZSBkID0gbmV3IERlZmF1bHREZWxpdmVyeVNlcnZpY2UoeCwgdXJpLCByZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIFBvb2wgcXAgPSAoUG9vbClyZXNvdXJjZXNbUVVFVUVEX1BPT0xdOworICAgICAgICAgICAgICAgIFBvb2wgZnAgPSAoUG9vbClyZXNvdXJjZXNbRlJFRV9QT09MXTsKKyAgICAgICAgICAgICAgICBfaW1wbEZhY3RvcnkuTmV3TXlDdWFlU2VydmVyKGQsIHFwLCBmcCwgKE15VmFsdWVGYWN0b3J5Q3VhZSl2Zik7CisgICAgICAgICAgICAgICAgZC5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVEFSVCwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBWYWx1ZUZhY3RvcnkgTmV3VmFsdWVGYWN0b3J5KHN0cmluZyB1cmkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUZhY3RvcnlDdWFlKHVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiTXlDdWFlSGVscGVyLlNlcnZlckZhY3RvcnkvIiArIF9saXN0ZW5lcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgTXlDdWFlU2VydmVyRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBOZXdNeUN1YWVTZXJ2ZXIoRGVsaXZlcnlTZXJ2aWNlIHN2YywgUG9vbCBxcCwgUG9vbCBmcCwKKyAgICAgICAgICAgICAgICBNeVZhbHVlRmFjdG9yeUN1YWUgdmYpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTXlDdWFlU2VydmVyU3R1Yi5jcyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL015Q3VhZVNlcnZlclN0dWIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwZTY0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2NzaGFycC9ldGNoLnRlc3RzL015Q3VhZVNlcnZlclN0dWIuY3MKQEAgLTAsMCArMSwzMTIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsOworCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworICAgIHB1YmxpYyBjbGFzcyBNeUN1YWVTZXJ2ZXJTdHViIDogU3R1YkJhc2UKKyAgICB7CisKKyAgICAgICAgc3RhdGljIE15Q3VhZVNlcnZlclN0dWIoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHViSGVscGVyUnVuIGhlbHBlcjEgPSBkZWxlZ2F0ZShEZWxpdmVyeVNlcnZpY2UgX3NyYywgb2JqZWN0IG9iaiwgV2hvIF9zZW5kZXIsIE1lc3NhZ2UgX21zZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q3VhZVNlcnZlckltcGwgaW1wbCA9IChNeUN1YWVTZXJ2ZXJJbXBsKW9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5kaXNwYXRjaChfc2VuZGVyLF9tc2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgLy8gICAgICAgIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQuU2V0U3R1YkhlbHBlcihuZXcgU3R1YkhlbHBlcihoZWxwZXIxLCBTdHViSGVscGVyLkFzeW5jTW9kZS5OT05FKSk7CisgICAgLy8gICAgICAgIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQzLlNldFN0dWJIZWxwZXIobmV3IFN0dWJIZWxwZXIoaGVscGVyMSwgU3R1YkhlbHBlci5Bc3luY01vZGUuTk9ORSkpOworCisgICAgICAgICAgICBNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9kb2l0LlNldFN0dWJIZWxwZXIoaGVscGVyMSk7CisgICAgICAgICAgICAgICAgICAgTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdDMuU2V0U3R1YkhlbHBlcihoZWxwZXIxKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIE15Q3VhZVNlcnZlclN0dWIoRGVsaXZlcnlTZXJ2aWNlIHN2YywgUG9vbCBxdWV1ZWQsIFBvb2wgZnJlZSwgTXlWYWx1ZUZhY3RvcnlDdWFlIHZmKQorICAgICAgICAgICAgOiBiYXNlKHN2YywgbmV3IE15Q3VhZVNlcnZlckltcGwoc3ZjLCB2ZiksIHF1ZXVlZCwgZnJlZSkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlDdWFlU2VydmVySW1wbAorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEBwYXJhbSBzdmMKKyAgICAgICAgICAgICAqIEBwYXJhbSB2ZiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIE15Q3VhZVNlcnZlckltcGwoRGVsaXZlcnlTZXJ2aWNlIHN2YywgTXlWYWx1ZUZhY3RvcnlDdWFlIHZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGhpcy5zdmMgPSBzdmM7CisgICAgICAgICAgICAgICAgdGhpcy52ZiA9IHZmOworICAgICAgICAgICAgfQorCisgICAgICAgCisKKyAgICAgICAgICAgIHByaXZhdGUgRGVsaXZlcnlTZXJ2aWNlIHN2YzsKKworICAgICAgICAgICAgcHJpdmF0ZSBNeVZhbHVlRmFjdG9yeUN1YWUgdmY7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogSGFuZGxlIG1lc3NhZ2VzIGZyb20gcGVlci4KKyAgICAgICAgICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgICAgICAgICAqIEBwYXJhbSBtc2cKKyAgICAgICAgICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoKFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtc2cgPSAiICsgbXNnKTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLklzVHlwZShNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9kb2l0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cnVjdFZhbHVlIHJlcSA9IChTdHJ1Y3RWYWx1ZSltc2cuR2V0KE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfcmVxKTsKKyAgICAgICAgICAgICAgICAgICAgTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxdWVzdC5DaGVja0lzQXNzaWduYWJsZUZyb20ocmVxLkdldFhUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50PyBjb2RlID0gKGludD8pcmVxLkdldChNeVZhbHVlRmFjdG9yeUN1YWUuX21mX2NvZGUpOworCisgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nIG07CisgICAgICAgICAgICAgICAgICAgIFN0cnVjdFZhbHVlIHJlc3A7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5HZXRWYWx1ZU9yRGVmYXVsdCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgU3RydWN0VmFsdWUoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UsIHZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLkFkZChNeVZhbHVlRmFjdG9yeUN1YWUuX21mX21zZywiZm9vIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlEb2l0MmEoNyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJ1Y3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BXaXRoQ29kZSwgdmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuQWRkKE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCAiYmFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5BZGQoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9jb2RlLCA1NCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlEb2l0MmIoMTEsImhlYXZlbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgU3RydWN0VmFsdWUoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UsIHZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLkFkZChNeVZhbHVlRmFjdG9yeUN1YWUuX21mX21zZywgImJheiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5RG9pdDJhKDk5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BXaXRoQ29kZSwgdmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuQWRkKE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCAiIHVua25vd24gY29kZSAiICsgY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5BZGQoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9jb2RlLCA2Myk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlEb2l0MmIoMjMsICJraWxsZXIgYmVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIHJtc2cgPSBtc2cuUmVwbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInJtc2cgPSAiICsgcm1zZyk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJyZXNwID0gIiArIHJlc3ApOworICAgICAgICAgICAgICAgICAgICBybXNnLkFkZChNeVZhbHVlRmFjdG9yeUN1YWUuX21mX3Jlc3VsdCwgcmVzcCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy5UcmFuc3BvcnRNZXNzYWdlKHNlbmRlcixybXNnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtc2cuSXNUeXBlKE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cnVjdFZhbHVlW10gcmVxcyA9IChTdHJ1Y3RWYWx1ZVtdKSBtc2cuR2V0KE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfcmVxKTsKKyAgICAgICAgICAgICAgICAgICAgU3RydWN0VmFsdWUgcmVxID0gcmVxc1swXTsKKyAgICAgICAgICAgICAgICAgICAgTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxdWVzdC5DaGVja0lzQXNzaWduYWJsZUZyb20oCisgICAgICAgICAgICAgICAgICAgICAgICByZXEuR2V0WFR5cGUpOworICAgICAgICAgICAgICAgICAgICBpbnQ/IGNvZGUgPSAoaW50PykgcmVxLkdldChNeVZhbHVlRmFjdG9yeUN1YWUuX21mX2NvZGUpOworCisgICAgICAgICAgICAgICAgICAgIFN0cnVjdFZhbHVlIHJlc3A7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5HZXRWYWx1ZU9yRGVmYXVsdCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0VmFsdWUoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UsIHZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLkFkZChNeVZhbHVlRmFjdG9yeUN1YWUuX21mX21zZywgImZvbyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5RG9pdDJhKDcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgU3RydWN0VmFsdWUoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcFdpdGhDb2RlLCB2Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuQWRkKCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX21zZywgImJhciIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5BZGQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfY29kZSwgNTQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlEb2l0MmIoIDExLCAiaGVhdmVuIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJ1Y3RWYWx1ZShNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZSwgdmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuQWRkKE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCAiYmF6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlEb2l0MmEoOTkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwID0gbmV3IFN0cnVjdFZhbHVlKE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BXaXRoQ29kZSwgdmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5BZGQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCAidW5rbm93biBjb2RlICIgKyBjb2RlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLkFkZCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9jb2RlLCA2MyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlEb2l0MmIoIDIzLCAia2lsbGVyIGJlZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugcm1zZyA9IG1zZy5SZXBseSgpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicm1zZyA9ICIgKyBybXNnKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInJlc3AgPSAiICsgcmVzcCk7CisgICAgICAgICAgICAgICAgICAgIHJtc2cuQWRkKE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfcmVzdWx0LCBuZXcgU3RydWN0VmFsdWVbXSB7IHJlc3AgfSk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy5UcmFuc3BvcnRNZXNzYWdlKHNlbmRlcixybXNnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVua25vd24gbXNnIHR5cGUgIiArIG1zZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBkZWxheURvaXQyYShpbnQgY29kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRvZG9NYW5hZ2VyLkFkZFRvZG8obmV3IFRvRG9PYmooc3ZjLHZmLGNvZGUpKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBkZWxheURvaXQyYihpbnQgY29kZSwgc3RyaW5nIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRvZG9NYW5hZ2VyLkFkZFRvZG8obmV3IFRvRG9PYmoxKHN2YywgdmYsIGNvZGUsbXNnKSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBUb0RvT2JqIDogVG9kbworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBEZWxpdmVyeVNlcnZpY2Ugc3ZjOworCisgICAgICAgIHByaXZhdGUgTXlWYWx1ZUZhY3RvcnlDdWFlIHZmOworCisgICAgICAgIHByaXZhdGUgaW50IGNvZGU7CisKKyAgICAgICAgcHVibGljIFRvRG9PYmooRGVsaXZlcnlTZXJ2aWNlIHN2YywgTXlWYWx1ZUZhY3RvcnlDdWFlIHZmLCBpbnQgY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zdmMgPSBzdmM7CisgICAgICAgICAgICB0aGlzLnZmID0gdmY7CisgICAgICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgRG9pdCggVG9kb01hbmFnZXIgbWdyICkgCisJCXsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHJlcSA9IG5ldyBTdHJ1Y3RWYWx1ZShNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXF1ZXN0LCB2Zik7CisJCQkJCQlyZXEuQWRkKCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX2NvZGUsIGNvZGUgKTsKKwkJCQkJCQorCQkJCQkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfZG9pdDIsIHZmICk7CisJCQkJCQltc2cuQWRkKCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX3JlcSwgcmVxICk7CisJCQkJCQkKKwkJCQkJCU1haWxib3ggbWIgPSBzdmMuQmVnaW5DYWxsKCBtc2cgKTsKKwkJCQkJCU9iamVjdCB2YWx1ZSA9IHN2Yy5FbmRDYWxsKCBtYiwgTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfX3Jlc3VsdF9kb2l0MiApOworCQkJCQkJCisJCQkJCQlpZiAodmFsdWUgaXMgRXhjZXB0aW9uKQorCQkJCQkJeworCQkJCQkJCUV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbikgdmFsdWU7CisJCQkJCQkJdGhyb3cgZTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU3RydWN0VmFsdWUgcmVzcCA9IChTdHJ1Y3RWYWx1ZSkgdmFsdWU7CisJCQkJLy8JCXJlc3AuQ2hlY2tUeXBlKCBNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZSApOworICAgICAgICAgICAgICAgICAgICAgICAgTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UuQ2hlY2tJc0Fzc2lnbmFibGVGcm9tKHJlc3AuR2V0WFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICIqKioqIGRlbGF5RG9pdDJhOiByZXEgezB9IHJlc3BvbnNlIHsxfVxuIiwgY29kZSwgcmVzcCApOworCQkJLy8JCQlTdHJpbmcgbSA9IChTdHJpbmcpIHJlc3AuR2V0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX21zZyApOworCQkJCQkJCisJCQkJCX0KKworCQkJCQlwdWJsaWMgdm9pZCBFeGNlcHRpb24oIFRvZG9NYW5hZ2VyIG1nciwgRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQlDb25zb2xlLldyaXRlTGluZShlKTsKKwkJCQkJfQorICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVG9Eb09iajEgOiBUb2RvCisgICAgeworICAgICAgICBwcml2YXRlIERlbGl2ZXJ5U2VydmljZSBzdmM7CisKKyAgICAgICAgcHJpdmF0ZSBNeVZhbHVlRmFjdG9yeUN1YWUgdmY7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY29kZTsKKworICAgICAgICBwcml2YXRlIHN0cmluZyBtZXNzYWdlOworCisgICAgICAgIHB1YmxpYyBUb0RvT2JqMShEZWxpdmVyeVNlcnZpY2Ugc3ZjLCBNeVZhbHVlRmFjdG9yeUN1YWUgdmYsIGludCBjb2RlLCBzdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnN2YyA9IHN2YzsKKyAgICAgICAgICAgIHRoaXMudmYgPSB2ZjsKKyAgICAgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIERvaXQoVG9kb01hbmFnZXIgbWdyKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSByZXEgPSBuZXcgU3RydWN0VmFsdWUoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxV2l0aE1lc3NhZ2UsIHZmKTsKKyAgICAgICAgICAgIHJlcS5BZGQoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9jb2RlLCBjb2RlKTsKKyAgICAgICAgICAgIHJlcS5BZGQoTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9tc2csIG1lc3NhZ2UpOworCisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X2RvaXQyLCB2Zik7CisgICAgICAgICAgICBtc2cuQWRkKE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfcmVxLCByZXEpOworCisgICAgICAgICAgICBNYWlsYm94IG1iID0gc3ZjLkJlZ2luQ2FsbChtc2cpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gc3ZjLkVuZENhbGwobWIsIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIgKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlIGlzIEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pdmFsdWU7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RydWN0VmFsdWUgcmVzcCA9IChTdHJ1Y3RWYWx1ZSl2YWx1ZTsKKyAgICAgICAgICAgIC8vCQlyZXNwLkNoZWNrVHlwZSggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UgKTsKKyAgICAgICAgICAgIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlLkNoZWNrSXNBc3NpZ25hYmxlRnJvbShyZXNwLkdldFhUeXBlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKioqIGRlbGF5RG9pdDJiOiByZXEgezB9IHJlc3BvbnNlIHsxfVxuIiwgY29kZSwgcmVzcCk7CisgICAgICAgICAgICAvLwkJCVN0cmluZyBtID0gKFN0cmluZykgcmVzcC5HZXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnICk7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VwdGlvbihUb2RvTWFuYWdlciBtZ3IsIEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTXlWYWx1ZUZhY3RvcnlDdWFlLmNzIGIvdGVzdHMvc3JjL21haW4vY3NoYXJwL2V0Y2gudGVzdHMvTXlWYWx1ZUZhY3RvcnlDdWFlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmRmOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9jc2hhcnAvZXRjaC50ZXN0cy9NeVZhbHVlRmFjdG9yeUN1YWUuY3MKQEAgLTAsMCArMSwyMzAgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OworCituYW1lc3BhY2UgZXRjaC50ZXN0cworeworICAgIHB1YmxpYyBjbGFzcyBNeVZhbHVlRmFjdG9yeUN1YWUgOiBEZWZhdWx0VmFsdWVGYWN0b3J5CisgICAgeworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGljIFR5cGVNYXAgdHlwZXMgPSBuZXcgVHlwZU1hcCgpOworICAgIAorICAgICAKKworCSAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpYyBDbGFzczJUeXBlTWFwIGNsYXNzMnR5cGUgPSAKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3MyVHlwZU1hcCgpOworCQorCQorCQorCXB1YmxpYyBNeVZhbHVlRmFjdG9yeUN1YWUoKSA6IGJhc2UoIm5vbmU6Iix0eXBlcyxjbGFzczJ0eXBlKQorCXsKKwkJCQorCX0KKwlzdGF0aWMgTXlWYWx1ZUZhY3RvcnlDdWFlKCkKKwl7CisJCURlZmF1bHRWYWx1ZUZhY3RvcnkuSW5pdCggdHlwZXMsIGNsYXNzMnR5cGUgKTsKKworICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQuU2V0QXN5bmNNb2RlKEFzeW5jTW9kZS5RVUVVRUQpOworCQlfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQuU2V0UmVzdWx0KCBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdCApOworICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X2RvaXQyLlNldEFzeW5jTW9kZShBc3luY01vZGUuRlJFRSk7CisJCV9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfZG9pdDIuU2V0UmVzdWx0KCBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIgKTsKKyAgICAgICAgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9kb2l0My5TZXRSZXN1bHQoX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9fcmVzdWx0X2RvaXQzKTsKKworCisKKwkvLwljbGFzczJ0eXBlLkFkZCggdHlwZW9mKCBldGNoLmJpbmRpbmdzLmNzaGFycC5leGFtcGxlcy5jdWFlLkNvbnN0c0N1YWUuUmVxdWVzdCApLCBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QgKTsKKwkvLwlfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QuU2V0Q2xhc3MoIHR5cGVvZiggZXRjaC5iaW5kaW5ncy5jc2hhcnAuZXhhbXBsZXMuY3VhZS5Db25zdHNDdWFlLlJlcXVlc3QgKSApOworCQlfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QuU2V0SW1wb3J0RXhwb3J0SGVscGVyCisJCQkoIAorCQkJCW5ldyBJbXBvcnRFeHBvcnRIZWxwZXIoIAorCQkJCQkKKwkJCQkJZGVsZWdhdGUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkgCisJCQkJCXsKKwkJCQkJCXJldHVybiAoU3RydWN0VmFsdWUpdmFsdWU7CisJCQkJCX0sIAorCQkJCQlkZWxlZ2F0ZSggU3RydWN0VmFsdWUgc3YgKSAKKwkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN2OworCQkJCQl9IAorCQkJCSkKKwkJCSk7CisKKworCS8vCWNsYXNzMnR5cGUuQWRkKCB0eXBlb2YoIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ29uc3RzQ3VhZS5SZXNwb25zZSApLCBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlICk7CisJLy8gCV9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UuU2V0Q2xhc3MoIHR5cGVvZiggZXRjaC5iaW5kaW5ncy5jc2hhcnAuZXhhbXBsZXMuY3VhZS5Db25zdHNDdWFlLlJlc3BvbnNlICkgKTsKKwkJX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZS5TZXRJbXBvcnRFeHBvcnRIZWxwZXIKKwkJCSggCisJCQkJbmV3IEltcG9ydEV4cG9ydEhlbHBlcigKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUoVmFsdWVGYWN0b3J5IHZmLCBPYmplY3QgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RydWN0VmFsdWUpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlKFN0cnVjdFZhbHVlIHN2KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Y7CisgICAgICAgICAgICAgICAgICAgIH0gCisJCQkJKQorCQkJKTsKKworICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcVdpdGhNZXNzYWdlLlNldFN1cGVyVHlwZShfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QpOworCisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxV2l0aE1lc3NhZ2UuU2V0SW1wb3J0RXhwb3J0SGVscGVyCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgbmV3IEltcG9ydEV4cG9ydEhlbHBlcigKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUoVmFsdWVGYWN0b3J5IHZmLCBPYmplY3QgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RydWN0VmFsdWUpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlKFN0cnVjdFZhbHVlIHN2KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Y7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcFdpdGhDb2RlLlNldFN1cGVyVHlwZShfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlKTsKKyAgICAgICAgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwV2l0aENvZGUuU2V0SW1wb3J0RXhwb3J0SGVscGVyCisgICAgKAorICAgICAgICBuZXcgSW1wb3J0RXhwb3J0SGVscGVyKAorICAgICAgICAgICAgZGVsZWdhdGUoVmFsdWVGYWN0b3J5IHZmLCBPYmplY3QgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJ1Y3RWYWx1ZSl2YWx1ZTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkZWxlZ2F0ZShTdHJ1Y3RWYWx1ZSBzdikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3Y7CisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICApOworCisJCS8vIGluaXRpYWxpemUgdGhlIGV4dGVybiBzZXJpYWxpemVyczoKKworCQkvLyBkb25lIHVwZGF0aW5nIHR5cGVzIGFuZCBmaWVsZHMsIGxvY2sgdGhlbS4KKwkJdHlwZXMuTG9jaygpOworCQkKKwkJY2xhc3MydHlwZS5Mb2NrKCk7CisKKworCQlfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QuUHV0VmFsaWRhdG9yKCBfbWZfY29kZSwgVmFsaWRhdG9yX2ludC5HZXQoIDAgKSApOworCisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxV2l0aE1lc3NhZ2UuUHV0VmFsaWRhdG9yKF9tZl9jb2RlLCBWYWxpZGF0b3JfaW50LkdldCgwKSk7CisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxV2l0aE1lc3NhZ2UuUHV0VmFsaWRhdG9yKF9tZl9tc2csIFZhbGlkYXRvcl9zdHJpbmcuR2V0KDApKTsKKworCisJCV9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UuUHV0VmFsaWRhdG9yKCBfbWZfbXNnLCBWYWxpZGF0b3Jfc3RyaW5nLkdldCggMCApICk7CisKKyAgICAgICAgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwV2l0aENvZGUuUHV0VmFsaWRhdG9yKF9tZl9tc2csIFZhbGlkYXRvcl9zdHJpbmcuR2V0KDApKTsKKyAgICAgICAgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwV2l0aENvZGUuUHV0VmFsaWRhdG9yKF9tZl9jb2RlLCBWYWxpZGF0b3JfaW50LkdldCgwKSk7CisKKworCisJCS8vIHBhcmFtcyBmb3IgZG9pdAorICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQuUHV0VmFsaWRhdG9yKF9tZl9yZXEsIFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5HZXQoX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXF1ZXN0LCAwKSk7CisJCV9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdC5QdXRWYWxpZGF0b3IoIF9tZl9fbWVzc2FnZUlkLCBWYWxpZGF0b3JfbG9uZy5HZXQoIDAgKSApOworCisKKworCQkvLyBwYXJhbXMgZm9yIF9yZXN1bHRfZG9pdAorICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdC5QdXRWYWxpZGF0b3IoX21mX3Jlc3VsdCwgVmFsaWRhdG9yX1N0cnVjdFZhbHVlLkdldChfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlLCAwKSk7CisJCV9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfX3Jlc3VsdF9kb2l0LlB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisJCV9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfX3Jlc3VsdF9kb2l0LlB1dFZhbGlkYXRvciggX21mX3Jlc3VsdCwgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uR2V0KCkgKTsgLy8gdGhyb3duIFJ1bnRpbWVFeGNlcHRpb24KKwkJX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9fcmVzdWx0X2RvaXQuUHV0VmFsaWRhdG9yKCBfbWZfX2luUmVwbHlUbywgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKworCisKKwkJLy8gcGFyYW1zIGZvciBkb2l0MgorICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X2RvaXQyLlB1dFZhbGlkYXRvcihfbWZfcmVxLCBWYWxpZGF0b3JfU3RydWN0VmFsdWUuR2V0KF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxdWVzdCwgMCkpOworCQlfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X2RvaXQyLlB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisKKworCisJCS8vIHBhcmFtcyBmb3IgX3Jlc3VsdF9kb2l0MgorICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIuUHV0VmFsaWRhdG9yKF9tZl9yZXN1bHQsIFZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5HZXQoX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZSwgMCkpOworCQlfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIuUHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KCAwICkgKTsKKwkJX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9fcmVzdWx0X2RvaXQyLlB1dFZhbGlkYXRvciggX21mX3Jlc3VsdCwgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uR2V0KCkgKTsgLy8gdGhyb3duIFJ1bnRpbWVFeGNlcHRpb24KKwkJX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9fcmVzdWx0X2RvaXQyLlB1dFZhbGlkYXRvciggX21mX19pblJlcGx5VG8sIFZhbGlkYXRvcl9sb25nLkdldCggMCApICk7CisKKyAgICAgICAgLy8gcGFyYW1zIGZvciBkb2l0MworICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQzLlB1dFZhbGlkYXRvcihfbWZfcmVxLCBWYWxpZGF0b3JfU3RydWN0VmFsdWUuR2V0KF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxdWVzdCwgMSkpOworICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQzLlB1dFZhbGlkYXRvcihfbWZfX21lc3NhZ2VJZCwgVmFsaWRhdG9yX2xvbmcuR2V0KDApKTsKKworCisKKyAgICAgICAgLy8gcGFyYW1zIGZvciBfcmVzdWx0X2RvaXQzCisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfX3Jlc3VsdF9kb2l0My5QdXRWYWxpZGF0b3IoX21mX3Jlc3VsdCxWYWxpZGF0b3JfU3RydWN0VmFsdWUuR2V0KF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UsIDEpICk7CisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfX3Jlc3VsdF9kb2l0My5QdXRWYWxpZGF0b3IoX21mX19tZXNzYWdlSWQsIFZhbGlkYXRvcl9sb25nLkdldCgwKSk7CisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfX3Jlc3VsdF9kb2l0My5QdXRWYWxpZGF0b3IoX21mX3Jlc3VsdCwgVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uR2V0KCkpOyAvLyB0aHJvd24gUnVudGltZUV4Y2VwdGlvbgorICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdDMuUHV0VmFsaWRhdG9yKF9tZl9faW5SZXBseVRvLCBWYWxpZGF0b3JfbG9uZy5HZXQoMCkpOworCisgICAgICAgIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfX3Jlc3VsdF9kb2l0Mi5UaW1lb3V0ID0gNTAwOworICAgICAgICBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIuUmVzcG9uc2VGaWVsZCA9IF9tZl9yZXN1bHQ7CisKKworCQorCX0gLy8gZW5kIG9mIHN0YXRpYyBjb25zdHJ1Y3RvcgorCisJCisJCisJLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZS5SZXF1ZXN0IAorCXB1YmxpYyBzdGF0aWMgWFR5cGUgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXF1ZXN0ID0gIHR5cGVzLkdldCggImV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZS5SZXF1ZXN0IiApOworCisgICAgLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZS5SZXFXaXRoTWVzc2FnZSAKKyAgICBwdWJsaWMgc3RhdGljIFhUeXBlIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVxV2l0aE1lc3NhZ2UgPSB0eXBlcy5HZXQoImV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZS5SZXFXaXRoTWVzc2FnZSIpOworCisJLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZS5SZXNwb25zZSAKKwlwdWJsaWMgc3RhdGljIFhUeXBlIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UgPSAgdHlwZXMuR2V0KCAiZXRjaC5iaW5kaW5ncy5jc2hhcnAuZXhhbXBsZXMuY3VhZS5DdWFlLlJlc3BvbnNlIiApOworCisgICAgLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZS5SZXNwV2l0aENvZGUgCisgICAgcHVibGljIHN0YXRpYyBYVHlwZSBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BXaXRoQ29kZSA9IHR5cGVzLkdldCgiZXRjaC5iaW5kaW5ncy5jc2hhcnAuZXhhbXBsZXMuY3VhZS5DdWFlLlJlc3BXaXRoQ29kZSIpOworCisJLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5kb2l0IAorCXB1YmxpYyBzdGF0aWMgWFR5cGUgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9kb2l0ID0gIHR5cGVzLkdldCggImV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5kb2l0IiApOworCisJLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZUNsaWVudC5fcmVzdWx0X2RvaXQgCisJcHVibGljIHN0YXRpYyBYVHlwZSBfbXRfZXRjaF9iaW5kaW5nc19jc2hhcnBfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdCA9ICB0eXBlcy5HZXQoICJldGNoLmJpbmRpbmdzLmNzaGFycC5leGFtcGxlcy5jdWFlLkN1YWVDbGllbnQuX3Jlc3VsdF9kb2l0IiApOworCisJLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZUNsaWVudC5kb2l0MiAKKwlwdWJsaWMgc3RhdGljIFhUeXBlIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfZG9pdDIgPSAgdHlwZXMuR2V0KCAiZXRjaC5iaW5kaW5ncy5jc2hhcnAuZXhhbXBsZXMuY3VhZS5DdWFlQ2xpZW50LmRvaXQyIiApOworCisJLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5fcmVzdWx0X2RvaXQyIAorCXB1YmxpYyBzdGF0aWMgWFR5cGUgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9fcmVzdWx0X2RvaXQyID0gIHR5cGVzLkdldCggImV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5fcmVzdWx0X2RvaXQyIiApOworCisgICAgLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5kb2l0MyAKKyAgICBwdWJsaWMgc3RhdGljIFhUeXBlIF9tdF9ldGNoX2JpbmRpbmdzX2NzaGFycF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdDMgPSB0eXBlcy5HZXQoImV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5kb2l0MyIpOworCisgICAgLy8vIFR5cGUgZm9yIGV0Y2guYmluZGluZ3MuY3NoYXJwLmV4YW1wbGVzLmN1YWUuQ3VhZUNsaWVudC5fcmVzdWx0X2RvaXQzIAorICAgIHB1YmxpYyBzdGF0aWMgWFR5cGUgX210X2V0Y2hfYmluZGluZ3NfY3NoYXJwX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9fcmVzdWx0X2RvaXQzID0gdHlwZXMuR2V0KCJldGNoLmJpbmRpbmdzLmNzaGFycC5leGFtcGxlcy5jdWFlLkN1YWVDbGllbnQuX3Jlc3VsdF9kb2l0MyIpOworCisJCisJCisKKwkKKwkKKwkJCQlwdWJsaWMgc3RhdGljIEZpZWxkIF9tZl9jb2RlID0gbmV3IEZpZWxkKCAiY29kZSIgKTsKKwkJCisJCQkJcHVibGljIHN0YXRpYyBuZXcgRmllbGQgX21mX21zZyA9IG5ldyBGaWVsZCggIm1zZyIgKTsKKwkJCisJCQkJcHVibGljIHN0YXRpYyBGaWVsZCBfbWZfcmVxID0gbmV3IEZpZWxkKCAicmVxIiApOworCQkKKwkJCQlwdWJsaWMgc3RhdGljIG5ldyBGaWVsZCBfbWZfcmVzdWx0ID0gbmV3IEZpZWxkKCAicmVzdWx0IiApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQXN5bmMuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQXN5bmMuZXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEwNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vZXRjaC9Bc3luYy5ldGNoCkBAIC0wLDAgKzEsMzMgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzCisKK0BUaW1lb3V0KCA1MDAgKQorc2VydmljZSBBc3luYworeworCUBEaXJlY3Rpb24oIEJvdGggKQorCWludCBzeW5jKCBpbnQgY291bnQgKQorCQorCUBEaXJlY3Rpb24oIEJvdGggKQorCUBBc3luY1JlY2VpdmVyKCBRdWV1ZWQgKQorCWludCBhc3luY19xdWV1ZWQoIGludCBjb3VudCApCisJCisJQERpcmVjdGlvbiggQm90aCApCisJQEFzeW5jUmVjZWl2ZXIoIEZyZWUgKQorCWludCBhc3luY19mcmVlKCBpbnQgY291bnQgKQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vZXRjaC9CYXIuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQmFyLmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyMjIyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQmFyLmV0Y2gKQEAgLTAsMCArMSw0MyBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMKKworc2VydmljZSBCYXIKK3sKKwltaXhpbiBCYXoKKworCUBFeHRlcm4oIGphdmEsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLlN0clN0ckhhc2hNYXAiLCAiIiwKKwkJIm9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuU3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIiLCAiIiApCisJQEV4dGVybiggY3NoYXJwLCAiU3RyU3RySGFzaE1hcCIsICJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwiLAorCQkiU3RyU3RySGFzaE1hcFNlcmlhbGl6ZXIiLCAiIiApCisJZXh0ZXJuIEJhclRhYmxlCisJCisJc3RydWN0IEJhckRhdGEoIGludCBjb2RlLCBCYXJUYWJsZSBiYXJUYWJsZSwgQmF6RGF0YSBiYXpEYXRhICkKKworCS8qKiBNZXRob2QgQmFyMSAqKi8KKwlARGlyZWN0aW9uKCBCb3RoICkKKwlib29sZWFuIGJhcjEoIEJhckRhdGEgYmFyRGF0YSApOworCQorCS8qKiBNZXRob2QgQmFyMiAqKi8KKwlARGlyZWN0aW9uKCBTZXJ2ZXIgKQorCWJvb2xlYW4gYmFyMiggQmFyRGF0YSBiYXJEYXRhICk7CisJCisJLyoqIE1ldGhvZCBCYXIzICoqLworCUBEaXJlY3Rpb24oIENsaWVudCApCisJYm9vbGVhbiBiYXIzKCBCYXJEYXRhIGJhckRhdGEgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQmF6LmV0Y2ggYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0Jhei5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZjA4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0Jhei5ldGNoCkBAIC0wLDAgKzEsNDIgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzCisKK3NlcnZpY2UgQmF6Cit7CisJQEV4dGVybiggamF2YSwgIm9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuU3RyU3RySGFzaE1hcCIsICIiLAorCQkib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJTdHJIYXNoTWFwU2VyaWFsaXplciIsICIiICkKKwkJQEV4dGVybihjc2hhcnAsICJTdHJTdHJIYXNoTWFwIiwgIk9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbCIsCisJCSJTdHJTdHJIYXNoTWFwU2VyaWFsaXplciIsICIiKQorCWV4dGVybiBCYXpUYWJsZQorCQorCXN0cnVjdCBCYXpEYXRhKCBpbnQgY29kZSwgQmF6VGFibGUgYmF6VGFibGUgKQorCQorCS8qKiBNZXRob2QgQmF6MSAqKi8KKwlARGlyZWN0aW9uKCBCb3RoICkKKwlib29sZWFuIGJhejEoIEJhekRhdGEgYmF6RGF0YSApCisJCisJLyoqIE1ldGhvZCBCYXoyICoqLworCUBEaXJlY3Rpb24oIFNlcnZlciApCisJYm9vbGVhbiBiYXoyKCBCYXpEYXRhIGJhekRhdGEgKQorCQorCS8qKiBNZXRob2QgQmF6MyAqKi8KKwlARGlyZWN0aW9uKCBDbGllbnQgKQorCWJvb2xlYW4gYmF6MyggQmF6RGF0YSBiYXpEYXRhICkKKwkKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQmlnSWRsLmV0Y2ggYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0JpZ0lkbC5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMmFlMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0JpZ0lkbC5ldGNoCkBAIC0wLDAgKzEsMTAyMSBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMKK3NlcnZpY2UgQmlnSWRsCit7CisJaW50IGFkZDAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDczKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEwMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTAxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEwMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTA0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEwNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTA3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEwOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTEwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDExMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTEzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDExNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTE2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDExOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTE5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMjAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEyMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTIyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMjMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEyNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTI1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMjYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEyNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTI4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMjkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEzMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTMxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMzIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEzMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTM0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMzUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEzNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTM3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxMzgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDEzOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTQwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNDEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE0MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTQzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNDQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE0NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTQ2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNDcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE0OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTQ5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE1MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTUyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE1NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTU1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE1NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTU4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE2MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTYxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNjIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE2MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTY0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNjUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE2NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTY3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNjgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE2OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTcwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNzEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE3MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTczKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNzQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE3NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTc2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxNzcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE3OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTc5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxODAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE4MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTgyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxODMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE4NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTg1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxODYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE4NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTg4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxODkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE5MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTkxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxOTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE5MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTk0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxOTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE5NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMTk3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQxOTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDE5OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjAwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMDEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIwMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjAzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMDQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIwNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjA2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMDcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIwOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjA5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIxMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjEyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIxNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjE1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIxNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjE4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIyMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjIxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMjIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIyMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjI0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMjUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIyNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjI3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMjgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIyOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjMwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMzEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIzMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjMzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMzQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIzNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjM2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyMzcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDIzOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjM5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNDAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI0MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjQyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNDMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI0NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjQ1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNDYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI0NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjQ4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNDkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI1MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjUxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI1MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjU0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI1NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjU3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI1OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjYwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNjEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI2MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjYzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNjQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI2NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjY2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNjcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI2OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjY5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNzAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI3MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjcyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNzMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI3NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjc1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNzYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI3NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjc4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyNzkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI4MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjgxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyODIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI4MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjg0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyODUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI4NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjg3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyODgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI4OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjkwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyOTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI5MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjkzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyOTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI5NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjk2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQyOTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDI5OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMjk5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMDAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMwMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzAyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMDMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMwNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzA1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMDYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMwNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzA4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMDkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMxMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzExKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMxMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzE0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMxNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzE3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMxOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzIwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMjEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMyMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzIzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMjQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMyNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzI2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMjcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMyOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzI5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMzAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMzMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzMyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMzMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMzNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzM1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMzYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDMzNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzM4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzMzkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM0MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzQxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM0MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzQ0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM0NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzQ3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM0OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzUwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM1MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzUzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM1NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzU2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM1OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzU5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNjAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM2MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzYyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNjMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM2NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzY1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNjYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM2NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzY4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNjkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM3MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzcxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNzIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM3MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzc0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNzUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM3NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzc3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzNzgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM3OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzgwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzODEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM4MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzgzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzODQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM4NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzg2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzODcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM4OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzg5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzOTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM5MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzkyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzOTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM5NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzk1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzOTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDM5NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkMzk4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQzOTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQwMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDAxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQwMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDA0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQwNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDA3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQwOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDEwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQxMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDEzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQxNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDE2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQxOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDE5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MjAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQyMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDIyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MjMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQyNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDI1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MjYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQyNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDI4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MjkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQzMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDMxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MzIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQzMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDM0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MzUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQzNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDM3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0MzgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQzOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDQwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NDEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ0MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDQzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NDQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ0NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDQ2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NDcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ0OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDQ5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ1MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDUyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ1NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDU1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ1NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDU4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ2MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDYxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NjIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ2MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDY0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NjUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ2NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDY3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NjgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ2OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDcwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NzEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ3MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDczKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NzQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ3NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDc2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0NzcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ3OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDc5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0ODAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ4MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDgyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0ODMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ4NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDg1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0ODYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ4NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDg4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0ODkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ5MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDkxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0OTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ5MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDk0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0OTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ5NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNDk3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ0OTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDQ5OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTAwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MDEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUwMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTAzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MDQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUwNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTA2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MDcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUwOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTA5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUxMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTEyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUxNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTE1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUxNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTE4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUyMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTIxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MjIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUyMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTI0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MjUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUyNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTI3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MjgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUyOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTMwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MzEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUzMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTMzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MzQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUzNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTM2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1MzcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDUzOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTM5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NDAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU0MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTQyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NDMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU0NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTQ1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NDYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU0NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTQ4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NDkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU1MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTUxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU1MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTU0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU1NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTU3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU1OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTYwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NjEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU2MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTYzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NjQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU2NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTY2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NjcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU2OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTY5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NzAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU3MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTcyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NzMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU3NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTc1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NzYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU3NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTc4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1NzkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU4MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTgxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1ODIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU4MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTg0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1ODUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU4NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTg3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1ODgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU4OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTkwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1OTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU5MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTkzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1OTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU5NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTk2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ1OTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDU5OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNTk5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MDAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYwMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjAyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MDMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYwNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjA1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MDYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYwNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjA4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MDkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYxMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjExKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYxMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjE0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYxNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjE3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYxOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjIwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MjEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYyMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjIzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MjQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYyNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjI2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MjcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYyOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjI5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MzAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYzMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjMyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MzMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYzNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjM1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MzYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDYzNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjM4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2MzkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY0MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjQxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY0MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjQ0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY0NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjQ3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY0OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjUwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY1MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjUzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY1NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjU2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY1OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjU5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NjAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY2MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjYyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NjMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY2NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjY1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NjYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY2NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjY4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NjkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY3MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjcxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NzIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY3MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjc0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NzUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY3NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjc3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2NzgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY3OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjgwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2ODEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY4MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjgzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2ODQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY4NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjg2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2ODcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY4OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjg5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2OTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY5MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjkyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2OTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY5NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjk1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2OTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDY5NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNjk4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ2OTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcwMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzAxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcwMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzA0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcwNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzA3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcwOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzEwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcxMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzEzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcxNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzE2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcxOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzE5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MjAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcyMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzIyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MjMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcyNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzI1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MjYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDcyNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzI4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MjkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDczMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzMxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MzIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDczMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzM0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MzUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDczNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzM3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3MzgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDczOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzQwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NDEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc0MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzQzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NDQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc0NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzQ2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NDcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc0OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzQ5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc1MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzUyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc1NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzU1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc1NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzU4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc2MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzYxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NjIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc2MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzY0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NjUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc2NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzY3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NjgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc2OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzcwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NzEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc3MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzczKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NzQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc3NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzc2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3NzcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc3OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzc5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3ODAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc4MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzgyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3ODMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc4NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzg1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3ODYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc4NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzg4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3ODkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc5MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzkxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3OTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc5MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzk0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3OTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc5NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkNzk3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ3OTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDc5OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODAwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MDEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgwMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODAzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MDQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgwNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODA2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MDcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgwOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODA5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgxMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODEyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgxNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODE1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgxNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODE4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MTkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgyMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODIxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MjIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgyMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODI0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MjUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgyNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODI3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MjgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgyOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODMwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MzEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgzMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODMzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MzQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgzNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODM2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4MzcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDgzOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODM5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NDAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg0MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODQyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NDMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg0NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODQ1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NDYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg0NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODQ4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NDkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg1MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODUxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg1MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODU0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg1NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODU3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg1OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODYwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NjEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg2MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODYzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NjQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg2NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODY2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NjcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg2OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODY5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NzAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg3MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODcyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NzMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg3NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODc1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NzYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg3NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODc4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4NzkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg4MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODgxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4ODIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg4MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODg0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4ODUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg4NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODg3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4ODgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg4OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODkwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4OTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg5MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODkzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4OTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg5NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODk2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ4OTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDg5OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkODk5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MDAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkwMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTAyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MDMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkwNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTA1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MDYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkwNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTA4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MDkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkxMCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTExKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MTIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkxMyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTE0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MTUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkxNiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTE3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MTgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkxOSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTIwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MjEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkyMiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTIzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MjQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkyNSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTI2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MjcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkyOCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTI5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MzAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkzMSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTMyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MzMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkzNCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTM1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MzYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDkzNyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTM4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5MzkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk0MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTQxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NDIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk0MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTQ0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NDUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk0NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTQ3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NDgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk0OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTUwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NTEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk1MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTUzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NTQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk1NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTU2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NTcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk1OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTU5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NjAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk2MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTYyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NjMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk2NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTY1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NjYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk2NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTY4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NjkoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk3MCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTcxKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NzIoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk3MyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTc0KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NzUoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk3NiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTc3KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5NzgoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk3OSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTgwKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5ODEoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk4MiggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTgzKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5ODQoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk4NSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTg2KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5ODcoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk4OCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTg5KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5OTAoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk5MSggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTkyKCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5OTMoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk5NCggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTk1KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5OTYoIGludCB4LCBpbnQgeSApCisJaW50IGFkZDk5NyggaW50IHgsIGludCB5ICkKKwlpbnQgYWRkOTk4KCBpbnQgeCwgaW50IHkgKQorCWludCBhZGQ5OTkoIGludCB4LCBpbnQgeSApCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9ldGNoL0Nsb3NpbmcuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQ2xvc2luZy5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTIyNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0Nsb3NpbmcuZXRjaApAQCAtMCwwICsxLDI0IEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cworCitzZXJ2aWNlIENsb3NpbmcKK3sKKwlAT25ld2F5CisJdm9pZCBjbG9zZSgpCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9ldGNoL0N1YWUuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvQ3VhZS5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTA5N2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0N1YWUuZXRjaApAQCAtMCwwICsxLDkzIEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cworCisvKiogRXhhbXBsZXMgb2YgY3VhZS1saWtlIHNlcnZlciBzdHViLiAqLworQFRpbWVvdXQoIDQ5NyApCitzZXJ2aWNlIEN1YWUKK3sKKwkvKioKKwkgKiBAcGFyYW0gY29kZQorCSAqLworCXN0cnVjdCBSZXF1ZXN0KCBpbnQgY29kZSApCisKKwkvKioKKwkgKiBAcGFyYW0gbXNnCisJICovCisJc3RydWN0IFJlcVdpdGhNZXNzYWdlKCBzdHJpbmcgbXNnICkgZXh0ZW5kcyBSZXF1ZXN0CisJCisJLyoqCisJICogQHBhcmFtIG1zZworCSAqLworCXN0cnVjdCBSZXNwb25zZSggc3RyaW5nIG1zZyApCisKKwkvKioKKwkgKiBAcGFyYW0gY29kZQorCSAqLworCXN0cnVjdCBSZXNwV2l0aENvZGUgKCBpbnQgY29kZSApIGV4dGVuZHMgUmVzcG9uc2UKKwkKKwkvKioKKwkgKiBAcGFyYW0gcmVxCisJICogQHJldHVybiByZXNwb25zZQorCSAqLworCUBEaXJlY3Rpb24oU2VydmVyKQorCUBBc3luY1JlY2VpdmVyKCBRdWV1ZWQgKQorCVJlc3BvbnNlIGRvaXQxKCBSZXF1ZXN0IHJlcSApCisJCisJLyoqCisJICogQHBhcmFtIHJlcQorCSAqIEByZXR1cm4gcmVzcG9uc2UKKwkgKi8KKwlARGlyZWN0aW9uKENsaWVudCkKKwlAQXN5bmNSZWNlaXZlciggRnJlZSApCisJUmVzcG9uc2UgZG9pdDIoIFJlcXVlc3QgcmVxICkKKwkKKwkvKioKKwkgKiBAcGFyYW0gcmVxCisJICogQHJldHVybiByZXNwb25zZXMKKwkgKi8KKwlARGlyZWN0aW9uKEJvdGgpCisJUmVzcG9uc2VbXSBkb2l0MyggUmVxdWVzdFtdIHJlcSApCisJCisJLyoqCisJICogCisJICovCisJQERpcmVjdGlvbihCb3RoKQorCXZvaWQgZG9pdDQoKQorCQorCS8qKgorCSAqIAorCSAqLworCUBEaXJlY3Rpb24oU2VydmVyKQorCUBPbmV3YXkKKwl2b2lkIHRlc3QxKCkKKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlARGlyZWN0aW9uKENsaWVudCkKKwlAT25ld2F5CisJdm9pZCB0ZXN0MigpCisJCisJLyoqCisJICogCisJICovCisJQERpcmVjdGlvbihCb3RoKQorCUBPbmV3YXkKKwl2b2lkIHRlc3QzKCkKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvRm9vLmV0Y2ggYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0Zvby5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWMxODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0Zvby5ldGNoCkBAIC0wLDAgKzEsNDAgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzCisKK3NlcnZpY2UgRm9vCit7CisJbWl4aW4gQmFyCisJCisJQEV4dGVybiggamF2YSwgIm9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuU3RyU3RySGFzaE1hcCIsICIiLAorCQkib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJTdHJIYXNoTWFwU2VyaWFsaXplciIsICIiICkKKwlARXh0ZXJuKGNzaGFycCwgIlN0clN0ckhhc2hNYXAiLCAiT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5VdGlsIiwKKwkJIlN0clN0ckhhc2hNYXBTZXJpYWxpemVyIiwgIiIpCisJZXh0ZXJuIEZvb1RhYmxlCisKKwlzdHJ1Y3QgRm9vRGF0YSggaW50IGNvZGUsIEZvb1RhYmxlIGZvb1RhYmxlLCBCYXJEYXRhIGJhckRhdGEsIEJhekRhdGEgYmF6RGF0YSApCisJCisJQERpcmVjdGlvbiggQm90aCApCisJYm9vbGVhbiBmb28xKCBGb29EYXRhIGZvb0RhdGEgKTsKKwkKKwlARGlyZWN0aW9uKCBTZXJ2ZXIgKQorCWJvb2xlYW4gZm9vMiggRm9vRGF0YSBmb29EYXRhICk7CisJCisJQERpcmVjdGlvbiggQ2xpZW50ICkKKwlib29sZWFuIGZvbzMoIEZvb0RhdGEgZm9vRGF0YSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vZXRjaC9Jbmhlcml0YW5jZS5ldGNoIGIvdGVzdHMvc3JjL21haW4vZXRjaC9Jbmhlcml0YW5jZS5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzEzNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL0luaGVyaXRhbmNlLmV0Y2gKQEAgLTAsMCArMSwxMjAgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzCisKKy8qKiBJbmhlcml0YW5jZSBleGFtcGxlICovCitzZXJ2aWNlIEluaGVyaXRhbmNlCit7CisJLyoqCisJICogRTEgZGVzY3IuCisJICogQHBhcmFtIGEgYmxhaCBhYm91dCBhLgorCSAqIEBwYXJhbSBiIGJsYWggYWJvdXQgYi4KKwkgKi8KKwlleGNlcHRpb24gRTEgKCBpbnQgYSwgaW50IGIgKQorCQorCS8qKgorCSAqIEUyIGRlc2NyLgorCSAqIEBwYXJhbSBjIGJsYWggYWJvdXQgYy4KKwkgKiBAcGFyYW0gZCBibGFoIGFib3V0IGQuCisJICovCisJZXhjZXB0aW9uIEUyICggaW50IGMsIGludCBkICkgZXh0ZW5kcyBFMQorCQorCS8qKgorCSAqIEUzIGRlc2NyLgorCSAqIEBwYXJhbSBlIGJsYWggYWJvdXQgZS4KKwkgKiBAcGFyYW0gZiBibGFoIGFib3V0IGYuCisJICovCisJZXhjZXB0aW9uIEUzICggaW50IGUsIGludCBmICkgZXh0ZW5kcyBFMgorCQorCS8qKgorCSAqIFMxIGRlc2NyLgorCSAqIEBwYXJhbSBhIGJsYWggYWJvdXQgYS4KKwkgKiBAcGFyYW0gYiBibGFoIGFib3V0IGIuCisJICovCisJc3RydWN0IFMxICggaW50IGEsIGludCBiICkKKwkKKwkvKioKKwkgKiBTMiBkZXNjci4KKwkgKiBAcGFyYW0gYyBibGFoIGFib3V0IGMuCisJICogQHBhcmFtIGQgYmxhaCBhYm91dCBkLgorCSAqLworCXN0cnVjdCBTMiAoIGludCBjLCBpbnQgZCApIGV4dGVuZHMgUzEKKwkKKwkvKioKKwkgKiBTMyBkZXNjci4KKwkgKiBAcGFyYW0gZSBibGFoIGFib3V0IGUuCisJICogQHBhcmFtIGYgYmxhaCBhYm91dCBmLgorCSAqLworCXN0cnVjdCBTMyAoIGludCBlLCBpbnQgZiApIGV4dGVuZHMgUzIKKwkKKwkvKioKKwkgKiBCbGFoIGFib3V0IGYxLgorCSAqIEBwYXJhbSB2IGEgdmFsdWUuCisJICogQHJldHVybiB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwlvYmplY3QgZjEoIG9iamVjdCB2ICkKKwkKKwkvKioKKwkgKiBCbGFoIGFib3V0IGYyLgorCSAqIEBwYXJhbSB2IGEgdmFsdWUuCisJICogQHJldHVybiB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwlTMSBmMiggUzEgdiApCisJCisJLyoqCisJICogQmxhaCBhYm91dCBmMy4KKwkgKiBAcGFyYW0gdiBhIHZhbHVlLgorCSAqIEByZXR1cm4gdGhlIHNhbWUgdmFsdWUuCisJICovCisJUzIgZjMoIFMyIHYgKQorCQorCS8qKgorCSAqIEJsYWggYWJvdXQgZjQuCisJICogQHBhcmFtIHYgYSB2YWx1ZS4KKwkgKiBAcmV0dXJuIHRoZSBzYW1lIHZhbHVlLgorCSAqLworCVMzIGY0KCBTMyB2ICkKKwkKKwkvKioKKwkgKiBCbGFoIGFib3V0IGY1LgorCSAqIEBwYXJhbSB2IGEgdmFsdWUuCisJICogQHJldHVybiB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwlvYmplY3RbXSBmNSggb2JqZWN0W10gdiApCisJCisJLyoqCisJICogQmxhaCBhYm91dCBmNi4KKwkgKiBAcGFyYW0gdiBhIHZhbHVlLgorCSAqIEByZXR1cm4gdGhlIHNhbWUgdmFsdWUuCisJICovCisJUzFbXSBmNiggUzFbXSB2ICkKKwkKKwkvKioKKwkgKiBCbGFoIGFib3V0IGY3LgorCSAqIEBwYXJhbSB2IGEgdmFsdWUuCisJICogQHJldHVybiB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwlTMltdIGY3KCBTMltdIHYgKQorCQorCS8qKgorCSAqIEJsYWggYWJvdXQgZjguCisJICogQHBhcmFtIHYgYSB2YWx1ZS4KKwkgKiBAcmV0dXJuIHRoZSBzYW1lIHZhbHVlLgorCSAqLworCVMzW10gZjgoIFMzW10gdiApCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9ldGNoL1Rlc3QxLmV0Y2ggYi90ZXN0cy9zcmMvbWFpbi9ldGNoL1Rlc3QxLmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhNjYxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDEuZXRjaApAQCAtMCwwICsxLDYxMiBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMKKworLyoqIFRoZSBmaXJzdCBiaWcgdGVzdCAqLworQERpcmVjdGlvbihCb3RoKQorQFRpbWVvdXQoNDAwMCkKK3NlcnZpY2UgVGVzdDEKK3sKKwkvKiogYmxhaCAqLworCWNvbnN0IGJvb2xlYW4gQk9PTDEgPSBmYWxzZQorCQorCS8qKiBibGFoICovCisJY29uc3QgYm9vbGVhbiBCT09MMiA9IHRydWUKKwkKKwkvKiogYmxhaCAqLworCWNvbnN0IGJ5dGUgQllURTEgPSAtMTI4CisJCisJLyoqIGJsYWggKi8KKwljb25zdCBieXRlIEJZVEUyID0gLTEKKwkKKwkvKiogYmxhaCAqLworCWNvbnN0IGJ5dGUgQllURTMgPSAwCisJCisJLyoqIGJsYWggKi8KKwljb25zdCBieXRlIEJZVEU0ID0gMQorCQorCS8qKiBibGFoICovCisJY29uc3QgYnl0ZSBCWVRFNSA9IDEyNworCQorCS8qKiBibGFoICovCisJY29uc3Qgc2hvcnQgU0hPUlQxID0gLTMyNzY4CisJCisJLyoqIGJsYWggKi8KKwljb25zdCBzaG9ydCBTSE9SVDIgPSAtMQorCQorCS8qKiBibGFoICovCisJY29uc3Qgc2hvcnQgU0hPUlQzID0gMAorCQorCS8qKiBibGFoICovCisJY29uc3Qgc2hvcnQgU0hPUlQ0ID0gMQorCQorCS8qKiBibGFoICovCisJY29uc3Qgc2hvcnQgU0hPUlQ1ID0gMzI3NjcKKwkKKwkvKiogYmxhaCAqLworCWNvbnN0IGludCBJTlQxID0gLTIxNDc0ODM2NDgKKwkKKwkvKiogYmxhaCAqLworCWNvbnN0IGludCBJTlQyID0gLTEKKwkKKwkvKiogYmxhaCAqLworCWNvbnN0IGludCBJTlQzID0gMAorCQorCS8qKiBibGFoICovCisJY29uc3QgaW50IElOVDQgPSAxCisJCisJLyoqIGJsYWggKi8KKwljb25zdCBpbnQgSU5UNSA9IDIxNDc0ODM2NDcKKwkKKwkvKiogYmxhaCAqLworCWNvbnN0IGxvbmcgTE9ORzEgPSAtOTIyMzM3MjAzNjg1NDc3NTgwOAorCQorCS8qKiBibGFoICovCisJY29uc3QgbG9uZyBMT05HMiA9IC0xCisJCisJLyoqIGJsYWggKi8KKwljb25zdCBsb25nIExPTkczID0gMAorCS8qKiBibGFoICovCisJY29uc3QgbG9uZyBMT05HNCA9IDEKKwkvKiogYmxhaCAqLworCWNvbnN0IGxvbmcgTE9ORzUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisJCisJLyoqIGJsYWggKi8KKwljb25zdCBmbG9hdCBGTE9BVDEgPSAxLjRlLTQ1CisJLyoqIGJsYWggKi8KKwljb25zdCBmbG9hdCBGTE9BVDIgPSAtMQorCS8qKiBibGFoICovCisJY29uc3QgZmxvYXQgRkxPQVQzID0gMAorCS8qKiBibGFoICovCisJY29uc3QgZmxvYXQgRkxPQVQ0ID0gMQorCS8qKiBibGFoICovCisJY29uc3QgZmxvYXQgRkxPQVQ1ID0gMy40MDI4MjM1ZTM4CisJCisJLyoqIGJsYWggKi8KKwljb25zdCBkb3VibGUgRE9VQkxFMSA9IDQuOWUtMzI0CisJLyoqIGJsYWggKi8KKwljb25zdCBkb3VibGUgRE9VQkxFMiA9IC0xCisJLyoqIGJsYWggKi8KKwljb25zdCBkb3VibGUgRE9VQkxFMyA9IDAKKwkvKiogYmxhaCAqLworCWNvbnN0IGRvdWJsZSBET1VCTEU0ID0gMQorCS8qKiBibGFoICovCisJY29uc3QgZG91YmxlIERPVUJMRTUgPSAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4CisJCisJLyoqIGJsYWggKi8KKwljb25zdCBzdHJpbmcgU1RSSU5HMSA9ICIiCisJLyoqIGJsYWggKi8KKwljb25zdCBzdHJpbmcgU1RSSU5HMiA9ICJhIgorCS8qKiBibGFoICovCisJY29uc3Qgc3RyaW5nIFNUUklORzMgPSAiYWJjIgorCS8qKiBibGFoICovCisJY29uc3Qgc3RyaW5nIFNUUklORzQgPSAiYVx0Ylx0Y1xyXG4iCisJLyoqIGJsYWggKi8KKwljb25zdCBzdHJpbmcgU1RSSU5HNSA9ICJ4XHUwMDIweCIgLy8gc3BhY2UKKwkvKiogYmxhaCAqLworCWNvbnN0IHN0cmluZyBTVFJJTkc2ID0gInhcdTAwYmZ4IiAvLyBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrCisJLyoqIGJsYWggKi8KKwljb25zdCBzdHJpbmcgU1RSSU5HNyA9ICJ4XHUwM2E5eCIgLy8gZ3JlZWsgb21lZ2EKKwkvKiogYmxhaCAqLworCWNvbnN0IHN0cmluZyBTVFJJTkc4ID0gInhcXHgiIC8vIGJhY2tzbGFzaAorCS8qKiBibGFoICovCisJY29uc3Qgc3RyaW5nIFNUUklORzkgPSAieCd4IiAvLyBhcG9zdHJvcGhlCisJLyoqIGJsYWggKi8KKwljb25zdCBzdHJpbmcgU1RSSU5HMTAgPSAieFwieCIgLy8gZG91YmxlIHF1b3RlCisJCisJLyoqIGJsYWggKi8KKwllbnVtIEUxKCAvKiogdmFsdWUgKi8gQSwgLyoqIHZhbHVlICovIEIsIC8qKiB2YWx1ZSAqLyBDICkKKwkKKwkvKiogYmxhaCAqLworCXN0cnVjdCBTMSggLyoqIHZhbHVlICovIGludCB4LCAvKiogdmFsdWUgKi8gaW50IHksIC8qKiB2YWx1ZSAqLyBpbnQgeiApCisJCisJLyoqIGJsYWggKi8KKwlzdHJ1Y3QgUzIoIC8qKiB2YWx1ZSAqLyBTMSBhLCAvKiogdmFsdWUgKi8gUzEgYiwgLyoqIHZhbHVlICovIEUxIGMgKQorCQorCS8qKiBzdHJ1Y3Qgd2l0aCBvYmplY3QgYXMgcGFyYW0gKi8KKwlzdHJ1Y3QgUzMgKCAvKiogdmFsdWUgKi8gc3RyaW5nIHRpcGUsIC8qKiB2YWx1ZSAqLyBvYmplY3QgeCApCisJCisJLyoqIHN0cnVjdCB3aXRoIGFycmF5IG9mIG9iamVjdCBhcyBwYXJhbSAqLworCXN0cnVjdCBTNCAoIC8qKiB2YWx1ZSAqLyBzdHJpbmcgdGlwZSwgLyoqIHZhbHVlICovIG9iamVjdFtdIHggKQorCQorCS8qKiBibGFoICovCisJQEV4dGVybihqYXZhLCAiU3RySW50SGFzaE1hcCIsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLlN0ckludEhhc2hNYXAiLAorCQkiU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIiLCAib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJJbnRIYXNoTWFwU2VyaWFsaXplciIpCisJQEV4dGVybihjc2hhcnAsICJTdHJJbnRIYXNoTWFwIiwgIk9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbCIsCisJCSJTdHJJbnRIYXNoTWFwU2VyaWFsaXplciIsICJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwiKQorCWV4dGVybiBCbG9iCisJCisJLyoqIGJsYWggKi8KKwlleGNlcHRpb24gRXhjcDEoIC8qKiB2YWx1ZSAqLyBzdHJpbmcgbXNnLCAvKiogdmFsdWUgKi8gaW50IGNvZGUgKQorCQorCS8qKiBibGFoICovCisJQFVuY2hlY2tlZAorCWV4Y2VwdGlvbiBFeGNwMigpCisJCisJLyoqIGJsYWggKi8KKwlAVW5jaGVja2VkKHRydWUpCisJZXhjZXB0aW9uIEV4Y3AzKCkKKwkKKwkvKiogYmxhaCAqLworCUBVbmNoZWNrZWQoZmFsc2UpCisJZXhjZXB0aW9uIEV4Y3A0KCkKKwkKKwkvKiogRXhjZXB0aW9uIHdpdGggb2JqZWN0IGFzIHBhcmFtICovCisJZXhjZXB0aW9uIEV4Y3A1KCAvKiogdmFsdWUgKi8gc3RyaW5nIG1zZywgLyoqIHZhbHVlICovIGludCBjb2RlLCAvKiogdmFsdWUgKi8gb2JqZWN0IHggKQorCQorCS8qKiBFeGNlcHRpb24gd2l0aCBhcnJheSBvZiBvYmplY3QgYXMgcGFyYW0gKi8KKwlleGNlcHRpb24gRXhjcDYoIC8qKiB2YWx1ZSAqLyBzdHJpbmcgbXNnLCAvKiogdmFsdWUgKi8gaW50IGNvZGUsIC8qKiB2YWx1ZSAqLyBvYmplY3RbXSB4ICkJCisJCisJLyoqIGRvIGFic29sdXRlbHkgbm90aGluZyAqLworCUBBc3luY1JlY2VpdmVyKEZyZWUpCisJdm9pZCBub3RoaW5nKCkKKwkKKwkvKioKKwkgKiBJbmNyZW1lbnRzIGEgdmFsdWUgYnkgb25lLgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUgb25lIGxhcmdlci4KKwkgKi8KKwlAQXN5bmNSZWNlaXZlcihRdWV1ZWQpCisJaW50IGluY3IoIGludCB4ICkKKworCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcGFyYW0geSBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJaW50IGFkZChpbnQgeCwgaW50IHkgKQorCQorCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcGFyYW0geSBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJaW50IHN1YiggaW50IHgsIGludCB5ICkKKwkKKwkvKioKKwkgKiBAcGFyYW0geCBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJaW50IHN1bSggaW50W10geCApCisJCisJLyoqCisJICogQHBhcmFtIGUgYSB2YWx1ZQorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlpbnQgdHJhbnMoIEUxIGUsIGludCB4ICkKKwkKKwkvKioKKwkgKiBAcGFyYW0gYSBhIHZhbHVlCisJICogQHBhcmFtIGIgYSB2YWx1ZQorCSAqIEByZXR1cm4gYSB2YWx1ZQorCSAqLworCWRvdWJsZSBkaXN0KCBTMSBhLCBTMSBiICkKKwkKKwkvKioKKwkgKiBAcGFyYW0gbiBhIHZhbHVlCisJICogQHBhcmFtIHggYSB2YWx1ZQorCSAqIEByZXR1cm4gYSB2YWx1ZQorCSAqLworCWludFtdIGZpbGwoIGludCBuLCBpbnQgeCApCisJCisJLyoqCisJICogQHBhcmFtIG4gYSB2YWx1ZQorCSAqIEBwYXJhbSBvIGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlvYmplY3RbXSBmaWxsT2JqZWN0KCBpbnQgbiwgb2JqZWN0IG8pCisJCisJLyoqCisJICogQHBhcmFtIG1zZyBhIHZhbHVlCisJICogQHBhcmFtIGNvZGUgYSB2YWx1ZQorCSAqIEB0aHJvd3MgRXhjcDEKKwkgKi8KKwl2b2lkIGJsb3coIHN0cmluZyBtc2csIGludCBjb2RlICkgdGhyb3dzIEV4Y3AxCisJCisJLyoqCisJICogQHBhcmFtIGUgYSB2YWx1ZQorCSAqIEByZXR1cm4gYSB2YWx1ZQorCSAqIEB0aHJvd3MgRXhjcDMKKwkgKiBAdGhyb3dzIEV4Y3A0CisJICovCisJaW50IGJlZXRzKCBFMSBlICkgdGhyb3dzIEV4Y3AzLCBFeGNwNAorCQorCS8qKgorCSAqIEBwYXJhbSBtc2cKKwkgKiBAcGFyYW0gY29kZQorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEB0aHJvd3MgRXhjcDUKKwkgKi8KKwl2b2lkIHRocm93RXhjcDUgKCBzdHJpbmcgbXNnLCBpbnQgY29kZSwgb2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y3A1CisJCisJLyoqCisJICogQHBhcmFtIG1zZworCSAqIEBwYXJhbSBjb2RlCisJICogQHBhcmFtIHZhbHVlCisJICogQHRocm93cyBFeGNwNgorCSAqLworCXZvaWQgdGhyb3dFeGNwNiAoIHN0cmluZyBtc2csIGludCBjb2RlLCBvYmplY3RbXSB2YWx1ZSApIHRocm93cyBFeGNwNgorCQkJCisJLy8gdHJ5IG9uZSBvZiBldmVyeSB0eXBlIG9mIHBhcmFtZXRlciBhbmQgcmVzdWx0Li4uCisJCisJLyoqCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlib29sZWFuIHBfYm9vbGVhbiggYm9vbGVhbiBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlib29sZWFuW10gcF9ib29sZWFuX2FycmF5KCBib29sZWFuW10gYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJYnl0ZSBwX2J5dGUoIGJ5dGUgYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJYnl0ZVtdIHBfYnl0ZV9hcnJheSggYnl0ZVtdIGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCXNob3J0IHBfc2hvcnQoIHNob3J0IGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCXNob3J0W10gcF9zaG9ydF9hcnJheSggc2hvcnRbXSBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlpbnQgcF9pbnQoIGludCBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlpbnRbXSBwX2ludF9hcnJheSggaW50W10gYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJbG9uZyBwX2xvbmcoIGxvbmcgYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJbG9uZ1tdIHBfbG9uZ19hcnJheSggbG9uZ1tdIGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCWZsb2F0IHBfZmxvYXQoIGZsb2F0IGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCWZsb2F0W10gcF9mbG9hdF9hcnJheSggZmxvYXRbXSBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlkb3VibGUgcF9kb3VibGUoIGRvdWJsZSBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlkb3VibGVbXSBwX2RvdWJsZV9hcnJheSggZG91YmxlW10gYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJc3RyaW5nIHBfc3RyaW5nKCBzdHJpbmcgYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJc3RyaW5nW10gcF9zdHJpbmdfYXJyYXkoIHN0cmluZ1tdIGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCUUxIHBfRTEoIEUxIGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCUUxW10gcF9FMV9hcnJheSggRTFbXSBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlTMSBwX1MxKCBTMSBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlTMVtdIHBfUzFfYXJyYXkoIFMxW10gYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJUzIgcF9TMiggUzIgYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJUzJbXSBwX1MyX2FycmF5KCBTMltdIGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCUJsb2IgcF9CbG9iKCBCbG9iIGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCUJsb2JbXSBwX0Jsb2JfYXJyYXkoIEJsb2JbXSBhICkKKwkKKwkvKiogCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIGEKKwkgKi8KKwlvYmplY3QgcF9vYmplY3QoIG9iamVjdCBhICkKKwkJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJb2JqZWN0W10gcF9vYmplY3RfYXJyYXkoIG9iamVjdFtdIGEgKQorCQorCS8qKiAKKwkgKiBAcGFyYW0gYQorCSAqIEByZXR1cm4gYQorCSAqLworCVMzIHBfb2JqZWN0X3N0cnVjdCggUzMgYSApCisJCisJLyoqIAorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBhCisJICovCisJUzQgcF9vYmplY3Rfc3RydWN0X2FycmF5KCBTNCBhICkKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlAQXV0aG9yaXplKCBpc1RydWUgKQorCWludCBhbHdheXNXb3JrcygpCisJCisJLyoqCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJYm9vbGVhbiBpc1RydWUoKQorCQorCS8qKiBibGFoICovCisJQEF1dGhvcml6ZSggaXNGYWxzZSApCisJdm9pZCBhbHdheXNGYWlscygpCisJCisJLyoqCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJYm9vbGVhbiBpc0ZhbHNlKCkKKwkKKwkvLyBudWxsCisJCisJLyoqIGJsYWggKi8KKwlAQXV0aG9yaXplKCBjYW5fbTEgKQorCXZvaWQgbTEoKQorCQorCS8qKgorCSAqIEByZXR1cm4gYSB2YWx1ZQorCSAqLworCWJvb2xlYW4gY2FuX20xKCkKKwkKKwkvLyBsaXRlcmFsIGNvbnN0YW50cworCQorCS8qKiBibGFoICovCisJQEF1dGhvcml6ZSggY2FuX20yLCBudWxsICkKKwl2b2lkIG0yKCkKKwkKKwkvKioKKwkgKiBAcGFyYW0geCBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJYm9vbGVhbiBjYW5fbTIoIGJvb2xlYW4geCApCisJCisJLyoqIGJsYWggKi8KKwlAQXV0aG9yaXplKCBjYW5fbTMsIGZhbHNlICkKKwl2b2lkIG0zKCkKKwkKKwkvKioKKwkgKiBAcGFyYW0geCBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJYm9vbGVhbiBjYW5fbTMoIGJvb2xlYW4geCApCisJCisJLyoqIGJsYWggKi8KKwlAQXV0aG9yaXplKCBjYW5fbTQsIHRydWUgKQorCXZvaWQgbTQoKQorCQorCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlib29sZWFuIGNhbl9tNCggYm9vbGVhbiB4ICkKKwkKKwkvKiogYmxhaCAqLworCUBBdXRob3JpemUoIGNhbl9tNSwgMjMgKQorCXZvaWQgbTUoKQorCQorCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlib29sZWFuIGNhbl9tNSggYnl0ZSB4ICkKKwkKKwkvKiogYmxhaCAqLworCUBBdXRob3JpemUoIGNhbl9tNiwgMjMyMyApCisJdm9pZCBtNigpCisJCisJLyoqCisJICogQHBhcmFtIHggYSB2YWx1ZQorCSAqIEByZXR1cm4gYSB2YWx1ZQorCSAqLworCWJvb2xlYW4gY2FuX202KCBzaG9ydCB4ICkKKwkKKwkvKiogYmxhaCAqLworCUBBdXRob3JpemUoIGNhbl9tNywgMjMyMzIzMjMgKQorCXZvaWQgbTcoKQorCQorCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlib29sZWFuIGNhbl9tNyggaW50IHggKQorCQorCS8qKiBibGFoICovCisJQEF1dGhvcml6ZSggY2FuX204LCAyMzIzMjMyMzIzMjMyMzIzICkKKwl2b2lkIG04KCkKKwkKKwkvKioKKwkgKiBAcGFyYW0geCBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJYm9vbGVhbiBjYW5fbTgoIGxvbmcgeCApCisJCisJLyoqIGJsYWggKi8KKwlAQXV0aG9yaXplKCBjYW5fbTksIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSApCisJdm9pZCBtOSgpCisJCisJLyoqCisJICogQHBhcmFtIHggYSB2YWx1ZQorCSAqIEByZXR1cm4gYSB2YWx1ZQorCSAqLworCWJvb2xlYW4gY2FuX205KCBmbG9hdCB4ICkKKwkKKwkvKiogYmxhaCAqLworCUBBdXRob3JpemUoIGNhbl9tMTAsIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSApCisJdm9pZCBtMTAoKQorCQorCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlib29sZWFuIGNhbl9tMTAoIGRvdWJsZSB4ICkKKwkKKwkvKiogYmxhaCAqLworCUBBdXRob3JpemUoIGNhbl9tMTEsICJhYmMiICkKKwl2b2lkIG0xMSgpCisJCisJLyoqCisJICogQHBhcmFtIHggYSB2YWx1ZQorCSAqIEByZXR1cm4gYSB2YWx1ZQorCSAqLworCWJvb2xlYW4gY2FuX20xMSggc3RyaW5nIHggKQorCQorCS8qKiBibGFoICovCisJQEF1dGhvcml6ZSggY2FuX20xMiwgSU5UMSApCisJdm9pZCBtMTIoKQorCQorCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlib29sZWFuIGNhbl9tMTIoIGludCB4ICkKKwkKKwkvKioKKwkgKiBAcGFyYW0gayBhIHZhbHVlCisJICovCisJQEF1dGhvcml6ZSggY2FuX20xMywgayApCisJdm9pZCBtMTMoIGludCBrICkKKwkKKwkvKioKKwkgKiBAcGFyYW0geCBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJYm9vbGVhbiBjYW5fbTEzKCBpbnQgeCApCisJCisJLyoqCisJICogQHBhcmFtIGsgYSB2YWx1ZQorCSAqLworCUBBdXRob3JpemUoIGNhbl9tMTQsIGsueCApCisJdm9pZCBtMTQoIFMxIGsgKQorCQorCS8qKgorCSAqIEBwYXJhbSB4IGEgdmFsdWUKKwkgKiBAcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlib29sZWFuIGNhbl9tMTQoIGludCB4ICkKKwkKKwkvKiogYmxhaCAqLworCUBBdXRob3JpemUoIGNhbl9tMTUsIEUxLkEgKQorCXZvaWQgbTE1KCkKKwkKKwkvKioKKwkgKiBAcGFyYW0geCBhIHZhbHVlCisJICogQHJldHVybiBhIHZhbHVlCisJICovCisJYm9vbGVhbiBjYW5fbTE1KCBFMSB4ICkKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDIuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDIuZXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FhMGZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vZXRjaC9UZXN0Mi5ldGNoCkBAIC0wLDAgKzEsMjggQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzCisKKy8qKgorICogVGVzdCBjYXNlIGZvciBwcm9ibGVtIHdoZXJlIHRoZXJlIGlzIGEgbWlzc2luZyBkZWNsYXJhdGlvbiBmb3IKKyAqIF9tZl9yZXN1bHQgaWYgdGhlcmUgYXJlIG9ubHkgb25ld2F5IG1lc3NhZ2VzIGluIHRoZSBzZXJ2aWNlLgorICovCitzZXJ2aWNlIFRlc3QyCit7CisJQE9uZXdheQorCXZvaWQgZm9vKCkKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDMuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDMuZXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZkOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vZXRjaC9UZXN0My5ldGNoCkBAIC0wLDAgKzEsMjcgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzCisKKy8qKiB0ZXN0IGNhc2UgZm9yIGRlZmluZWQgdHlwZXMgY29uZmxpY3Rpbmcgd2l0aCBzdGFuZGFyZCB0eXBlcy4gKi8KK3NlcnZpY2UgVGVzdDMKK3sKKwlzdHJ1Y3QgTWVzc2FnZSgpCisJc3RydWN0IE1haWxib3goKQorCXN0cnVjdCBEZWxpdmVyeVNlcnZpY2UoKQorCU1lc3NhZ2UgZm9vKCBNZXNzYWdlIGEsIE1haWxib3ggYiwgRGVsaXZlcnlTZXJ2aWNlIGMgKQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vZXRjaC9UZXN0NC5ldGNoIGIvdGVzdHMvc3JjL21haW4vZXRjaC9UZXN0NC5ldGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDhjNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL1Rlc3Q0LmV0Y2gKQEAgLTAsMCArMSwzNSBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMKKworLyoqCisgKiBUZXN0IGJsYW5rIGF1dGggYW5kIHRydWUgYW5kIGZhbHNlLgorICovCitzZXJ2aWNlIFRlc3Q0Cit7CisJdm9pZCBhbHdheXNfY2FsbF9tZXRob2QxKCkKKwkKKwlAQXV0aG9yaXplCisJdm9pZCBhbHdheXNfY2FsbF9tZXRob2QyKCkKKwkKKwlAQXV0aG9yaXplKCB0cnVlICkKKwl2b2lkIGFsd2F5c19jYWxsX21ldGhvZDMoKQorCQorCUBBdXRob3JpemUoIGZhbHNlICkKKwl2b2lkIG5ldmVyX2NhbGxfbWV0aG9kKCkKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDUuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDUuZXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI3MTRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vZXRjaC9UZXN0NS5ldGNoCkBAIC0wLDAgKzEsMzEgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUZXN0IHZhcmlvdXMgdXNlcyBvZiByZXNlcnZlZCB3b3Jkcy4KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5yZXMxCisKK3NlcnZpY2UgcmVzMgoreworCWNvbnN0IGJvb2xlYW4gcmVzMyA9IHRydWUKKwllbnVtIHJlczQgKCByZXM1ICkKKwlzdHJ1Y3QgcmVzNiAoIGludCByZXM3ICkKKwlARXh0ZXJuKCBqYXZhLCAicmVzOCIsICJmb28iLCAiYmFyIiwgImJheiIgKQorCWV4dGVybiByZXM4CisJZXhjZXB0aW9uIHJlczkgKCBpbnQgcmVzMTAgKQorCXZvaWQgcmVzMTEoIGludCByZXMxMiApCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9ldGNoL1Rlc3Q2LmV0Y2ggYi90ZXN0cy9zcmMvbWFpbi9ldGNoL1Rlc3Q2LmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMDBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdDYuZXRjaApAQCAtMCwwICsxLDMwIEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cworCitzZXJ2aWNlIFRlc3Q2Cit7CisJQERpcmVjdGlvbihCb3RoKQorCXZvaWQgbTEoKQorCQorCUBEaXJlY3Rpb24oQ2xpZW50KQorCXZvaWQgbTIoKQorCQorCUBEaXJlY3Rpb24oU2VydmVyKQorCXZvaWQgbTMoKQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vZXRjaC9UZXN0SW5jbHVkZXMuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdEluY2x1ZGVzLmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3MjUzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdEluY2x1ZGVzLmV0Y2gKQEAgLTAsMCArMSw3OCBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQ2lzY28gU3lzdGVtcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMKKworc2VydmljZSBUZXN0SW5jbHVkZXMKK3sKKwkvKiBpbmx1ZGUgc29tZSBjb25zdGFudHMgKi8KKwlpbmNsdWRlICJjb25zdDEuZXRjaGluYyIgCisJLyogY29uc3QxLmV0Y2hpbmMgYWxzbyBpbmNsdWRlcyBjb25zdDIuZXRjaGluYyAqLworLyoJCisJY29uc3QgYm9vbGVhbiBCT09MMSA9IGZhbHNlCisJY29uc3QgYm9vbGVhbiBCT09MMiA9IHRydWUKKwljb25zdCBpbnQgSU5UMSA9IDEKKwkKKwljb25zdCBpbnQgSU5UMiA9IDI7CisJY29uc3QgaW50IElOVDMgPSA4CisJY29uc3Qgc3RyaW5nIFNUUiA9ICJURVNUIjsKKyovCQorCQorCisJaW5jbHVkZSAiZW51bXMuZXRjaGluYyIgIAorCQorCS8qIGluY2x1ZGUgc29tZSBlbnVtcyBhbmQgc3RydWN0cyAqLyAKKwkvKgorCWVudW0gRTEoIEEsIEIsIEMgKQorCWVudW0gRTIgKEQsIEUsIEYpOworCWVudW0gRTMgKEcsIEgsIEkpCisJc3RydWN0IFMxKCBpbnQgeCwgaW50IHksIGludCB6ICkKKwlzdHJ1Y3QgUzIgKHN0cmluZyBhLCBpbnQgYikKKwkqLworCS8qIExlYXZlIHRoZSBmb2xsb3dpbmcgaW5saW5lICovCisJc3RydWN0IFM1KCBTMSBhLCBTMiBiLCBFMSBjICk7CisKKwkKKwlpbnQgaW5jciggaW50IHggKQkKKwkKKwkvKiBpbmNsdWRlIGEgY291cGxlIG9mIG1lc3NhZ2VzICovCisKKwlARGlyZWN0aW9uIChDbGllbnQpCisJaW50IHRlc3RDb25zdDEoaW50IHgsIGludCB5ICkKKwkKKwkvKiBpbmNsdWRlIGEgbWVzc2FnZSAqLworCWluY2x1ZGUgIm1lc3NhZ2UuZXRjaGluYyIgCisJLyoKKwlARGlyZWN0aW9uIChCb3RoKQkKKwlpbnQgdGVzdENvbnN0MigpCisJKi8KKwlpbnQgdGVzdENvbnN0MygpCisKKwkvKglDb3VwbGUgbW9yZSBtZXNzYWdlcyB0byBpbmNsdWRlICovCisJLyogaW5jbHVkZSBmaWxlICJtZXNzYWdlczIiICovCisJQERpcmVjdGlvbiAoQ2xpZW50KQorCWludCB0ZXN0RW51bTEoKTsKKworCWludCB0ZXN0RW51bTIoKTsKKwkKKwkvKiBMZWF2ZSB0aGUgcmVzdCBpbmxpbmUgKi8JCisJQERpcmVjdGlvbiAoQm90aCkKKwlpbnQgZG9Ob3RoaW5nKCApCisKKworCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdFJlc2VydmVkV29yZHMuZXRjaCBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVGVzdFJlc2VydmVkV29yZHMuZXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmI2NTEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vZXRjaC9UZXN0UmVzZXJ2ZWRXb3Jkcy5ldGNoCkBAIC0wLDAgKzEsMzEgQEAKKy8qICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IENpc2NvIFN5c3RlbXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzCisKK0BEaXJlY3Rpb24oQm90aCkKK0BUaW1lb3V0KDQwMDApCitzZXJ2aWNlIFRlc3QKK3sKKwllbnVtIEUxKCBnb3RvLCBhYnN0cmFjdCwgaW50ZXJmYWNlICkKKworCXN0cnVjdCBTMSggaW50IGlmLCBpbnQgZWxzZSwgaW50IG5ldyApCisKKwlleHRlcm4gbmV3CisKKwlleGNlcHRpb24gRXhjcDEoIHN0cmluZyB0cnksIGludCBjYXRjaCApCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9ldGNoL1R5cGVzLmV0Y2ggYi90ZXN0cy9zcmMvbWFpbi9ldGNoL1R5cGVzLmV0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMmJlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvVHlwZXMuZXRjaApAQCAtMCwwICsxLDI5IEBACisvKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cworCitzZXJ2aWNlIFR5cGVzCit7CisJTWFwIHRlc3QxKCBNYXAgbWFwICkKKwkKKwlTZXQgdGVzdDIoIFNldCBzZXQgKQorCQorCUxpc3QgdGVzdDMoIExpc3QgbGlzdCApCisJCisJRGF0ZXRpbWUgdGVzdDQoIERhdGV0aW1lIGRhdGV0aW1lICkKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvY29uc3QxLmV0Y2hpbmMgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL2NvbnN0MS5ldGNoaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTZjMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL2NvbnN0MS5ldGNoaW5jCkBAIC0wLDAgKzEsNCBAQAorCWNvbnN0IGJvb2xlYW4gQk9PTDEgPSBmYWxzZQorCWNvbnN0IGJvb2xlYW4gQk9PTDIgPSB0cnVlCisJY29uc3QgaW50IElOVDEgPSAxCisJaW5jbHVkZSAiY29uc3QyLmV0Y2hpbmMiIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvY29uc3QyLmV0Y2hpbmMgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL2NvbnN0Mi5ldGNoaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YTBjOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL2NvbnN0Mi5ldGNoaW5jCkBAIC0wLDAgKzEsMyBAQAorCWNvbnN0IGludCBJTlQyID0gMjsKKwljb25zdCBpbnQgSU5UMyA9IDgKKwljb25zdCBzdHJpbmcgU1RSID0gIlRFU1QiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2V0Y2gvZW51bXMuZXRjaGluYyBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvZW51bXMuZXRjaGluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU0NjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vZXRjaC9lbnVtcy5ldGNoaW5jCkBAIC0wLDAgKzEsNyBAQAorCS8qIGluY2x1ZGUgc29tZSBlbnVtcyBhbmQgc3RydWN0cyAqLyAKKwkKKwllbnVtIEUxKCBBLCBCLCBDICkKKwllbnVtIEUyIChELCBFLCBGKTsKKwllbnVtIEUzIChHLCBILCBJKQorCXN0cnVjdCBTMSggaW50IHgsIGludCB5LCBpbnQgeiApCisJc3RydWN0IFMyIChzdHJpbmcgYSwgaW50IGIpOwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9ldGNoL21lc3NhZ2UuZXRjaGluYyBiL3Rlc3RzL3NyYy9tYWluL2V0Y2gvbWVzc2FnZS5ldGNoaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDVlOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9ldGNoL21lc3NhZ2UuZXRjaGluYwpAQCAtMCwwICsxLDIgQEAKKwlARGlyZWN0aW9uIChCb3RoKQkKKwlpbnQgdGVzdENvbnN0MigpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEFzeW5jQ2xpZW50LmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsQXN5bmNDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Q4MjRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEFzeW5jQ2xpZW50LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworCisvKioKKyAqIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VBc3luY0NsaWVudC4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgSW1wbEFzeW5jQ2xpZW50IGV4dGVuZHMgQmFzZUFzeW5jQ2xpZW50Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbEFzeW5jQ2xpZW50LgorCSAqCisJICogQHBhcmFtIHNlcnZlciBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCisJICovCisJcHVibGljIEltcGxBc3luY0NsaWVudCggUmVtb3RlQXN5bmNTZXJ2ZXIgc2VydmVyICkKKwl7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUFzeW5jU2VydmVyIHNlcnZlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyBJbnRlZ2VyIHN5bmMoIEludGVnZXIgY291bnQgKQorCXsKKwkJcmV0dXJuIGNvdW50ID4gMCA/IHNlcnZlci5zeW5jKCBjb3VudCAtIDEgKSArIDEgOiAwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbnRlZ2VyIGFzeW5jX3F1ZXVlZCggSW50ZWdlciBjb3VudCApCisJeworCQlyZXR1cm4gY291bnQgPiAwID8gc2VydmVyLmFzeW5jX3F1ZXVlZCggY291bnQgLSAxICkgKyAxIDogMDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW50ZWdlciBhc3luY19mcmVlKCBJbnRlZ2VyIGNvdW50ICkKKwl7CisJCXJldHVybiBjb3VudCA+IDAgPyBzZXJ2ZXIuYXN5bmNfZnJlZSggY291bnQgLSAxICkgKyAxIDogMDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEFzeW5jU2VydmVyLmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsQXN5bmNTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ5Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEFzeW5jU2VydmVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworCisvKioKKyAqIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VBc3luY1NlcnZlci4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgSW1wbEFzeW5jU2VydmVyIGV4dGVuZHMgQmFzZUFzeW5jU2VydmVyCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbEFzeW5jU2VydmVyLgorCSAqCisJICogQHBhcmFtIGNsaWVudCBhIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisJICovCisJcHVibGljIEltcGxBc3luY1NlcnZlciggUmVtb3RlQXN5bmNDbGllbnQgY2xpZW50ICkKKwl7CisJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUFzeW5jQ2xpZW50IGNsaWVudDsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBfc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGV2ZW50IGluc3RhbmNlb2YgVGhyb3dhYmxlKQorCQkJKChUaHJvd2FibGUpIGV2ZW50KS5wcmludFN0YWNrVHJhY2UoKTsKKwkJZWxzZQorCQkJU3lzdGVtLm91dC5wcmludGxuKCBldmVudCApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbnRlZ2VyIHN5bmMoIEludGVnZXIgY291bnQgKQorCXsKKwkJcmV0dXJuIGNvdW50ID4gMCA/IGNsaWVudC5zeW5jKCBjb3VudCAtIDEgKSArIDEgOiAwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbnRlZ2VyIGFzeW5jX3F1ZXVlZCggSW50ZWdlciBjb3VudCApCisJeworCQlyZXR1cm4gY291bnQgPiAwID8gY2xpZW50LmFzeW5jX3F1ZXVlZCggY291bnQgLSAxICkgKyAxIDogMDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW50ZWdlciBhc3luY19mcmVlKCBJbnRlZ2VyIGNvdW50ICkKKwl7CisJCXJldHVybiBjb3VudCA+IDAgPyBjbGllbnQuYXN5bmNfZnJlZSggY291bnQgLSAxICkgKyAxIDogMDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbENsb3NpbmdDbGllbnQuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxDbG9zaW5nQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyMmUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxDbG9zaW5nQ2xpZW50LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkxvZzsKKworCisvKioKKyAqIENhbGwgdG8gbWVzc2FnZSB0cmFuc2xhdG9yIGZvciBDbG9zaW5nQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgSW1wbENsb3NpbmdDbGllbnQgZXh0ZW5kcyBCYXNlQ2xvc2luZ0NsaWVudAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxDbG9zaW5nQ2xpZW50LgorCSAqIEBwYXJhbSBzZXJ2ZXIgCisgCSAqLworCXB1YmxpYyBJbXBsQ2xvc2luZ0NsaWVudCggUmVtb3RlQ2xvc2luZ1NlcnZlciBzZXJ2ZXIgKQorCXsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCAidW51c2VkIiApCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVDbG9zaW5nU2VydmVyIHNlcnZlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIF9zZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb2cucmVwb3J0KCAiSW1wbENsb3NpbmdDbGllbnQuX3Nlc3Npb25Ob3RpZnkiLCAiZXZlbnQiLCBldmVudCApOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxDbG9zaW5nU2VydmVyLmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsQ2xvc2luZ1NlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NmNkZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsQ2xvc2luZ1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UY3BUcmFuc3BvcnQ7CisKKworLyoqCisgKiBDYWxsIHRvIG1lc3NhZ2UgdHJhbnNsYXRvciBmb3IgQ2xvc2luZ1NlcnZlci4KKyAqLworcHVibGljIGNsYXNzIEltcGxDbG9zaW5nU2VydmVyIGV4dGVuZHMgQmFzZUNsb3NpbmdTZXJ2ZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsQ2xvc2luZ1NlcnZlci4KKwkgKgorCSAqIEBwYXJhbSBjbGllbnQKKwkgKi8KKwlwdWJsaWMgSW1wbENsb3NpbmdTZXJ2ZXIoIFJlbW90ZUNsb3NpbmdDbGllbnQgY2xpZW50ICkKKwl7CisJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUNsb3NpbmdDbGllbnQgY2xpZW50OworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xvc2UoKQorCXsKKwkJdHJ5CisJCXsKKwkJCUxvZy5yZXBvcnQoICJJbXBsQ2xvc2luZ1NlcnZlci5zYXlpbmdTdG9wVG9DbGllbnQiICk7CisJCQljbGllbnQuX3RyYW5zcG9ydENvbnRyb2woIFRjcFRyYW5zcG9ydC5TVE9QLCBudWxsICk7CisJCQlMb2cucmVwb3J0KCAiSW1wbENsb3NpbmdTZXJ2ZXIuc2FpZFN0b3BUb0NsaWVudCIgKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJjYXVnaHQgZXhjZXB0aW9uIiwgZSApOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgX3Nlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICJJbXBsQ2xvc2luZ1NlcnZlci5fc2Vzc2lvbk5vdGlmeSIsICJldmVudCIsIGV2ZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEN1YWVDbGllbnQuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxDdWFlQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlODBiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxDdWFlQ2xpZW50LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworCisvKioKKyAqIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VDdWFlQ2xpZW50LiBBZGQgbWV0aG9kcyBoZXJlIHRvIHByb3ZpZGUKKyAqIGltcGxlbWVudGF0aW9ucyBvZiBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsQ3VhZUNsaWVudCBleHRlbmRzIEJhc2VDdWFlQ2xpZW50Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbEN1YWVDbGllbnQuCisJICoKKwkgKiBAcGFyYW0gc2VydmVyIGEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci4KKwkgKi8KKwlwdWJsaWMgSW1wbEN1YWVDbGllbnQoIFJlbW90ZUN1YWVTZXJ2ZXIgc2VydmVyICkKKwl7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUN1YWVTZXJ2ZXIgc2VydmVyOworCisJQE92ZXJyaWRlCisJcHVibGljIFJlc3BvbnNlIGRvaXQyKCBSZXF1ZXN0IHJlcSApCisJeworCQlzd2l0Y2ggKHJlcS5jb2RlKQorCQl7CisJCQljYXNlIDc6IHJldHVybiBuZXcgUmVzcG9uc2UoICJhcHBsZSIgKTsKKwkJCWNhc2UgMTE6IHJldHVybiBuZXcgUmVzcFdpdGhDb2RlKCAiYmFuYW5hIiwgMzcgKTsKKwkJCWNhc2UgOTk6IHJldHVybiBuZXcgUmVzcG9uc2UoICJwcnVuZSIgKTsKKwkJCWRlZmF1bHQ6IHJldHVybiBuZXcgUmVzcFdpdGhDb2RlKCAibWUgcHV0eiAiK3JlcS5jb2RlKyIgaW4gdGVoIGJ1a2tpdCIsIDEwMSApOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxDdWFlU2VydmVyLmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsQ3VhZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0N2RkYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsQ3VhZVNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlQ3VhZVNlcnZlci4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgSW1wbEN1YWVTZXJ2ZXIgZXh0ZW5kcyBCYXNlQ3VhZVNlcnZlcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEltcGxDdWFlU2VydmVyLgorCSAqCisJICogQHBhcmFtIGNsaWVudCBhIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisJICovCisJcHVibGljIEltcGxDdWFlU2VydmVyKCBSZW1vdGVDdWFlQ2xpZW50IGNsaWVudCApCisJeworCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVDdWFlQ2xpZW50IGNsaWVudDsKKworCS8vIFRPRE8gaW5zZXJ0IG1ldGhvZHMgaGVyZSB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBDdWFlU2VydmVyCisJLy8gbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50LgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxGb29DbGllbnQuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxGb29DbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjFkMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEZvb0NsaWVudC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGZvciBGb29DbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsRm9vQ2xpZW50IGltcGxlbWVudHMgRm9vQ2xpZW50Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbEZvb0NsaWVudC4KKwkgKiBAcGFyYW0gc2VydmVyCisJICovCisJcHVibGljIEltcGxGb29DbGllbnQoIFJlbW90ZUZvb1NlcnZlciBzZXJ2ZXIgKQorCXsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByb3RlY3RlZCBGb29TZXJ2ZXIgc2VydmVyOworCisJcHVibGljIEJvb2xlYW4gZm9vMSggRm9vLkZvb0RhdGEgZm9vRGF0YSApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBmb28zKCBGb28uRm9vRGF0YSBmb29EYXRhICkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGJhcjEoIEJhckRhdGEgYmFyRGF0YSApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBiYXIzKCBCYXJEYXRhIGJhckRhdGEgKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEJvb2xlYW4gYmF6MSggQmF6RGF0YSBiYXpEYXRhICkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGJhejMoIEJhekRhdGEgYmF6RGF0YSApCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsRm9vU2VydmVyLmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsRm9vU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5Yjk5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxGb29TZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBmb3IgRm9vU2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgSW1wbEZvb1NlcnZlciBleHRlbmRzIEJhc2VGb29TZXJ2ZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsRm9vU2VydmVyLgorCSAqCisJICogQHBhcmFtIGNsaWVudCB0aGUgY29ubmVjdGlvbiB0byBvdXIgY2xpZW50LgorCSAqLworCXB1YmxpYyBJbXBsRm9vU2VydmVyKCBSZW1vdGVGb29DbGllbnQgY2xpZW50ICkKKwl7CisJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUZvb0NsaWVudCBjbGllbnQ7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBmb28xKCBGb28uRm9vRGF0YSBmb29EYXRhICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImZvbzEgY2FsbGVkIHdpdGggIitmb29EYXRhICk7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGZvbzIoIEZvby5Gb29EYXRhIGZvb0RhdGEgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiZm9vMiBjYWxsZWQgd2l0aCAiK2Zvb0RhdGEgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGJhcjEoIEJhckRhdGEgYmFyRGF0YSApCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJiYXIxIGNhbGxlZCB3aXRoICIrYmFyRGF0YSApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBiYXIyKCBCYXJEYXRhIGJhckRhdGEgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYmFyMiBjYWxsZWQgd2l0aCAiK2JhckRhdGEgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGJhejEoIEJhekRhdGEgYmF6RGF0YSApCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJiYXoxIGNhbGxlZCB3aXRoICIrYmF6RGF0YSApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBiYXoyKCBCYXpEYXRhIGJhekRhdGEgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYmF6MiBjYWxsZWQgd2l0aCAiK2JhekRhdGEgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIF9zZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIGV2ZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEluaGVyaXRhbmNlQ2xpZW50LmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsSW5oZXJpdGFuY2VDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcyYWIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbEluaGVyaXRhbmNlQ2xpZW50LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworCisvKioKKyAqIFlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIEJhc2VJbmhlcml0YW5jZUNsaWVudC4gQWRkIG1ldGhvZHMgaGVyZSB0byBwcm92aWRlCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorICovCitwdWJsaWMgY2xhc3MgSW1wbEluaGVyaXRhbmNlQ2xpZW50IGV4dGVuZHMgQmFzZUluaGVyaXRhbmNlQ2xpZW50Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbEluaGVyaXRhbmNlQ2xpZW50LgorCSAqCisJICogQHBhcmFtIHNlcnZlciBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCisJICovCisJcHVibGljIEltcGxJbmhlcml0YW5jZUNsaWVudCggUmVtb3RlSW5oZXJpdGFuY2VTZXJ2ZXIgc2VydmVyICkKKwl7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIGZpbmFsIFJlbW90ZUluaGVyaXRhbmNlU2VydmVyIHNlcnZlcjsKKworCS8vIFRPRE8gaW5zZXJ0IG1ldGhvZHMgaGVyZSB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBJbmhlcml0YW5jZUNsaWVudAorCS8vIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsSW5oZXJpdGFuY2VTZXJ2ZXIuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxJbmhlcml0YW5jZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmM4YzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsSW5oZXJpdGFuY2VTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisKKy8qKgorICogWW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgQmFzZUluaGVyaXRhbmNlU2VydmVyLiBBZGQgbWV0aG9kcyBoZXJlIHRvIHByb3ZpZGUKKyAqIGltcGxlbWVudGF0aW9ucyBvZiBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsSW5oZXJpdGFuY2VTZXJ2ZXIgZXh0ZW5kcyBCYXNlSW5oZXJpdGFuY2VTZXJ2ZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsSW5oZXJpdGFuY2VTZXJ2ZXIuCisJICoKKwkgKiBAcGFyYW0gY2xpZW50IGEgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4KKwkgKi8KKwlwdWJsaWMgSW1wbEluaGVyaXRhbmNlU2VydmVyKCBSZW1vdGVJbmhlcml0YW5jZUNsaWVudCBjbGllbnQgKQorCXsKKwkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgZmluYWwgUmVtb3RlSW5oZXJpdGFuY2VDbGllbnQgY2xpZW50OworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBmMSggT2JqZWN0IHYgKQorCXsKKwkJcmV0dXJuIHY7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFMxIGYyKCBTMSB2ICkKKwl7CisJCXJldHVybiB2OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTMiBmMyggUzIgdiApCisJeworCQlyZXR1cm4gdjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUzMgZjQoIFMzIHYgKQorCXsKKwkJcmV0dXJuIHY7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdFtdIGY1KCBPYmplY3RbXSB2ICkKKwl7CisJCXJldHVybiB2OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTMVtdIGY2KCBTMVtdIHYgKQorCXsKKwkJcmV0dXJuIHY7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFMyW10gZjcoIFMyW10gdiApCisJeworCQlyZXR1cm4gdjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUzNbXSBmOCggUzNbXSB2ICkKKwl7CisJCXJldHVybiB2OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsVHlwZXNDbGllbnQuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxUeXBlc0NsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDM2OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9JbXBsVHlwZXNDbGllbnQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCisKKy8qKgorICogWW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgQmFzZVR5cGVzQ2xpZW50LiBBZGQgbWV0aG9kcyBoZXJlIHRvIHByb3ZpZGUKKyAqIGltcGxlbWVudGF0aW9ucyBvZiBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsVHlwZXNDbGllbnQgZXh0ZW5kcyBCYXNlVHlwZXNDbGllbnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbXBsVHlwZXNDbGllbnQuCisJICoKKwkgKiBAcGFyYW0gc2VydmVyIGEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHNlc3Npb24uIFVzZSB0aGlzIHRvIHNlbmQgYQorCSAqIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci4KKwkgKi8KKwlwdWJsaWMgSW1wbFR5cGVzQ2xpZW50KCBSZW1vdGVUeXBlc1NlcnZlciBzZXJ2ZXIgKQorCXsKKwkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgZmluYWwgUmVtb3RlVHlwZXNTZXJ2ZXIgc2VydmVyOworCisJLy8gVE9ETyBpbnNlcnQgbWV0aG9kcyBoZXJlIHRvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIFR5cGVzQ2xpZW50CisJLy8gbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxUeXBlc1NlcnZlci5qYXZhIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW1wbFR5cGVzU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3MzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0ltcGxUeXBlc1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKworLyoqCisgKiBZb3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlVHlwZXNTZXJ2ZXIuIEFkZCBtZXRob2RzIGhlcmUgdG8gcHJvdmlkZQorICogaW1wbGVtZW50YXRpb25zIG9mIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgSW1wbFR5cGVzU2VydmVyIGV4dGVuZHMgQmFzZVR5cGVzU2VydmVyCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSW1wbFR5cGVzU2VydmVyLgorCSAqCisJICogQHBhcmFtIGNsaWVudCBhIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBzZXNzaW9uLiBVc2UgdGhpcyB0byBzZW5kIGEKKwkgKiBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisJICovCisJcHVibGljIEltcGxUeXBlc1NlcnZlciggUmVtb3RlVHlwZXNDbGllbnQgY2xpZW50ICkKKwl7CisJCXRoaXMuY2xpZW50ID0gY2xpZW50OworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIGZpbmFsIFJlbW90ZVR5cGVzQ2xpZW50IGNsaWVudDsKKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXAgdGVzdDEoIE1hcCBtYXAgKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibWFwID0gIittYXAgKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFNldCB0ZXN0MiggU2V0IHNldCApCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJzZXQgPSAiK3NldCApOworCQlyZXR1cm4gc2V0OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdCB0ZXN0MyggTGlzdCBsaXN0ICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImxpc3QgPSAiK2xpc3QgKTsKKwkJcmV0dXJuIGxpc3Q7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBEYXRlIHRlc3Q0KCBEYXRlIGRhdGV0aW1lICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImRhdGV0aW1lID0gIitkYXRldGltZSApOworCQlyZXR1cm4gZGF0ZXRpbWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Bc3luY0NsaWVudC5qYXZhIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkFzeW5jQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhMzVlMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Bc3luY0NsaWVudC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKKworLyoqCisgKiBNYWluIHByb2dyYW0gZm9yIEFzeW5jQ2xpZW50LiBUaGlzIHByb2dyYW0gbWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZQorICogbGlzdGVuZXIgY3JlYXRlZCBieSBNYWluQXN5bmNMaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIE1haW5Bc3luY0NsaWVudCBpbXBsZW1lbnRzIEFzeW5jSGVscGVyLkFzeW5jQ2xpZW50RmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgQXN5bmNDbGllbnQuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMyI7CisJCWlmIChhcmdzLmxlbmd0aCA+IDApCisJCQl1cmkgPSBhcmdzWzBdOworCisJCU1haW5Bc3luY0NsaWVudCBpbXBsRmFjdG9yeSA9IG5ldyBNYWluQXN5bmNDbGllbnQoKTsKKwkJCisJCVJlbW90ZUFzeW5jU2VydmVyIHNlcnZlciA9IEFzeW5jSGVscGVyLm5ld1NlcnZlciggdXJpLCBudWxsLAorCQkJaW1wbEZhY3RvcnkgKTsKKworCQlzZXJ2ZXIuX3N0YXJ0QW5kV2FpdFVwKCA0MDAwICk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBJbnNlcnQgWW91ciBDb2RlIEhlcmUKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCXNlcnZlci5fc3RvcEFuZFdhaXREb3duKCA0MDAwICk7CisJfQorCisJcHVibGljIEFzeW5jQ2xpZW50IG5ld0FzeW5jQ2xpZW50KCBSZW1vdGVBc3luY1NlcnZlciBzZXJ2ZXIgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IEltcGxBc3luY0NsaWVudCggc2VydmVyICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkFzeW5jTGlzdGVuZXIuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Bc3luY0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzZTc0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Bc3luY0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgQXN5bmNTZXJ2ZXIuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGxpc3RlbmVyIHRvIGFjY2VwdAorICogY29ubmVjdGlvbnMgZnJvbSBNYWluQXN5bmNDbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluQXN5bmNMaXN0ZW5lciBpbXBsZW1lbnRzIEFzeW5jSGVscGVyLkFzeW5jU2VydmVyRmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgQXN5bmNTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLmFkZFNpbmsoIG51bGwgKTsKKwkJTG9nLnJlcG9ydCggIk1haW5Bc3luY0xpc3RlbmVyIiApOworCQkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly8wLjAuMC4wOjQwMDMiOworCisJCVNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBBc3luY0hlbHBlci5uZXdMaXN0ZW5lciggdXJpLCBudWxsLAorCQkJbmV3IE1haW5Bc3luY0xpc3RlbmVyKCkgKTsKKworCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwl9CisKKwlwdWJsaWMgQXN5bmNTZXJ2ZXIgbmV3QXN5bmNTZXJ2ZXIoIFJlbW90ZUFzeW5jQ2xpZW50IGNsaWVudCApCisJeworCQlyZXR1cm4gbmV3IEltcGxBc3luY1NlcnZlciggY2xpZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkNsb3NpbmdDbGllbnQuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5DbG9zaW5nQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyMzc3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5DbG9zaW5nQ2xpZW50LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkxvZzsKKworCisvKioKKyAqIE1haW4gaW1wbGVtZW50YXRpb24gZm9yIENsb3NpbmdDbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluQ2xvc2luZ0NsaWVudCBpbXBsZW1lbnRzIENsb3NpbmdIZWxwZXIuQ2xvc2luZ0NsaWVudEZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIGZvciBDbG9zaW5nQ2xpZW50CisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5hZGRTaW5rKCBudWxsICk7CisJCQorCQlMb2cucmVwb3J0KCAiTWFpbkNsb3NpbmdDbGllbnQuc3RhcnRpbmdMaXN0ZW5lciIgKTsKKwkJTWFpbkNsb3NpbmdMaXN0ZW5lci5tYWluKCBuZXcgU3RyaW5nW10geyAidGNwOi8vbG9jYWxob3N0OjAiIH0gKTsKKwkJU3RyaW5nIHVyaSA9IE1haW5DbG9zaW5nTGlzdGVuZXIuZ2V0TG9jYWxVcmkoKTsKKwkJTG9nLnJlcG9ydCggIk1haW5DbG9zaW5nQ2xpZW50Lmxpc3RlbmVyVXAiLCAidXJpIiwgdXJpICk7CisJCQorCQlSZW1vdGVDbG9zaW5nU2VydmVyIHNlcnZlciA9IENsb3NpbmdIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsIG5ldyBNYWluQ2xvc2luZ0NsaWVudCgpICk7CisJCQorCQlMb2cucmVwb3J0KCAiTWFpbkNsb3NpbmdDbGllbnQuc3RhcnRpbmdTZXJ2ZXIiICk7CisJCXNlcnZlci5fc3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKwkJTG9nLnJlcG9ydCggIk1haW5DbG9zaW5nQ2xpZW50LnNlcnZlclVwIiApOworCQkKKwkJVGhyZWFkLnNsZWVwKCAxMDAgKTsKKwkJCisJCS8vIHRoaXMgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdGhlbiBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uCisJCQorCQlMb2cucmVwb3J0KCAiTWFpbkNsb3NpbmdDbGllbnQuc2F5aW5nQ2xvc2VUb1NlcnZlciIgKTsKKwkJc2VydmVyLmNsb3NlKCk7CisJCUxvZy5yZXBvcnQoICJNYWluQ2xvc2luZ0NsaWVudC5zYWlkQ2xvc2VUb1NlcnZlciIgKTsKKwkJCisJCVRocmVhZC5zbGVlcCggMTAwICk7CisJCQorCQkvLyB3YWl0aW5nIGZvciBzZXJ2ZXIgdG8gY2xvc2UuCisJCQorCQlMb2cucmVwb3J0KCAiTWFpbkNsb3NpbmdDbGllbnQud2FpdGluZ1NlcnZlckRvd24iICk7CisJCXNlcnZlci5fd2FpdERvd24oIDQwMDAgKTsKKwkJTG9nLnJlcG9ydCggIk1haW5DbG9zaW5nQ2xpZW50LnNlcnZlckRvd24iICk7CisJfQorCisJcHVibGljIENsb3NpbmdDbGllbnQgbmV3Q2xvc2luZ0NsaWVudCggUmVtb3RlQ2xvc2luZ1NlcnZlciBzZXJ2ZXIgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IEltcGxDbG9zaW5nQ2xpZW50KCBzZXJ2ZXIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWluQ2xvc2luZ0xpc3RlbmVyLmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWluQ2xvc2luZ0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1YTFmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5DbG9zaW5nTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVGNwTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworCisvKioKKyAqIE1haW4gaW1wbGVtZW50YXRpb24gZm9yIENsb3NpbmdMaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIE1haW5DbG9zaW5nTGlzdGVuZXIgaW1wbGVtZW50cyBDbG9zaW5nSGVscGVyLkNsb3NpbmdTZXJ2ZXJGYWN0b3J5Cit7CisJLyoqCisgCSAqIE1haW4gZm9yIENsb3NpbmdMaXN0ZW5lci4KKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly8wLjAuMC4wOjQwMDYiOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IENsb3NpbmdIZWxwZXIubmV3TGlzdGVuZXIoIHVyaSwgbnVsbCwgbmV3IE1haW5DbG9zaW5nTGlzdGVuZXIoKSApOworCisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCQkKKwkJSW5ldFNvY2tldEFkZHJlc3MgbG9jYWxBZGRyID0gKEluZXRTb2NrZXRBZGRyZXNzKSBsaXN0ZW5lci50cmFuc3BvcnRRdWVyeSggVGNwTGlzdGVuZXIuTE9DQUxfQUREUkVTUyApOworCQlVUkwgdSA9IG5ldyBVUkwoICJ0Y3A6IiApOworCQl1LnNldEhvc3QoIGxvY2FsQWRkci5nZXRIb3N0TmFtZSgpICk7CisJCXUuc2V0UG9ydCggbG9jYWxBZGRyLmdldFBvcnQoKSApOworCQlsb2NhbFVyaSA9IHUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB1cmkgb2Ygb3VyIGxpc3RlbmVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsVXJpKCkKKwl7CisJCXJldHVybiBsb2NhbFVyaTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxvY2FsVXJpOworCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgTWFpbkNsb3NpbmdMaXN0ZW5lci4KKwkgKi8KKwlwdWJsaWMgTWFpbkNsb3NpbmdMaXN0ZW5lcigpCisJeworCQkvLyBOb3RoaW5nIHRvIGRvLgorCX0KKworCS8qKgorCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBDbG9zaW5nU2VydmVyLgorCSAqIEBwYXJhbSBjbGllbnQKKwkgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBzZXJ2ZXIuCisJICovCisJcHVibGljIENsb3NpbmdTZXJ2ZXIgbmV3Q2xvc2luZ1NlcnZlciggUmVtb3RlQ2xvc2luZ0NsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsQ2xvc2luZ1NlcnZlciggY2xpZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkN1YWVDbGllbnQuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5DdWFlQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkN2M1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5DdWFlQ2xpZW50LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgQ3VhZUNsaWVudC4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUKKyAqIGxpc3RlbmVyIGNyZWF0ZWQgYnkgTWFpbkN1YWVMaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIE1haW5DdWFlQ2xpZW50IGltcGxlbWVudHMgQ3VhZUhlbHBlci5DdWFlQ2xpZW50RmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgQ3VhZUNsaWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDA2IjsKKwkJaWYgKGFyZ3MubGVuZ3RoID4gMCkKKwkJCXVyaSA9IGFyZ3NbMF07CisKKwkJTWFpbkN1YWVDbGllbnQgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkN1YWVDbGllbnQoKTsKKwkJCisJCVJlbW90ZUN1YWVTZXJ2ZXIgc2VydmVyID0gQ3VhZUhlbHBlci5uZXdTZXJ2ZXIoIHVyaSwgbnVsbCwKKwkJCWltcGxGYWN0b3J5ICk7CisKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCisJCVN5c3RlbS5vdXQucHJpbnRsbiggIi0tLSBkb2l0MSggMjMgKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggImRvaXQxKCAyMyApID0+ICVzXG4iLAorCQkJc2VydmVyLmRvaXQxKCBuZXcgQ3VhZS5SZXF1ZXN0KCAyMyApICkgKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oICItLS0gZG9pdDEoIDIzLCBcInNraWRkb29cIiApIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICk7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiZG9pdDEoIDIzLCBcInNraWRkb29cIiApID0+ICVzXG4iLAorCQkJc2VydmVyLmRvaXQxKCBuZXcgQ3VhZS5SZXFXaXRoTWVzc2FnZSggMjMsICJza2lkZG9vIiApICkgKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oICItLS0gZG9pdDEoIDE5ICkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKwkJU3lzdGVtLm91dC5wcmludGYoICJkb2l0MSggMTkgKSA9PiAlc1xuIiwKKwkJCXNlcnZlci5kb2l0MSggbmV3IEN1YWUuUmVxdWVzdCggMTkgKSApICk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiLS0tIGRvaXQxKCAxMywgXCJ1bmx1Y2t5IGZyaWRheVwiICkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKwkJU3lzdGVtLm91dC5wcmludGYoICJkb2l0MSggMTMsIFwidW5sdWNreSBmcmlkYXlcIiApID0+ICVzXG4iLAorCQkJc2VydmVyLmRvaXQxKCBuZXcgQ3VhZS5SZXFXaXRoTWVzc2FnZSggMTMsICJ1bmx1Y2t5IGZyaWRheSIgKSApICk7CisJCQorCQlTeXN0ZW0ub3V0LnByaW50bG4oICItLS0gZG9pdCggWzIzXSApIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICk7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiZG9pdDMoIFsyM10gKSA9PiBbJXNdXG4iLAorCQkJc2VydmVyLmRvaXQzKCBuZXcgQ3VhZS5SZXF1ZXN0W10geyBuZXcgQ3VhZS5SZXF1ZXN0KCAyMyApIH0gKVswXSApOworCisJCVRocmVhZC5zbGVlcCggNjAqMTAwMCApOworCQkKKwkJc2VydmVyLl9zdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKwl9CisKKwlwdWJsaWMgQ3VhZUNsaWVudCBuZXdDdWFlQ2xpZW50KCBSZW1vdGVDdWFlU2VydmVyIHNlcnZlciApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgSW1wbEN1YWVDbGllbnQoIHNlcnZlciApOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5DdWFlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5DdWFlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTVhODM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkN1YWVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlbGl2ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgQ3VhZVNlcnZlci4gVGhpcyBwcm9ncmFtIG1ha2VzIGEgbGlzdGVuZXIgdG8gYWNjZXB0CisgKiBjb25uZWN0aW9ucyBmcm9tIE1haW5DdWFlQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpbkN1YWVMaXN0ZW5lciBpbXBsZW1lbnRzIE15Q3VhZUhlbHBlci5NeUN1YWVTZXJ2ZXJGYWN0b3J5Cit7CisJLyoqCisJICogTWFpbiBwcm9ncmFtIGZvciBDdWFlU2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cmluZyB1cmkgPSAidGNwOi8vMC4wLjAuMDo0MDA2IjsKKworCQlTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyID0gTXlDdWFlSGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsIG5ldyBNYWluQ3VhZUxpc3RlbmVyKCkgKTsKKworCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwl9CisKKwlwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgbmV3TXlDdWFlU2VydmVyKCBEZWxpdmVyeVNlcnZpY2UgZCwgUG9vbCBxdWV1ZWQsIFBvb2wgZnJlZSwKKwkJTXlWYWx1ZUZhY3RvcnlDdWFlIHZmICkKKwl7CisJCXJldHVybiBuZXcgTXlDdWFlU2VydmVyU3R1YiggZCwgcXVldWVkLCBmcmVlLCB2ZiApOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Gb29DbGllbnQuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Gb29DbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI1YTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkZvb0NsaWVudC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLlN0clN0ckhhc2hNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhci5CYXJEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouQmF6RGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuRm9vLkZvb0RhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvb0hlbHBlci5Gb29DbGllbnRGYWN0b3J5OworCisKKy8qKgorICogTWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgRm9vQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgTWFpbkZvb0NsaWVudCBpbXBsZW1lbnRzIEZvb0NsaWVudEZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIGZvciBGb29DbGllbnQKKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMSI7CisKKwkJUmVtb3RlRm9vU2VydmVyIHNlcnZlciA9IEZvb0hlbHBlci5uZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgbmV3IE1haW5Gb29DbGllbnQoKSApOworCQkKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCQkKKwkJU3RyU3RySGFzaE1hcCBiYXpUYWJsZSA9IG5ldyBTdHJTdHJIYXNoTWFwKCk7CisJCWJhelRhYmxlLnB1dCggImRlZiIsICJiYXoiICk7CisJCQorCQlTdHJTdHJIYXNoTWFwIGJhclRhYmxlID0gbmV3IFN0clN0ckhhc2hNYXAoKTsKKwkJYmFyVGFibGUucHV0KCAiZGVmIiwgImJhciIgKTsKKwkJCisJCVN0clN0ckhhc2hNYXAgZm9vVGFibGUgPSBuZXcgU3RyU3RySGFzaE1hcCgpOworCQlmb29UYWJsZS5wdXQoICJkZWYiLCAiZm9vIiApOworCQkKKwkJQmF6RGF0YSBiYXpEYXRhID0gbmV3IEJhekRhdGEoIDEsIGJhelRhYmxlICk7CisJCUJhckRhdGEgYmFyRGF0YSA9IG5ldyBCYXJEYXRhKCAyLCBiYXJUYWJsZSwgYmF6RGF0YSApOworCQlGb29EYXRhIGZvb0RhdGEgPSBuZXcgRm9vRGF0YSggMywgZm9vVGFibGUsIGJhckRhdGEsIGJhekRhdGEgKTsKKworCQlib29sZWFuIG9rOworCQkKKwkJb2sgPSBzZXJ2ZXIuYmF6MSggYmF6RGF0YSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJiYXoxID0+ICIrb2sgKTsKKwkJCisJCW9rID0gc2VydmVyLmJhejIoIGJhekRhdGEgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYmF6MiA9PiAiK29rICk7CisKKwkJb2sgPSBzZXJ2ZXIuYmFyMSggYmFyRGF0YSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJiYXIxID0+ICIrb2sgKTsKKwkJCisJCW9rID0gc2VydmVyLmJhcjIoIGJhckRhdGEgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYmFyMiA9PiAiK29rICk7CisJCQorCQlvayA9IHNlcnZlci5mb28xKCBmb29EYXRhICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImZvbzEgPT4gIitvayApOworCQkKKwkJb2sgPSBzZXJ2ZXIuZm9vMiggZm9vRGF0YSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJmb28yID0+ICIrb2sgKTsKKwkJCisJCXNlcnZlci5fc3RvcEFuZFdhaXREb3duKCA0MDAwICk7CisJfQorCisJcHVibGljIEZvb0NsaWVudCBuZXdGb29DbGllbnQoIFJlbW90ZUZvb1NlcnZlciBzZXJ2ZXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IEltcGxGb29DbGllbnQoIHNlcnZlciApOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Gb29MaXN0ZW5lci5qYXZhIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkZvb0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkZGRlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5Gb29MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvb0hlbHBlci5Gb29TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisKKy8qKgorICogTWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgRm9vTGlzdGVuZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluRm9vTGlzdGVuZXIgaW1wbGVtZW50cyBGb29TZXJ2ZXJGYWN0b3J5Cit7CisJLyoqCisgCSAqIE1haW4gZm9yIEZvb0xpc3RlbmVyLgorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmcgdXJpID0gInRjcDovLzAuMC4wLjA6NDAwMSI7CisKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IEZvb0hlbHBlci5uZXdMaXN0ZW5lciggdXJpLCBudWxsLCBuZXcgTWFpbkZvb0xpc3RlbmVyKCkgKTsKKworCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBNYWluRm9vTGlzdGVuZXIuCisJICovCisJcHVibGljIE1haW5Gb29MaXN0ZW5lcigpCisJeworCQkvLyBOb3RoaW5nIHRvIGRvLgorCX0KKworCS8qKgorCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBGb29TZXJ2ZXIuCisJICogQHBhcmFtIGNsaWVudAorCSAqLworCXB1YmxpYyBGb29TZXJ2ZXIgbmV3Rm9vU2VydmVyKCBSZW1vdGVGb29DbGllbnQgY2xpZW50ICkKKwl7CisJCXJldHVybiBuZXcgSW1wbEZvb1NlcnZlciggY2xpZW50ICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkluaGVyaXRhbmNlQ2xpZW50LmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWluSW5oZXJpdGFuY2VDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY5MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkluaGVyaXRhbmNlQ2xpZW50LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgSW5oZXJpdGFuY2VDbGllbnQuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlCisgKiBsaXN0ZW5lciBjcmVhdGVkIGJ5IE1haW5Jbmhlcml0YW5jZUxpc3RlbmVyLgorICovCitwdWJsaWMgY2xhc3MgTWFpbkluaGVyaXRhbmNlQ2xpZW50IGltcGxlbWVudHMgSW5oZXJpdGFuY2VIZWxwZXIuSW5oZXJpdGFuY2VDbGllbnRGYWN0b3J5Cit7CisJLyoqCisJICogTWFpbiBwcm9ncmFtIGZvciBJbmhlcml0YW5jZUNsaWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDAxIjsKKwkJaWYgKGFyZ3MubGVuZ3RoID4gMCkKKwkJCXVyaSA9IGFyZ3NbMF07CisKKwkJTWFpbkluaGVyaXRhbmNlQ2xpZW50IGltcGxGYWN0b3J5ID0gbmV3IE1haW5Jbmhlcml0YW5jZUNsaWVudCgpOworCQkKKwkJUmVtb3RlSW5oZXJpdGFuY2VTZXJ2ZXIgc2VydmVyID0gSW5oZXJpdGFuY2VIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsCisJCQlpbXBsRmFjdG9yeSApOworCisJCXNlcnZlci5fc3RhcnRBbmRXYWl0VXAoIDQwMDAgKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIEluc2VydCBZb3VyIENvZGUgSGVyZQorCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJc2VydmVyLl9zdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKwl9CisKKwlwdWJsaWMgSW5oZXJpdGFuY2VDbGllbnQgbmV3SW5oZXJpdGFuY2VDbGllbnQoIFJlbW90ZUluaGVyaXRhbmNlU2VydmVyIHNlcnZlciApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgSW1wbEluaGVyaXRhbmNlQ2xpZW50KCBzZXJ2ZXIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWluSW5oZXJpdGFuY2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkluaGVyaXRhbmNlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpbkluaGVyaXRhbmNlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVGNwTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgSW5oZXJpdGFuY2VTZXJ2ZXIuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGxpc3RlbmVyIHRvIGFjY2VwdAorICogY29ubmVjdGlvbnMgZnJvbSBNYWluSW5oZXJpdGFuY2VDbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluSW5oZXJpdGFuY2VMaXN0ZW5lciBpbXBsZW1lbnRzIEluaGVyaXRhbmNlSGVscGVyLkluaGVyaXRhbmNlU2VydmVyRmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgSW5oZXJpdGFuY2VTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiAidGNwOi8vMC4wLjAuMDo0MDAxIjsKKwkJCisJCVNlcnZlckZhY3RvcnkgbGlzdGVuZXIgPSBJbmhlcml0YW5jZUhlbHBlci5uZXdMaXN0ZW5lciggdXJpLCBudWxsLAorCQkJbmV3IE1haW5Jbmhlcml0YW5jZUxpc3RlbmVyKCkgKTsKKworCQlsaXN0ZW5lci50cmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnQuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKwkJCisJCUluZXRTb2NrZXRBZGRyZXNzIGxvY2FsQWRkciA9IChJbmV0U29ja2V0QWRkcmVzcykgbGlzdGVuZXIudHJhbnNwb3J0UXVlcnkoIFRjcExpc3RlbmVyLkxPQ0FMX0FERFJFU1MgKTsKKwkJVVJMIHUgPSBuZXcgVVJMKCAidGNwOiIgKTsKKwkJdS5zZXRIb3N0KCBsb2NhbEFkZHIuZ2V0SG9zdE5hbWUoKSApOworCQl1LnNldFBvcnQoIGxvY2FsQWRkci5nZXRQb3J0KCkgKTsKKwkJbG9jYWxVcmkgPSB1LnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBsb2NhbCB1cmkgb2YgdGhlIGxpc3RlbmVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsVXJpOworCisJcHVibGljIEluaGVyaXRhbmNlU2VydmVyIG5ld0luaGVyaXRhbmNlU2VydmVyKCBSZW1vdGVJbmhlcml0YW5jZUNsaWVudCBjbGllbnQgKQorCXsKKwkJcmV0dXJuIG5ldyBJbXBsSW5oZXJpdGFuY2VTZXJ2ZXIoIGNsaWVudCApOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5UeXBlc0NsaWVudC5qYXZhIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTWFpblR5cGVzQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxZmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5UeXBlc0NsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CisKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgVHlwZXNDbGllbnQuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlCisgKiBsaXN0ZW5lciBjcmVhdGVkIGJ5IE1haW5UeXBlc0xpc3RlbmVyLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKK3B1YmxpYyBjbGFzcyBNYWluVHlwZXNDbGllbnQgaW1wbGVtZW50cyBUeXBlc0hlbHBlci5UeXBlc0NsaWVudEZhY3RvcnkKK3sKKwkvKioKKwkgKiBNYWluIHByb2dyYW0gZm9yIFR5cGVzQ2xpZW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cmluZyB1cmkgPSAidGNwOi8vbG9jYWxob3N0OjQwMDEiOworCQlpZiAoYXJncy5sZW5ndGggPiAwKQorCQkJdXJpID0gYXJnc1swXTsKKworCQlNYWluVHlwZXNDbGllbnQgaW1wbEZhY3RvcnkgPSBuZXcgTWFpblR5cGVzQ2xpZW50KCk7CisJCQorCQlSZW1vdGVUeXBlc1NlcnZlciBzZXJ2ZXIgPSBUeXBlc0hlbHBlci5uZXdTZXJ2ZXIoIHVyaSwgbnVsbCwKKwkJCWltcGxGYWN0b3J5ICk7CisKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCisJCU1hcCBtYXAxID0gbmV3IEhhc2hNYXAoKTsKKwkJbWFwMS5wdXQoICJhIiwgMTIzNDU2NzggKTsKKwkJbWFwMS5wdXQoICJiIiwgdHJ1ZSApOworCQltYXAxLnB1dCggImMiLCAxNS41ICk7CisJCW1hcDEucHV0KCAiZCIsICJ4eXoiICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggIm1hcDEgPSAiK21hcDEgKTsKKwkJTWFwIG1hcDIgPSBzZXJ2ZXIudGVzdDEoIG1hcDEgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibWFwMiA9ICIrbWFwMiApOworCQlBc3NlcnRpb24uY2hlY2soIG1hcDEuZXF1YWxzKCBtYXAyICksICJtYXAxLmVxdWFscyggbWFwMiApIiApOworCQltYXAxID0gbnVsbDsKKwkJbWFwMiA9IG51bGw7CisJCQorCQlNYXAgZm9vID0gbmV3IEhhc2hNYXAoKTsKKwkJZm9vLnB1dCggImFiYyIsIDEyMyApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJmb28xID0gIitmb28gKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiZm9vMiA9ICIrc2VydmVyLnRlc3QxKCBmb28gKSApOworCQlmb28gPSBudWxsOworCQkKKwkJTWFwIGJhciA9IG5ldyBIYXNoTWFwKCk7CisJCWJhci5wdXQoIDEyMywgImFiYyIgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYmFyMSA9ICIrYmFyICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImJhcjIgPSAiK3NlcnZlci50ZXN0MSggYmFyICkgKTsKKwkJYmFyID0gbnVsbDsKKwkJCisJCU1hcCBiYXogPSBuZXcgVHJlZU1hcCgpOworCQliYXoucHV0KCA3ODksICJnaGkiICk7CisJCWJhei5wdXQoIDEyMywgImFiYyIgKTsKKwkJYmF6LnB1dCggNDU2LCAiZGVmIiApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJiYXoxID0gIitiYXogKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiYmF6MiA9ICIrc2VydmVyLnRlc3QxKCBiYXogKSApOworCQliYXogPSBudWxsOworCQkKKwkJU2V0IHNldDEgPSBuZXcgSGFzaFNldCgpOworCQlzZXQxLmFkZCggMTIzNDU2NzggKTsKKwkJc2V0MS5hZGQoIHRydWUgKTsKKwkJc2V0MS5hZGQoIDE1LjUgKTsKKwkJc2V0MS5hZGQoICJ4eXoiICk7CisJCVNldCBzZXQyID0gc2VydmVyLnRlc3QyKCBzZXQxICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggInNldDEgPSAiK3NldDEgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAic2V0MiA9ICIrc2V0MiApOworCQlBc3NlcnRpb24uY2hlY2soIHNldDEuZXF1YWxzKCBzZXQyICksICJzZXQxLmVxdWFscyggc2V0MiApIiApOworCQlzZXQxID0gbnVsbDsKKwkJc2V0MiA9IG51bGw7CisJCQorCQlMaXN0IGxpc3QxID0gbmV3IEFycmF5TGlzdCgpOworCQlsaXN0MS5hZGQoIDEyMzQ1Njc4ICk7CisJCWxpc3QxLmFkZCggdHJ1ZSApOworCQlsaXN0MS5hZGQoIDE1LjUgKTsKKwkJbGlzdDEuYWRkKCAieHl6IiApOworCQlMaXN0IGxpc3QyID0gc2VydmVyLnRlc3QzKCBsaXN0MSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJsaXN0MSA9ICIrbGlzdDEgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAibGlzdDIgPSAiK2xpc3QyICk7CisJCUFzc2VydGlvbi5jaGVjayggbGlzdDEuZXF1YWxzKCBsaXN0MiApLCAibGlzdDEuZXF1YWxzKCBsaXN0MiApIiApOworCQlsaXN0MSA9IG51bGw7CisJCWxpc3QyID0gbnVsbDsKKwkJCisJCURhdGUgZGF0ZXRpbWUxID0gbmV3IERhdGUoKTsKKwkJRGF0ZSBkYXRldGltZTIgPSBzZXJ2ZXIudGVzdDQoIGRhdGV0aW1lMSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJkYXRldGltZTEgPSAiK2RhdGV0aW1lMSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJkYXRldGltZTIgPSAiK2RhdGV0aW1lMiApOworCQlBc3NlcnRpb24uY2hlY2soIGRhdGV0aW1lMS5lcXVhbHMoIGRhdGV0aW1lMiApLCAiZGF0ZXRpbWUxLmVxdWFscyggZGF0ZXRpbWUyICkiICk7CisJCWRhdGV0aW1lMSA9IG51bGw7CisJCWRhdGV0aW1lMiA9IG51bGw7CisJCQorCQlzZXJ2ZXIuX3N0b3BBbmRXYWl0RG93biggNDAwMCApOworCX0KKworCXB1YmxpYyBUeXBlc0NsaWVudCBuZXdUeXBlc0NsaWVudCggUmVtb3RlVHlwZXNTZXJ2ZXIgc2VydmVyICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIG5ldyBJbXBsVHlwZXNDbGllbnQoIHNlcnZlciApOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01haW5UeXBlc0xpc3RlbmVyLmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWluVHlwZXNMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzM4YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWluVHlwZXNMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UcmFuc3BvcnQ7CisKKworCisvKioKKyAqIE1haW4gcHJvZ3JhbSBmb3IgVHlwZXNTZXJ2ZXIuIFRoaXMgcHJvZ3JhbSBtYWtlcyBhIGxpc3RlbmVyIHRvIGFjY2VwdAorICogY29ubmVjdGlvbnMgZnJvbSBNYWluVHlwZXNDbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluVHlwZXNMaXN0ZW5lciBpbXBsZW1lbnRzIFR5cGVzSGVscGVyLlR5cGVzU2VydmVyRmFjdG9yeQoreworCS8qKgorCSAqIE1haW4gcHJvZ3JhbSBmb3IgVHlwZXNTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly8wLjAuMC4wOjQwMDEiOworCQkKKwkJU2VydmVyRmFjdG9yeSBsaXN0ZW5lciA9IFR5cGVzSGVscGVyLm5ld0xpc3RlbmVyKCB1cmksIG51bGwsCisJCQluZXcgTWFpblR5cGVzTGlzdGVuZXIoKSApOworCisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCApOworCX0KKworCXB1YmxpYyBUeXBlc1NlcnZlciBuZXdUeXBlc1NlcnZlciggUmVtb3RlVHlwZXNDbGllbnQgY2xpZW50ICkKKwl7CisJCXJldHVybiBuZXcgSW1wbFR5cGVzU2VydmVyKCBjbGllbnQgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWtlQmlnSWRsLmphdmEgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NYWtlQmlnSWRsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0NWFmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL01ha2VCaWdJZGwuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBQcm9ncmFtIHRvIGNvbnN0cnVjdCBhIGxhcmdlIGlkbCBmaWxlIGZvciB0ZXN0aW5nIGxpbWl0cy4KKyAqLworcHVibGljIGNsYXNzIE1ha2VCaWdJZGwKK3sKKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlpbnQgbiA9IDEwMDA7CisJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKCBuZXcgRmlsZVdyaXRlciggInNyYy9ldGNoL2V4YW1wbGVzL2JpZ2lkbC9CaWdJZGwuZXRjaCIgKSApOworCQlwdy5wcmludGxuKCAibW9kdWxlIGV0Y2guZXhhbXBsZXMuYmlnaWRsIiApOworCQlwdy5wcmludGxuKCAic2VydmljZSBCaWdJZGwiICk7CisJCXB3LnByaW50bG4oICJ7IiApOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCXB3LnByaW50ZiggIlx0aW50IGFkZCVkKCBpbnQgeCwgaW50IHkgKVxuIiwgaSApOworCQlwdy5wcmludGxuKCAifSIgKTsKKwkJcHcuY2xvc2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NeUN1YWVIZWxwZXIuamF2YSBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL015Q3VhZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGJmZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NeUN1YWVIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWZhdWx0U2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LkRlbGl2ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuRGVmYXVsdERlbGl2ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuTWFpbGJveE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlBsYWluTWFpbGJveE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlNlc3Npb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnRyYW5zcG9ydC5UcmFuc3BvcnRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKKworCisKKy8qKgorICogVHJhbnNwb3J0IGhlbHBlciBmb3IgQ3VhZS4gQWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIE15Q3VhZUhlbHBlciBleHRlbmRzIEN1YWVIZWxwZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IHNlcnZlciBzZXNzaW9uIGxpc3RlbmVyIHBlciBzcGVjaWZpY2F0aW9ucyBpbiB1cmkgYW5kCisJICogcmVzb3VyY2VzLiBUaGlzIGxpc3RlbmVyIHdpbGwgYWNjZXB0IHJlcXVlc3RzIGZyb20gY2xpZW50cyBmb3IgbmV3IHNlcnZlcgorCSAqIHNlc3Npb25zLgorCSAqCisJICogQHBhcmFtIHVyaSBjb250YWlucyBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIHNlcnZlciBzZXNzaW9uIGxpc3RlbmVyIGFuZAorCSAqIGZvciB0aGUgc2VydmVyIHNlc3Npb24gdHJhbnNwb3J0IHN0YWNrLgorCSAqCisJICogQHBhcmFtIHJlc291cmNlcyBhZGRpdGlvbmFsIHJlc291cmNlcyB0byBhaWQgaW4gY29uc3RydWN0aW5nIG5ldyBzZXJ2ZXIKKwkgKiBzZXNzaW9ucy4KKwkgKgorCSAqIEBwYXJhbSBpbXBsRmFjdG9yeSBmYWN0b3J5IHVzZWQgdG8gY29uc3RydWN0IGEgbmV3IGluc3RhbmNlIGltcGxlbWVudGluZworCSAqIEN1YWVTZXJ2ZXIuIFRoZSBuZXcgaW5zdGFuY2Ugd2lsbCByZWNlaXZlIGFuZCBwcm9jZXNzIG1lc3NhZ2VzIGZyb20KKwkgKiB0aGUgY2xpZW50IHNlc3Npb24uCisJICoKKwkgKiBAcmV0dXJuIGEgc2VydmVyIHNlc3Npb24gbGlzdGVuZXIuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgU2VydmVyRmFjdG9yeSBuZXdMaXN0ZW5lciggZmluYWwgU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcywKKwkJZmluYWwgTXlDdWFlU2VydmVyRmFjdG9yeSBpbXBsRmFjdG9yeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIFJlc291cmNlcyByZXMgPSBpbml0UmVzb3VyY2VzKCByZXNvdXJjZXMgKTsKKworCQlUcmFuc3BvcnQ8U2VydmVyRmFjdG9yeT4gbGlzdGVuZXIgPSAgVHJhbnNwb3J0RmFjdG9yeS5nZXRMaXN0ZW5lciggdXJpLCByZXMgKTsKKwkJCisJCXJldHVybiBuZXcgRGVmYXVsdFNlcnZlckZhY3RvcnkoIGxpc3RlbmVyLCBpbXBsRmFjdG9yeSApCisJCXsKKwkJCXB1YmxpYyB2b2lkIG5ld1NlcnZlciggVHJhbnNwb3J0TWVzc2FnZSB0LCBTdHJpbmcgdXJpLCBSZXNvdXJjZXMgciApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlWYWx1ZUZhY3RvcnkgdmYgPSAoVmFsdWVGYWN0b3J5KSByLmdldCggVHJhbnNwb3J0LlZBTFVFX0ZBQ1RPUlkgKTsKKwkJCQlNYWlsYm94TWFuYWdlciB4ID0gbmV3IFBsYWluTWFpbGJveE1hbmFnZXIoIHQsIHVyaSwgciApOworCQkJCURlbGl2ZXJ5U2VydmljZSBkID0gbmV3IERlZmF1bHREZWxpdmVyeVNlcnZpY2UoIHgsIHVyaSwgciApOworCQkJCVBvb2wgcXAgPSAoUG9vbCkgci5nZXQoIFFVRVVFRF9QT09MICk7CisJCQkJUG9vbCBmcCA9IChQb29sKSByLmdldCggRlJFRV9QT09MICk7CisJCQkJaW1wbEZhY3RvcnkubmV3TXlDdWFlU2VydmVyKCBkLCBxcCwgZnAsIChNeVZhbHVlRmFjdG9yeUN1YWUpIHZmICk7CisJCQkJZC50cmFuc3BvcnRDb250cm9sKCBTVEFSVCwgbnVsbCApOworCQkJfQorCisJCQlwdWJsaWMgVmFsdWVGYWN0b3J5IG5ld1ZhbHVlRmFjdG9yeSggU3RyaW5nIHVyaSApCisJCQl7CisJCQkJcmV0dXJuIG5ldyBNeVZhbHVlRmFjdG9yeUN1YWUoIHVyaSApOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIEZhY3RvcnkgZm9yIGEgTGlzdGVuZXIgdG8gdXNlIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIE15Q3VhZVNlcnZlci4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIE15Q3VhZVNlcnZlckZhY3RvcnkKKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gc3ZjCisJCSAqIEBwYXJhbSBxcAorCQkgKiBAcGFyYW0gZnAKKwkJICogQHBhcmFtIHZmCisJCSAqIEByZXR1cm4gYSBTdHViSW50ZiB0aGF0IGFjY2VwdHMgYW5kIHByb2Nlc3NlcyBzZXJ2ZXIgbWVzc2FnZXMuCisJCSAqLworCQlwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgbmV3TXlDdWFlU2VydmVyKCBEZWxpdmVyeVNlcnZpY2Ugc3ZjLCBQb29sIHFwLAorCQkJUG9vbCBmcCwgTXlWYWx1ZUZhY3RvcnlDdWFlIHZmICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTXlDdWFlU2VydmVyU3R1Yi5qYXZhIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTXlDdWFlU2VydmVyU3R1Yi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Zjk5YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9NeUN1YWVTZXJ2ZXJTdHViLmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuU3RydWN0VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWxpdmVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuT2JqU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TdHViQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlN0dWJIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVG9kbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Ub2RvTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKKworCisvKioKKyAqIEhhbmQtYnVpbHQgQ3VhZVNlcnZlclN0dWIgd2hpY2ggZGlzcGF0Y2hlcyB0byBvdXIgcmF3IGltcGwuCisgKi8KK3B1YmxpYyBjbGFzcyBNeUN1YWVTZXJ2ZXJTdHViIGV4dGVuZHMgU3R1YkJhc2U8T2JqZWN0PgoreworCXN0YXRpYworCXsKKwkJU3R1YkhlbHBlcjxNeUN1YWVTZXJ2ZXJJbXBsPiBzeW5jSGVscGVyID0gbmV3IFN0dWJIZWxwZXI8TXlDdWFlU2VydmVySW1wbD4oKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1biggRGVsaXZlcnlTZXJ2aWNlIHN2YywgTXlDdWFlU2VydmVySW1wbCBvYmosIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCW9iai5kaXNwYXRjaCggc2VuZGVyLCBtc2cgKTsKKwkJCX0KKwkJfTsKKwkJCisJCU15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdDEKKwkJCS5zZXRTdHViSGVscGVyKCBzeW5jSGVscGVyICk7CisJCQorCQlNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX3Rlc3QxCisJCQkuc2V0U3R1YkhlbHBlciggc3luY0hlbHBlciApOworCQkKKwkJTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9kb2l0MworCQkJLnNldFN0dWJIZWxwZXIoIHN5bmNIZWxwZXIgKTsKKwkJCisJCU15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDQKKwkJCS5zZXRTdHViSGVscGVyKCBzeW5jSGVscGVyICk7CisJCQorCQlNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX3Rlc3QzCisJCQkuc2V0U3R1YkhlbHBlciggc3luY0hlbHBlciApOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIE15Q3VhZVNlcnZlclN0dWIuCisJICogQHBhcmFtIHN2YworCSAqIEBwYXJhbSBxdWV1ZWQKKwkgKiBAcGFyYW0gZnJlZQorCSAqIEBwYXJhbSB2ZiAKKwkgKi8KKwlwdWJsaWMgTXlDdWFlU2VydmVyU3R1YiggRGVsaXZlcnlTZXJ2aWNlIHN2YywgUG9vbCBxdWV1ZWQsIFBvb2wgZnJlZSwKKwkJTXlWYWx1ZUZhY3RvcnlDdWFlIHZmICkKKwl7CisJCXN1cGVyKCBzdmMsIG5ldyBNeUN1YWVTZXJ2ZXJJbXBsKCBzdmMsIHZmICksIHF1ZXVlZCwgZnJlZSApOworCX0KKworCS8qKgorCSAqIEhhbmQtYnVpbGQgQ3VhZVNlcnZlckltcGwgd2hpY2ggaXMgc2VudCBtZXNzYWdlcyBmcm9tIEN1YWVTZXJ2ZXJTdHViLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDdWFlU2VydmVySW1wbCBpbXBsZW1lbnRzIE9ialNlc3Npb24KKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gc3ZjCisJCSAqIEBwYXJhbSB2ZiAKKwkJICovCisJCXB1YmxpYyBNeUN1YWVTZXJ2ZXJJbXBsKCBEZWxpdmVyeVNlcnZpY2Ugc3ZjLCBNeVZhbHVlRmFjdG9yeUN1YWUgdmYgKQorCQl7CisJCQl0aGlzLnN2YyA9IHN2YzsKKwkJCXRoaXMudmYgPSB2ZjsKKwkJfQorCQkKKwkJLyoqICovCisJCWZpbmFsIERlbGl2ZXJ5U2VydmljZSBzdmM7CisJCQorCQkvKiogKi8KKwkJZmluYWwgTXlWYWx1ZUZhY3RvcnlDdWFlIHZmOworCQkKKwkJLyoqCisJCSAqIEhhbmRsZSBtZXNzYWdlcyBmcm9tIHBlZXIuCisJCSAqIEBwYXJhbSBzZW5kZXIKKwkJICogQHBhcmFtIG1zZworCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHZvaWQgZGlzcGF0Y2goIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJtc2cgPSAiK21zZyApOworCQkJaWYgKG1zZy5pc1R5cGUoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdDEgKSkKKwkJCXsKKwkJCQlTdHJ1Y3RWYWx1ZSByZXEgPSAoU3RydWN0VmFsdWUpIG1zZy5nZXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfcmVxICk7CisJCQkJTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXF1ZXN0LmNoZWNrSXNBc3NpZ25hYmxlRnJvbSggcmVxLnR5cGUoKSApOworCQkJCWludCBjb2RlID0gKEludGVnZXIpIHJlcS5nZXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfY29kZSApOworCQkJCQorCQkJCVN0cnVjdFZhbHVlIHJlc3A7CisJCQkJc3dpdGNoIChjb2RlKQorCQkJCXsKKwkJCQkJY2FzZSAyMzoKKwkJCQkJCXJlc3AgPSBuZXcgU3RydWN0VmFsdWUoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UsIHZmICk7CisJCQkJCQlyZXNwLnB1dCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9tc2csICJmb28iICk7CisJCQkJCQlkZWxheURvaXQyYSggNyApOworCQkJCQkJYnJlYWs7CisJCQkJCQorCQkJCQljYXNlIDE5OgorCQkJCQkJcmVzcCA9IG5ldyBTdHJ1Y3RWYWx1ZSggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwV2l0aENvZGUsIHZmICk7CisJCQkJCQlyZXNwLnB1dCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9tc2csICJiYXIiICk7CisJCQkJCQlyZXNwLnB1dCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9jb2RlLCA1NCApOworCQkJCQkJZGVsYXlEb2l0MmIoIDExLCAiaGVhdmVuIiApOworCQkJCQkJYnJlYWs7CisJCQkJCQorCQkJCQljYXNlIDEzOgorCQkJCQkJcmVzcCA9IG5ldyBTdHJ1Y3RWYWx1ZSggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZSwgdmYgKTsKKwkJCQkJCXJlc3AucHV0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX21zZywgImJheiIgKTsKKwkJCQkJCWRlbGF5RG9pdDJhKCA5OSApOworCQkJCQkJYnJlYWs7CisJCQkJCQorCQkJCQlkZWZhdWx0OgorCQkJCQkJcmVzcCA9IG5ldyBTdHJ1Y3RWYWx1ZSggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwV2l0aENvZGUsIHZmICk7CisJCQkJCQlyZXNwLnB1dCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9tc2csICJ1bmtub3duIGNvZGUgIiArIGNvZGUgKTsKKwkJCQkJCXJlc3AucHV0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX2NvZGUsIDYzICk7CisJCQkJCQlkZWxheURvaXQyYiggMjMsICJraWxsZXIgYmVlIiApOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCQorCQkJCQorCQkJCU1lc3NhZ2Ugcm1zZyA9IG1zZy5yZXBseSgpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggInJtc2cgPSAiK3Jtc2cgKTsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJyZXNwID0gIityZXNwICk7CisJCQkJcm1zZy5wdXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfcmVzdWx0LCByZXNwICk7CisJCQkJc3ZjLnRyYW5zcG9ydE1lc3NhZ2UoIHNlbmRlciwgcm1zZyApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaWYgKG1zZy5pc1R5cGUoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDMgKSkKKwkJCXsKKwkJCQlTdHJ1Y3RWYWx1ZVtdIHJlcXMgPSAoU3RydWN0VmFsdWVbXSkgbXNnLmdldCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9yZXEgKTsKKwkJCQlTdHJ1Y3RWYWx1ZSByZXEgPSByZXFzWzBdOworCQkJCU15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVxdWVzdC5jaGVja0lzQXNzaWduYWJsZUZyb20oIHJlcS50eXBlKCkgKTsKKwkJCQlpbnQgY29kZSA9IChJbnRlZ2VyKSByZXEuZ2V0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX2NvZGUgKTsKKwkJCQkKKwkJCQlTdHJ1Y3RWYWx1ZSByZXNwOworCQkJCXN3aXRjaCAoY29kZSkKKwkJCQl7CisJCQkJCWNhc2UgMjM6CisJCQkJCQlyZXNwID0gbmV3IFN0cnVjdFZhbHVlKCBNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlLCB2ZiApOworCQkJCQkJcmVzcC5wdXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCAiZm9vIiApOworCQkJCQkJZGVsYXlEb2l0MmEoIDcgKTsKKwkJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkJY2FzZSAxOToKKwkJCQkJCXJlc3AgPSBuZXcgU3RydWN0VmFsdWUoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcFdpdGhDb2RlLCB2ZiApOworCQkJCQkJcmVzcC5wdXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCAiYmFyIiApOworCQkJCQkJcmVzcC5wdXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfY29kZSwgNTQgKTsKKwkJCQkJCWRlbGF5RG9pdDJiKCAxMSwgImhlYXZlbiIgKTsKKwkJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkJY2FzZSAxMzoKKwkJCQkJCXJlc3AgPSBuZXcgU3RydWN0VmFsdWUoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UsIHZmICk7CisJCQkJCQlyZXNwLnB1dCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9tc2csICJiYXoiICk7CisJCQkJCQlkZWxheURvaXQyYSggOTkgKTsKKwkJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJlc3AgPSBuZXcgU3RydWN0VmFsdWUoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcFdpdGhDb2RlLCB2ZiApOworCQkJCQkJcmVzcC5wdXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCAidW5rbm93biBjb2RlICIgKyBjb2RlICk7CisJCQkJCQlyZXNwLnB1dCggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tZl9jb2RlLCA2MyApOworCQkJCQkJZGVsYXlEb2l0MmIoIDIzLCAia2lsbGVyIGJlZSIgKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCQkKKwkJCQlNZXNzYWdlIHJtc2cgPSBtc2cucmVwbHkoKTsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oICJybXNnID0gIitybXNnICk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCAicmVzcCA9ICIrcmVzcCApOworCQkJCXJtc2cucHV0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX3Jlc3VsdCwgbmV3IFN0cnVjdFZhbHVlW10geyByZXNwIH0gKTsKKwkJCQlzdmMudHJhbnNwb3J0TWVzc2FnZSggc2VuZGVyLCBybXNnICk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAidW5rbm93biBtc2cgdHlwZSAiK21zZyApOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIGRlbGF5RG9pdDJhKCBmaW5hbCBpbnQgY29kZSApCisJCXsKKwkJCXRyeQorCQkJeworCQkJCVRvZG9NYW5hZ2VyLmFkZFRvZG8oIG5ldyBUb2RvKCkKKwkJCQl7CisJCQkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG1nciApIHRocm93cyBFeGNlcHRpb24KKwkJCQkJeworCQkJCQkJU3RydWN0VmFsdWUgcmVxID0gbmV3IFN0cnVjdFZhbHVlKCBNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QsIHZmICk7CisJCQkJCQlyZXEucHV0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX2NvZGUsIGNvZGUgKTsKKwkJCQkJCQorCQkJCQkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9kb2l0MiwgdmYgKTsKKwkJCQkJCW1zZy5wdXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfcmVxLCByZXEgKTsKKwkJCQkJCQorCQkJCQkJTWFpbGJveCBtYiA9IHN2Yy5iZWdpbmNhbGwoIG1zZyApOworCQkJCQkJT2JqZWN0IHZhbHVlID0gc3ZjLmVuZGNhbGwoIG1iLCBNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIgKTsKKwkJCQkJCQorCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRXhjZXB0aW9uKQorCQkJCQkJeworCQkJCQkJCUV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbikgdmFsdWU7CisJCQkJCQkJZS5maWxsSW5TdGFja1RyYWNlKCk7CisJCQkJCQkJdGhyb3cgZTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU3RydWN0VmFsdWUgcmVzcCA9IChTdHJ1Y3RWYWx1ZSkgdmFsdWU7CisJCQkJCQlNeVZhbHVlRmFjdG9yeUN1YWUuX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlLmNoZWNrSXNBc3NpZ25hYmxlRnJvbSggcmVzcC50eXBlKCkgKTsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRmKCAiKioqKiBkZWxheURvaXQyYTogcmVxICVkIHJlc3BvbnNlICVzXG4iLCBjb2RlLCByZXNwICk7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgdm9pZCBleGNlcHRpb24oIFRvZG9NYW5hZ2VyIG1nciwgRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQl9CisJCQkJfSApOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBkZWxheURvaXQyYiggZmluYWwgaW50IGNvZGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJVG9kb01hbmFnZXIuYWRkVG9kbyggbmV3IFRvZG8oKQorCQkJCXsKKwkJCQkJcHVibGljIHZvaWQgZG9pdCggVG9kb01hbmFnZXIgbWdyICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJCQl7CisJCQkJCQlTdHJ1Y3RWYWx1ZSByZXEgPSBuZXcgU3RydWN0VmFsdWUoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVxV2l0aE1lc3NhZ2UsIHZmICk7CisJCQkJCQlyZXEucHV0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX2NvZGUsIGNvZGUgKTsKKwkJCQkJCXJlcS5wdXQoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbWZfbXNnLCBtZXNzYWdlICk7CisJCQkJCQkKKwkJCQkJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIE15VmFsdWVGYWN0b3J5Q3VhZS5fbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfZG9pdDIsIHZmICk7CisJCQkJCQltc2cucHV0KCBNeVZhbHVlRmFjdG9yeUN1YWUuX21mX3JlcSwgcmVxICk7CisJCQkJCQkKKwkJCQkJCU1haWxib3ggbWIgPSBzdmMuYmVnaW5jYWxsKCBtc2cgKTsKKwkJCQkJCU9iamVjdCB2YWx1ZSA9IHN2Yy5lbmRjYWxsKCBtYiwgTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9fcmVzdWx0X2RvaXQyICk7CisJCQkJCQkKKwkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKKwkJCQkJCXsKKwkJCQkJCQlFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pIHZhbHVlOworCQkJCQkJCWUuZmlsbEluU3RhY2tUcmFjZSgpOworCQkJCQkJCXRocm93IGU7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCVN0cnVjdFZhbHVlIHJlc3AgPSAoU3RydWN0VmFsdWUpIHZhbHVlOworCQkJCQkJTXlWYWx1ZUZhY3RvcnlDdWFlLl9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZS5jaGVja0lzQXNzaWduYWJsZUZyb20oIHJlc3AudHlwZSgpICk7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50ZiggIioqKiogZGVsYXlEb2l0MmI6IHJlcSAlZCByZXNwb25zZSAlc1xuIiwgY29kZSwgcmVzcCApOworCQkJCQl9CisKKwkJCQkJcHVibGljIHZvaWQgZXhjZXB0aW9uKCBUb2RvTWFuYWdlciBtZ3IsIEV4Y2VwdGlvbiBlICkKKwkJCQkJeworCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJfQorCQkJCX0gKTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IF9zZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBxdWVyeSAiK3F1ZXJ5ICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBfc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBfc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBUaHJvd2FibGUpCisJCQkJKChUaHJvd2FibGUpIGV2ZW50KS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL015VmFsdWVGYWN0b3J5Q3VhZS5qYXZhIGIvdGVzdHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvTXlWYWx1ZUZhY3RvcnlDdWFlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5NTZlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL015VmFsdWVGYWN0b3J5Q3VhZS5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5JbXBvcnRFeHBvcnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5DbGFzczJUeXBlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuRGVmYXVsdFZhbHVlRmFjdG9yeTsKKworLyoqCisgKiBWYWx1ZUZhY3RvcnkgZm9yIEN1YWUuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorcHVibGljIGZpbmFsIGNsYXNzIE15VmFsdWVGYWN0b3J5Q3VhZSBleHRlbmRzIERlZmF1bHRWYWx1ZUZhY3RvcnkKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIFZhbHVlRmFjdG9yeVRlc3QxLgorCSAqLworCXB1YmxpYyBNeVZhbHVlRmFjdG9yeUN1YWUoIFN0cmluZyB1cmkgKQorCXsKKwkJc3VwZXIoIHVyaSwgdHlwZXMsIGNsYXNzMnR5cGUgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVHlwZU1hcCB0eXBlcyA9IG5ldyBUeXBlTWFwKCk7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3MyVHlwZU1hcCBjbGFzczJ0eXBlID0gbmV3IENsYXNzMlR5cGVNYXAoKTsKKworCXN0YXRpYworCXsKKwkJRGVmYXVsdFZhbHVlRmFjdG9yeS5pbml0KCB0eXBlcywgY2xhc3MydHlwZSApOworCQlpbml0VHlwZXMoKTsKKwkJaW5pdFJlc3VsdHMoKTsKKwkJaW5pdEZpZWxkcygpOworCQlpbml0UGFyYW1zKCk7CisJfQorCisJLyoqIFR5cGUgZm9yIGV0Y2guZXhhbXBsZXMuY3VhZS5DdWFlLlJlcXVlc3QgKi8KKwlwdWJsaWMgc3RhdGljIFR5cGUgX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3Q7CisKKwkvKiogVHlwZSBmb3IgZXRjaC5leGFtcGxlcy5jdWFlLkN1YWUuUmVxV2l0aE1lc3NhZ2UgKi8KKwlwdWJsaWMgc3RhdGljIFR5cGUgX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcVdpdGhNZXNzYWdlOworCisJLyoqIFR5cGUgZm9yIGV0Y2guZXhhbXBsZXMuY3VhZS5DdWFlLlJlc3BvbnNlICovCisJcHVibGljIHN0YXRpYyBUeXBlIF9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZTsKKworCS8qKiBUeXBlIGZvciBldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZS5SZXNwV2l0aENvZGUgKi8KKwlwdWJsaWMgc3RhdGljIFR5cGUgX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BXaXRoQ29kZTsKKworCS8qKiBUeXBlIGZvciBldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5kb2l0MSAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdDE7CisKKwkvKiogVHlwZSBmb3IgZXRjaC5leGFtcGxlcy5jdWFlLkN1YWVDbGllbnQuX3Jlc3VsdF9kb2l0MSAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfX3Jlc3VsdF9kb2l0MTsKKworCS8qKiBUeXBlIGZvciBldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZUNsaWVudC5kb2l0MiAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfZG9pdDI7CisKKwkvKiogVHlwZSBmb3IgZXRjaC5leGFtcGxlcy5jdWFlLkN1YWVTZXJ2ZXIuX3Jlc3VsdF9kb2l0MiAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfX3Jlc3VsdF9kb2l0MjsKKworCS8qKiBUeXBlIGZvciBldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZS5kb2l0MyAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDM7CisKKwkvKiogVHlwZSBmb3IgZXRjaC5leGFtcGxlcy5jdWFlLkN1YWUuX3Jlc3VsdF9kb2l0MyAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0MzsKKworCS8qKiBUeXBlIGZvciBldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZS5kb2l0NCAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDQ7CisKKwkvKiogVHlwZSBmb3IgZXRjaC5leGFtcGxlcy5jdWFlLkN1YWUuX3Jlc3VsdF9kb2l0NCAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0NDsKKworCS8qKiBUeXBlIGZvciBldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci50ZXN0MSAqLworCXB1YmxpYyBzdGF0aWMgVHlwZSBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfdGVzdDE7CisKKwkvKiogVHlwZSBmb3IgZXRjaC5leGFtcGxlcy5jdWFlLkN1YWVDbGllbnQudGVzdDIgKi8KKwlwdWJsaWMgc3RhdGljIFR5cGUgX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X3Rlc3QyOworCisJLyoqIFR5cGUgZm9yIGV0Y2guZXhhbXBsZXMuY3VhZS5DdWFlLnRlc3QzICovCisJcHVibGljIHN0YXRpYyBUeXBlIF9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV90ZXN0MzsKKworCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFR5cGVzKCkKKwl7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXF1ZXN0ID0gdHlwZXMuZ2V0KCAiZXRjaC5leGFtcGxlcy5jdWFlLkN1YWUuUmVxdWVzdCIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcVdpdGhNZXNzYWdlID0gdHlwZXMuZ2V0KCAiZXRjaC5leGFtcGxlcy5jdWFlLkN1YWUuUmVxV2l0aE1lc3NhZ2UiICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZSA9IHR5cGVzLmdldCggImV0Y2guZXhhbXBsZXMuY3VhZS5DdWFlLlJlc3BvbnNlIiApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcFdpdGhDb2RlID0gdHlwZXMuZ2V0KCAiZXRjaC5leGFtcGxlcy5jdWFlLkN1YWUuUmVzcFdpdGhDb2RlIiApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdDEgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5kb2l0MSIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdDEgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZUNsaWVudC5fcmVzdWx0X2RvaXQxIiApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfZG9pdDIgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZUNsaWVudC5kb2l0MiIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci5fcmVzdWx0X2RvaXQyIiApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDMgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZS5kb2l0MyIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX19yZXN1bHRfZG9pdDMgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZS5fcmVzdWx0X2RvaXQzIiApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDQgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZS5kb2l0NCIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX19yZXN1bHRfZG9pdDQgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZS5fcmVzdWx0X2RvaXQ0IiApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfdGVzdDEgPSB0eXBlcy5nZXQoICJldGNoLmV4YW1wbGVzLmN1YWUuQ3VhZVNlcnZlci50ZXN0MSIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X3Rlc3QyID0gdHlwZXMuZ2V0KCAiZXRjaC5leGFtcGxlcy5jdWFlLkN1YWVDbGllbnQudGVzdDIiICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV90ZXN0MyA9IHR5cGVzLmdldCggImV0Y2guZXhhbXBsZXMuY3VhZS5DdWFlLnRlc3QzIiApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFJlc3VsdHMoKQorCXsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQxLnNldFJlc3VsdCggX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdDEgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdDEuc2V0VGltZW91dCggNDk3ICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9kb2l0Mi5zZXRSZXN1bHQoIF9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9fcmVzdWx0X2RvaXQyICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9fcmVzdWx0X2RvaXQyLnNldFRpbWVvdXQoIDQ5NyApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDMuc2V0UmVzdWx0KCBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0MyApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0My5zZXRUaW1lb3V0KCA0OTcgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX2RvaXQ0LnNldFJlc3VsdCggX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX19yZXN1bHRfZG9pdDQgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX19yZXN1bHRfZG9pdDQuc2V0VGltZW91dCggNDk3ICk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW1wb3J0RXhwb3J0SGVscGVyIElNUE9SVF9FWFBPUlRfSEVMUEVSID0gbmV3IEltcG9ydEV4cG9ydEhlbHBlcigpCisJeworCQlwdWJsaWMgZmluYWwgU3RydWN0VmFsdWUgZXhwb3J0VmFsdWUoIFZhbHVlRmFjdG9yeSB2ZiwgT2JqZWN0IHZhbHVlICkKKwkJeworCQkJcmV0dXJuIChTdHJ1Y3RWYWx1ZSkgdmFsdWU7CisJCX0KKworCQlwdWJsaWMgZmluYWwgT2JqZWN0IGltcG9ydFZhbHVlKCBTdHJ1Y3RWYWx1ZSBzdHJ1Y3QgKQorCQl7CisJCQlyZXR1cm4gc3RydWN0OworCQl9CisJfTsKKwkKKwlzdGF0aWMKKwl7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXF1ZXN0LnNldEltcG9ydEV4cG9ydEhlbHBlciggSU1QT1JUX0VYUE9SVF9IRUxQRVIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcVdpdGhNZXNzYWdlLnNldEltcG9ydEV4cG9ydEhlbHBlciggSU1QT1JUX0VYUE9SVF9IRUxQRVIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcVdpdGhNZXNzYWdlLnNldFN1cGVyVHlwZSggX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlLnNldEltcG9ydEV4cG9ydEhlbHBlciggSU1QT1JUX0VYUE9SVF9IRUxQRVIgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BXaXRoQ29kZS5zZXRJbXBvcnRFeHBvcnRIZWxwZXIoIElNUE9SVF9FWFBPUlRfSEVMUEVSICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwV2l0aENvZGUuc2V0U3VwZXJUeXBlKCBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UgKTsKKwl9CisKKwkvKiogRmllbGQgZm9yIGNvZGUgKi8KKwlwdWJsaWMgc3RhdGljIEZpZWxkIF9tZl9jb2RlOworCisJLyoqIEZpZWxkIGZvciBtc2cgKi8KKwlwdWJsaWMgc3RhdGljIEZpZWxkIF9tZl9tc2c7CisKKwkvKiogRmllbGQgZm9yIHJlcSAqLworCXB1YmxpYyBzdGF0aWMgRmllbGQgX21mX3JlcTsKKworCS8qKiBGaWVsZCBmb3IgcmVzdWx0ICovCisJcHVibGljIHN0YXRpYyBGaWVsZCBfbWZfcmVzdWx0OworCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0RmllbGRzKCkKKwl7CisJCV9tZl9jb2RlID0gbmV3IEZpZWxkKCAiY29kZSIgKTsKKwkJX21mX21zZyA9IG5ldyBGaWVsZCggIm1zZyIgKTsKKwkJX21mX3JlcSA9IG5ldyBGaWVsZCggInJlcSIgKTsKKwkJX21mX3Jlc3VsdCA9IG5ldyBGaWVsZCggInJlc3VsdCIgKTsKKworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfX3Jlc3VsdF9kb2l0MS5zZXRSZXNwb25zZUZpZWxkKCBfbWZfcmVzdWx0ICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZVNlcnZlcl9fcmVzdWx0X2RvaXQyLnNldFJlc3BvbnNlRmllbGQoIF9tZl9yZXN1bHQgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX19yZXN1bHRfZG9pdDMuc2V0UmVzcG9uc2VGaWVsZCggX21mX3Jlc3VsdCApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0NC5zZXRSZXNwb25zZUZpZWxkKCBfbWZfcmVzdWx0ICk7CisJfQorCQorCXN0YXRpYworCXsKKwkJLy8gaW5pdGlhbGl6ZSB0aGUgZXh0ZXJuIHNlcmlhbGl6ZXJzOgorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFBhcmFtcygpCisJeworCisJCS8vIHBhcmFtcyBmb3IgUmVxdWVzdAorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVxdWVzdC5wdXRWYWxpZGF0b3IoIF9tZl9jb2RlLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKworCQkvLyBwYXJhbXMgZm9yIFJlcVdpdGhNZXNzYWdlCisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXFXaXRoTWVzc2FnZS5wdXRWYWxpZGF0b3IoIF9tZl9jb2RlLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9pbnQuZ2V0KCAwICkgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcVdpdGhNZXNzYWdlLnB1dFZhbGlkYXRvciggX21mX21zZywgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApICk7CisKKwkJLy8gcGFyYW1zIGZvciBSZXNwb25zZQorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UucHV0VmFsaWRhdG9yKCBfbWZfbXNnLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9zdHJpbmcuZ2V0KCAwICkgKTsKKworCQkvLyBwYXJhbXMgZm9yIFJlc3BXaXRoQ29kZQorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcFdpdGhDb2RlLnB1dFZhbGlkYXRvciggX21mX21zZywgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3Jfc3RyaW5nLmdldCggMCApICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwV2l0aENvZGUucHV0VmFsaWRhdG9yKCBfbWZfY29kZSwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfaW50LmdldCggMCApICk7CisKKwkJLy8gcGFyYW1zIGZvciBkb2l0MQorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfZG9pdDEucHV0VmFsaWRhdG9yKCBfbWZfcmVxLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5nZXQoIF9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXF1ZXN0LCAwICkgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX2RvaXQxLnB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKworCQkvLyBwYXJhbXMgZm9yIF9yZXN1bHRfZG9pdDEKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdDEucHV0VmFsaWRhdG9yKCBfbWZfcmVzdWx0LCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9TdHJ1Y3RWYWx1ZS5nZXQoIF9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9SZXNwb25zZSwgMCApICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9fcmVzdWx0X2RvaXQxLnB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlQ2xpZW50X19yZXN1bHRfZG9pdDEucHV0VmFsaWRhdG9yKCBfbWZfcmVzdWx0LCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9SdW50aW1lRXhjZXB0aW9uLmdldCgpICk7IC8vIHRocm93biBSdW50aW1lRXhjZXB0aW9uCisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9fcmVzdWx0X2RvaXQxLnB1dFZhbGlkYXRvciggX21mX19pblJlcGx5VG8sIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKworCQkvLyBwYXJhbXMgZm9yIGRvaXQyCisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF9kb2l0Mi5wdXRWYWxpZGF0b3IoIF9tZl9yZXEsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmdldCggX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1JlcXVlc3QsIDAgKSApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVDbGllbnRfZG9pdDIucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCisJCS8vIHBhcmFtcyBmb3IgX3Jlc3VsdF9kb2l0MgorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfX3Jlc3VsdF9kb2l0Mi5wdXRWYWxpZGF0b3IoIF9tZl9yZXN1bHQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX1N0cnVjdFZhbHVlLmdldCggX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX1Jlc3BvbnNlLCAwICkgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVTZXJ2ZXJfX3Jlc3VsdF9kb2l0Mi5wdXRWYWxpZGF0b3IoIF9tZl9yZXN1bHQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uZ2V0KCkgKTsgLy8gdGhyb3duIFJ1bnRpbWVFeGNlcHRpb24KKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX19yZXN1bHRfZG9pdDIucHV0VmFsaWRhdG9yKCBfbWZfX2luUmVwbHlUbywgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCisJCS8vIHBhcmFtcyBmb3IgZG9pdDMKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX2RvaXQzLnB1dFZhbGlkYXRvciggX21mX3JlcSwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfU3RydWN0VmFsdWUuZ2V0KCBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVxdWVzdCwgMSApICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9kb2l0My5wdXRWYWxpZGF0b3IoIF9tZl9fbWVzc2FnZUlkLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisKKwkJLy8gcGFyYW1zIGZvciBfcmVzdWx0X2RvaXQzCisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9fcmVzdWx0X2RvaXQzLnB1dFZhbGlkYXRvciggX21mX3Jlc3VsdCwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfU3RydWN0VmFsdWUuZ2V0KCBfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfUmVzcG9uc2UsIDEgKSApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0My5wdXRWYWxpZGF0b3IoIF9tZl9fbWVzc2FnZUlkLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZV9fcmVzdWx0X2RvaXQzLnB1dFZhbGlkYXRvciggX21mX3Jlc3VsdCwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfUnVudGltZUV4Y2VwdGlvbi5nZXQoKSApOyAvLyB0aHJvd24gUnVudGltZUV4Y2VwdGlvbgorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0My5wdXRWYWxpZGF0b3IoIF9tZl9faW5SZXBseVRvLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisKKwkJLy8gcGFyYW1zIGZvciBkb2l0NAorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfZG9pdDQucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCisJCS8vIHBhcmFtcyBmb3IgX3Jlc3VsdF9kb2l0NAorCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0NC5wdXRWYWxpZGF0b3IoIF9tZl9yZXN1bHQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX3ZvaWQuZ2V0KCAwICkgKTsKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX19yZXN1bHRfZG9pdDQucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfX3Jlc3VsdF9kb2l0NC5wdXRWYWxpZGF0b3IoIF9tZl9yZXN1bHQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX1J1bnRpbWVFeGNlcHRpb24uZ2V0KCkgKTsgLy8gdGhyb3duIFJ1bnRpbWVFeGNlcHRpb24KKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlX19yZXN1bHRfZG9pdDQucHV0VmFsaWRhdG9yKCBfbWZfX2luUmVwbHlUbywgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCisJCS8vIHBhcmFtcyBmb3IgdGVzdDEKKwkJX210X2V0Y2hfZXhhbXBsZXNfY3VhZV9DdWFlU2VydmVyX3Rlc3QxLnB1dFZhbGlkYXRvciggX21mX19tZXNzYWdlSWQsIG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVmFsaWRhdG9yX2xvbmcuZ2V0KCAwICkgKTsKKworCQkvLyBwYXJhbXMgZm9yIHRlc3QyCisJCV9tdF9ldGNoX2V4YW1wbGVzX2N1YWVfQ3VhZUNsaWVudF90ZXN0Mi5wdXRWYWxpZGF0b3IoIF9tZl9fbWVzc2FnZUlkLCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0LlZhbGlkYXRvcl9sb25nLmdldCggMCApICk7CisKKwkJLy8gcGFyYW1zIGZvciB0ZXN0MworCQlfbXRfZXRjaF9leGFtcGxlc19jdWFlX0N1YWVfdGVzdDMucHV0VmFsaWRhdG9yKCBfbWZfX21lc3NhZ2VJZCwgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5WYWxpZGF0b3JfbG9uZy5nZXQoIDAgKSApOworCX0KKwkKKwlzdGF0aWMKKwl7CisJCS8vIGRvbmUgdXBkYXRpbmcgdHlwZXMsIGFuZCBjbGFzczJ0eXBlOiBsb2NrIHRoZW0uCisJCXR5cGVzLmxvY2soKTsKKwkJZm9yIChUeXBlIHQ6IHR5cGVzLnZhbHVlcygpKQorCQkJdC5sb2NrKCk7CisJCWNsYXNzMnR5cGUubG9jaygpOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdDVXb3Jkc0xpc3Qua3dkIGIvdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0NVdvcmRzTGlzdC5rd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkNDU2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdDVXb3Jkc0xpc3Qua3dkCkBAIC0wLDAgKzEsMjggQEAKKyMgJElkJAorIyAKKyMgQ29weXJpZ2h0IDIwMDctMjAwOCBDaXNjbyBTeXN0ZW1zIEluYy4KKyMgCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorIyB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorIyBvZiB0aGUgTGljZW5zZSBhdAorIyAgCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlczEKK3JlczIKK3JlczMKK3JlczQKK3JlczUKK3JlczYKK3JlczcKK3JlczgKK3JlczkKK3JlczEwCityZXMxMQorcmVzMTIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvVGVzdHNQcm9qL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL1Rlc3RzUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQ0MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL1Rlc3RzUHJvai9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisvLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisvLyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGVzdHMiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiRXRjaCBCYXNlZCBDb21waWxlciBUZXN0cyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkNpc2NvIFN5c3RlbXMsIEluYyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkV0Y2giKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCCpIDIwMDgiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUgCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjM1MzY3MTM5LTlmYjMtNDQxZi05MTYwLWNiYmM2NmVhZmJkZSIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBSZXZpc2lvbiBhbmQgQnVpbGQgTnVtYmVycyAKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC4wLjAuMSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjAuMC4xIildCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvVGVzdHNQcm9qL1Rlc3RzUHJvai5jc3Byb2ogYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvVGVzdHNQcm9qL1Rlc3RzUHJvai5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1YzRlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9UZXN0c1Byb2ovVGVzdHNQcm9qLmNzcHJvagpAQCAtMCwwICsxLDc5OSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyA8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIC0tPgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezcwNzAxNzQwLTY1MkEtNEUwNy05Qjg1LTU5RERDQzlENDNENH08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPmV0Y2gudGVzdHM8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UZXN0czwvQXNzZW1ibHlOYW1lPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0ibnVuaXQuZnJhbWV3b3JrLCBWZXJzaW9uPTIuNC43LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OTZkMDlhMWViN2Y0NGE3NywgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPEhpbnRQYXRoPiQoTlVOSVRfSE9NRSlcYmluXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQXN5bmMuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEFzeW5jLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQXN5bmNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEFzeW5jQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQXN5bmNIZWxwZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEFzeW5jSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQXN5bmNTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEFzeW5jU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXJDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhckNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhckhlbHBlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFySGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFyU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXJTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlQXN5bmNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VBc3luY0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VBc3luY1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUFzeW5jU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUJhckNsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUJhckNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VCYXJTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VCYXJTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlQmF6Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlQmF6Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUJhelNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUJhelNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VCaWdJZGxDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VCaWdJZGxDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlQmlnSWRsU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlQmlnSWRsU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUNsb3NpbmdDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VDbG9zaW5nQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUNsb3NpbmdTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VDbG9zaW5nU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUN1YWVDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VDdWFlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUN1YWVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VDdWFlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUZvb0NsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUZvb0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VGb29TZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VGb29TZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlSW5oZXJpdGFuY2VDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VJbmhlcml0YW5jZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VJbmhlcml0YW5jZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZUluaGVyaXRhbmNlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3QxQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdDFDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdDFTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VUZXN0MVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VUZXN0MkNsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3QyQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3QyU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdDJTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdDNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VUZXN0M0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VUZXN0M1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3QzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3Q0Q2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdDRDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdDRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VUZXN0NFNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VUZXN0NkNsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3Q2Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3Q2U2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdDZTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdEluY2x1ZGVzQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVGVzdEluY2x1ZGVzQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3RJbmNsdWRlc1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVRlc3RJbmNsdWRlc1NlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhc2VUeXBlc0NsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVR5cGVzQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmFzZVR5cGVzU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXNlVHlwZXNTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXouY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhei5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhekNsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmF6Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmF6SGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXpIZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCYXpTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJhelNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJpZ0lkbC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmlnSWRsLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmlnSWRsQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCaWdJZGxDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xCaWdJZGxIZWxwZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJpZ0lkbEhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEJpZ0lkbFNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQmlnSWRsU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQ2xvc2luZy5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQ2xvc2luZy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXENsb3NpbmdDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXENsb3NpbmdDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xDbG9zaW5nSGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xDbG9zaW5nSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQ2xvc2luZ1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQ2xvc2luZ1NlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEN1YWUuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEN1YWUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xDdWFlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xDdWFlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcQ3VhZUhlbHBlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcQ3VhZUhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEN1YWVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEN1YWVTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xGb28uY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEZvby5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEZvb0NsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcRm9vQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcRm9vSGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xGb29IZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xGb29TZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXEZvb1NlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEltcGxUZXN0MUNsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcSW1wbFRlc3QxQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcSW1wbFRlc3QxU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xJbXBsVGVzdDFTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xJbXBsVGVzdEluY2x1ZGVzQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xJbXBsVGVzdEluY2x1ZGVzQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcSW1wbFRlc3RJbmNsdWRlc1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcSW1wbFRlc3RJbmNsdWRlc1NlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEluaGVyaXRhbmNlLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xJbmhlcml0YW5jZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEluaGVyaXRhbmNlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xJbmhlcml0YW5jZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEluaGVyaXRhbmNlSGVscGVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xJbmhlcml0YW5jZUhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXEluaGVyaXRhbmNlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xJbmhlcml0YW5jZVNlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXE1haW5UZXN0MUNsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcTWFpblRlc3QxQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcTWFpblRlc3QxTGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXE1haW5UZXN0MUxpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcTWFpblRlc3RJbmNsdWRlc0NsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcTWFpblRlc3RJbmNsdWRlc0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXE1haW5UZXN0SW5jbHVkZXNMaXN0ZW5lci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcTWFpblRlc3RJbmNsdWRlc0xpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQXN5bmMuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUFzeW5jLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQXN5bmNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUFzeW5jQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQXN5bmNTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUFzeW5jU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQmFyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVCYXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVCYXJDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUJhckNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUJhclNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQmFyU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQmF6LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVCYXouY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVCYXpDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUJhekNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUJhelNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQmF6U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQmlnSWRsLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVCaWdJZGwuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVCaWdJZGxDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUJpZ0lkbENsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUJpZ0lkbFNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQmlnSWRsU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQ2xvc2luZy5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQ2xvc2luZy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUNsb3NpbmdDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUNsb3NpbmdDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVDbG9zaW5nU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVDbG9zaW5nU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQ3VhZS5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlQ3VhZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUN1YWVDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUN1YWVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVDdWFlU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVDdWFlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlRm9vLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVGb28uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVGb29DbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUZvb0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUZvb1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlRm9vU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlSW5oZXJpdGFuY2UuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUluaGVyaXRhbmNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlSW5oZXJpdGFuY2VDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUluaGVyaXRhbmNlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlSW5oZXJpdGFuY2VTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZUluaGVyaXRhbmNlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDEuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QxLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDFDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QxQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDFTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QxU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDJDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QyQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDJTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QyU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDMuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QzQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDNTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3QzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3Q0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDRDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3Q0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3Q0U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDYuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3Q2LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDZDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3Q2Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdDZTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3Q2U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdEluY2x1ZGVzLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVUZXN0SW5jbHVkZXMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xSZW1vdGVUZXN0SW5jbHVkZXNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3RJbmNsdWRlc0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVRlc3RJbmNsdWRlc1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVGVzdEluY2x1ZGVzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVHlwZXMuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVR5cGVzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVHlwZXNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVR5cGVzQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcUmVtb3RlVHlwZXNTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFJlbW90ZVR5cGVzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkFzeW5jLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQXN5bmMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQXN5bmNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJBc3luY0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJBc3luY1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkFzeW5jU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkJhci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkJhci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJCYXJDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJCYXJDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQmFyU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQmFyU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkJhei5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkJhei5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJCYXpDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJCYXpDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQmF6U2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQmF6U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkJpZ0lkbC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkJpZ0lkbC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJCaWdJZGxDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJCaWdJZGxDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQmlnSWRsU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViQmlnSWRsU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkNsb3NpbmcuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJDbG9zaW5nLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkNsb3NpbmdDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJDbG9zaW5nQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkNsb3NpbmdTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJDbG9zaW5nU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkN1YWUuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJDdWFlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkN1YWVDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJDdWFlQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkN1YWVTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJDdWFlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkZvby5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkZvby5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJGb29DbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJGb29DbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViRm9vU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViRm9vU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkluaGVyaXRhbmNlLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViSW5oZXJpdGFuY2UuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViSW5oZXJpdGFuY2VDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJJbmhlcml0YW5jZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJJbmhlcml0YW5jZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YkluaGVyaXRhbmNlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3QxLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDEuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDFDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0MUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0MVNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3QxU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3QyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDJDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0MkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0MlNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3QyU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3QzLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0M0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0M1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3QzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3Q0LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDRDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0NENsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0NFNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3Q0U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3Q2LmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDYuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdDZDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0NkNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0NlNlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3Q2U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3RJbmNsdWRlcy5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlRlc3RJbmNsdWRlcy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0SW5jbHVkZXNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUZXN0SW5jbHVkZXNDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdEluY2x1ZGVzU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVGVzdEluY2x1ZGVzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlR5cGVzLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVHlwZXMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xTdHViVHlwZXNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUeXBlc0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFN0dWJUeXBlc1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcU3R1YlR5cGVzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDEuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QxLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDFDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QxQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDFIZWxwZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QxSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDFTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QxU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDJDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QyQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDJIZWxwZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QySGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDJTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QyU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDMuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QzQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDNIZWxwZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QzSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDNTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3QzU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDRDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q0Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDRIZWxwZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q0SGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDRTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q0U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDYuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q2LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDZDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q2Q2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDZIZWxwZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q2SGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdDZTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3Q2U2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdEluY2x1ZGVzLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xUZXN0SW5jbHVkZXMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xUZXN0SW5jbHVkZXNDbGllbnQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3RJbmNsdWRlc0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFRlc3RJbmNsdWRlc0hlbHBlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdEluY2x1ZGVzSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVGVzdEluY2x1ZGVzU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xUZXN0SW5jbHVkZXNTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xUeXBlcy5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVHlwZXMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xUeXBlc0NsaWVudC5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVHlwZXNDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xUeXBlc0hlbHBlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVHlwZXNIZWxwZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xUeXBlc1NlcnZlci5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVHlwZXNTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xWYWx1ZUZhY3RvcnlBc3luYy5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5QXN5bmMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xWYWx1ZUZhY3RvcnlCYXIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeUJhci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeUJhei5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5QmF6LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5QmlnSWRsLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xWYWx1ZUZhY3RvcnlCaWdJZGwuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xWYWx1ZUZhY3RvcnlDbG9zaW5nLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xWYWx1ZUZhY3RvcnlDbG9zaW5nLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5Q3VhZS5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5Q3VhZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cdGFyZ2V0XGdlbmVyYXRlZC1zb3VyY2VzXG1haW5cZXRjaFxjc2hhcnBcb3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeUZvby5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5Rm9vLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5SW5oZXJpdGFuY2UuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeUluaGVyaXRhbmNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5VGVzdDEuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeVRlc3QxLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5VGVzdDIuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeVRlc3QyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5VGVzdDMuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeVRlc3QzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5VGVzdDQuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeVRlc3Q0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5VGVzdDYuY3MiPgorICAgICAgPExpbms+b3JnLmFwYWNoZS5ldGNoLnRlc3RzXFZhbHVlRmFjdG9yeVRlc3Q2LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlx0YXJnZXRcZ2VuZXJhdGVkLXNvdXJjZXNcbWFpblxldGNoXGNzaGFycFxvcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5VGVzdEluY2x1ZGVzLmNzIj4KKyAgICAgIDxMaW5rPm9yZy5hcGFjaGUuZXRjaC50ZXN0c1xWYWx1ZUZhY3RvcnlUZXN0SW5jbHVkZXMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXHRhcmdldFxnZW5lcmF0ZWQtc291cmNlc1xtYWluXGV0Y2hcY3NoYXJwXG9yZy5hcGFjaGUuZXRjaC50ZXN0c1xWYWx1ZUZhY3RvcnlUeXBlcy5jcyI+CisgICAgICA8TGluaz5vcmcuYXBhY2hlLmV0Y2gudGVzdHNcVmFsdWVGYWN0b3J5VHlwZXMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2gudGVzdHNcSW1wbEFzeW5jQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPmV0Y2gudGVzdHNcSW1wbEFzeW5jQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXEltcGxBc3luY1NlcnZlci5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXEltcGxBc3luY1NlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xJbXBsQ2xvc2luZ0NsaWVudC5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXEltcGxDbG9zaW5nQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXEltcGxDbG9zaW5nU2VydmVyLmNzIj4KKyAgICAgIDxMaW5rPmV0Y2gudGVzdHNcSW1wbENsb3NpbmdTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2gudGVzdHNcSW1wbEN1YWVDbGllbnQuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xJbXBsQ3VhZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xJbXBsQ3VhZVNlcnZlci5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXEltcGxDdWFlU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXEltcGxGb29DbGllbnQuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xJbXBsRm9vQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXEltcGxGb29TZXJ2ZXIuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xJbXBsRm9vU2VydmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXEltcGxJbmhlcml0YW5jZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXEltcGxJbmhlcml0YW5jZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xJbXBsSW5oZXJpdGFuY2VTZXJ2ZXIuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xJbXBsSW5oZXJpdGFuY2VTZXJ2ZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2gudGVzdHNcSW1wbFR5cGVzQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPmV0Y2gudGVzdHNcSW1wbFR5cGVzQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXEltcGxUeXBlc1NlcnZlci5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXEltcGxUeXBlc1NlcnZlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xNYWluQXN5bmNDbGllbnQuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xNYWluQXN5bmNDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2gudGVzdHNcTWFpbkFzeW5jTGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xNYWluQXN5bmNMaXN0ZW5lci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xNYWluQ2xvc2luZ0NsaWVudC5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE1haW5DbG9zaW5nQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXE1haW5DbG9zaW5nTGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xNYWluQ2xvc2luZ0xpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXE1haW5DdWFlQ2xpZW50LmNzIj4KKyAgICAgIDxMaW5rPmV0Y2gudGVzdHNcTWFpbkN1YWVDbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2gudGVzdHNcTWFpbkN1YWVMaXN0ZW5lci5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE1haW5DdWFlTGlzdGVuZXIuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2gudGVzdHNcTWFpbkZvb0NsaWVudC5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE1haW5Gb29DbGllbnQuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXG1haW5cY3NoYXJwXGV0Y2gudGVzdHNcTWFpbkZvb0xpc3RlbmVyLmNzIj4KKyAgICAgIDxMaW5rPmV0Y2gudGVzdHNcTWFpbkZvb0xpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXE1haW5Jbmhlcml0YW5jZUNsaWVudC5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE1haW5Jbmhlcml0YW5jZUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xNYWluSW5oZXJpdGFuY2VMaXN0ZW5lci5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE1haW5Jbmhlcml0YW5jZUxpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXE1haW5UeXBlc0NsaWVudC5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE1haW5UeXBlc0NsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xNYWluVHlwZXNMaXN0ZW5lci5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE1haW5UeXBlc0xpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxtYWluXGNzaGFycFxldGNoLnRlc3RzXE15Q3VhZUhlbHBlci5jcyI+CisgICAgICA8TGluaz5ldGNoLnRlc3RzXE15Q3VhZUhlbHBlci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xNeUN1YWVTZXJ2ZXJTdHViLmNzIj4KKyAgICAgIDxMaW5rPmV0Y2gudGVzdHNcTXlDdWFlU2VydmVyU3R1Yi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cbWFpblxjc2hhcnBcZXRjaC50ZXN0c1xNeVZhbHVlRmFjdG9yeUN1YWUuY3MiPgorICAgICAgPExpbms+ZXRjaC50ZXN0c1xNeVZhbHVlRmFjdG9yeUN1YWUuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2gudGVzdHNcRmFrZVRlc3QxLmNzIj4KKyAgICAgIDxMaW5rPkZha2VUZXN0MS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC50ZXN0c1xUZXN0QXN5bmNDbGllbnQuY3MiPgorICAgICAgPExpbms+VGVzdEFzeW5jQ2xpZW50LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLnRlc3RzXFRlc3RJbXBsVGVzdDEuY3MiPgorICAgICAgPExpbms+VGVzdEltcGxUZXN0MS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC50ZXN0c1xUZXN0SW5oZXJpdGFuY2UuY3MiPgorICAgICAgPExpbms+VGVzdEluaGVyaXRhbmNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLnRlc3RzXFRlc3RNYWluVGVzdDFDbGllbnQuY3MiPgorICAgICAgPExpbms+VGVzdE1haW5UZXN0MUNsaWVudC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC50ZXN0c1xUZXN0TWFpblRlc3QxTGlzdGVuZXIuY3MiPgorICAgICAgPExpbms+VGVzdE1haW5UZXN0MUxpc3RlbmVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLnRlc3RzXFRlc3RNaXhpbi5jcyI+CisgICAgICA8TGluaz5UZXN0TWl4aW4uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2gudGVzdHNcVGVzdFJlbW90ZVRlc3QxRG90Q3NoYXJwLmNzIj4KKyAgICAgIDxMaW5rPlRlc3RSZW1vdGVUZXN0MURvdENzaGFycC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC50ZXN0c1xUZXN0U3R1YlRlc3QxRG90Q3NoYXJwLmNzIj4KKyAgICAgIDxMaW5rPlRlc3RTdHViVGVzdDFEb3RDc2hhcnAuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGV0Y2gudGVzdHNcVGVzdFRlc3QxRG90Q3NoYXJwLmNzIj4KKyAgICAgIDxMaW5rPlRlc3RUZXN0MURvdENzaGFycC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZXRjaC50ZXN0c1xUZXN0VGVzdDFIZWxwZXIuY3MiPgorICAgICAgPExpbms+VGVzdFRlc3QxSGVscGVyLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxldGNoLnRlc3RzXFRlc3RWYWx1ZUZhY3RvcnlUZXN0MURvdENzaGFycC5jcyI+CisgICAgICA8TGluaz5UZXN0VmFsdWVGYWN0b3J5VGVzdDFEb3RDc2hhcnAuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlwuLlwuLlxiaW5kaW5nLWNzaGFycFxydW50aW1lXHNyY1xtYWluXGNzaGFycFxFdGNoUHJvai5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezBFNTE4RjJBLTMwMTYtNEMyRi1BMjFCLTlCRDUyQjJEQzg0Nn08L1Byb2plY3Q+CisgICAgICA8TmFtZT5FdGNoUHJvajwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL0Zha2VUZXN0MS5jcyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL0Zha2VUZXN0MS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGM3ODBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvRmFrZVRlc3QxLmNzCkBAIC0wLDAgKzEsNTYyIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuVGVzdDE7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisgICAgY2xhc3MgRmFrZVRlc3QxIDogVGVzdDEKKyAgICB7CisgICAgICAgIHB1YmxpYyBpbnQ/IGJlZXRzKCBFMT8gZSApIAorCSAgICB7CisJCSAgICAKKyAgICAJCQorCQkgICAgc3dpdGNoIChlKQorCQkgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRTEuQToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CisgICAgICAgICAgICAgICAgY2FzZSBFMS5COgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjcDMoKTsKKyAgICAgICAgICAgICAgICBjYXNlIEUxLkM6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNwNCgpOworCQkJICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworCQkgICAgfQorCSAgICB9CisKKwkgICAgcHVibGljIHZvaWQgYmxvdyggU3RyaW5nIG1zZywgaW50PyBjb2RlICkgIAorCSAgICB7CisJCSAgICB0aHJvdyBuZXcgRXhjcDEoIG1zZywgY29kZSApOworCSAgICB9CisKKwkgICAgcHVibGljIGRvdWJsZT8gZGlzdCggUzEgYSwgUzEgYiApCisJICAgIHsKKwkJICAgIFMxIGMgPSBuZXcgUzEoIGEueC1iLngsIGEueS1iLnksIGEuei1iLnogKTsKKwkJICAgIHJldHVybiBNYXRoLlNxcnQoIChkb3VibGUpKGMueCpjLnggKyBjLnkqYy55ICsgYy56KmMueikgKTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBpbnQ/IGluY3IoIGludD8geCApCisJICAgIHsKKwkJICAgIHJldHVybiB4KzE7CisJICAgIH0KKworCSAgICBwdWJsaWMgdm9pZCBub3RoaW5nKCkKKwkgICAgeworCQkgICAgLy8gbm90aGluZy4KKwkgICAgfQorCisJICAgIHB1YmxpYyBpbnQ/IHN1YiggaW50PyB4LCBpbnQ/IHkgKQorCSAgICB7CisJCSAgICByZXR1cm4geC15OworCSAgICB9CisKKwkgICAgcHVibGljIGludD8gc3VtKCBpbnRbXSB4ICkKKwkgICAgeworCQkgICAgaW50IHN1bSA9IDA7CisJCSAgICBmb3JlYWNoIChpbnQgaSBpbiB4KQorCQkJICAgIHN1bSArPSBpOworCQkgICAgcmV0dXJuIHN1bTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBpbnQ/IHRyYW5zKCBFMT8gZSwgaW50PyB4ICkKKwkgICAgeworCQkgICAgc3dpdGNoIChlKQorCQkgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRTEuQToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggLyAyOworICAgICAgICAgICAgICAgIGNhc2UgRTEuQjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKiAyOworICAgICAgICAgICAgICAgIGNhc2UgRTEuQzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKyA3OworCQkJICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworCQkgICAgfQorCSAgICB9CisKKwkgICAgcHVibGljIGludFtdIGZpbGwoIGludD8gbiwgaW50PyB4ICkKKwkgICAgeworCQkgICAgaW50W10geSA9IG5ldyBpbnRbKGludCluXTsKKwkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJICAgIHlbaV0gPSAoaW50KXg7CisJCSAgICByZXR1cm4geTsKKwkgICAgfQorCisgICAgICAgIHB1YmxpYyBFMT8gcF9FMSggRTE/IGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisgICAgICAgIHB1YmxpYyBFMVtdIHBfRTFfYXJyYXkoIEUxW10gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKyAgICAgICAgcHVibGljIFMxIHBfUzEoIFMxIGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisgICAgICAgIHB1YmxpYyBTMVtdIHBfUzFfYXJyYXkoIFMxW10gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKyAgICAgICAgcHVibGljIFMyIHBfUzIoIFMyIGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisgICAgICAgIHB1YmxpYyBTMltdIHBfUzJfYXJyYXkoIFMyW10gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIGJvb2w/IHBfYm9vbGVhbiggYm9vbD8gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIGJvb2xbXSBwX2Jvb2xlYW5fYXJyYXkoIGJvb2xbXSBhICkKKwkgICAgeworCQkgICAgcmV0dXJuIGE7CisJICAgIH0KKworCSAgICBwdWJsaWMgc2J5dGU/IHBfYnl0ZSggc2J5dGU/IGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzYnl0ZVtdIHBfYnl0ZV9hcnJheSggc2J5dGVbXSBhICkKKwkgICAgeworCQkgICAgcmV0dXJuIGE7CisJICAgIH0KKworICAgICAgICBwdWJsaWMgZG91YmxlPyBwX2RvdWJsZSggZG91YmxlPyBhICkKKwkgICAgeworCQkgICAgcmV0dXJuIGE7CisJICAgIH0KKworCSAgICBwdWJsaWMgZG91YmxlW10gcF9kb3VibGVfYXJyYXkoIGRvdWJsZVtdIGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBmbG9hdD8gcF9mbG9hdCggZmxvYXQ/IGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBmbG9hdFtdIHBfZmxvYXRfYXJyYXkoIGZsb2F0W10gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIGludD8gcF9pbnQoIGludD8gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIGludFtdIHBfaW50X2FycmF5KCBpbnRbXSBhICkKKwkgICAgeworCQkgICAgcmV0dXJuIGE7CisJICAgIH0KKworCSAgICBwdWJsaWMgbG9uZz8gcF9sb25nKCBsb25nPyBhICkKKwkgICAgeworCQkgICAgcmV0dXJuIGE7CisJICAgIH0KKworCSAgICBwdWJsaWMgbG9uZ1tdIHBfbG9uZ19hcnJheSggbG9uZ1tdIGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzaG9ydD8gcF9zaG9ydCggc2hvcnQ/IGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzaG9ydFtdIHBfc2hvcnRfYXJyYXkoIHNob3J0W10gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIHN0cmluZyBwX3N0cmluZyggc3RyaW5nIGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzdHJpbmdbXSBwX3N0cmluZ19hcnJheSggc3RyaW5nW10gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIFN0ckludEhhc2hNYXAgcF9CbG9iKCBTdHJJbnRIYXNoTWFwIGEgKQorCSAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBTdHJJbnRIYXNoTWFwW10gcF9CbG9iX2FycmF5KCBTdHJJbnRIYXNoTWFwW10gYSApCisJICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIHZvaWQgYWx3YXlzRmFpbHMoKQorCSAgICB7CisJCSAgICAvLyBpJ20gbmV2ZXIgY2FsbGVkLgorCQkgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiggImFsd2F5c0ZhaWxzIiApOworCSAgICB9CisKKwkgICAgcHVibGljIGludD8gYWx3YXlzV29ya3MoKQorCSAgICB7CisJCSAgICAvLyBpJ20gYWx3YXlzIGNhbGxlZC4KKwkJICAgIHJldHVybiAyMzsKKwkgICAgfQorCisJICAgIHB1YmxpYyBib29sPyBpc0ZhbHNlKCkKKwkgICAgeworCQkgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgICAgcHVibGljIGJvb2w/IGlzVHJ1ZSgpCisJICAgIHsKKwkJICAgIHJldHVybiB0cnVlOworCSAgICB9CisKKwkgICAgcHVibGljIGludD8gYWRkKCBpbnQ/IGEsIGludD8gYiApCisJICAgIHsKKwkJICAgIHJldHVybiBhICsgYjsKKwkgICAgfQorCisJICAgIHB1YmxpYyBib29sPyBjYW5BZGQoIGJvb2wgZmxhZywgaW50PyB4ICkKKwkgICAgeworCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkgICAgcmV0dXJuIG51bGw7CisJICAgIH0KKworCSAgICBwdWJsaWMgYm9vbD8gY2FuTTEoKQorCSAgICB7CisJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCSAgICByZXR1cm4gbnVsbDsKKwkgICAgfQorCisJICAgIHB1YmxpYyBib29sPyBjYW5NMTAoIGRvdWJsZT8geCApCisJICAgIHsKKwkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJICAgIHJldHVybiBudWxsOworCSAgICB9CisKKwkgICAgcHVibGljIGJvb2w/IGNhbk0yKCBib29sPyB4ICkKKwkgICAgeworCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkgICAgcmV0dXJuIG51bGw7CisJICAgIH0KKworCSAgICBwdWJsaWMgYm9vbD8gY2FuTTMoIGJvb2w/IHggKQorCSAgICB7CisJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCSAgICByZXR1cm4gbnVsbDsKKwkgICAgfQorCisJICAgIHB1YmxpYyBib29sPyBjYW5NNCggYm9vbD8geCApCisJICAgIHsKKwkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJICAgIHJldHVybiBudWxsOworCSAgICB9CisKKwkgICAgcHVibGljIGJvb2w/IGNhbl9tNyggaW50PyB4ICkKKwkgICAgeworCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkgICAgcmV0dXJuIG51bGw7CisJICAgIH0KKyAgICAgICAKKworCSAgICBwdWJsaWMgdm9pZCBtMSgpCisJICAgIHsKKwkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAJCQorCSAgICB9CisKKwkgICAgcHVibGljIHZvaWQgbTEwKCkKKwkgICAgeworCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIAkJCisJICAgIH0KKworCSAgICBwdWJsaWMgdm9pZCBtMigpCisJICAgIHsKKwkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAJCQorCSAgICB9CisKKwkgICAgcHVibGljIHZvaWQgbTMoKQorCSAgICB7CisJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgCQkKKwkgICAgfQorCisJICAgIHB1YmxpYyB2b2lkIG00KCkKKwkgICAgeworCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIAkJCisJICAgIH0KKworCSAgICBwdWJsaWMgdm9pZCBtNygpCisJICAgIHsKKwkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAJCQorCSAgICB9CisKKyAgICAgICAKKworICAgICAgIAorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I20xMSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBtMTEoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I201KCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG01KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZXRjaC5iaW5kaW5ncy5qYXZhLmNvbXBpbGVyLnRlc3QuVGVzdCNtNigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBtNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGV0Y2guYmluZGluZ3MuamF2YS5jb21waWxlci50ZXN0LlRlc3QjbTgoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgbTgoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I205KCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG05KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbD8gY2FuX20xKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbD8gY2FuX20yKGJvb2w/IHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2w/IGNhbl9tMyhib29sPyB4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sPyBjYW5fbTQoYm9vbD8geCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZXRjaC5iaW5kaW5ncy5qYXZhLmNvbXBpbGVyLnRlc3QuVGVzdCNjYW5fbTExKGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbD8gY2FuX20xMSggc3RyaW5nIHggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I2Nhbl9tNShqYXZhLmxhbmcuQnl0ZSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sPyBjYW5fbTUoIHNieXRlPyB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZXRjaC5iaW5kaW5ncy5qYXZhLmNvbXBpbGVyLnRlc3QuVGVzdCNjYW5fbTYoamF2YS5sYW5nLlNob3J0KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2w/IGNhbl9tNiggc2hvcnQ/IHggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I2Nhbl9tOChqYXZhLmxhbmcuTG9uZykKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sPyBjYW5fbTgoIGxvbmc/IHggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I2Nhbl9tOShqYXZhLmxhbmcuRmxvYXQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbD8gY2FuX205KCBmbG9hdD8geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2w/IGNhbl9tMTAoIGRvdWJsZT8geCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I2Nhbl9tMTIoamF2YS5sYW5nLkludGVnZXIpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbD8gY2FuX20xMiggaW50PyB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZXRjaC5iaW5kaW5ncy5qYXZhLmNvbXBpbGVyLnRlc3QuVGVzdCNjYW5fbTEzKGphdmEubGFuZy5JbnRlZ2VyKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2w/IGNhbl9tMTMoIGludD8geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGV0Y2guYmluZGluZ3MuamF2YS5jb21waWxlci50ZXN0LlRlc3QjY2FuX20xNChqYXZhLmxhbmcuSW50ZWdlcikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sPyBjYW5fbTE0KCBpbnQ/IHggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I2Nhbl9tMTUoZXRjaC5iaW5kaW5ncy5qYXZhLmNvbXBpbGVyLnRlc3QuVGVzdC5FMSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sPyBjYW5fbTE1KCBFMT8geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGV0Y2guYmluZGluZ3MuamF2YS5jb21waWxlci50ZXN0LlRlc3QjbTEyKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG0xMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGV0Y2guYmluZGluZ3MuamF2YS5jb21waWxlci50ZXN0LlRlc3QjbTEzKGphdmEubGFuZy5JbnRlZ2VyKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgbTEzKCBpbnQ/IGsgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0I20xNChldGNoLmJpbmRpbmdzLmphdmEuY29tcGlsZXIudGVzdC5UZXN0LlMxKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgbTE0KCBTMSBrICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZXRjaC5iaW5kaW5ncy5qYXZhLmNvbXBpbGVyLnRlc3QuVGVzdCNtMTUoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgbTE1KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgICAgIH0KKworICAgICAgICAvLyBmaWxsIG51bUVsZW1lbnRzIG9mIGFycmF5IHdpdGggdmFsdWUgbworICAgICAgICBwdWJsaWMgb2JqZWN0W10gZmlsbE9iamVjdCggaW50PyBudW1FbGVtZW50cywgb2JqZWN0IG8gKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3RbXSB5ID0gbmV3IG9iamVjdFsgKGludCkgbnVtRWxlbWVudHMgXTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpKysgKQorICAgICAgICAgICAgICAgIHlbIGkgXSA9IG87CisgICAgICAgICAgICByZXR1cm4geTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgcF9vYmplY3QoIG9iamVjdCBhICkgCisgICAgICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIG9iamVjdFtdIHBfb2JqZWN0X2FycmF5KCBvYmplY3RbXSBhICkgCisgICAgICAgIHsKKwkJICAgIHJldHVybiBhOworCSAgICB9CisKKwkgICAgcHVibGljIFMzIHBfb2JqZWN0X3N0cnVjdCggUzMgYSApIAorICAgICAgICB7CisJCSAgICByZXR1cm4gYTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBTNCBwX29iamVjdF9zdHJ1Y3RfYXJyYXkoIFM0IGEgKSAKKyAgICAgICAgeworCQkgICAgcmV0dXJuIGE7CisJICAgIH0KKworCSAgICBwdWJsaWMgdm9pZCB0aHJvd0V4Y3A1KCBTdHJpbmcgbXNnLCBpbnQ/IGNvZGUsIG9iamVjdCB2YWx1ZSApIAorICAgICAgICB7CisJCSAgICB0aHJvdyBuZXcgRXhjcDUoIG1zZywgY29kZSwgdmFsdWUgKTsKKwkgICAgfQorCisJICAgIHB1YmxpYyB2b2lkIHRocm93RXhjcDYoU3RyaW5nIG1zZywgaW50PyBjb2RlLCBvYmplY3RbXSB2YWx1ZSApIAorICAgICAgICB7CisJCSAgIHRocm93IG5ldyBFeGNwNiggbXNnLCBjb2RlLCB2YWx1ZSApOwkJCisJICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0QXN5bmNDbGllbnQuY3MgYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0QXN5bmNDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMzkwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RBc3luY0NsaWVudC5jcwpAQCAtMCwwICsxLDkyIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0QXN5bmNDbGllbnQKKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVtb3RlQXN5bmNTZXJ2ZXIgc2VydmVyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworCisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgIC8vICAgICAgTWFpbkFzeW5jTGlzdGVuZXIuTWFpbihuZXcgU3RyaW5nW10geyB9KTsKKyAgCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gInRjcDovL2xvY2FsaG9zdDo0MDEwIjsgICAgICAgICAKKworICAgICAgICAgICAgTWFpbkFzeW5jTGlzdGVuZXIgaW1wbEZhY3RvcnkgPSBuZXcgTWFpbkFzeW5jTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIGxpc3RlbmVyID0gQXN5bmNIZWxwZXIuTmV3TGlzdGVuZXIodXJpLCBudWxsLCBpbXBsRmFjdG9yeSk7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwKTsKKworICAgICAgICAgICAgTWFpbkFzeW5jQ2xpZW50IGNsaWVudCA9IG5ldyBNYWluQXN5bmNDbGllbnQoKTsKKyAgICAgICAgICAgIHNlcnZlciA9IEFzeW5jSGVscGVyLk5ld1NlcnZlcih1cmksIG51bGwsIGNsaWVudCk7CisgICAgICAgICAgCisKKyAgICAgICAgICAgIHNlcnZlci5fU3RhcnRBbmRXYWl0VXAoNDAwMCk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBzeW5jMSgpCisgICAgICAgIHsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHNlcnZlci5zeW5jKDApKTsKKworICAgICAgICB9CisKKyAgICAgICAKKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmNfcXVldWVkMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpLCBzZXJ2ZXIuYXN5bmNfcXVldWVkKGkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYXN5bmNfZnJlZSgpIAorCSAgICB7CisJCSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIHNlcnZlci5hc3luY19mcmVlKGkpKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0Rml4dHVyZVRlYXJEb3duXQorICAgICAgICBwdWJsaWMgdm9pZCBNZXRob2RfQ2xvc2VOZXdUZXN0TGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlcnZlci5fU3RvcEFuZFdhaXREb3duKDQwMDApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlRyYW5zcG9ydENvbnRyb2woVHJhbnNwb3J0Q29uc3RzLlNUT1BfQU5EX1dBSVRfRE9XTiw0MDAwKTsKKyAgICAgICAgfQorIAorICAgIH0gCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0SW1wbFRlc3QxLmNzIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdEltcGxUZXN0MS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBmM2FjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdEltcGxUZXN0MS5jcwpAQCAtMCwwICsxLDEyMzkgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy50eXBlcy5UZXN0MTsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RJbXBsVGVzdDEKKyAgICB7CisgICAgIAorICAgIC8vICAgIHByaXZhdGUgVGVzdDFTZXJ2ZXIgdHMgPSBudWxsOworICAgICAgICBwcml2YXRlIEltcGxUZXN0MVNlcnZlciB0ZXN0U2VydmVyID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBJbXBsVGVzdDFDbGllbnQgdGVzdENsaWVudCA9IG51bGw7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0SW1wbCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBSZW1vdGVUZXN0MUNsaWVudCB0YyA9IG51bGw7CisgICAgICAgICAgICBSZW1vdGVUZXN0MVNlcnZlciB0cyA9IG51bGw7CisgICAgICAgICAgICB0ZXN0U2VydmVyID0gbmV3IEltcGxUZXN0MVNlcnZlciggdGMgKTsKKyAgICAgICAgICAgIHRlc3RDbGllbnQgPSBuZXcgSW1wbFRlc3QxQ2xpZW50KCB0cyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEluY3IoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQ/IGkgPSA1OworICAgICAgICAgICAgICAgIHRlc3RTZXJ2ZXIuaW5jciggaSApOworICAgICAgICAgICAgICAgIHRlc3RDbGllbnQuaW5jciggaSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gKQorICAgICAgICAgICAgeyB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3ROb3RoaW5nKCkgCisgICAgICAgIHsKKwkJCisJCSAgICB0cnkKKwkJICAgIHsJCQkKKwkJCSAgICB0ZXN0U2VydmVyLm5vdGhpbmcoKTsJCQorCQkJICAgIHRlc3RDbGllbnQubm90aGluZygpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCisJCSAgICB9CisJICAgIH0KKwkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QWRkKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIGludD8gaSA9IDU7CisgICAgICAgICAgICAgICAgaW50PyBqID0gMzsKKyAgICAgICAgICAgICAgICB0ZXN0U2VydmVyLmFkZCggaSwgaiApOworICAgICAgICAgICAgICAgIHRlc3RDbGllbnQuYWRkKCBpLCBqICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFN1YigpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBpbnQ/IGkgPSA1OworICAgICAgICAgICAgICAgIGludD8gaiA9IDM7CisgICAgICAgICAgICAgICAgdGVzdFNlcnZlci5zdWIoIGksIGogKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q2xpZW50LnN1YiggaSwgaiApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTdW0oKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgICAgICAgICAgICAgaW50W10geCA9IHsgMSwgMiwgMyB9OworCQkJICAgIHRlc3RTZXJ2ZXIuc3VtKCB4ICk7CisJCQkgICAgdGVzdENsaWVudC5zdW0oIHggKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0JCQkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RGaWxsKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIGludD8gaSA9IDU7CisgICAgICAgICAgICAgICAgaW50PyBqID0gMzsKKwkJCSAgICB0ZXN0U2VydmVyLmZpbGwoIGksIGogKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q2xpZW50LmZpbGwoIGksIGogKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0JCQkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RGaWxsT2JqZWN0KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIGludD8gaSA9IDU7CisJCQkgICAgT2JqZWN0IGogPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIuZmlsbE9iamVjdCggaSwgaiApOworICAgICAgICAgICAgICAgIHRlc3RDbGllbnQuZmlsbE9iamVjdCggaSwgaiApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQkJCQkKKwkgICAgfQorICAgIAkKKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RUcmFucygpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBpbnQ/IGkgPSA1OworICAgICAgICAgICAgICAgIEUxIGVudW1BID0gRTEuQTsKKyAgICAgICAgICAgICAgICB0ZXN0U2VydmVyLnRyYW5zKCBlbnVtQSwgaSApOworICAgICAgICAgICAgICAgIHRlc3RDbGllbnQudHJhbnMoIGVudW1BLCBpICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CQkJCQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gcHVibGljIHZvaWQgIFRlc3REaXN0KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIC8vaW50PyBpID0gNTsKKwkJCSAgICBTMSBhID0gbmV3IFMxKCk7CisJCQkgICAgUzEgYiA9IG5ldyBTMSgpOworICAgICAgICAgICAgICAgIHRlc3RTZXJ2ZXIuZGlzdCggYSwgYiApOworCQkJICAgIHRlc3RDbGllbnQuZGlzdCggYSwgYiApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQkJCQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0QmxvdygpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBpbnQ/IGkgPSA1OworICAgICAgICAgICAgICAgIHRlc3RTZXJ2ZXIuYmxvdyggIiIsIGkgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmJsb3coICIiLCBpICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CQkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RFeGNwNSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBpbnQ/IGkgPSA1OworCQkJICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci50aHJvd0V4Y3A1KCAiIiwgaSwgdmFsdWUgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnRocm93RXhjcDUoICIiLCBpLCB2YWx1ZSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQkJCQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0RXhjcDYoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgaW50PyBpID0gNTsJCisJCQkgICAgT2JqZWN0W10gdmFsdWUgPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIudGhyb3dFeGNwNiggIiIsIGksIHZhbHVlICk7CisJCQkgICAgdGVzdENsaWVudC50aHJvd0V4Y3A2KCAiIiwgaSwgdmFsdWUgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0JCQkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdEJvb2xlYW4oKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgICAgICAgICAgICAgYm9vbD8gYiA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX2Jvb2xlYW4oIGIgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfYm9vbGVhbiggYiApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RCb29sZWFuQXJyYXkoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgQm9vbGVhbltdIGIgPSBudWxsOwkKKwkJCSAgICB0ZXN0U2VydmVyLnBfYm9vbGVhbl9hcnJheSggYiApOworCQkJICAgIHRlc3RDbGllbnQucF9ib29sZWFuX2FycmF5KCBiICkJOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0Qnl0ZSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBTQnl0ZT8gYSA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX2J5dGUoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfYnl0ZSggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0Qnl0ZUFycmF5KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIHNieXRlW10gYSA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX2J5dGVfYXJyYXkoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfYnl0ZV9hcnJheSggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0U2hvcnQoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgICAgICAgICAgICAgc2hvcnQ/IGEgID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLnBfc2hvcnQoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfc2hvcnQoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdFNob3J0QXJyYXkoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgICAgICAgICAgICAgc2hvcnRbXSBhID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLnBfc2hvcnRfYXJyYXkoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfc2hvcnRfYXJyYXkoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0SW50KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIGludD8gYSAgPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIucF9pbnQoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfaW50KCBhICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RJbnRBcnJheSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBpbnRbXSBhICA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX2ludF9hcnJheSggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9pbnRfYXJyYXkoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdExvbmcoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgICAgICAgICAgICAgbG9uZz8gYSAgPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIucF9sb25nKCBhICk7CisJCQkgICAgdGVzdENsaWVudC5wX2xvbmcoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIHB1YmxpYyB2b2lkICB0ZXN0TG9uZ0FycmF5KCkgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgbG9uZ1tdIGEgID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLnBfbG9uZ19hcnJheSggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9sb25nX2FycmF5KCBhICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RGbG9hdCgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBmbG9hdD8gYSAgPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIucF9mbG9hdCggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9mbG9hdCggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0RmxvYXRBcnJheSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBmbG9hdFtdIGEgID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLnBfZmxvYXRfYXJyYXkoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfZmxvYXRfYXJyYXkoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKyAgICAJCisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0RG91YmxlKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIGRvdWJsZT8gYSAgPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIucF9kb3VibGUoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfZG91YmxlKCBhICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3REb3VibGVBcnJheSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBkb3VibGVbXSBhICA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX2RvdWJsZV9hcnJheSggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9kb3VibGVfYXJyYXkoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdFN0cmluZygpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBTdHJpbmcgYSAgPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIucF9zdHJpbmcoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfc3RyaW5nKCBhICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RTdHJpbmdBcnJheSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBTdHJpbmdbXSBhICA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX3N0cmluZ19hcnJheSggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9zdHJpbmdfYXJyYXkoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdEUxKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIEUxIGEgID0gZGVmYXVsdCggRTEgKTsKKwkJCSAgICB0ZXN0U2VydmVyLnBfRTEoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfRTEoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdEUxQXJyYXkoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgRTFbXSBhICA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX0UxX2FycmF5KCBhICk7CisJCQkgICAgdGVzdENsaWVudC5wX0UxX2FycmF5KCBhICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RTMSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBTMSBhICA9IGRlZmF1bHQoIFMxICk7CisJCQkgICAgdGVzdFNlcnZlci5wX1MxKCBhICk7CisJCQkgICAgdGVzdENsaWVudC5wX1MxKCBhICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RTMUFycmF5KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIFMxW10gYSAgPSBudWxsOworCQkJICAgIHRlc3RTZXJ2ZXIucF9TMV9hcnJheSggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9TMV9hcnJheSggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0UzIoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgICAgICAgICAgICAgUzIgYSAgPSBkZWZhdWx0KCBTMiApOworCQkJICAgIHRlc3RTZXJ2ZXIucF9TMiggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9TMiggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0UzJBcnJheSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBTMltdIGEgID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLnBfUzJfYXJyYXkoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfUzJfYXJyYXkoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdEJsb2IoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgU3RySW50SGFzaE1hcCBhICA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX0Jsb2IoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfQmxvYiggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0QmxvYkFycmF5KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIFN0ckludEhhc2hNYXBbXSBhICA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX0Jsb2JfYXJyYXkoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfQmxvYl9hcnJheSggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0T2JqZWN0KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIE9iamVjdCBhICA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5wX29iamVjdCggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9vYmplY3QoIGEgKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE9iamVjdEFycmF5KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIE9iamVjdFtdIGEgID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLnBfb2JqZWN0X2FycmF5KCBhICk7CisJCQkgICAgdGVzdENsaWVudC5wX29iamVjdF9hcnJheSggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0T2JqZWN0U3RydWN0KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIFMzIGEgID0gZGVmYXVsdCggUzMgKTsKKwkJCSAgICB0ZXN0U2VydmVyLnBfb2JqZWN0X3N0cnVjdCggYSApOworCQkJICAgIHRlc3RDbGllbnQucF9vYmplY3Rfc3RydWN0KCBhICk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RPYmplY3RTdHJ1Y3RBcnJheSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBTNCBhICA9IGRlZmF1bHQoIFM0ICk7CisJCQkgICAgdGVzdFNlcnZlci5wX29iamVjdF9zdHJ1Y3RfYXJyYXkoIGEgKTsKKwkJCSAgICB0ZXN0Q2xpZW50LnBfb2JqZWN0X3N0cnVjdF9hcnJheSggYSApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0QWx3YXlzV29yaygpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB0ZXN0U2VydmVyLmFsd2F5c1dvcmtzKCk7CisJCQkgICAgdGVzdENsaWVudC5hbHdheXNXb3JrcygpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0QWx3YXlzRmFpbCgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB0ZXN0U2VydmVyLmFsd2F5c0ZhaWxzKCk7CisJCQkgICAgdGVzdENsaWVudC5hbHdheXNGYWlscygpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJc1RydWUoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgCQkJCisJCQkgICAgdGVzdFNlcnZlci5pc1RydWUoKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmlzVHJ1ZSgpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0SXNGYWxzZSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB0ZXN0U2VydmVyLmlzRmFsc2UoKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmlzRmFsc2UoKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE0xKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTEoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm0xKCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RDYW5NMSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tMSgpOworCQkJICAgIHRlc3RDbGllbnQuY2FuX20xKCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RNMigpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB0ZXN0U2VydmVyLm0yKCk7CisJCQkgICAgdGVzdENsaWVudC5tMigpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0Q2FuTTIoKSB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBib29sPyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tMihiKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmNhbl9tMihiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE0zKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTMoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm0zKCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIHRlc3RDYW5NMygpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBib29sPyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tMyhiKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmNhbl9tMyhiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE00KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTQoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm00KCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RDYW5NNCgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBib29sPyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tNChiKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmNhbl9tNChiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE01KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTUoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm01KCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIHRlc3RDYW5NNSgpIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIHNieXRlPyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tNShiKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmNhbl9tNShiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE02KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTYoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm02KCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RDYW5NNigpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBzaG9ydD8gYiA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5jYW5fbTYoYik7CisJCQkgICAgdGVzdENsaWVudC5jYW5fbTYoYik7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RNNygpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB0ZXN0U2VydmVyLm03KCk7CisJCQkgICAgdGVzdENsaWVudC5tNygpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0Q2FuTTcoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgaW50PyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tNyhiKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmNhbl9tNyhiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE04KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTgoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm04KCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RDYW5NOCgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBsb25nPyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tOChiKTsKKwkJCSAgICB0ZXN0Q2xpZW50LmNhbl9tOChiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE05KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTYoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm02KCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RDYW5NOSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBmbG9hdD8gYiA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5jYW5fbTkoYik7CisJCQkgICAgdGVzdENsaWVudC5jYW5fbTkoYik7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RNMTAoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisgICAgCQkJCisJCQkgICAgdGVzdFNlcnZlci5tMTAoKTsKKwkJCSAgICB0ZXN0Q2xpZW50Lm0xMCgpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0Q2FuTTEwKCkgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgZG91YmxlPyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tMTAoYik7CisJCQkgICAgdGVzdENsaWVudC5jYW5fbTEwKGIpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0TTExKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgIAkJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTExKCk7CisJCQkgICAgdGVzdENsaWVudC5tMTEoKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdENhbk0xMSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICBTdHJpbmcgYiA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5jYW5fbTExKGIpOworCQkJICAgIHRlc3RDbGllbnQuY2FuX20xMShiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE0xMigpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQkKKwkJCSAgICB0ZXN0U2VydmVyLm0xMigpOworCQkJICAgIHRlc3RDbGllbnQubTEyKCk7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RDYW5NMTIoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgaW50PyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tMTIoYik7CisJCQkgICAgdGVzdENsaWVudC5jYW5fbTEyKGIpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0TTEzKCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIGludD8gYiA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5tMTMoYik7CisJCQkgICAgdGVzdENsaWVudC5tMTMoYik7CisJCSAgICB9CisJCSAgICBjYXRjaCAoIEV4Y2VwdGlvbikKKwkJICAgIHsKKwkJCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgCQkJCisJCSAgICB9CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XSAKKyAgICAgICAgcHVibGljIHZvaWQgIFRlc3RDYW5NMTMoKSAKKyAgICAgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgaW50PyBiID0gbnVsbDsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tMTMoYik7CisJCQkgICAgdGVzdENsaWVudC5jYW5fbTEzKGIpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0TTE0KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworICAgICAgICAgICAgICAgIFMxIGIgPSBkZWZhdWx0KCBTMSApOworCQkJICAgIHRlc3RTZXJ2ZXIubTE0KGIpOworCQkJICAgIHRlc3RDbGllbnQubTE0KGIpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0gCisgICAgICAgIHB1YmxpYyB2b2lkICBUZXN0Q2FuTTE0KCkgCisgICAgICAgIHsKKwkJICAgIHRyeQorCQkgICAgeworCQkJICAgIGludD8gYiA9IG51bGw7CisJCQkgICAgdGVzdFNlcnZlci5jYW5fbTE0KGIpOworCQkJICAgIHRlc3RDbGllbnQuY2FuX20xNChiKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdE0xNSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAJCQorCQkJICAgIHRlc3RTZXJ2ZXIubTE1KCk7CisJCQkgICAgdGVzdENsaWVudC5tMTUoKTsKKwkJICAgIH0KKwkJICAgIGNhdGNoICggRXhjZXB0aW9uKQorCQkgICAgeworCQkJICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAJCQkKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdIAorICAgICAgICBwdWJsaWMgdm9pZCAgVGVzdENhbk0xNSgpIAorICAgICAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICBFMSBiID0gZGVmYXVsdCggRTEgKTsKKwkJCSAgICB0ZXN0U2VydmVyLmNhbl9tMTUoYik7CisJCQkgICAgdGVzdENsaWVudC5jYW5fbTE1KGIpOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNlcHRpb24pCisJCSAgICB7CisJCQkgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgIAkJCQorCQkgICAgfQorCSAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdEluaGVyaXRhbmNlLmNzIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdEluaGVyaXRhbmNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjQ0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0SW5oZXJpdGFuY2UuY3MKQEAgLTAsMCArMSw1ODMgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy50eXBlcy5Jbmhlcml0YW5jZTsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RJbmhlcml0YW5jZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVtb3RlSW5oZXJpdGFuY2VTZXJ2ZXIgc2VydmVyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworICAgICAgICAKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMyI7CisKKyAgICAgICAgICAgIE1haW5Jbmhlcml0YW5jZUxpc3RlbmVyIGltcGxGYWN0b3J5ID0gbmV3IE1haW5Jbmhlcml0YW5jZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBsaXN0ZW5lciA9IEluaGVyaXRhbmNlSGVscGVyLk5ld0xpc3RlbmVyKHVyaSwgbnVsbCwgaW1wbEZhY3RvcnkpOworCisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVEFSVF9BTkRfV0FJVF9VUCwgNDAwMCk7CisKKyAgICAgICAgICAgIE1haW5Jbmhlcml0YW5jZUNsaWVudCBjbGllbnQgPSBuZXcgTWFpbkluaGVyaXRhbmNlQ2xpZW50KCk7CisgICAgICAgICAgICBzZXJ2ZXIgPSBJbmhlcml0YW5jZUhlbHBlci5OZXdTZXJ2ZXIodXJpLCBudWxsLCBjbGllbnQpOworCisgICAgICAgIC8vICAgIHNlcnZlci5fVHJhbnNwb3J0Q29udHJvbChFdGNoLlRyYW5zcG9ydC5UcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDApOworCisgICAgICAgICAgICBzZXJ2ZXIuX1N0YXJ0QW5kV2FpdFVwKDQwMDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHR5cGVzKCkgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLHR5cGVvZihTMSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoUzEpKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSx0eXBlb2YoUzEpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKFMyKSkpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsdHlwZW9mKFMxKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihTMykpKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLHR5cGVvZihTMikuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoUzEpKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSx0eXBlb2YoUzIpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKFMyKSkpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsdHlwZW9mKFMyKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihTMykpKTsKKwkJCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmFsc2UsdHlwZW9mKFMzKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihTMSkpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChmYWxzZSx0eXBlb2YoUzMpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKFMyKSkpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsdHlwZW9mKFMzKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihTMykpKTsKKwkJICAgCisgICAgCQlBc3NlcnQuQXJlRXF1YWwodHJ1ZSx0eXBlb2YoRTEpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKEUxKSkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsdHlwZW9mKEUxKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihFMikpKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLHR5cGVvZihFMSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoRTMpKSk7CisJCSAgICAKKyAgICAJCUFzc2VydC5BcmVFcXVhbCh0cnVlLHR5cGVvZihFeGNlcHRpb24pLklzQXNzaWduYWJsZUZyb20odHlwZW9mKEUxKSkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsdHlwZW9mKEV4Y2VwdGlvbikuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoRTIpKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSx0eXBlb2YoRXhjZXB0aW9uKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihFMykpKTsKKwkJIAorICAgIAkJQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLHR5cGVvZihFMikuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoRTEpKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHJ1ZSx0eXBlb2YoRTIpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKEUyKSkpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsdHlwZW9mKEUyKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihFMykpKTsKKwkJICAgIAorICAgIAkJQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLHR5cGVvZihFMykuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoRTEpKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmFsc2UsdHlwZW9mKEUzKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihFMikpKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLHR5cGVvZihFMykuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoRTMpKSk7CisJCSAgIAorCSAgICB9CisJCisJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RfUzEoKSAKKwkgICAgeworCQkgICAgY2hlY2tfczEoIG5ldyBTMSgpLCBudWxsLCBudWxsICk7CisJCQorCQkgICAgY2hlY2tfczEoIG5ldyBTMSggbnVsbCwgbnVsbCApLCBudWxsLCBudWxsICk7CisJCQorCQkgICAgY2hlY2tfczEoIG5ldyBTMSggMSwgMiApLCAxLCAyICk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdF9zMigpIAorCSAgICB7CisJCSAgICBjaGVja19zMiggbmV3IFMyKCksIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKKyAgICAJCQorCQkgICAgY2hlY2tfczIoIG5ldyBTMiggbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApLCBudWxsLCBudWxsLCBudWxsLCBudWxsICk7CisgICAgCQkKKwkJICAgIGNoZWNrX3MyKCBuZXcgUzIoIDEsIDIsIDMsIDQgKSwgMSwgMiwgMywgNCApOworCSAgICB9CisJCisJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RfczMoKSAKKwkgICAgeworCQkgICAgY2hlY2tfczMoIG5ldyBTMygpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsICk7CisgICAgCQkKKwkJICAgIGNoZWNrX3MzKCBuZXcgUzMoIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKSwKKwkJCSAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsICk7CisgICAgCQkKKwkJICAgIGNoZWNrX3MzKCBuZXcgUzMoIDEsIDIsIDMsIDQsIDUsIDYgKSwgMSwgMiwgMywgNCwgNSwgNiApOworCSAgICB9CisJCisJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RfZTEoKSAKKwkgICAgeworCQkgICAgY2hlY2tfZTEoIG5ldyBFMSgpLCBudWxsLCBudWxsICk7CisgICAgCQkKKwkJICAgIGNoZWNrX2UxKCBuZXcgRTEoIG51bGwsIG51bGwgKSwgbnVsbCwgbnVsbCApOworICAgIAkJCisJCSAgICBjaGVja19lMSggbmV3IEUxKCAxLCAyICksIDEsIDIgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgY29uc3RydWN0X2UyKCkgCisJICAgIHsKKwkJICAgIGNoZWNrX2UyKCBuZXcgRTIoKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApOworICAgIAkJCisJCSAgICBjaGVja19lMiggbmV3IEUyKCBudWxsLCBudWxsLCBudWxsLCBudWxsICksIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKKyAgICAJCQorCQkgICAgY2hlY2tfZTIoIG5ldyBFMiggMSwgMiwgMywgNCApLCAxLCAyLCAzLCA0ICk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdF9lMygpIAorCSAgICB7CisJCSAgICBjaGVja19lMyggbmV3IEUzKCksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKKyAgICAJCQorCQkgICAgY2hlY2tfZTMoIG5ldyBFMyggbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApLAorCQkJICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKKyAgICAJCQorCQkgICAgY2hlY2tfZTMoIG5ldyBFMyggMSwgMiwgMywgNCwgNSwgNiApLCAxLCAyLCAzLCA0LCA1LCA2ICk7CisJICAgIH0KKwkKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGFzc2lnbl9zMSgpIAorCSAgICB7CisJCSAgICBTMSB2ID0gbmV3IFMxKCAxLCAyICk7IAorICAgICAgICAgICAgCisgICAgICAgICAgICBjaGVja19zMSggdiwgMSwgMiApOworICAgIAkJCisJCSAgICB2LmEgPSBudWxsOyAgICAgICAgICAgIGNoZWNrX3MxKCB2LCBudWxsLCAyICk7CisJCSAgICB2LmEgPSAzOyAgICAgICAgICAgICAgIGNoZWNrX3MxKCB2LCAzLCAyICk7CisJCSAgICB2LlNldEEoIG51bGwgKTsgICAgICAgIGNoZWNrX3MxKCB2LCBudWxsLCAyICk7CisJCSAgICB2LlNldEEoIDQgKTsgICAgICAgICAgIGNoZWNrX3MxKCB2LCA0LCAyICk7CisgICAgCQkKKwkJICAgIHYuYiA9IG51bGw7ICAgICAgICAgICAgY2hlY2tfczEoIHYsIDQsIG51bGwgKTsKKwkJICAgIHYuYiA9IDU7ICAgICAgICAgICAgICAgY2hlY2tfczEoIHYsIDQsIDUgKTsKKwkJICAgIHYuU2V0QiggbnVsbCApOyAgICAgICAgY2hlY2tfczEoIHYsIDQsIG51bGwgKTsKKwkJICAgIHYuU2V0QiggNiApOyAgICAgICAgICAgY2hlY2tfczEoIHYsIDQsIDYgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYXNzaWduX3MyKCkKKwkgICAgeworCQkgICAgUzIgdiA9IG5ldyBTMiggMSwgMiwgMywgNCApOyAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2hlY2tfczIoIHYsIDEsIDIsIDMsIDQgKTsKKyAgICAJCQorCQkgICAgdi5hID0gbnVsbDsgICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgbnVsbCwgMiwgMywgNCApOworCQkgICAgdi5hID0gNTsgICAgICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgNSwgMiwgMywgNCApOworCQkgICAgdi5TZXRBKCBudWxsICk7ICAgICAgICAgICAgICBjaGVja19zMiggdiwgbnVsbCwgMiwgMywgNCApOworCQkgICAgdi5TZXRBKCA2ICk7ICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgNiwgMiwgMywgNCApOworICAgIAkJCisJCSAgICB2LmIgPSBudWxsOyAgICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCBudWxsLCAzLCA0ICk7CisJCSAgICB2LmIgPSA3OyAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA3LCAzLCA0ICk7CisJCSAgICB2LlNldEIoIG51bGwgKTsgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCBudWxsLCAzLCA0ICk7CisJCSAgICB2LlNldEIoIDggKTsgICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA4LCAzLCA0ICk7CisgICAgCQkKKwkJICAgIHYuYyA9IG51bGw7ICAgICAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIG51bGwsIDQgKTsKKwkJICAgIHYuYyA9IDk7ICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIDksIDQgKTsKKwkJICAgIHYuU2V0QyggbnVsbCApOyAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIG51bGwsIDQgKTsKKwkJICAgIHYuU2V0QyggMTAgKTsgICAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIDEwLCA0ICk7CisgICAgCQkKKwkJICAgIHYuZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIDEwLCBudWxsICk7CisJCSAgICB2LmQgPSAxMTsgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA4LCAxMCwgMTEgKTsKKwkJICAgIHYuU2V0RCggbnVsbCApOyAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIDEwLCBudWxsICk7CisJCSAgICB2LlNldEQoIDEyICk7ICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA4LCAxMCwgMTIgKTsKKwkgICAgfQorCQorCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgYXNzaWduX3MzKCkgCisJICAgIHsKKwkJICAgIFMzIHYgPSBuZXcgUzMoIDEsIDIsIDMsIDQsIDUsIDYgKTsgCisgICAgICAgICAgICBjaGVja19zMyggdiwgMSwgMiwgMywgNCwgNSwgNiApOworICAgIAkJCisJCSAgICB2LmEgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCBudWxsLCAyLCAzLCA0LCA1LCA2ICk7CisJCSAgICB2LmEgPSA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA3LCAyLCAzLCA0LCA1LCA2ICk7CisJCSAgICB2LlNldEEoIG51bGwgKTsgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCBudWxsLCAyLCAzLCA0LCA1LCA2ICk7CisJCSAgICB2LlNldEEoIDggKTsgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAyLCAzLCA0LCA1LCA2ICk7CisgICAgCQkKKwkJICAgIHYuYiA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIG51bGwsIDMsIDQsIDUsIDYgKTsKKwkJICAgIHYuYiA9IDk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDksIDMsIDQsIDUsIDYgKTsKKwkJICAgIHYuU2V0QiggbnVsbCApOyAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIG51bGwsIDMsIDQsIDUsIDYgKTsKKwkJICAgIHYuU2V0QiggMTAgKTsgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAzLCA0LCA1LCA2ICk7CisgICAgCQkKKwkJICAgIHYuYyA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCBudWxsLCA0LCA1LCA2ICk7CisJCSAgICB2LmMgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMTEsIDQsIDUsIDYgKTsKKwkJICAgIHYuU2V0QyggbnVsbCApOyAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCBudWxsLCA0LCA1LCA2ICk7CisJCSAgICB2LlNldEMoIDEyICk7ICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMTIsIDQsIDUsIDYgKTsKKyAgICAJCQorCQkgICAgdi5kID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCBudWxsLCA1LCA2ICk7CisJCSAgICB2LmQgPSAxMzsgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMTIsIDEzLCA1LCA2ICk7CisJCSAgICB2LlNldEQoIG51bGwgKTsgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMTIsIG51bGwsIDUsIDYgKTsKKwkJICAgIHYuU2V0RCggMTQgKTsgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIDUsIDYgKTsKKyAgICAJCQorCQkgICAgdi5lID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCAxNCwgbnVsbCwgNiApOworCQkgICAgdi5lID0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCAxNCwgMTUsIDYgKTsKKwkJICAgIHYuU2V0RSggbnVsbCApOyAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIG51bGwsIDYgKTsKKwkJICAgIHYuU2V0RSggMTYgKTsgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIDE2LCA2ICk7CisgICAgCQkKKwkJICAgIHYuZiA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIDE2LCBudWxsICk7CisJCSAgICB2LmYgPSAxNzsgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMTIsIDE0LCAxNiwgMTcgKTsKKwkJICAgIHYuU2V0RiggbnVsbCApOyAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIDE2LCBudWxsICk7CisJCSAgICB2LlNldEYoIDE4ICk7ICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMTIsIDE0LCAxNiwgMTggKTsKKwkgICAgfQorCQorCQorCSAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0b3N0cmluZygpIAorCSAgICB7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoCisJCQkgICAgIlMxKGE9MTsgYj0yKSIsCisJCQkgICAgbmV3IFMxKCAxLCAyICkuVG9TdHJpbmcoKSApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoCisJCQkgICAgIlMyKFMxKGE9MTsgYj0yKTsgYz0zOyBkPTQpIiwKKwkJCSAgICBuZXcgUzIoIDEsIDIsIDMsIDQgKS5Ub1N0cmluZygpICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCgKKwkJCSAgICAiUzMoUzIoUzEoYT0xOyBiPTIpOyBjPTM7IGQ9NCk7IGU9NTsgZj02KSIsCisJCQkgICAgbmV3IFMzKCAxLCAyLCAzLCA0LCA1LCA2ICkuVG9TdHJpbmcoKSApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoCisgICAgICAgICAgICAgICAgImE9MTsgYj0yIiwKKwkJCSAgICBuZXcgRTEoIDEsIDIgKS5HZXRNZXNzYWdlKCkgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKAorICAgICAgICAgICAgICAgICJhPTE7IGI9MjsgYz0zOyBkPTQiLAorCQkJICAgIG5ldyBFMiggMSwgMiwgMywgNCApLkdldE1lc3NhZ2UoKSApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoCisgICAgICAgICAgICAgICAgImE9MTsgYj0yOyBjPTM7IGQ9NDsgZT01OyBmPTYiLAorCQkJICAgIG5ldyBFMyggMSwgMiwgMywgNCwgNSwgNiApLkdldE1lc3NhZ2UoKSApOworCSAgICB9CisKKwkgICAgcHJpdmF0ZSB2b2lkIGNoZWNrX3MxKCBTMSB2LCBpbnQ/IGEsIGludD8gYiApCisJICAgIHsKKyAgICAJCQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBhLCB2LmEgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggYSwgdi5HZXRBKCkgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBiLCB2LmIgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggYiwgdi5HZXRCKCkgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgdm9pZCBjaGVja19zMiggUzIgdiwgaW50PyBhLCBpbnQ/IGIsIGludD8gYywgaW50PyBkICkKKwkgICAgeworCQkgICAgY2hlY2tfczEoIHYsIGEsIGIgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBjLCB2LmMgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggYywgdi5HZXRDKCkgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBkLCB2LmQgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZCwgdi5HZXREKCkgKTsKKwkgICAgfQorCisJICAgIHByaXZhdGUgdm9pZCBjaGVja19zMyggUzMgdiwgaW50PyBhLCBpbnQ/IGIsIGludD8gYywgaW50PyBkLAorCQkgICAgaW50PyBlLCBpbnQ/IGYgKQorCSAgICB7CisJCSAgICBjaGVja19zMiggdiwgYSwgYiwgYywgZCApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGUsIHYuZSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBlLCB2LkdldEUoKSApOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGYsIHYuZiApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBmLCB2LkdldEYoKSApOworCSAgICB9CisKKwkgICAgcHJpdmF0ZSB2b2lkIGNoZWNrX2UxKCBFMSB2LCBpbnQ/IGEsIGludD8gYiApCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggYSwgdi5hICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGEsIHYuR2V0QSgpICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggYiwgdi5iICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGIsIHYuR2V0QigpICk7CisJICAgIH0KKworCSAgICBwcml2YXRlIHZvaWQgY2hlY2tfZTIoIEUyIHYsIGludD8gYSwgaW50PyBiLCBpbnQ/IGMsIGludD8gZCApCisJICAgIHsKKwkJICAgIGNoZWNrX2UxKCB2LCBhLCBiICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggYywgdi5jICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGMsIHYuR2V0QygpICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZCwgdi5kICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGQsIHYuR2V0RCgpICk7CisJICAgIH0KKworCSAgICBwcml2YXRlIHZvaWQgY2hlY2tfZTMoIEUzIHYsIGludD8gYSwgaW50PyBiLCBpbnQ/IGMsIGludD8gZCwKKwkJICAgIGludD8gZSwgaW50PyBmICkKKwkgICAgeworCQkgICAgY2hlY2tfZTIoIHYsIGEsIGIsIGMsIGQgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBlLCB2LmUgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZSwgdi5HZXRFKCkgKTsKKyAgICAJCQorCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBmLCB2LmYgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggZiwgdi5HZXRGKCkgKTsKKwkgICAgfQorCisJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X3MxKCkgCisJICAgIHsKKwkJICAgIGRvX3MxKCBuZXcgUzEoIDEsIDIgKSwgbmV3IFMxQ29tcGFyZSgpICk7CisJCSAgICBkb19zMSggbmV3IFMxKCA5LCA4ICksIG5ldyBTMUNvbXBhcmUoKSApOworCSAgICB9CisKKwkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfczIoKSAKKwkgICAgeworCQkgICAgZG9fczIoIG5ldyBTMiggMSwgMiwgMywgNCApLCBuZXcgUzJDb21wYXJlKCkgKTsKKwkJICAgIGRvX3MyKCBuZXcgUzIoIDksIDgsIDcsIDYgKSwgbmV3IFMyQ29tcGFyZSgpICk7CisJICAgIH0KKworCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X3MzKCkgCisJICAgIHsKKwkJICAgIGRvX3MzKCBuZXcgUzMoIDEsIDIsIDMsIDQsIDUsIDYgKSwgbmV3IFMzQ29tcGFyZSgpICk7CisJCSAgICBkb19zMyggbmV3IFMzKCA5LCA4LCA3LCA2LCA1LCA0ICksIG5ldyBTM0NvbXBhcmUoKSApOworCSAgICB9IAorCQorCSAgICBpbnRlcmZhY2UgQ29tcGFyZU9iajxUPgorCSAgICB7CisgICAgCQkKKwkJICAgIHZvaWQgY29tcGFyZSggVCBhLCBUIGIgKTsKKwkgICAgfQorCQorCQorCQorCS8qKgorCSAqIENsYXNzIHRvIGNvbXBhcmUgb25lIFMyIHRvIGFub3RoZXIuCisJICovCisJIGNsYXNzIFMyQ29tcGFyZSA6IENvbXBhcmVPYmo8b2JqZWN0PgorCXsKKwkJcHVibGljIHZvaWQgY29tcGFyZSggb2JqZWN0IGEsIG9iamVjdCBiICkKKwkJeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHR5cGVvZihTMiksIGEuR2V0VHlwZSgpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggdHlwZW9mKFMyKSwgYi5HZXRUeXBlKCkgKTsKKyAgICAgICAgICAgIFMyIGExID0gKFMyKWE7CisgICAgICAgICAgICBTMiBiMSA9IChTMiliOworCQkJQXNzZXJ0LkFyZUVxdWFsKCBhMS5hLCBiMS5hICk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIGExLmIsIGIxLmIgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggYTEuYywgYjEuYyApOworCQkJQXNzZXJ0LkFyZUVxdWFsKCBhMS5kLCBiMS5kICk7CisJCX0KKwl9IAorCisJLyoqCisJICogQ2xhc3MgdG8gY29tcGFyZSBvbmUgUzMgdG8gYW5vdGhlci4KKwkgKi8KKwljbGFzcyBTM0NvbXBhcmUgOiBDb21wYXJlT2JqPG9iamVjdD4KKwl7CisJCXB1YmxpYyB2b2lkIGNvbXBhcmUoIG9iamVjdCBhLCBvYmplY3QgYiApCisJCXsKKwkJCUFzc2VydC5BcmVFcXVhbCggdHlwZW9mKFMzKSwgYS5HZXRUeXBlKCkgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggdHlwZW9mKFMzKSwgYi5HZXRUeXBlKCkgKTsKKyAgICAgICAgICAgIFMzIGExID0gKFMzKWE7CisgICAgICAgICAgICBTMyBiMSA9IChTMyliOworCQkJQXNzZXJ0LkFyZUVxdWFsKCBhMS5hLCBiMS5hICk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIGExLmIsIGIxLmIgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggYTEuYywgYjEuYyApOworCQkJQXNzZXJ0LkFyZUVxdWFsKCBhMS5kLCBiMS5kICk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIGExLmUsIGIxLmUgKTsKKwkJCUFzc2VydC5BcmVFcXVhbCggYTEuZiwgYjEuZiApOworCQl9CisJfSAKKwkKKwkgCisJCisJIGNsYXNzIEFTMkNvbXBhcmUgOiBDb21wYXJlT2JqPG9iamVjdFtdPgorCXsKKwkJCisJCXB1YmxpYyBBUzJDb21wYXJlKCBDb21wYXJlT2JqPG9iamVjdD4gY21wICkKKwkJeworCQkJdGhpcy5jbXAgPSBjbXA7CisJCX0KKwkJCisJCXByaXZhdGUgQ29tcGFyZU9iajxvYmplY3Q+IGNtcDsKKworCQkKKwkJcHVibGljIHZvaWQgY29tcGFyZSggb2JqZWN0W10gYSwgb2JqZWN0W10gYiApCisJCXsKKyAgICAgICAgICAgIFMyW10gYTEgPSAoUzJbXSlhOworICAgICAgICAgICAgUzJbXSBiMSA9IChTMltdKWI7CisJCQlBc3NlcnQuQXJlRXF1YWwoIGExLkxlbmd0aCwgYjEuTGVuZ3RoICk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGEuTGVuZ3RoOyBpKyspCisJCQkJY21wLmNvbXBhcmUoIGExW2ldLCBiMVtpXSApOworCQl9CisJfQorCQorCSBjbGFzcyBBUzNDb21wYXJlIDogQ29tcGFyZU9iajxvYmplY3RbXT4KKwl7CisJCQorCQlwdWJsaWMgQVMzQ29tcGFyZSggQ29tcGFyZU9iajxvYmplY3Q+IGNtcCApCisJCXsKKwkJCXRoaXMuY21wID0gY21wOworCQl9CisJCQorCQlwcml2YXRlICBDb21wYXJlT2JqPG9iamVjdD4gY21wOworCisJCQorCQlwdWJsaWMgdm9pZCBjb21wYXJlKCBvYmplY3RbXSBhLCBvYmplY3RbXSBiICkKKwkJeworCQkJQXNzZXJ0LkFyZUVxdWFsKCBhLkxlbmd0aCwgYi5MZW5ndGggKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYS5MZW5ndGg7IGkrKykKKwkJCQljbXAuY29tcGFyZSggYVtpXSwgYltpXSApOworCQl9CisJfSAKKworCS8vLy8vLy8vLy8vLy8KKwkvLyBIRUxQRVJTIC8vCisJLy8vLy8vLy8vLy8vLworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRvX29iaihvYmplY3QgdiwgQ29tcGFyZU9iajxvYmplY3Q+IGNtcCkKKwkgICAgeworCQkgICAgLy8gdGVzdCBhbiBvYmplY3QgYm90aCBieSBpdHNlbGYgYW5kIGFzIGFuIGFycmF5LgorICAgIAkJCisJCSAgICBjbXAuY29tcGFyZSggdixzZXJ2ZXIuZjEoIHYgKSApOworCisgICAgICAgICAgICBvYmplY3RbXSBhID0geyB2IH07CisJICAgICAgICBDb21wYXJlT2JqPG9iamVjdFtdPiBhY21wID0gbmV3IEFPYmplY3RDb21wYXJlKCBjbXAgKTsKKyAgICAJCQorCQkgICAgYWNtcC5jb21wYXJlKCBhLCBzZXJ2ZXIuZjUoIGEgKSApOyAgCisJICAgIH0KKworICAKKwlwcml2YXRlIHZvaWQgZG9fczEoIFMxIHYsIENvbXBhcmVPYmo8b2JqZWN0PiBjbXAgKQorCXsKKwkJLy8gdGVzdCBhbiBTMSBib3RoIGJ5IGl0c2VsZiBhbmQgYXMgYW4gYXJyYXkuCisJCS8vIGFsc28gdGVzdCBlYWNoIG9mIHRob3NlIGFzIGFuIG9iamVjdC4KKwkJCisJCWNtcC5jb21wYXJlKCB2LCBzZXJ2ZXIuZjIoIHYgKSApOworCQlkb19vYmooIHYsIGNtcCApOworCQkKKwkJUzFbXSBhID0geyB2IH07CisgICAgICAgIENvbXBhcmVPYmo8b2JqZWN0W10+IGFjbXAgPSBuZXcgQVMxQ29tcGFyZShjbXApOworCisJCWFjbXAuY29tcGFyZSggYSwgc2VydmVyLmY2KCBhICkgKTsKKy8vCQlkb19vYmooIGEsIGFjbXAgKTsgIAorCX0KKworICAgIC8qKgorICogQ2xhc3MgdG8gY29tcGFyZSBvbmUgUzEgdG8gYW5vdGhlci4KKyAqLworICAgIGNsYXNzIFMxQ29tcGFyZSA6IENvbXBhcmVPYmo8b2JqZWN0PgorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgY29tcGFyZShvYmplY3QgYSwgb2JqZWN0IGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0eXBlb2YoUzEpLCBhLkdldFR5cGUoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodHlwZW9mKFMxKSwgYi5HZXRUeXBlKCkpOworICAgICAgICAgICAgUzEgYTEgPSAoUzEpYTsKKyAgICAgICAgICAgIFMxIGIxID0gKFMxKWI7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYTEuYSwgYjEuYSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYTEuYiwgYjEuYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBBT2JqZWN0Q29tcGFyZSA6IENvbXBhcmVPYmo8T2JqZWN0W10+CisgICAgeworCisgICAgICAgIHB1YmxpYyBBT2JqZWN0Q29tcGFyZShDb21wYXJlT2JqPE9iamVjdD4gY21wKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNtcCA9IGNtcDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ29tcGFyZU9iajxPYmplY3Q+IGNtcDsKKworCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBhcmUoT2JqZWN0W10gYSwgT2JqZWN0W10gYikKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGEuTGVuZ3RoLCBiLkxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgY21wLmNvbXBhcmUoYVtpXSwgYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBBUzFDb21wYXJlIDogQ29tcGFyZU9iajxvYmplY3RbXT4KKyAgICB7CisKKyAgICAgICAgcHVibGljIEFTMUNvbXBhcmUoQ29tcGFyZU9iajxvYmplY3Q+IGNtcCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbXAgPSBjbXA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENvbXBhcmVPYmo8b2JqZWN0PiBjbXA7CisKKworICAgICAgICBwdWJsaWMgdm9pZCBjb21wYXJlKG9iamVjdFtdIGEsIG9iamVjdFtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFMxW10gYTEgPSAoUzFbXSlhOworICAgICAgICAgICAgUzFbXSBiMSA9IChTMVtdKWI7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYTEuTGVuZ3RoLCBiMS5MZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjbXAuY29tcGFyZShhMVtpXSwgYjFbaV0pOworICAgICAgICB9CisgICAgfQorCisKKwkKKwkgcHJpdmF0ZSB2b2lkIGRvX3MyKCBTMiB2LCBDb21wYXJlT2JqPG9iamVjdD4gY21wICkKKwl7CisJCS8vIHRlc3QgYW4gUzIgYm90aCBieSBpdHNlbGYgYW5kIGFzIGFuIGFycmF5LgorCQkvLyBhbHNvIHRlc3QgdGhlIFMyIGFzIGFuIFMxLCBhbmQgdGhlIFMyIGFycmF5CisJCS8vIGFzIGFuIG9iamVjdC4KKwkJCisJCWNtcC5jb21wYXJlKCB2LCBzZXJ2ZXIuZjMoIHYgKSApOworCQlkb19zMSggdiwgY21wICk7CisJCQorCQlTMltdIGEgPSB7IHYgfTsKKwkJQ29tcGFyZU9iajxvYmplY3RbXT4gYWNtcCA9IG5ldyBBUzJDb21wYXJlKCBjbXAgKTsKKworCQlhY21wLmNvbXBhcmUoIGEsIHNlcnZlci5mNyggYSApICk7CisJLy8JZG9fb2JqKCBhLCBhY21wICk7CisJfQorCisJCisJcHJpdmF0ZSB2b2lkIGRvX3MzKCBTMyB2LCBDb21wYXJlT2JqPG9iamVjdD4gY21wICkKKwl7CisJCS8vIHRlc3QgYW4gUzMgYm90aCBieSBpdHNlbGYgYW5kIGFzIGFuIGFycmF5LgorCQkvLyBhbHNvIHRlc3QgdGhlIFMzIGFzIGFuIFMyLCBhbmQgdGhlIFMzIGFycmF5CisJCS8vIGFzIGFuIG9iamVjdC4KKwkJCisJCWNtcC5jb21wYXJlKCB2LCBzZXJ2ZXIuZjQoIHYgKSApOworCQlkb19zMiggdiwgY21wICk7CisJCQorCQlTM1tdIGEgPSB7IHYgfTsKKwkJQ29tcGFyZU9iajxvYmplY3RbXT4gYWNtcCA9IG5ldyBBUzNDb21wYXJlKCBjbXAgKTsKKworCQlhY21wLmNvbXBhcmUoIGEsIHNlcnZlci5mOCggYSApICk7CisJLy8JZG9fb2JqKCBhLCBhY21wICk7CisJfSAKKworCQorCSAgW1Rlc3RGaXh0dXJlVGVhckRvd25dCisJcHVibGljIHZvaWQgRGlzcG9zZSgpIAorCXsKKwkJaWYgKHNlcnZlciAhPSBudWxsKQorCQkJc2VydmVyLl9TdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKFRyYW5zcG9ydENvbnN0cy5TVE9QX0FORF9XQUlUX0RPV04sIDQwMDApOworCX0KK30KKworCisKKyAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0TWFpblRlc3QxQ2xpZW50LmNzIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdE1haW5UZXN0MUNsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzFhZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdE1haW5UZXN0MUNsaWVudC5jcwpAQCAtMCwwICsxLDcyMCBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy50eXBlcy5UZXN0MTsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RNYWluVGVzdDFDbGllbnQKKyAgICB7CisgICAgICAgIC8vIFNldHRpbmdzCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAvLyBJbnN0YW5jZSBvZiB0aGUgY2xhc3MuCisgICAgICAgIHByaXZhdGUgSW1wbFRlc3QxQ2xpZW50IG15TWFpblRlc3RDbGllbnQ7CisKKyAgICAgICAgLy8gSW5zdGFuY2VzIG9mIGFyZ3VtZW50cyB0eXBlcworICAgICAgICBwcml2YXRlIGJvb2w/IG15Qm9vbDsKKyAgICAgICAgcHJpdmF0ZSBzYnl0ZT8gbXlCeXRlOworICAgICAgICBwcml2YXRlIHNob3J0PyBteVNob3J0OworICAgICAgICBwcml2YXRlIGludD8gbXlJbnQ7CisgICAgICAgIHByaXZhdGUgbG9uZz8gbXlMb25nOworICAgICAgICBwcml2YXRlIGZsb2F0PyBteUZsb2F0OworICAgICAgICBwcml2YXRlIGRvdWJsZT8gbXlEb3VibGU7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IG15T2JqOworICAgICAgICBwcml2YXRlIFN0cmluZyBteVN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSBTdHJJbnRIYXNoTWFwIG15TWFwOworICAgICAgICBwcml2YXRlIEUxPyBteUUxOworICAgICAgICBwcml2YXRlIFMxIG15UzE7CisgICAgICAgIHByaXZhdGUgUzIgbXlTMjsKKyAgICAgICAgcHJpdmF0ZSBTMyBteVMzOworICAgICAgICBwcml2YXRlIFM0IG15UzQ7CisgICAgICAgIHByaXZhdGUgQm9vbGVhbltdIG15Qm9vbHM7CisgICAgICAgIHByaXZhdGUgc2J5dGVbXSBteUJ5dGVzOworICAgICAgICBwcml2YXRlIHNob3J0W10gbXlTaG9ydHM7CisgICAgICAgIHByaXZhdGUgaW50W10gbXlJbnRzOworICAgICAgICBwcml2YXRlIGxvbmdbXSBteUxvbmdzOworICAgICAgICBwcml2YXRlIGZsb2F0W10gbXlGbG9hdHM7CisgICAgICAgIHByaXZhdGUgZG91YmxlW10gbXlEb3VibGVzOworICAgICAgICBwcml2YXRlIE9iamVjdFtdIG15T2JqczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBteVN0cmluZ3M7CisgICAgICAgIHByaXZhdGUgU3RySW50SGFzaE1hcFtdIG15TWFwczsKKyAgICAgICAgcHJpdmF0ZSBFMVtdIG15RTFzOworICAgICAgICBwcml2YXRlIFMxW10gbXlTMXM7CisgICAgICAgIHByaXZhdGUgUzJbXSBteVMyczsKKworICAgICAgICAvLyBNYWludGVuYW5jZQorCSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0TWFpbiIgKTsKKyAgICAgICAgfQorCisJICAgIFtTZXRVcF0KKwkgICAgcHVibGljIHZvaWQgU2V0VXAoKQorCSAgICB7CisgICAgICAgICAgICB0aGlzLm15TWFpblRlc3RDbGllbnQgPSBuZXcgSW1wbFRlc3QxQ2xpZW50KCBudWxsKTsKKwkgICAgfQorCisKKwkgICAgLy8gVGVzdHMKKwkgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgTm90aGluZ01ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlNYWluVGVzdENsaWVudC5ub3RoaW5nKCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIEluY3JNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15SW50ID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LmluY3IodGhpcy5teUludCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGFkZE1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlJbnQgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuYWRkKHRoaXMubXlJbnQsIHRoaXMubXlJbnQpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBzdWJNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15SW50ID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnN1Yih0aGlzLm15SW50LCB0aGlzLm15SW50KTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgc3VtTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUludCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5zdW0odGhpcy5teUludHMpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCB0cmFuc01ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlJbnQgPSB0aGlzLm15TWFpblRlc3RDbGllbnQudHJhbnModGhpcy5teUUxLCB0aGlzLm15SW50KTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgZGlzdE1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlEb3VibGUgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuZGlzdCh0aGlzLm15UzEsIHRoaXMubXlTMSk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGZpbGxNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15SW50cyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5maWxsKHRoaXMubXlJbnQsIHRoaXMubXlJbnQpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBmaWxsT2JqZWN0TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU9ianMgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuZmlsbE9iamVjdCh0aGlzLm15SW50LCB0aGlzLm15T2JqKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgYmxvd01ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlNYWluVGVzdENsaWVudC5ibG93KHRoaXMubXlTdHJpbmcsIHRoaXMubXlJbnQpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBiZWV0c01ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlJbnQgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuYmVldHModGhpcy5teUUxKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgdGhyb3dFeGNwNU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlNYWluVGVzdENsaWVudC50aHJvd0V4Y3A1KHRoaXMubXlTdHJpbmcsIHRoaXMubXlJbnQsIHRoaXMubXlPYmopOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCB0aHJvd0V4Y3A2TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU1haW5UZXN0Q2xpZW50LnRocm93RXhjcDYodGhpcy5teVN0cmluZywgdGhpcy5teUludCwgdGhpcy5teU9ianMpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX2Jvb2xlYW5NZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2Jvb2xlYW4odGhpcy5teUJvb2wpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX2Jvb2xlYW5fYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbHMgPSB0aGlzLm15TWFpblRlc3RDbGllbnQucF9ib29sZWFuX2FycmF5KHRoaXMubXlCb29scyk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfYnl0ZU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlCeXRlID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnBfYnl0ZSh0aGlzLm15Qnl0ZSk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfYnl0ZV9hcnJheU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlCeXRlcyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2J5dGVfYXJyYXkodGhpcy5teUJ5dGVzKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9zaG9ydE1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlTaG9ydCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX3Nob3J0KHRoaXMubXlTaG9ydCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfc2hvcnRfYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15U2hvcnRzID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnBfc2hvcnRfYXJyYXkodGhpcy5teVNob3J0cyk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfaW50TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUludCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2ludCh0aGlzLm15SW50KTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9pbnRfYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15SW50cyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2ludF9hcnJheSh0aGlzLm15SW50cyk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfbG9uZ01ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlMb25nID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnBfbG9uZyh0aGlzLm15TG9uZyk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfbG9uZ19hcnJheU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlMb25ncyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2xvbmdfYXJyYXkodGhpcy5teUxvbmdzKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9mbG9hdE1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlGbG9hdCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2Zsb2F0KHRoaXMubXlGbG9hdCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfZmxvYXRfYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15RmxvYXRzID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnBfZmxvYXRfYXJyYXkodGhpcy5teUZsb2F0cyk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfZG91YmxlTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teURvdWJsZSA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2RvdWJsZSh0aGlzLm15RG91YmxlKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9kb3VibGVfYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15RG91YmxlcyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX2RvdWJsZV9hcnJheSh0aGlzLm15RG91Ymxlcyk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfc3RyaW5nTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teVN0cmluZyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX3N0cmluZyh0aGlzLm15U3RyaW5nKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9zdHJpbmdfYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15U3RyaW5ncyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX3N0cmluZ19hcnJheSh0aGlzLm15U3RyaW5ncyk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfRTFNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15RTEgPSB0aGlzLm15TWFpblRlc3RDbGllbnQucF9FMSh0aGlzLm15RTEpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX0UxX2FycmF5TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUUxcyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX0UxX2FycmF5KHRoaXMubXlFMXMpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX1MxTWV0aG9kKCkKKwkgICAgeworCQkgICAgIHRoaXMubXlTMSA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX1MxKHRoaXMubXlTMSk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfUzFfYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICAgdGhpcy5teVMxcyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX1MxX2FycmF5KHRoaXMubXlTMXMpOworCisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIHBfUzJNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15UzIgPSB0aGlzLm15TWFpblRlc3RDbGllbnQucF9TMih0aGlzLm15UzIpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX1MyX2FycmF5TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teVMycyA9IHRoaXMubXlNYWluVGVzdENsaWVudC5wX1MyX2FycmF5KHRoaXMubXlTMnMpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX0Jsb2JNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFwID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnBfQmxvYih0aGlzLm15TWFwKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9CbG9iX0FycmF5TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU1hcHMgPSB0aGlzLm15TWFpblRlc3RDbGllbnQucF9CbG9iX2FycmF5KHRoaXMubXlNYXBzKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9vYmplY3RNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15T2JqID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnBfb2JqZWN0KHRoaXMubXlPYmopOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX29iamVjdF9hcnJheU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlNYWluVGVzdENsaWVudC5wX29iamVjdF9hcnJheShudWxsKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgcF9vYmplY3Rfc3RydWN0TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teVMzID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LnBfb2JqZWN0X3N0cnVjdCh0aGlzLm15UzMpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBwX29iamVjdF9zdHJ1Y3RfYXJyYXlNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15UzQgPSB0aGlzLm15TWFpblRlc3RDbGllbnQucF9vYmplY3Rfc3RydWN0X2FycmF5KHRoaXMubXlTNCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGFsd2F5c1dvcmRzTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUludCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5hbHdheXNXb3JrcygpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBpc1RydWVNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5pc1RydWUoKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgYWx3YXlzRmFpbHNNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFpblRlc3RDbGllbnQuYWx3YXlzRmFpbHMoKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgaXNGYWxzZU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlCb29sID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LmlzRmFsc2UoKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgbTFNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFpblRlc3RDbGllbnQubTEoKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgY2FuX20xTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUJvb2wgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuY2FuX20xKCk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIG0yTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU1haW5UZXN0Q2xpZW50Lm0yKCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNhbl9tMk1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlCb29sID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LmNhbl9tMihudWxsKTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgbTNNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFpblRlc3RDbGllbnQubTMoKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgY2FuX20zTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUJvb2wgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuY2FuX20zKG51bGwpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBtNE1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlNYWluVGVzdENsaWVudC5tNCgpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjYW5fbTRNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5jYW5fbTQodGhpcy5teUJvb2wpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBtNU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlNYWluVGVzdENsaWVudC5tNSgpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjYW5fbTVNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5jYW5fbTUodGhpcy5teUJ5dGUpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBtN01ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlNYWluVGVzdENsaWVudC5tNygpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjYW5fbTdNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5jYW5fbTcodGhpcy5teUludCk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIG04TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU1haW5UZXN0Q2xpZW50Lm04KCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNhbl9tOE1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlCb29sID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LmNhbl9tOCh0aGlzLm15TG9uZyk7CisJICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIG05TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU1haW5UZXN0Q2xpZW50Lm05KCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNhbl9tOU1ldGhvZCgpCisJICAgIHsKKwkJICAgIHRoaXMubXlCb29sID0gdGhpcy5teU1haW5UZXN0Q2xpZW50LmNhbl9tOSh0aGlzLm15RmxvYXQpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBtMTBNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFpblRlc3RDbGllbnQubTEwKCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNhbl9tMTBNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5jYW5fbTEwKHRoaXMubXlEb3VibGUpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBtMTFNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFpblRlc3RDbGllbnQubTExKCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNhbl9tMTFNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5jYW5fbTExKHRoaXMubXlTdHJpbmcpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBtMTJNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFpblRlc3RDbGllbnQubTEyKCk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgW0V4cGVjdGVkRXhjZXB0aW9uKCB0eXBlb2YoIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiApICldCisJICAgIHB1YmxpYyB2b2lkIGNhbl9tMTJNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15Qm9vbCA9IHRoaXMubXlNYWluVGVzdENsaWVudC5jYW5fbTEyKHRoaXMubXlJbnQpOworCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBtMTNNZXRob2QoKQorCSAgICB7CisJCSAgICB0aGlzLm15TWFpblRlc3RDbGllbnQubTEzKHRoaXMubXlJbnQpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjYW5fbTEzTWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUJvb2wgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuY2FuX20xMyh0aGlzLm15SW50KTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgbTE0TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU1haW5UZXN0Q2xpZW50Lm0xNCh0aGlzLm15UzEpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjYW5fbTE0TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUJvb2wgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuY2FuX20xNCh0aGlzLm15SW50KTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24oIHR5cGVvZiggTm90U3VwcG9ydGVkRXhjZXB0aW9uICkgKV0KKwkgICAgcHVibGljIHZvaWQgbTE1TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teU1haW5UZXN0Q2xpZW50Lm0xNSgpOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIFtFeHBlY3RlZEV4Y2VwdGlvbiggdHlwZW9mKCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gKSApXQorCSAgICBwdWJsaWMgdm9pZCBjYW5fbTE1TWV0aG9kKCkKKwkgICAgeworCQkgICAgdGhpcy5teUJvb2wgPSB0aGlzLm15TWFpblRlc3RDbGllbnQuY2FuX20xNSh0aGlzLm15RTEpOworCSAgICB9CisKKyAgICAgICAgLy9bVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgTWFpblNlcnZpY2VMaXN0ZW5lckFuZENsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocmVhZENsaWVudCBjbGllbnQgPSBuZXcgVGhyZWFkQ2xpZW50KCk7CisgICAgICAgICAgICBUaHJlYWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUaHJlYWRMaXN0ZW5lcigpOworCisgICAgICAgICAgICAvLyBzdGFydCB0aGUgbGlzdGVuZXIgJiB3YWl0IHVudGlsIGl0IGhhcyBzdGFydGVkCisgICAgICAgICAgICAoIG5ldyBUaHJlYWQoIG5ldyBUaHJlYWRTdGFydCggbGlzdGVuZXIuUnVuICkgKSApLlN0YXJ0KCk7CisgICAgICAgICAgICBjb21tb25Mb2NrLldhaXRVbnRpbEVxKCBMSVNURU5FUl9TVEFSVEVELCA0MDAwICk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBjbGllbnQKKyAgICAgICAgICAgICggbmV3IFRocmVhZCggbmV3IFRocmVhZFN0YXJ0KCBjbGllbnQuUnVuICkgKSApLlN0YXJ0KCk7CisgICAgICAgICAgICBjb21tb25Mb2NrLldhaXRVbnRpbEVxKCBDTElFTlRfU1RBUlRFRCwgNDAwMCApOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggImFtIGkgY29taW5nIGhlcmU/IiApOworCisgICAgICAgICAgICBpZiAoIGNsaWVudC5IYXNFcnJvcnMoKSB8fCBsaXN0ZW5lci5IYXNFcnJvcnMoKSApCisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTW9uaXRvcjxzdHJpbmc+IGNvbW1vbkxvY2sgPSBuZXcgTW9uaXRvcjxzdHJpbmc+KCAiY29tbW9uIGxvY2siLCBudWxsICk7CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUaHJlYWRDbGllbnQKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFJlY29yZCB3aGVuIGFuIGVycm9yIG9jY3VycyB3aXRoIGNsaWVudAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHByaXZhdGUgQm9vbGVhbiBteUhhc0Vycm9yczsKKworICAgICAgICAgICAgcHVibGljIFRocmVhZENsaWVudCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXlIYXNFcnJvcnMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgUnVuKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1haW5UZXN0MUNsaWVudC5NYWluKCBudWxsICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUgKTsKKyAgICAgICAgICAgICAgICAgICAgbXlIYXNFcnJvcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUZXN0TWFpblRlc3QxQ2xpZW50LmNvbW1vbkxvY2suU2V0KCBUZXN0TWFpblRlc3QxQ2xpZW50LkNMSUVOVF9TVEFSVEVEICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gSGFzRXJyb3JzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5teUhhc0Vycm9yczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKworICAgICAgICBwcml2YXRlIGNsYXNzIFNpbXBsZVRocmVhZExpc3RlbmVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgQm9vbGVhbiBteUhhc0Vycm9yczsKKworICAgICAgICAgICAgcHVibGljIFNpbXBsZVRocmVhZExpc3RlbmVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteUhhc0Vycm9ycyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBSdW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgIC8vICAgICAgICAgICAgICAgICBNYWluVGVzdDFMaXN0ZW5lci5NYWluKCBudWxsICk7ICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggZSApOworICAgICAgICAgICAgICAgICAgICBteUhhc0Vycm9ycyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBIYXNFcnJvcnMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm15SGFzRXJyb3JzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUaHJlYWRMaXN0ZW5lcgorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIEJvb2xlYW4gbXlIYXNFcnJvcnM7CisKKyAgICAgICAgICAgIHB1YmxpYyBUaHJlYWRMaXN0ZW5lcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXlIYXNFcnJvcnMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgUnVuKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTaW1wbGVUaHJlYWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTaW1wbGVUaHJlYWRMaXN0ZW5lcigpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBsaXN0ZW5lcgorICAgICAgICAgICAgICAgICAgICBUaHJlYWQgdCA9ICggbmV3IFRocmVhZCggbmV3IFRocmVhZFN0YXJ0KCBsaXN0ZW5lci5SdW4gKSApICk7CisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgVGVzdE1haW5UZXN0MUNsaWVudC5jb21tb25Mb2NrLlNldCggVGVzdE1haW5UZXN0MUNsaWVudC5MSVNURU5FUl9TVEFSVEVEICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBIYXNFcnJvcnMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm15SGFzRXJyb3JzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBMSVNURU5FUl9TVEFSVEVEID0gIkxpc3RlbmVyX1N0YXJ0ZWQiOworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIENMSUVOVF9TVEFSVEVEID0gIkNsaWVudF9TdGFydGVkIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0TWFpblRlc3QxTGlzdGVuZXIuY3MgYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0TWFpblRlc3QxTGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjN2RjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RNYWluVGVzdDFMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDcxIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisgICAgcHVibGljIGNsYXNzIFRlc3RNYWluVGVzdDFMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIE5ld1Rlc3RTZXJ2ZXJNZXRob2QoKQorICAgICAgICB7CisgICAgICAgICAgICBNYWluVGVzdDFMaXN0ZW5lciBtID0gbmV3IE1haW5UZXN0MUxpc3RlbmVyKCk7CisgICAgICAgICAgICBPYmplY3QgbyA9IG0uTmV3VGVzdDFTZXJ2ZXIoIG51bGwgKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoIG8gKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIG8gaXMgSW1wbFRlc3QxU2VydmVyICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggIlRlc3RMaXN0ZW5lciIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgTGlzdGVuZXJUaHJlYWQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBCb29sZWFuIG15SGFzRXJyb3JzOworCisgICAgICAgICAgICBwdWJsaWMgTGlzdGVuZXJUaHJlYWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG15SGFzRXJyb3JzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFJ1bigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgIC8vICAgICAgICAgICAgICAgIE1haW5UZXN0MUxpc3RlbmVyLk1haW4oIG51bGwgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggZSApOworICAgICAgICAgICAgICAgICAgICBteUhhc0Vycm9ycyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gSGFzRXJyb3JzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXlIYXNFcnJvcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0TWl4aW4uY3MgYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0TWl4aW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjYzU3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RNaXhpbi5jcwpAQCAtMCwwICsxLDM2MyBAQAorLy8gJElkJAorLy8gCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vIAordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLk1zZzsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuU3VwcG9ydDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy50eXBlcy5CYXI7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuQmF6OwordXNpbmcgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLnR5cGVzLkZvbzsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKyAgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0TWl4aW4KKyAgICB7CisgICAgICBbVGVzdF0KKwlwdWJsaWMgdm9pZCBNZXRob2RfdGVzdEJheigpIAorCXsKKwkJCisJCSAgICBCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCisJCSAgICBCYXogYmF6ID0gbnVsbDsKKwkJICAgIGlmIChiYXogIT0gbnVsbCkKKwkJICAgIHsKKwkJICAgICAgICBiYXouYmF6MShiYXpEYXRhKTsKKwkJICAgIH0KKwkJCisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIE1ldGhvZF90ZXN0QmF6Q2xpZW50KCkgCisJeworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmF6Q2xpZW50IGJhekNsaWVudCA9IG51bGw7CisJCWlmIChiYXpDbGllbnQgIT0gbnVsbCkKKwkJeworCQkJYmF6Q2xpZW50LmJhejEoIGJhekRhdGEgKTsKKwkJCWJhekNsaWVudC5iYXozKCBiYXpEYXRhICk7CisJCX0KKwkJCisJCUJheiBiYXogPSBiYXpDbGllbnQ7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIE1ldGhvZF90ZXN0QmF6U2VydmVyKCkgCisJeworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmF6U2VydmVyIGJhelNlcnZlciA9IG51bGw7CisJCWlmIChiYXpTZXJ2ZXIgIT0gbnVsbCkKKwkJeworCQkJYmF6U2VydmVyLmJhejEoIGJhekRhdGEgKTsKKwkJCWJhelNlcnZlci5iYXoyKCBiYXpEYXRhICk7CisJCX0KKwkJCisJCUJheiBiYXogPSBiYXpTZXJ2ZXI7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIE1ldGhvZF90ZXN0QmFyKCkgCisJeworCQlCYXJEYXRhIGJhckRhdGEgPSBudWxsOworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmFyIGJhciA9IG51bGw7CisJCWlmIChiYXIgIT0gbnVsbCkKKwkJeworCQkJYmFyLmJhcjEoIGJhckRhdGEgKTsKKwkJCWJhci5iYXoxKCBiYXpEYXRhICk7CisJCX0KKwkJCisJCUJheiBiYXogPSBiYXI7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIE1ldGhvZF90ZXN0QmFyQ2xpZW50KCkgCisJeworCQlCYXJEYXRhIGJhckRhdGEgPSBudWxsOworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmFyQ2xpZW50IGJhckNsaWVudCA9IG51bGw7CisJCWlmIChiYXJDbGllbnQgIT0gbnVsbCkKKwkJeworCQkJYmFyQ2xpZW50LmJhcjEoIGJhckRhdGEgKTsKKwkJCWJhckNsaWVudC5iYXIzKCBiYXJEYXRhICk7CisJCQliYXJDbGllbnQuYmF6MSggYmF6RGF0YSApOworCQkJYmFyQ2xpZW50LmJhejMoIGJhekRhdGEgKTsKKwkJfQorCisJCUJhekNsaWVudCBiYXpDbGllbnQgPSBiYXJDbGllbnQ7CisJCUJhciBiYXIgPSBiYXJDbGllbnQ7CisJCUJheiBiYXogPSBiYXJDbGllbnQ7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIE1ldGhvZF90ZXN0QmFyU2VydmVyKCkgCisJeworCQlCYXJEYXRhIGJhckRhdGEgPSBudWxsOworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmFyU2VydmVyIGJhclNlcnZlciA9IG51bGw7CisJCWlmIChiYXJTZXJ2ZXIgIT0gbnVsbCkKKwkJeworCQkJYmFyU2VydmVyLmJhcjEoIGJhckRhdGEgKTsKKwkJCWJhclNlcnZlci5iYXIyKCBiYXJEYXRhICk7CisJCQliYXJTZXJ2ZXIuYmF6MSggYmF6RGF0YSApOworCQkJYmFyU2VydmVyLmJhejIoIGJhekRhdGEgKTsKKwkJfQorCisJCUJhelNlcnZlciBiYXpTZXJ2ZXIgPSBiYXJTZXJ2ZXI7CisJCUJhciBiYXIgPSBiYXJTZXJ2ZXI7CisJCUJheiBiYXogPSBiYXJTZXJ2ZXI7CisJfQorCQorCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIE1ldGhvZF90ZXN0Rm9vKCkgCisJeworCQlGb29EYXRhIGZvb0RhdGEgPSBudWxsOworCQlCYXJEYXRhIGJhckRhdGEgPSBudWxsOworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJRm9vIGZvbyA9IG51bGw7CisJCWlmIChmb28gIT0gbnVsbCkKKwkJeworCQkJZm9vLmZvbzEoIGZvb0RhdGEgKTsKKwkJCWZvby5iYXIxKCBiYXJEYXRhICk7CisJCQlmb28uYmF6MSggYmF6RGF0YSApOworCQl9CisJCQorCQlCYXIgYmFyID0gZm9vOworCQlCYXogYmF6ID0gZm9vOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCB0ZXN0Rm9vQ2xpZW50KCkgCisJeworCQlGb29EYXRhIGZvb0RhdGEgPSBudWxsOworCQlCYXJEYXRhIGJhckRhdGEgPSBudWxsOworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJRm9vQ2xpZW50IGZvb0NsaWVudCA9IG51bGw7CisJCWlmIChmb29DbGllbnQgIT0gbnVsbCkKKwkJeworCQkJZm9vQ2xpZW50LmZvbzEoIGZvb0RhdGEgKTsKKwkJCWZvb0NsaWVudC5mb28zKCBmb29EYXRhICk7CisJCQlmb29DbGllbnQuYmFyMSggYmFyRGF0YSApOworCQkJZm9vQ2xpZW50LmJhcjMoIGJhckRhdGEgKTsKKwkJCWZvb0NsaWVudC5iYXoxKCBiYXpEYXRhICk7CisJCQlmb29DbGllbnQuYmF6MyggYmF6RGF0YSApOworCQl9CisJCQorCQlCYXJDbGllbnQgYmFyQ2xpZW50ID0gZm9vQ2xpZW50OworCQlCYXpDbGllbnQgYmF6Q2xpZW50ID0gZm9vQ2xpZW50OworCQlGb28gZm9vID0gZm9vQ2xpZW50OworCQlCYXIgYmFyID0gZm9vQ2xpZW50OworCQlCYXogYmF6ID0gZm9vQ2xpZW50OworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCB0ZXN0Rm9vU2VydmVyKCkgCisJeworCQlGb29EYXRhIGZvb0RhdGEgPSBudWxsOworCQlCYXJEYXRhIGJhckRhdGEgPSBudWxsOworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJRm9vU2VydmVyIGZvb1NlcnZlciA9IG51bGw7CisJCWlmIChmb29TZXJ2ZXIgIT0gbnVsbCkKKwkJeworCQkJZm9vU2VydmVyLmZvbzEoIGZvb0RhdGEgKTsKKwkJCWZvb1NlcnZlci5mb28yKCBmb29EYXRhICk7CisJCQlmb29TZXJ2ZXIuYmFyMSggYmFyRGF0YSApOworCQkJZm9vU2VydmVyLmJhcjIoIGJhckRhdGEgKTsKKwkJCWZvb1NlcnZlci5iYXoxKCBiYXpEYXRhICk7CisJCQlmb29TZXJ2ZXIuYmF6MiggYmF6RGF0YSApOworCQl9CisJCQorCQlCYXJTZXJ2ZXIgYmFyU2VydmVyID0gZm9vU2VydmVyOworCQlCYXpTZXJ2ZXIgYmF6U2VydmVyID0gZm9vU2VydmVyOworCQlGb28gZm9vID0gZm9vU2VydmVyOworCQlCYXIgYmFyID0gZm9vU2VydmVyOworCQlCYXogYmF6ID0gZm9vU2VydmVyOworCX0KKwkKKwkKKyAgICBbVGVzdF0KKwlwdWJsaWMgdm9pZCBNZXRob2RfdGVzdFZhbHVlRmFjdG9yeUJhekdldFR5cGVzKCkgCisJeworICAgICAgICBEZWZhdWx0VmFsdWVGYWN0b3J5IHZmID0gbmV3IFZhbHVlRmFjdG9yeUJheigibm9uZToiKTsKKwkJTGlzdDxYVHlwZT4gYXR5cGVzID0gKExpc3Q8WFR5cGU+KXZmLkdldFR5cGVzKCk7CisJCQorCQlMaXN0PFhUeXBlPiBldHlwZXMgPSBuZXcgTGlzdDxYVHlwZT4oKTsKKworCisgICAgICAgIGV0eXBlcy5BZGQodmYuZ2V0X210X19FdGNoX1J1bnRpbWVFeGNlcHRpb24oKSk7CisgICAgICAgIGV0eXBlcy5BZGQodmYuR2V0X210X19FdGNoX0xpc3QoKSk7CisgICAgICAgIGV0eXBlcy5BZGQodmYuR2V0X210X19FdGNoX01hcCgpKTsKKyAgICAgICAgZXR5cGVzLkFkZCh2Zi5HZXRfbXRfX0V0Y2hfRGF0ZXRpbWUoKSk7CisgICAgICAgIGV0eXBlcy5BZGQodmYuZ2V0X210X19FdGNoX0F1dGhFeGNlcHRpb24oKSk7CisgICAgICAgIGV0eXBlcy5BZGQodmYuZ2V0X210X19leGNlcHRpb24oKSk7CisJCWV0eXBlcy5BZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9CYXpUYWJsZSApOworCQlldHlwZXMuQWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfQmF6RGF0YSApOworCQlldHlwZXMuQWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfYmF6MSk7CisJCWV0eXBlcy5BZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9fcmVzdWx0X2JhejEgKTsKKwkJZXR5cGVzLkFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X2JhejIgKTsKKwkJZXR5cGVzLkFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X19yZXN1bHRfYmF6MiApOworCQlldHlwZXMuQWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfYmF6MyApOworCQlldHlwZXMuQWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfX3Jlc3VsdF9iYXozICk7CisgICAgICAgIAorICAgICAgIAorICAgICAgIAorCQkKKwkJCisgICAgICAgIEFzc2VydC5BcmVFcXVhbChldHlwZXMsIGF0eXBlcyk7CisJCWZvcmVhY2ggKFhUeXBlIHR5cGUgaW4gZXR5cGVzICkKKwkJCXRlc3RHZXRUeXBlKCB2ZiwgdHlwZSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdEdldFR5cGUoIFZhbHVlRmFjdG9yeSB2ZiwgWFR5cGUgdHlwZSApCisJeworCQorICAgICAgICBBc3NlcnQuQXJlU2FtZSh0eXBlLCB2Zi5HZXRUeXBlKHR5cGUuSWQpKTsKKwkKKyAgICAgICAgQXNzZXJ0LkFyZVNhbWUodHlwZSx2Zi5HZXRUeXBlKHR5cGUuTmFtZSkpOworCX0KKworCQorCVtUZXN0XQorCXB1YmxpYyB2b2lkIE1ldGhvZF90ZXN0VmFsdWVGYWN0b3J5QmFyR2V0VHlwZXMoKSAKKwl7CisgICAgICAgIERlZmF1bHRWYWx1ZUZhY3RvcnkgdmYgPSBuZXcgVmFsdWVGYWN0b3J5QmFyKCJub25lOiIpOworCQlMaXN0PFhUeXBlPiBhdHlwZXMgPSAoTGlzdDxYVHlwZT4pdmYuR2V0VHlwZXMoKTsKKwkJCisJCUxpc3Q8WFR5cGU+IGV0eXBlcyA9IG5ldyBMaXN0PFhUeXBlPigpOworCisKKyAgICAgICAgZXR5cGVzLkFkZCh2Zi5nZXRfbXRfX0V0Y2hfUnVudGltZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgZXR5cGVzLkFkZCh2Zi5HZXRfbXRfX0V0Y2hfTGlzdCgpKTsKKyAgICAgICAgZXR5cGVzLkFkZCh2Zi5HZXRfbXRfX0V0Y2hfTWFwKCkpOworICAgICAgICBldHlwZXMuQWRkKHZmLkdldF9tdF9fRXRjaF9EYXRldGltZSgpKTsKKyAgICAgICAgZXR5cGVzLkFkZCh2Zi5nZXRfbXRfX0V0Y2hfQXV0aEV4Y2VwdGlvbigpKTsKKyAgICAgICAgZXR5cGVzLkFkZCh2Zi5nZXRfbXRfX2V4Y2VwdGlvbigpKTsKKyAgICAgICAgCisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX0JhclRhYmxlKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfQmFyRGF0YSk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX2JhcjEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9fcmVzdWx0X2JhcjEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9iYXIyKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfX3Jlc3VsdF9iYXIyKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfYmFyMyk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX19yZXN1bHRfYmFyMyk7CisKKyAgICAgICAgCisgICAgICAgCisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X0JhelRhYmxlKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfQmF6RGF0YSk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X2JhejEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9fcmVzdWx0X2JhejEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9iYXoyKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfX3Jlc3VsdF9iYXoyKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfYmF6Myk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X19yZXN1bHRfYmF6Myk7CisJCQorCQlBc3NlcnQuQXJlRXF1YWwoIGV0eXBlcywgYXR5cGVzICk7CisJCWZvcmVhY2ggKFhUeXBlIHR5cGUgaW4gZXR5cGVzICkKKwkJCXRlc3RHZXRUeXBlKCB2ZiwgdHlwZSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBNZXRob2RfdGVzdFZhbHVlRmFjdG9yeUZvb0dldFR5cGVzKCkgCisJeworICAgICAgICBEZWZhdWx0VmFsdWVGYWN0b3J5IHZmID0gbmV3IFZhbHVlRmFjdG9yeUZvbygibm9uZToiKTsKKwkJTGlzdDxYVHlwZT4gYXR5cGVzID0gKExpc3Q8WFR5cGU+KXZmLkdldFR5cGVzKCk7CisJCQorCQlMaXN0PFhUeXBlPiBldHlwZXMgPSBuZXcgTGlzdDxYVHlwZT4oKTsKKworICAgICAgICBldHlwZXMuQWRkKHZmLmdldF9tdF9fRXRjaF9SdW50aW1lRXhjZXB0aW9uKCkpOworICAgICAgICBldHlwZXMuQWRkKHZmLkdldF9tdF9fRXRjaF9MaXN0KCkpOworICAgICAgICBldHlwZXMuQWRkKHZmLkdldF9tdF9fRXRjaF9NYXAoKSk7CisgICAgICAgIGV0eXBlcy5BZGQodmYuR2V0X210X19FdGNoX0RhdGV0aW1lKCkpOworICAgICAgICBldHlwZXMuQWRkKHZmLmdldF9tdF9fRXRjaF9BdXRoRXhjZXB0aW9uKCkpOworICAgICAgICBldHlwZXMuQWRkKHZmLmdldF9tdF9fZXhjZXB0aW9uKCkpOworICAgICAgICAgICAgCisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5Rm9vLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfRm9vX0Zvb1RhYmxlKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlGb28uX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19Gb29fRm9vRGF0YSk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5Rm9vLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfRm9vX2ZvbzEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUZvby5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Zvb19fcmVzdWx0X2ZvbzEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUZvby5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Zvb19mb28yKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlGb28uX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19Gb29fX3Jlc3VsdF9mb28yKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlGb28uX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19Gb29fZm9vMyk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5Rm9vLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfRm9vX19yZXN1bHRfZm9vMyk7CisKKworICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX0JhclRhYmxlKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfQmFyRGF0YSk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX2JhcjEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9fcmVzdWx0X2JhcjEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9iYXIyKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfX3Jlc3VsdF9iYXIyKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfYmFyMyk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX19yZXN1bHRfYmFyMyk7CisKKworICAgICAgIAorICAgICAgIAorICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9CYXpUYWJsZSk7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X0JhekRhdGEpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9iYXoxKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfX3Jlc3VsdF9iYXoxKTsKKyAgICAgICAgZXR5cGVzLkFkZChWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfYmF6Mik7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X19yZXN1bHRfYmF6Mik7CisgICAgICAgIGV0eXBlcy5BZGQoVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X2JhejMpOworICAgICAgICBldHlwZXMuQWRkKFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9fcmVzdWx0X2JhejMpOworCQkKKwkgCisJCQorCQlBc3NlcnQuQXJlRXF1YWwoIGV0eXBlcywgYXR5cGVzICk7CisJCWZvcmVhY2ggKFhUeXBlIHR5cGUgaW4gZXR5cGVzICkKKwkJCXRlc3RHZXRUeXBlKCB2ZiwgdHlwZSApOworCX0KKwkKKwkKKwlbVGVzdF0KKwlwdWJsaWMgdm9pZCBNZXRob2RfZHVwbGljYXRlc0FyZVRoZVNhbWUoKSAKKwl7CisgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgVmFsdWVGYWN0b3J5QmF6KCJub25lOiIpLkdldFR5cGVzKCksIG5ldyBWYWx1ZUZhY3RvcnlCYXooIm5vbmU6IikuR2V0VHlwZXMoKSk7CisgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgVmFsdWVGYWN0b3J5QmFyKCJub25lOiIpLkdldFR5cGVzKCksIG5ldyBWYWx1ZUZhY3RvcnlCYXIoIm5vbmU6IikuR2V0VHlwZXMoKSk7CisgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgVmFsdWVGYWN0b3J5Rm9vKCJub25lOiIpLkdldFR5cGVzKCksIG5ldyBWYWx1ZUZhY3RvcnlGb28oIm5vbmU6IikuR2V0VHlwZXMoKSk7CisgICAgICAgIAorCX0gCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0UmVtb3RlVGVzdDFEb3RDc2hhcnAuY3MgYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0UmVtb3RlVGVzdDFEb3RDc2hhcnAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhMmQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RSZW1vdGVUZXN0MURvdENzaGFycC5jcwpAQCAtMCwwICsxLDEzNTQgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuVGVzdDE7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0UmVtb3RlVGVzdDFEb3RDc2hhcnAKKyAgICB7CisgICAgICAgIFZhbHVlRmFjdG9yeSB2ZiA9IG5ldyBEdW1teVZhbHVlRmFjdG9yeSgpOworCisgICAgICAgIHB1YmxpYyBUZXN0UmVtb3RlVGVzdDFEb3RDc2hhcnAoKQorICAgICAgICB7CisgICAgICAgICAgICAgc3ZjID0gbmV3IE15RGVsaXZlcnlTZXJ2aWNlKCk7CisgICAgICAgICAgICAgdGVzdCA9IG5ldyBSZW1vdGVUZXN0MSggc3ZjLCB2ZiApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0UmVtb3RlIiApOworICAgICAgICB9CisKKworICAgICAgICBbU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldFVwQXR0cmlidXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ZjID0gbmV3IE15RGVsaXZlcnlTZXJ2aWNlKCk7CisgICAgICAgICAgICB0ZXN0ID0gbmV3IFJlbW90ZVRlc3QxKCBzdmMsIHZmICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX25vdGhpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0Lm5vdGhpbmcoKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9ub3RoaW5nLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9ub3RoaW5nLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfaW5jcjEoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IDI7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIHRlc3QuaW5jciggMSApICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgMSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9pbmNyLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfaW5jcjIoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IDM7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIHRlc3QuaW5jciggMiApICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgMiB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9pbmNyLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfaW5jcjMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IC0xOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAtMSwgdGVzdC5pbmNyKCAtMiApICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgLTIgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaW5jciwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3N1YjEoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IDU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDUsIHRlc3Quc3ViKCA3LCAyICkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9zdWIsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3kgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyA3LCAyIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1YiwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3N1YjIoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IDg7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDgsIHRlc3Quc3ViKCAyMywgMTUgKSApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3N1YiwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeSB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IDIzLCAxNSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9zdWIsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9zdWIzKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSAtNTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggLTUsIHRlc3Quc3ViKCAyLCA3ICkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9zdWIsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3kgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAyLCA3IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1YiwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3N1bSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gMjQ7CisgICAgICAgICAgICBpbnRbXSBhcmcgPSB7IDEsIDIsIDMsIDcsIDExIH07CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDI0LCB0ZXN0LnN1bSggYXJnICkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9zdW0sCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGFyZyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9zdW0sCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczEoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IDI7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIHRlc3QudHJhbnMoIEUxLkEsIDUgKSApOyAvLyBkaXZpZGUgYnkgMgorICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3RyYW5zLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgRTEuQSwgNSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF90cmFucywKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gMTA7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEwLCB0ZXN0LnRyYW5zKCBFMS5CLCA1ICkgKTsgLy8gbXVsIGJ5IDIKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90cmFucywKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IEUxLkIsIDUgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdHJhbnMsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IDEyOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMiwgdGVzdC50cmFucyggRTEuQywgNSApICk7IC8vIGFkZCA3CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfdHJhbnMsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBFMS5DLCA1IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3RyYW5zLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfZGlzdDEoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IE1hdGguU3FydCggMyApOworICAgICAgICAgICAgUzEgYXJnMSA9ICBuZXcgUzEoIDEsIDEsIDEgKTsKKyAgICAgICAgICAgIFMxIGFyZzIgPSBuZXcgUzEoIDAsIDAsIDAgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggTWF0aC5TcXJ0KCAzICksIHRlc3QuZGlzdCggYXJnMSwgYXJnMiApICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZGlzdCwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYiB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfZGlzdCwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX2Rpc3QyKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBNYXRoLlNxcnQoIDM1ICk7CisgICAgICAgICAgICBTMSBhcmcxID0gbmV3IFMxKCAxLCAyLCAzICk7CisgICAgICAgICAgICBTMSBhcmcyID0gbmV3IFMxKCA2LCA1LCA0ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIE1hdGguU3FydCggMzUgKSwgdGVzdC5kaXN0KCBhcmcxLCBhcmcyICkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9kaXN0LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9iIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9kaXN0LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfZGlzdDMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IE1hdGguU3FydCggNTYgKTsKKyAgICAgICAgICAgIFMxIGFyZzEgPSBuZXcgUzEoIDEsIDIsIDMgKTsKKyAgICAgICAgICAgIFMxIGFyZzIgPSBuZXcgUzEoIC0xLCAtMiwgLTMgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggTWF0aC5TcXJ0KCA1NiApLCB0ZXN0LmRpc3QoIGFyZzEsIGFyZzIgKSApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2Rpc3QsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Rpc3QsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gbmV3IGludFtdIHsgfTsKKyAgICAgICAgICAgIGludFtdIHggPSB0ZXN0LmZpbGwoIDAsIDEgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMCwgeC5MZW5ndGggKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBpbnQgaSBpbiB4ICkKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX24sIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgMCwgMSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfZmlsbDIoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IG5ldyBpbnRbXSB7IDIgfTsKKyAgICAgICAgICAgIGludFtdIHggPSB0ZXN0LmZpbGwoIDEsIDIgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgeC5MZW5ndGggKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBpbnQgaSBpbiB4ICkKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIGkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX24sIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgMSwgMiB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfZmlsbDMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IG5ldyBpbnRbXSB7IDMsIDMgfTsKKyAgICAgICAgICAgIGludFtdIHggPSB0ZXN0LmZpbGwoIDIsIDMgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMiwgeC5MZW5ndGggKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBpbnQgaSBpbiB4ICkKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIGkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX24sIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgMiwgMyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfYmxvdzEoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdmMueHJlc3VsdCA9IG5ldyBFeGNwMSggImZvbyIsIDIgKTsKKyAgICAgICAgICAgICAgICB0ZXN0LmJsb3coICJmb28iLCAyICk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggRXhjcDEgZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAiZm9vIiwgZS5tc2cgKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIGUuY29kZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2Jsb3csCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICJmb28iLCAyIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Jsb3csCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9ibG93MigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gbmV3IEV4Y3AxKCAiYmFyIiwgMyApOworICAgICAgICAgICAgICAgIHRlc3QuYmxvdyggImJhciIsIDMgKTsKKyAgICAgICAgICAgICAgICAvL2ZhaWwoICJibG93IGRpZCBub3QgdGhyb3ciICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y3AxIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggImJhciIsIGUubXNnICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAzLCBlLmNvZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9ibG93LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAiYmFyIiwgMyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9ibG93LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMxKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSA1OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA1LCB0ZXN0LmJlZXRzKCBFMS5BICkgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9iZWV0cywKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgRTEuQSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9iZWV0cywKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgZXhjZXB0aW9uRmxhZyA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBuZXcgRXhjcDMoKTsKKyAgICAgICAgICAgICAgICB0ZXN0LmJlZXRzKCBFMS5CICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y3AzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25GbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZXhjZXB0aW9uRmxhZyk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IEUxLkIgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9iZWV0czMoKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGV4Y2VwdGlvbkZsYWcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gbmV3IEV4Y3A0KCk7CisgICAgICAgICAgICAgICAgdGVzdC5iZWV0cyggRTEuQyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNwNCAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkZsYWcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggZXhjZXB0aW9uRmxhZyApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2JlZXRzLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBFMS5DIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vW1Rlc3RdCisgICAgICAgIC8vcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzNCgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBzdmMueHJlc3VsdCA9IG51bGw7CisgICAgICAgIC8vICAgIEFzc2VydC5Jc051bGwoIHRlc3QuYmVldHMoIG51bGwgKSApOworICAgICAgICAvLyAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAvLyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9iZWV0cywKKyAgICAgICAgLy8gICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UgfSwKKyAgICAgICAgLy8gICAgICAgIG5ldyBPYmplY3RbXSB7IG51bGwgfSwKKyAgICAgICAgLy8gICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9iZWV0cywKKyAgICAgICAgLy8gICAgICAgIDQwMDAgKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBib29sIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfYm9vbGVhbl9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ZjLmNsZWFyKCk7CisgICAgICAgICAgICBib29sPyBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGJvb2w/IHIgPSB0ZXN0LnBfYm9vbGVhbiggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ib29sZWFuLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHt9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7fSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ib29sZWFuLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9ib29sZWFuKCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbD8gYSA9IHRydWU7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBib29sPyByID0gdGVzdC5wX2Jvb2xlYW4oIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYm9vbGVhbiwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Jvb2xlYW4sCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2Jvb2xlYW5fYXJyYXlfbnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGJvb2xbXSByID0gdGVzdC5wX2Jvb2xlYW5fYXJyYXkoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYm9vbGVhbl9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYm9vbGVhbl9hcnJheSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfYm9vbGVhbl9hcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgeCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbCB5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJvb2xbXSBhID0geyB4LCB5IH07CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBib29sW10gciA9IHRlc3QucF9ib29sZWFuX2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2Jvb2xlYW5fYXJyYXksCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGEgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ib29sZWFuX2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8KKyAgICAgICAgLy8gc2J5dGUgLy8KKyAgICAgICAgLy8vLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9ieXRlX251bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBzYnl0ZT8gYSA9IG51bGw7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBzYnl0ZT8gciA9IHRlc3QucF9ieXRlKCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2J5dGUsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYnl0ZSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfYnl0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNieXRlPyBhID0gMTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIHNieXRlPyByID0gdGVzdC5wX2J5dGUoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYnl0ZSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGUsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2J5dGVfYXJyYXlfbnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNieXRlW10gYSA9IG51bGw7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBzYnl0ZVtdIHIgPSB0ZXN0LnBfYnl0ZV9hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ieXRlX2FycmF5LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGVfYXJyYXksCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2J5dGVfYXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICBzYnl0ZSB4ID0gMTI7CisgICAgICAgICAgICBzYnl0ZSB5ID0gMjM7CisgICAgICAgICAgICBzYnl0ZVtdIGEgPSB7IHgsIHkgfTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIHNieXRlW10gciA9IHRlc3QucF9ieXRlX2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2J5dGVfYXJyYXksCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGEgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ieXRlX2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vCisgICAgICAgIC8vIFNIT1JUIC8vCisgICAgICAgIC8vLy8vLy8vLy8vCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX3Nob3J0X251bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydD8gYSA9IG51bGw7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBzaG9ydD8gciA9IHRlc3QucF9zaG9ydCggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zaG9ydCwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3Nob3J0LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9zaG9ydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0PyBhID0gMTIzNDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIHNob3J0PyByID0gdGVzdC5wX3Nob3J0KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3Nob3J0LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBhIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnQsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX3Nob3J0X2FycmF5X251bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydFtdIGEgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgc2hvcnRbXSByID0gdGVzdC5wX3Nob3J0X2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3Nob3J0X2FycmF5LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3Nob3J0X2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9zaG9ydF9hcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0IHggPSAxMjM0OworICAgICAgICAgICAgc2hvcnQgeSA9IDIzNDU7CisgICAgICAgICAgICBzaG9ydFtdIGEgPSB7IHgsIHkgfTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIHNob3J0W10gciA9IHRlc3QucF9zaG9ydF9hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zaG9ydF9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3Nob3J0X2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLworICAgICAgICAvLyBJTlQgLy8KKyAgICAgICAgLy8vLy8vLy8vCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2ludF9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50PyBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGludD8gciA9IHRlc3QucF9pbnQoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfaW50LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2ludCwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfaW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50PyBhID0gMTIzNDU2Nzg7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBpbnQ/IHIgPSB0ZXN0LnBfaW50KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2ludCwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2ludCwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfaW50X2FycmF5X251bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnRbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGludFtdIHIgPSB0ZXN0LnBfaW50X2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2ludF9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9pbnRfYXJyYXksCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2ludF9hcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB4ID0gMTIzNDU2Nzg7CisgICAgICAgICAgICBpbnQgeSA9IDIzNDU2Nzg5OworICAgICAgICAgICAgaW50W10gYSA9IHsgeCwgeSB9OworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgaW50W10gciA9IHRlc3QucF9pbnRfYXJyYXkoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfaW50X2FycmF5LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBhIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfaW50X2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8KKyAgICAgICAgLy8gTE9ORyAvLworICAgICAgICAvLy8vLy8vLy8vCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2xvbmdfbnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmc/IGEgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgbG9uZz8gciA9IHRlc3QucF9sb25nKCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2xvbmcsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmcsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2xvbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nPyBhID0gMTIzNDU2NzgxMjM0NTY3OEw7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBsb25nPyByID0gdGVzdC5wX2xvbmcoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfbG9uZywKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmcsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2xvbmdfYXJyYXlfbnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmdbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGxvbmdbXSByID0gdGVzdC5wX2xvbmdfYXJyYXkoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfbG9uZ19hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfbG9uZ19hcnJheSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfbG9uZ19hcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgeCA9IDEyMzQ1Njc4MTIzNDU2NzhMOworICAgICAgICAgICAgbG9uZyB5ID0gMjM0NTY3ODkyMzQ1Njc4OUw7CisgICAgICAgICAgICBsb25nW10gYSA9IHsgeCwgeSB9OworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgbG9uZ1tdIHIgPSB0ZXN0LnBfbG9uZ19hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9sb25nX2FycmF5LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBhIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfbG9uZ19hcnJheSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLworICAgICAgICAvLyBmbG9hdCAvLworICAgICAgICAvLy8vLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9mbG9hdF9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQ/IGEgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgZmxvYXQ/IHIgPSB0ZXN0LnBfZmxvYXQoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZmxvYXQsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Zsb2F0LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9mbG9hdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0PyBhID0gMTIzLjQ1NmY7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBmbG9hdD8gciA9IHRlc3QucF9mbG9hdCggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9mbG9hdCwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Zsb2F0LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9mbG9hdF9hcnJheV9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXRbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGZsb2F0W10gciA9IHRlc3QucF9mbG9hdF9hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9mbG9hdF9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9mbG9hdF9hcnJheSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfZmxvYXRfYXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB4ID0gMTIzLjQ1NmY7CisgICAgICAgICAgICBmbG9hdCB5ID0gMjM0LjU2N2Y7CisgICAgICAgICAgICBmbG9hdFtdIGEgPSB7IHgsIHkgfTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGZsb2F0W10gciA9IHRlc3QucF9mbG9hdF9hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9mbG9hdF9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Zsb2F0X2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vLworICAgICAgICAvLyBET1VCTEUgLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vCisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX2RvdWJsZV9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlPyBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGRvdWJsZT8gciA9IHRlc3QucF9kb3VibGUoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZG91YmxlLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2RvdWJsZSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfZG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlPyBhID0gMTIzNDU2NzguMTIzNDU2Nzg7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBkb3VibGU/IHIgPSB0ZXN0LnBfZG91YmxlKCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2RvdWJsZSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2RvdWJsZSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfZG91YmxlX2FycmF5X251bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGVbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGRvdWJsZVtdIHIgPSB0ZXN0LnBfZG91YmxlX2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2RvdWJsZV9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlX2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9kb3VibGVfYXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgeCA9IDEyMzQ1Njc4LjEyMzQ1Njc4OworICAgICAgICAgICAgZG91YmxlIHkgPSAyMzQ1Njc4OS4yMzQ1Njc4OTsKKyAgICAgICAgICAgIGRvdWJsZVtdIGEgPSB7IHgsIHkgfTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIGRvdWJsZVtdIHIgPSB0ZXN0LnBfZG91YmxlX2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2RvdWJsZV9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2RvdWJsZV9hcnJheSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gU1RSSU5HIC8vCisgICAgICAgIC8vLy8vLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9zdHJpbmdfbnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIFN0cmluZyByID0gdGVzdC5wX3N0cmluZyggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zdHJpbmcsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9zdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgYSA9ICJhYmMiOworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgU3RyaW5nIHIgPSB0ZXN0LnBfc3RyaW5nKCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3N0cmluZywKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3N0cmluZywKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3Bfc3RyaW5nX2FycmF5X251bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHIgPSB0ZXN0LnBfc3RyaW5nX2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3N0cmluZ19hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nX2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9zdHJpbmdfYXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgeCA9ICJhYmMiOworICAgICAgICAgICAgU3RyaW5nIHkgPSAiYmNkIjsKKyAgICAgICAgICAgIFN0cmluZ1tdIGEgPSB7IHgsIHkgfTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHIgPSB0ZXN0LnBfc3RyaW5nX2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3N0cmluZ19hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3N0cmluZ19hcnJheSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLworICAgICAgICAvLyBFMSAvLworICAgICAgICAvLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9FMV9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgRTE/IGEgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgRTE/IHIgPSB0ZXN0LnBfRTEoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfRTEsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTEsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX0UxKCkKKyAgICAgICAgeworICAgICAgICAgICAgRTEgYSA9IEUxLkE7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBFMT8gciA9IHRlc3QucF9FMSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9FMSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX0UxLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9FMV9hcnJheV9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgRTFbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIEUxW10gciA9IHRlc3QucF9FMV9hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9FMV9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTFfYXJyYXksCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX0UxX2FycmF5KCkKKyAgICAgICAgeworICAgICAgICAgICAgRTEgeCA9IEUxLkE7CisgICAgICAgICAgICBFMSB5ID0gRTEuQjsKKyAgICAgICAgICAgIEUxW10gYSA9IHsgeCwgeSB9OworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgRTFbXSByID0gdGVzdC5wX0UxX2FycmF5KCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX0UxX2FycmF5LAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBhIH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTFfYXJyYXksCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8KKyAgICAgICAgLy8gUzEgLy8KKyAgICAgICAgLy8vLy8vLy8KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfUzFfbnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFMxIGEgPSBudWxsOworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgUzEgciA9IHRlc3QucF9TMSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzEsCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX1MxKCkKKyAgICAgICAgeworICAgICAgICAgICAgUzEgYSA9IG5ldyBTMSggMSwgMiwgMyApOworICAgICAgICAgICAgc3ZjLnhyZXN1bHQgPSBhOworICAgICAgICAgICAgUzEgciA9IHRlc3QucF9TMSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX1MxLAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9TMV9hcnJheV9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgUzFbXSBhID0gbnVsbDsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIFMxW10gciA9IHRlc3QucF9TMV9hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMV9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7ICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IH0sCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzFfYXJyYXksCisgICAgICAgICAgICAgICAgNDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9wX1MxX2FycmF5KCkKKyAgICAgICAgeworICAgICAgICAgICAgUzEgeCA9IG5ldyBTMSggMSwgMiwgMyApOworICAgICAgICAgICAgUzEgeSA9IG5ldyBTMSggMiwgMywgNCApOworICAgICAgICAgICAgUzFbXSBhID0geyB4LCB5IH07CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBTMVtdIHIgPSB0ZXN0LnBfUzFfYXJyYXkoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzFfYXJyYXksCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGEgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMV9hcnJheSwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLworICAgICAgICAvLyBTMiAvLworICAgICAgICAvLy8vLy8vLworCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9TMl9udWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgUzIgYSA9IG51bGw7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBTMiByID0gdGVzdC5wX1MyKCBhICk7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKyAgICAgICAgICAgIGNoZWNrKCBXaGF0LkNBTEwsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX1MyLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZFtdIHsgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMiwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfUzIoKQorICAgICAgICB7CisgICAgICAgICAgICBTMiBhID0gbmV3IFMyKCBuZXcgUzEoIDEsIDIsIDMgKSwgbmV3IFMxKCAyLCAzLCA0ICksIEUxLkEgKTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIFMyIHIgPSB0ZXN0LnBfUzIoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzIsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGEgfSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMiwKKyAgICAgICAgICAgICAgICA0MDAwICk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdF0KKyAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kX3BfUzJfYXJyYXlfbnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFMyW10gYSA9IG51bGw7CisgICAgICAgICAgICBzdmMueHJlc3VsdCA9IGE7CisgICAgICAgICAgICBTMltdIHIgPSB0ZXN0LnBfUzJfYXJyYXkoIGEgKTsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworICAgICAgICAgICAgY2hlY2soIFdoYXQuQ0FMTCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzJfYXJyYXksCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkW10geyAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX1MyX2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RfcF9TMl9hcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFMyIHggPSBuZXcgUzIoIG5ldyBTMSggMSwgMiwgMyApLCBuZXcgUzEoIDIsIDMsIDQgKSwgRTEuQSApOworICAgICAgICAgICAgUzIgeSA9IG5ldyBTMiggbmV3IFMxKCAyLCAzLCA0ICksIG5ldyBTMSggMywgNCwgNSApLCBFMS5CICk7CisgICAgICAgICAgICBTMltdIGEgPSB7IHgsIHkgfTsKKyAgICAgICAgICAgIHN2Yy54cmVzdWx0ID0gYTsKKyAgICAgICAgICAgIFMyW10gciA9IHRlc3QucF9TMl9hcnJheSggYSApOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisgICAgICAgICAgICBjaGVjayggV2hhdC5DQUxMLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMl9hcnJheSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYSB9LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX1MyX2FycmF5LAorICAgICAgICAgICAgICAgIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gVVRJTElUWSBTVFVGRiAvLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBhCisgICAgICAgICAqIEBwYXJhbSBiCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0T2JqZWN0RXF1YWxzKCBPYmplY3QgYSwgT2JqZWN0IGIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGEgPT0gYiApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoIGEgPT0gbnVsbCB8fCBiID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vZmFpbCggImEgPT0gbnVsbCB8fCBiID09IG51bGwiICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggZmFsc2UgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKCBhLkdldFR5cGUoKSwgYi5HZXRUeXBlKCkgKTsKKworICAgICAgICAgICAgaWYgKCAoIGEgaXMgQXJyYXkgKSAmJiAoIGIgaXMgQXJyYXkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoIGEsIGIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggYSwgYiApOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBhCisgICAgICAgICAqIEBwYXJhbSBiCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoIE9iamVjdCBhLCBPYmplY3QgYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuID0gKCAoIEFycmF5ICkgYSApLkxlbmd0aDsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggbiwgKCAoIEFycmF5ICkgYiApLkxlbmd0aCApOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgICBhc3NlcnRPYmplY3RFcXVhbHMoICggKCBBcnJheSApIGEgKS5HZXRWYWx1ZSggaSApLCAoICggQXJyYXkgKSBiICkuR2V0VmFsdWUoIGkgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrKCBXaGF0IHdoYXQsIFhUeXBlIHR5cGUsIEZpZWxkW10gZmllbGRzLCBPYmplY3RbXSBvYmplY3RzLAorICAgICAgICAgICAgWFR5cGUgcmVzdWx0VHlwZSwgaW50IHRpbWVvdXQgKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHdoYXQsIHN2Yy53aGF0ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHR5cGUsIHN2Yy54bXNnLkdldFhUeXBlICk7CisKKyAgICAgICAgICAgIGludCBuID0gZmllbGRzLkxlbmd0aDsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggbiwgb2JqZWN0cy5MZW5ndGggKTsKKworICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSggInNpemUgPSAiICsgc3ZjLnhtc2cuQ291bnQgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggbiwgc3ZjLnhtc2cuQ291bnQgKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWVsZCBmID0gZmllbGRzWyBpIF07CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBvYmplY3RzWyBpIF0sIHN2Yy54bXNnLkdldCggZiApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggcmVzdWx0VHlwZSwgc3ZjLnhyZXNwb25zZVR5cGUgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCwgc3ZjLnhyZXNwb25zZUZpZWxkICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoICB0aW1lb3V0LCBzdmMueHRpbWVvdXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBlbnVtIFdoYXQgeyBTRU5ELCBDQUxMLCBTSFVURE9XTk9VVFBVVCwgQkVHSU5DQUxMIH0KKworICAgICAgICBwcml2YXRlIE15RGVsaXZlcnlTZXJ2aWNlIHN2YzsKKyAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEgdGVzdDsKKworICAgICAgICBwdWJsaWMgIGNsYXNzIE15RGVsaXZlcnlTZXJ2aWNlIDogRGVsaXZlcnlTZXJ2aWNlLE1haWxib3hNYW5hZ2VyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBFbnVtIHdoYXQ7CisgICAgICAgICAgICBwdWJsaWMgTWVzc2FnZSB4bXNnOworICAgICAgICAgICAgcHVibGljIFhUeXBlIHhyZXNwb25zZVR5cGU7CisgICAgICAgICAgICBwdWJsaWMgRmllbGQgeHJlc3BvbnNlRmllbGQ7CisgICAgICAgICAgICBwdWJsaWMgaW50PyB4dGltZW91dDsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgeHJlc3VsdDsKKyAgICAgICAgICAgIHB1YmxpYyBNYWlsYm94IHhtYjsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoYXQgPSBudWxsOworICAgICAgICAgICAgICAgIHhtc2cgPSBudWxsOworICAgICAgICAgICAgICAgIHhyZXNwb25zZVR5cGUgPSBudWxsOworICAgICAgICAgICAgICAgIHhyZXNwb25zZUZpZWxkID0gbnVsbDsKKyAgICAgICAgICAgICAgICB4dGltZW91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgeHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlbmQoIE1lc3NhZ2UgbXNnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCB3aGF0ICk7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuU0VORDsKKyAgICAgICAgICAgICAgICB4bXNnID0gbXNnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTWFpbGJveCBCZWdpbkNhbGwoIE1lc3NhZ2UgbXNnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKCB3aGF0ICk7CisgICAgICAgICAgICAgICAgd2hhdCA9IFdoYXQuQkVHSU5DQUxMOworICAgICAgICAgICAgICAgIHhtc2cgPSBtc2c7CisgICAgICAgICAgICAgICAgeG1iID0gbmV3IFBsYWluTWFpbGJveCggdGhpcywgMEwgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geG1iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IEVuZENhbGwoIE1haWxib3ggbWIsIFhUeXBlIHJlc3BvbnNlVHlwZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBXaGF0LkJFR0lOQ0FMTCwgd2hhdCApOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggeG1iLCBtYiApOworICAgICAgICAgICAgICAgIHdoYXQgPSBXaGF0LkNBTEw7CisgICAgICAgICAgICAgICAgeG1iID0gbnVsbDsKKyAgICAgICAgICAgICAgICB4cmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlOworICAgICAgICAgICAgICAgIHhyZXNwb25zZUZpZWxkID0gcmVzcG9uc2VUeXBlLlJlc3BvbnNlRmllbGQ7CisgICAgICAgICAgICAgICAgeHRpbWVvdXQgPSByZXNwb25zZVR5cGUuVGltZW91dDsKKyAgICAgICAgICAgICAgICBpZiAoIHhyZXN1bHQgaXMgRXhjZXB0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCBFeGNlcHRpb24gKSB4cmVzdWx0OworICAgICAgICAgICAgICAgIHJldHVybiB4cmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydCBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgVHJhbnNwb3J0UXVlcnkoIG9iamVjdCBxdWVyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydENvbnRyb2woIG9iamVjdCBjb250cm9sLCBvYmplY3QgdmFsdWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vaWdub3JlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE5vdGlmeSggb2JqZWN0IGV2ZW50T2JqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gRGVsaXZlcnlTZXJ2aWNlIE1lbWJlcnMKKworICAgICAgICAKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgcHVibGljIHZvaWQgUmVkZWxpdmVyKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApIAorCQkgICAgeworCQkJLy8gaWdub3JlCisJCSAgICB9CisKKwkJICAgIHB1YmxpYyB2b2lkIFVucmVnaXN0ZXIoIE1haWxib3ggbWIgKQorCQkgICAgeworCQkJLy8gaWdub3JlCisJCSAgICB9CisKKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnRNZXNzYWdlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0TWVzc2FnZShXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBUcmFuc3BvcnQ8U2Vzc2lvbk1lc3NhZ2U+IE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXNzaW9uKFNlc3Npb25NZXNzYWdlIHNlc3Npb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU2Vzc2lvbk1lc3NhZ2UgR2V0U2Vzc2lvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbk1lc3NhZ2UgTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBTZXNzaW9uTWVzc2FnZShXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBTZXNzaW9uUXVlcnkob2JqZWN0IHF1ZXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2wob2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Ob3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIE1haWxib3hNYW5hZ2VyIE1lbWJlcnMKKworCisgICAgICAgICAgICBwdWJsaWMgTWFpbGJveCBUcmFuc3BvcnRDYWxsKFdobyByZWNpcGllbnQsIE1lc3NhZ2UgbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdFN0dWJUZXN0MURvdENzaGFycC5jcyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RTdHViVGVzdDFEb3RDc2hhcnAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3OWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RTdHViVGVzdDFEb3RDc2hhcnAuY3MKQEAgLTAsMCArMSw0MjYgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuTXNnOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5TdXBwb3J0OwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5UcmFuc3BvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWw7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuVGVzdDE7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0U3R1YlRlc3QxRG90Q3NoYXJwCisgICAgeworICAgICAgICBbVGVzdEZpeHR1cmVTZXRVcF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggIlRlc3RTdHViIiApOworICAgICAgICB9CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3QgPSBuZXcgRmFrZVRlc3QxKCk7CisgICAgICAgICAgICB2ZiA9IG5ldyBWYWx1ZUZhY3RvcnlUZXN0MSgibm9uZToiKTsKKwkgICAgICAgIHBvb2wgPSBuZXcgRnJlZVBvb2woKTsKKyAgICAgICAgICAgIHNyYyA9IG5ldyBNeU1lc3NhZ2VTb3VyY2UoIHRoaXMgKTsKKyAgICAgICAgICAgIHN0dWIgPSBuZXcgU3R1YlRlc3QxKCBzcmMsIHRlc3QsIHBvb2wsIHBvb2wgKTsKKyAgICAgICAgICAgIHhyZXBseU1vbi5TZXQoIG51bGwgKTsKKyAgICAgICAgfQorCisgICAgICAgIE1vbml0b3I8TWVzc2FnZT4geHJlcGx5TW9uID0gbmV3IE1vbml0b3I8TWVzc2FnZT4oICJNb25pdG9yIGZvciB4cmVwbHkiICk7CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9ub3RoaW5nKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfbm90aGluZywgdmYgKTsKKyAgICAgICAgICAgIC8vIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCAzICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisgICAgICAgICAgICB4cmVwbHlNb24uV2FpdFVudGlsTm90RXEoIG51bGwgKTsKKwkJICAgIHNyYy54cmVwbHkuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfbm90aGluZyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBzcmMueHJlcGx5LkNvdW50ICk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2luY3IxKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwgdmYgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCAzICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisgICAgICAgICAgICB4cmVwbHlNb24uV2FpdFVudGlsTm90RXEoIG51bGwgKTsKKwkJICAgIHNyYy54cmVwbHkuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaW5jciApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNyYy54cmVwbHkuQ291bnQpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA0LCBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJICAgIH0KKworCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2Rfc3ViKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfc3ViLCB2ZiApOworCQkgICAgbXNnLkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIDcgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl95LCAzICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisJCSAgICBzcmMueHJlcGx5LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1YiApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNyYy54cmVwbHkuQ291bnQpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA0LCBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3N1bSgpIAorCSAgICB7CisJCSAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3N1bSwgdmYgKTsKKyAgICAgICAgICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCBuZXcgaW50W10geyAxLCAyLCAzLCA3LCAxMSB9ICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisJCSAgICBzcmMueHJlcGx5LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1bSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNyYy54cmVwbHkuQ291bnQpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyNCwgc3JjLnhyZXBseS5HZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKSApOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczEoKSAKKwkgICAgeworCQkgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90cmFucywgdmYgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lLCBFMS5BICk7CisJCSAgICBtc2cuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgNSApOworCQkgICAgc3R1Yi5TZXNzaW9uTWVzc2FnZSggbnVsbCwgbXNnICk7CisJCSAgICAvLyBjaGVjayB0aGUgcmVzdWx0LgorCQkgICAgc3JjLnhyZXBseS5DaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF90cmFucyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNyYy54cmVwbHkuQ291bnQpOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMigpIAorCSAgICB7CisJCSAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3RyYW5zLCB2ZiApOworCQkgICAgbXNnLkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UsIEUxLkIgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCA1ICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisJCSAgICBzcmMueHJlcGx5LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3RyYW5zICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgc3JjLnhyZXBseS5Db3VudCk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEwLCBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMygpIAorCSAgICB7CisJCSAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3RyYW5zLCB2ZiApOworCQkgICAgbXNnLkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UsIEUxLkMgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCA1ICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisJCSAgICBzcmMueHJlcGx5LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3RyYW5zICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgc3JjLnhyZXBseS5Db3VudCk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEyLCBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2Rpc3QxKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZGlzdCwgdmYgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hLCBuZXcgUzEoIDEsIDEsIDEgKSApOworCQkgICAgbXNnLkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IsIG5ldyBTMSggMCwgMCwgMCApICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisJCSAgICBzcmMueHJlcGx5LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Rpc3QgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMSwgc3JjLnhyZXBseS5Db3VudCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBNYXRoLlNxcnQoIDMgKSwgc3JjLnhyZXBseS5HZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKSApOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9kaXN0MigpIAorCSAgICB7CisJCSAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2Rpc3QsIHZmICk7CisJCSAgICBtc2cuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSwgbmV3IFMxKCAxLCAyLCAzICkgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9iLCBuZXcgUzEoIDYsIDUsIDQgKSApOworCQkgICAgc3R1Yi5TZXNzaW9uTWVzc2FnZSggbnVsbCwgbXNnICk7CisJCSAgICAvLyBjaGVjayB0aGUgcmVzdWx0LgorCQkgICAgc3JjLnhyZXBseS5DaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9kaXN0ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIHNyYy54cmVwbHkuQ291bnQgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggTWF0aC5TcXJ0KCAzNSApLCBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2ZpbGwoKSAKKwkgICAgeworCQkgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLCB2ZiApOworCQkgICAgbXNnLkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX24sIDQgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCAzICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisJCSAgICBzcmMueHJlcGx5LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2ZpbGwgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBzcmMueHJlcGx5LkNvdW50KTsKKwkJICAgIGludFtdIHggPSAoaW50W10pIHNyYy54cmVwbHkuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKCB4ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDQsIHguTGVuZ3RoICk7CisJCSAgICBmb3JlYWNoIChpbnQgeSBpbiB4KQorCQkJICAgIEFzc2VydC5BcmVFcXVhbCggMywgeSApOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9ibG93KCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmxvdywgdmYgKTsKKwkJICAgIG1zZy5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2csICJmb28iICk7CisJCSAgICBtc2cuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSwgMjMgKTsKKwkJICAgIHN0dWIuU2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkgICAgLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJICAgIHNyYy54cmVwbHkuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmxvdyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNyYy54cmVwbHkuQ291bnQpOworCQkgICAgRXhjcDEgZSA9IChFeGNwMSkgc3JjLnhyZXBseS5HZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJICAgIEFzc2VydC5Jc05vdE51bGwoIGUgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggImZvbyIsIGUubXNnICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIzLCBlLmNvZGUgKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMxKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsIHZmICk7CisJCSAgICBtc2cuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgRTEuQSApOworCQkgICAgc3R1Yi5TZXNzaW9uTWVzc2FnZSggbnVsbCwgbXNnICk7CisJCSAgICAvLyBjaGVjayB0aGUgcmVzdWx0LgorCQkgICAgc3JjLnhyZXBseS5DaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9iZWV0cyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBzcmMueHJlcGx5LkNvdW50ICk7CisJCSAgICBPYmplY3QgbyA9IHNyYy54cmVwbHkuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDUsIG8gKTsKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMyKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsIHZmICk7CisJCSAgICBtc2cuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgRTEuQiApOworCQkgICAgc3R1Yi5TZXNzaW9uTWVzc2FnZSggbnVsbCwgbXNnICk7CisJCSAgICAvLyBjaGVjayB0aGUgcmVzdWx0LgorCQkgICAgc3JjLnhyZXBseS5DaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9iZWV0cyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBzcmMueHJlcGx5LkNvdW50ICk7CisJCSAgICBPYmplY3QgbyA9IHNyYy54cmVwbHkuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHR5cGVvZihFeGNwMyksIG8uR2V0VHlwZSgpICk7CisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzMygpIAorCSAgICB7CisJCSAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2JlZXRzLCB2ZiApOworCQkgICAgbXNnLkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UsIEUxLkMgKTsKKwkJICAgIHN0dWIuU2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkgICAgLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJICAgIHNyYy54cmVwbHkuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMSwgc3JjLnhyZXBseS5Db3VudCApOworCQkgICAgT2JqZWN0IG8gPSBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCB0eXBlb2YoRXhjcDQpLCBvLkdldFR5cGUoKSApOworCSAgICB9CisKKwkgICAgLy9bVGVzdF0KKwkgICAgLy9wdWJsaWMgdm9pZCBtZXRob2RfYmVldHM0KCkgCisJICAgIC8veworCQkvLyAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2JlZXRzLCB2ZiApOworCQkvLyAgICBtc2cuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgbnVsbCApOworCQkvLyAgICBzdHViLk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkgICAvLyBjaGVjayB0aGUgcmVzdWx0LgorCQkvLyAgICBzcmMueHJlcGx5LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzICk7CisJCS8vICAgIEFzc2VydC5BcmVFcXVhbCggMCwgc3JjLnhyZXBseS5Db3VudCApOworCQkvLyAgICBPYmplY3QgbyA9IHNyYy54cmVwbHkuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCS8vICAgIEFzc2VydC5Jc051bGwoIG8gKTsKKwkgICAgLy99CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2lzVHJ1ZSgpIAorCSAgICB7CisJCSAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2lzVHJ1ZSwgdmYgKTsKKwkJICAgIHN0dWIuU2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkgICAgLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJICAgIHNyYy54cmVwbHkuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaXNUcnVlICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgc3JjLnhyZXBseS5Db3VudCk7CisJCSAgICBPYmplY3QgbyA9IHNyYy54cmVwbHkuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHRydWUsIG8gKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9pc0ZhbHNlKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaXNGYWxzZSwgdmYgKTsKKwkJICAgIHN0dWIuU2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkgICAgLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJICAgIHNyYy54cmVwbHkuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaXNGYWxzZSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNyYy54cmVwbHkuQ291bnQpOworCQkgICAgT2JqZWN0IG8gPSBzcmMueHJlcGx5LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBmYWxzZSwgbyApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2Fsd2F5c1dvcmtzKCkgCisJICAgIHsKKwkJICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYWx3YXlzV29ya3MsIHZmICk7CisJCSAgICBzdHViLlNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJICAgIC8vIGNoZWNrIHRoZSByZXN1bHQuCisgICAgICAgICAgICBzcmMueHJlcGx5LkNoZWNrVHlwZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYWx3YXlzV29ya3MpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNyYy54cmVwbHkuQ291bnQpOworICAgICAgICAgICAgT2JqZWN0IG8gPSBzcmMueHJlcGx5LkdldChWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMjMsIG8gKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9hbHdheXNGYWlscygpIAorCSAgICB7CisJCSAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2Fsd2F5c0ZhaWxzLCB2ZiApOworCQkgICAgc3R1Yi5TZXNzaW9uTWVzc2FnZSggbnVsbCwgbXNnICk7CisJCSAgICAvLyBjaGVjayB0aGUgcmVzdWx0LgorICAgICAgICAgICAgc3JjLnhyZXBseS5DaGVja1R5cGUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Fsd2F5c0ZhaWxzKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBzcmMueHJlcGx5LkNvdW50KTsKKyAgICAgICAgICAgIE9iamVjdCBvID0gc3JjLnhyZXBseS5HZXQoVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCBvIGlzIF9FdGNoX0F1dGhFeGNlcHRpb24gKTsKKwkJICAgIF9FdGNoX0F1dGhFeGNlcHRpb24gZSA9IChfRXRjaF9BdXRoRXhjZXB0aW9uKSBvOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAiYWx3YXlzRmFpbHMiLCBlLm1zZyApOworCSAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBGYWtlVGVzdDEgdGVzdDsKKyAgICAgICAgcHJpdmF0ZSBWYWx1ZUZhY3RvcnlUZXN0MSB2ZjsKKyAgICAgICAgcHJpdmF0ZSBQb29sIHBvb2w7CisKKyAgICAgICAgcHJpdmF0ZSBTdHViVGVzdDEgc3R1YjsKKyAgICAgICAgcHJpdmF0ZSBNeU1lc3NhZ2VTb3VyY2Ugc3JjOworICAgIAkKKwkgICAgcHVibGljIGNsYXNzIE15TWVzc2FnZVNvdXJjZSA6IERlbGl2ZXJ5U2VydmljZQorCSAgICB7CisKKyAgICAgICAgICAgIHByaXZhdGUgVGVzdFN0dWJUZXN0MURvdENzaGFycCBfYmFzZU9iajsKKwkgICAgICAgIHByaXZhdGUgU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbjsKKworICAgICAgICAgICAgcHVibGljIE15TWVzc2FnZVNvdXJjZSggVGVzdFN0dWJUZXN0MURvdENzaGFycCBiYXNlT2JqICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2Jhc2VPYmogPSBiYXNlT2JqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjcmVnaW9uIE1lc3NhZ2VTb3VyY2UgTWVtYmVycworICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgTWVzc2FnZSB4cmVwbHk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIE1lc3NhZ2V4KCBXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggcmVjaXBpZW50ICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCggeHJlcGx5ICk7CisgICAgICAgICAgICAgICAgeHJlcGx5ID0gbXNnOworICAgICAgICAgICAgICAgIF9iYXNlT2JqLnhyZXBseU1vbi5TZXQobmV3IE1lc3NhZ2UobmV3IFhUeXBlKCJkdW1teSIpLCBuZXcgVmFsdWVGYWN0b3J5VGVzdDEoIm5vbmU6IikpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIERlbGl2ZXJ5U2VydmljZSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBNYWlsYm94IEJlZ2luQ2FsbChNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgRW5kQ2FsbChNYWlsYm94IG1iLCBYVHlwZSByZXNwb25zZVR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIG1ldGhvZCBvciBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0TWVzc2FnZSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRyYW5zcG9ydE1lc3NhZ2UoV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyZWNpcGllbnQpOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc051bGwoeHJlcGx5KTsKKyAgICAgICAgICAgICAgICB4cmVwbHkgPSBtc2c7CisgICAgICAgICAgICAgICAgX2Jhc2VPYmoueHJlcGx5TW9uLlNldChuZXcgTWVzc2FnZShuZXcgWFR5cGUoImR1bW15IiksIG5ldyBWYWx1ZUZhY3RvcnlUZXN0MSgibm9uZToiKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gVHJhbnNwb3J0PFNlc3Npb25NZXNzYWdlPiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgVHJhbnNwb3J0UXVlcnkob2JqZWN0IHF1ZXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Q29udHJvbChvYmplY3QgY29udHJvbCwgb2JqZWN0IHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgVHJhbnNwb3J0Tm90aWZ5KG9iamVjdCBldmVudE9iaikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNldFNlc3Npb24oU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gU2Vzc2lvbk1lc3NhZ2UgTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBTZXNzaW9uTWVzc2FnZShXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBTZXNzaW9uIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBTZXNzaW9uUXVlcnkob2JqZWN0IHF1ZXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgU2Vzc2lvbkNvbnRyb2wob2JqZWN0IGNvbnRyb2wsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNlc3Npb25Ob3RpZnkob2JqZWN0IGV2ZW50T2JqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBtZXRob2Qgb3Igb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIFRyYW5zcG9ydDxTZXNzaW9uTWVzc2FnZT4gTWVtYmVycworCisKKyAgICAgICAgICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZSBHZXRTZXNzaW9uKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgbWV0aG9kIG9yIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RUZXN0MURvdENzaGFycC5jcyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RUZXN0MURvdENzaGFycC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2ViODJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvY3NoYXJwL2V0Y2gudGVzdHMvVGVzdFRlc3QxRG90Q3NoYXJwLmNzCkBAIC0wLDAgKzEsNjk2IEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuVGVzdDE7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0VGVzdDFEb3RDc2hhcnAKKyAgICB7CisgICAgICAgIFtUZXN0Rml4dHVyZVNldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCAiVGVzdFRlc3QiICk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBjb25zdF9ib29sZWFucygpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LklzRmFsc2UoIENvbnN0c1Rlc3QxLkJPT0wxICk7CisJCSAgICBBc3NlcnQuSXNUcnVlKCBDb25zdHNUZXN0MS5CT09MMiApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgY29uc3RfYnl0ZXMoKSAgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggc2J5dGUuTWluVmFsdWUsIENvbnN0c1Rlc3QxLkJZVEUxICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChzYnl0ZSkgLTEsIENvbnN0c1Rlc3QxLkJZVEUyICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChzYnl0ZSkgMCwgQ29uc3RzVGVzdDEuQllURTMgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggKHNieXRlKSAxLCBDb25zdHNUZXN0MS5CWVRFNCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBzYnl0ZS5NYXhWYWx1ZSwgQ29uc3RzVGVzdDEuQllURTUgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0X3Nob3J0cygpICAKKwkgICAgeworICAgICAgICAgICAgCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHNob3J0Lk1pblZhbHVlLCBDb25zdHNUZXN0MS5TSE9SVDEgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggKHNob3J0KSAtMSwgQ29uc3RzVGVzdDEuU0hPUlQyICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChzaG9ydCkgMCwgQ29uc3RzVGVzdDEuU0hPUlQzICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIChzaG9ydCkgMSwgQ29uc3RzVGVzdDEuU0hPUlQ0ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHNob3J0Lk1heFZhbHVlLCBDb25zdHNUZXN0MS5TSE9SVDUgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0X2ludHMoKSAgCisJICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpbnQuTWluVmFsdWUsIENvbnN0c1Rlc3QxLklOVDEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCBDb25zdHNUZXN0MS5JTlQyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBDb25zdHNUZXN0MS5JTlQzKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBDb25zdHNUZXN0MS5JTlQ0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpbnQuTWF4VmFsdWUsIENvbnN0c1Rlc3QxLklOVDUpOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgY29uc3RfbG9uZ3MoKSAgCisJICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChsb25nLk1pblZhbHVlLCBDb25zdHNUZXN0MS5MT05HMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKGxvbmcpLTEsIENvbnN0c1Rlc3QxLkxPTkcyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgobG9uZykwLCBDb25zdHNUZXN0MS5MT05HMyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKGxvbmcpMSwgQ29uc3RzVGVzdDEuTE9ORzQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGxvbmcuTWF4VmFsdWUsIENvbnN0c1Rlc3QxLkxPTkc1KTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGNvbnN0X2Zsb2F0cygpICAKKwkgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuNGUtNDVmLCBDb25zdHNUZXN0MS5GTE9BVDEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKChmbG9hdCktMSwgQ29uc3RzVGVzdDEuRkxPQVQyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoZmxvYXQpMCwgQ29uc3RzVGVzdDEuRkxPQVQzKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoZmxvYXQpMSwgQ29uc3RzVGVzdDEuRkxPQVQ0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLjQwMjgyMzVlMzhmLCBDb25zdHNUZXN0MS5GTE9BVDUpOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgY29uc3RfZG91YmxlcygpICAKKwkgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQuOWUtMzI0LCBDb25zdHNUZXN0MS5ET1VCTEUxKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoZG91YmxlKS0xLCBDb25zdHNUZXN0MS5ET1VCTEUyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoZG91YmxlKTAsIENvbnN0c1Rlc3QxLkRPVUJMRTMpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKChkb3VibGUpMSwgQ29uc3RzVGVzdDEuRE9VQkxFNCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCwgQ29uc3RzVGVzdDEuRE9VQkxFNSk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBjb25zdF9zdHJpbmdzKCkgIAorCSAgICB7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIENvbnN0c1Rlc3QxLlNUUklORzEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhIiwgQ29uc3RzVGVzdDEuU1RSSU5HMik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiYyIsIENvbnN0c1Rlc3QxLlNUUklORzMpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhXHRiXHRjXHJcbiIsIENvbnN0c1Rlc3QxLlNUUklORzQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ4IHgiLCBDb25zdHNUZXN0MS5TVFJJTkc1KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieFx1MDBiZngiLCBDb25zdHNUZXN0MS5TVFJJTkc2KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieFx1MDNhOXgiLCBDb25zdHNUZXN0MS5TVFJJTkc3KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieFxceCIsIENvbnN0c1Rlc3QxLlNUUklORzgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ4J3giLCBDb25zdHNUZXN0MS5TVFJJTkc5KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieFwieCIsIENvbnN0c1Rlc3QxLlNUUklORzEwKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGVudW1fRTEoKSAgCisJICAgIHsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKCAzLCBFMS52YWx1ZXMoKS5MZW5ndGggKTsKKwkJICAgIEFzc2VydC5Jc05vdE51bGwoIEUxLkEgKTsKKwkJICAgIEFzc2VydC5Jc05vdE51bGwoIEUxLkIgKTsKKwkJICAgIEFzc2VydC5Jc05vdE51bGwoIEUxLkMgKTsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKCBFMS5BLCBFMS52YWx1ZU9mKCAiQSIgKSApOworICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwoIEUxLkIsIEUxLnZhbHVlT2YoICJCIiApICk7CisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbCggRTEuQywgRTEudmFsdWVPZiggIkMiICkgKTsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKCAwLCBFMS5BLm9yZGluYWwoKSApOworICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwoIDEsIEUxLkIub3JkaW5hbCgpICk7CisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbCggMiwgRTEuQy5vcmRpbmFsKCkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHN0cnVjdF9TMSgpICAKKwkgICAgeworCQkgICAgUzEgcyA9IG5ldyBTMSggMSwgMiwgMyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBzLnggKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMiwgcy55ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIHMueiApOworICAgIAkJCisJCSAgICBzID0gbmV3IFMxKCBudWxsLCBudWxsLCBudWxsICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBzLnggKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIHMueSApOworCQkgICAgQXNzZXJ0LklzTnVsbCggcy56ICk7CisgICAgCQkKKwkJICAgIHMgPSBuZXcgUzEoKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIHMueCApOworCQkgICAgQXNzZXJ0LklzTnVsbCggcy55ICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBzLnogKTsKKyAgICAJCQorCQkgICAgcy54ID0gNDsKKwkJICAgIHMueSA9IDU7CisJCSAgICBzLnogPSA2OworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDQsIHMueCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCA1LCBzLnkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggNiwgcy56ICk7CisgICAgCQkKKwkJICAgIHMueCA9IG51bGw7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBzLnggKTsKKyAgICAJCQorCQkgICAgcy54ID0gNzsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggNywgcy54ICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBleGNlcHRfRXhjcDEoKSAgCisJICAgIHsKKwkJICAgIEV4Y3AxIGUgPSBuZXcgRXhjcDEoICJmb28iLCAyMyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAiZm9vIiwgZS5tc2cgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMjMsIGUuY29kZSApOworICAgIAkJCisJCSAgICBlID0gbmV3IEV4Y3AxKCBudWxsLCBudWxsICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBlLm1zZyApOworCQkgICAgQXNzZXJ0LklzTnVsbCggZS5jb2RlICk7CisgICAgCQkKKwkJICAgIGUgPSBuZXcgRXhjcDEoKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGUubXNnICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBlLmNvZGUgKTsKKyAgICAJCQorCQkgICAgZS5tc2cgPSAiYmFyIjsKKwkJICAgIGUuY29kZSA9IDI0OworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoICJiYXIiLCBlLm1zZyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyNCwgZS5jb2RlICk7CisgICAgCQkKKwkJICAgIGUubXNnID0gbnVsbDsKKwkJICAgIGUuY29kZSA9IG51bGw7CisgICAgCQkKKwkJICAgIEFzc2VydC5Jc051bGwoIGUubXNnICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBlLmNvZGUgKTsKKworICAgICAgICAgICAgLy9UaHJvd2FibGUgdCA9IGU7CisgICAgICAgICAgICAvL0Fzc2VydC5Jc1RydWUoIHQgaXMgRXhjZXB0aW9uICk7CisgICAgICAgICAgICAvL0Fzc2VydC5Jc0ZhbHNlKCB0IGlzIFJ1bnRpbWVFeGNlcHRpb24gKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGV4Y2VwdF9FeGNwMigpICAKKwkgICAgeworCQkgICAgRXhjcDIgZSA9IG5ldyBFeGNwMigpOworCisJCSAgICBFeGNlcHRpb24gdCA9IGU7CisJCSAgICBBc3NlcnQuSXNUcnVlKCB0IGlzIEV4Y2VwdGlvbiApOworCQkgICAgLy9Bc3NlcnQuSXNUcnVlKCB0IGlzIFJ1bnRpbWVFeGNlcHRpb24gKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGV4Y2VwdF9FeGNwMygpICAKKwkgICAgeworCQkgICAgRXhjcDMgZSA9IG5ldyBFeGNwMygpOworCisgICAgICAgICAgICBFeGNlcHRpb24gdCA9IGU7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCB0IGlzIEV4Y2VwdGlvbiApOworICAgICAgICAgICAgLy9Bc3NlcnQuSXNUcnVlKCB0IGlzIFJ1bnRpbWVFeGNlcHRpb24gKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGV4Y2VwdF9FeGNwNCgpICAKKwkgICAgeworCQkgICAgRXhjcDQgZSA9IG5ldyBFeGNwNCgpOworCisJCSAgICBFeGNlcHRpb24gdCA9IGU7CisJCSAgICBBc3NlcnQuSXNUcnVlKCB0IGlzIEV4Y2VwdGlvbiApOworCQkgICAgLy9Bc3NlcnQuSXNGYWxzZSggdCBpcyBFeGNlcHRpb24gKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9ub3RoaW5nKCkgIAorCSAgICB7CisJCSAgICB0ZXN0Lm5vdGhpbmcoKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9pbmNyMSgpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCB0ZXN0LmluY3IoIDEgKSApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2luY3IyKCkgIAorCSAgICB7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIHRlc3QuaW5jciggMiApICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2RfaW5jcjMoKSAgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggLTEsIHRlc3QuaW5jciggLTIgKSApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3N1YjEoKSAgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggNSwgdGVzdC5zdWIoIDcsIDIgKSApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3N1YjIoKSAgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggOCwgdGVzdC5zdWIoIDIzLCAxNSApICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2Rfc3ViMygpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAtNSwgdGVzdC5zdWIoIDIsIDcgKSApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3N1bSgpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyNCwgdGVzdC5zdW0oIG5ldyBpbnRbXSB7IDEsIDIsIDMsIDcsIDExIH0gKSApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMSgpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCB0ZXN0LnRyYW5zKCBFMS5BLCA1ICkgKTsgLy8gZGl2aWRlIGJ5IDIKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczIoKSAgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMTAsIHRlc3QudHJhbnMoIEUxLkIsIDUgKSApOyAvLyBtdWwgYnkgMgorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMygpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMiwgdGVzdC50cmFucyggRTEuQywgNSApICk7IC8vIGFkZCA3CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2RfZGlzdDEoKSAgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggTWF0aC5TcXJ0KCAzICksIHRlc3QuZGlzdCggbmV3IFMxKCAxLCAxLCAxICksIG5ldyBTMSggMCwgMCwgMCApICkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9kaXN0MigpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBNYXRoLlNxcnQoIDM1ICksIHRlc3QuZGlzdCggbmV3IFMxKCAxLCAyLCAzICksIG5ldyBTMSggNiwgNSwgNCApICkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9kaXN0MygpICAKKwkgICAgeworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBNYXRoLlNxcnQoIDU2ICksIHRlc3QuZGlzdCggbmV3IFMxKCAxLCAyLCAzICksIG5ldyBTMSggLTEsIC0yLCAtMyApICkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMSgpICAKKwkgICAgeworCQkgICAgaW50W10geCA9IHRlc3QuZmlsbCggMCwgMSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCB4Lkxlbmd0aCApOworCQkgICAgZm9yZWFjaCAoaW50IGkgaW4geCkKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMigpICAKKwkgICAgeworCQkgICAgaW50W10geCA9IHRlc3QuZmlsbCggMSwgMiApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCB4Lkxlbmd0aCApOworCQkgICAgZm9yZWFjaCAoaW50IGkgaW4geCkKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIsIGkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMygpICAKKwkgICAgeworCQkgICAgaW50W10geCA9IHRlc3QuZmlsbCggMiwgMyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCB4Lkxlbmd0aCApOworCQkgICAgZm9yZWFjaCAoaW50IGkgaW4geCkKKwkJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIGkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9ibG93MSgpICAKKwkgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgdGVzdC5ibG93KCAiZm9vIiwgMiApOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGZhbHNlLCAiYmxvdyBkaWQgbm90IHRocm93IiApOworCQkgICAgfQorCQkgICAgY2F0Y2goIEV4Y3AxIGUgKQorCQkgICAgeworCQkJICAgIEFzc2VydC5BcmVFcXVhbCggImZvbyIsIGUubXNnICk7CisJCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBlLmNvZGUgKTsKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9ibG93MigpICAKKwkgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgdGVzdC5ibG93KCAiYmFyIiwgMyApOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIGZhbHNlLCAiYmxvdyBkaWQgbm90IHRocm93IiApOworCQkgICAgfQorCQkgICAgY2F0Y2goIEV4Y3AxIGUgKQorCQkgICAgeworCQkJICAgIEFzc2VydC5BcmVFcXVhbCggImJhciIsIGUubXNnICk7CisJCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAzLCBlLmNvZGUgKTsKKwkJICAgIH0KKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF9iZWV0czEoKSAgCisJICAgIHsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggNSwgdGVzdC5iZWV0cyggRTEuQSApICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMyKCkgIAorCSAgICB7CisJCSAgICB0cnkKKwkJICAgIHsKKwkJCSAgICB0ZXN0LmJlZXRzKCBFMS5CICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggZmFsc2UsICJiZWV0cyBkaWQgbm90IHRocm93IiApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNwMyApCisJCSAgICB7CisJCQkgICAgQXNzZXJ0LklzVHJ1ZSggdHJ1ZSApOworCQkgICAgfQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzMygpICAKKwkgICAgeworCQkgICAgdHJ5CisJCSAgICB7CisJCQkgICAgdGVzdC5iZWV0cyggRTEuQyApOworCQkJICAgIEFzc2VydC5Jc1RydWUoZmFsc2UsICJiZWV0cyBkaWQgbm90IHRocm93IiApOworCQkgICAgfQorCQkgICAgY2F0Y2ggKCBFeGNwNCApCisJCSAgICB7CisJCQkgICAgQXNzZXJ0LklzVHJ1ZSggdHJ1ZSApOworCQkgICAgfQorCSAgICB9CisgICAgCQorICAgICAgICAvL1tUZXN0XQorICAgICAgICAvL3B1YmxpYyB2b2lkIG1ldGhvZF9iZWV0czQoKSAgCisgICAgICAgIC8veworICAgICAgICAvLyAgICBBc3NlcnQuSXNOdWxsKCB0ZXN0LmJlZXRzKCBudWxsICkgKTsKKyAgICAgICAgLy99CisKKyAgICAgCisJIAorCSAgICAvLworICAgICAgICAvL1ZlcmlmeSB0aGF0IGFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIGluIGEgc3R1Y3QuCisgICAgICAgIC8vCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBzdHJ1Y3RfUzMoKSAKKwkgICAgeworCQkgICAgdGVzdFMzSGVscGVyKCAiYm9vbCIsIENvbnN0c1Rlc3QxLkJPT0wyICk7CisgICAgICAgICAgICB0ZXN0UzNIZWxwZXIoICJieXRlIiwgQ29uc3RzVGVzdDEuQllURTUgKTsKKyAgICAgICAgICAgIHRlc3RTM0hlbHBlciggInNob3J0IiwgQ29uc3RzVGVzdDEuU0hPUlQ1ICk7CisgICAgICAgICAgICB0ZXN0UzNIZWxwZXIoImludCIsIENvbnN0c1Rlc3QxLklOVDUpOworICAgICAgICAgICAgdGVzdFMzSGVscGVyKCJsb25nIiwgQ29uc3RzVGVzdDEuTE9ORzUpOworICAgICAgICAgICAgdGVzdFMzSGVscGVyKCJmbG9hdCIsIENvbnN0c1Rlc3QxLkZMT0FUNSk7CisgICAgICAgICAgICB0ZXN0UzNIZWxwZXIoImRvdWJsZSIsIENvbnN0c1Rlc3QxLkRPVUJMRTUpOworICAgICAgICAgICAgdGVzdFMzSGVscGVyKCJzdHJpbmciLCBDb25zdHNUZXN0MS5TVFJJTkczKTsJCQorCSAgICB9CisgICAgCQorCSAgICAvKgorCSAgICAgKiBWZXJpZnkgdGhhdCBhbiBhcnJheSBvZiBvYmplY3RzIGNhbiBiZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgCisJICAgICAqIGluIGEgc3R1Y3QuCisJICAgICAqLworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgc3RydWN0X1M0KCkgCisJICAgIHsJCQorCQkgICAgaW50IHN6ID0gMTA7CisgICAgCQkKKwkJICAgIHRlc3RTNEhlbHBlcihzeiwgImJvb2xlYW4iLCBDb25zdHNUZXN0MS5CT09MMiApOworCQkgICAgdGVzdFM0SGVscGVyKHN6LCAiYnl0ZSIsIENvbnN0c1Rlc3QxLkJZVEU1ICk7CisJCSAgICB0ZXN0UzRIZWxwZXIoc3osICJzaG9ydCIsIENvbnN0c1Rlc3QxLlNIT1JUNSApOworICAgICAgICAgICAgdGVzdFM0SGVscGVyKHN6LCAiaW50IiwgQ29uc3RzVGVzdDEuSU5UNSk7CisgICAgICAgICAgICB0ZXN0UzRIZWxwZXIoc3osICJsb25nIiwgQ29uc3RzVGVzdDEuTE9ORzUpOworICAgICAgICAgICAgdGVzdFM0SGVscGVyKHN6LCAiZmxvYXQiLCBDb25zdHNUZXN0MS5GTE9BVDUpOworICAgICAgICAgICAgdGVzdFM0SGVscGVyKHN6LCAiZG91YmxlIiwgQ29uc3RzVGVzdDEuRE9VQkxFNSk7CisgICAgICAgICAgICB0ZXN0UzRIZWxwZXIoc3osICJzdHJpbmciLCBDb25zdHNUZXN0MS5TVFJJTkczKTsJCQorCisJICAgIH0KKyAgICAJCisJICAgIC8vIFZlcmlmeSB0aGF0IGFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIGluIGFuCisJICAgIC8vIGV4Y2VwdGlvbgorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgZXhjZXB0X0V4Y3A1KCkgCisJICAgIHsKKwkJICAgIGludCBjb2RlID0gNTAwOworCQkgICAgU3RyaW5nIG1zZyA9ICJFeGNwNSI7CisKKyAgICAgICAgICAgIHRlc3RFeGNwNUhlbHBlcihtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkJPT0wxKTsKKwkJICAgIHRlc3RFeGNwNUhlbHBlciAobXNnLCBjb2RlLCBDb25zdHNUZXN0MS5CWVRFNSk7CisJCSAgICB0ZXN0RXhjcDVIZWxwZXIgKG1zZywgY29kZSwgQ29uc3RzVGVzdDEuU0hPUlQ1KTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUhlbHBlcihtc2csIGNvZGUsIENvbnN0c1Rlc3QxLklOVDUpOworICAgICAgICAgICAgdGVzdEV4Y3A1SGVscGVyKG1zZywgY29kZSwgQ29uc3RzVGVzdDEuTE9ORzUpOworICAgICAgICAgICAgdGVzdEV4Y3A1SGVscGVyKG1zZywgY29kZSwgQ29uc3RzVGVzdDEuRkxPQVQ1KTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUhlbHBlcihtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkRPVUJMRTUpOworICAgICAgICAgICAgdGVzdEV4Y3A1SGVscGVyKG1zZywgY29kZSwgQ29uc3RzVGVzdDEuU1RSSU5HMyk7CQkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIGV4Y2VwdF9FeGNwNigpIAorCSAgICB7CisJCSAgICBpbnQgc3ogPSAxMDsKKwkJICAgIGludCBjb2RlID0gNTAwOworCQkgICAgU3RyaW5nIG1zZyA9ICJFeGNwNiI7CisKKyAgICAgICAgICAgIHRlc3RFeGNwNkhlbHBlcihzeiwgbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5CT09MMSk7CisJCSAgICB0ZXN0RXhjcDZIZWxwZXIoIHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkJZVEU1ICk7CisJCSAgICB0ZXN0RXhjcDZIZWxwZXIoIHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLlNIT1JUNSApOworICAgICAgICAgICAgdGVzdEV4Y3A2SGVscGVyKHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLklOVDUpOworICAgICAgICAgICAgdGVzdEV4Y3A2SGVscGVyKHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkxPTkc1KTsKKyAgICAgICAgICAgIHRlc3RFeGNwNkhlbHBlcihzeiwgbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5GTE9BVDUpOworICAgICAgICAgICAgdGVzdEV4Y3A2SGVscGVyKHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkRPVUJMRTUpOworICAgICAgICAgICAgdGVzdEV4Y3A2SGVscGVyKHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLlNUUklORzMpOwkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCBtZXRob2RfdGhyb3dFeGNwNSgpIAorCSAgICB7CisJCSAgICBTdHJpbmcgbXNnID0gInRocm93RXhjcDUiOworCQkgICAgaW50IGNvZGUgPSA1MDA7CisKKyAgICAgICAgICAgIG1ldGhvZF90aHJvd0V4Y3A1SGVscGVyKG1zZywgY29kZSwgQ29uc3RzVGVzdDEuQk9PTDEpOworCQkgICAgbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIoIG1zZywgY29kZSwgQ29uc3RzVGVzdDEuQllURTUgKTsKKwkJICAgIG1ldGhvZF90aHJvd0V4Y3A1SGVscGVyKCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLlNIT1JUNSApOworICAgICAgICAgICAgbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIobXNnLCBjb2RlLCBDb25zdHNUZXN0MS5JTlQ1KTsKKyAgICAgICAgICAgIG1ldGhvZF90aHJvd0V4Y3A1SGVscGVyKG1zZywgY29kZSwgQ29uc3RzVGVzdDEuTE9ORzUpOworICAgICAgICAgICAgbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIobXNnLCBjb2RlLCBDb25zdHNUZXN0MS5GTE9BVDUpOworICAgICAgICAgICAgbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIobXNnLCBjb2RlLCBDb25zdHNUZXN0MS5ET1VCTEU1KTsKKyAgICAgICAgICAgIG1ldGhvZF90aHJvd0V4Y3A1SGVscGVyKG1zZywgY29kZSwgQ29uc3RzVGVzdDEuU1RSSU5HMyk7CQkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIG1ldGhvZF90aHJvd0V4Y3A2KCkgCisJICAgIHsKKwkJICAgIFN0cmluZyBtc2cgPSAidGhyb3dFeGNwNiI7CisJCSAgICBpbnQgY29kZSA9IDUwMDsKKwkJICAgIGludCBzeiA9IDEwOworCisgICAgICAgICAgICBtZXRob2RfdGhyb3dFeGNwNkhlbHBlcihzeiwgbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5CT09MMSk7CisJCSAgICBtZXRob2RfdGhyb3dFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgQ29uc3RzVGVzdDEuQllURTUgKTsKKwkJICAgIG1ldGhvZF90aHJvd0V4Y3A2SGVscGVyKCBzeiwgbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5TSE9SVDUgKTsKKyAgICAgICAgICAgIG1ldGhvZF90aHJvd0V4Y3A2SGVscGVyKHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLklOVDUpOworICAgICAgICAgICAgbWV0aG9kX3Rocm93RXhjcDZIZWxwZXIoc3osIG1zZywgY29kZSwgQ29uc3RzVGVzdDEuTE9ORzUpOworICAgICAgICAgICAgbWV0aG9kX3Rocm93RXhjcDZIZWxwZXIoc3osIG1zZywgY29kZSwgQ29uc3RzVGVzdDEuRkxPQVQ1KTsKKyAgICAgICAgICAgIG1ldGhvZF90aHJvd0V4Y3A2SGVscGVyKHN6LCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkRPVUJMRTUpOworICAgICAgICAgICAgbWV0aG9kX3Rocm93RXhjcDZIZWxwZXIoc3osIG1zZywgY29kZSwgQ29uc3RzVGVzdDEuU1RSSU5HMyk7CQkKKworCSAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBIZWxwZXIgbWV0aG9kcworCisgICAgICAgIHByaXZhdGUgdm9pZCB0ZXN0UzNIZWxwZXIoIHN0cmluZyB0eXBlLCBvYmplY3QgdmFsdWUgKQorCSAgICB7CisJCSAgICBTMyBzID0gbmV3IFMzKCB0eXBlLCB2YWx1ZSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCB0eXBlLCBzLnRpcGUgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHMueCApOworICAgIAkJCisJCSAgICBzID0gbmV3IFMzKCBudWxsLCBudWxsICk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHMudGlwZSk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBzLnggKTsKKyAgICAJCQorCQkgICAgcyA9IG5ldyBTMygpOworCQkgICAgQXNzZXJ0LklzTnVsbCggcy50aXBlICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBzLnggKTsKKyAgICAJCQorCQkgICAgcy50aXBlID0gdHlwZTsKKwkJICAgIHMueCA9IHZhbHVlOwkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggdHlwZSwgcy50aXBlICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCBzLnggKTsKKyAgICAJCQorCQkgICAgcy54ID0gbnVsbDsKKwkJICAgIEFzc2VydC5Jc051bGwoIHMueCApOworICAgIAkJCisJCSAgICBzLnggPSB2YWx1ZTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHMueCApOworCSAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFM0SGVscGVyKCBpbnQgc3osIHN0cmluZyB0eXBlLCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3RbXSBteU9iamVjdCA9IHRlc3QuZmlsbE9iamVjdCggc3osIHZhbHVlICk7CisgICAgICAgICAgICBTNCBzID0gbmV3IFM0KCB0eXBlLCBteU9iamVjdCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB0eXBlLCBzLnRpcGUgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggc3osIG15T2JqZWN0Lkxlbmd0aCApOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBteU9iamVjdC5MZW5ndGg7IGkrKyApCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB2YWx1ZSwgbXlPYmplY3RbIGkgXSApOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgdGVzdEV4Y3A1SGVscGVyKCBTdHJpbmcgbXNnLCBpbnQgY29kZSwgT2JqZWN0IHZhbHVlICkKKwkgICAgeworCQkgICAgRXhjcDUgZSA9IG5ldyBFeGNwNSggbXNnLCBjb2RlLCB2YWx1ZSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBtc2csIGUubXNnICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGNvZGUsIGUuY29kZSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCB2YWx1ZSwgZS54KTsKKyAgICAJCQorCQkgICAgZSA9IG5ldyBFeGNwNSggbnVsbCwgbnVsbCwgbnVsbCApOworCQkgICAgQXNzZXJ0LklzTnVsbCggZS5tc2cgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGUuY29kZSApOworCQkgICAgQXNzZXJ0LklzTnVsbCggZS54KTsKKworCQkgICAgZSA9IG5ldyBFeGNwNSgpOworCQkgICAgQXNzZXJ0LklzTnVsbCggZS5tc2cgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGUuY29kZSApOworCQkgICAgQXNzZXJ0LklzTnVsbCggZS54ICk7CisgICAgCQkKKwkJICAgIGUubXNnID0gbXNnOworCQkgICAgZS5jb2RlID0gY29kZTsKKwkJICAgIGUueCA9IHZhbHVlOworICAgIAkJCisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIG1zZywgZS5tc2cgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggY29kZSwgZS5jb2RlICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCBlLnggKTsKKyAgICAJCQorCQkgICAgZS5tc2cgPSBudWxsOworCQkgICAgZS5jb2RlID0gbnVsbDsKKwkJICAgIGUueCA9IG51bGw7CisgICAgCQkKKwkJICAgIEFzc2VydC5Jc051bGwoIGUubXNnICk7CisJCSAgICBBc3NlcnQuSXNOdWxsKCBlLmNvZGUgKTsKKwkJICAgIEFzc2VydC5Jc051bGwoIGUueCApOwkJCisKKwkJICAgIC8vVGhyb3dhYmxlIHQgPSBlOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggZSBpcyBFeGNlcHRpb24gKTsKKwkJICAgIC8vYXNzZXJ0RmFsc2UoIHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uICk7CisJICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdGVzdEV4Y3A2SGVscGVyKCBpbnQgc3osIFN0cmluZyBtc2csIGludCBjb2RlLCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisJICAgICAgICBPYmplY3RbXSBteU9iamVjdCA9IHRlc3QuZmlsbE9iamVjdCggc3osIHZhbHVlICk7CisgICAgCQkKKwkgICAgICAgIEV4Y3A2IGUgPSBuZXcgRXhjcDYoIG1zZywgY29kZSwgbXlPYmplY3QgKTsKKwkgICAgICAgIEFzc2VydC5BcmVFcXVhbCggbXNnLCBlLm1zZyApOworCSAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBjb2RlLCBlLmNvZGUgKTsKKworCSAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbXlPYmplY3QuTGVuZ3RoOyBpKysgKSAKKwkgICAgICAgIHsKKwkJICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCBteU9iamVjdFtpXSApOworCSAgICAgICAgfQorICAgIAkJCisJICAgICAgICBlID0gbmV3IEV4Y3A2KCBudWxsLCBudWxsLCBudWxsICk7CisJICAgICAgICBBc3NlcnQuSXNOdWxsKCBlLm1zZyApOworCSAgICAgICAgQXNzZXJ0LklzTnVsbCggZS5jb2RlICk7CisJICAgICAgICBBc3NlcnQuSXNOdWxsKCBlLnggKTsKKworCSAgICAgICAgZSA9IG5ldyBFeGNwNigpOworCSAgICAgICAgQXNzZXJ0LklzTnVsbCggZS5tc2cgKTsKKwkgICAgICAgIEFzc2VydC5Jc051bGwoIGUuY29kZSApOworCSAgICAgICAgQXNzZXJ0LklzTnVsbCggZS54ICk7CisgICAgCQkKKwkgICAgICAgIGUubXNnID0gbXNnOworCSAgICAgICAgZS5jb2RlID0gY29kZTsKKwkgICAgICAgIGUueCA9IG15T2JqZWN0OworICAgIAkJCisJICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG1zZywgZS5tc2cgKTsKKwkgICAgICAgIEFzc2VydC5BcmVFcXVhbCggY29kZSwgZS5jb2RlICk7CisgICAgCQkKKwkgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG15T2JqZWN0Lkxlbmd0aCA7IGkrKyApIAorCSAgICAgICAgeworCQkgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIG15T2JqZWN0W2ldICk7CisJICAgICAgICB9CisgICAgCQkKKwkgICAgICAgIGUubXNnID0gbnVsbDsKKwkgICAgICAgIGUuY29kZSA9IG51bGw7CisJICAgICAgICBlLnggPSBudWxsOworICAgIAkJCisJICAgICAgICBBc3NlcnQuSXNOdWxsKCBlLm1zZyApOworCSAgICAgICAgQXNzZXJ0LklzTnVsbCggZS5jb2RlICk7CisJICAgICAgICBBc3NlcnQuSXNOdWxsKCBlLnggKTsJCQorCisKKwkgICAgICAgIC8vRXhjZXB0aW9uIHQgPSBlOworCSAgICAgICAgQXNzZXJ0LklzVHJ1ZSggZSBpcyBFeGNlcHRpb24gKTsKKwkgICAgICAgIC8vIGFzc2VydEZhbHNlKCB0IGlzIFJ1bnRpbWVFeGNlcHRpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBtZXRob2RfdGhyb3dFeGNwNUhlbHBlciggU3RyaW5nIG1zZywgaW50IGNvZGUsIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3QudGhyb3dFeGNwNSggbXNnLCBjb2RlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCAidGhyb3dFeGNwNSBkaWQgbm90IHRocm93IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNwNSBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG1zZywgZS5tc2cgKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGNvZGUsIGUuY29kZSApOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIGUueCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1ldGhvZF90aHJvd0V4Y3A2SGVscGVyKCBpbnQgc3osIFN0cmluZyBtc2csIGludCBjb2RlLCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3RbXSBteU9iamVjdCA9IHRlc3QuZmlsbE9iamVjdCggc3osIHZhbHVlICk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3QudGhyb3dFeGNwNiggbXNnLCBjb2RlLCBteU9iamVjdCApOworICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCAidGhyb3dFeGNwNSBkaWQgbm90IHRocm93IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNwNiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG1zZywgZS5tc2cgKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGNvZGUsIGUuY29kZSApOworCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbXlPYmplY3QuTGVuZ3RoOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB2YWx1ZSwgZS54WyBpIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbWV0aG9kX2ZpbGxPYmplY3RIZWxwZXIoIGludCBzeiwgT2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0W10gbXlPYmplY3QgPSB0ZXN0LmZpbGxPYmplY3QoIHN6LCB2YWx1ZSApOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBteU9iamVjdC5MZW5ndGg7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB2YWx1ZSwgbXlPYmplY3RbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHByaXZhdGUgVGVzdDEgdGVzdCA9IG5ldyBGYWtlVGVzdDEoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0VGVzdDFIZWxwZXIuY3MgYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0VGVzdDFIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3YmFhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RUZXN0MUhlbHBlci5jcwpAQCAtMCwwICsxLDkxIEBACisvLyAkSWQkCisvLyAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gCit1c2luZyBTeXN0ZW07Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlN1cHBvcnQ7Cit1c2luZyBPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlRyYW5zcG9ydDsKK3VzaW5nIE9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbDsKK3VzaW5nIE5Vbml0LkZyYW1ld29yazsKK3VzaW5nIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworbmFtZXNwYWNlIGV0Y2gudGVzdHMKK3sKKyAgICBbVGVzdEZpeHR1cmVdCisgICAgcHVibGljIGNsYXNzIFRlc3RUZXN0MUhlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworICAgICAgICAKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0SGVscGVyIiApOworICAgICAgICB9CisKKyAgICAgICAgW1NldFVwXQorICAgICAgICBwdWJsaWMgdm9pZCBNZXRob2RfT3Blbk5ld1Rlc3RMaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnkuRGVmaW5lKCJibGFoIiwgbmV3IFRjcFRyYW5zcG9ydEZhY3RvcnkoZmFsc2UpKTsKKworICAgICAgICAgICAgc3RyaW5nIHVyaSA9ICJibGFoOi8vbG9jYWxob3N0OjQwNDAiOworCisgICAgICAgICAgICBNYWluVGVzdDFMaXN0ZW5lciBpbXBsRmFjdG9yeSA9IG5ldyBNYWluVGVzdDFMaXN0ZW5lcigpOworCisgICAgICAgICAgICBsaXN0ZW5lciA9IFRlc3QxSGVscGVyLk5ld0xpc3RlbmVyKCB1cmksIG51bGwsIGltcGxGYWN0b3J5ICk7CisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RBUlRfQU5EX1dBSVRfVVAsIDQwMDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCBNZXRob2RfTmV3VGVzdFNlcnZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJvb2xlYW4gZmxhZyA9IHRydWU7CisKKyAgICAgICAgICAgIHN0cmluZyB1cmkgPSAiYmxhaDovL2xvY2FsaG9zdDo0MDQwIjsKKworICAgICAgICAgICAgTWFpblRlc3QxQ2xpZW50IGNsaWVudCA9IG5ldyBNYWluVGVzdDFDbGllbnQoKTsKKworICAgICAgICAgICAgUmVtb3RlVGVzdDFTZXJ2ZXIgc2VydmVyOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBUZXN0MUhlbHBlci5OZXdTZXJ2ZXIoIHVyaSwgbnVsbCwgY2xpZW50ICk7CisgICAgICAgICAgICAgICAgc2VydmVyLl9TdGFydEFuZFdhaXRVcCggNDAwMCApOworCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHlvdXIgY29kZSBoZXJlCisgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgIHNlcnZlci5fU3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShmbGFnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggZmxhZyApOworICAgICAgICB9CisKKyAgICAgICAgW1RlYXJEb3duXQorICAgICAgICBwdWJsaWMgdm9pZCBNZXRob2RfQ2xvc2VOZXdUZXN0TGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0ZW5lci5UcmFuc3BvcnRDb250cm9sKCBUcmFuc3BvcnRDb25zdHMuU1RPUF9BTkRfV0FJVF9ET1dOLCAwICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0VmFsdWVGYWN0b3J5VGVzdDFEb3RDc2hhcnAuY3MgYi90ZXN0cy9zcmMvdGVzdC9jc2hhcnAvZXRjaC50ZXN0cy9UZXN0VmFsdWVGYWN0b3J5VGVzdDFEb3RDc2hhcnAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllYjM3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2NzaGFycC9ldGNoLnRlc3RzL1Rlc3RWYWx1ZUZhY3RvcnlUZXN0MURvdENzaGFycC5jcwpAQCAtMCwwICsxLDExMTIgQEAKKy8vICRJZCQKKy8vIAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLyAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT3JnLkFwYWNoZS5FdGNoLkJpbmRpbmdzLkNzaGFycC5Nc2c7Cit1c2luZyBOVW5pdC5GcmFtZXdvcms7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7Cit1c2luZyBvcmcuYXBhY2hlLmV0Y2gudGVzdHMudHlwZXMuVGVzdDE7CisKK25hbWVzcGFjZSBldGNoLnRlc3RzCit7CisgICAgW1Rlc3RGaXh0dXJlXQorICAgIHB1YmxpYyBjbGFzcyBUZXN0VmFsdWVGYWN0b3J5VGVzdDFEb3RDc2hhcnAKKyAgICB7CisgICAgICAgIHByaXZhdGUgVmFsdWVGYWN0b3J5VGVzdDEgdmYgPSBuZXcgVmFsdWVGYWN0b3J5VGVzdDEoIm5vbmU6Iik7CisKKyAgICAgICAgW1Rlc3RGaXh0dXJlU2V0VXBdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpcnN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoICJUZXN0VkYiICk7CisgICAgICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9FMSgpCisJICAgIHsKKwkJICAgIC8vIHR5cGUgLy8KKyAgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0UxLAorICAgICAgICAgICAgICAgICAgICAgICAKKwkJICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX0EsCisJCSAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9CLAorCQkgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfQyApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9FMV9leHBvcnQoKQorCSAgICB7CisgICAgICAgICAgICB0ZXN0RW51bUV4cG9ydCggRTEuQSwKKwkJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0UxLAorCQkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9BICk7CisKKyAgICAgICAgICAgIHRlc3RFbnVtRXhwb3J0KCBFMS5CLAorCQkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRTEsCisJCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX0IgKTsKKworICAgICAgICAgICAgdGVzdEVudW1FeHBvcnQoIEUxLkMsCisJCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FMSwKKwkJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfQyApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9FMV9pbXBvcnQoKQorCSAgICB7CisgICAgICAgICAgICB0ZXN0RW51bUltcG9ydCggRTEuQSwKKwkJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0UxLAorCQkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9BICk7CisKKyAgICAgICAgICAgIHRlc3RFbnVtSW1wb3J0KCBFMS5CLAorCQkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRTEsCisJCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX0IgKTsKKworICAgICAgICAgICAgdGVzdEVudW1JbXBvcnQoIEUxLkMsCisJCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FMSwKKwkJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfQyApOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfUzEoKQorCSAgICB7CisJCSAgICAvLyB0eXBlIC8vCisKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMSwgCisgICAgCQkKKwkJICAgIC8vIGZpZWxkcyAvLworICAgIAkJCisJCSBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwKKwkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl95LAorCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ogKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfUzFfZXhwb3J0KCkKKwkgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSB2Zi5FeHBvcnRDdXN0b21WYWx1ZSggbmV3IFMxKCAxOSwgMjMsIDI5ICkgKTsKKwkJICAgIHN2LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAzLCBzdi5Db3VudCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxOSwgc3YuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIzLCBzdi5HZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl95ICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMjksIHN2LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ogKSApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9TMV9pbXBvcnQoKQorCSAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1MxLCB2Zik7CisJCSAgICBzdi5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCAxMDEgKTsKKwkJICAgIHN2LkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ksIDEwMyApOworCQkgICAgc3YuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeiwgMTA3ICk7CisgICAgICAgICAgICBTMSBzID0gKCBTMSApIHZmLkltcG9ydEN1c3RvbVZhbHVlKCBzdiApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMDEsIHMueCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMDMsIHMueSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMDcsIHMueiApOworCSAgICB9CisKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfUzIoKQorCSAgICB7CisJCSAgICAvLyB0eXBlIC8vCisKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMiwKKyAgIAorCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EsCisJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYiwKKwkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X1MyX2V4cG9ydCgpCisJICAgIHsKKyAgICAgICAgICAgIFMxIGEgPSBuZXcgUzEoIDIxLCAyMiwgMjMgKTsKKyAgICAgICAgICAgIFMxIGIgPSBuZXcgUzEoIDMxLCAzMiwgMzMgKTsKKyAgICAgICAgICAgIEUxIGMgPSBFMS5BOworCisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IHZmLkV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgUzIoIGEsIGIsIGMgKSApOworCQkgICAgc3YuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1MyICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMsIHN2LkNvdW50ICk7CisgICAgCQkKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggYSwgc3YuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGIsIHN2LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IgKSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCBjLCBzdi5HZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jICkgKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfUzJfaW1wb3J0KCkKKwkgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMiwgdmYpOworCisgICAgICAgICAgICBzdi5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hLCBuZXcgUzEoIDIxLCAyMiwgMjMgKSApOworICAgICAgICAgICAgc3YuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYiwgbmV3IFMxKCAzMSwgMzIsIDMzICkgKTsKKyAgICAgICAgICAgIHN2LkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2MsIEUxLkEgKTsKKworICAgICAgICAgICAgUzIgcyA9ICggUzIgKSB2Zi5JbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMjEsIHMuYS54ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDIyLCBzLmEueSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyMywgcy5hLnogKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMzEsIHMuYi54ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDMyLCBzLmIueSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAzMywgcy5iLnogKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggRTEuQSwgcy5jICk7CisJICAgIH0KKyAgICAJCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0X1MzKCkKKwkgICAgeworCQkgICAgLy8gdHlwZSAvLworCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfUzMsCisgICAgCQkKKwkJICAgIC8vIGZpZWxkcyAvLworCS8vCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfdHlwZTEsCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfdGlwZSwKKwkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94ICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X1MzX2V4cG9ydCgpCisJICAgIHsJCQorCQkgICAgdGVzdFMzRXhwb3J0KCJib29sZWFuIiwgQ29uc3RzVGVzdDEuQk9PTDEpOworCQkgICAgdGVzdFMzRXhwb3J0KCJieXRlIiwgQ29uc3RzVGVzdDEuQllURTUpOworCQkgICAgdGVzdFMzRXhwb3J0KCJzaG9ydCIsIENvbnN0c1Rlc3QxLlNIT1JUNSk7CisJCSAgICB0ZXN0UzNFeHBvcnQoImludCIsIENvbnN0c1Rlc3QxLklOVDUpOworCQkgICAgdGVzdFMzRXhwb3J0KCJsb25nIiwgQ29uc3RzVGVzdDEuTE9ORzUpOworCQkgICAgdGVzdFMzRXhwb3J0KCJmbG9hdCIsIENvbnN0c1Rlc3QxLkZMT0FUNSk7CisJCSAgICB0ZXN0UzNFeHBvcnQoImRvdWJsZSIsIENvbnN0c1Rlc3QxLkRPVUJMRTUpOworCQkgICAgdGVzdFMzRXhwb3J0KCJzdHJpbmciLCBDb25zdHNUZXN0MS5TVFJJTkczKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfUzNfaW1wb3J0KCkKKwkgICAgeworCQkgICAgdGVzdFMzSW1wb3J0KCJib29sZWFuIiwgQ29uc3RzVGVzdDEuQk9PTDEpOworCQkgICAgdGVzdFMzSW1wb3J0KCJieXRlIiwgQ29uc3RzVGVzdDEuQllURTUpOworCQkgICAgdGVzdFMzSW1wb3J0KCJzaG9ydCIsIENvbnN0c1Rlc3QxLlNIT1JUNSk7CisJCSAgICB0ZXN0UzNJbXBvcnQoImludCIsIENvbnN0c1Rlc3QxLklOVDUpOworCQkgICAgdGVzdFMzSW1wb3J0KCJsb25nIiwgQ29uc3RzVGVzdDEuTE9ORzUpOworCQkgICAgdGVzdFMzSW1wb3J0KCJmbG9hdCIsIENvbnN0c1Rlc3QxLkZMT0FUNSk7CisJCSAgICB0ZXN0UzNJbXBvcnQoImRvdWJsZSIsIENvbnN0c1Rlc3QxLkRPVUJMRTUpOworCQkgICAgdGVzdFMzSW1wb3J0KCJzdHJpbmciLCBDb25zdHNUZXN0MS5TVFJJTkczKTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfUzQoKQorCSAgICB7CisJCSAgICAvLyB0eXBlIC8vCisKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TNCwKKyAgICAJCQorCQkgICAgLy8gZmllbGRzIC8vCisJCSAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3RpcGUsCisJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCApOworCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9TNF9leHBvcnQoKQorCSAgICB7CQorCQkgICAgT2JqZWN0W10gYm9vbE9iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuQk9PTDEsIENvbnN0c1Rlc3QxLkJPT0wyfTsKKwkJICAgIE9iamVjdFtdIGJ5dGVPYmplY3QgPSBuZXcgT2JqZWN0W10ge0NvbnN0c1Rlc3QxLkJZVEUxLCBDb25zdHNUZXN0MS5CWVRFMiwgQ29uc3RzVGVzdDEuQllURTMsIENvbnN0c1Rlc3QxLkJZVEU0LCBDb25zdHNUZXN0MS5CWVRFNX07CisJCSAgICBPYmplY3RbXSBzaG9ydE9iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuU0hPUlQxLCBDb25zdHNUZXN0MS5TSE9SVDIsIENvbnN0c1Rlc3QxLlNIT1JUMywgQ29uc3RzVGVzdDEuU0hPUlQ0LCBDb25zdHNUZXN0MS5TSE9SVDV9OworCQkgICAgT2JqZWN0W10gaW50T2JqZWN0ID0gbmV3IE9iamVjdFtde0NvbnN0c1Rlc3QxLklOVDEsIENvbnN0c1Rlc3QxLklOVDIsIENvbnN0c1Rlc3QxLklOVDMsIENvbnN0c1Rlc3QxLklOVDQsIENvbnN0c1Rlc3QxLklOVDV9OworCQkgICAgT2JqZWN0W10gbG9uZ09iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuTE9ORzEsIENvbnN0c1Rlc3QxLkxPTkcyLCBDb25zdHNUZXN0MS5MT05HMywgQ29uc3RzVGVzdDEuTE9ORzQsIENvbnN0c1Rlc3QxLkxPTkc1fTsKKwkJICAgIE9iamVjdFtdIGZsb2F0T2JqZWN0ID0gbmV3IE9iamVjdFtde0NvbnN0c1Rlc3QxLkZMT0FUMSwgQ29uc3RzVGVzdDEuRkxPQVQyLCBDb25zdHNUZXN0MS5GTE9BVDMsIENvbnN0c1Rlc3QxLkZMT0FUNCwgQ29uc3RzVGVzdDEuRkxPQVQ1fTsKKwkJICAgIE9iamVjdFtdIGRvdWJsZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuRE9VQkxFMSwgQ29uc3RzVGVzdDEuRE9VQkxFMiwgQ29uc3RzVGVzdDEuRE9VQkxFMywgQ29uc3RzVGVzdDEuRE9VQkxFNCwgQ29uc3RzVGVzdDEuRE9VQkxFNX07CisJCSAgICBPYmplY3RbXSBzdHJpbmdPYmplY3QgPSBuZXcgT2JqZWN0IFtde0NvbnN0c1Rlc3QxLlNUUklORzEsIENvbnN0c1Rlc3QxLlNUUklORzIsIENvbnN0c1Rlc3QxLlNUUklORzMsIENvbnN0c1Rlc3QxLlNUUklORzQsIENvbnN0c1Rlc3QxLlNUUklORzV9OworCisJCSAgICB0ZXN0UzRFeHBvcnQoImJvb2xlYW4iLCBib29sT2JqZWN0KTsKKwkJICAgIHRlc3RTNEV4cG9ydCgiYnl0ZSIsIGJ5dGVPYmplY3QpOworCQkgICAgdGVzdFM0RXhwb3J0KCJzaG9ydCIsIHNob3J0T2JqZWN0KTsKKwkJICAgIHRlc3RTNEV4cG9ydCgiaW50IiwgaW50T2JqZWN0KTsKKwkJICAgIHRlc3RTNEV4cG9ydCgibG9uZyIsIGxvbmdPYmplY3QpOworCQkgICAgdGVzdFM0RXhwb3J0KCJmbG9hdCIsIGZsb2F0T2JqZWN0KTsKKwkJICAgIHRlc3RTNEV4cG9ydCgiZG91YmxlIiwgZG91YmxlT2JqZWN0KTsKKwkJICAgIHRlc3RTNEV4cG9ydCgic3RyaW5nIiwgc3RyaW5nT2JqZWN0KTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfUzRfaW1wb3J0KCkKKwkgICAgeworCQkgICAgT2JqZWN0W10gYm9vbE9iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuQk9PTDEsIENvbnN0c1Rlc3QxLkJPT0wyfTsKKwkJICAgIE9iamVjdFtdIGJ5dGVPYmplY3QgPSBuZXcgT2JqZWN0W10ge0NvbnN0c1Rlc3QxLkJZVEUxLCBDb25zdHNUZXN0MS5CWVRFMiwgQ29uc3RzVGVzdDEuQllURTMsIENvbnN0c1Rlc3QxLkJZVEU0LCBDb25zdHNUZXN0MS5CWVRFNX07CisJCSAgICBPYmplY3RbXSBzaG9ydE9iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuU0hPUlQxLCBDb25zdHNUZXN0MS5TSE9SVDIsIENvbnN0c1Rlc3QxLlNIT1JUMywgQ29uc3RzVGVzdDEuU0hPUlQ0LCBDb25zdHNUZXN0MS5TSE9SVDV9OworCQkgICAgT2JqZWN0W10gaW50T2JqZWN0ID0gbmV3IE9iamVjdFtde0NvbnN0c1Rlc3QxLklOVDEsIENvbnN0c1Rlc3QxLklOVDIsIENvbnN0c1Rlc3QxLklOVDMsIENvbnN0c1Rlc3QxLklOVDQsIENvbnN0c1Rlc3QxLklOVDV9OworCQkgICAgT2JqZWN0W10gbG9uZ09iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuTE9ORzEsIENvbnN0c1Rlc3QxLkxPTkcyLCBDb25zdHNUZXN0MS5MT05HMywgQ29uc3RzVGVzdDEuTE9ORzQsIENvbnN0c1Rlc3QxLkxPTkc1fTsKKwkJICAgIE9iamVjdFtdIGZsb2F0T2JqZWN0ID0gbmV3IE9iamVjdFtde0NvbnN0c1Rlc3QxLkZMT0FUMSwgQ29uc3RzVGVzdDEuRkxPQVQyLCBDb25zdHNUZXN0MS5GTE9BVDMsIENvbnN0c1Rlc3QxLkZMT0FUNCwgQ29uc3RzVGVzdDEuRkxPQVQ1fTsKKwkJICAgIE9iamVjdFtdIGRvdWJsZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7Q29uc3RzVGVzdDEuRE9VQkxFMSwgQ29uc3RzVGVzdDEuRE9VQkxFMiwgQ29uc3RzVGVzdDEuRE9VQkxFMywgQ29uc3RzVGVzdDEuRE9VQkxFNCwgQ29uc3RzVGVzdDEuRE9VQkxFNX07CisJCSAgICBPYmplY3RbXSBzdHJpbmdPYmplY3QgPSBuZXcgT2JqZWN0IFtde0NvbnN0c1Rlc3QxLlNUUklORzEsIENvbnN0c1Rlc3QxLlNUUklORzIsIENvbnN0c1Rlc3QxLlNUUklORzMsIENvbnN0c1Rlc3QxLlNUUklORzQsIENvbnN0c1Rlc3QxLlNUUklORzV9OworCisJCSAgICB0ZXN0UzRJbXBvcnQoImJvb2xlYW4iLCBib29sT2JqZWN0KTsKKwkJICAgIHRlc3RTNEltcG9ydCgiYnl0ZSIsIGJ5dGVPYmplY3QpOworCQkgICAgdGVzdFM0SW1wb3J0KCJzaG9ydCIsIHNob3J0T2JqZWN0KTsKKwkJICAgIHRlc3RTNEltcG9ydCgiaW50IiwgaW50T2JqZWN0KTsKKwkJICAgIHRlc3RTNEltcG9ydCgibG9uZyIsIGxvbmdPYmplY3QpOworCQkgICAgdGVzdFM0SW1wb3J0KCJmbG9hdCIsIGZsb2F0T2JqZWN0KTsKKwkJICAgIHRlc3RTNEltcG9ydCgiZG91YmxlIiwgZG91YmxlT2JqZWN0KTsKKwkJICAgIHRlc3RTNEltcG9ydCgic3RyaW5nIiwgc3RyaW5nT2JqZWN0KTsKKwkgICAgfQkKKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9leGNwcygpCisJICAgIHsKKwkJICAgIC8vIHR5cGUgLy8KKyAgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AxLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSApOyAKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwMiApOworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AzICk7CisgICAgICAgICAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDQgKTsKKyAgICAgICAgICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwNSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZyxWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKTsKKyAgICAgICAgICAgIGNoZWNrVHlwZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3A2LCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gpOworICAgIAkJCisJCSAgICAvLyBmaWVsZHMgLy8KKyAgICAJCQorCQkgLy8gICBjaGVja0ZpZWxkKCBWYWx1ZUZhY3RvcnlUZXN0Ll9tZl9tc2cgKTsKKyAgICAgICAgICAvLyAgY2hlY2tGaWVsZCggVmFsdWVGYWN0b3J5VGVzdC5fbWZfY29kZSApOworICAgICAgICAgIC8vICBjaGVja0ZpZWxkKCBWYWx1ZUZhY3RvcnlUZXN0Ll9tZl94ICk7CisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X2V4Y3BzX2V4cG9ydCgpCisJICAgIHsKKyAgICAgICAgICAgIE9iamVjdFtdIGJvb2xPYmplY3QgPSBuZXcgT2JqZWN0W10geyBDb25zdHNUZXN0MS5CT09MMSwgQ29uc3RzVGVzdDEuQk9PTDIgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGJ5dGVPYmplY3QgPSBuZXcgT2JqZWN0W10geyBDb25zdHNUZXN0MS5CWVRFMSwgQ29uc3RzVGVzdDEuQllURTIsIENvbnN0c1Rlc3QxLkJZVEUzLCBDb25zdHNUZXN0MS5CWVRFNCwgQ29uc3RzVGVzdDEuQllURTUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIHNob3J0T2JqZWN0ID0gbmV3IE9iamVjdFtdIHsgQ29uc3RzVGVzdDEuU0hPUlQxLCBDb25zdHNUZXN0MS5TSE9SVDIsIENvbnN0c1Rlc3QxLlNIT1JUMywgQ29uc3RzVGVzdDEuU0hPUlQ0LCBDb25zdHNUZXN0MS5TSE9SVDUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGludE9iamVjdCA9IG5ldyBPYmplY3RbXSB7IENvbnN0c1Rlc3QxLklOVDEsIENvbnN0c1Rlc3QxLklOVDIsIENvbnN0c1Rlc3QxLklOVDMsIENvbnN0c1Rlc3QxLklOVDQsIENvbnN0c1Rlc3QxLklOVDUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGxvbmdPYmplY3QgPSBuZXcgT2JqZWN0W10geyBDb25zdHNUZXN0MS5MT05HMSwgQ29uc3RzVGVzdDEuTE9ORzIsIENvbnN0c1Rlc3QxLkxPTkczLCBDb25zdHNUZXN0MS5MT05HNCwgQ29uc3RzVGVzdDEuTE9ORzUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGZsb2F0T2JqZWN0ID0gbmV3IE9iamVjdFtdIHsgQ29uc3RzVGVzdDEuRkxPQVQxLCBDb25zdHNUZXN0MS5GTE9BVDIsIENvbnN0c1Rlc3QxLkZMT0FUMywgQ29uc3RzVGVzdDEuRkxPQVQ0LCBDb25zdHNUZXN0MS5GTE9BVDUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGRvdWJsZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7IENvbnN0c1Rlc3QxLkRPVUJMRTEsIENvbnN0c1Rlc3QxLkRPVUJMRTIsIENvbnN0c1Rlc3QxLkRPVUJMRTMsIENvbnN0c1Rlc3QxLkRPVUJMRTQsIENvbnN0c1Rlc3QxLkRPVUJMRTUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIHN0cmluZ09iamVjdCA9IG5ldyBPYmplY3RbXSB7IENvbnN0c1Rlc3QxLlNUUklORzEsIENvbnN0c1Rlc3QxLlNUUklORzIsIENvbnN0c1Rlc3QxLlNUUklORzMsIENvbnN0c1Rlc3QxLlNUUklORzQsIENvbnN0c1Rlc3QxLlNUUklORzUgfTsKKworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24iOworICAgICAgICAgICAgaW50IGNvZGUgPSA1MDA7CisKKwkJICAgIFN0cnVjdFZhbHVlIHN2ID0gdmYuRXhwb3J0Q3VzdG9tVmFsdWUoIG5ldyBFeGNwMSggImFiYyIsIDIzICkgKTsKKwkJICAgIHN2LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwMSApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBzdi5Db3VudCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAiYWJjIiwgc3YuR2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnICkgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMjMsIHN2LkdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUgKSApOworCisgICAgICAgICAgICBzdiA9IHZmLkV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgRXhjcDIoKSApOworCQkgICAgc3YuQ2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AyICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIHN2LkNvdW50ICk7CisKKyAgICAgICAgICAgIHN2ID0gdmYuRXhwb3J0Q3VzdG9tVmFsdWUoIG5ldyBFeGNwMygpICk7CisJCSAgICBzdi5DaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDMgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggMCwgc3YuQ291bnQgKTsKKworICAgICAgICAgICAgc3YgPSB2Zi5FeHBvcnRDdXN0b21WYWx1ZSggbmV3IEV4Y3A0KCkgKTsKKwkJICAgIHN2LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwNCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBzdi5Db3VudCApOworCisgICAgICAgICAgICAvLyBJbXBvcnQgZXhjZXB0aW9uIHdpdGggb2JqZWN0IGFzIHBhcmFtCisgICAgICAgICAgICB0ZXN0RXhjcDVFeHBvcnQoIG1zZywgY29kZSwgQ29uc3RzVGVzdDEuQk9PTDIgKTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUV4cG9ydCggbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5CWVRFNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1RXhwb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLlNIT1JUNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1RXhwb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLklOVDUgKTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUV4cG9ydCggbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5MT05HNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1RXhwb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkZMT0FUNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1RXhwb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkRPVUJMRTUgKTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUV4cG9ydCggbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5TVFJJTkczICk7CisKKyAgICAgICAgICAgIC8vIEltcG9ydCBleGNlcHRpb24gd2l0aCBhcnJheSBvZiBvYmplY3QgYXMgcGFyYW0KKyAgICAgICAgICAgIHRlc3RFeGNwNkV4cG9ydCggbXNnLCBjb2RlLCBib29sT2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZFeHBvcnQoIG1zZywgY29kZSwgYnl0ZU9iamVjdCApOworICAgICAgICAgICAgdGVzdEV4Y3A2RXhwb3J0KCBtc2csIGNvZGUsIHNob3J0T2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZFeHBvcnQoIG1zZywgY29kZSwgaW50T2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZFeHBvcnQoIG1zZywgY29kZSwgbG9uZ09iamVjdCApOworICAgICAgICAgICAgdGVzdEV4Y3A2RXhwb3J0KCBtc2csIGNvZGUsIGZsb2F0T2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZFeHBvcnQoIG1zZywgY29kZSwgZG91YmxlT2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZFeHBvcnQoIG1zZywgY29kZSwgc3RyaW5nT2JqZWN0ICk7CQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9leGNwc19pbXBvcnQoKQorCSAgICB7CisKKyAgICAgICAgICAgIE9iamVjdFtdIGJvb2xPYmplY3QgPSBuZXcgT2JqZWN0W10geyBDb25zdHNUZXN0MS5CT09MMSwgQ29uc3RzVGVzdDEuQk9PTDIgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGJ5dGVPYmplY3QgPSBuZXcgT2JqZWN0W10geyBDb25zdHNUZXN0MS5CWVRFMSwgQ29uc3RzVGVzdDEuQllURTIsIENvbnN0c1Rlc3QxLkJZVEUzLCBDb25zdHNUZXN0MS5CWVRFNCwgQ29uc3RzVGVzdDEuQllURTUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIHNob3J0T2JqZWN0ID0gbmV3IE9iamVjdFtdIHsgQ29uc3RzVGVzdDEuU0hPUlQxLCBDb25zdHNUZXN0MS5TSE9SVDIsIENvbnN0c1Rlc3QxLlNIT1JUMywgQ29uc3RzVGVzdDEuU0hPUlQ0LCBDb25zdHNUZXN0MS5TSE9SVDUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGludE9iamVjdCA9IG5ldyBPYmplY3RbXSB7IENvbnN0c1Rlc3QxLklOVDEsIENvbnN0c1Rlc3QxLklOVDIsIENvbnN0c1Rlc3QxLklOVDMsIENvbnN0c1Rlc3QxLklOVDQsIENvbnN0c1Rlc3QxLklOVDUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGxvbmdPYmplY3QgPSBuZXcgT2JqZWN0W10geyBDb25zdHNUZXN0MS5MT05HMSwgQ29uc3RzVGVzdDEuTE9ORzIsIENvbnN0c1Rlc3QxLkxPTkczLCBDb25zdHNUZXN0MS5MT05HNCwgQ29uc3RzVGVzdDEuTE9ORzUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGZsb2F0T2JqZWN0ID0gbmV3IE9iamVjdFtdIHsgQ29uc3RzVGVzdDEuRkxPQVQxLCBDb25zdHNUZXN0MS5GTE9BVDIsIENvbnN0c1Rlc3QxLkZMT0FUMywgQ29uc3RzVGVzdDEuRkxPQVQ0LCBDb25zdHNUZXN0MS5GTE9BVDUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIGRvdWJsZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7IENvbnN0c1Rlc3QxLkRPVUJMRTEsIENvbnN0c1Rlc3QxLkRPVUJMRTIsIENvbnN0c1Rlc3QxLkRPVUJMRTMsIENvbnN0c1Rlc3QxLkRPVUJMRTQsIENvbnN0c1Rlc3QxLkRPVUJMRTUgfTsKKyAgICAgICAgICAgIE9iamVjdFtdIHN0cmluZ09iamVjdCA9IG5ldyBPYmplY3RbXSB7IENvbnN0c1Rlc3QxLlNUUklORzEsIENvbnN0c1Rlc3QxLlNUUklORzIsIENvbnN0c1Rlc3QxLlNUUklORzMsIENvbnN0c1Rlc3QxLlNUUklORzQsIENvbnN0c1Rlc3QxLlNUUklORzUgfTsKKworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24iOworICAgICAgICAgICAgaW50IGNvZGUgPSA1MDA7CisKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDEsIHZmKTsKKwkJICAgIHN2LkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywgImRlZiIgKTsKKwkJICAgIHN2LkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUsIDI5ICk7CisgICAgICAgICAgICBFeGNwMSBlMSA9ICggRXhjcDEgKSB2Zi5JbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJICAgIEFzc2VydC5BcmVFcXVhbCggImRlZiIsIGUxLm1zZyApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAyOSwgZTEuY29kZSApOworCQkgICAgZTEgPSBudWxsOworCisgICAgICAgICAgICBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AyLCB2Zik7CisgICAgICAgICAgICBFeGNwMiBlMiA9ICggRXhjcDIgKSB2Zi5JbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJICAgIEFzc2VydC5Jc05vdE51bGwoIGUyICk7CisJCSAgICBlMiA9IG51bGw7CisKKyAgICAgICAgICAgIHN2ID0gbmV3IFN0cnVjdFZhbHVlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDMsIHZmKTsKKyAgICAgICAgICAgIEV4Y3AzIGUzID0gKCBFeGNwMyApIHZmLkltcG9ydEN1c3RvbVZhbHVlKCBzdiApOworCQkgICAgQXNzZXJ0LklzTm90TnVsbCggZTMgKTsKKwkJICAgIGUzID0gbnVsbDsKKworICAgICAgICAgICAgc3YgPSBuZXcgU3RydWN0VmFsdWUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwNCwgdmYpOworICAgICAgICAgICAgRXhjcDQgZTQgPSAoIEV4Y3A0ICkgdmYuSW1wb3J0Q3VzdG9tVmFsdWUoIHN2ICk7CisJCSAgICBBc3NlcnQuSXNOb3ROdWxsKCBlNCApOworCQkgICAgZTQgPSBudWxsOworCisgICAgICAgICAgICAvLyBJbXBvcnQgZXhjZXB0aW9uIHdpdGggb2JqZWN0IGFzIHBhcmFtCisgICAgICAgICAgICB0ZXN0RXhjcDVJbXBvcnQoIG1zZywgY29kZSwgQ29uc3RzVGVzdDEuQk9PTDIgKTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUltcG9ydCggbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5CWVRFNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1SW1wb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLlNIT1JUNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1SW1wb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLklOVDUgKTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUltcG9ydCggbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5MT05HNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1SW1wb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkZMT0FUNSApOworICAgICAgICAgICAgdGVzdEV4Y3A1SW1wb3J0KCBtc2csIGNvZGUsIENvbnN0c1Rlc3QxLkRPVUJMRTUgKTsKKyAgICAgICAgICAgIHRlc3RFeGNwNUltcG9ydCggbXNnLCBjb2RlLCBDb25zdHNUZXN0MS5TVFJJTkczICk7CisKKyAgICAgICAgICAgIC8vIEltcG9ydCBleGNlcHRpb24gd2l0aCBhcnJheSBvZiBvYmplY3QgYXMgcGFyYW0KKyAgICAgICAgICAgIHRlc3RFeGNwNkltcG9ydCggbXNnLCBjb2RlLCBib29sT2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZJbXBvcnQoIG1zZywgY29kZSwgYnl0ZU9iamVjdCApOworICAgICAgICAgICAgdGVzdEV4Y3A2SW1wb3J0KCBtc2csIGNvZGUsIHNob3J0T2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZJbXBvcnQoIG1zZywgY29kZSwgaW50T2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZJbXBvcnQoIG1zZywgY29kZSwgbG9uZ09iamVjdCApOworICAgICAgICAgICAgdGVzdEV4Y3A2SW1wb3J0KCBtc2csIGNvZGUsIGZsb2F0T2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZJbXBvcnQoIG1zZywgY29kZSwgZG91YmxlT2JqZWN0ICk7CisgICAgICAgICAgICB0ZXN0RXhjcDZJbXBvcnQoIG1zZywgY29kZSwgc3RyaW5nT2JqZWN0ICk7CQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2Rfbm90aGluZygpCisJICAgIHsKKyAgICAgICAgICAgIGNoZWNrVHlwZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX25vdGhpbmcsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkKTsKKyAgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfbm90aGluZywgCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9pbmNyKCkKKwkgICAgeworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94KTsKKworCisgICAgICAgICAgICBjaGVja1R5cGUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2luY3IsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQpOworCQkgICAgCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9zdWIoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfc3ViLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl95ICk7CisKKworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9zdWIsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQpOworCQkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3N1bSgpCisJICAgIHsKKyAgICAgICAgICAgIGNoZWNrVHlwZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3N1bSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94KTsKKworCisgICAgICAgICAgICBjaGVja1R5cGUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1bSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCk7CisJCSAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3RyYW5zKCkKKwkgICAgeworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfdHJhbnMsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gpOworCisKKyAgICAgICAgICAgIGNoZWNrVHlwZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdHJhbnMsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQpOworCQkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX2Rpc3QoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZGlzdCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hLAorCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IgKTsKKworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9kaXN0LCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9maWxsKCkKKwkgICAgeworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZmlsbCwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbiwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKTsKKworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkJICAgCisJICAgIH0KKyAgICAJCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9maWxsT2JqZWN0KCkKKwkgICAgeworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZmlsbE9iamVjdCwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCSAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbiwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX28gKTsKKworICAgICAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsT2JqZWN0LCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkJICAgCisJICAgIH0KKyAgICAJCisKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX2Jsb3coKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmxvdyAsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywKKwkJICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlICk7CisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Jsb3csIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJICAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX2JlZXRzKCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2JlZXRzLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UgKTsgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJICAgIAorCSAgICB9CisgICAgCQorICAgICAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2RfdGhyb3dFeGNwNSgpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90aHJvd0V4Y3A1LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2csCisgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlLAorICAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfdmFsdWUpOworCQkKKyAgICAgICAgICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Rocm93RXhjcDUsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCk7CisKKwkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF90aHJvd0V4Y3A2KCkKKwkgICAgeworICAgICAgICAgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Rocm93RXhjcDUsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2csCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfdmFsdWUpOworCisJCSAgICAKKyAgICAgICAgICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Rocm93RXhjcDYsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCk7CisJCisJICAgIH0KKworCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2RfcF9ib29sZWFuKCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYm9vbGVhbiwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EpOworCisJCSAgCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYm9vbGVhbiwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkJICAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfYm9vbGVhbl9hcnJheSgpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2Jvb2xlYW5fYXJyYXksCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hKTsKKwkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYm9vbGVhbl9hcnJheSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX2J5dGUoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ieXRlLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSk7CisJCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGUsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCk7CisKKwkJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX2J5dGVfYXJyYXkoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ieXRlX2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSk7CisKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYnl0ZV9hcnJheSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKworCQkgICAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfc2hvcnQoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zaG9ydCwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EpOworCQkgICAgCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnQsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCk7CisJCSAgIAorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2RfcF9zaG9ydF9hcnJheSgpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3Nob3J0X2FycmF5LAorICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hKTsKKwkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnRfYXJyYXksCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisKKworCQkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfaW50KCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfaW50LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKyAgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9pbnQsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKyAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCk7CisKKwkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfaW50X2FycmF5KCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfaW50X2FycmF5ICwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKworICAgIAkJCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2ludF9hcnJheSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfbG9uZygpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2xvbmcsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfbG9uZywKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKyAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKworCisJCQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2RfcF9sb25nX2FycmF5KCkKKwkgICAgeworCSAgICAgICAgY2hlY2tUeXBlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9sb25nX2FycmF5LAorCSAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCSAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hKTsKKworCisJICAgICAgICBjaGVja1R5cGUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfbG9uZ19hcnJheSwKKwkgICAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkgICAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkgICAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0KTsKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX2Zsb2F0KCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZmxvYXQsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCSAgIAorICAgIAkJCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Zsb2F0LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJICAgIAorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2RfcF9mbG9hdF9hcnJheSgpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2Zsb2F0X2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZmxvYXRfYXJyYXksCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCisJCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX2RvdWJsZSgpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2RvdWJsZSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKworICAgIAkJCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2RvdWJsZSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisKKwkJICAgCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX2RvdWJsZV9hcnJheSgpCisJICAgIHsKKwkgICAgICAgIGNoZWNrVHlwZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZG91YmxlX2FycmF5LAorCSAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCSAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hKTsKKwkJICAgCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlX2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKworCQorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2RfcF9zdHJpbmcoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zdHJpbmcsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisKKwkJICAgCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKworCQkgICAKKwkgICAgfQorCisgICAgICAgIFtUZXN0XQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX3N0cmluZ19hcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrVHlwZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfc3RyaW5nX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hKTsKKworCisgICAgICAgICAgICBjaGVja1R5cGUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfRTEoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9FMSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKworCQkgICAgCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX0UxLAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKworCQkgICAgCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX0UxX2FycmF5KCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfRTFfYXJyYXksCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisKKworICAgIAkJCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX0UxX2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfUzEoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzEsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX1MxX2FycmF5KCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzFfYXJyYXksCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzFfYXJyYXksCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCSAgICAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfUzIoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMiwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKyAgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMiwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCSAgIAorCSAgICB9CisgICAgCQorCSAgICBbVGVzdF0KKwkgICAgcHVibGljIHZvaWQgdGVzdF9tZXRob2RfcF9TMl9hcnJheSgpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX1MyX2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworICAgIAkJCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX1MyX2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJICAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfQmxvYigpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX0Jsb2IsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfQmxvYiwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCSAgCisJICAgIH0KKyAgICAJCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX0Jsb2JfYXJyYXkoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9CbG9iX2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfQmxvYl9hcnJheSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCSAgIAorCSAgICB9CisKKyAgICAgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfb2JqZWN0KCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfb2JqZWN0LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkgICAKKyAgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3QsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQkgICAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfb2JqZWN0X2FycmF5KCkKKwkgICAgeworCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfb2JqZWN0X2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkgICAKKyAgICAJCQorCQkgICAgY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3RfYXJyYXksCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQkgICAKKwkgICAgfQorICAgIAkKKwkgICAgW1Rlc3RdCisJICAgIHB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfb2JqZWN0X3N0cnVjdCgpCisJICAgIHsKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX29iamVjdF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCSAgIAorICAgIAkJCisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX29iamVjdF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQkgICAKKwkgICAgfQorCisJICAgIFtUZXN0XQorCSAgICBwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9wX29iamVjdF9zdHJ1Y3RfYXJyYXkoKQorCSAgICB7CisJCSAgICBjaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9vYmplY3Rfc3RydWN0X2FycmF5LAorICAgICAgICAgICAgICAgIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkgICAgCisgICAgCQkKKwkJICAgIGNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfb2JqZWN0X3N0cnVjdF9hcnJheSwKKyAgICAgICAgICAgICAgICBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCSAgCisJICAgIH0KKworCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkgICAgLy8gVVRJTElUWSBNRVRIT0RTIC8vCisJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCSAgICAKKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tUeXBlKCBYVHlwZSB0eXBlLCBwYXJhbXMgRmllbGRbXSBmaWVsZHMgKQorCXsKKwkJIEFzc2VydC5Jc05vdE51bGwoIHR5cGUgKTsKKwkJQXNzZXJ0LkFyZVNhbWUoIHR5cGVvZihYVHlwZSksIHR5cGUuR2V0VHlwZSgpICk7CisJCUFzc2VydC5BcmVTYW1lKCB0eXBlLCB2Zi5HZXRUeXBlKCB0eXBlLklkICkgKTsKKwkJCisJCUxpc3Q8RmllbGQ+IHRmaWVsZHMgPSB0eXBlLkdldEZpZWxkcygpOworCisJCWlmIChmaWVsZHMgIT0gbnVsbCkKKwkJeworCQkJQXNzZXJ0LkFyZUVxdWFsKCBmaWVsZHMuTGVuZ3RoLCB0ZmllbGRzLkNvdW50ICk7CisJCQkKKwkJCS8vZm9yIChGaWVsZCBmOiBmaWVsZHMpCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5MZW5ndGg7aSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHR5cGUuR2V0VmFsaWRhdG9yKGZpZWxkc1tpXSkpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKGZpZWxkc1tpXSwgdHlwZS5HZXRGaWVsZChmaWVsZHNbaV0uSWQpKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShmaWVsZHNbaV0sIHR5cGUuR2V0RmllbGQoZmllbGRzW2ldLk5hbWUpKTsKKyAgICAgICAgICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJCUFzc2VydC5BcmVFcXVhbCggMCwgdGZpZWxkcy5Db3VudCApOworCQl9CisJfQorCisJICAgCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0RW51bUV4cG9ydCggRTEgZSwgWFR5cGUgdCwgRmllbGQgZiApCisJICAgIHsKKwkJICAgIFN0cnVjdFZhbHVlIHN2ID0gdmYuRXhwb3J0Q3VzdG9tVmFsdWUoIGUgKTsKKwkJICAgIHN2LkNoZWNrVHlwZSggdCApOworCQkgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBzdi5Db3VudCApOworCQkgICAgQXNzZXJ0LklzVHJ1ZSggKEJvb2xlYW4pIHN2LkdldCggZiApICk7CisJICAgIH0KKyAgICAJCisJICAgIHByaXZhdGUgdm9pZCB0ZXN0RW51bUltcG9ydCggRTEgZSwgWFR5cGUgdCwgRmllbGQgZiApCisJICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKHQsIHZmKTsKKwkJICAgIHN2LkFkZCggZiwgdHJ1ZSApOworCQkgICAgRTEgYSA9IChFMSkgdmYuSW1wb3J0Q3VzdG9tVmFsdWUoIHN2ICk7CisJCSAgICBBc3NlcnQuQXJlRXF1YWwoIGUsIGEgKTsKKwkgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB0ZXN0UzNFeHBvcnQoIFN0cmluZyBzLCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IHZmLkV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgUzMoIHMsIHZhbHVlICkgKTsKKyAgICAgICAgICAgIHN2LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBzdi5Db3VudCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBzLCBzdlsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3RpcGUgXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB2YWx1ZSwgc3ZbIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IF0gKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB0ZXN0UzNJbXBvcnQoIFN0cmluZyBzLCBPYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1MzLCB2Zik7CisgICAgICAgICAgICBzdi5BZGQoVmFsdWVGYWN0b3J5VGVzdDEuX21mX3RpcGUsIHMpOworICAgICAgICAgICAgc3YuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgdmFsdWUgKTsKKyAgICAgICAgICAgIFMzIG15UzMgPSAoIFMzICkgdmYuSW1wb3J0Q3VzdG9tVmFsdWUoIHN2ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHMsIG15UzMudGlwZSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCB2YWx1ZSwgbXlTMy54ICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdGVzdFM0RXhwb3J0KCBTdHJpbmcgcywgT2JqZWN0W10gdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IHZmLkV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgUzQoIHMsIHZhbHVlICkgKTsKKyAgICAgICAgICAgIHN2LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TNCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAyLCBzdi5Db3VudCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHMsIHN2W1ZhbHVlRmFjdG9yeVRlc3QxLl9tZl90aXBlXSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCBzdlsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggXSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRlc3RTNEltcG9ydCggU3RyaW5nIHMsIE9iamVjdFtdIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TNCwgdmYpOworICAgICAgICAgICAgc3YuQWRkKFZhbHVlRmFjdG9yeVRlc3QxLl9tZl90aXBlLCBzKTsKKyAgICAgICAgICAgIHN2LkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIHZhbHVlICk7CisgICAgICAgICAgICBTNCBteVM0ID0gKCBTNCApIHZmLkltcG9ydEN1c3RvbVZhbHVlKCBzdiApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBzLCBteVM0LnRpcGUgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIG15UzQueCApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRlc3RFeGNwNUV4cG9ydCggU3RyaW5nIG1zZywgaW50IGNvZGUsIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gdmYuRXhwb3J0Q3VzdG9tVmFsdWUoIG5ldyBFeGNwNSggbXNnLCBjb2RlLCB2YWx1ZSApICk7CisgICAgICAgICAgICBzdi5DaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDUgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMywgc3YuQ291bnQgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggbXNnLCBzdltWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnXSApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBjb2RlLCBzdlsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGVdICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCBzdlsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggXSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRlc3RFeGNwNUltcG9ydCggU3RyaW5nIG1zZywgaW50IGNvZGUsIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDUsIHZmKTsKKyAgICAgICAgICAgIHN2LkFkZCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywgbXNnICk7CisgICAgICAgICAgICBzdi5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlLCBjb2RlICk7CisgICAgICAgICAgICBzdi5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCB2YWx1ZSApOworICAgICAgICAgICAgRXhjcDUgZSA9ICggRXhjcDUgKSB2Zi5JbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggbXNnLCBlLm1zZyApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBjb2RlLCBlLmNvZGUgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIGUueCApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRlc3RFeGNwNkV4cG9ydCggU3RyaW5nIG1zZywgaW50IGNvZGUsIE9iamVjdFtdIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RydWN0VmFsdWUgc3YgPSB2Zi5FeHBvcnRDdXN0b21WYWx1ZSggbmV3IEV4Y3A2KCBtc2csIGNvZGUsIHZhbHVlICkgKTsKKyAgICAgICAgICAgIHN2LkNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwNiApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAzLCBzdi5Db3VudCApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBtc2csIHN2WyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnIF0gKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggY29kZSwgc3ZbIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlXSAgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggdmFsdWUsIHN2WyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCBdICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdGVzdEV4Y3A2SW1wb3J0KCBTdHJpbmcgbXNnLCBpbnQgY29kZSwgT2JqZWN0W10gdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZShWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3A2LCB2Zik7CisgICAgICAgICAgICBzdi5BZGQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2csIG1zZyApOworICAgICAgICAgICAgc3YuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSwgY29kZSApOworICAgICAgICAgICAgc3YuQWRkKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgdmFsdWUgKTsKKyAgICAgICAgICAgIEV4Y3A2IGUgPSAoIEV4Y3A2ICkgdmYuSW1wb3J0Q3VzdG9tVmFsdWUoIHN2ICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIG1zZywgZS5tc2cgKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggY29kZSwgZS5jb2RlICk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIHZhbHVlLCBlLnggKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0Zha2VUZXN0MS5qYXZhIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvRmFrZVRlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMDVlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL0Zha2VUZXN0MS5qYXZhCkBAIC0wLDAgKzEsNTE3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJJbnRIYXNoTWFwOworCisvKioKKyAqIFNpbGx5IGltcGxlbWVudGF0aW9uIG9mIFRlc3QgdXNlZCBmb3IgdGVzdGluZy4KKyAqLworcHVibGljIGNsYXNzIEZha2VUZXN0MSBpbXBsZW1lbnRzIFRlc3QxCit7CisJcHVibGljIEludGVnZXIgYmVldHMoIEUxIGUgKSB0aHJvd3MgRXhjcDMsIEV4Y3A0CisJeworCQlpZiAoZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlzd2l0Y2ggKGUpCisJCXsKKwkJCWNhc2UgQTogcmV0dXJuIDU7CisJCQljYXNlIEI6IHRocm93IG5ldyBFeGNwMygpOworCQkJY2FzZSBDOiB0aHJvdyBuZXcgRXhjcDQoKTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYmxvdyggU3RyaW5nIG1zZywgSW50ZWdlciBjb2RlICkgdGhyb3dzIEV4Y3AxCisJeworCQl0aHJvdyBuZXcgRXhjcDEoIG1zZywgY29kZSApOworCX0KKworCXB1YmxpYyBEb3VibGUgZGlzdCggUzEgYSwgUzEgYiApCisJeworCQlTMSBjID0gbmV3IFMxKCBhLngtYi54LCBhLnktYi55LCBhLnotYi56ICk7CisJCXJldHVybiBNYXRoLnNxcnQoIGMueCpjLnggKyBjLnkqYy55ICsgYy56KmMueiApOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGluY3IoIEludGVnZXIgeCApCisJeworCQlyZXR1cm4geCsxOworCX0KKworCXB1YmxpYyB2b2lkIG5vdGhpbmcoKQorCXsKKwkJLy8gbm90aGluZy4KKwl9CisKKwlwdWJsaWMgSW50ZWdlciBzdWIoIEludGVnZXIgeCwgSW50ZWdlciB5ICkKKwl7CisJCXJldHVybiB4LXk7CisJfQorCisJcHVibGljIEludGVnZXIgc3VtKCBpbnRbXSB4ICkKKwl7CisJCWludCBzdW0gPSAwOworCQlmb3IgKGludCBpOiB4KQorCQkJc3VtICs9IGk7CisJCXJldHVybiBzdW07CisJfQorCisJcHVibGljIEludGVnZXIgdHJhbnMoIEUxIGUsIEludGVnZXIgeCApCisJeworCQlzd2l0Y2ggKGUpCisJCXsKKwkJCWNhc2UgQTogcmV0dXJuIHggLyAyOworCQkJY2FzZSBCOiByZXR1cm4geCAqIDI7CisJCQljYXNlIEM6IHJldHVybiB4ICsgNzsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIGludFtdIGZpbGwoIEludGVnZXIgbiwgSW50ZWdlciB4ICkKKwl7CisJCWludFtdIHkgPSBuZXcgaW50W25dOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCXlbaV0gPSB4OworCQlyZXR1cm4geTsKKwl9CisKKwkvLyBGaWxsIG51bUVsZW1lbnRzIG9mIGFuIGFycmF5IHdpdGggdmFsdWUgbworCXB1YmxpYyBPYmplY3RbXSBmaWxsT2JqZWN0KCBJbnRlZ2VyIG51bUVsZW1lbnRzLCBPYmplY3QgbyApCisJeworCQlPYmplY3QgW10geSA9IG5ldyBPYmplY3RbbnVtRWxlbWVudHNdOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpKyspCisJCQl5W2ldID0gbzsKKwkJcmV0dXJuIHk7CisJfQorCQorCXB1YmxpYyBFMSBwX0UxKCBFMSBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBFMVtdIHBfRTFfYXJyYXkoIEUxW10gYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgUzEgcF9TMSggUzEgYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgUzFbXSBwX1MxX2FycmF5KCBTMVtdIGEgKQorCXsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIFMyIHBfUzIoIFMyIGEgKQorCXsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIFMyW10gcF9TMl9hcnJheSggUzJbXSBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBCb29sZWFuIHBfYm9vbGVhbiggQm9vbGVhbiBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBib29sZWFuW10gcF9ib29sZWFuX2FycmF5KCBib29sZWFuW10gYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgQnl0ZSBwX2J5dGUoIEJ5dGUgYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgYnl0ZVtdIHBfYnl0ZV9hcnJheSggYnl0ZVtdIGEgKQorCXsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIERvdWJsZSBwX2RvdWJsZSggRG91YmxlIGEgKQorCXsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIGRvdWJsZVtdIHBfZG91YmxlX2FycmF5KCBkb3VibGVbXSBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBGbG9hdCBwX2Zsb2F0KCBGbG9hdCBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBmbG9hdFtdIHBfZmxvYXRfYXJyYXkoIGZsb2F0W10gYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBwX2ludCggSW50ZWdlciBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBpbnRbXSBwX2ludF9hcnJheSggaW50W10gYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgTG9uZyBwX2xvbmcoIExvbmcgYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgbG9uZ1tdIHBfbG9uZ19hcnJheSggbG9uZ1tdIGEgKQorCXsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIFNob3J0IHBfc2hvcnQoIFNob3J0IGEgKQorCXsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIHNob3J0W10gcF9zaG9ydF9hcnJheSggc2hvcnRbXSBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBTdHJpbmcgcF9zdHJpbmcoIFN0cmluZyBhICkKKwl7CisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBTdHJpbmdbXSBwX3N0cmluZ19hcnJheSggU3RyaW5nW10gYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgU3RySW50SGFzaE1hcCBwX0Jsb2IoIFN0ckludEhhc2hNYXAgYSApCisJeworCQlyZXR1cm4gYTsKKwl9CisKKwlwdWJsaWMgU3RySW50SGFzaE1hcFtdIHBfQmxvYl9hcnJheSggU3RySW50SGFzaE1hcFtdIGEgKQorCXsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIHZvaWQgYWx3YXlzRmFpbHMoKQorCXsKKwkJLy8gaSdtIG5ldmVyIGNhbGxlZC4KKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiYWx3YXlzRmFpbHMiICk7CisJfQorCisJcHVibGljIEludGVnZXIgYWx3YXlzV29ya3MoKQorCXsKKwkJLy8gaSdtIGFsd2F5cyBjYWxsZWQuCisJCXJldHVybiAyMzsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBpc0ZhbHNlKCkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBpc1RydWUoKQorCXsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIEludGVnZXIgYWRkKCBJbnRlZ2VyIGEsIEludGVnZXIgYiApCisJeworCQlyZXR1cm4gYSArIGI7CisJfQorCisJcHVibGljIEJvb2xlYW4gY2FuX20xKCkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEJvb2xlYW4gY2FuX20xMCggRG91YmxlIHggKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBjYW5fbTIoIEJvb2xlYW4geCApCisJeworCQkvLyBub3QgbmVlZGVkCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBCb29sZWFuIGNhbl9tMyggQm9vbGVhbiB4ICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEJvb2xlYW4gY2FuX200KCBCb29sZWFuIHggKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBjYW5fbTcoIEludGVnZXIgeCApCisJeworCQkvLyBub3QgbmVlZGVkCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIG0xKCkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJcHVibGljIHZvaWQgbTEwKCkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJcHVibGljIHZvaWQgbTIoKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBtMygpCisJeworCQkvLyBub3QgbmVlZGVkCisJCQorCX0KKworCXB1YmxpYyB2b2lkIG00KCkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJcHVibGljIHZvaWQgbTcoKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQkKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBldGNoLnRlc3RzLlRlc3QjbTExKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBtMTEoKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQkKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBldGNoLnRlc3RzLlRlc3QjbTUoKQorCSAqLworCXB1YmxpYyB2b2lkIG01KCkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I202KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBtNigpCisJeworCQkvLyBub3QgbmVlZGVkCisJCQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGV0Y2gudGVzdHMuVGVzdCNtOCgpCisJICovCisJcHVibGljIHZvaWQgbTgoKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQkKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBldGNoLnRlc3RzLlRlc3QjbTkoKQorCSAqLworCXB1YmxpYyB2b2lkIG05KCkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I2Nhbl9tMTEoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBjYW5fbTExKCBTdHJpbmcgeCApCisJeworCQkvLyBub3QgbmVlZGVkCisJCXJldHVybiBudWxsOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGV0Y2gudGVzdHMuVGVzdCNjYW5fbTUoamF2YS5sYW5nLkJ5dGUpCisJICovCisJcHVibGljIEJvb2xlYW4gY2FuX201KCBCeXRlIHggKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBldGNoLnRlc3RzLlRlc3QjY2FuX202KGphdmEubGFuZy5TaG9ydCkKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBjYW5fbTYoIFNob3J0IHggKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBldGNoLnRlc3RzLlRlc3QjY2FuX204KGphdmEubGFuZy5Mb25nKQorCSAqLworCXB1YmxpYyBCb29sZWFuIGNhbl9tOCggTG9uZyB4ICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I2Nhbl9tOShqYXZhLmxhbmcuRmxvYXQpCisJICovCisJcHVibGljIEJvb2xlYW4gY2FuX205KCBGbG9hdCB4ICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I2Nhbl9tMTIoamF2YS5sYW5nLkludGVnZXIpCisJICovCisJcHVibGljIEJvb2xlYW4gY2FuX20xMiggSW50ZWdlciB4ICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I2Nhbl9tMTMoamF2YS5sYW5nLkludGVnZXIpCisJICovCisJcHVibGljIEJvb2xlYW4gY2FuX20xMyggSW50ZWdlciB4ICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I2Nhbl9tMTQoamF2YS5sYW5nLkludGVnZXIpCisJICovCisJcHVibGljIEJvb2xlYW4gY2FuX20xNCggSW50ZWdlciB4ICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I2Nhbl9tMTUoZXRjaC50ZXN0cy5UZXN0LkUxKQorCSAqLworCXB1YmxpYyBCb29sZWFuIGNhbl9tMTUoIEUxIHggKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBldGNoLnRlc3RzLlRlc3QjbTEyKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBtMTIoKQorCXsKKwkJLy8gbm90IG5lZWRlZAorCQkKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBldGNoLnRlc3RzLlRlc3QjbTEzKGphdmEubGFuZy5JbnRlZ2VyKQorCSAqLworCXB1YmxpYyB2b2lkIG0xMyggSW50ZWdlciBrICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I20xNChldGNoLnRlc3RzLlRlc3QuUzEpCisJICovCisJcHVibGljIHZvaWQgbTE0KCBTMSBrICkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZXRjaC50ZXN0cy5UZXN0I20xNSgpCisJICovCisJcHVibGljIHZvaWQgbTE1KCkKKwl7CisJCS8vIG5vdCBuZWVkZWQKKwkJCisJfQorCisJcHVibGljIE9iamVjdCBwX29iamVjdChPYmplY3QgYSkgeworCQkvLyBub3QgbmVlZGVkCisJCXJldHVybiBhOworCX0KKworCXB1YmxpYyBPYmplY3RbXSBwX29iamVjdF9hcnJheShPYmplY3RbXSBhKSB7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIFMzIHBfb2JqZWN0X3N0cnVjdChTMyBhKSB7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIFM0IHBfb2JqZWN0X3N0cnVjdF9hcnJheShTNCBhKSB7CisJCS8vIG5vdCBuZWVkZWQKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIHZvaWQgdGhyb3dFeGNwNShTdHJpbmcgbXNnLCBJbnRlZ2VyIGNvZGUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEV4Y3A1IHsKKwkJLy8gbm90IG5lZWRlZAorCQl0aHJvdyBuZXcgRXhjcDUoIG1zZywgY29kZSwgdmFsdWUgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0aHJvd0V4Y3A2KFN0cmluZyBtc2csIEludGVnZXIgY29kZSwgT2JqZWN0W10gdmFsdWUpIHRocm93cyBFeGNwNiB7CisJCS8vIG5vdCBuZWVkZWQKKwkJdGhyb3cgbmV3IEV4Y3A2KCBtc2csIGNvZGUsIHZhbHVlICk7CQkKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0QXN5bmNDbGllbnQuamF2YSBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RBc3luY0NsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTk0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0QXN5bmNDbGllbnQuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkxvZzsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBNYWluIGltcGxlbWVudGF0aW9uIGZvciBBc3luY0NsaWVudC4KKyAqLworcHVibGljIGNsYXNzIFRlc3RBc3luY0NsaWVudAoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLmFkZFNpbmsoIG51bGwgKTsKKwkJTG9nLnJlcG9ydCggIlRlc3RBc3luY0NsaWVudCIgKTsKKwkJCisJCU1haW5Bc3luY0xpc3RlbmVyLm1haW4oIG5ldyBTdHJpbmdbXSB7fSApOworCQkKKwkJU3RyaW5nIHVyaSA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6NDAwMyI7CisKKwkJc2VydmVyID0gQXN5bmNIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsCisJCQluZXcgQXN5bmNIZWxwZXIuQXN5bmNDbGllbnRGYWN0b3J5KCkKKwkJCXsKKwkJCQlwdWJsaWMgQXN5bmNDbGllbnQgbmV3QXN5bmNDbGllbnQoIFJlbW90ZUFzeW5jU2VydmVyIHNlcnZlciApCisJCQkJCXRocm93cyBFeGNlcHRpb24KKwkJCQl7CisJCQkJCXJldHVybiBuZXcgSW1wbEFzeW5jQ2xpZW50KCBzZXJ2ZXIgKTsKKwkJCQl9CisJCQl9ICk7CisJCQorCQlzZXJ2ZXIuX3N0YXJ0QW5kV2FpdFVwKCA0MDAwICk7CisJCXVwID0gdHJ1ZTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cCA9IGZhbHNlOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3luYzEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDAsIHNlcnZlci5zeW5jKCAwICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcyApIC8vIHJlbW90ZSBzaWRlIHRpbWVzIG91dAorCXB1YmxpYyB2b2lkIHN5bmMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc2VydmVyLnN5bmMoIDEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3luY19xdWV1ZWQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCisJCQlhc3NlcnRFcXVhbHMoIGksIHNlcnZlci5hc3luY19xdWV1ZWQoIGkgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzICkgLy8gcmVtb3RlIHNpZGUgdGltZXMgb3V0CisJcHVibGljIHZvaWQgYXN5bmNfcXVldWVkMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlcnZlci5hc3luY19xdWV1ZWQoIDUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3luY19mcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKKwkJCWFzc2VydEVxdWFscyggaSwgc2VydmVyLmFzeW5jX2ZyZWUoIGkgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBmaW5pKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHNlcnZlciAhPSBudWxsICYmIHVwKQorCQkJc2VydmVyLl9zdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgUmVtb3RlQXN5bmNTZXJ2ZXIgc2VydmVyOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdEltcGxJbmNsdWRlcy5qYXZhIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdEltcGxJbmNsdWRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTk4YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0SW1wbEluY2x1ZGVzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogU2ltcGxlIHRlc3RzIHRvIGVuc3VyZSB0aGF0IGluY2x1ZGVzIGRlZmluZWQgaW4gVGVzdEluY2x1ZGVzLmV0Y2ggCisgKiB3b3JrIHByb3Blcmx5IGFuZCBhbGwgaW5jbHVkZWQgdmFyaWFibGVzICYgbWVzc2FnZXMgY2FuIGJlIGFjY2Vzc2VkCisgKgorICogQGF1dGhvciBkYXR0YXMKKyAqLworCisKKworcHVibGljIGNsYXNzIFRlc3RJbXBsSW5jbHVkZXMKK3sKKwkKKwlwcml2YXRlIFJlbW90ZVRlc3RJbmNsdWRlc0NsaWVudCB0YyA9IG51bGw7CisJcHJpdmF0ZSBSZW1vdGVUZXN0SW5jbHVkZXNTZXJ2ZXIgdHMgPSBudWxsOworCXByaXZhdGUgSW1wbFRlc3RJbmNsdWRlc1NlcnZlciB0ZXN0U2VydmVyID0gbnVsbDsKKwlwcml2YXRlIEltcGxUZXN0SW5jbHVkZXNDbGllbnQgdGVzdENsaWVudCA9IG51bGw7CisJCisJLyoqICovCisJQEJlZm9yZSBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKwkJdGVzdFNlcnZlciA9IG5ldyBJbXBsVGVzdEluY2x1ZGVzU2VydmVyKHRjKTsKKwkJdGVzdENsaWVudCA9IG5ldyBJbXBsVGVzdEluY2x1ZGVzQ2xpZW50KHRzKTsKKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbnN0cygpIHsKKwkJCisJCXRyeQorCQl7CQorCQkJdGVzdFNlcnZlci50ZXN0Q29uc3QyKCk7CisJCQl0ZXN0U2VydmVyLnRlc3RDb25zdDMoKTsKKwkJCUludGVnZXIgeCA9IG5ldyBJbnRlZ2VyKDUpOworCQkJSW50ZWdlciB5ID0gbmV3IEludGVnZXIoNTApOworCQkJdGVzdENsaWVudC50ZXN0Q29uc3QxKCB4LCB5ICk7CisJCQl0ZXN0Q2xpZW50LnRlc3RDb25zdDIoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQkJCisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFbnVtcygpIHsKKwkJdHJ5CisJCXsKKwkJCXRlc3RTZXJ2ZXIudGVzdEVudW0yKCk7CisJCQl0ZXN0Q2xpZW50LnRlc3RFbnVtMSgpOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQl9CQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RJbXBsVGVzdDEuamF2YSBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RJbXBsVGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Q4NjhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdEltcGxUZXN0MS5qYXZhCkBAIC0wLDAgKzEsMTE3OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuU3RySW50SGFzaE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuRTE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLlMxOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5TMjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuUzM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLlM0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBTaW1wbGUgdGVzdHMgdG8gZW5zdXJlIHRoYXQgSW1wbFRlc3RDbGllbnQgYW5kIEltcGxUZXN0U2VydmVyIGFyZSBnZW5lcmF0ZWQKKyAqIGNvcnJlY3RseQorICoKKyAqIEBhdXRob3IgZ3NhbmRoaXIKKyAqLworcHVibGljIGNsYXNzIFRlc3RJbXBsVGVzdDEKK3sKKwlwcml2YXRlIEltcGxUZXN0MVNlcnZlciB0ZXN0U2VydmVyID0gbnVsbDsKKwlwcml2YXRlIEltcGxUZXN0MUNsaWVudCB0ZXN0Q2xpZW50ID0gbnVsbDsKKwkKKwkvKiogKi8KKwlAQmVmb3JlIHB1YmxpYyB2b2lkIHNldHVwKCkgeworCQlSZW1vdGVUZXN0MUNsaWVudCB0YyA9IG51bGw7CisJCVJlbW90ZVRlc3QxU2VydmVyIHRzID0gbnVsbDsKKwkJdGVzdFNlcnZlciA9IG5ldyBJbXBsVGVzdDFTZXJ2ZXIodGMpOworCQl0ZXN0Q2xpZW50ID0gbmV3IEltcGxUZXN0MUNsaWVudCh0cyk7CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbmNyKCkgeworCQkKKwkJdHJ5CisJCXsKKwkJCUludGVnZXIgaSA9IG5ldyBJbnRlZ2VyKDUpOwkJCisJCQl0ZXN0U2VydmVyLmluY3IoaSk7CQkJCisJCQl0ZXN0Q2xpZW50LmluY3IoIGkgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdGhpbmcoKSB7CisJCQorCQl0cnkKKwkJewkJCQorCQkJdGVzdFNlcnZlci5ub3RoaW5nKCk7CQkKKwkJCXRlc3RDbGllbnQubm90aGluZygpOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBpID0gbmV3IEludGVnZXIoNSk7CisJCQlJbnRlZ2VyIGogPSBuZXcgSW50ZWdlcigzKTsKKwkJCXRlc3RTZXJ2ZXIuYWRkKCBpLGopOworCQkJdGVzdENsaWVudC5hZGQoIGksaik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3ViKCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBpID0gbmV3IEludGVnZXIoNSk7CisJCQlJbnRlZ2VyIGogPSBuZXcgSW50ZWdlcigzKTsKKwkJCXRlc3RTZXJ2ZXIuc3ViKCBpLGopOworCQkJdGVzdENsaWVudC5zdWIoIGksaik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdFN1bSgpIHsKKwkJdHJ5CisJCXsKKwkJCWludFtdIHggPSB7MSwyLDN9OworCQkJdGVzdFNlcnZlci5zdW0oIHggKTsKKwkJCXRlc3RDbGllbnQuc3VtKCB4ICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQkJCQkKKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RGaWxsKCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBpID0gbmV3IEludGVnZXIoNSk7CisJCQlJbnRlZ2VyIGogPSBuZXcgSW50ZWdlcigzKTsKKwkJCXRlc3RTZXJ2ZXIuZmlsbCggaSwgaiApOworCQkJdGVzdENsaWVudC5maWxsKCBpLGogKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CQkJCQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdEZpbGxPYmplY3QoKSB7CisJCXRyeQorCQl7CisJCQlJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcig1KTsKKwkJCU9iamVjdCBqID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuZmlsbE9iamVjdCggaSwgaiApOworCQkJdGVzdENsaWVudC5maWxsT2JqZWN0KCBpLGogKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CQkJCQorCX0KKwkKKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdFRyYW5zKCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBpID0gbmV3IEludGVnZXIoNSk7CisJCQlFMSBlbnVtQSA9IEUxLkE7CisJCQl0ZXN0U2VydmVyLnRyYW5zKCBlbnVtQSxpICApOworCQkJdGVzdENsaWVudC50cmFucyggZW51bUEsaSAgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CQkJCQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdERpc3QoKSB7CisJCXRyeQorCQl7CisJCQlTMSBhID0gbmV3IFMxKCk7CisJCQlTMSBiID0gbmV3IFMxKCk7CisJCQl0ZXN0U2VydmVyLmRpc3QoIGEsIGIgKTsKKwkJCXRlc3RDbGllbnQuZGlzdCggYSwgYiApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0JCQkKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RCbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeQorCQl7CisJCQlJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcig1KTsJCQorCQkJdGVzdFNlcnZlci5ibG93KCAiIiwgaSk7CisJCQl0ZXN0Q2xpZW50LmJsb3coICIiLCBpICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQkJCQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdEV4Y3A1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeQorCQl7CisJCQlJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcig1KTsJCisJCQlPYmplY3QgdmFsdWUgPSBudWxsOworCQkJdGVzdFNlcnZlci50aHJvd0V4Y3A1KCAiIiwgaSwgdmFsdWUgKTsKKwkJCXRlc3RDbGllbnQudGhyb3dFeGNwNSggIiIsIGksIHZhbHVlICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQkJCQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdEV4Y3A2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeQorCQl7CisJCQlJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcig1KTsJCisJCQlPYmplY3QgdmFsdWVbXSA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnRocm93RXhjcDYoICIiLCBpLCB2YWx1ZSApOworCQkJdGVzdENsaWVudC50aHJvd0V4Y3A2KCAiIiwgaSwgdmFsdWUgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CQkJCisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Qm9vbGVhbigpIHsKKwkJdHJ5CisJCXsKKwkJCUJvb2xlYW4gYiA9IG51bGw7CQorCQkJdGVzdFNlcnZlci5wX2Jvb2xlYW4oIGIgKTsKKwkJCXRlc3RDbGllbnQucF9ib29sZWFuKCBiICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQkJCisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Qm9vbGVhbkFycmF5KCkgeworCQl0cnkKKwkJeworCQkJYm9vbGVhbiBiW10gPSBudWxsOwkKKwkJCXRlc3RTZXJ2ZXIucF9ib29sZWFuX2FycmF5KCBiICk7CisJCQl0ZXN0Q2xpZW50LnBfYm9vbGVhbl9hcnJheSggYiApCTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Qnl0ZSgpIHsKKwkJdHJ5CisJCXsKKwkJCUJ5dGUgYSA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfYnl0ZSggYSApOworCQkJdGVzdENsaWVudC5wX2J5dGUoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Qnl0ZUFycmF5KCkgeworCQl0cnkKKwkJeworCQkJYnl0ZSBhW10gPSBudWxsOworCQkJdGVzdFNlcnZlci5wX2J5dGVfYXJyYXkoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9ieXRlX2FycmF5KCBhICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdFNob3J0KCkgeworCQl0cnkKKwkJeworCQkJU2hvcnQgYSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX3Nob3J0KCBhICk7CisJCQl0ZXN0Q2xpZW50LnBfc2hvcnQoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0U2hvcnRBcnJheSgpIHsKKwkJdHJ5CisJCXsKKwkJCXNob3J0IGFbXSA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfc2hvcnRfYXJyYXkoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9zaG9ydF9hcnJheSggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdEludCgpIHsKKwkJdHJ5CisJCXsKKwkJCUludGVnZXIgYSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX2ludCggYSApOworCQkJdGVzdENsaWVudC5wX2ludCggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RJbnRBcnJheSgpIHsKKwkJdHJ5CisJCXsKKwkJCWludCBhW10gID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIucF9pbnRfYXJyYXkoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9pbnRfYXJyYXkoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TG9uZygpIHsKKwkJdHJ5CisJCXsKKwkJCUxvbmcgYSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX2xvbmcoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9sb25nKCBhICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdExvbmdBcnJheSgpIHsKKwkJdHJ5CisJCXsKKwkJCWxvbmcgYVtdICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfbG9uZ19hcnJheSggYSApOworCQkJdGVzdENsaWVudC5wX2xvbmdfYXJyYXkoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0RmxvYXQoKSB7CisJCXRyeQorCQl7CisJCQlGbG9hdCBhICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfZmxvYXQoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9mbG9hdCggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RGbG9hdEFycmF5KCkgeworCQl0cnkKKwkJeworCQkJZmxvYXQgYVtdICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfZmxvYXRfYXJyYXkoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9mbG9hdF9hcnJheSggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJCisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3REb3VibGUoKSB7CisJCXRyeQorCQl7CisJCQlEb3VibGUgYSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX2RvdWJsZSggYSApOworCQkJdGVzdENsaWVudC5wX2RvdWJsZSggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3REb3VibGVBcnJheSgpIHsKKwkJdHJ5CisJCXsKKwkJCWRvdWJsZSBhW10gID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIucF9kb3VibGVfYXJyYXkoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9kb3VibGVfYXJyYXkoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0U3RyaW5nKCkgeworCQl0cnkKKwkJeworCQkJU3RyaW5nIGEgID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIucF9zdHJpbmcoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9zdHJpbmcoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0U3RyaW5nQXJyYXkoKSB7CisJCXRyeQorCQl7CisJCQlTdHJpbmcgYVtdICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfc3RyaW5nX2FycmF5KCBhICk7CisJCQl0ZXN0Q2xpZW50LnBfc3RyaW5nX2FycmF5KCBhICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdEUxKCkgeworCQl0cnkKKwkJeworCQkJRTEgYSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX0UxKCBhICk7CisJCQl0ZXN0Q2xpZW50LnBfRTEoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0RTFBcnJheSgpIHsKKwkJdHJ5CisJCXsKKwkJCUUxIGFbXSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX0UxX2FycmF5KCBhICk7CisJCQl0ZXN0Q2xpZW50LnBfRTFfYXJyYXkoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0UzEoKSB7CisJCXRyeQorCQl7CisJCQlTMSBhICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfUzEoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9TMSggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RTMUFycmF5KCkgeworCQl0cnkKKwkJeworCQkJUzEgYVtdICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfUzFfYXJyYXkoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9TMV9hcnJheSggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RTMigpIHsKKwkJdHJ5CisJCXsKKwkJCVMyIGEgID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIucF9TMiggYSApOworCQkJdGVzdENsaWVudC5wX1MyKCBhICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdFMyQXJyYXkoKSB7CisJCXRyeQorCQl7CisJCQlTMiBhW10gID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIucF9TMl9hcnJheSggYSApOworCQkJdGVzdENsaWVudC5wX1MyX2FycmF5KCBhICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdEJsb2IoKSB7CisJCXRyeQorCQl7CisJCQlTdHJJbnRIYXNoTWFwIGEgID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIucF9CbG9iKCBhICk7CisJCQl0ZXN0Q2xpZW50LnBfQmxvYiggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RCbG9iQXJyYXkoKSB7CisJCXRyeQorCQl7CisJCQlTdHJJbnRIYXNoTWFwW10gYSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX0Jsb2JfYXJyYXkoIGEgKTsKKwkJCXRlc3RDbGllbnQucF9CbG9iX2FycmF5KCBhICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE9iamVjdCgpIHsKKwkJdHJ5CisJCXsKKwkJCU9iamVjdCBhICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfb2JqZWN0KCBhICk7CisJCQl0ZXN0Q2xpZW50LnBfb2JqZWN0KCBhICk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE9iamVjdEFycmF5KCkgeworCQl0cnkKKwkJeworCQkJT2JqZWN0W10gYSAgPSBudWxsOworCQkJdGVzdFNlcnZlci5wX29iamVjdF9hcnJheSggYSApOworCQkJdGVzdENsaWVudC5wX29iamVjdF9hcnJheSggYSApOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RPYmplY3RTdHJ1Y3QoKSB7CisJCXRyeQorCQl7CisJCQlTMyBhICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfb2JqZWN0X3N0cnVjdCggYSApOworCQkJdGVzdENsaWVudC5wX29iamVjdF9zdHJ1Y3QoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0T2JqZWN0U3RydWN0QXJyYXkoKSB7CisJCXRyeQorCQl7CisJCQlTNCBhICA9IG51bGw7CisJCQl0ZXN0U2VydmVyLnBfb2JqZWN0X3N0cnVjdF9hcnJheSggYSApOworCQkJdGVzdENsaWVudC5wX29iamVjdF9zdHJ1Y3RfYXJyYXkoIGEgKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0QWx3YXlzV29yaygpIHsKKwkJdHJ5CisJCXsKKwkJCQorCQkJdGVzdFNlcnZlci5hbHdheXNXb3JrcygpOworCQkJdGVzdENsaWVudC5hbHdheXNXb3JrcygpOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RBbHdheXNGYWlsKCkgeworCQl0cnkKKwkJeworCQkJCisJCQl0ZXN0U2VydmVyLmFsd2F5c0ZhaWxzKCk7CisJCQl0ZXN0Q2xpZW50LmFsd2F5c0ZhaWxzKCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdElzVHJ1ZSgpIHsKKwkJdHJ5CisJCXsKKwkJCQorCQkJdGVzdFNlcnZlci5pc1RydWUoKTsKKwkJCXRlc3RDbGllbnQuaXNUcnVlKCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdElzRmFsc2UoKSB7CisJCXRyeQorCQl7CisJCQkKKwkJCXRlc3RTZXJ2ZXIuaXNGYWxzZSgpOworCQkJdGVzdENsaWVudC5pc0ZhbHNlKCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE0xKCkgeworCQl0cnkKKwkJeworCQkJCisJCQl0ZXN0U2VydmVyLm0xKCk7CisJCQl0ZXN0Q2xpZW50Lm0xKCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdENhbk0xKCkgeworCQl0cnkKKwkJeworCQkJCisJCQl0ZXN0U2VydmVyLmNhbl9tMSgpOworCQkJdGVzdENsaWVudC5jYW5fbTEoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTIoKSB7CisJCXRyeQorCQl7CisJCQkKKwkJCXRlc3RTZXJ2ZXIubTIoKTsKKwkJCXRlc3RDbGllbnQubTIoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Q2FuTTIoKSB7CisJCXRyeQorCQl7CisJCQlCb29sZWFuIGIgPSBudWxsOworCQkJdGVzdFNlcnZlci5jYW5fbTIoYik7CisJCQl0ZXN0Q2xpZW50LmNhbl9tMihiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTMoKSB7CisJCXRyeQorCQl7CisJCQkKKwkJCXRlc3RTZXJ2ZXIubTMoKTsKKwkJCXRlc3RDbGllbnQubTMoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Q2FuTTMoKSB7CisJCXRyeQorCQl7CisJCQlCb29sZWFuIGIgPSBudWxsOworCQkJdGVzdFNlcnZlci5jYW5fbTMoYik7CisJCQl0ZXN0Q2xpZW50LmNhbl9tMyhiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTQoKSB7CisJCXRyeQorCQl7CisJCQkKKwkJCXRlc3RTZXJ2ZXIubTQoKTsKKwkJCXRlc3RDbGllbnQubTQoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Q2FuTTQoKSB7CisJCXRyeQorCQl7CisJCQlCb29sZWFuIGIgPSBudWxsOworCQkJdGVzdFNlcnZlci5jYW5fbTQoYik7CisJCQl0ZXN0Q2xpZW50LmNhbl9tNChiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTUoKSB7CisJCXRyeQorCQl7CisJCQkKKwkJCXRlc3RTZXJ2ZXIubTUoKTsKKwkJCXRlc3RDbGllbnQubTUoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Q2FuTTUoKSB7CisJCXRyeQorCQl7CisJCQlCeXRlIGIgPSBudWxsOworCQkJdGVzdFNlcnZlci5jYW5fbTUoYik7CisJCQl0ZXN0Q2xpZW50LmNhbl9tNShiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTYoKSB7CisJCXRyeQorCQl7CisJCQkKKwkJCXRlc3RTZXJ2ZXIubTYoKTsKKwkJCXRlc3RDbGllbnQubTYoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Q2FuTTYoKSB7CisJCXRyeQorCQl7CisJCQlTaG9ydCBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuY2FuX202KGIpOworCQkJdGVzdENsaWVudC5jYW5fbTYoYik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE03KCkgeworCQl0cnkKKwkJeworCQkJCisJCQl0ZXN0U2VydmVyLm03KCk7CisJCQl0ZXN0Q2xpZW50Lm03KCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdENhbk03KCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuY2FuX203KGIpOworCQkJdGVzdENsaWVudC5jYW5fbTcoYik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE04KCkgeworCQl0cnkKKwkJeworCQkJCisJCQl0ZXN0U2VydmVyLm04KCk7CisJCQl0ZXN0Q2xpZW50Lm04KCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdENhbk04KCkgeworCQl0cnkKKwkJeworCQkJTG9uZyBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuY2FuX204KGIpOworCQkJdGVzdENsaWVudC5jYW5fbTgoYik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE05KCkgeworCQl0cnkKKwkJeworCQkJCisJCQl0ZXN0U2VydmVyLm02KCk7CisJCQl0ZXN0Q2xpZW50Lm02KCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdENhbk05KCkgeworCQl0cnkKKwkJeworCQkJRmxvYXQgYiA9IG51bGw7CisJCQl0ZXN0U2VydmVyLmNhbl9tOShiKTsKKwkJCXRlc3RDbGllbnQuY2FuX205KGIpOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RNMTAoKSB7CisJCXRyeQorCQl7CisJCQkKKwkJCXRlc3RTZXJ2ZXIubTEwKCk7CisJCQl0ZXN0Q2xpZW50Lm0xMCgpOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RDYW5NMTAoKSB7CisJCXRyeQorCQl7CisJCQlEb3VibGUgYiA9IG51bGw7CisJCQl0ZXN0U2VydmVyLmNhbl9tMTAoYik7CisJCQl0ZXN0Q2xpZW50LmNhbl9tMTAoYik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE0xMSgpIHsKKwkJdHJ5CisJCXsKKwkJCQorCQkJdGVzdFNlcnZlci5tMTEoKTsKKwkJCXRlc3RDbGllbnQubTExKCk7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdENhbk0xMSgpIHsKKwkJdHJ5CisJCXsKKwkJCVN0cmluZyBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuY2FuX20xMShiKTsKKwkJCXRlc3RDbGllbnQuY2FuX20xMShiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTEyKCkgeworCQl0cnkKKwkJeworCQkJCisJCQl0ZXN0U2VydmVyLm0xMigpOworCQkJdGVzdENsaWVudC5tMTIoKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Q2FuTTEyKCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuY2FuX20xMihiKTsKKwkJCXRlc3RDbGllbnQuY2FuX20xMihiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTEzKCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIubTEzKGIpOworCQkJdGVzdENsaWVudC5tMTMoYik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdENhbk0xMygpIHsKKwkJdHJ5CisJCXsKKwkJCUludGVnZXIgYiA9IG51bGw7CisJCQl0ZXN0U2VydmVyLmNhbl9tMTMoYik7CisJCQl0ZXN0Q2xpZW50LmNhbl9tMTMoYik7CisJCX0KKwkJY2F0Y2ggKCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCX0KKwkKKwkvKiogKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCAgdGVzdE0xNCgpIHsKKwkJdHJ5CisJCXsKKwkJCVMxIGIgPSBudWxsOworCQkJdGVzdFNlcnZlci5tMTQoYik7CisJCQl0ZXN0Q2xpZW50Lm0xNChiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0Q2FuTTE0KCkgeworCQl0cnkKKwkJeworCQkJSW50ZWdlciBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuY2FuX20xNChiKTsKKwkJCXRlc3RDbGllbnQuY2FuX20xNChiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCS8qKiAqLworCUBUZXN0IHB1YmxpYyB2b2lkICB0ZXN0TTE1KCkgeworCQl0cnkKKwkJeworCQkKKwkJCXRlc3RTZXJ2ZXIubTE1KCk7CisJCQl0ZXN0Q2xpZW50Lm0xNSgpOworCQl9CisJCWNhdGNoICggVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKwl9CisJCisJLyoqICovCisJQFRlc3QgcHVibGljIHZvaWQgIHRlc3RDYW5NMTUoKSB7CisJCXRyeQorCQl7CisJCQlFMSBiID0gbnVsbDsKKwkJCXRlc3RTZXJ2ZXIuY2FuX20xNShiKTsKKwkJCXRlc3RDbGllbnQuY2FuX20xNShiKTsKKwkJfQorCQljYXRjaCAoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisJfQorCQorCQorCQorCQorCQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdEluaGVyaXRhbmNlLmphdmEgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0SW5oZXJpdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM5Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdEluaGVyaXRhbmNlLmphdmEKQEAgLTAsMCArMSw1NzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuRTE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLkUyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5FMzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLlMyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMzsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBNYWluIGltcGxlbWVudGF0aW9uIGZvciBJbmhlcml0YW5jZUNsaWVudC4KKyAqLworcHVibGljIGNsYXNzIFRlc3RJbmhlcml0YW5jZQoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1haW5Jbmhlcml0YW5jZUxpc3RlbmVyLm1haW4oIG5ldyBTdHJpbmdbXSB7ICJ0Y3A6Ly8xMjcuMC4wLjE6MCIgfSApOworCQkKKwkJU3RyaW5nIHVyaSA9IE1haW5Jbmhlcml0YW5jZUxpc3RlbmVyLmxvY2FsVXJpOworCisJCXNlcnZlciA9IEluaGVyaXRhbmNlSGVscGVyLm5ld1NlcnZlciggdXJpLCBudWxsLAorCQkJbmV3IEluaGVyaXRhbmNlSGVscGVyLkluaGVyaXRhbmNlQ2xpZW50RmFjdG9yeSgpCisJCQl7CisJCQkJcHVibGljIEluaGVyaXRhbmNlQ2xpZW50IG5ld0luaGVyaXRhbmNlQ2xpZW50KAorCQkJCQlSZW1vdGVJbmhlcml0YW5jZVNlcnZlciBzZXJ2ZXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IEltcGxJbmhlcml0YW5jZUNsaWVudCggc2VydmVyICk7CisJCQkJfQorCQkJfSApOworCQkKKwkJc2VydmVyLl9zdGFydEFuZFdhaXRVcCggNDAwMCApOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBSZW1vdGVJbmhlcml0YW5jZVNlcnZlciBzZXJ2ZXI7CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0eXBlcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggdHJ1ZSwgUzEuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggUzEuY2xhc3MgKSApOworCQlhc3NlcnRFcXVhbHMoIHRydWUsIFMxLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIFMyLmNsYXNzICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0cnVlLCBTMS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBTMy5jbGFzcyApICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGZhbHNlLCBTMi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBTMS5jbGFzcyApICk7CisJCWFzc2VydEVxdWFscyggdHJ1ZSwgUzIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggUzIuY2xhc3MgKSApOworCQlhc3NlcnRFcXVhbHMoIHRydWUsIFMyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIFMzLmNsYXNzICkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggZmFsc2UsIFMzLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIFMxLmNsYXNzICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBmYWxzZSwgUzMuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggUzIuY2xhc3MgKSApOworCQlhc3NlcnRFcXVhbHMoIHRydWUsIFMzLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIFMzLmNsYXNzICkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggdHJ1ZSwgRTEuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggRTEuY2xhc3MgKSApOworCQlhc3NlcnRFcXVhbHMoIHRydWUsIEUxLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIEUyLmNsYXNzICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0cnVlLCBFMS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBFMy5jbGFzcyApICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIHRydWUsIEV4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBFMS5jbGFzcyApICk7CisJCWFzc2VydEVxdWFscyggdHJ1ZSwgRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIEUyLmNsYXNzICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0cnVlLCBFeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggRTMuY2xhc3MgKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBmYWxzZSwgRTIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggRTEuY2xhc3MgKSApOworCQlhc3NlcnRFcXVhbHMoIHRydWUsIEUyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIEUyLmNsYXNzICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0cnVlLCBFMi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBFMy5jbGFzcyApICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGZhbHNlLCBFMy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBFMS5jbGFzcyApICk7CisJCWFzc2VydEVxdWFscyggZmFsc2UsIEUzLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oIEUyLmNsYXNzICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0cnVlLCBFMy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCBFMy5jbGFzcyApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0X3MxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJY2hlY2tfczEoIG5ldyBTMSgpLCBudWxsLCBudWxsICk7CisJCQorCQljaGVja19zMSggbmV3IFMxKCBudWxsLCBudWxsICksIG51bGwsIG51bGwgKTsKKwkJCisJCWNoZWNrX3MxKCBuZXcgUzEoIDEsIDIgKSwgMSwgMiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdF9zMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWNoZWNrX3MyKCBuZXcgUzIoKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApOworCQkKKwkJY2hlY2tfczIoIG5ldyBTMiggbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApLCBudWxsLCBudWxsLCBudWxsLCBudWxsICk7CisJCQorCQljaGVja19zMiggbmV3IFMyKCAxLCAyLCAzLCA0ICksIDEsIDIsIDMsIDQgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RfczMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQljaGVja19zMyggbmV3IFMzKCksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKKwkJCisJCWNoZWNrX3MzKCBuZXcgUzMoIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKSwKKwkJCW51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKKwkJCisJCWNoZWNrX3MzKCBuZXcgUzMoIDEsIDIsIDMsIDQsIDUsIDYgKSwgMSwgMiwgMywgNCwgNSwgNiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdF9lMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWNoZWNrX2UxKCBuZXcgRTEoKSwgbnVsbCwgbnVsbCApOworCQkKKwkJY2hlY2tfZTEoIG5ldyBFMSggbnVsbCwgbnVsbCApLCBudWxsLCBudWxsICk7CisJCQorCQljaGVja19lMSggbmV3IEUxKCAxLCAyICksIDEsIDIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RfZTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQljaGVja19lMiggbmV3IEUyKCksIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKKwkJCisJCWNoZWNrX2UyKCBuZXcgRTIoIG51bGwsIG51bGwsIG51bGwsIG51bGwgKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApOworCQkKKwkJY2hlY2tfZTIoIG5ldyBFMiggMSwgMiwgMywgNCApLCAxLCAyLCAzLCA0ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0X2UzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJY2hlY2tfZTMoIG5ldyBFMygpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsICk7CisJCQorCQljaGVja19lMyggbmV3IEUzKCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsICksCisJCQludWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsICk7CisJCQorCQljaGVja19lMyggbmV3IEUzKCAxLCAyLCAzLCA0LCA1LCA2ICksIDEsIDIsIDMsIDQsIDUsIDYgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NpZ25fczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTMSB2ID0gbmV3IFMxKCAxLCAyICk7IGNoZWNrX3MxKCB2LCAxLCAyICk7CisJCQorCQl2LmEgPSBudWxsOyAgICAgICAgICAgIGNoZWNrX3MxKCB2LCBudWxsLCAyICk7CisJCXYuYSA9IDM7ICAgICAgICAgICAgICAgY2hlY2tfczEoIHYsIDMsIDIgKTsKKwkJdi5zZXRBKCBudWxsICk7ICAgICAgICBjaGVja19zMSggdiwgbnVsbCwgMiApOworCQl2LnNldEEoIDQgKTsgICAgICAgICAgIGNoZWNrX3MxKCB2LCA0LCAyICk7CisJCQorCQl2LmIgPSBudWxsOyAgICAgICAgICAgIGNoZWNrX3MxKCB2LCA0LCBudWxsICk7CisJCXYuYiA9IDU7ICAgICAgICAgICAgICAgY2hlY2tfczEoIHYsIDQsIDUgKTsKKwkJdi5zZXRCKCBudWxsICk7ICAgICAgICBjaGVja19zMSggdiwgNCwgbnVsbCApOworCQl2LnNldEIoIDYgKTsgICAgICAgICAgIGNoZWNrX3MxKCB2LCA0LCA2ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzaWduX3MyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUzIgdiA9IG5ldyBTMiggMSwgMiwgMywgNCApOyBjaGVja19zMiggdiwgMSwgMiwgMywgNCApOworCQkKKwkJdi5hID0gbnVsbDsgICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgbnVsbCwgMiwgMywgNCApOworCQl2LmEgPSA1OyAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA1LCAyLCAzLCA0ICk7CisJCXYuc2V0QSggbnVsbCApOyAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIG51bGwsIDIsIDMsIDQgKTsKKwkJdi5zZXRBKCA2ICk7ICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgNiwgMiwgMywgNCApOworCQkKKwkJdi5iID0gbnVsbDsgICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgNiwgbnVsbCwgMywgNCApOworCQl2LmIgPSA3OyAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA3LCAzLCA0ICk7CisJCXYuc2V0QiggbnVsbCApOyAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIG51bGwsIDMsIDQgKTsKKwkJdi5zZXRCKCA4ICk7ICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgNiwgOCwgMywgNCApOworCQkKKwkJdi5jID0gbnVsbDsgICAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgNiwgOCwgbnVsbCwgNCApOworCQl2LmMgPSA5OyAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA4LCA5LCA0ICk7CisJCXYuc2V0QyggbnVsbCApOyAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIG51bGwsIDQgKTsKKwkJdi5zZXRDKCAxMCApOyAgICAgICAgICAgICAgICBjaGVja19zMiggdiwgNiwgOCwgMTAsIDQgKTsKKwkJCisJCXYuZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIDEwLCBudWxsICk7CisJCXYuZCA9IDExOyAgICAgICAgICAgICAgICAgICAgY2hlY2tfczIoIHYsIDYsIDgsIDEwLCAxMSApOworCQl2LnNldEQoIG51bGwgKTsgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA4LCAxMCwgbnVsbCApOworCQl2LnNldEQoIDEyICk7ICAgICAgICAgICAgICAgIGNoZWNrX3MyKCB2LCA2LCA4LCAxMCwgMTIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NpZ25fczMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTMyB2ID0gbmV3IFMzKCAxLCAyLCAzLCA0LCA1LCA2ICk7IGNoZWNrX3MzKCB2LCAxLCAyLCAzLCA0LCA1LCA2ICk7CisJCQorCQl2LmEgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCBudWxsLCAyLCAzLCA0LCA1LCA2ICk7CisJCXYuYSA9IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDcsIDIsIDMsIDQsIDUsIDYgKTsKKwkJdi5zZXRBKCBudWxsICk7ICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgbnVsbCwgMiwgMywgNCwgNSwgNiApOworCQl2LnNldEEoIDggKTsgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAyLCAzLCA0LCA1LCA2ICk7CisJCQorCQl2LmIgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCBudWxsLCAzLCA0LCA1LCA2ICk7CisJCXYuYiA9IDk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDksIDMsIDQsIDUsIDYgKTsKKwkJdi5zZXRCKCBudWxsICk7ICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgbnVsbCwgMywgNCwgNSwgNiApOworCQl2LnNldEIoIDEwICk7ICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMywgNCwgNSwgNiApOworCQkKKwkJdi5jID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIG51bGwsIDQsIDUsIDYgKTsKKwkJdi5jID0gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDExLCA0LCA1LCA2ICk7CisJCXYuc2V0QyggbnVsbCApOyAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCBudWxsLCA0LCA1LCA2ICk7CisJCXYuc2V0QyggMTIgKTsgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgNCwgNSwgNiApOworCQkKKwkJdi5kID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCBudWxsLCA1LCA2ICk7CisJCXYuZCA9IDEzOyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTMsIDUsIDYgKTsKKwkJdi5zZXREKCBudWxsICk7ICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCBudWxsLCA1LCA2ICk7CisJCXYuc2V0RCggMTQgKTsgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIDUsIDYgKTsKKwkJCisJCXYuZSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIG51bGwsIDYgKTsKKwkJdi5lID0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCAxNCwgMTUsIDYgKTsKKwkJdi5zZXRFKCBudWxsICk7ICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCAxNCwgbnVsbCwgNiApOworCQl2LnNldEUoIDE2ICk7ICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3MzKCB2LCA4LCAxMCwgMTIsIDE0LCAxNiwgNiApOworCQkKKwkJdi5mID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCAxNCwgMTYsIG51bGwgKTsKKwkJdi5mID0gMTc7ICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zMyggdiwgOCwgMTAsIDEyLCAxNCwgMTYsIDE3ICk7CisJCXYuc2V0RiggbnVsbCApOyAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIDE2LCBudWxsICk7CisJCXYuc2V0RiggMTggKTsgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfczMoIHYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRvc3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJIlMxKGE9MTsgYj0yKSIsCisJCQluZXcgUzEoIDEsIDIgKS50b1N0cmluZygpICk7CisJCQorCQlhc3NlcnRFcXVhbHMoCisJCQkiUzIoUzEoYT0xOyBiPTIpOyBjPTM7IGQ9NCkiLAorCQkJbmV3IFMyKCAxLCAyLCAzLCA0ICkudG9TdHJpbmcoKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKAorCQkJIlMzKFMyKFMxKGE9MTsgYj0yKTsgYz0zOyBkPTQpOyBlPTU7IGY9NikiLAorCQkJbmV3IFMzKCAxLCAyLCAzLCA0LCA1LCA2ICkudG9TdHJpbmcoKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZSRFMTogYT0xOyBiPTIiLAorCQkJbmV3IEUxKCAxLCAyICkudG9TdHJpbmcoKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZSRFMjogYT0xOyBiPTI7IGM9MzsgZD00IiwKKwkJCW5ldyBFMiggMSwgMiwgMywgNCApLnRvU3RyaW5nKCkgKTsKKwkJCisJCWFzc2VydEVxdWFscygKKwkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UkRTM6IGE9MTsgYj0yOyBjPTM7IGQ9NDsgZT01OyBmPTYiLAorCQkJbmV3IEUzKCAxLCAyLCAzLCA0LCA1LCA2ICkudG9TdHJpbmcoKSApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja19zMSggUzEgdiwgSW50ZWdlciBhLCBJbnRlZ2VyIGIgKQorCXsKKwkJYXNzZXJ0RXF1YWxzKCBhLCB2LmEgKTsKKwkJYXNzZXJ0RXF1YWxzKCBhLCB2LmdldEEoKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBiLCB2LmIgKTsKKwkJYXNzZXJ0RXF1YWxzKCBiLCB2LmdldEIoKSApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja19zMiggUzIgdiwgSW50ZWdlciBhLCBJbnRlZ2VyIGIsIEludGVnZXIgYywgSW50ZWdlciBkICkKKwl7CisJCWNoZWNrX3MxKCB2LCBhLCBiICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGMsIHYuYyApOworCQlhc3NlcnRFcXVhbHMoIGMsIHYuZ2V0QygpICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGQsIHYuZCApOworCQlhc3NlcnRFcXVhbHMoIGQsIHYuZ2V0RCgpICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrX3MzKCBTMyB2LCBJbnRlZ2VyIGEsIEludGVnZXIgYiwgSW50ZWdlciBjLCBJbnRlZ2VyIGQsCisJCUludGVnZXIgZSwgSW50ZWdlciBmICkKKwl7CisJCWNoZWNrX3MyKCB2LCBhLCBiLCBjLCBkICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGUsIHYuZSApOworCQlhc3NlcnRFcXVhbHMoIGUsIHYuZ2V0RSgpICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGYsIHYuZiApOworCQlhc3NlcnRFcXVhbHMoIGYsIHYuZ2V0RigpICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrX2UxKCBFMSB2LCBJbnRlZ2VyIGEsIEludGVnZXIgYiApCisJeworCQlhc3NlcnRFcXVhbHMoIGEsIHYuYSApOworCQlhc3NlcnRFcXVhbHMoIGEsIHYuZ2V0QSgpICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIGIsIHYuYiApOworCQlhc3NlcnRFcXVhbHMoIGIsIHYuZ2V0QigpICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrX2UyKCBFMiB2LCBJbnRlZ2VyIGEsIEludGVnZXIgYiwgSW50ZWdlciBjLCBJbnRlZ2VyIGQgKQorCXsKKwkJY2hlY2tfZTEoIHYsIGEsIGIgKTsKKwkJCisJCWFzc2VydEVxdWFscyggYywgdi5jICk7CisJCWFzc2VydEVxdWFscyggYywgdi5nZXRDKCkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggZCwgdi5kICk7CisJCWFzc2VydEVxdWFscyggZCwgdi5nZXREKCkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tfZTMoIEUzIHYsIEludGVnZXIgYSwgSW50ZWdlciBiLCBJbnRlZ2VyIGMsIEludGVnZXIgZCwKKwkJSW50ZWdlciBlLCBJbnRlZ2VyIGYgKQorCXsKKwkJY2hlY2tfZTIoIHYsIGEsIGIsIGMsIGQgKTsKKwkJCisJCWFzc2VydEVxdWFscyggZSwgdi5lICk7CisJCWFzc2VydEVxdWFscyggZSwgdi5nZXRFKCkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggZiwgdi5mICk7CisJCWFzc2VydEVxdWFscyggZiwgdi5nZXRGKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkb19zMSggbmV3IFMxKCAxLCAyICksIG5ldyBTMUNvbXBhcmUoKSApOworCQlkb19zMSggbmV3IFMxKCA5LCA4ICksIG5ldyBTMUNvbXBhcmUoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdF9zMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWRvX3MyKCBuZXcgUzIoIDEsIDIsIDMsIDQgKSwgbmV3IFMyQ29tcGFyZSgpICk7CisJCWRvX3MyKCBuZXcgUzIoIDksIDgsIDcsIDYgKSwgbmV3IFMyQ29tcGFyZSgpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X3MzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZG9fczMoIG5ldyBTMyggMSwgMiwgMywgNCwgNSwgNiApLCBuZXcgUzNDb21wYXJlKCkgKTsKKwkJZG9fczMoIG5ldyBTMyggOSwgOCwgNywgNiwgNSwgNCApLCBuZXcgUzNDb21wYXJlKCkgKTsKKwl9CisJCisJcHJpdmF0ZSBpbnRlcmZhY2UgQ29tcGFyZTxUPgorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBhCisJCSAqIEBwYXJhbSBiCisJCSAqLworCQlwdWJsaWMgdm9pZCBjb21wYXJlKCBUIGEsIFQgYiApOworCX0KKwkKKwkvKioKKwkgKiBDbGFzcyB0byBjb21wYXJlIG9uZSBTMSB0byBhbm90aGVyLgorCSAqLworCXN0YXRpYyBjbGFzcyBTMUNvbXBhcmUgaW1wbGVtZW50cyBDb21wYXJlPFMxPgorCXsKKwkJcHVibGljIHZvaWQgY29tcGFyZSggUzEgYSwgUzEgYiApCisJCXsKKwkJCWFzc2VydEVxdWFscyggUzEuY2xhc3MsIGEuZ2V0Q2xhc3MoKSApOworCQkJYXNzZXJ0RXF1YWxzKCBTMS5jbGFzcywgYi5nZXRDbGFzcygpICk7CisJCQlhc3NlcnRFcXVhbHMoIGEuYSwgYi5hICk7CisJCQlhc3NlcnRFcXVhbHMoIGEuYiwgYi5iICk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ2xhc3MgdG8gY29tcGFyZSBvbmUgUzIgdG8gYW5vdGhlci4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgUzJDb21wYXJlIGltcGxlbWVudHMgQ29tcGFyZTxTMj4KKwl7CisJCXB1YmxpYyB2b2lkIGNvbXBhcmUoIFMyIGEsIFMyIGIgKQorCQl7CisJCQlhc3NlcnRFcXVhbHMoIFMyLmNsYXNzLCBhLmdldENsYXNzKCkgKTsKKwkJCWFzc2VydEVxdWFscyggUzIuY2xhc3MsIGIuZ2V0Q2xhc3MoKSApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmEsIGIuYSApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmIsIGIuYiApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmMsIGIuYyApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmQsIGIuZCApOworCQl9CisJfQorCisJLyoqCisJICogQ2xhc3MgdG8gY29tcGFyZSBvbmUgUzMgdG8gYW5vdGhlci4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgUzNDb21wYXJlIGltcGxlbWVudHMgQ29tcGFyZTxTMz4KKwl7CisJCXB1YmxpYyB2b2lkIGNvbXBhcmUoIFMzIGEsIFMzIGIgKQorCQl7CisJCQlhc3NlcnRFcXVhbHMoIFMzLmNsYXNzLCBhLmdldENsYXNzKCkgKTsKKwkJCWFzc2VydEVxdWFscyggUzMuY2xhc3MsIGIuZ2V0Q2xhc3MoKSApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmEsIGIuYSApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmIsIGIuYiApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmMsIGIuYyApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmQsIGIuZCApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmUsIGIuZSApOworCQkJYXNzZXJ0RXF1YWxzKCBhLmYsIGIuZiApOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIEFPYmplY3RDb21wYXJlIGltcGxlbWVudHMgQ29tcGFyZTxPYmplY3RbXT4KKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gY21wCisJCSAqLworCQlwdWJsaWMgQU9iamVjdENvbXBhcmUoIENvbXBhcmU8T2JqZWN0PiBjbXAgKQorCQl7CisJCQl0aGlzLmNtcCA9IGNtcDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBDb21wYXJlPE9iamVjdD4gY21wOworCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlwdWJsaWMgdm9pZCBjb21wYXJlKCBPYmplY3RbXSBhLCBPYmplY3RbXSBiICkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKCBhLmxlbmd0aCwgYi5sZW5ndGggKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykKKwkJCQljbXAuY29tcGFyZSggYVtpXSwgYltpXSApOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIEFTMUNvbXBhcmUgaW1wbGVtZW50cyBDb21wYXJlPFMxW10+CisJeworCQkvKioKKwkJICogQHBhcmFtIGNtcAorCQkgKi8KKwkJcHVibGljIEFTMUNvbXBhcmUoIENvbXBhcmU8UzE+IGNtcCApCisJCXsKKwkJCXRoaXMuY21wID0gY21wOworCQl9CisJCQorCQlwcml2YXRlIGZpbmFsIENvbXBhcmU8UzE+IGNtcDsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJcHVibGljIHZvaWQgY29tcGFyZSggUzFbXSBhLCBTMVtdIGIgKQorCQl7CisJCQlhc3NlcnRFcXVhbHMoIGEubGVuZ3RoLCBiLmxlbmd0aCApOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQorCQkJCWNtcC5jb21wYXJlKCBhW2ldLCBiW2ldICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQVMyQ29tcGFyZSBpbXBsZW1lbnRzIENvbXBhcmU8UzJbXT4KKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gY21wCisJCSAqLworCQlwdWJsaWMgQVMyQ29tcGFyZSggQ29tcGFyZTxTMj4gY21wICkKKwkJeworCQkJdGhpcy5jbXAgPSBjbXA7CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgQ29tcGFyZTxTMj4gY21wOworCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlwdWJsaWMgdm9pZCBjb21wYXJlKCBTMltdIGEsIFMyW10gYiApCisJCXsKKwkJCWFzc2VydEVxdWFscyggYS5sZW5ndGgsIGIubGVuZ3RoICk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspCisJCQkJY21wLmNvbXBhcmUoIGFbaV0sIGJbaV0gKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBBUzNDb21wYXJlIGltcGxlbWVudHMgQ29tcGFyZTxTM1tdPgorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBjbXAKKwkJICovCisJCXB1YmxpYyBBUzNDb21wYXJlKCBDb21wYXJlPFMzPiBjbXAgKQorCQl7CisJCQl0aGlzLmNtcCA9IGNtcDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBDb21wYXJlPFMzPiBjbXA7CisKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCXB1YmxpYyB2b2lkIGNvbXBhcmUoIFMzW10gYSwgUzNbXSBiICkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKCBhLmxlbmd0aCwgYi5sZW5ndGggKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykKKwkJCQljbXAuY29tcGFyZSggYVtpXSwgYltpXSApOworCQl9CisJfQorCisJLy8vLy8vLy8vLy8vLworCS8vIEhFTFBFUlMgLy8KKwkvLy8vLy8vLy8vLy8vCisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSB2b2lkIGRvX29iaiggT2JqZWN0IHYsIENvbXBhcmUgY21wICkKKwl7CisJCS8vIHRlc3QgYW4gb2JqZWN0IGJvdGggYnkgaXRzZWxmIGFuZCBhcyBhbiBhcnJheS4KKwkJCisJCWNtcC5jb21wYXJlKCB2LCBzZXJ2ZXIuZjEoIHYgKSApOworCQkKKwkJT2JqZWN0W10gYSA9IHsgdiB9OworCQlDb21wYXJlIGFjbXAgPSBuZXcgQU9iamVjdENvbXBhcmUoIGNtcCApOworCQkKKwkJYWNtcC5jb21wYXJlKCBhLCBzZXJ2ZXIuZjUoIGEgKSApOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgdm9pZCBkb19zMSggUzEgdiwgQ29tcGFyZSBjbXAgKQorCXsKKwkJLy8gdGVzdCBhbiBTMSBib3RoIGJ5IGl0c2VsZiBhbmQgYXMgYW4gYXJyYXkuCisJCS8vIGFsc28gdGVzdCBlYWNoIG9mIHRob3NlIGFzIGFuIG9iamVjdC4KKwkJCisJCWNtcC5jb21wYXJlKCB2LCBzZXJ2ZXIuZjIoIHYgKSApOworCQlkb19vYmooIHYsIGNtcCApOworCQkKKwkJUzFbXSBhID0geyB2IH07CisJCUNvbXBhcmUgYWNtcCA9IG5ldyBBUzFDb21wYXJlKCBjbXAgKTsKKworCQlhY21wLmNvbXBhcmUoIGEsIHNlcnZlci5mNiggYSApICk7CisJCWRvX29iaiggYSwgYWNtcCApOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgdm9pZCBkb19zMiggUzIgdiwgQ29tcGFyZSBjbXAgKQorCXsKKwkJLy8gdGVzdCBhbiBTMiBib3RoIGJ5IGl0c2VsZiBhbmQgYXMgYW4gYXJyYXkuCisJCS8vIGFsc28gdGVzdCB0aGUgUzIgYXMgYW4gUzEsIGFuZCB0aGUgUzIgYXJyYXkKKwkJLy8gYXMgYW4gb2JqZWN0LgorCQkKKwkJY21wLmNvbXBhcmUoIHYsIHNlcnZlci5mMyggdiApICk7CisJCWRvX3MxKCB2LCBjbXAgKTsKKwkJCisJCVMyW10gYSA9IHsgdiB9OworCQlDb21wYXJlIGFjbXAgPSBuZXcgQVMyQ29tcGFyZSggY21wICk7CisKKwkJYWNtcC5jb21wYXJlKCBhLCBzZXJ2ZXIuZjcoIGEgKSApOworCQlkb19vYmooIGEsIGFjbXAgKTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIHZvaWQgZG9fczMoIFMzIHYsIENvbXBhcmUgY21wICkKKwl7CisJCS8vIHRlc3QgYW4gUzMgYm90aCBieSBpdHNlbGYgYW5kIGFzIGFuIGFycmF5LgorCQkvLyBhbHNvIHRlc3QgdGhlIFMzIGFzIGFuIFMyLCBhbmQgdGhlIFMzIGFycmF5CisJCS8vIGFzIGFuIG9iamVjdC4KKwkJCisJCWNtcC5jb21wYXJlKCB2LCBzZXJ2ZXIuZjQoIHYgKSApOworCQlkb19zMiggdiwgY21wICk7CisJCQorCQlTM1tdIGEgPSB7IHYgfTsKKwkJQ29tcGFyZSBhY21wID0gbmV3IEFTM0NvbXBhcmUoIGNtcCApOworCisJCWFjbXAuY29tcGFyZSggYSwgc2VydmVyLmY4KCBhICkgKTsKKwkJZG9fb2JqKCBhLCBhY21wICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmluaSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKKwkJCXNlcnZlci5fc3RvcEFuZFdhaXREb3duKCA0MDAwICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdEluaGVyaXRhbmNlWG1sLmphdmEgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0SW5oZXJpdGFuY2VYbWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQwODU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdEluaGVyaXRhbmNlWG1sLmphdmEKQEAgLTAsMCArMSw5ODEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8qKiAqLworcHVibGljIGNsYXNzIFRlc3RJbmhlcml0YW5jZVhtbAoreworCisJRG9jdW1lbnQgZG9jdW1lbnQ7CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTG9hZCBUZXN0LnhtbCBpbnRvIERPTQorCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKwkJLy9TdHJpbmcgdXNlckRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKwkJdHJ5CisJCXsKKwkJCUZpbGUgZiA9IG5ldyBGaWxlKCJ0ZXN0cy90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL3htbC9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvSW5oZXJpdGFuY2UueG1sIik7CisJCQlkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoZik7CisJCX0KKwkJY2F0Y2goRXhjZXB0aW9uIGUpCisJCXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgVGVzdC54bWwgZG9jdW1lbnQ6ICIgKyBlKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3VycmVudCBkaXIgaXMgIituZXcgRmlsZSgiLiIgKS5nZXRBYnNvbHV0ZVBhdGgoKSApOworCQkJYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKKwkJfQorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBBZnRlcgorCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHVubG9hZCBUZXN0LnhtbCAKKwkJZG9jdW1lbnQgPSBudWxsOworCX0KKworCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdE1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibW9kdWxlIik7CisJCQorCQlhc3NlcnRFcXVhbHMobGlzdC5nZXRMZW5ndGgoKSwgMSk7CisJCQorCQlTdHJpbmcgbW9kdWxlTmFtZSA9IGxpc3QuaXRlbSgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhtb2R1bGVOYW1lLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzIik7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobGlzdC5pdGVtKDApLCBuZXcgU3RyaW5nW10geyJuYW1lIn0pKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShsaXN0Lml0ZW0oMCksIG5ldyBTdHJpbmdbXSB7ImRlc2NyaXB0aW9uIiwgInNlcnZpY2UifSkpOworCQkKKwkJTm9kZSBjaGlsZCA9IGdldERlc2NyaXB0aW9uRWxlbWVudChsaXN0Lml0ZW0oMCkpOworCQlhc3NlcnROdWxsKGNoaWxkKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlcnZpY2UiKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCAxKTsKKwkJCisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGxpc3QuaXRlbSgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhzZXJ2aWNlTmFtZSwgIkluaGVyaXRhbmNlIik7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobGlzdC5pdGVtKDApLCBuZXcgU3RyaW5nW10geyJuYW1lIn0pKTsKKwkJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUobGlzdC5pdGVtKDApLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiIsICJjb25zdHMiLCAiZXh0ZXJucyIsICJlbnVtcyIsICJzdHJ1Y3RzIiwgImV4Y2VwdGlvbnMiLCAibWV0aG9kcyJ9KSk7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KGxpc3QuaXRlbSgwKSk7CisJCWFzc2VydE51bGwoY2hpbGQpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdmVyaWZ5IGNvbnN0cworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvbnN0Iik7CisJCQorCQkvLyBubyBjb25zdHMKKwkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0TGVuZ3RoKCksIDApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJucygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHZlcmlmeSBjb25zdHMKKwkJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJleHRlcm4iKTsKKwkJCisJCS8vIG5vIGV4dGVybnMKKwkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0TGVuZ3RoKCksIDApOworCQkKKwl9CisJCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFbnVtcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHZlcmlmeSBlbnVtcworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVudW0iKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCAwKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdFN0cnVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgc3RydWN0cworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0cnVjdCIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0TGVuZ3RoKCksIDMpOworCQkKKwkJaW50IG5vZGVDb3VudCA9IDA7CisJCQorCQlOb2RlIHN0cnVjdE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tTdHJ1Y3RQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJTMSIsICItMTA1NDc4Nzg4MCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzEiLCAKKwkJCQkibnVsbCIsICJTMSBkZXNjci4iKTsKKwkJY2hlY2tTdHJ1Y3RWYWx1ZVByb3BlcnRpZXMoc3RydWN0Tm9kZSwgImEiLCAiMzUyOTg4MzE2IiwgImEiLCAiaW50IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCAiYmxhaCBhYm91dCBhLiIpOworCQljaGVja1N0cnVjdFZhbHVlUHJvcGVydGllcyhzdHJ1Y3ROb2RlLCAiYiIsICIzNTI5ODgzMTciLCAiYiIsICJpbnQiLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsICJibGFoIGFib3V0IGIuIik7CisJCQorCQlzdHJ1Y3ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrU3RydWN0UHJvcGVydGllcyhzdHJ1Y3ROb2RlLCAiUzIiLCAiLTEwNTQ3ODc4NzkiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLlMyIiwgCisJCQkib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLlMxIiwgIlMyIGRlc2NyLiIpOworCQljaGVja1N0cnVjdFZhbHVlUHJvcGVydGllcyhzdHJ1Y3ROb2RlLCAiYyIsICIzNTI5ODgzMTgiLCAiYyIsICJpbnQiLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsICJibGFoIGFib3V0IGMuIik7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJkIiwgIjM1Mjk4ODMxOSIsICJkIiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgZC4iKTsKKwkJCisJCXN0cnVjdE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tTdHJ1Y3RQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJTMyIsICItMTA1NDc4Nzg3OCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzMiLCAKKwkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzIiLCAiUzMgZGVzY3IuIik7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJlIiwgIjM1Mjk4ODMyMCIsICJlIiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgZS4iKTsKKwkJY2hlY2tTdHJ1Y3RWYWx1ZVByb3BlcnRpZXMoc3RydWN0Tm9kZSwgImYiLCAiMzUyOTg4MzIxIiwgImYiLCAiaW50IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCAiYmxhaCBhYm91dCBmLiIpOworCQkKKwl9CisJCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRleHRFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKy8vCQkgdmVyaWZ5IHN0cnVjdHMKKwkJTm9kZUxpc3QgZXhjZXB0aW9uc05vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImV4Y2VwdGlvbnMiKTsKKwkJCisJCWFzc2VydEVxdWFscyhleGNlcHRpb25zTm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDEpOworCQkKKwkJTm9kZSBleGNlcHRpb25zTm9kZSA9IGV4Y2VwdGlvbnNOb2RlTGlzdC5pdGVtKDApOworCQkKKwkJQXJyYXlMaXN0PE5vZGU+bGlzdCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKwkJCQorCQlOb2RlTGlzdCBleGNlcHRpb25zTm9kZUNoaWxkcmVuID0gZXhjZXB0aW9uc05vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uc05vZGVDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlpZihleGNlcHRpb25zTm9kZUNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSA9PSAiZXhjZXB0aW9uIikKKwkJCXsKKwkJCQlsaXN0LmFkZChleGNlcHRpb25zTm9kZUNoaWxkcmVuLml0ZW0oaSkpOworCQkJfQorCQl9CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpLCAzKTsKKwkJCisJCWludCBub2RlQ291bnQgPSAwOworCQkKKwkJTm9kZSBleGNlcHRpb25Ob2RlID0gbGlzdC5nZXQobm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tFeGNlcHRpb25Qcm9wZXJ0aWVzKGV4Y2VwdGlvbk5vZGUsICJFMSIsICJmYWxzZSIsICItMTA1NTcwNjI2NiIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuRTEiLCAKKwkJCQkibnVsbCIsICJFMSBkZXNjci4iKTsKKwkJY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgImEiLCAiMzUyOTg4MzE2IiwgImEiLCAiaW50IiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgYS4iKTsKKwkJY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgImIiLCAiMzUyOTg4MzE3IiwgImIiLCAiaW50IiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgYi4iKTsKKwkJCisJCWV4Y2VwdGlvbk5vZGUgPSBsaXN0LmdldChub2RlQ291bnQrKyk7CisJCQorCQljaGVja0V4Y2VwdGlvblByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgIkUyIiwgImZhbHNlIiwgIi0xMDU1NzA2MjY1IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5FMiIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5FMSIsICJFMiBkZXNjci4iKTsKKwkJY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgImMiLCAiMzUyOTg4MzE4IiwgImMiLCAiaW50IiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgYy4iKTsKKwkJY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgImQiLCAiMzUyOTg4MzE5IiwgImQiLCAiaW50IiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgZC4iKTsKKwkJCisJCWV4Y2VwdGlvbk5vZGUgPSBsaXN0LmdldChub2RlQ291bnQrKyk7CisJCQorCQljaGVja0V4Y2VwdGlvblByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgIkUzIiwgImZhbHNlIiwgIi0xMDU1NzA2MjY0IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5FMyIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5FMiIsICJFMyBkZXNjci4iKTsKKwkJY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgImUiLCAiMzUyOTg4MzIwIiwgImUiLCAiaW50IiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgZS4iKTsKKwkJY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgImYiLCAiMzUyOTg4MzIxIiwgImYiLCAiaW50IiwgImZhbHNlIiwgbnVsbCwgImJsYWggYWJvdXQgZi4iKTsKKwkJCisJCQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisKKwkJLy8gdmVyaWZ5IG1ldGhvZHMKKwkJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRob2QiKTsKKwkJCisJCWFzc2VydEVxdWFscygxNiwgbGlzdC5nZXRMZW5ndGgoKSk7CisJCQorCQlpbnQgbm9kZUNvdW50ID0gMDsKKwkJCisJCU5vZGUgbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImYxIiwgIi0xMDUzNTQxNDk5IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5mMSIsIAorCQkJCSJub25lIiwgImZhbHNlIiwgInNlcnZlciIsIG51bGwsICJCbGFoIGFib3V0IGYxLiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInYiLCAiMzUyOTg4MzM3IiwgInYiLCAib2JqZWN0IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCAiYSB2YWx1ZS4iKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjEzMDk3NDM5NDQiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLl9yZXN1bHRfZjEiLCAKKwkJCQkib2JqZWN0IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCAidGhlIHNhbWUgdmFsdWUuIik7CisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfZjEiLCAiMTMwOTc0Mzk0NCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuX3Jlc3VsdF9mMSIsIAorCQkJCSJub25lIiwgInRydWUiLCAiY2xpZW50IiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsIAorCQkJCSJvYmplY3QiLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImYyIiwgIi0xMDUzNTQxNDk4IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5mMiIsIAorCQkJCSJub25lIiwgImZhbHNlIiwgInNlcnZlciIsIG51bGwsICJCbGFoIGFib3V0IGYyLiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInYiLCAiMzUyOTg4MzM3IiwgInYiLCAKKwkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzEiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCAiYSB2YWx1ZS4iKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjEzMDk3NDM5NDUiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLl9yZXN1bHRfZjIiLCAKKwkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzEiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCAidGhlIHNhbWUgdmFsdWUuIik7CisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfZjIiLCAiMTMwOTc0Mzk0NSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuX3Jlc3VsdF9mMiIsIAorCQkJCSJub25lIiwgInRydWUiLCAiY2xpZW50IiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMSIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImYzIiwgIi0xMDUzNTQxNDk3IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5mMyIsIAorCQkJCSJub25lIiwgImZhbHNlIiwgInNlcnZlciIsIG51bGwsICJCbGFoIGFib3V0IGYzLiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInYiLCAiMzUyOTg4MzM3IiwgInYiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLlMyIiwgCisJCQkJImZhbHNlIiwgImZhbHNlIiwgbnVsbCwgImEgdmFsdWUuIik7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICIxMzA5NzQzOTQ2IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5fcmVzdWx0X2YzIiwgCisJCQkib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLlMyIiwgImZhbHNlIiwgImZhbHNlIiwgbnVsbCwgInRoZSBzYW1lIHZhbHVlLiIpOworCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJfcmVzdWx0X2YzIiwgIjEzMDk3NDM5NDYiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLl9yZXN1bHRfZjMiLCAKKwkJCQkibm9uZSIsICJ0cnVlIiwgImNsaWVudCIsICIwIiwgbnVsbCwgInJlc3VsdCIpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInJlc3VsdCIsICItMjEzMDM3OTMyNiIsICJyZXN1bHQiLCAKKwkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzIiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJmNCIsICItMTA1MzU0MTQ5NiIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuZjQiLCAKKwkJCQkibm9uZSIsICJmYWxzZSIsICJzZXJ2ZXIiLCBudWxsLCAiQmxhaCBhYm91dCBmNC4iLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJ2IiwgIjM1Mjk4ODMzNyIsICJ2IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMyIsIAorCQkJCSJmYWxzZSIsICJmYWxzZSIsIG51bGwsICJhIHZhbHVlLiIpOworCQljaGVja1Jlc3VsdChtZXRob2ROb2RlLCAiMTMwOTc0Mzk0NyIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuX3Jlc3VsdF9mNCIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMyIsICJmYWxzZSIsICAiZmFsc2UiLCBudWxsLCAidGhlIHNhbWUgdmFsdWUuIik7CisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfZjQiLCAiMTMwOTc0Mzk0NyIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuX3Jlc3VsdF9mNCIsIAorCQkJCSJub25lIiwgInRydWUiLCAiY2xpZW50IiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMyIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImY1IiwgIi0xMDUzNTQxNDk1IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5mNSIsIAorCQkJCSJub25lIiwgImZhbHNlIiwgInNlcnZlciIsIG51bGwsICJCbGFoIGFib3V0IGY1LiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInYiLCAiMzUyOTg4MzM3IiwgInYiLCAib2JqZWN0IiwgInRydWUiLCAidHJ1ZSIsICIxIiwgImEgdmFsdWUuIik7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICIxMzA5NzQzOTQ4IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5fcmVzdWx0X2Y1IiwgCisJCQkJIm9iamVjdCIsICJ0cnVlIiwgInRydWUiLCAiMSIsICJ0aGUgc2FtZSB2YWx1ZS4iKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9mNSIsICIxMzA5NzQzOTQ4IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5fcmVzdWx0X2Y1IiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJjbGllbnQiLCAiMCIsIG51bGwsICJyZXN1bHQiKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJyZXN1bHQiLCAiLTIxMzAzNzkzMjYiLCAicmVzdWx0IiwgCisJCQkJIm9iamVjdCIsICJ0cnVlIiwgInRydWUiLCAiMSIsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImY2IiwgIi0xMDUzNTQxNDk0IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5mNiIsIAorCQkJCSJub25lIiwgImZhbHNlIiwgInNlcnZlciIsIG51bGwsICJCbGFoIGFib3V0IGY2LiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInYiLCAiMzUyOTg4MzM3IiwgInYiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLlMxIiwgCisJCQkJImZhbHNlIiwgInRydWUiLCAiMSIsICJhIHZhbHVlLiIpOworCQljaGVja1Jlc3VsdChtZXRob2ROb2RlLCAiMTMwOTc0Mzk0OSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuX3Jlc3VsdF9mNiIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMSIsICJmYWxzZSIsICAidHJ1ZSIsICIxIiwgInRoZSBzYW1lIHZhbHVlLiIpOworCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJfcmVzdWx0X2Y2IiwgIjEzMDk3NDM5NDkiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLl9yZXN1bHRfZjYiLCAKKwkJCQkibm9uZSIsICJ0cnVlIiwgImNsaWVudCIsICIwIiwgbnVsbCwgInJlc3VsdCIpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInJlc3VsdCIsICItMjEzMDM3OTMyNiIsICJyZXN1bHQiLCAKKwkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzEiLCAiZmFsc2UiLCAidHJ1ZSIsICIxIiwgbnVsbCk7CisJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiZjciLCAiLTEwNTM1NDE0OTMiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLmY3IiwgCisJCQkJIm5vbmUiLCAiZmFsc2UiLCAic2VydmVyIiwgbnVsbCwgIkJsYWggYWJvdXQgZjcuIiwgbnVsbCk7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAidiIsICIzNTI5ODgzMzciLCAidiIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzIiLCAKKwkJCQkiZmFsc2UiLCAidHJ1ZSIsICIxIiwgImEgdmFsdWUuIik7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICIxMzA5NzQzOTUwIiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5fcmVzdWx0X2Y3IiwgCisJCQkib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLlMyIiwgImZhbHNlIiwgICJ0cnVlIiwgIjEiLCAidGhlIHNhbWUgdmFsdWUuIik7CisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfZjciLCAiMTMwOTc0Mzk1MCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuX3Jlc3VsdF9mNyIsIAorCQkJCSJub25lIiwgInRydWUiLCAiY2xpZW50IiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMiIsICJmYWxzZSIsICJ0cnVlIiwgIjEiLCBudWxsKTsKKwkJCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJmOCIsICItMTA1MzU0MTQ5MiIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuZjgiLCAKKwkJCQkibm9uZSIsICJmYWxzZSIsICJzZXJ2ZXIiLCBudWxsLCAiQmxhaCBhYm91dCBmOC4iLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJ2IiwgIjM1Mjk4ODMzNyIsICJ2IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMyIsIAorCQkJCSJmYWxzZSIsICJ0cnVlIiwgIjEiLCAiYSB2YWx1ZS4iKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjEzMDk3NDM5NTEiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkluaGVyaXRhbmNlLl9yZXN1bHRfZjgiLCAKKwkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuUzMiLCAiZmFsc2UiLCAgInRydWUiLCAiMSIsICJ0aGUgc2FtZSB2YWx1ZS4iKTsKKwkJCisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfZjgiLCAiMTMwOTc0Mzk1MSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuSW5oZXJpdGFuY2UuX3Jlc3VsdF9mOCIsIAorCQkJCSJub25lIiwgInRydWUiLCAiY2xpZW50IiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsIAorCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Jbmhlcml0YW5jZS5TMyIsICJmYWxzZSIsICJ0cnVlIiwgIjEiLCBudWxsKTsgCisJCQorCQkKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrU3RydWN0UHJvcGVydGllcyhOb2RlIHN0cnVjdE5vZGUsIFN0cmluZyBzdHJ1Y3ROYW1lLCBTdHJpbmcgc3RydWN0VHlwZUlkLCAKKwkJCVN0cmluZyBzdHJ1Y3RUeXBlTmFtZSwgU3RyaW5nIGJhc2VUeXBlTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gc3RydWN0Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUoc3RydWN0Tm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJ0eXBlSWQiLCAidHlwZU5hbWUiLCAiYmFzZVR5cGUifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShzdHJ1Y3ROb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiIsICJmaWVsZCJ9KSk7CisKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IHN0dWZmIGhhcyBzbnVjayBpbnRvIHRoZSBYTUwgYmluZGluZworCQlhc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIDQpOworCQkKKwkJU3RyaW5nIG5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZUlkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVOYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBiYXNlVHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImJhc2VUeXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkvLyB2ZXJpZnkgbmFtZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIHN0cnVjdE5hbWUpOworCQkKKwkJLy8gdmVyaWZ5IHR5cGUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKHR5cGVBdHRyLCBzdHJ1Y3RUeXBlSWQpOworCQkKKwkJLy8gdmVyaWZ5IHZhbHVlIG9mIGNvbnN0YW50CisJCWFzc2VydEVxdWFscyh2YWx1ZUF0dHIsIHN0cnVjdFR5cGVOYW1lKTsKKwkJCisJCWFzc2VydEVxdWFscyhiYXNlVHlwZUF0dHIsIGJhc2VUeXBlTmFtZSk7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KHN0cnVjdE5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKE5vZGUgc3RydWN0Tm9kZSwgU3RyaW5nIHN0cnVjdE5hbWUsIFN0cmluZyBmaWVsZElkLCBTdHJpbmcgZmllbGROYW1lLCAKKwkJU3RyaW5nIHR5cGUsIFN0cmluZyBpc1ByaW1pdGl2ZVR5cGUsIFN0cmluZyBpc0FycmF5LCBTdHJpbmcgZGltZW5zaW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pCisJeworCQlOb2RlIGZpZWxkTm9kZSA9IG51bGw7CisJCQorCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHN0cnVjdE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJaWYoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSA9PSAiZmllbGQiKQorCQkJeworCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRoaXNOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlOb2RlIHZhbHVlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpOworCQkJCVN0cmluZyB0aGlzVmFsdWUgPSB2YWx1ZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisJCQkJaWYodGhpc1ZhbHVlLmNvbXBhcmVUbyhzdHJ1Y3ROYW1lKSA9PSAwKQorCQkJCXsKKwkJCQkJZmllbGROb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdmFsdWUgbm9kZSBleGlzdHMKKwkJYXNzZXJ0Tm90TnVsbChmaWVsZE5vZGUpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJmaWVsZElkIiwgImZpZWxkTmFtZSIsICJ0eXBlIiwgImlzUHJpbWl0aXZlVHlwZSIsCisJCQkiaXNBcnJheSIsICJkaW1lbnNpb24ifSkpOworCisJCS8vdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24ifSkpOworCQkKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gZmllbGROb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJLy8gZGltZW5zaW9uIGF0dHIgaXMgbnVsbGFibGUsIG1lYW5pbmcgaXQgbWlnaHQganVzdCBub3QgYmUgdGhlcmUgaWYgaXNBcnJheSA9ICJmYWxzZSIKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCBpc0FycmF5ID09ICJmYWxzZSIgPyA2IDogNyk7CisJCQorCQlTdHJpbmcgZmllbGRJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGZpZWxkTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGlzQXJyYXlBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc0FycmF5IikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlOb2RlIGRpbWVuc2lvbk5vZGUgPSBhdHRycy5nZXROYW1lZEl0ZW0oImRpbWVuc2lvbiIpOworCQlTdHJpbmcgZGltZW5zaW9uQXR0ciA9IGRpbWVuc2lvbk5vZGUgPT0gbnVsbCA/IGRpbWVuc2lvbiA6IGRpbWVuc2lvbk5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIG5hbWUKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkSWRBdHRyLCBmaWVsZElkKTsKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkTmFtZUF0dHIsIGZpZWxkTmFtZSk7CisJCWFzc2VydEVxdWFscyh0eXBlQXR0ciwgdHlwZSk7CisJCWFzc2VydEVxdWFscyhpc0FycmF5QXR0ciwgaXNBcnJheSk7CisJCWFzc2VydEVxdWFscyhkaW1lbnNpb25BdHRyLCBkaW1lbnNpb24pOworCQkKKwkJTm9kZSBjaGlsZCA9IGdldERlc2NyaXB0aW9uRWxlbWVudChmaWVsZE5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrRXhjZXB0aW9uUHJvcGVydGllcyhOb2RlIGV4Y2VwdGlvbk5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgaXNVbmNoZWNrZWQsIFN0cmluZyBleGNlcHRpb25JZCwgCisJCQlTdHJpbmcgZXhjZXB0aW9uTmFtZSwgU3RyaW5nIGJhc2VUeXBlTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gZXhjZXB0aW9uTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUoZXhjZXB0aW9uTm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJpc1VuY2hlY2tlZCIsICJ0eXBlSWQiLCAidHlwZU5hbWUiLCAiYmFzZVR5cGUifSkpOworCisJCS8vdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGV4Y2VwdGlvbk5vZGUsIG5ldyBTdHJpbmdbXSB7ImRlc2NyaXB0aW9uIiwgImZpZWxkIn0pKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCA1KTsKKwkJCisJCVN0cmluZyBuYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgaXNVbmNoZWNrZWRBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc1VuY2hlY2tlZCIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVJZCIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZU5hbWUgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVOYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBiYXNlVHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImJhc2VUeXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkvLyB2ZXJpZnkgbmFtZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIG5hbWUpOworCQkKKwkJLy8gdmVyaWZ5IHR5cGUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKGlzVW5jaGVja2VkQXR0ciwgaXNVbmNoZWNrZWQpOworCQkKKwkJLy8gdmVyaWZ5IHR5cGUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKHR5cGVBdHRyLCBleGNlcHRpb25JZCk7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKHR5cGVOYW1lLCBleGNlcHRpb25OYW1lKTsKKwkJCisJCWFzc2VydEVxdWFscyggYmFzZVR5cGVOYW1lLCBiYXNlVHlwZUF0dHIgKTsKKwkJCisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQoZXhjZXB0aW9uTm9kZSk7CisJCQorCQlpZihkZXNjcmlwdGlvbiA9PSBudWxsKQorCQl7CisJCQlhc3NlcnROdWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsJCisJCQlTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IGNoaWxkLmdldFRleHRDb250ZW50KCkudHJpbSgpOworCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uVmFsdWUsIGRlc2NyaXB0aW9uKTsKKwkJCQorCQkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IGNoaWxkcmVuIG9uIGRlc2NyaXB0aW9uCisJCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQoY2hpbGQpLCAwKTsKKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoTm9kZSBleGNlcHRpb25Ob2RlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZpZWxkSWQsIFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgaXNBcnJheSwgU3RyaW5nIGRpbWVuc2lvbiwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJTm9kZSBmaWVsZE5vZGUgPSBudWxsOworCQkKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBleGNlcHRpb25Ob2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCkgPT0gImZpZWxkIikKKwkJCXsKKwkJCQlOb2RlIHRoaXNOb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0aGlzTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQkJTm9kZSB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5hbWUiKTsKKwkJCQlTdHJpbmcgdGhpc1ZhbHVlID0gdmFsdWVBdHRyLmdldE5vZGVWYWx1ZSgpOworCQkJCWlmKHRoaXNWYWx1ZS5jb21wYXJlVG8obmFtZSkgPT0gMCkKKwkJCQl7CisJCQkJCWZpZWxkTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQkJCisJCS8vIHZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBub2RlIGV4aXN0cworCQlhc3NlcnROb3ROdWxsKGZpZWxkTm9kZSk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUoZmllbGROb2RlLCBuZXcgU3RyaW5nW10geyJuYW1lIiwgImZpZWxkSWQiLCAiZmllbGROYW1lIiwgInR5cGUiLCAiaXNBcnJheSIsICJkaW1lbnNpb24ifSkpOworCisvLwkJdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24iLCAiZmllbGQifSkpOworCQorCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBmaWVsZE5vZGUuZ2V0QXR0cmlidXRlcygpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IHN0dWZmIGhhcyBzbnVjayBpbnRvIHRoZSBYTUwgYmluZGluZworCQkvLyBkaW1lbnNpb24gYXR0ciBpcyBudWxsYWJsZSwgbWVhbmluZyBpdCBtaWdodCBqdXN0IG5vdCBiZSB0aGVyZSBpZiBpc0FycmF5ID0gImZhbHNlIgorCQlhc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIGlzQXJyYXkgPT0gImZhbHNlIiA/IDUgOiA2KTsKKwkJCisJCVN0cmluZyBmaWVsZElkQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZmllbGRJZCIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgZmllbGROYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZmllbGROYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgaXNBcnJheUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImlzQXJyYXkiKS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCU5vZGUgZGltZW5zaW9uTm9kZSA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZGltZW5zaW9uIik7CisJCVN0cmluZyBkaW1lbnNpb25BdHRyID0gZGltZW5zaW9uTm9kZSA9PSBudWxsID8gZGltZW5zaW9uIDogZGltZW5zaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmaWVsZElkQXR0ciwgZmllbGRJZCk7CisJCWFzc2VydEVxdWFscyhmaWVsZE5hbWVBdHRyLCBmaWVsZE5hbWUpOworCQlhc3NlcnRFcXVhbHModHlwZUF0dHIsIHR5cGUpOworCQlhc3NlcnRFcXVhbHMoaXNBcnJheUF0dHIsIGlzQXJyYXkpOworCQlhc3NlcnRFcXVhbHMoZGltZW5zaW9uQXR0ciwgZGltZW5zaW9uKTsKKwkJCisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQoZmllbGROb2RlKTsKKwkJCisJCWlmKGRlc2NyaXB0aW9uID09IG51bGwpCisJCXsKKwkJCWFzc2VydE51bGwoY2hpbGQpOworCQl9CisJCWVsc2UKKwkJewkKKwkJCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlID0gY2hpbGQuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CisJCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25WYWx1ZSwgZGVzY3JpcHRpb24pOworCQkJCisJCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKwkJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChjaGlsZCksIDApOworCQl9CisJfQorCQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kUHJvcGVydGllcyhOb2RlIG1ldGhvZE5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kSWQsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgcG9vbCwgU3RyaW5nIGlzT25ld2F5LCAKKwkJCVN0cmluZyBkaXJlY3Rpb24sIFN0cmluZyB0aW1lb3V0LCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyByZXN1bHQpCisJeworCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBtZXRob2ROb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJYm9vbGVhbiBpc1Jlc3VsdE1lc3NhZ2UgPSBmYWxzZTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShtZXRob2ROb2RlLCBuZXcgU3RyaW5nW10geyJuYW1lIiwgInR5cGVJZCIsICJ0eXBlTmFtZSIsICJhc3luY1JlY2VpdmVyTW9kZSIsICJpc09uZXdheSIsICJtZXNzYWdlRGlyZWN0aW9uIiwgInRpbWVvdXQiLAorCQkJCSJyZXNwb25zZUZpZWxkIn0pKTsKKworCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUobWV0aG9kTm9kZSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24iLCAiZXhjZXB0aW9uIiwgImF1dGhvcml6ZSIsICJmaWVsZCIsICJyZXN1bHQifSkpOworCQorCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgc3R1ZmYgaGFzIHNudWNrIGludG8gdGhlIFhNTCBiaW5kaW5nCisJCWlzUmVzdWx0TWVzc2FnZSA9IG5hbWUuc3RhcnRzV2l0aCgiX3Jlc3VsdCIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGlzUmVzdWx0TWVzc2FnZT8gOCA6IDYsIGF0dHJzLmdldExlbmd0aCgpKTsKKwkJCisJCVN0cmluZyBuYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUlkQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZUlkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVOYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBwb29sQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiYXN5bmNSZWNlaXZlck1vZGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGlzT25ld2F5QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiaXNPbmV3YXkiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGRpcmVjdGlvbkF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm1lc3NhZ2VEaXJlY3Rpb24iKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHRpbWVvdXRBdHRyID0gIiI7CisJCVN0cmluZyByZXN1bHRBdHRyID0gIiI7CisJCQorCQlpZiAoIGlzUmVzdWx0TWVzc2FnZSApCisJCXsKKwkJCXRpbWVvdXRBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0aW1lb3V0IikuZ2V0Tm9kZVZhbHVlKCk7CisJCQlyZXN1bHRBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJyZXNwb25zZUZpZWxkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCX0KKwkJCisJCS8vIHZlcmlmeSBuYW1lIG9mIG1ldGhvZAorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIG5hbWUpOworCQkKKwkJLy8gdmVyaWZ5IHR5cGUgb2YgbWV0aG9kCisJCWFzc2VydEVxdWFscyh0eXBlSWRBdHRyLCBtZXRob2RJZCk7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgbWV0aG9kCisJCWFzc2VydEVxdWFscyh0eXBlTmFtZUF0dHIsIG1ldGhvZE5hbWUpOworCQkKKwkJLy8gdmVyaWZ5IHZhbHVlIG9mIHBvb2wKKwkJYXNzZXJ0RXF1YWxzKHBvb2xBdHRyLCBwb29sKTsKKwkJCisJCS8vIHZlcmlmeSB2YWx1ZSBvZiBpc09uZXdheQorCQlhc3NlcnRFcXVhbHMoaXNPbmV3YXlBdHRyLCBpc09uZXdheSk7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgaXNPbmV3YXkKKwkJYXNzZXJ0RXF1YWxzKGRpcmVjdGlvbkF0dHIsIGRpcmVjdGlvbik7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgaXNPbmV3YXkKKwkJaWYgKCBpc1Jlc3VsdE1lc3NhZ2UgKQorCQl7CisJCQlhc3NlcnRFcXVhbHModGltZW91dEF0dHIsIHRpbWVvdXQpOworCQkJYXNzZXJ0RXF1YWxzKHJlc3VsdEF0dHIsIHJlc3VsdCk7CisJCX0KKwkJTm9kZSBjaGlsZCA9IGdldERlc2NyaXB0aW9uRWxlbWVudChtZXRob2ROb2RlKTsKKwkJCisJCWlmKGRlc2NyaXB0aW9uID09IG51bGwpCisJCXsKKwkJCWFzc2VydE51bGwoY2hpbGQpOworCQl9CisJCWVsc2UKKwkJewkKKwkJCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlID0gY2hpbGQuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CisJCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25WYWx1ZSwgZGVzY3JpcHRpb24pOworCQkJCisJCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKwkJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChjaGlsZCksIDApOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja0F1dGhvcml6ZShOb2RlIG1ldGhvZE5vZGUsIFN0cmluZyBhdXRob3JpemVNZXRob2ROYW1lKQorCXsKKwkJTm9kZSBjaGlsZCA9IGdldEF1dGhvcml6ZUVsZW1lbnQobWV0aG9kTm9kZSk7CisJCQorCQlpZihhdXRob3JpemVNZXRob2ROYW1lID09IG51bGwpCisJCXsKKwkJCWFzc2VydE51bGwoY2hpbGQpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShjaGlsZCwgbmV3IFN0cmluZ1tdIHsibWV0aG9kTmFtZSJ9KSk7CisKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUoY2hpbGQsIG5ldyBTdHJpbmdbXSB7fSkpOworCQkKKwkJCVN0cmluZyBhdXRob3JpemVBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgibWV0aG9kTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQkJCisJCQlhc3NlcnRFcXVhbHMoYXV0aG9yaXplQXR0ciwgYXV0aG9yaXplTWV0aG9kTmFtZSk7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdWx0KE5vZGUgbWV0aG9kTm9kZSwgU3RyaW5nIGZpZWxkSWQsIFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlLCAKKwkJU3RyaW5nIGlzUHJpbWl0aXZlVHlwZSwgU3RyaW5nIGlzQXJyYXksIFN0cmluZyBkaW1lbnNpb24sIFN0cmluZyBkZXNjcmlwdGlvbikKKwl7CisJCU5vZGUgcmVzdWx0Tm9kZSA9IGdldFJlc3VsdEVsZW1lbnQobWV0aG9kTm9kZSk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUocmVzdWx0Tm9kZSwgbmV3IFN0cmluZ1tdIHsiZmllbGRJZCIsICJmaWVsZE5hbWUiLCAidHlwZSIsICJpc1ByaW1pdGl2ZVR5cGUiLCAiaXNBcnJheSIsICJkaW1lbnNpb24ifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBub2RlIGV4aXN0cworCQlhc3NlcnROb3ROdWxsKHJlc3VsdE5vZGUpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKHJlc3VsdE5vZGUsIG5ldyBTdHJpbmdbXSB7ImRlc2NyaXB0aW9uIn0pKTsKKwkKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gcmVzdWx0Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgc3R1ZmYgaGFzIHNudWNrIGludG8gdGhlIFhNTCBiaW5kaW5nCisJCQorCQkvLyB0aGlzIGlzIHNwZWNpYWwgY2FzZSBvZiBhIG9uZXdheSBtZXNzYWdlLCBzbyB3ZSBzaG91bGQgb25seSBoYXZlICd0eXBlPXZvaWQnIGFuZCAnaXNBcnJheT10cnVlJyBzcGVjaWZpZWQuCisJCVN0cmluZyBmaWVsZElkQXR0ciA9IG51bGw7CisJCVN0cmluZyBmaWVsZE5hbWVBdHRyID0gbnVsbDsKKwkJCisJCWlmKGZpZWxkSWQgPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAyKTsKKwkJCQorCQl9CisJCWVsc2UgLy8gZGltZW5zaW9uIGF0dHIgaXMgbnVsbGFibGUsIG1lYW5pbmcgaXQgbWlnaHQganVzdCBub3QgYmUgdGhlcmUgaWYgaXNBcnJheSA9ICJmYWxzZSIKKwkJeworCQkJZmllbGRJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJCWZpZWxkTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQkJCisJCQlhc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIGlzQXJyYXkgPT0gImZhbHNlIiA/IDUgOiA2KTsKKwkJfQorCQkKKwkJU3RyaW5nIHR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc0FycmF5QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiaXNBcnJheSIpLmdldE5vZGVWYWx1ZSgpOworCisJCU5vZGUgZGltZW5zaW9uTm9kZSA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZGltZW5zaW9uIik7CisJCVN0cmluZyBkaW1lbnNpb25BdHRyID0gZGltZW5zaW9uTm9kZSA9PSBudWxsID8gZGltZW5zaW9uIDogZGltZW5zaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmaWVsZElkQXR0ciwgZmllbGRJZCk7CisJCWFzc2VydEVxdWFscyhmaWVsZE5hbWVBdHRyLCBmaWVsZE5hbWUpOworCQlhc3NlcnRFcXVhbHModHlwZUF0dHIsIHR5cGUpOworCQlhc3NlcnRFcXVhbHMoaXNBcnJheUF0dHIsIGlzQXJyYXkpOworCQlhc3NlcnRFcXVhbHMoZGltZW5zaW9uQXR0ciwgZGltZW5zaW9uKTsKKwkJCisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQocmVzdWx0Tm9kZSk7CisJCQorCQlpZihkZXNjcmlwdGlvbiA9PSBudWxsKQorCQl7CisJCQlhc3NlcnROdWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsJCisJCQlTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IGNoaWxkLmdldFRleHRDb250ZW50KCkudHJpbSgpOworCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uVmFsdWUsIGRlc2NyaXB0aW9uKTsKKwkJCQorCQkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IGNoaWxkcmVuIG9uIGRlc2NyaXB0aW9uCisJCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQoY2hpbGQpLCAwKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMoTm9kZSBtZXRob2ROb2RlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZpZWxkSWQsIFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlLCAKKwkJCVN0cmluZyBpc1ByaW1pdGl2ZVR5cGUsIFN0cmluZyBpc0FycmF5LCBTdHJpbmcgZGltZW5zaW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pCisJeworCQlOb2RlIGZpZWxkTm9kZSA9IG51bGw7CisJCQorCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG1ldGhvZE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJaWYoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSA9PSAiZmllbGQiKQorCQkJeworCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRoaXNOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlOb2RlIHZhbHVlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpOworCQkJCVN0cmluZyB0aGlzVmFsdWUgPSB2YWx1ZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisJCQkJaWYodGhpc1ZhbHVlLmNvbXBhcmVUbyhuYW1lKSA9PSAwKQorCQkJCXsKKwkJCQkJZmllbGROb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdmFsdWUgbm9kZSBleGlzdHMKKwkJYXNzZXJ0Tm90TnVsbChmaWVsZE5vZGUpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJmaWVsZElkIiwgImZpZWxkTmFtZSIsICJ0eXBlIiwgCisJCQkJImlzUHJpbWl0aXZlVHlwZSIsICJpc0FycmF5IiwgImRpbWVuc2lvbiIgfSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShmaWVsZE5vZGUsIG5ldyBTdHJpbmdbXSB7ImRlc2NyaXB0aW9uIn0pKTsKKwkKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gZmllbGROb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJLy8gZGltZW5zaW9uIGF0dHIgaXMgbnVsbGFibGUsIG1lYW5pbmcgaXQgbWlnaHQganVzdCBub3QgYmUgdGhlcmUgaWYgaXNBcnJheSA9ICJmYWxzZSIKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCBpc0FycmF5ID09ICJmYWxzZSIgPyA2IDogNyk7CisJCQorCQlTdHJpbmcgZmllbGRJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGZpZWxkTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGlzQXJyYXlBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc0FycmF5IikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc1ByaW1pdGl2ZVR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc1ByaW1pdGl2ZVR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCU5vZGUgZGltZW5zaW9uTm9kZSA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZGltZW5zaW9uIik7CisJCVN0cmluZyBkaW1lbnNpb25BdHRyID0gZGltZW5zaW9uTm9kZSA9PSBudWxsID8gZGltZW5zaW9uIDogZGltZW5zaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmaWVsZElkQXR0ciwgZmllbGRJZCk7CisJCWFzc2VydEVxdWFscyhmaWVsZE5hbWVBdHRyLCBmaWVsZE5hbWUpOworCQlhc3NlcnRFcXVhbHModHlwZUF0dHIsIHR5cGUpOworCQlhc3NlcnRFcXVhbHMoaXNBcnJheUF0dHIsIGlzQXJyYXkpOworCQlhc3NlcnRFcXVhbHMoZGltZW5zaW9uQXR0ciwgZGltZW5zaW9uKTsKKwkJYXNzZXJ0RXF1YWxzKCBpc1ByaW1pdGl2ZVR5cGUsIGlzUHJpbWl0aXZlVHlwZUF0dHIgKTsKKwkJCisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQoZmllbGROb2RlKTsKKwkJCisJCWlmKGRlc2NyaXB0aW9uID09IG51bGwpCisJCXsKKwkJCWFzc2VydE51bGwoY2hpbGQpOworCQl9CisJCWVsc2UKKwkJewkKKwkJCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlID0gY2hpbGQuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CisJCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25WYWx1ZSwgZGVzY3JpcHRpb24pOworCQkJCisJCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKwkJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChjaGlsZCksIDApOworCQl9CisJfQorCQorCXByaXZhdGUgTm9kZSBnZXREZXNjcmlwdGlvbkVsZW1lbnQoTm9kZSBub2RlKQorCXsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCXNob3J0IG5vZGVUeXBlID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpOworCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpOworCQkJaWYobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZU5hbWUgPT0gImRlc2NyaXB0aW9uIikKKwkJCXsKKwkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlbShpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBOb2RlIGdldEF1dGhvcml6ZUVsZW1lbnQoTm9kZSBub2RlKQorCXsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCXNob3J0IG5vZGVUeXBlID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpOworCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpOworCQkJaWYobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZU5hbWUgPT0gImF1dGhvcml6ZSIpCisJCQl7CisJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZW0oaSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgTm9kZSBnZXRSZXN1bHRFbGVtZW50KE5vZGUgbm9kZSkKKwl7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlzaG9ydCBub2RlVHlwZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKTsKKwkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKKwkJCWlmKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG5vZGVOYW1lID09ICJyZXN1bHQiKQorCQkJeworCQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKGkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIGludCBnZXRDaGlsZEVsZW1lbnRDb3VudChOb2RlIG5vZGUpCisJeworCQlpbnQgY291bnQgPSAwOworCQkKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKKwkJCXsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gY291bnQ7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBvbmx5Q2hpbGROb2Rlc09mTmFtZShOb2RlIG5vZGUsIFN0cmluZ1tdIGVsZW1lbnROYW1lc1RvQ2hlY2spCisJeworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQkKKwkJYm9vbGVhbiBoYXNWYWxpZENoaWxkcmVuID0gdHJ1ZTsKKwkJCisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQorCQkJaWYoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQorCQkJeworCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKKwkJCQkKKwkJCQlib29sZWFuIG1hdGNoZXMgPSBmYWxzZTsKKwkJCQlmb3IgKFN0cmluZyBlbGVtZW50IDogZWxlbWVudE5hbWVzVG9DaGVjaykKKwkJCQl7CisJCQkJCWlmKDAgPT0gZWxlbWVudE5hbWUuY29tcGFyZVRvKGVsZW1lbnQpICkKKwkJCQkJeworCQkJCQkJbWF0Y2hlcyA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlpZihtYXRjaGVzID09IGZhbHNlKQorCQkJCXsKKwkJCQkJaGFzVmFsaWRDaGlsZHJlbiA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CQorCQl9CisJCQorCQlyZXR1cm4gaGFzVmFsaWRDaGlsZHJlbjsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIG9ubHlBdHRyc09mTmFtZShOb2RlIG5vZGUsIFN0cmluZ1tdIGF0dHJOYW1lc1RvQ2hlY2spCisJeworCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCWJvb2xlYW4gaGFzVmFsaWRBdHRycyA9IHRydWU7CisJCQorCQlmb3IoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0cnMuaXRlbShpKS5nZXROb2RlTmFtZSgpOworCQkJCisJCQlib29sZWFuIG1hdGNoZXMgPSBmYWxzZTsKKwkJCWZvciAoU3RyaW5nIGVsZW1lbnQgOiBhdHRyTmFtZXNUb0NoZWNrKQorCQkJeworCQkJCWlmKDAgPT0gYXR0ck5hbWUuY29tcGFyZVRvKGVsZW1lbnQpICkKKwkJCQl7CisJCQkJCW1hdGNoZXMgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmKG1hdGNoZXMgPT0gZmFsc2UpCisJCQl7CisJCQkJaGFzVmFsaWRBdHRycyA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCX0KKwkJCisJCXJldHVybiBoYXNWYWxpZEF0dHJzOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RNYWluVGVzdDFDbGllbnQuamF2YSBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RNYWluVGVzdDFDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThkZjYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdE1haW5UZXN0MUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTEyNCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLlN0ckludEhhc2hNYXA7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogQGF1dGhvciByZWJhcnJhegorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RNYWluVGVzdDFDbGllbnQKK3sKKwkvLyBTZXR0aW5ncworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIEluc3RhbmNlIG9mIHRoZSBjbGFzcy4KKwlwcml2YXRlIEltcGxUZXN0MUNsaWVudCBteU1haW5UZXN0Q2xpZW50OworCisJLy8gSW5zdGFuY2VzIG9mIGFyZ3VtZW50cyB0eXBlcworCXByaXZhdGUgQm9vbGVhbgkJCW15Qm9vbDsKKwlwcml2YXRlIEJ5dGUJCQlteUJ5dGU7CisJcHJpdmF0ZSBTaG9ydAkJCW15U2hvcnQ7CisJcHJpdmF0ZSBJbnRlZ2VyIAkJbXlJbnQ7CisJcHJpdmF0ZSBMb25nCQkJbXlMb25nOworCXByaXZhdGUgRmxvYXQJCQlteUZsb2F0OworCXByaXZhdGUgRG91YmxlICAJCW15RG91YmxlOworCXByaXZhdGUgT2JqZWN0CQkJbXlPYmo7CisJcHJpdmF0ZSBTdHJpbmcJCQlteVN0cmluZzsKKwlwcml2YXRlIFN0ckludEhhc2hNYXAJbXlNYXA7CisJcHJpdmF0ZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuRTEgbXlFMTsKKwlwcml2YXRlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5TMSBteVMxOworCXByaXZhdGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLlMyIG15UzI7CisJcHJpdmF0ZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuUzMgbXlTMzsKKwlwcml2YXRlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5TNCBteVM0OworCXByaXZhdGUgYm9vbGVhbltdCQlteUJvb2xzOworCXByaXZhdGUgYnl0ZVtdCQkJbXlCeXRlczsKKwlwcml2YXRlIHNob3J0W10JCQlteVNob3J0czsKKwlwcml2YXRlIGludFtdCQkJbXlJbnRzOworCXByaXZhdGUgbG9uZ1tdCQkJbXlMb25nczsKKwlwcml2YXRlIGZsb2F0W10JCQlteUZsb2F0czsKKwlwcml2YXRlIGRvdWJsZVtdCQlteURvdWJsZXM7CisJcHJpdmF0ZSBPYmplY3RbXQkJbXlPYmpzOworCXByaXZhdGUgU3RyaW5nW10JCW15U3RyaW5nczsKKwlwcml2YXRlIFN0ckludEhhc2hNYXBbXQlteU1hcHM7CisJcHJpdmF0ZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuRTFbXSBteUUxczsKKwlwcml2YXRlIG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5TMVtdIG15UzFzOworCXByaXZhdGUgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLlMyW10gbXlTMnM7CisKKworCS8vIE1haW50ZW5hbmNlCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLyoqCisJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCisJICovCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbXlNYWluVGVzdENsaWVudCA9IG5ldyBJbXBsVGVzdDFDbGllbnQoIG51bGwgKTsKKwl9CisKKworCS8vIFRlc3RzCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLyoqCisJICovCisJCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjbGFzc0luaGVyaXRhbmNlKCkKKwl7CisJCWFzc2VydFRydWUoIG15TWFpblRlc3RDbGllbnQgaW5zdGFuY2VvZiBJbXBsVGVzdDFDbGllbnQgKTsKKwkJYXNzZXJ0VHJ1ZSggbXlNYWluVGVzdENsaWVudCBpbnN0YW5jZW9mIEJhc2VUZXN0MUNsaWVudCApOworCX0KKwkKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIG5vdGhpbmdNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5ub3RoaW5nKCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBpbmNyTWV0aG9kKCkKKwl7CisJCW15SW50ID0gbXlNYWluVGVzdENsaWVudC5pbmNyKG15SW50KTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGFkZE1ldGhvZCgpCisJeworCQlteUludCA9IG15TWFpblRlc3RDbGllbnQuYWRkKG15SW50LCBteUludCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBzdWJNZXRob2QoKQorCXsKKwkJbXlJbnQgPSBteU1haW5UZXN0Q2xpZW50LnN1YihteUludCwgbXlJbnQpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgc3VtTWV0aG9kKCkKKwl7CisJCW15SW50ID0gbXlNYWluVGVzdENsaWVudC5zdW0obXlJbnRzKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRyYW5zTWV0aG9kKCkKKwl7CisJCW15SW50ID0gbXlNYWluVGVzdENsaWVudC50cmFucyhteUUxLCBteUludCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBkaXN0TWV0aG9kKCkKKwl7CisJCW15RG91YmxlID0gbXlNYWluVGVzdENsaWVudC5kaXN0KG15UzEsIG15UzEpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgZmlsbE1ldGhvZCgpCisJeworCQlteUludHMgPSBteU1haW5UZXN0Q2xpZW50LmZpbGwobXlJbnQsIG15SW50KTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGZpbGxPYmplY3RNZXRob2QoKQorCXsKKwkJbXlPYmpzID0gbXlNYWluVGVzdENsaWVudC5maWxsT2JqZWN0KG15SW50LCBteU9iaik7CisJfQorCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGJsb3dNZXRob2QoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlteU1haW5UZXN0Q2xpZW50LmJsb3cobXlTdHJpbmcsIG15SW50KTsKKwl9CisKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgYmVldHNNZXRob2QoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlteUludCA9IG15TWFpblRlc3RDbGllbnQuYmVldHMobXlFMSk7CisJfQorCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRocm93RXhjcDVNZXRob2QoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlteU1haW5UZXN0Q2xpZW50LnRocm93RXhjcDUobXlTdHJpbmcsIG15SW50LCBteU9iaik7CisJfQorCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRocm93RXhjcDZNZXRob2QoKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlteU1haW5UZXN0Q2xpZW50LnRocm93RXhjcDYobXlTdHJpbmcsIG15SW50LCBteU9ianMpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9ib29sZWFuTWV0aG9kKCkKKwl7CisJCW15Qm9vbCA9IG15TWFpblRlc3RDbGllbnQucF9ib29sZWFuKG15Qm9vbCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX2Jvb2xlYW5fYXJyYXlNZXRob2QoKQorCXsKKwkJbXlCb29scyA9IG15TWFpblRlc3RDbGllbnQucF9ib29sZWFuX2FycmF5KG15Qm9vbHMpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9ieXRlTWV0aG9kKCkKKwl7CisJCW15Qnl0ZSA9IG15TWFpblRlc3RDbGllbnQucF9ieXRlKG15Qnl0ZSk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX2J5dGVfYXJyYXlNZXRob2QoKQorCXsKKwkJbXlCeXRlcyA9IG15TWFpblRlc3RDbGllbnQucF9ieXRlX2FycmF5KG15Qnl0ZXMpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9zaG9ydE1ldGhvZCgpCisJeworCQlteVNob3J0ID0gbXlNYWluVGVzdENsaWVudC5wX3Nob3J0KG15U2hvcnQpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9zaG9ydF9hcnJheU1ldGhvZCgpCisJeworCQlteVNob3J0cyA9IG15TWFpblRlc3RDbGllbnQucF9zaG9ydF9hcnJheShteVNob3J0cyk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX2ludE1ldGhvZCgpCisJeworCQlteUludCA9IG15TWFpblRlc3RDbGllbnQucF9pbnQobXlJbnQpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9pbnRfYXJyYXlNZXRob2QoKQorCXsKKwkJbXlJbnRzID0gbXlNYWluVGVzdENsaWVudC5wX2ludF9hcnJheShteUludHMpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9sb25nTWV0aG9kKCkKKwl7CisJCW15TG9uZyA9IG15TWFpblRlc3RDbGllbnQucF9sb25nKG15TG9uZyk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX2xvbmdfYXJyYXlNZXRob2QoKQorCXsKKwkJbXlMb25ncyA9IG15TWFpblRlc3RDbGllbnQucF9sb25nX2FycmF5KG15TG9uZ3MpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9mbG9hdE1ldGhvZCgpCisJeworCQlteUZsb2F0ID0gbXlNYWluVGVzdENsaWVudC5wX2Zsb2F0KG15RmxvYXQpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9mbG9hdF9hcnJheU1ldGhvZCgpCisJeworCQlteUZsb2F0cyA9IG15TWFpblRlc3RDbGllbnQucF9mbG9hdF9hcnJheShteUZsb2F0cyk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX2RvdWJsZU1ldGhvZCgpCisJeworCQlteURvdWJsZSA9IG15TWFpblRlc3RDbGllbnQucF9kb3VibGUobXlEb3VibGUpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9kb3VibGVfYXJyYXlNZXRob2QoKQorCXsKKwkJbXlEb3VibGVzID0gbXlNYWluVGVzdENsaWVudC5wX2RvdWJsZV9hcnJheShteURvdWJsZXMpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9zdHJpbmdNZXRob2QoKQorCXsKKwkJbXlTdHJpbmcgPSBteU1haW5UZXN0Q2xpZW50LnBfc3RyaW5nKG15U3RyaW5nKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHBfc3RyaW5nX2FycmF5TWV0aG9kKCkKKwl7CisJCW15U3RyaW5ncyA9IG15TWFpblRlc3RDbGllbnQucF9zdHJpbmdfYXJyYXkobXlTdHJpbmdzKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHBfRTFNZXRob2QoKQorCXsKKwkJbXlFMSA9IG15TWFpblRlc3RDbGllbnQucF9FMShteUUxKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHBfRTFfYXJyYXlNZXRob2QoKQorCXsKKwkJbXlFMXMgPSBteU1haW5UZXN0Q2xpZW50LnBfRTFfYXJyYXkobXlFMXMpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9TMU1ldGhvZCgpCisJeworCQkgbXlTMSA9IG15TWFpblRlc3RDbGllbnQucF9TMShteVMxKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHBfUzFfYXJyYXlNZXRob2QoKQorCXsKKwkJIG15UzFzID0gbXlNYWluVGVzdENsaWVudC5wX1MxX2FycmF5KG15UzFzKTsKKworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9TMk1ldGhvZCgpCisJeworCQlteVMyID0gbXlNYWluVGVzdENsaWVudC5wX1MyKG15UzIpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9TMl9hcnJheU1ldGhvZCgpCisJeworCQlteVMycyA9IG15TWFpblRlc3RDbGllbnQucF9TMl9hcnJheShteVMycyk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX0Jsb2JNZXRob2QoKQorCXsKKwkJbXlNYXAgPSBteU1haW5UZXN0Q2xpZW50LnBfQmxvYihteU1hcCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX0Jsb2JfQXJyYXlNZXRob2QoKQorCXsKKwkJbXlNYXBzID0gbXlNYWluVGVzdENsaWVudC5wX0Jsb2JfYXJyYXkobXlNYXBzKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHBfb2JqZWN0TWV0aG9kKCkKKwl7CisJCW15T2JqID0gbXlNYWluVGVzdENsaWVudC5wX29iamVjdChteU9iaik7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBwX29iamVjdF9hcnJheU1ldGhvZCgpCisJeworCQlteU1haW5UZXN0Q2xpZW50LnBfb2JqZWN0X2FycmF5KG51bGwpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgcF9vYmplY3Rfc3RydWN0TWV0aG9kKCkKKwl7CisJCW15UzMgPSBteU1haW5UZXN0Q2xpZW50LnBfb2JqZWN0X3N0cnVjdChteVMzKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHBfb2JqZWN0X3N0cnVjdF9hcnJheU1ldGhvZCgpCisJeworCQlteVM0ID0gbXlNYWluVGVzdENsaWVudC5wX29iamVjdF9zdHJ1Y3RfYXJyYXkobXlTNCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBhbHdheXNXb3Jkc01ldGhvZCgpCisJeworCQlteUludCA9IG15TWFpblRlc3RDbGllbnQuYWx3YXlzV29ya3MoKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGlzVHJ1ZU1ldGhvZCgpCisJeworCQlteUJvb2wgPSBteU1haW5UZXN0Q2xpZW50LmlzVHJ1ZSgpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgYWx3YXlzRmFpbHNNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5hbHdheXNGYWlscygpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgaXNGYWxzZU1ldGhvZCgpCisJeworCQlteUJvb2wgPSBteU1haW5UZXN0Q2xpZW50LmlzRmFsc2UoKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIG0xTWV0aG9kKCkKKwl7CisJCW15TWFpblRlc3RDbGllbnQubTEoKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNhbl9tMU1ldGhvZCgpCisJeworCQlteUJvb2wgPSBteU1haW5UZXN0Q2xpZW50LmNhbl9tMSgpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgbTJNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5tMigpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgY2FuX20yTWV0aG9kKCkKKwl7CisJCW15Qm9vbCA9IG15TWFpblRlc3RDbGllbnQuY2FuX20yKG51bGwpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgbTNNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5tMygpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgY2FuX20zTWV0aG9kKCkKKwl7CisJCW15Qm9vbCA9IG15TWFpblRlc3RDbGllbnQuY2FuX20zKG51bGwpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgbTRNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5tNCgpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgY2FuX200TWV0aG9kKCkKKwl7CisJCW15Qm9vbCA9IG15TWFpblRlc3RDbGllbnQuY2FuX200KG15Qm9vbCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBtNU1ldGhvZCgpCisJeworCQlteU1haW5UZXN0Q2xpZW50Lm01KCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBjYW5fbTVNZXRob2QoKQorCXsKKwkJbXlCb29sID0gbXlNYWluVGVzdENsaWVudC5jYW5fbTUobXlCeXRlKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIG03TWV0aG9kKCkKKwl7CisJCW15TWFpblRlc3RDbGllbnQubTcoKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNhbl9tN01ldGhvZCgpCisJeworCQlteUJvb2wgPSBteU1haW5UZXN0Q2xpZW50LmNhbl9tNyhteUludCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBtOE1ldGhvZCgpCisJeworCQlteU1haW5UZXN0Q2xpZW50Lm04KCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBjYW5fbThNZXRob2QoKQorCXsKKwkJbXlCb29sID0gbXlNYWluVGVzdENsaWVudC5jYW5fbTgobXlMb25nKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIG05TWV0aG9kKCkKKwl7CisJCW15TWFpblRlc3RDbGllbnQubTkoKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNhbl9tOU1ldGhvZCgpCisJeworCQlteUJvb2wgPSBteU1haW5UZXN0Q2xpZW50LmNhbl9tOShteUZsb2F0KTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIG0xME1ldGhvZCgpCisJeworCQlteU1haW5UZXN0Q2xpZW50Lm0xMCgpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgY2FuX20xME1ldGhvZCgpCisJeworCQlteUJvb2wgPSBteU1haW5UZXN0Q2xpZW50LmNhbl9tMTAobXlEb3VibGUpOworCX0KKworCS8qKgorCSAqLworCUBUZXN0CisJKGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgbTExTWV0aG9kKCkKKwl7CisJCW15TWFpblRlc3RDbGllbnQubTExKCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBjYW5fbTExTWV0aG9kKCkKKwl7CisJCW15Qm9vbCA9IG15TWFpblRlc3RDbGllbnQuY2FuX20xMShteVN0cmluZyk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBtMTJNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5tMTIoKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNhbl9tMTJNZXRob2QoKQorCXsKKwkJbXlCb29sID0gbXlNYWluVGVzdENsaWVudC5jYW5fbTEyKG15SW50KTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIG0xM01ldGhvZCgpCisJeworCQlteU1haW5UZXN0Q2xpZW50Lm0xMyhteUludCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBjYW5fbTEzTWV0aG9kKCkKKwl7CisJCW15Qm9vbCA9IG15TWFpblRlc3RDbGllbnQuY2FuX20xMyhteUludCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBtMTRNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5tMTQobXlTMSk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBjYW5fbTE0TWV0aG9kKCkKKwl7CisJCW15Qm9vbCA9IG15TWFpblRlc3RDbGllbnQuY2FuX20xNChteUludCk7CisJfQorCisJLyoqCisJICovCisJQFRlc3QKKwkoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBtMTVNZXRob2QoKQorCXsKKwkJbXlNYWluVGVzdENsaWVudC5tMTUoKTsKKwl9CisKKwkvKioKKwkgKi8KKwlAVGVzdAorCShleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGNhbl9tMTVNZXRob2QoKQorCXsKKwkJbXlCb29sID0gbXlNYWluVGVzdENsaWVudC5jYW5fbTE1KG15RTEpOworCX0KKworCS8qKgorCSAqIFRlc3QgdG8gbWFrZSBzdXJlIHRoZSBtYWluIG1ldGhvZCBjYW4gcnVuIChhdCBhbGwpLgorCSAqLworLyoJQFRlc3QKKwlwdWJsaWMgdm9pZCBtYWluTWV0aG9kKCkKKwl7CisJCWZpbmFsIENsaWVudFRocmVhZCBtID0gbmV3IENsaWVudFRocmVhZCgpOworCQltLnJ1bigpOworCisJCXRyeQorCQl7CisJCQltLmpvaW4oNDAwMCk7CisJCX0KKwkJY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKQorCQl7CisJCX0KKworCQlpZiAobS5oYXNFcnJvcnMoKSkKKwkJCWZhaWwoKTsKKworCX0KKwkqLworCisJLyoqCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbWFpblNlcnZpY2VMaXN0ZW5lckFuZENsaWVudCgpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIExvY2sgbG9jayA9IG5ldyBMb2NrKCk7CisKKwkJZmluYWwgVGhyZWFkQ2xpZW50IGNsaWVudCA9IG5ldyBUaHJlYWRDbGllbnQobG9jayk7CisJCWZpbmFsIFRocmVhZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRocmVhZExpc3RlbmVyKGxvY2spOworCisJCWxpc3RlbmVyLnN0YXJ0KCk7CisJCWNsaWVudC5zdGFydCgpOworCisJCS8vIFdhaXQgZm9yIHRlc3QgdG8gZmluaXNoLgorCQlsb2NrLmdldExvY2soMyk7CisJCWxvY2sucmVsZWFzZUxvY2soMyk7CisKKwkJaWYgKGNsaWVudC5oYXNFcnJvcnMoKSB8fCBsaXN0ZW5lci5oYXNFcnJvcnMoKSkKKwkJeworCQkJQXNzZXJ0LmZhaWwoKTsKKwkJfQorCX0KKworCisJLy8gSGVscGVycworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8qKgorCSAqIFByaW50cyBleGNlcHRpb24gaW5mbyB0byBzdGRlcnIgaW4gYSBtb3N0IGRlc2NyaXB0aXZlIHdheS4KKwkgKiBAcGFyYW0gZSB0aGUgZXhjZXB0aW9uIHRvIHByaW50CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHByaW50RXhjZXB0aW9uKGZpbmFsIEV4Y2VwdGlvbiBlKQorCXsKKwkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJfQorCisvLwkvKioKKy8vCSAqIFNpbXBsZSB0aHJlYWQgY2xhc3MgZm9yIGNhbGxpbmcgbWFpbiBXSVRIT1VUIGEgbGlzdGVuZXIuCisvLwkgKi8KKy8vCXByaXZhdGUgc3RhdGljIGNsYXNzIENsaWVudFRocmVhZCBleHRlbmRzIFRocmVhZAorLy8JeworLy8JCS8qKgorLy8JCSAqIGZhbHNlIHVudGlsIHVuZXhwZWN0ZWQgc3R1ZmYgZ29lcyBkb3duCisvLwkJICovCisvLwkJcHJpdmF0ZSBib29sZWFuIG15SGFzRXJyb3JzOworLy8KKy8vCQkvKioKKy8vCQkgKiBObyBlcnJvcnMgdG8gYmVnaW4gd2l0aC4KKy8vCQkgKi8KKy8vCQlwdWJsaWMgQ2xpZW50VGhyZWFkKCkKKy8vCQl7CisvLwkJCW15SGFzRXJyb3JzID0gZmFsc2U7CisvLwkJfQorLy8KKy8vCQkvKioKKy8vCQkgKiBHbyBhdCBpdC4KKy8vCQkgKi8KKy8vCQlAT3ZlcnJpZGUKKy8vCQlwdWJsaWMgdm9pZCBydW4oKQorLy8JCXsKKy8vCQkJdHJ5CisvLwkJCXsKKy8vCQkJCU1haW5UZXN0MUNsaWVudC5tYWluKG5ldyBTdHJpbmdbXSB7fSk7CisvLwkJCX0KKy8vCQkJY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gZTEpCisvLwkJCXsKKy8vCQkJfQorLy8JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpCisvLwkJCXsKKy8vCQkJfQorLy8JCQljYXRjaCAoRXhjZXB0aW9uIGUzKQorLy8JCQl7CisvLwkJCQkvLyBVbmV4cGVjdGVkCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldIQVQhPz8/Iik7CisvLwkJCQlwcmludEV4Y2VwdGlvbihlMyk7CisvLwkJCQlteUhhc0Vycm9ycyA9IHRydWU7CisvLwkJCX0KKy8vCQl9CisvLworLy8JCS8qKgorLy8JCSAqIFdlcmUgYW55IGVycm9ycyBlbmNvdW50ZXJlZD8KKy8vCQkgKiBAcmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCisvLwkJICovCisvLwkJcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkKKy8vCQl7CisvLwkJCXJldHVybiB0aGlzLm15SGFzRXJyb3JzOworLy8JCX0KKy8vCX0KKworCisJLyoqCisJICogUGFpbmZ1bGx5IHNpbXBsZSBsb2NraW5nIG1lY2hhbmlzbSBmb3Igb3JkZXJpbmcgbXVsdGl0aHJlYWRlZCBibG9ja3MuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jaworCXsKKwkJLyoqCisJCSAqIENvdW50ZXIgZm9yIHNpbXBsZSAobWFudWFsKSBvcmRlcmluZyBtZWNoYW5pc20uCisJCSAqLworCQlwcml2YXRlIGludCBteUNvdW50OworCisJCS8qKgorCQkgKiBCaW5hcnkgc2VtYXBob3JlLiBUaGUgLXJlYWwtIGxvY2suCisJCSAqLworCQlwcml2YXRlIFNlbWFwaG9yZSBteVNlbWFwaG9yZTsKKworCQkvKioKKwkJICogU3RhcnQgdGhlIGNvdW50IGF0IDAgd2l0aCB0aGUgbG9jayBhdmFpbGFibGUgYW5kIG5vIGVycm9ycyByZWNvcmRlZC4KKwkJICovCisJCXB1YmxpYyBMb2NrKCkKKwkJeworCQkJbXlDb3VudCA9IDA7CisJCQlteVNlbWFwaG9yZSA9IG5ldyBTZW1hcGhvcmUoMSk7CisJCX0KKworCQkvKioKKwkJICogQmxvY2tzIHVudGlsIHRoaXMgbG9jayBjYW4gYmUgZ3JhYmJlZCBieSB0aGUgY291bnQuCisJCSAqIEBwYXJhbSBjCisJCSAqLworCQlwdWJsaWMgdm9pZCBnZXRMb2NrKGZpbmFsIGludCBjKQorCQl7CisJCQl3aGlsZShjID4gbXlDb3VudCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCVRocmVhZC5zbGVlcCggMTAgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKworCQkJdHJ5CisJCQl7CisJCQkJbXlTZW1hcGhvcmUuYWNxdWlyZSgpOworCQkJfQorCQkJY2F0Y2goZmluYWwgRXhjZXB0aW9uIGUpCisJCQl7CisJCQkJLy8gV29uJ3QgaGFwcGVuIHRoYW5rcyB0byBhdG9taWMgcmVsZWFzZS4KKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBSZWxlYXNlcyB0aGUgbG9jayBpZiB0aGlzIGxvY2sgaXMgaGVsZC4KKwkJICogQHBhcmFtIGMKKwkJICovCisJCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlTG9jayhmaW5hbCBpbnQgYykKKwkJeworCQkJaWYgKGMgPT0gbXlDb3VudCAmJiBteVNlbWFwaG9yZS5hdmFpbGFibGVQZXJtaXRzKCkgPT0gMCkKKwkJCXsKKwkJCQlteVNlbWFwaG9yZS5yZWxlYXNlKCk7CisJCQkJKytteUNvdW50OworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhyZWFkIHVzZWQgdG8gcnVuIHRoZSBNYWluU2VydmljZUNsaWVudC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBUaHJlYWRDbGllbnQgZXh0ZW5kcyBUaHJlYWQKKwl7CisJCS8qKgorCQkgKiBTaGFyZWQgbG9jay4KKwkJICovCisJCXByaXZhdGUgTG9jayBvdXJMb2NrOworCisJCS8qKgorCQkgKiBSZWNvcmQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2l0aCBjbGllbnQuCisJCSAqLworCQlwcml2YXRlIGJvb2xlYW4gbXlIYXNFcnJvcnM7CisKKwkJLyoqCisJCSAqIFNoYXJlIHRoZSBsb2NrIGFuZCBzdGFydCB3aXRoIG5vIGVycm9ycyBpbiBzaWdodC4KKwkJICogQHBhcmFtIGwgdGhlIGxvY2sKKwkJICovCisJCXB1YmxpYyBUaHJlYWRDbGllbnQoZmluYWwgTG9jayBsKQorCQl7CisJCQlvdXJMb2NrID0gbDsKKwkJCW15SGFzRXJyb3JzID0gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICogU3RhcnQgY2xpZW50LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpCisJCXsKKwkJCS8vIDAuIFdhaXQgZm9yIHRoZSBsaXN0ZW5lciB0byBzdGFydCBoaXMgZW5naW5lLgorCisJCQkvLyAxLiBTdGFydCB0aGUgY2xpZW50LiAgTGV0IGl0IHN0YXJ0LCBjb25uZWN0LCBhbmQgZGllIGdyYWNlZnVsbHkuCisJCQlvdXJMb2NrLmdldExvY2soMSk7CisJCQl0cnkKKwkJCXsKKwkJCQlNYWluVGVzdDFDbGllbnQubWFpbiggbmV3IFN0cmluZ1tdIHt9ICk7CisJCQl9CisJCQljYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpCisJCQl7CisJCQkJLy8gU0hPVUxETidUIEhBUFBFTiEKKwkJCQlUZXN0TWFpblRlc3QxQ2xpZW50LnByaW50RXhjZXB0aW9uKGUpOworCisJCQkJbXlIYXNFcnJvcnMgPSB0cnVlOworCQkJfQorCQkJb3VyTG9jay5yZWxlYXNlTG9jaygxKTsKKworCQkJLy8gMi4gVGhlIGxpc3RlbmVyIGRpZXMuCisJCX0KKworCQkvKioKKwkJICogV2VyZSBhbnkgZXJyb3JzIGVuY291bnRlcmVkPworCQkgKiBAcmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKQorCQl7CisJCQlyZXR1cm4gbXlIYXNFcnJvcnM7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUdXJuIHRoZSBMaXN0ZW5lciBpbnRvIGEgc2ltcGxlIHRocmVhZCB0aGF0IGp1c3QgbGlzdGVucy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVUaHJlYWRMaXN0ZW5lciBleHRlbmRzIFRocmVhZAorCXsKKwkJLyoqCisJCSAqIFJlY29yZCB3aGVuIGFuIGVycm9yIGhhcHBlbnMgd2l0aCB0aGUgbGlzdGVuZXIuCisJCSAqLworCQlwcml2YXRlIGJvb2xlYW4gbXlIYXNFcnJvcnM7CisKKwkJLyoqCisJCSAqIE5vIGVycm9ycyBpbiBzaWdodC4KKwkJICovCisJCXB1YmxpYyBTaW1wbGVUaHJlYWRMaXN0ZW5lcigpCisJCXsKKwkJCW15SGFzRXJyb3JzID0gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICogTGlzdGVuLgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpCisJCXsKKwkJCXRyeQorCQkJeworCQkJCU1haW5UZXN0MUxpc3RlbmVyLm1haW4oIG5ldyBTdHJpbmdbXSB7fSApOworCQkJfQorCQkJY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKQorCQkJeworCQkJCS8vIFNIT1VMRE4nVCBIQVBQRU4hCisJCQkJVGVzdE1haW5UZXN0MUNsaWVudC5wcmludEV4Y2VwdGlvbihlKTsKKworCQkJCW15SGFzRXJyb3JzID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBXZXJlIGFueSBlcnJvcnMgZW5jb3VudGVyZWQ/CisJCSAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkJICovCisJCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpCisJCXsKKwkJCXJldHVybiBteUhhc0Vycm9yczsKKwkJfQorCX0KKworCS8qKgorCSAqIFRocmVhZCBmb3IgcnVubmluZyBhbmQgY29udHJvbGxpbmcgdGhlIE1haW5TZXJ2aWNlTGlzdGVuZXIuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGhyZWFkTGlzdGVuZXIgZXh0ZW5kcyBUaHJlYWQKKwl7CisJCS8qKgorCQkgKiBTaGFyZSB0aGUgbG9jay4KKwkJICovCisJCXByaXZhdGUgTG9jayBvdXJMb2NrOworCisJCS8qKgorCQkgKiBSZWNvcmQgaWYgYW4gZXJyb3IgaGFwcGVucyB3aXRoIHRoZSBsaXN0ZW5lci4KKwkJICovCisJCXByaXZhdGUgYm9vbGVhbiBteUhhc0Vycm9yczsKKworCQkvKioKKwkJICogU2hhcmUgdGhlIGxvY2sgYW5kIHN0YXJ0IG9mZiB3aXRoIG5vIGVycm9ycyBpbiBzaWdodC4KKwkJICogQHBhcmFtIGwgdGhlIGxvY2sKKwkJICovCisJCXB1YmxpYyBUaHJlYWRMaXN0ZW5lcihmaW5hbCBMb2NrIGwpCisJCXsKKwkJCW91ckxvY2sgPSBsOworCQkJbXlIYXNFcnJvcnMgPSBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiBTdGFydCB0aGUgbGlzdGVuZXIsIGxldCBpdCB3YWl0IGFzIHNvbWUgd2F0ZXIgcnVucyB0aHJvdWdoIHRoZSBwaXBlcy4KKwkJICogVGhlbiwgc2lnbmFsIHRvIHRoZSBjbGllbnQgdG8gc3RhcnQuIFdhaXQgZm9yIHRoZSBjbGllbnQgdG8gc2lnbmFsCisJCSAqIGl0J3MgZGVhdGguIEZpbmFsbHksIGNsZWFudXAgdGhlIGxpc3RlbmVyLgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpCisJCXsKKwkJCS8vIDAuIFN0YXJ0IHRoZSBMaXN0ZW5lci4KKwkJCW91ckxvY2suZ2V0TG9jaygwKTsKKwkJCWZpbmFsIFNpbXBsZVRocmVhZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNpbXBsZVRocmVhZExpc3RlbmVyKCk7CisJCQlsaXN0ZW5lci5zdGFydCgpOworCQkJb3VyTG9jay5yZWxlYXNlTG9jaygwKTsKKworCQkJLy8gMS4gTWVhbndoaWxlLCBiYWNrIG9uIHRoZSByYW5jaC4uLiBBIG5ldyBDbGllbnQgaXMgYm9ybi4gQW5kCisJCQkvLyBraWxsZWQuICBMb25nIGxpdmUgdGhlIGNsaWVudCEKKworCQkJLy8gMi4gSGFyc2hseSBzdG9wIHRoZSBsaXN0ZW5lciBhbmQgaWdub3JlIGl0cyB3aGluaW5nLgorCQkJb3VyTG9jay5nZXRMb2NrKDIpOworCQkJdHJ5CisJCQl7CisJCQkJbXlIYXNFcnJvcnMgPSBsaXN0ZW5lci5oYXNFcnJvcnMoKTsKKwkJCQlsaXN0ZW5lci53YWl0KDEpOworCQkJfQorCQkJY2F0Y2goZmluYWwgRXhjZXB0aW9uIGUpCisJCQl7CisJCQkJLy8gRG8gbm90aGluZy4gV2UgYmVhdCB0aGUgbGlzdGVuZXIgaW50byBzdWJtaXNzaW9uLgorCQkJfQorCQkJb3VyTG9jay5yZWxlYXNlTG9jaygyKTsKKwkJfQorCisJCS8qKgorCQkgKiBXZXJlIGFueSBlcnJvcnMgZW5jb3VudGVyZWQ/CisJCSAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkJICovCisJCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpCisJCXsKKwkJCXJldHVybiBteUhhc0Vycm9yczsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RNYWluVGVzdDFMaXN0ZW5lci5qYXZhIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdE1haW5UZXN0MUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiMjU2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RNYWluVGVzdDFMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgZm9yIHByb3BlciBnZW5lcmF0aW9uIG9mIGEgTWFpbltTZXJ2aWNlXUxpc3RlbmVycy4KKyAqLworcHVibGljIGNsYXNzIFRlc3RNYWluVGVzdDFMaXN0ZW5lcgoreworCS8vIFRlc3RzCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLwkvKioKKy8vCSAqIFJ1biB0aGUgTGlzdGVuZXIuCisvLwkgKi8KKy8qCUBUZXN0CisJcHVibGljIHZvaWQgbWFpbk1ldGhvZCgpCisJeworCQlMaXN0ZW5lclRocmVhZCBtID0gbmV3IExpc3RlbmVyVGhyZWFkKCk7CisJCW0ucnVuKCk7CisKKwkJdHJ5CisJCXsKKwkJCW0uam9pbigxMDAwKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpCisJCXsKKwkJfQorCisJCWlmIChtLmhhc0Vycm9ycygpKQorCQkJZmFpbCgpOworCX0KKwkqLworCisJLyoqCisJICogQ2FsbCBuZXdUZXN0U2VydmVyLgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbmV3VGVzdFNlcnZlck1ldGhvZCgpCisJeworCQlNYWluVGVzdDFMaXN0ZW5lciBtID0gbmV3IE1haW5UZXN0MUxpc3RlbmVyKCk7CisJCU9iamVjdCBvID0gbS5uZXdUZXN0MVNlcnZlcihudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbCggbyApOworCQlhc3NlcnRUcnVlKCBvIGluc3RhbmNlb2YgSW1wbFRlc3QxU2VydmVyICk7CisJCWFzc2VydFRydWUoIG8gaW5zdGFuY2VvZiBCYXNlVGVzdDFTZXJ2ZXIgKTsKKwl9CisKKwkvLyBIZWxwZXJzCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLwkvKioKKy8vCSAqIFByaW50cyBleGNlcHRpb24gaW5mbyB0byBzdGRlcnIgaW4gYSBtb3N0IGRlc2NyaXB0aXZlIHdheS4KKy8vCSAqIEBwYXJhbSBlIHRoZSBleGNlcHRpb24gdG8gcHJpbnQKKy8vCSAqLworLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludEV4Y2VwdGlvbihmaW5hbCBFeGNlcHRpb24gZSkKKy8vCXsKKy8vCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKy8vCX0KKworLy8JLyoqCisvLwkgKiBTaW1wbGUgdGhyZWFkIGNsYXNzIGZvciBjYWxsaW5nIG1haW4gYW5kIGhhdmluZyBhbGwgb2YgVGhyZWFkJ3MgbWV0aG9kcy4KKy8vCSAqLworLy8JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdGVuZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQKKy8vCXsKKy8vCQkvKioKKy8vCQkgKiBmYWxzZSB1bnRpbCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnMuCisvLwkJICovCisvLwkJcHJpdmF0ZSBib29sZWFuIG15SGFzRXJyb3JzOworLy8KKy8vCQkvKioKKy8vCQkgKiBTdGFydCBvZmYgd2l0aCBubyBlcnJvcnMuCisvLwkJICovCisvLwkJcHVibGljIExpc3RlbmVyVGhyZWFkKCkKKy8vCQl7CisvLwkJCW15SGFzRXJyb3JzID0gZmFsc2U7CisvLwkJfQorLy8KKy8vCQkvKioKKy8vCQkgKiBHbyBhdCBpdC4KKy8vCQkgKi8KKy8vCQlwdWJsaWMgdm9pZCBydW4oKQorLy8JCXsKKy8vCQkJdHJ5CisvLwkJCXsKKy8vCQkJCU1haW5UZXN0TGlzdGVuZXIubWFpbihudWxsKTsKKy8vCQkJfQorLy8JCQljYXRjaCAoRXhjZXB0aW9uIGUpCisvLwkJCXsKKy8vCQkJCXByaW50RXhjZXB0aW9uKGUpOworLy8JCQkJbXlIYXNFcnJvcnMgPSB0cnVlOworLy8JCQl9CisvLwkJfQorLy8KKy8vCQkvKioKKy8vCQkgKiBXZXJlIGFueSBlcnJvcnMgZW5jb3VudGVyZWQ/CisvLwkJICogQHJldHVybiB0cnVlIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorLy8JCSAqLworLy8JCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpCisvLwkJeworLy8JCQlyZXR1cm4gdGhpcy5teUhhc0Vycm9yczsKKy8vCQl9CisvLwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0TWl4aW4uamF2YSBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RNaXhpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OGZhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0TWl4aW4uamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5WYWx1ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWZhdWx0VmFsdWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuQmFyRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmF6LkJhekRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvby5Gb29EYXRhOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKiBUZXN0IG9mIG1peGluICovCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBjbGFzcyBUZXN0TWl4aW4KK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCYXooKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmF6IGJheiA9IG51bGw7CisJCWlmIChiYXogIT0gbnVsbCkKKwkJeworCQkJYmF6LmJhejEoIGJhekRhdGEgKTsKKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCYXpDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmF6Q2xpZW50IGJhekNsaWVudCA9IG51bGw7CisJCWlmIChiYXpDbGllbnQgIT0gbnVsbCkKKwkJeworCQkJYmF6Q2xpZW50LmJhejEoIGJhekRhdGEgKTsKKwkJCWJhekNsaWVudC5iYXozKCBiYXpEYXRhICk7CisJCX0KKwkJCisJCUJheiBiYXogPSBiYXpDbGllbnQ7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJhelNlcnZlcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUJhekRhdGEgYmF6RGF0YSA9IG51bGw7CisJCQorCQlCYXpTZXJ2ZXIgYmF6U2VydmVyID0gbnVsbDsKKwkJaWYgKGJhelNlcnZlciAhPSBudWxsKQorCQl7CisJCQliYXpTZXJ2ZXIuYmF6MSggYmF6RGF0YSApOworCQkJYmF6U2VydmVyLmJhejIoIGJhekRhdGEgKTsKKwkJfQorCQkKKwkJQmF6IGJheiA9IGJhelNlcnZlcjsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QmFyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQmFyRGF0YSBiYXJEYXRhID0gbnVsbDsKKwkJQmF6RGF0YSBiYXpEYXRhID0gbnVsbDsKKwkJCisJCUJhciBiYXIgPSBudWxsOworCQlpZiAoYmFyICE9IG51bGwpCisJCXsKKwkJCWJhci5iYXIxKCBiYXJEYXRhICk7CisJCQliYXIuYmF6MSggYmF6RGF0YSApOworCQl9CisJCQorCQlCYXogYmF6ID0gYmFyOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCYXJDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlCYXJEYXRhIGJhckRhdGEgPSBudWxsOworCQlCYXpEYXRhIGJhekRhdGEgPSBudWxsOworCQkKKwkJQmFyQ2xpZW50IGJhckNsaWVudCA9IG51bGw7CisJCWlmIChiYXJDbGllbnQgIT0gbnVsbCkKKwkJeworCQkJYmFyQ2xpZW50LmJhcjEoIGJhckRhdGEgKTsKKwkJCWJhckNsaWVudC5iYXIzKCBiYXJEYXRhICk7CisJCQliYXJDbGllbnQuYmF6MSggYmF6RGF0YSApOworCQkJYmFyQ2xpZW50LmJhejMoIGJhekRhdGEgKTsKKwkJfQorCisJCUJhekNsaWVudCBiYXpDbGllbnQgPSBiYXJDbGllbnQ7CisJCUJhciBiYXIgPSBiYXJDbGllbnQ7CisJCUJheiBiYXogPSBiYXJDbGllbnQ7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJhclNlcnZlcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUJhckRhdGEgYmFyRGF0YSA9IG51bGw7CisJCUJhekRhdGEgYmF6RGF0YSA9IG51bGw7CisJCQorCQlCYXJTZXJ2ZXIgYmFyU2VydmVyID0gbnVsbDsKKwkJaWYgKGJhclNlcnZlciAhPSBudWxsKQorCQl7CisJCQliYXJTZXJ2ZXIuYmFyMSggYmFyRGF0YSApOworCQkJYmFyU2VydmVyLmJhcjIoIGJhckRhdGEgKTsKKwkJCWJhclNlcnZlci5iYXoxKCBiYXpEYXRhICk7CisJCQliYXJTZXJ2ZXIuYmF6MiggYmF6RGF0YSApOworCQl9CisKKwkJQmF6U2VydmVyIGJhelNlcnZlciA9IGJhclNlcnZlcjsKKwkJQmFyIGJhciA9IGJhclNlcnZlcjsKKwkJQmF6IGJheiA9IGJhclNlcnZlcjsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Rm9vKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRm9vRGF0YSBmb29EYXRhID0gbnVsbDsKKwkJQmFyRGF0YSBiYXJEYXRhID0gbnVsbDsKKwkJQmF6RGF0YSBiYXpEYXRhID0gbnVsbDsKKwkJCisJCUZvbyBmb28gPSBudWxsOworCQlpZiAoZm9vICE9IG51bGwpCisJCXsKKwkJCWZvby5mb28xKCBmb29EYXRhICk7CisJCQlmb28uYmFyMSggYmFyRGF0YSApOworCQkJZm9vLmJhejEoIGJhekRhdGEgKTsKKwkJfQorCQkKKwkJQmFyIGJhciA9IGZvbzsKKwkJQmF6IGJheiA9IGZvbzsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Rm9vQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRm9vRGF0YSBmb29EYXRhID0gbnVsbDsKKwkJQmFyRGF0YSBiYXJEYXRhID0gbnVsbDsKKwkJQmF6RGF0YSBiYXpEYXRhID0gbnVsbDsKKwkJCisJCUZvb0NsaWVudCBmb29DbGllbnQgPSBudWxsOworCQlpZiAoZm9vQ2xpZW50ICE9IG51bGwpCisJCXsKKwkJCWZvb0NsaWVudC5mb28xKCBmb29EYXRhICk7CisJCQlmb29DbGllbnQuZm9vMyggZm9vRGF0YSApOworCQkJZm9vQ2xpZW50LmJhcjEoIGJhckRhdGEgKTsKKwkJCWZvb0NsaWVudC5iYXIzKCBiYXJEYXRhICk7CisJCQlmb29DbGllbnQuYmF6MSggYmF6RGF0YSApOworCQkJZm9vQ2xpZW50LmJhejMoIGJhekRhdGEgKTsKKwkJfQorCQkKKwkJQmFyQ2xpZW50IGJhckNsaWVudCA9IGZvb0NsaWVudDsKKwkJQmF6Q2xpZW50IGJhekNsaWVudCA9IGZvb0NsaWVudDsKKwkJRm9vIGZvbyA9IGZvb0NsaWVudDsKKwkJQmFyIGJhciA9IGZvb0NsaWVudDsKKwkJQmF6IGJheiA9IGZvb0NsaWVudDsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Rm9vU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRm9vRGF0YSBmb29EYXRhID0gbnVsbDsKKwkJQmFyRGF0YSBiYXJEYXRhID0gbnVsbDsKKwkJQmF6RGF0YSBiYXpEYXRhID0gbnVsbDsKKwkJCisJCUZvb1NlcnZlciBmb29TZXJ2ZXIgPSBudWxsOworCQlpZiAoZm9vU2VydmVyICE9IG51bGwpCisJCXsKKwkJCWZvb1NlcnZlci5mb28xKCBmb29EYXRhICk7CisJCQlmb29TZXJ2ZXIuZm9vMiggZm9vRGF0YSApOworCQkJZm9vU2VydmVyLmJhcjEoIGJhckRhdGEgKTsKKwkJCWZvb1NlcnZlci5iYXIyKCBiYXJEYXRhICk7CisJCQlmb29TZXJ2ZXIuYmF6MSggYmF6RGF0YSApOworCQkJZm9vU2VydmVyLmJhejIoIGJhekRhdGEgKTsKKwkJfQorCQkKKwkJQmFyU2VydmVyIGJhclNlcnZlciA9IGZvb1NlcnZlcjsKKwkJQmF6U2VydmVyIGJhelNlcnZlciA9IGZvb1NlcnZlcjsKKwkJRm9vIGZvbyA9IGZvb1NlcnZlcjsKKwkJQmFyIGJhciA9IGZvb1NlcnZlcjsKKwkJQmF6IGJheiA9IGZvb1NlcnZlcjsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVGYWN0b3J5QmF6R2V0VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlEZWZhdWx0VmFsdWVGYWN0b3J5IHZmID0gbmV3IFZhbHVlRmFjdG9yeUJheiggInRjcDoiICk7CisJCVNldDxUeXBlPiBhdHlwZXMgPSB2Zi5nZXRUeXBlcygpOworCQkKKwkJU2V0PFR5cGU+IGV0eXBlcyA9IG5ldyBIYXNoU2V0PFR5cGU+KCk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9SdW50aW1lRXhjZXB0aW9uKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19FdGNoX0xpc3QoKSApOworCQlldHlwZXMuYWRkKCB2Zi5nZXRfbXRfX0V0Y2hfTWFwKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19FdGNoX1NldCgpICk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9EYXRldGltZSgpICk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9BdXRoRXhjZXB0aW9uKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19FdGNoX0F1dGhFeGNlcHRpb24oKSApOworCQlldHlwZXMuYWRkKCB2Zi5nZXRfbXRfX2V4Y2VwdGlvbigpICk7CisJCQorCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfQmF6VGFibGUgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X0JhekRhdGEgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X2JhejEgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X19yZXN1bHRfYmF6MSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfYmF6MiApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfX3Jlc3VsdF9iYXoyICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9iYXozICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9fcmVzdWx0X2JhejMgKTsKKwkJCisJCWFzc2VydEVxdWFscyggZXR5cGVzLCBhdHlwZXMgKTsKKwkJZm9yIChUeXBlIHR5cGU6IGV0eXBlcyApCisJCQl0ZXN0R2V0VHlwZSggdmYsIHR5cGUgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3RHZXRUeXBlKCBWYWx1ZUZhY3RvcnkgdmYsIFR5cGUgdHlwZSApCisJeworCQlhc3NlcnRTYW1lKCB0eXBlLCB2Zi5nZXRUeXBlKCB0eXBlLmdldElkKCkgKSApOworCQlhc3NlcnRTYW1lKCB0eXBlLCB2Zi5nZXRUeXBlKCB0eXBlLmdldE5hbWUoKSApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVGYWN0b3J5QmFyR2V0VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlEZWZhdWx0VmFsdWVGYWN0b3J5IHZmID0gbmV3IFZhbHVlRmFjdG9yeUJhciggInRjcDoiICk7CisJCVNldDxUeXBlPiBhdHlwZXMgPSB2Zi5nZXRUeXBlcygpOworCQkKKwkJU2V0PFR5cGU+IGV0eXBlcyA9IG5ldyBIYXNoU2V0PFR5cGU+KCk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9SdW50aW1lRXhjZXB0aW9uKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19FdGNoX0xpc3QoKSApOworCQlldHlwZXMuYWRkKCB2Zi5nZXRfbXRfX0V0Y2hfTWFwKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19FdGNoX1NldCgpICk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9EYXRldGltZSgpICk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9BdXRoRXhjZXB0aW9uKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19leGNlcHRpb24oKSApOworCQkKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X0JhelRhYmxlICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9CYXpEYXRhICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9iYXoxICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9fcmVzdWx0X2JhejEgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X2JhejIgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X19yZXN1bHRfYmF6MiApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfYmF6MyApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfX3Jlc3VsdF9iYXozICk7CisJCQorCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfQmFyVGFibGUgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX0JhckRhdGEgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX2JhcjEgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX19yZXN1bHRfYmFyMSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfYmFyMiApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfX3Jlc3VsdF9iYXIyICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9iYXIzICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9fcmVzdWx0X2JhcjMgKTsKKwkJCisJCWFzc2VydEVxdWFscyggZXR5cGVzLCBhdHlwZXMgKTsKKwkJZm9yIChUeXBlIHR5cGU6IGV0eXBlcyApCisJCQl0ZXN0R2V0VHlwZSggdmYsIHR5cGUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVGYWN0b3J5Rm9vR2V0VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlEZWZhdWx0VmFsdWVGYWN0b3J5IHZmID0gbmV3IFZhbHVlRmFjdG9yeUZvbyggInRjcDoiICk7CisJCVNldDxUeXBlPiBhdHlwZXMgPSB2Zi5nZXRUeXBlcygpOworCQkKKwkJU2V0PFR5cGU+IGV0eXBlcyA9IG5ldyBIYXNoU2V0PFR5cGU+KCk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9SdW50aW1lRXhjZXB0aW9uKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19FdGNoX0xpc3QoKSApOworCQlldHlwZXMuYWRkKCB2Zi5nZXRfbXRfX0V0Y2hfTWFwKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19FdGNoX1NldCgpICk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9EYXRldGltZSgpICk7CisJCWV0eXBlcy5hZGQoIHZmLmdldF9tdF9fRXRjaF9BdXRoRXhjZXB0aW9uKCkgKTsKKwkJZXR5cGVzLmFkZCggdmYuZ2V0X210X19leGNlcHRpb24oKSApOworCisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9CYXpUYWJsZSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfQmF6RGF0YSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfYmF6MSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXouX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXpfX3Jlc3VsdF9iYXoxICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9iYXoyICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhei5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhel9fcmVzdWx0X2JhejIgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X2JhejMgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmF6Ll9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmF6X19yZXN1bHRfYmF6MyApOworCisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9CYXJUYWJsZSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfQmFyRGF0YSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfYmFyMSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlCYXIuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19CYXJfX3Jlc3VsdF9iYXIxICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9iYXIyICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUJhci5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Jhcl9fcmVzdWx0X2JhcjIgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX2JhcjMgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5QmFyLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfQmFyX19yZXN1bHRfYmFyMyApOworCisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUZvby5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Zvb19Gb29UYWJsZSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlGb28uX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19Gb29fRm9vRGF0YSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlGb28uX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19Gb29fZm9vMSApOworCQlldHlwZXMuYWRkKCBWYWx1ZUZhY3RvcnlGb28uX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19Gb29fX3Jlc3VsdF9mb28xICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUZvby5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Zvb19mb28yICk7CisJCWV0eXBlcy5hZGQoIFZhbHVlRmFjdG9yeUZvby5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX0Zvb19fcmVzdWx0X2ZvbzIgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5Rm9vLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfRm9vX2ZvbzMgKTsKKwkJZXR5cGVzLmFkZCggVmFsdWVGYWN0b3J5Rm9vLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfRm9vX19yZXN1bHRfZm9vMyApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBldHlwZXMsIGF0eXBlcyApOworCQlmb3IgKFR5cGUgdHlwZTogZXR5cGVzICkKKwkJCXRlc3RHZXRUeXBlKCB2ZiwgdHlwZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGR1cGxpY2F0ZXNBcmVUaGVTYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCBuZXcgVmFsdWVGYWN0b3J5QmF6KCAidGNwOiIgKS5nZXRUeXBlcygpLCBuZXcgVmFsdWVGYWN0b3J5QmF6KCAidGNwOiIgKS5nZXRUeXBlcygpICk7CisJCWFzc2VydEVxdWFscyggbmV3IFZhbHVlRmFjdG9yeUJhciggInRjcDoiICkuZ2V0VHlwZXMoKSwgbmV3IFZhbHVlRmFjdG9yeUJhciggInRjcDoiICkuZ2V0VHlwZXMoKSApOworCQlhc3NlcnRFcXVhbHMoIG5ldyBWYWx1ZUZhY3RvcnlGb28oICJ0Y3A6IiApLmdldFR5cGVzKCksIG5ldyBWYWx1ZUZhY3RvcnlGb28oICJ0Y3A6IiApLmdldFR5cGVzKCkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0TWl4aW5YbWwuamF2YSBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RNaXhpblhtbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjYxYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0TWl4aW5YbWwuamF2YQpAQCAtMCwwICsxLDk0MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworCisvKiogKi8KK3B1YmxpYyBjbGFzcyBUZXN0TWl4aW5YbWwgCit7CisKKwlEb2N1bWVudCBkb2N1bWVudDsKKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBMb2FkIFRlc3QueG1sIGludG8gRE9NCisJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkvL1N0cmluZyB1c2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworCQl0cnkKKwkJeworCQkJRmlsZSBmID0gbmV3IEZpbGUoInRlc3RzL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9tYWluL2V0Y2gveG1sL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9Gb28ueG1sIik7CisJCQkKKwkJCWRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShmKTsKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gbG9hZCBUZXN0LnhtbCBkb2N1bWVudDogIiArIGUpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IGRpciBpcyAiK25ldyBGaWxlKCIuIiApLmdldEFic29sdXRlUGF0aCgpICk7CisJCQlhc3NlcnRUcnVlKCBmYWxzZSApOworCQl9CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQEFmdGVyCisJcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdW5sb2FkIFRlc3QueG1sIAorCQlkb2N1bWVudCA9IG51bGw7CisJfQorCisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtb2R1bGUiKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCAxKTsKKwkJCisJCVN0cmluZyBtb2R1bGVOYW1lID0gbGlzdC5pdGVtKDApLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKG1vZHVsZU5hbWUsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMiKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShsaXN0Lml0ZW0oMCksIG5ldyBTdHJpbmdbXSB7Im5hbWUifSkpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGxpc3QuaXRlbSgwKSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24iLCAic2VydmljZSJ9KSk7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KGxpc3QuaXRlbSgwKSk7CisJCWFzc2VydE51bGwoY2hpbGQpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VydmljZSIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0TGVuZ3RoKCksIDEpOworCQkKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gbGlzdC5pdGVtKDApLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHNlcnZpY2VOYW1lLCAiRm9vIik7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobGlzdC5pdGVtKDApLCBuZXcgU3RyaW5nW10geyJuYW1lIn0pKTsKKwkJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUobGlzdC5pdGVtKDApLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiIsICJjb25zdHMiLCAiZXh0ZXJucyIsICJlbnVtcyIsICJzdHJ1Y3RzIiwgImV4Y2VwdGlvbnMiLCAibWV0aG9kcyJ9KSk7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KGxpc3QuaXRlbSgwKSk7CisJCWFzc2VydE51bGwoY2hpbGQpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdmVyaWZ5IGNvbnN0cworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvbnN0Iik7CisJCQorCQkvLyBubyBjb25zdHMKKwkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0TGVuZ3RoKCksIDApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJucygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHZlcmlmeSBjb25zdHMKKwkJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJleHRlcm4iKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCAzKTsKKwkJCisJCWludCBub2RlQ291bnQgPSAwOworCQkKKwkJTm9kZSBleHRlcm5Ob2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrRXh0ZXJuUHJvcGVydGllcyhleHRlcm5Ob2RlLCAiRm9vVGFibGUiLCAiLTE0MDQ4MDYyMzQiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvby5Gb29UYWJsZSIpOworCQljaGVja0V4dGVybk1hcFByb3BlcnRpZXMoZXh0ZXJuTm9kZSwgImphdmEiLCAib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJTdHJIYXNoTWFwIiwgIiIsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLlN0clN0ckhhc2hNYXBTZXJpYWxpemVyIiwgICIiKTsKKwkJCisJCWV4dGVybk5vZGUgPSBsaXN0Lml0ZW0oIG5vZGVDb3VudCsrICk7CisJCWNoZWNrRXh0ZXJuUHJvcGVydGllcyhleHRlcm5Ob2RlLCAiQmF6VGFibGUiLCAiNzI5NjQ3MTAwIiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouQmF6VGFibGUiKTsKKwkJY2hlY2tFeHRlcm5NYXBQcm9wZXJ0aWVzKGV4dGVybk5vZGUsICJqYXZhIiwgIm9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuU3RyU3RySGFzaE1hcCIsICIiLCAib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJTdHJIYXNoTWFwU2VyaWFsaXplciIsICAiIik7CisJCQorCQlleHRlcm5Ob2RlID0gbGlzdC5pdGVtKCBub2RlQ291bnQrKyApOworCQljaGVja0V4dGVyblByb3BlcnRpZXMoZXh0ZXJuTm9kZSwgIkJhclRhYmxlIiwgIi0yNzg2MzE0MTIiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhci5CYXJUYWJsZSIpOworCQljaGVja0V4dGVybk1hcFByb3BlcnRpZXMoZXh0ZXJuTm9kZSwgImphdmEiLCAib3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudXRpbC5TdHJTdHJIYXNoTWFwIiwgIiIsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLlN0clN0ckhhc2hNYXBTZXJpYWxpemVyIiwgICIiKTsKKwl9CisJCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFbnVtcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHZlcmlmeSBlbnVtcworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVudW0iKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCAwKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdFN0cnVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgc3RydWN0cworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0cnVjdCIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0TGVuZ3RoKCksIDMpOworCQkKKwkJaW50IG5vZGVDb3VudCA9IDA7CisJCQorCQlOb2RlIHN0cnVjdE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tTdHJ1Y3RQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJGb29EYXRhIiwgIi04Njk4MzQzOCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuRm9vLkZvb0RhdGEiLCAibnVsbCIsIG51bGwpOworCQljaGVja1N0cnVjdFZhbHVlUHJvcGVydGllcyhzdHJ1Y3ROb2RlLCAiY29kZSIsICItMzI1NTUxMTUwIiwgImNvZGUiLCAiaW50IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJY2hlY2tTdHJ1Y3RWYWx1ZVByb3BlcnRpZXMoc3RydWN0Tm9kZSwgImZvb1RhYmxlIiwgIi05MDA2MjgzNzEiLCAiZm9vVGFibGUiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvby5Gb29UYWJsZSIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQljaGVja1N0cnVjdFZhbHVlUHJvcGVydGllcyhzdHJ1Y3ROb2RlLCAiYmFyRGF0YSIsICItNzgwNzI4MzI4IiwgImJhckRhdGEiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhci5CYXJEYXRhIiwgImZhbHNlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJiYXpEYXRhIiwgIi0yNTQxNDg2MDgiLCAiYmF6RGF0YSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmF6LkJhekRhdGEiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJCisJCQorCQkKKwkJc3RydWN0Tm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja1N0cnVjdFByb3BlcnRpZXMoc3RydWN0Tm9kZSwgIkJhekRhdGEiLCAiNDY3MjEzMDg0IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouQmF6RGF0YSIsICJudWxsIiwgbnVsbCk7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJjb2RlIiwgIi0zMjU1NTExNTAiLCAiY29kZSIsICJpbnQiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJY2hlY2tTdHJ1Y3RWYWx1ZVByb3BlcnRpZXMoc3RydWN0Tm9kZSwgImJhelRhYmxlIiwgIjIwNzM2ODA5MjAiLCAiYmF6VGFibGUiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhei5CYXpUYWJsZSIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJc3RydWN0Tm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja1N0cnVjdFByb3BlcnRpZXMoc3RydWN0Tm9kZSwgIkJhckRhdGEiLCAiMTY3MTk2NzUwMCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmFyLkJhckRhdGEiLCAibnVsbCIsIG51bGwpOworCQljaGVja1N0cnVjdFZhbHVlUHJvcGVydGllcyhzdHJ1Y3ROb2RlLCAiY29kZSIsICItMzI1NTUxMTUwIiwgImNvZGUiLCAiaW50IiwgImZhbHNlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJiYXJUYWJsZSIsICItOTAyMzc2OTI4IiwgImJhclRhYmxlIiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuQmFyVGFibGUiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJY2hlY2tTdHJ1Y3RWYWx1ZVByb3BlcnRpZXMoc3RydWN0Tm9kZSwgImJhekRhdGEiLCAiLTI1NDE0ODYwOCIsICJiYXpEYXRhIiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouQmF6RGF0YSIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJCisJCQorCX0KKwkJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGV4dEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgZXhjZXB0aW9ucworCQlOb2RlTGlzdCBleGNlcHRpb25zTm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZXhjZXB0aW9ucyIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGV4Y2VwdGlvbnNOb2RlTGlzdC5nZXRMZW5ndGgoKSwgMSk7CisJCQorCQlOb2RlIGV4Y2VwdGlvbnNOb2RlID0gZXhjZXB0aW9uc05vZGVMaXN0Lml0ZW0oMCk7CisJCQorCQlBcnJheUxpc3Q8Tm9kZT5saXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworCQkJCisJCU5vZGVMaXN0IGV4Y2VwdGlvbnNOb2RlQ2hpbGRyZW4gPSBleGNlcHRpb25zTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zTm9kZUNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWlmKGV4Y2VwdGlvbnNOb2RlQ2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpID09ICJleGNlcHRpb24iKQorCQkJeworCQkJCWxpc3QuYWRkKGV4Y2VwdGlvbnNOb2RlQ2hpbGRyZW4uaXRlbShpKSk7CisJCQl9CisJCX0KKwkJCisJCQorCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCksIDApOworCQkKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdE1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgbWV0aG9kcworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZCIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDE4LCBsaXN0LmdldExlbmd0aCgpICk7CisJCQorCQlpbnQgbm9kZUNvdW50ID0gMDsKKwkJCisJCU5vZGUgbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJmb28xIiwgIjIxMDcwOTYyMzMiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvby5mb28xIiwgIm5vbmUiLCAiZmFsc2UiLCAiYm90aCIsIG51bGwsIG51bGwsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImZvb0RhdGEiLCAiLTE3OTg2Mzc5NzMiLCAiZm9vRGF0YSIsIAorCQkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuRm9vLkZvb0RhdGEiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjIyMjA0NDkwOCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuRm9vLl9yZXN1bHRfZm9vMSIsICJib29sZWFuIiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9mb28xIiwgIjIyMjA0NDkwOCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuRm9vLl9yZXN1bHRfZm9vMSIsIAorCQkJCSJub25lIiwgInRydWUiLCAiYm90aCIsICIwIiwgbnVsbCwgInJlc3VsdCIpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInJlc3VsdCIsICItMjEzMDM3OTMyNiIsICJyZXN1bHQiLAorCQkJCSJib29sZWFuIiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJmb28yIiwgIjIxMDcwOTYyMzQiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvby5mb28yIiwgIm5vbmUiLCAiZmFsc2UiLCAic2VydmVyIiwgbnVsbCwgCisJCQkJbnVsbCwgbnVsbCk7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAiZm9vRGF0YSIsICItMTc5ODYzNzk3MyIsICJmb29EYXRhIiwgCisJCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Gb28uRm9vRGF0YSIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQljaGVja1Jlc3VsdChtZXRob2ROb2RlLCAiMjIyMDQ0OTA5IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Gb28uX3Jlc3VsdF9mb28yIiwgImJvb2xlYW4iLCAidHJ1ZSIsICAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9mb28yIiwgIjIyMjA0NDkwOSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuRm9vLl9yZXN1bHRfZm9vMiIsIAorCQkJCSJub25lIiwgInRydWUiLCAiY2xpZW50IiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsCisJCQkJImJvb2xlYW4iLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImZvbzMiLCAiMjEwNzA5NjIzNSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuRm9vLmZvbzMiLCAibm9uZSIsICJmYWxzZSIsICJjbGllbnQiLCBudWxsLCBudWxsLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJmb29EYXRhIiwgIi0xNzk4NjM3OTczIiwgImZvb0RhdGEiLCAKKwkJCQkib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvby5Gb29EYXRhIiwgImZhbHNlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICIyMjIwNDQ5MTAiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkZvby5fcmVzdWx0X2ZvbzMiLCAiYm9vbGVhbiIsICAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJfcmVzdWx0X2ZvbzMiLCAiMjIyMDQ0OTEwIiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5Gb28uX3Jlc3VsdF9mb28zIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJzZXJ2ZXIiLCAiMCIsIG51bGwsICJyZXN1bHQiKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJyZXN1bHQiLCAiLTIxMzAzNzkzMjYiLCAicmVzdWx0IiwKKwkJCQkiYm9vbGVhbiIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiYmF6MSIsICIxODQ0MTE3MjQ3IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouYmF6MSIsICJub25lIiwgImZhbHNlIiwgImJvdGgiLCBudWxsLCAiTWV0aG9kIEJhejEgKiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImJhekRhdGEiLCAiLTI1NDE0ODYwOCIsICJiYXpEYXRhIiwgCisJCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouQmF6RGF0YSIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQljaGVja1Jlc3VsdChtZXRob2ROb2RlLCAiLTE3NzM0NDk0MDYiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhei5fcmVzdWx0X2JhejEiLCAiYm9vbGVhbiIsICAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJfcmVzdWx0X2JhejEiLCAiLTE3NzM0NDk0MDYiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhei5fcmVzdWx0X2JhejEiLCAKKwkJCQkibm9uZSIsICJ0cnVlIiwgImJvdGgiLCAiMCIsIG51bGwsICJyZXN1bHQiKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJyZXN1bHQiLCAiLTIxMzAzNzkzMjYiLCAicmVzdWx0IiwKKwkJCQkiYm9vbGVhbiIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiYmF6MiIsICIxODQ0MTE3MjQ4IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouYmF6MiIsICJub25lIiwgImZhbHNlIiwgInNlcnZlciIsIG51bGwsICJNZXRob2QgQmF6MiAqIiwgbnVsbCk7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAiYmF6RGF0YSIsICItMjU0MTQ4NjA4IiwgImJhekRhdGEiLCAKKwkJCQkib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhei5CYXpEYXRhIiwgImZhbHNlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICItMTc3MzQ0OTQwNSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmF6Ll9yZXN1bHRfYmF6MiIsICJib29sZWFuIiwgICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfYmF6MiIsICItMTc3MzQ0OTQwNSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmF6Ll9yZXN1bHRfYmF6MiIsIAorCQkJCSJub25lIiwgInRydWUiLCAiY2xpZW50IiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsCisJCQkJImJvb2xlYW4iLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImJhejMiLCAiMTg0NDExNzI0OSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmF6LmJhejMiLCAibm9uZSIsICJmYWxzZSIsICJjbGllbnQiLCBudWxsLCAiTWV0aG9kIEJhejMgKiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImJhekRhdGEiLCAiLTI1NDE0ODYwOCIsICJiYXpEYXRhIiwgCisJCQkJIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXouQmF6RGF0YSIsICJmYWxzZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQljaGVja1Jlc3VsdChtZXRob2ROb2RlLCAiLTE3NzM0NDk0MDQiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhei5fcmVzdWx0X2JhejMiLCAiYm9vbGVhbiIsICAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJfcmVzdWx0X2JhejMiLCAiLTE3NzM0NDk0MDQiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhei5fcmVzdWx0X2JhejMiLCAKKwkJCQkibm9uZSIsICJ0cnVlIiwgInNlcnZlciIsICIwIiwgbnVsbCwgInJlc3VsdCIpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgInJlc3VsdCIsICItMjEzMDM3OTMyNiIsICJyZXN1bHQiLAorCQkJCSJib29sZWFuIiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJCisJCQorCQkKKwkJCisJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiYmFyMSIsICItMTEzMjQ2NTM5MyIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmFyLmJhcjEiLCAibm9uZSIsICJmYWxzZSIsICJib3RoIiwgbnVsbCwgIk1ldGhvZCBCYXIxICoiLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJiYXJEYXRhIiwgIi03ODA3MjgzMjgiLCAiYmFyRGF0YSIsIAorCQkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmFyLkJhckRhdGEiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjM3ODkyOTQ2IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuX3Jlc3VsdF9iYXIxIiwgImJvb2xlYW4iLCAgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9iYXIxIiwgIjM3ODkyOTQ2IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuX3Jlc3VsdF9iYXIxIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAicmVzdWx0IiwgIi0yMTMwMzc5MzI2IiwgInJlc3VsdCIsCisJCQkJImJvb2xlYW4iLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImJhcjIiLCAiLTExMzI0NjUzOTIiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhci5iYXIyIiwgIm5vbmUiLCAiZmFsc2UiLCAic2VydmVyIiwgbnVsbCwgIk1ldGhvZCBCYXIyICoiLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJiYXJEYXRhIiwgIi03ODA3MjgzMjgiLCAiYmFyRGF0YSIsIAorCQkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmFyLkJhckRhdGEiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjM3ODkyOTQ3IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuX3Jlc3VsdF9iYXIyIiwgImJvb2xlYW4iLCAgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9iYXIyIiwgIjM3ODkyOTQ3IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuX3Jlc3VsdF9iYXIyIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJjbGllbnQiLCAiMCIsIG51bGwsICJyZXN1bHQiKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJyZXN1bHQiLCAiLTIxMzAzNzkzMjYiLCAicmVzdWx0IiwKKwkJCQkiYm9vbGVhbiIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKworCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImJhcjMiLCAiLTExMzI0NjUzOTEiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLkJhci5iYXIzIiwgIm5vbmUiLCAiZmFsc2UiLCAiY2xpZW50IiwgbnVsbCwgIk1ldGhvZCBCYXIzICoiLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJiYXJEYXRhIiwgIi03ODA3MjgzMjgiLCAiYmFyRGF0YSIsIAorCQkJCSJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuQmFyLkJhckRhdGEiLCAiZmFsc2UiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjM3ODkyOTQ4IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuX3Jlc3VsdF9iYXIzIiwgImJvb2xlYW4iLCAgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9iYXIzIiwgIjM3ODkyOTQ4IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5CYXIuX3Jlc3VsdF9iYXIzIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJzZXJ2ZXIiLCAiMCIsIG51bGwsICJyZXN1bHQiKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJyZXN1bHQiLCAiLTIxMzAzNzkzMjYiLCAicmVzdWx0IiwKKwkJCQkiYm9vbGVhbiIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tFeHRlcm5Qcm9wZXJ0aWVzKE5vZGUgbm9kZSwgU3RyaW5nIGV4dGVybk5hbWUsIFN0cmluZyB0eXBlSWQsIFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJ0eXBlSWQiLCAidHlwZU5hbWUifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShub2RlLCBuZXcgU3RyaW5nW10geyJleHRlcm5tYXAifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAzKTsKKwkJCisJCVN0cmluZyBuYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUlkQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZUlkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVOYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIGV4dGVybk5hbWUpOworCQlhc3NlcnRFcXVhbHModHlwZUlkQXR0ciwgdHlwZUlkKTsKKwkJYXNzZXJ0RXF1YWxzKHR5cGVOYW1lQXR0ciwgdHlwZU5hbWUpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tFeHRlcm5NYXBQcm9wZXJ0aWVzKE5vZGUgbm9kZSwgU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5JbXBvcnQsIFN0cmluZyBzZXJpYWxpemVyLCBTdHJpbmcgc0ltcG9ydCkKKwl7CisJCU5vZGUgbGFuZ3VhZ2VOb2RlID0gbnVsbDsKKwkJCisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlpZihjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpID09ICJleHRlcm5tYXAiKQorCQkJeworCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRoaXNOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlOb2RlIGxhbmd1YWdlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibGFuZ3VhZ2UiKTsKKwkJCQlTdHJpbmcgdGhpc0xhbmd1YWdlID0gbGFuZ3VhZ2VBdHRyLmdldE5vZGVWYWx1ZSgpOworCQkJCWlmKHRoaXNMYW5ndWFnZS5jb21wYXJlVG8obGFuZ3VhZ2UpID09IDApCisJCQkJeworCQkJCQlsYW5ndWFnZU5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIHZlcmlmeSB0aGF0IHRoZSBsYW5ndWFnZSBub2RlIGV4aXN0cworCQlhc3NlcnROb3ROdWxsKGxhbmd1YWdlTm9kZSk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobGFuZ3VhZ2VOb2RlLCBuZXcgU3RyaW5nW10geyJsYW5ndWFnZSIsICJuYW1lIiwgIm5JbXBvcnQiLCAic2VyaWFsaXplciIsICJzSW1wb3J0In0pKTsKKworCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUobGFuZ3VhZ2VOb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiJ9KSk7CisKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gbGFuZ3VhZ2VOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCA1KTsKKwkJCisJCVN0cmluZyBuYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgbkltcG9ydEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5JbXBvcnQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHNlcmlhbGl6ZXJBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJzZXJpYWxpemVyIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBzSW1wb3J0QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgic0ltcG9ydCIpLmdldE5vZGVWYWx1ZSgpOworCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIG5hbWUKKwkJYXNzZXJ0RXF1YWxzKG5hbWVBdHRyLCBuYW1lKTsKKwkJCisJCS8vIHZlcmlmeSB0aGUgdmFsdWUgb2YgdGhlIGV4dGVybm1hcCBuSW1wb3J0CisJCWFzc2VydEVxdWFscyhuSW1wb3J0QXR0ciwgbkltcG9ydCk7CisJCQorCQkvLyB2ZXJpZnkgdGhlIHZhbHVlIG9mIHRoZSBleHRlcm5tYXAgc2VyaWFsaXplcgorCQlhc3NlcnRFcXVhbHMoc2VyaWFsaXplckF0dHIsIHNlcmlhbGl6ZXIpOworCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIHNJbXBvcnQKKwkJYXNzZXJ0RXF1YWxzKHNJbXBvcnRBdHRyLCBzSW1wb3J0KTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBub2RlcyBoYXZlIHNudWNrIGluCisJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChsYW5ndWFnZU5vZGUpLCAwKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrU3RydWN0UHJvcGVydGllcyhOb2RlIHN0cnVjdE5vZGUsIFN0cmluZyBzdHJ1Y3ROYW1lLCBTdHJpbmcgc3RydWN0VHlwZUlkLCAKKwkJCVN0cmluZyBzdHJ1Y3RUeXBlTmFtZSwgU3RyaW5nIGJhc2VUeXBlTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gc3RydWN0Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUoc3RydWN0Tm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJ0eXBlSWQiLCAidHlwZU5hbWUiLCAiYmFzZVR5cGUifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShzdHJ1Y3ROb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiIsICJmaWVsZCJ9KSk7CisKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IHN0dWZmIGhhcyBzbnVjayBpbnRvIHRoZSBYTUwgYmluZGluZworCQlhc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIDQpOworCQkKKwkJU3RyaW5nIG5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZUlkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVOYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBiYXNlVHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImJhc2VUeXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkvLyB2ZXJpZnkgbmFtZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIHN0cnVjdE5hbWUpOworCQkKKwkJLy8gdmVyaWZ5IHR5cGUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKHR5cGVBdHRyLCBzdHJ1Y3RUeXBlSWQpOworCQkKKwkJLy8gdmVyaWZ5IHZhbHVlIG9mIGNvbnN0YW50CisJCWFzc2VydEVxdWFscyh2YWx1ZUF0dHIsIHN0cnVjdFR5cGVOYW1lKTsKKwkJCisJCWFzc2VydEVxdWFscyhiYXNlVHlwZUF0dHIsIGJhc2VUeXBlTmFtZSk7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KHN0cnVjdE5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKE5vZGUgc3RydWN0Tm9kZSwgU3RyaW5nIHN0cnVjdE5hbWUsIFN0cmluZyBmaWVsZElkLCBTdHJpbmcgZmllbGROYW1lLCAKKwkJU3RyaW5nIHR5cGUsIFN0cmluZyBpc1ByaW1pdGl2ZVR5cGUsIFN0cmluZyBpc0FycmF5LCBTdHJpbmcgZGltZW5zaW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pCisJeworCQlOb2RlIGZpZWxkTm9kZSA9IG51bGw7CisJCQorCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHN0cnVjdE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJaWYoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSA9PSAiZmllbGQiKQorCQkJeworCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRoaXNOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlOb2RlIHZhbHVlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpOworCQkJCVN0cmluZyB0aGlzVmFsdWUgPSB2YWx1ZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisJCQkJaWYodGhpc1ZhbHVlLmNvbXBhcmVUbyhzdHJ1Y3ROYW1lKSA9PSAwKQorCQkJCXsKKwkJCQkJZmllbGROb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdmFsdWUgbm9kZSBleGlzdHMKKwkJYXNzZXJ0Tm90TnVsbChmaWVsZE5vZGUpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJmaWVsZElkIiwgImZpZWxkTmFtZSIsICJ0eXBlIiwgImlzUHJpbWl0aXZlVHlwZSIsCisJCQkiaXNBcnJheSIsICJkaW1lbnNpb24ifSkpOworCisJCS8vdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24ifSkpOworCQkKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gZmllbGROb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJLy8gZGltZW5zaW9uIGF0dHIgaXMgbnVsbGFibGUsIG1lYW5pbmcgaXQgbWlnaHQganVzdCBub3QgYmUgdGhlcmUgaWYgaXNBcnJheSA9ICJmYWxzZSIKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCBpc0FycmF5ID09ICJmYWxzZSIgPyA2IDogNyk7CisJCQorCQlTdHJpbmcgZmllbGRJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGZpZWxkTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGlzQXJyYXlBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc0FycmF5IikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlOb2RlIGRpbWVuc2lvbk5vZGUgPSBhdHRycy5nZXROYW1lZEl0ZW0oImRpbWVuc2lvbiIpOworCQlTdHJpbmcgZGltZW5zaW9uQXR0ciA9IGRpbWVuc2lvbk5vZGUgPT0gbnVsbCA/IGRpbWVuc2lvbiA6IGRpbWVuc2lvbk5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIG5hbWUKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkSWRBdHRyLCBmaWVsZElkKTsKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkTmFtZUF0dHIsIGZpZWxkTmFtZSk7CisJCWFzc2VydEVxdWFscyh0eXBlQXR0ciwgdHlwZSk7CisJCWFzc2VydEVxdWFscyhpc0FycmF5QXR0ciwgaXNBcnJheSk7CisJCWFzc2VydEVxdWFscyhkaW1lbnNpb25BdHRyLCBkaW1lbnNpb24pOworCQkKKwkJTm9kZSBjaGlsZCA9IGdldERlc2NyaXB0aW9uRWxlbWVudChmaWVsZE5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kUHJvcGVydGllcyhOb2RlIG1ldGhvZE5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kSWQsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgcG9vbCwgU3RyaW5nIGlzT25ld2F5LCAKKwkJCVN0cmluZyBkaXJlY3Rpb24sIFN0cmluZyB0aW1lb3V0LCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyByZXN1bHQgKQorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gbWV0aG9kTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCWJvb2xlYW4gaXNSZXN1bHRNZXNzYWdlID0gZmFsc2U7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobWV0aG9kTm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJ0eXBlSWQiLCAidHlwZU5hbWUiLCAiYXN5bmNSZWNlaXZlck1vZGUiLCAiaXNPbmV3YXkiLCAibWVzc2FnZURpcmVjdGlvbiIsICJ0aW1lb3V0IiwKKwkJCQkicmVzcG9uc2VGaWVsZCJ9KSk7CisKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKG1ldGhvZE5vZGUsIG5ldyBTdHJpbmdbXSB7ImRlc2NyaXB0aW9uIiwgImV4Y2VwdGlvbiIsICJhdXRob3JpemUiLCAiZmllbGQiLCAicmVzdWx0In0pKTsKKwkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IHN0dWZmIGhhcyBzbnVjayBpbnRvIHRoZSBYTUwgYmluZGluZworCQlpc1Jlc3VsdE1lc3NhZ2UgPSBuYW1lLnN0YXJ0c1dpdGgoIl9yZXN1bHQiKTsKKwkJCisJCWFzc2VydEVxdWFscyhpc1Jlc3VsdE1lc3NhZ2U/IDggOiA2LCBhdHRycy5nZXRMZW5ndGgoKSk7CisJCQorCQlTdHJpbmcgbmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHR5cGVJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVJZCIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZU5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgcG9vbEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImFzeW5jUmVjZWl2ZXJNb2RlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc09uZXdheUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImlzT25ld2F5IikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBkaXJlY3Rpb25BdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJtZXNzYWdlRGlyZWN0aW9uIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0aW1lb3V0QXR0ciA9ICIiOworCQlTdHJpbmcgcmVzdWx0QXR0ciA9ICIiOworCQkKKwkJaWYgKCBpc1Jlc3VsdE1lc3NhZ2UgKQorCQl7CisJCQl0aW1lb3V0QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidGltZW91dCIpLmdldE5vZGVWYWx1ZSgpOworCQkJcmVzdWx0QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgicmVzcG9uc2VGaWVsZCIpLmdldE5vZGVWYWx1ZSgpOworCQl9CisJCQorCQkvLyB2ZXJpZnkgbmFtZSBvZiBtZXRob2QKKwkJYXNzZXJ0RXF1YWxzKG5hbWVBdHRyLCBuYW1lKTsKKwkJCisJCS8vIHZlcmlmeSB0eXBlIG9mIG1ldGhvZAorCQlhc3NlcnRFcXVhbHModHlwZUlkQXR0ciwgbWV0aG9kSWQpOworCQkKKwkJLy8gdmVyaWZ5IHZhbHVlIG9mIG1ldGhvZAorCQlhc3NlcnRFcXVhbHModHlwZU5hbWVBdHRyLCBtZXRob2ROYW1lKTsKKwkJCisJCS8vIHZlcmlmeSB2YWx1ZSBvZiBwb29sCisJCWFzc2VydEVxdWFscyhwb29sQXR0ciwgcG9vbCk7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgaXNPbmV3YXkKKwkJYXNzZXJ0RXF1YWxzKGlzT25ld2F5QXR0ciwgaXNPbmV3YXkpOworCQkKKwkJLy8gdmVyaWZ5IHZhbHVlIG9mIGlzT25ld2F5CisJCWFzc2VydEVxdWFscyhkaXJlY3Rpb25BdHRyLCBkaXJlY3Rpb24pOworCQkKKwkJLy8gdmVyaWZ5IHZhbHVlIG9mIGlzT25ld2F5CisJCWlmICggaXNSZXN1bHRNZXNzYWdlICkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKHRpbWVvdXRBdHRyLCB0aW1lb3V0KTsKKwkJCWFzc2VydEVxdWFscyhyZXN1bHRBdHRyLCByZXN1bHQpOworCQl9CisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQobWV0aG9kTm9kZSk7CisJCQorCQlpZihkZXNjcmlwdGlvbiA9PSBudWxsKQorCQl7CisJCQlhc3NlcnROdWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsJCisJCQlTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IGNoaWxkLmdldFRleHRDb250ZW50KCkudHJpbSgpOworCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uVmFsdWUsIGRlc2NyaXB0aW9uKTsKKwkJCQorCQkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IGNoaWxkcmVuIG9uIGRlc2NyaXB0aW9uCisJCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQoY2hpbGQpLCAwKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tBdXRob3JpemUoTm9kZSBtZXRob2ROb2RlLCBTdHJpbmcgYXV0aG9yaXplTWV0aG9kTmFtZSkKKwl7CisJCU5vZGUgY2hpbGQgPSBnZXRBdXRob3JpemVFbGVtZW50KG1ldGhvZE5vZGUpOworCQkKKwkJaWYoYXV0aG9yaXplTWV0aG9kTmFtZSA9PSBudWxsKQorCQl7CisJCQlhc3NlcnROdWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUoY2hpbGQsIG5ldyBTdHJpbmdbXSB7Im1ldGhvZE5hbWUifSkpOworCisJCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGNoaWxkLCBuZXcgU3RyaW5nW10ge30pKTsKKwkJCisJCQlTdHJpbmcgYXV0aG9yaXplQXR0ciA9IGNoaWxkLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm1ldGhvZE5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJCQorCQkJYXNzZXJ0RXF1YWxzKGF1dGhvcml6ZUF0dHIsIGF1dGhvcml6ZU1ldGhvZE5hbWUpOworCQkJCisJCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKwkJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChjaGlsZCksIDApOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja1Jlc3VsdChOb2RlIG1ldGhvZE5vZGUsIFN0cmluZyBmaWVsZElkLCBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgdHlwZSwgCisJCVN0cmluZyBpc1ByaW1pdGl2ZVR5cGUsIFN0cmluZyBpc0FycmF5LCBTdHJpbmcgZGltZW5zaW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pCisJeworCQlOb2RlIHJlc3VsdE5vZGUgPSBnZXRSZXN1bHRFbGVtZW50KG1ldGhvZE5vZGUpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKHJlc3VsdE5vZGUsIG5ldyBTdHJpbmdbXSB7ImZpZWxkSWQiLCAiZmllbGROYW1lIiwgInR5cGUiLCAiaXNQcmltaXRpdmVUeXBlIiwgImlzQXJyYXkiLCAiZGltZW5zaW9uIn0pKTsKKworCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdmFsdWUgbm9kZSBleGlzdHMKKwkJYXNzZXJ0Tm90TnVsbChyZXN1bHROb2RlKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShyZXN1bHROb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiJ9KSk7CisJCisJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHJlc3VsdE5vZGUuZ2V0QXR0cmlidXRlcygpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IHN0dWZmIGhhcyBzbnVjayBpbnRvIHRoZSBYTUwgYmluZGluZworCQkKKwkJLy8gdGhpcyBpcyBzcGVjaWFsIGNhc2Ugb2YgYSBvbmV3YXkgbWVzc2FnZSwgc28gd2Ugc2hvdWxkIG9ubHkgaGF2ZSAndHlwZT12b2lkJyBhbmQgJ2lzQXJyYXk9dHJ1ZScgc3BlY2lmaWVkLgorCQlTdHJpbmcgZmllbGRJZEF0dHIgPSBudWxsOworCQlTdHJpbmcgZmllbGROYW1lQXR0ciA9IG51bGw7CisJCQorCQlpZihmaWVsZElkID09IG51bGwpCisJCXsKKwkJCWFzc2VydEVxdWFscyhhdHRycy5nZXRMZW5ndGgoKSwgMik7CisJCQkKKwkJfQorCQllbHNlIC8vIGRpbWVuc2lvbiBhdHRyIGlzIG51bGxhYmxlLCBtZWFuaW5nIGl0IG1pZ2h0IGp1c3Qgbm90IGJlIHRoZXJlIGlmIGlzQXJyYXkgPSAiZmFsc2UiCisJCXsKKwkJCWZpZWxkSWRBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJmaWVsZElkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQlmaWVsZE5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJmaWVsZE5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJCQorCQkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCBpc0FycmF5ID09ICJmYWxzZSIgPyA1IDogNik7CisJCX0KKwkJCisJCVN0cmluZyB0eXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgaXNBcnJheUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImlzQXJyYXkiKS5nZXROb2RlVmFsdWUoKTsKKworCQlOb2RlIGRpbWVuc2lvbk5vZGUgPSBhdHRycy5nZXROYW1lZEl0ZW0oImRpbWVuc2lvbiIpOworCQlTdHJpbmcgZGltZW5zaW9uQXR0ciA9IGRpbWVuc2lvbk5vZGUgPT0gbnVsbCA/IGRpbWVuc2lvbiA6IGRpbWVuc2lvbk5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoZmllbGRJZEF0dHIsIGZpZWxkSWQpOworCQlhc3NlcnRFcXVhbHMoZmllbGROYW1lQXR0ciwgZmllbGROYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKHR5cGVBdHRyLCB0eXBlKTsKKwkJYXNzZXJ0RXF1YWxzKGlzQXJyYXlBdHRyLCBpc0FycmF5KTsKKwkJYXNzZXJ0RXF1YWxzKGRpbWVuc2lvbkF0dHIsIGRpbWVuc2lvbik7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KHJlc3VsdE5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKE5vZGUgbWV0aG9kTm9kZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmaWVsZElkLCBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgdHlwZSwgCisJCQlTdHJpbmcgaXNQcmltaXRpdmVUeXBlLCBTdHJpbmcgaXNBcnJheSwgU3RyaW5nIGRpbWVuc2lvbiwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJTm9kZSBmaWVsZE5vZGUgPSBudWxsOworCQkKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBtZXRob2ROb2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCkgPT0gImZpZWxkIikKKwkJCXsKKwkJCQlOb2RlIHRoaXNOb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0aGlzTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQkJTm9kZSB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5hbWUiKTsKKwkJCQlTdHJpbmcgdGhpc1ZhbHVlID0gdmFsdWVBdHRyLmdldE5vZGVWYWx1ZSgpOworCQkJCWlmKHRoaXNWYWx1ZS5jb21wYXJlVG8obmFtZSkgPT0gMCkKKwkJCQl7CisJCQkJCWZpZWxkTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gdmVyaWZ5IHRoYXQgdGhlIHZhbHVlIG5vZGUgZXhpc3RzCisJCWFzc2VydE5vdE51bGwoZmllbGROb2RlKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShmaWVsZE5vZGUsIG5ldyBTdHJpbmdbXSB7Im5hbWUiLCAiZmllbGRJZCIsICJmaWVsZE5hbWUiLCAidHlwZSIsIAorCQkJCSJpc1ByaW1pdGl2ZVR5cGUiLCAiaXNBcnJheSIsICJkaW1lbnNpb24iIH0pKTsKKworCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUoZmllbGROb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiJ9KSk7CisJCisJCU5hbWVkTm9kZU1hcCBhdHRycyA9IGZpZWxkTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgc3R1ZmYgaGFzIHNudWNrIGludG8gdGhlIFhNTCBiaW5kaW5nCisJCS8vIGRpbWVuc2lvbiBhdHRyIGlzIG51bGxhYmxlLCBtZWFuaW5nIGl0IG1pZ2h0IGp1c3Qgbm90IGJlIHRoZXJlIGlmIGlzQXJyYXkgPSAiZmFsc2UiCisJCWFzc2VydEVxdWFscyhhdHRycy5nZXRMZW5ndGgoKSwgaXNBcnJheSA9PSAiZmFsc2UiID8gNiA6IDcpOworCQkKKwkJU3RyaW5nIGZpZWxkSWRBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJmaWVsZElkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBmaWVsZE5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJmaWVsZE5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc0FycmF5QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiaXNBcnJheSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgaXNQcmltaXRpdmVUeXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiaXNQcmltaXRpdmVUeXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlOb2RlIGRpbWVuc2lvbk5vZGUgPSBhdHRycy5nZXROYW1lZEl0ZW0oImRpbWVuc2lvbiIpOworCQlTdHJpbmcgZGltZW5zaW9uQXR0ciA9IGRpbWVuc2lvbk5vZGUgPT0gbnVsbCA/IGRpbWVuc2lvbiA6IGRpbWVuc2lvbk5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoZmllbGRJZEF0dHIsIGZpZWxkSWQpOworCQlhc3NlcnRFcXVhbHMoZmllbGROYW1lQXR0ciwgZmllbGROYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKHR5cGVBdHRyLCB0eXBlKTsKKwkJYXNzZXJ0RXF1YWxzKGlzQXJyYXlBdHRyLCBpc0FycmF5KTsKKwkJYXNzZXJ0RXF1YWxzKGRpbWVuc2lvbkF0dHIsIGRpbWVuc2lvbik7CisJCWFzc2VydEVxdWFscyggaXNQcmltaXRpdmVUeXBlLCBpc1ByaW1pdGl2ZVR5cGVBdHRyICk7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KGZpZWxkTm9kZSk7CisJCQorCQlpZihkZXNjcmlwdGlvbiA9PSBudWxsKQorCQl7CisJCQlhc3NlcnROdWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsJCisJCQlTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IGNoaWxkLmdldFRleHRDb250ZW50KCkudHJpbSgpOworCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uVmFsdWUsIGRlc2NyaXB0aW9uKTsKKwkJCQorCQkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IGNoaWxkcmVuIG9uIGRlc2NyaXB0aW9uCisJCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQoY2hpbGQpLCAwKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIE5vZGUgZ2V0RGVzY3JpcHRpb25FbGVtZW50KE5vZGUgbm9kZSkKKwl7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlzaG9ydCBub2RlVHlwZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKTsKKwkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKKwkJCWlmKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG5vZGVOYW1lID09ICJkZXNjcmlwdGlvbiIpCisJCQl7CisJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZW0oaSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgTm9kZSBnZXRBdXRob3JpemVFbGVtZW50KE5vZGUgbm9kZSkKKwl7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlzaG9ydCBub2RlVHlwZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKTsKKwkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKKwkJCWlmKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG5vZGVOYW1lID09ICJhdXRob3JpemUiKQorCQkJeworCQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKGkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIE5vZGUgZ2V0UmVzdWx0RWxlbWVudChOb2RlIG5vZGUpCisJeworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJc2hvcnQgbm9kZVR5cGUgPSBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCk7CisJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCk7CisJCQlpZihub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBub2RlTmFtZSA9PSAicmVzdWx0IikKKwkJCXsKKwkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlbShpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgZ2V0Q2hpbGRFbGVtZW50Q291bnQoTm9kZSBub2RlKQorCXsKKwkJaW50IGNvdW50ID0gMDsKKwkJCisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlpZihjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCisJCQl7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGNvdW50OworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gb25seUNoaWxkTm9kZXNPZk5hbWUoTm9kZSBub2RlLCBTdHJpbmdbXSBlbGVtZW50TmFtZXNUb0NoZWNrKQorCXsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJCisJCWJvb2xlYW4gaGFzVmFsaWRDaGlsZHJlbiA9IHRydWU7CisJCQorCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkKKwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKKwkJCXsKKwkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCk7CisJCQkJCisJCQkJYm9vbGVhbiBtYXRjaGVzID0gZmFsc2U7CisJCQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IGVsZW1lbnROYW1lc1RvQ2hlY2spCisJCQkJeworCQkJCQlpZigwID09IGVsZW1lbnROYW1lLmNvbXBhcmVUbyhlbGVtZW50KSApCisJCQkJCXsKKwkJCQkJCW1hdGNoZXMgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJaWYobWF0Y2hlcyA9PSBmYWxzZSkKKwkJCQl7CisJCQkJCWhhc1ZhbGlkQ2hpbGRyZW4gPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQkKKwkJfQorCQkKKwkJcmV0dXJuIGhhc1ZhbGlkQ2hpbGRyZW47CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBvbmx5QXR0cnNPZk5hbWUoTm9kZSBub2RlLCBTdHJpbmdbXSBhdHRyTmFtZXNUb0NoZWNrKQorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQlib29sZWFuIGhhc1ZhbGlkQXR0cnMgPSB0cnVlOworCQkKKwkJZm9yKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJzLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKKwkJCQorCQkJYm9vbGVhbiBtYXRjaGVzID0gZmFsc2U7CisJCQlmb3IgKFN0cmluZyBlbGVtZW50IDogYXR0ck5hbWVzVG9DaGVjaykKKwkJCXsKKwkJCQlpZigwID09IGF0dHJOYW1lLmNvbXBhcmVUbyhlbGVtZW50KSApCisJCQkJeworCQkJCQltYXRjaGVzID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZihtYXRjaGVzID09IGZhbHNlKQorCQkJeworCQkJCWhhc1ZhbGlkQXR0cnMgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQl9CisJCQorCQlyZXR1cm4gaGFzVmFsaWRBdHRyczsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0UmVtb3RlVGVzdDFEb3RKYXZhLmphdmEgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0UmVtb3RlVGVzdDFEb3RKYXZhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczY2M4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RSZW1vdGVUZXN0MURvdEphdmEuamF2YQpAQCAtMCwwICsxLDE1NDIgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuRGVsaXZlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuTWFpbGJveDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuU2Vzc2lvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLkUxOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5FeGNwMTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuRXhjcDM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLkV4Y3A0OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5TMTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuUzI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CisKKworLyoqIFRlc3Qgb2YgUmVtb3RlVGVzdDEgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UmVtb3RlVGVzdDFEb3RKYXZhCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX25vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Lm5vdGhpbmcoKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfbm90aGluZywKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X25vdGhpbmcsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfbm90aGluZy5nZXRUaW1lb3V0KCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfaW5jcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IDI7CisJCWFzc2VydEVxdWFscyggMiwgdGVzdC5pbmNyKCAxICkgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggfSwKKwkJCW5ldyBPYmplY3RbXSB7IDEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9pbmNyLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2luY3IuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9pbmNyMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN2Yy54cmVzdWx0ID0gMzsKKwkJYXNzZXJ0RXF1YWxzKCAzLCB0ZXN0LmluY3IoIDIgKSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9pbmNyLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCB9LAorCQkJbmV3IE9iamVjdFtdIHsgMiB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2luY3IsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaW5jci5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2luY3IzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3ZjLnhyZXN1bHQgPSAtMTsKKwkJYXNzZXJ0RXF1YWxzKCAtMSwgdGVzdC5pbmNyKCAtMiApICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2luY3IsCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisJCQluZXcgT2JqZWN0W10geyAtMiB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2luY3IsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaW5jci5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3N1YjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IDU7CisJCWFzc2VydEVxdWFscyggNSwgdGVzdC5zdWIoIDcsIDIgKSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9zdWIsCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeSB9LAorCQkJbmV3IE9iamVjdFtdIHsgNywgMiB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1YiwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9zdWIuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9zdWIyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3ZjLnhyZXN1bHQgPSA4OworCQlhc3NlcnRFcXVhbHMoIDgsIHRlc3Quc3ViKCAyMywgMTUgKSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9zdWIsCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeSB9LAorCQkJbmV3IE9iamVjdFtdIHsgMjMsIDE1IH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfc3ViLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1Yi5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3N1YjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IC01OworCQlhc3NlcnRFcXVhbHMoIC01LCB0ZXN0LnN1YiggMiwgNyApICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3N1YiwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl95IH0sCisJCQluZXcgT2JqZWN0W10geyAyLCA3IH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfc3ViLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1Yi5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3N1bSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN2Yy54cmVzdWx0ID0gMjQ7CisJCWludFtdIGFyZyA9IHsgMSwgMiwgMywgNywgMTEgfTsKKwkJYXNzZXJ0RXF1YWxzKCAyNCwgdGVzdC5zdW0oIGFyZyApICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3N1bSwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggfSwKKwkJCW5ldyBPYmplY3RbXSB7IGFyZyB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1bSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9zdW0uZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IDI7CisJCWFzc2VydEVxdWFscyggMiwgdGVzdC50cmFucyggRTEuQSwgNSApICk7IC8vIGRpdmlkZSBieSAyCisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3RyYW5zLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggfSwKKwkJCW5ldyBPYmplY3RbXSB7IEUxLkEsIDUgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF90cmFucywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF90cmFucy5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN2Yy54cmVzdWx0ID0gMTA7CisJCWFzc2VydEVxdWFscyggMTAsIHRlc3QudHJhbnMoIEUxLkIsIDUgKSApOyAvLyBtdWwgYnkgMgorCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90cmFucywKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94IH0sCisJCQluZXcgT2JqZWN0W10geyBFMS5CLCA1IH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdHJhbnMsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdHJhbnMuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IDEyOworCQlhc3NlcnRFcXVhbHMoIDEyLCB0ZXN0LnRyYW5zKCBFMS5DLCA1ICkgKTsgLy8gYWRkIDcKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfdHJhbnMsCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCB9LAorCQkJbmV3IE9iamVjdFtdIHsgRTEuQywgNSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3RyYW5zLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3RyYW5zLmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfZGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IE1hdGguc3FydCggMyApOworCQlTMSBhcmcxID0gIG5ldyBTMSggMSwgMSwgMSApOworCQlTMSBhcmcyID0gbmV3IFMxKCAwLCAwLCAwICk7CisJCWFzc2VydEVxdWFscyggTWF0aC5zcXJ0KCAzICksIHRlc3QuZGlzdCggYXJnMSwgYXJnMiApICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2Rpc3QsCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYiB9LAorCQkJbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Rpc3QsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfZGlzdC5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2Rpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3ZjLnhyZXN1bHQgPSBNYXRoLnNxcnQoIDM1ICk7CisJCVMxIGFyZzEgPSBuZXcgUzEoIDEsIDIsIDMgKTsKKwkJUzEgYXJnMiA9IG5ldyBTMSggNiwgNSwgNCApOworCQlhc3NlcnRFcXVhbHMoIE1hdGguc3FydCggMzUgKSwgdGVzdC5kaXN0KCBhcmcxLCBhcmcyICkgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZGlzdCwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EsIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9iIH0sCisJCQluZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyIH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfZGlzdCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9kaXN0LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfZGlzdDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IE1hdGguc3FydCggNTYgKTsKKwkJUzEgYXJnMSA9IG5ldyBTMSggMSwgMiwgMyApOworCQlTMSBhcmcyID0gbmV3IFMxKCAtMSwgLTIsIC0zICk7CisJCWFzc2VydEVxdWFscyggTWF0aC5zcXJ0KCA1NiApLCB0ZXN0LmRpc3QoIGFyZzEsIGFyZzIgKSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9kaXN0LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9kaXN0LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Rpc3QuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN2Yy54cmVzdWx0ID0gbmV3IGludFtdIHt9OworCQlpbnRbXSB4ID0gdGVzdC5maWxsKCAwLCAxICk7CisJCWFzc2VydEVxdWFscyggMCwgeC5sZW5ndGggKTsKKwkJZm9yIChpbnQgaTogeCkKKwkJCWFzc2VydEVxdWFscyggMSwgaSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbiwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggfSwKKwkJCW5ldyBPYmplY3RbXSB7IDAsIDEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2ZpbGwuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN2Yy54cmVzdWx0ID0gbmV3IGludFtdIHsgMiB9OworCQlpbnRbXSB4ID0gdGVzdC5maWxsKCAxLCAyICk7CisJCWFzc2VydEVxdWFscyggMSwgeC5sZW5ndGggKTsKKwkJZm9yIChpbnQgaTogeCkKKwkJCWFzc2VydEVxdWFscyggMiwgaSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbiwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggfSwKKwkJCW5ldyBPYmplY3RbXSB7IDEsIDIgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2ZpbGwuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN2Yy54cmVzdWx0ID0gbmV3IGludFtdIHsgMywgMyB9OworCQlpbnRbXSB4ID0gdGVzdC5maWxsKCAyLCAzICk7CisJCWFzc2VydEVxdWFscyggMiwgeC5sZW5ndGggKTsKKwkJZm9yIChpbnQgaTogeCkKKwkJCWFzc2VydEVxdWFscyggMywgaSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbiwgVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggfSwKKwkJCW5ldyBPYmplY3RbXSB7IDIsIDMgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2ZpbGwuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9ibG93MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlzdmMueHJlc3VsdCA9IG5ldyBFeGNwMSggImZvbyIsIDIgKTsKKwkJCXRlc3QuYmxvdyggImZvbyIsIDIgKTsKKwkJCWZhaWwoICJibG93IGRpZCBub3QgdGhyb3ciICk7CisJCX0KKwkJY2F0Y2goIEV4Y3AxIGUgKQorCQl7CisJCQlhc3NlcnRFcXVhbHMoICJmb28iLCBlLm1zZyApOworCQkJYXNzZXJ0RXF1YWxzKCAyLCBlLmNvZGUgKTsKKwkJfQorCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9ibG93LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSB9LAorCQkJbmV3IE9iamVjdFtdIHsgImZvbyIsIDIgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9ibG93LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Jsb3cuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9ibG93MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlzdmMueHJlc3VsdCA9IG5ldyBFeGNwMSggImJhciIsIDMgKTsKKwkJCXRlc3QuYmxvdyggImJhciIsIDMgKTsKKwkJCWZhaWwoICJibG93IGRpZCBub3QgdGhyb3ciICk7CisJCX0KKwkJY2F0Y2goIEV4Y3AxIGUgKQorCQl7CisJCQlhc3NlcnRFcXVhbHMoICJiYXIiLCBlLm1zZyApOworCQkJYXNzZXJ0RXF1YWxzKCAzLCBlLmNvZGUgKTsKKwkJfQorCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9ibG93LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSB9LAorCQkJbmV3IE9iamVjdFtdIHsgImJhciIsIDMgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9ibG93LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Jsb3cuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9iZWV0czEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdmMueHJlc3VsdCA9IDU7CisJCWFzc2VydEVxdWFscyggNSwgdGVzdC5iZWV0cyggRTEuQSApICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2JlZXRzLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSB9LAorCQkJbmV3IE9iamVjdFtdIHsgRTEuQSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzLmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdHJ5CisJCXsKKwkJCXN2Yy54cmVzdWx0ID0gbmV3IEV4Y3AzKCk7CisJCQl0ZXN0LmJlZXRzKCBFMS5CICk7CisJCQlmYWlsKCAiYmVldHMgZGlkIG5vdCB0aHJvdyIgKTsKKwkJfQorCQljYXRjaCAoIEV4Y3AzIGUgKQorCQl7CisJCQlhc3NlcnRUcnVlKCB0cnVlICk7CisJCX0KKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lIH0sCisJCQluZXcgT2JqZWN0W10geyBFMS5CIH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9iZWV0czMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cnkKKwkJeworCQkJc3ZjLnhyZXN1bHQgPSBuZXcgRXhjcDQoKTsKKwkJCXRlc3QuYmVldHMoIEUxLkMgKTsKKwkJCWZhaWwoICJiZWV0cyBkaWQgbm90IHRocm93IiApOworCQl9CisJCWNhdGNoICggRXhjcDQgZSApCisJCXsKKwkJCWFzc2VydFRydWUoIHRydWUgKTsKKwkJfQorCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9iZWV0cywKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2UgfSwKKwkJCW5ldyBPYmplY3RbXSB7IEUxLkMgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9iZWV0cywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9iZWV0cy5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN2Yy54cmVzdWx0ID0gbnVsbDsKKwkJYXNzZXJ0TnVsbCggdGVzdC5iZWV0cyggbnVsbCApICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2JlZXRzLAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMuZ2V0VGltZW91dCgpICk7CisJfQorCisJLy8vLy8vLy8vLy8vLworCS8vIEJPT0xFQU4gLy8KKwkvLy8vLy8vLy8vLy8vCisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfYm9vbGVhbl9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQm9vbGVhbiBhID0gbnVsbDsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlCb29sZWFuIHIgPSB0ZXN0LnBfYm9vbGVhbiggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ib29sZWFuLAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ib29sZWFuLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYm9vbGVhbi5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfYm9vbGVhbigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUJvb2xlYW4gYSA9IHRydWU7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJQm9vbGVhbiByID0gdGVzdC5wX2Jvb2xlYW4oIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYm9vbGVhbiwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Jvb2xlYW4sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ib29sZWFuLmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9ib29sZWFuX2FycmF5X251bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlib29sZWFuW10gYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJYm9vbGVhbltdIHIgPSB0ZXN0LnBfYm9vbGVhbl9hcnJheSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ib29sZWFuX2FycmF5LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ib29sZWFuX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYm9vbGVhbl9hcnJheS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfYm9vbGVhbl9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWJvb2xlYW4geCA9IGZhbHNlOworCQlib29sZWFuIHkgPSB0cnVlOworCQlib29sZWFuW10gYSA9IHsgeCwgeSB9OworCQlzdmMueHJlc3VsdCA9IGE7CisJCWJvb2xlYW5bXSByID0gdGVzdC5wX2Jvb2xlYW5fYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYm9vbGVhbl9hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Jvb2xlYW5fYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ib29sZWFuX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKworCS8vLy8vLy8vLy8KKwkvLyBCWVRFIC8vCisJLy8vLy8vLy8vLworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2J5dGVfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUJ5dGUgYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJQnl0ZSByID0gdGVzdC5wX2J5dGUoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYnl0ZSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYnl0ZSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGUuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2J5dGUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlCeXRlIGEgPSAxOworCQlzdmMueHJlc3VsdCA9IGE7CisJCUJ5dGUgciA9IHRlc3QucF9ieXRlKCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2J5dGUsCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisJCQluZXcgT2JqZWN0W10geyBhIH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9ieXRlLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYnl0ZS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfYnl0ZV9hcnJheV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYnl0ZVtdIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCWJ5dGVbXSByID0gdGVzdC5wX2J5dGVfYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfYnl0ZV9hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYnl0ZV9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGVfYXJyYXkuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2J5dGVfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlieXRlIHggPSAxMjsKKwkJYnl0ZSB5ID0gMjM7CisJCWJ5dGVbXSBhID0geyB4LCB5IH07CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJYnl0ZVtdIHIgPSB0ZXN0LnBfYnl0ZV9hcnJheSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ieXRlX2FycmF5LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfYnl0ZV9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGVfYXJyYXkuZ2V0VGltZW91dCgpICk7CisJfQorCisJLy8vLy8vLy8vLy8KKwkvLyBTSE9SVCAvLworCS8vLy8vLy8vLy8vCisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3Bfc2hvcnRfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNob3J0IGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCVNob3J0IHIgPSB0ZXN0LnBfc2hvcnQoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfc2hvcnQsCisJCQluZXcgRmllbGRbXSB7fSwKKwkJCW5ldyBPYmplY3RbXSB7fSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3Nob3J0LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnQuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX3Nob3J0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU2hvcnQgYSA9IDEyMzQ7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJU2hvcnQgciA9IHRlc3QucF9zaG9ydCggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zaG9ydCwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3Nob3J0LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnQuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX3Nob3J0X2FycmF5X251bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzaG9ydFtdIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCXNob3J0W10gciA9IHRlc3QucF9zaG9ydF9hcnJheSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zaG9ydF9hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnRfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9zaG9ydF9hcnJheS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3Bfc2hvcnRfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzaG9ydCB4ID0gMTIzNDsKKwkJc2hvcnQgeSA9IDIzNDU7CisJCXNob3J0W10gYSA9IHsgeCwgeSB9OworCQlzdmMueHJlc3VsdCA9IGE7CisJCXNob3J0W10gciA9IHRlc3QucF9zaG9ydF9hcnJheSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zaG9ydF9hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3Nob3J0X2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnRfYXJyYXkuZ2V0VGltZW91dCgpICk7CisJfQorCisJLy8vLy8vLy8vCisJLy8gSU5UIC8vCisJLy8vLy8vLy8vCisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfaW50X251bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlJbnRlZ2VyIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCUludGVnZXIgciA9IHRlc3QucF9pbnQoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfaW50LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9pbnQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9pbnQuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2ludCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUludGVnZXIgYSA9IDEyMzQ1Njc4OworCQlzdmMueHJlc3VsdCA9IGE7CisJCUludGVnZXIgciA9IHRlc3QucF9pbnQoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfaW50LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfaW50LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfaW50LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9pbnRfYXJyYXlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludFtdIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCWludFtdIHIgPSB0ZXN0LnBfaW50X2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2ludF9hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfaW50X2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfaW50X2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9pbnRfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpbnQgeCA9IDEyMzQ1Njc4OworCQlpbnQgeSA9IDIzNDU2Nzg5OworCQlpbnRbXSBhID0geyB4LCB5IH07CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJaW50W10gciA9IHRlc3QucF9pbnRfYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfaW50X2FycmF5LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfaW50X2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfaW50X2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKworCS8vLy8vLy8vLy8KKwkvLyBMT05HIC8vCisJLy8vLy8vLy8vLworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2xvbmdfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvbmcgYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJTG9uZyByID0gdGVzdC5wX2xvbmcoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfbG9uZywKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfbG9uZywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmcuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2xvbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlMb25nIGEgPSAxMjM0NTY3ODEyMzQ1Njc4TDsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlMb25nIHIgPSB0ZXN0LnBfbG9uZyggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9sb25nLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfbG9uZywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmcuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2xvbmdfYXJyYXlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWxvbmdbXSBhID0gbnVsbDsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlsb25nW10gciA9IHRlc3QucF9sb25nX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2xvbmdfYXJyYXksCisJCQluZXcgRmllbGRbXSB7fSwKKwkJCW5ldyBPYmplY3RbXSB7fSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmdfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9sb25nX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9sb25nX2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbG9uZyB4ID0gMTIzNDU2NzgxMjM0NTY3OEw7CisJCWxvbmcgeSA9IDIzNDU2Nzg5MjM0NTY3ODlMOworCQlsb25nW10gYSA9IHsgeCwgeSB9OworCQlzdmMueHJlc3VsdCA9IGE7CisJCWxvbmdbXSByID0gdGVzdC5wX2xvbmdfYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfbG9uZ19hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmdfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9sb25nX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKworCS8vLy8vLy8vLy8vCisJLy8gRkxPQVQgLy8KKwkvLy8vLy8vLy8vLworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2Zsb2F0X251bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbG9hdCBhID0gbnVsbDsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlGbG9hdCByID0gdGVzdC5wX2Zsb2F0KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2Zsb2F0LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9mbG9hdCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Zsb2F0LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9mbG9hdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsb2F0IGEgPSAxMjMuNDU2ZjsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlGbG9hdCByID0gdGVzdC5wX2Zsb2F0KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2Zsb2F0LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZmxvYXQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9mbG9hdC5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfZmxvYXRfYXJyYXlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZsb2F0W10gYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJZmxvYXRbXSByID0gdGVzdC5wX2Zsb2F0X2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2Zsb2F0X2FycmF5LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9mbG9hdF9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Zsb2F0X2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9mbG9hdF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZsb2F0IHggPSAxMjMuNDU2ZjsKKwkJZmxvYXQgeSA9IDIzNC41NjdmOworCQlmbG9hdFtdIGEgPSB7IHgsIHkgfTsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlmbG9hdFtdIHIgPSB0ZXN0LnBfZmxvYXRfYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZmxvYXRfYXJyYXksCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisJCQluZXcgT2JqZWN0W10geyBhIH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9mbG9hdF9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Zsb2F0X2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKworCS8vLy8vLy8vLy8vLworCS8vIERPVUJMRSAvLworCS8vLy8vLy8vLy8vLworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX2RvdWJsZV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRG91YmxlIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCURvdWJsZSByID0gdGVzdC5wX2RvdWJsZSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9kb3VibGUsCisJCQluZXcgRmllbGRbXSB7fSwKKwkJCW5ldyBPYmplY3RbXSB7fSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2RvdWJsZSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2RvdWJsZS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfZG91YmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRG91YmxlIGEgPSAxMjM0NTY3OC4xMjM0NTY3ODsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlEb3VibGUgciA9IHRlc3QucF9kb3VibGUoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZG91YmxlLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlLmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9kb3VibGVfYXJyYXlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWRvdWJsZVtdIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCWRvdWJsZVtdIHIgPSB0ZXN0LnBfZG91YmxlX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2RvdWJsZV9hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9kb3VibGVfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkb3VibGUgeCA9IDEyMzQ1Njc4LjEyMzQ1Njc4OworCQlkb3VibGUgeSA9IDIzNDU2Nzg5LjIzNDU2Nzg5OworCQlkb3VibGVbXSBhID0geyB4LCB5IH07CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJZG91YmxlW10gciA9IHRlc3QucF9kb3VibGVfYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZG91YmxlX2FycmF5LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZG91YmxlX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKworCS8vLy8vLy8vLy8vLworCS8vIFNUUklORyAvLworCS8vLy8vLy8vLy8vLworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX3N0cmluZ19udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCVN0cmluZyByID0gdGVzdC5wX3N0cmluZyggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9zdHJpbmcsCisJCQluZXcgRmllbGRbXSB7fSwKKwkJCW5ldyBPYmplY3RbXSB7fSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3N0cmluZywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX3N0cmluZy5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3Bfc3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGEgPSAiYWJjIjsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlTdHJpbmcgciA9IHRlc3QucF9zdHJpbmcoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfc3RyaW5nLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nLmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9zdHJpbmdfYXJyYXlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cmluZ1tdIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCVN0cmluZ1tdIHIgPSB0ZXN0LnBfc3RyaW5nX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3N0cmluZ19hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9zdHJpbmdfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmcgeCA9ICJhYmMiOworCQlTdHJpbmcgeSA9ICJiY2QiOworCQlTdHJpbmdbXSBhID0geyB4LCB5IH07CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJU3RyaW5nW10gciA9IHRlc3QucF9zdHJpbmdfYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfc3RyaW5nX2FycmF5LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc3RyaW5nX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvLy8vLy8vLy8vLy8KKwkvLyBPQkpFQ1QgLy8KKwkvLy8vLy8vLy8vLy8KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9vYmplY3RfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBhID0gbnVsbDsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlPYmplY3QgciA9IHRlc3QucF9vYmplY3QoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfb2JqZWN0LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3QsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3QuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX29iamVjdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBhID0gImFiYyI7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJT2JqZWN0IHIgPSB0ZXN0LnBfb2JqZWN0KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX29iamVjdCwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX29iamVjdCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX29iamVjdC5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3Bfb2JqZWN0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBhMSA9IDIzOworCQlzdmMueHJlc3VsdCA9IGExOworCQlPYmplY3QgcjEgPSB0ZXN0LnBfb2JqZWN0KCBhMSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGExLCByMSApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX29iamVjdCwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGExIH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3QsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3QuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX29iamVjdF9hcnJheV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nW10gYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJU3RyaW5nW10gciA9IHRlc3QucF9zdHJpbmdfYXJyYXkoIGEgKTsKKwkJYXNzZXJ0T2JqZWN0RXF1YWxzKCBhLCByICk7CisJCWNoZWNrKCBXaGF0LkNBTEwsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfc3RyaW5nX2FycmF5LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9zdHJpbmdfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9zdHJpbmdfYXJyYXkuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX29iamVjdF9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCB4ID0gImFiYyI7CisJCU9iamVjdCB5ID0gImJjZCI7CisJCU9iamVjdFtdIGEgPSB7IHgsIHkgfTsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlPYmplY3RbXSByID0gdGVzdC5wX29iamVjdF9hcnJheSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9vYmplY3RfYXJyYXksCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisJCQluZXcgT2JqZWN0W10geyBhIH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3RfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3RfYXJyYXkuZ2V0VGltZW91dCgpICk7CQkKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3Bfb2JqZWN0X2FycmF5MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCB4ID0gMjI7CisJCU9iamVjdCB5ID0gMzM7CisJCU9iamVjdFtdIGEgPSB7IHgsIHkgfTsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlPYmplY3RbXSByID0gdGVzdC5wX29iamVjdF9hcnJheSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9vYmplY3RfYXJyYXksCisJCQluZXcgRmllbGRbXSB7IFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hIH0sCisJCQluZXcgT2JqZWN0W10geyBhIH0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3RfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3RfYXJyYXkuZ2V0VGltZW91dCgpICk7CQkKKwl9CisJCisJCisKKwkvLy8vLy8vLworCS8vIEUxIC8vCisJLy8vLy8vLy8KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9FMV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRTEgYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJRTEgciA9IHRlc3QucF9FMSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9FMSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9FMS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfRTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlFMSBhID0gRTEuQTsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlFMSByID0gdGVzdC5wX0UxKCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX0UxLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9FMS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfRTFfYXJyYXlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUUxW10gYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJRTFbXSByID0gdGVzdC5wX0UxX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX0UxX2FycmF5LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9FMV9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX0UxX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9FMV9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUUxIHggPSBFMS5BOworCQlFMSB5ID0gRTEuQjsKKwkJRTFbXSBhID0geyB4LCB5IH07CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJRTFbXSByID0gdGVzdC5wX0UxX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX0UxX2FycmF5LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTFfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9FMV9hcnJheS5nZXRUaW1lb3V0KCkgKTsKKwl9CisKKwkvLy8vLy8vLworCS8vIFMxIC8vCisJLy8vLy8vLy8KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9TMV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUzEgYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJUzEgciA9IHRlc3QucF9TMSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfUzEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTMSBhID0gbmV3IFMxKCAxLCAyLCAzICk7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJUzEgciA9IHRlc3QucF9TMSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMSwKKwkJCW5ldyBGaWVsZFtdIHsgVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgfSwKKwkJCW5ldyBPYmplY3RbXSB7IGEgfSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX1MxLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzEuZ2V0VGltZW91dCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9wX1MxX2FycmF5X251bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTMVtdIGEgPSBudWxsOworCQlzdmMueHJlc3VsdCA9IGE7CisJCVMxW10gciA9IHRlc3QucF9TMV9hcnJheSggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMV9hcnJheSwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzFfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMV9hcnJheS5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfUzFfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTMSB4ID0gbmV3IFMxKCAxLCAyLCAzICk7CisJCVMxIHkgPSBuZXcgUzEoIDIsIDMsIDQgKTsKKwkJUzFbXSBhID0geyB4LCB5IH07CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJUzFbXSByID0gdGVzdC5wX1MxX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX1MxX2FycmF5LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzFfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMV9hcnJheS5nZXRUaW1lb3V0KCkgKTsKKwl9CisKKwkvLy8vLy8vLworCS8vIFMyIC8vCisJLy8vLy8vLy8KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9TMl9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJUzIgYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJUzIgciA9IHRlc3QucF9TMiggYSApOworCQlhc3NlcnRPYmplY3RFcXVhbHMoIGEsIHIgKTsKKwkJY2hlY2soIFdoYXQuQ0FMTCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9TMiwKKwkJCW5ldyBGaWVsZFtdIHt9LAorCQkJbmV3IE9iamVjdFtdIHt9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzIsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMi5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfUzIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTMiBhID0gbmV3IFMyKCBuZXcgUzEoIDEsIDIsIDMgKSwgbmV3IFMxKCAyLCAzLCA0ICksIEUxLkEgKTsKKwkJc3ZjLnhyZXN1bHQgPSBhOworCQlTMiByID0gdGVzdC5wX1MyKCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX1MyLAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzIsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMi5nZXRUaW1lb3V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3BfUzJfYXJyYXlfbnVsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVMyW10gYSA9IG51bGw7CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJUzJbXSByID0gdGVzdC5wX1MyX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX1MyX2FycmF5LAorCQkJbmV3IEZpZWxkW10ge30sCisJCQluZXcgT2JqZWN0W10ge30sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMl9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX1MyX2FycmF5LmdldFRpbWVvdXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfcF9TMl9hcnJheSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVMyIHggPSBuZXcgUzIoIG5ldyBTMSggMSwgMiwgMyApLCBuZXcgUzEoIDIsIDMsIDQgKSwgRTEuQSApOworCQlTMiB5ID0gbmV3IFMyKCBuZXcgUzEoIDIsIDMsIDQgKSwgbmV3IFMxKCAzLCA0LCA1ICksIEUxLkIgKTsKKwkJUzJbXSBhID0geyB4LCB5IH07CisJCXN2Yy54cmVzdWx0ID0gYTsKKwkJUzJbXSByID0gdGVzdC5wX1MyX2FycmF5KCBhICk7CisJCWFzc2VydE9iamVjdEVxdWFscyggYSwgciApOworCQljaGVjayggV2hhdC5DQUxMLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX1MyX2FycmF5LAorCQkJbmV3IEZpZWxkW10geyBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSB9LAorCQkJbmV3IE9iamVjdFtdIHsgYSB9LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzJfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9TMl9hcnJheS5nZXRUaW1lb3V0KCkgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVVRJTElUWSBTVFVGRiAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEBwYXJhbSBhCisJICogQHBhcmFtIGIKKwkgKi8KKwlwcml2YXRlIHZvaWQgYXNzZXJ0T2JqZWN0RXF1YWxzKCBPYmplY3QgYSwgT2JqZWN0IGIgKQorCXsKKwkJaWYgKGEgPT0gYikKKwkJCXJldHVybjsKKwkJCisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQorCQl7CisJCQlmYWlsKCAiYSA9PSBudWxsIHx8IGIgPT0gbnVsbCIgKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJYXNzZXJ0U2FtZSggYS5nZXRDbGFzcygpLCBiLmdldENsYXNzKCkgKTsKKwkJCisJCWlmIChhLmdldENsYXNzKCkuaXNBcnJheSgpICYmIGIuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpCisJCXsKKwkJCWFzc2VydEFycmF5RXF1YWxzKCBhLCBiICk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWFzc2VydEVxdWFscyggYSwgYiApOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYQorCSAqIEBwYXJhbSBiCisJICovCisJcHJpdmF0ZSB2b2lkIGFzc2VydEFycmF5RXF1YWxzKCBPYmplY3QgYSwgT2JqZWN0IGIgKQorCXsKKwkJaW50IG4gPSBBcnJheS5nZXRMZW5ndGgoIGEgKTsKKwkJYXNzZXJ0RXF1YWxzKCBuLCBBcnJheS5nZXRMZW5ndGgoIGIgKSApOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCWFzc2VydE9iamVjdEVxdWFscyggQXJyYXkuZ2V0KCBhLCBpICksIEFycmF5LmdldCggYiwgaSApICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrKCBXaGF0IHdoYXQsIFR5cGUgdHlwZSwgRmllbGRbXSBmaWVsZHMsIE9iamVjdFtdIG9iamVjdHMsCisJCVR5cGUgcmVzdWx0VHlwZSwgaW50IHRpbWVvdXQgKQorCXsKKwkJYXNzZXJ0U2FtZSggIndoYXQiLCB3aGF0LCBzdmMud2hhdCApOworCQlhc3NlcnRTYW1lKCAidHlwZSIsIHR5cGUsIHN2Yy54bXNnLnR5cGUoKSApOworCQkKKwkJaW50IG4gPSBmaWVsZHMubGVuZ3RoOworCQlhc3NlcnRFcXVhbHMoICJvYmplY3RzLmxlbmd0aCIsIG4sIG9iamVjdHMubGVuZ3RoICk7CisJCWFzc2VydEVxdWFscyggIm1zZy5zaXplIiwgbiwgc3ZjLnhtc2cuc2l6ZSgpICk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJzaXplID0gIiArIHN2Yy54bXNnLnNpemUoKSk7CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJeworCQkJRmllbGQgZiA9IGZpZWxkc1tpXTsKKwkJCWFzc2VydEVxdWFscyggIm9iamVjdF8iK2ksIG9iamVjdHNbaV0sIHN2Yy54bXNnLmdldCggZiApICk7CisJCX0KKwkJCisJCWFzc2VydFNhbWUoICJyZXN1bHRUeXBlIiwgcmVzdWx0VHlwZSwgc3ZjLnhyZXNwb25zZVR5cGUgKTsKKwkJYXNzZXJ0U2FtZSggInJlc3BvbnNlRmllbGQiLCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0LCBzdmMueHJlc3BvbnNlRmllbGQgKTsKKwkJYXNzZXJ0RXF1YWxzKCAidGltZW91dCIsIHRpbWVvdXQsIHN2Yy54dGltZW91dCApOworCX0KKwkKKwkvKiogdHlwZSBvZiBjYWxsICovCisJcHVibGljIGVudW0gV2hhdAorCXsKKwkJLyoqICovCisJCVNFTkQsCisJCS8qKiAqLworCQlDQUxMLAorCQkvKiogKi8KKwkJU0hVVERPV05PVVRQVVQsCisJCS8qKiAqLworCQlCRUdJTkNBTEwKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBNeURlbGl2ZXJ5U2VydmljZSBzdmMgPSBuZXcgTXlEZWxpdmVyeVNlcnZpY2UoKTsKKwkKKwlwcml2YXRlIGZpbmFsIFRlc3QxIHRlc3QgPSBuZXcgUmVtb3RlVGVzdDEoIHN2YywgbmV3IFZhbHVlRmFjdG9yeVRlc3QxKCAidGNwOiIgKSApOworCisJLyoqICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBNeURlbGl2ZXJ5U2VydmljZSBpbXBsZW1lbnRzIERlbGl2ZXJ5U2VydmljZQorCXsKKwkJLyoqICovCisJCXB1YmxpYyBXaGF0IHdoYXQ7CisJCS8qKiAqLworCQlwdWJsaWMgTWVzc2FnZSB4bXNnOworCQkvKiogKi8KKwkJcHVibGljIFR5cGUgeHJlc3BvbnNlVHlwZTsKKwkJLyoqICovCisJCXB1YmxpYyBGaWVsZCB4cmVzcG9uc2VGaWVsZDsKKwkJLyoqICovCisJCXB1YmxpYyBJbnRlZ2VyIHh0aW1lb3V0OworCQkvKiogKi8KKwkJcHVibGljIE9iamVjdCB4cmVzdWx0OworCQkvKiogKi8KKwkJcHVibGljIE1haWxib3ggeG1iOworCisJCS8qKiAqLworCQlwdWJsaWMgdm9pZCBjbGVhcigpCisJCXsKKwkJCXdoYXQgPSBudWxsOworCQkJeG1zZyA9IG51bGw7CisJCQl4cmVzcG9uc2VUeXBlID0gbnVsbDsKKwkJCXhyZXNwb25zZUZpZWxkID0gbnVsbDsKKwkJCXh0aW1lb3V0ID0gbnVsbDsKKwkJCXhyZXN1bHQgPSBudWxsOworCQl9CisKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0TWVzc2FnZSggV2hvIHJlY2lwaWVudCwgTWVzc2FnZSBtc2cgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlhc3NlcnROdWxsKCB3aGF0ICk7CisJCQl3aGF0ID0gV2hhdC5TRU5EOworCQkJeG1zZyA9IG1zZzsKKwkJfQorCisJCXB1YmxpYyBNYWlsYm94IGJlZ2luY2FsbCggTWVzc2FnZSBtc2cgKQorCQl7CisJCQlhc3NlcnROdWxsKCB3aGF0ICk7CisJCQl3aGF0ID0gV2hhdC5CRUdJTkNBTEw7CisJCQl4bXNnID0gbXNnOworCQkJeG1iID0gbmV3IE15TWFpbGJveCgpOworCQkJcmV0dXJuIHhtYjsKKwkJfQorCQkKKwkJcHVibGljIE9iamVjdCBlbmRjYWxsKCBNYWlsYm94IG1iLCBUeXBlIHJlc3BvbnNlVHlwZSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJYXNzZXJ0U2FtZSggV2hhdC5CRUdJTkNBTEwsIHdoYXQgKTsKKwkJCWFzc2VydFNhbWUoIHhtYiwgbWIgKTsKKwkJCXdoYXQgPSBXaGF0LkNBTEw7CisJCQl4bWIgPSBudWxsOworCQkJeHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTsKKwkJCXhyZXNwb25zZUZpZWxkID0gcmVzcG9uc2VUeXBlLmdldFJlc3BvbnNlRmllbGQoKTsKKwkJCXh0aW1lb3V0ID0gcmVzcG9uc2VUeXBlLmdldFRpbWVvdXQoKTsKKwkJCWlmICh4cmVzdWx0IGluc3RhbmNlb2YgRXhjZXB0aW9uKQorCQkJCXRocm93IChFeGNlcHRpb24pIHhyZXN1bHQ7CisJCQlyZXR1cm4geHJlc3VsdDsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHNlc3Npb25NZXNzYWdlKCBXaG8gc2VuZGVyLCBNZXNzYWdlIG1zZyApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBTZXNzaW9uTWVzc2FnZSBnZXRTZXNzaW9uKCkKKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKCBTZXNzaW9uTWVzc2FnZSBzZXNzaW9uICkKKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKwl9CisJCisJc3RhdGljIGNsYXNzIE15TWFpbGJveCBpbXBsZW1lbnRzIE1haWxib3gKKwl7CisJCXB1YmxpYyBib29sZWFuIGNsb3NlRGVsaXZlcnkoKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGNsb3NlUmVhZCgpIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgTG9uZyBnZXRNZXNzYWdlSWQoKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0Z1bGwoKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIG1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyBFbGVtZW50IHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgRWxlbWVudCByZWFkKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCByZWdpc3Rlck5vdGlmeSggTm90aWZ5IG5vdGlmeSwgT2JqZWN0IHN0YXRlLCBpbnQgbWF4RGVsYXkgKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJOb3RpZnkoIE5vdGlmeSBub3RpZnkgKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RTdHViVGVzdDFEb3RKYXZhLmphdmEgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0U3R1YlRlc3QxRG90SmF2YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGQ3MWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0U3R1YlRlc3QxRG90SmF2YS5qYXZhCkBAIC0wLDAgKzEsNTkzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5EZWxpdmVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5zdXBwb3J0Ll9FdGNoX0F1dGhFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEudHJhbnNwb3J0LlNlc3Npb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisKKy8qKiBUZXN0IG9mIFN0dWJUZXN0MSAqLworcHVibGljIGNsYXNzIFRlc3RTdHViVGVzdDFEb3RKYXZhIAoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9ub3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfbm90aGluZywKKwkJCXZmICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfbm90aGluZyApOworCQlhc3NlcnRFcXVhbHMoIDAsIHNyYy54cmVwbHkuc2l6ZSgpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2luY3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwgdmYgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIDMgKTsKKwkJc3R1Yi5zZXNzaW9uTWVzc2FnZSggbnVsbCwgbXNnICk7CisJCS8vIGNoZWNrIHRoZSByZXN1bHQuCisJCXNyYy54cmVwbHkKKwkJCS5jaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9pbmNyICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA0LCBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2luY3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfaW5jciwgdmYgKTsKKwkJLy8gbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIDMgKTsgLS0gY2F1c2UgYW4gZXhjZXB0aW9uCisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaW5jciApOworCQlhc3NlcnRFcXVhbHMoIDEsIHNyYy54cmVwbHkuc2l6ZSgpICk7CisJCU9iamVjdCBvID0gc3JjLnhyZXBseS5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJYXNzZXJ0VHJ1ZSggbyBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24gKTsgLy8gYmVjYXVzZSBpbmNyIGlzIG5vdAorCQkvLyBkZWNsYXJlZCB0byB0aHJvdworCQkvLyBhbnl0aGluZworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9zdWIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9zdWIsIHZmICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCA3ICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl95LCAzICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfc3ViICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA0LCBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3N1bSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3N1bSwgdmYgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIG5ldyBpbnRbXQorCQl7CisJCQkxLCAyLCAzLCA3LCAxMQorCQl9ICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfc3VtICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyNCwgc3JjLnhyZXBseS5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90cmFucywKKwkJCXZmICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lLCBUZXN0MS5FMS5BICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCA1ICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdHJhbnMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfdHJhbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfdHJhbnMsCisJCQl2ZiApOworCQltc2cucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgVGVzdDEuRTEuQiApOworCQltc2cucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgNSApOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3RyYW5zICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMCwgc3JjLnhyZXBseS5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90cmFucywKKwkJCXZmICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lLCBUZXN0MS5FMS5DICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCA1ICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdHJhbnMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoIDEyLCBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2Rpc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZGlzdCwgdmYgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EsIG5ldyBUZXN0MS5TMSggMSwgMSwgMSApICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9iLCBuZXcgVGVzdDEuUzEoIDAsIDAsIDAgKSApOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Rpc3QgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoIE1hdGguc3FydCggMyApLCBzcmMueHJlcGx5CisJCQkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfZGlzdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9kaXN0LCB2ZiApOworCQltc2cucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSwgbmV3IFRlc3QxLlMxKCAxLCAyLCAzICkgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IsIG5ldyBUZXN0MS5TMSggNiwgNSwgNCApICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfZGlzdCApOworCQlhc3NlcnRFcXVhbHMoIDEsIHNyYy54cmVwbHkuc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggTWF0aC5zcXJ0KCAzNSApLCBzcmMueHJlcGx5CisJCQkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfZmlsbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2ZpbGwsIHZmICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9uLCA0ICk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94LCAzICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfZmlsbCApOworCQlhc3NlcnRFcXVhbHMoIDEsIHNyYy54cmVwbHkuc2l6ZSgpICk7CisJCWludFtdIHggPSAoaW50W10pIHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCWFzc2VydE5vdE51bGwoIHggKTsKKwkJYXNzZXJ0RXF1YWxzKCA0LCB4Lmxlbmd0aCApOworCQlmb3IgKGludCB5IDogeCkKKwkJCWFzc2VydEVxdWFscyggMywgeSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9ibG93KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmxvdywgdmYgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywgImZvbyIgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUsIDIzICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmxvdyApOworCQlhc3NlcnRFcXVhbHMoIDEsIHNyYy54cmVwbHkuc2l6ZSgpICk7CisJCVRlc3QxLkV4Y3AxIGUgPSAoVGVzdDEuRXhjcDEpIHNyYy54cmVwbHkKKwkJCS5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggZSApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBlLm1zZyApOworCQlhc3NlcnRFcXVhbHMoIDIzLCBlLmNvZGUgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsCisJCQl2ZiApOworCQltc2cucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgVGVzdDEuRTEuQSApOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJT2JqZWN0IG8gPSBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQlhc3NlcnRFcXVhbHMoIDUsIG8gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsCisJCQl2ZiApOworCQltc2cucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgVGVzdDEuRTEuQiApOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJT2JqZWN0IG8gPSBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQlhc3NlcnRFcXVhbHMoIFRlc3QxLkV4Y3AzLmNsYXNzLCBvLmdldENsYXNzKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsCisJCQl2ZiApOworCQltc2cucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgVGVzdDEuRTEuQyApOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJT2JqZWN0IG8gPSBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQlhc3NlcnRFcXVhbHMoIFRlc3QxLkV4Y3A0LmNsYXNzLCBvLmdldENsYXNzKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYmVldHM0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfYmVldHMsCisJCQl2ZiApOworCQltc2cucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSwgbnVsbCApOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2JlZXRzICk7CisJCWFzc2VydEVxdWFscyggMCwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJT2JqZWN0IG8gPSBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQlhc3NlcnROdWxsKCBvICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2lzVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2lzVHJ1ZSwKKwkJCXZmICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfaXNUcnVlICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJT2JqZWN0IG8gPSBzcmMueHJlcGx5LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCQlhc3NlcnRFcXVhbHMoIHRydWUsIG8gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfaXNGYWxzZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2lzRmFsc2UsCisJCQl2ZiApOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2lzRmFsc2UgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlPYmplY3QgbyA9IHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCWFzc2VydEVxdWFscyggZmFsc2UsIG8gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYWx3YXlzV29ya3MoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9hbHdheXNXb3JrcywKKwkJCXZmICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYWx3YXlzV29ya3MgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlPYmplY3QgbyA9IHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCWFzc2VydEVxdWFscyggMjMsIG8gKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYWx3YXlzRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9hbHdheXNGYWlscywKKwkJCXZmICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYWx3YXlzRmFpbHMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlPYmplY3QgbyA9IHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCWFzc2VydFRydWUoIG8gaW5zdGFuY2VvZiBfRXRjaF9BdXRoRXhjZXB0aW9uICk7CisJCV9FdGNoX0F1dGhFeGNlcHRpb24gZSA9IChfRXRjaF9BdXRoRXhjZXB0aW9uKSBvOworCQlhc3NlcnRFcXVhbHMoICJzdHViIGNvdWxkIG5vdCBhdXRob3JpemUgYWx3YXlzRmFpbHMgdXNpbmcgaXNGYWxzZSIsCisJCQllLm1zZyApOworCX0KKwkgCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2ZpbGxPYmplY3RJbnQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsT2JqZWN0LAorCQkJdmYgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX24sIDMgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX28sIDkgKTsKKwkJc3R1Yi5zZXNzaW9uTWVzc2FnZSggbnVsbCwgbXNnICk7CisJCS8vIGNoZWNrIHRoZSByZXN1bHQuCisJCXNyYy54cmVwbHkKKwkJCS5jaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9maWxsT2JqZWN0ICk7CisJCWFzc2VydEVxdWFscyggMSwgc3JjLnhyZXBseS5zaXplKCkgKTsKKwkJT2JqZWN0W10gbyA9IChPYmplY3RbXSkgc3JjLnhyZXBseS5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbyApOworCQlhc3NlcnRFcXVhbHMoIDMsIG8ubGVuZ3RoICk7CisJCWZvciAoT2JqZWN0IG4gOiBvKQorCQkJYXNzZXJ0RXF1YWxzKCA5LCBuICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2ZpbGxPYmplY3RTdHIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsT2JqZWN0LAorCQkJdmYgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX24sIDMgKTsKKwkJbXNnLnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX28sICJyYXciICk7CisJCXN0dWIuc2Vzc2lvbk1lc3NhZ2UoIG51bGwsIG1zZyApOworCQkvLyBjaGVjayB0aGUgcmVzdWx0LgorCQlzcmMueHJlcGx5CisJCQkuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfZmlsbE9iamVjdCApOworCQlhc3NlcnRFcXVhbHMoIDEsIHNyYy54cmVwbHkuc2l6ZSgpICk7CisJCU9iamVjdFtdIG8gPSAoT2JqZWN0W10pIHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCWFzc2VydE5vdE51bGwoIG8gKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBvLmxlbmd0aCApOworCQlmb3IgKE9iamVjdCBuIDogbykKKwkJCWFzc2VydEVxdWFscyggInJhdyIsIG4gKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3Rocm93RXhjcDUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90aHJvd0V4Y3A1LAorCQkJdmYgKTsKKwkJbXNnLnB1dChWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLCJyYXciKTsKKwkJbXNnLnB1dChWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSw5KTsKKwkJbXNnLnB1dChWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfdmFsdWUsIkV4Y2VwdGlvbiB3aXRoIG9iamVjdCBhcyBwYXJhbSIpOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Rocm93RXhjcDUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlPYmplY3QgbyA9IHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCWFzc2VydFRydWUoIG8gaW5zdGFuY2VvZiBUZXN0MS5FeGNwNSApOworCQlUZXN0MS5FeGNwNSBlID0gKFRlc3QxLkV4Y3A1KSBvOworCQlhc3NlcnRFcXVhbHMoIGUubXNnLCAicmF3IiApOworCQlhc3NlcnRFcXVhbHMoIGUuY29kZSwgOSApOworCQlhc3NlcnRFcXVhbHMoIGUueCwgIkV4Y2VwdGlvbiB3aXRoIG9iamVjdCBhcyBwYXJhbSIgKTsKKwkJCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3Rocm93RXhjcDYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV90aHJvd0V4Y3A2LAorCQkJdmYgKTsKKwkJbXNnLnB1dChWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLCJyYXciKTsKKwkJbXNnLnB1dChWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSw5OSk7CisJCW1zZy5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl92YWx1ZSwgbWV0aG9kX2ZpbGxPYmplY3RIZWxwZXIoNSwiRXhjZXB0aW9uIHdpdGggYXJyYXkgb2Ygb2JqZWN0IGFzIHBhcmFtIikpOworCQlzdHViLnNlc3Npb25NZXNzYWdlKCBudWxsLCBtc2cgKTsKKwkJLy8gY2hlY2sgdGhlIHJlc3VsdC4KKwkJc3JjLnhyZXBseQorCQkJLmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Rocm93RXhjcDYgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBzcmMueHJlcGx5LnNpemUoKSApOworCQlPYmplY3QgbyA9IHNyYy54cmVwbHkuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJCWFzc2VydFRydWUoIG8gaW5zdGFuY2VvZiBUZXN0MS5FeGNwNiApOworCQlUZXN0MS5FeGNwNiBlID0gKFRlc3QxLkV4Y3A2KSBvOworCQlhc3NlcnRFcXVhbHMoIGUubXNnLCAicmF3IiApOworCQlhc3NlcnRFcXVhbHMoIGUuY29kZSwgOTkgKTsKKwkJT2JqZWN0W10gb2JqQXJyID0gZS54IDsKKwkJYXNzZXJ0Tm90TnVsbCggb2JqQXJyICk7CisJCWFzc2VydEVxdWFscyggNSwgb2JqQXJyLmxlbmd0aCApOworCQlmb3IgKE9iamVjdCBuIDogb2JqQXJyKQorCQkJYXNzZXJ0RXF1YWxzKCAiRXhjZXB0aW9uIHdpdGggYXJyYXkgb2Ygb2JqZWN0IGFzIHBhcmFtIiwgbiApOworCQkKKwl9CisJCisJLy8gSGVscGVyIG1ldGhvZCB0byBmaWxsIGFuIG9iamVjdCBhcnJheSBvZiBzaXplIHN6IHdpdGggT2JqZWN0IFZhbHVlCisJCisJcHJpdmF0ZSBPYmplY3RbXSBtZXRob2RfZmlsbE9iamVjdEhlbHBlciAoaW50IHN6LCBPYmplY3QgdmFsdWUpCisJeworCQlPYmplY3RbXSBteU9iamVjdCA9IHRlc3QuZmlsbE9iamVjdCggc3osIHZhbHVlICk7CisJCQorCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBzejsgaSsrICkgCisJCXsKKwkJCW15T2JqZWN0W2ldID0gdmFsdWU7CisJCX0JCisJCXJldHVybiBteU9iamVjdDsKKwl9CisKKwlwcml2YXRlIGZpbmFsIEZha2VUZXN0MSB0ZXN0ID0gbmV3IEZha2VUZXN0MSgpOworCisJcHJpdmF0ZSBmaW5hbCBWYWx1ZUZhY3RvcnlUZXN0MSB2ZiA9IG5ldyBWYWx1ZUZhY3RvcnlUZXN0MSggInRjcDoiICk7CisKKwlwcml2YXRlIGZpbmFsIFBvb2wgcG9vbCA9IG5ldyBQb29sKCkKKwl7CisJCXB1YmxpYyB2b2lkIHJ1biggUG9vbFJ1bm5hYmxlIHJ1bm5hYmxlICkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJcnVubmFibGUucnVuKCk7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOworCQkJfQorCQl9CisJfTsKKworCXByaXZhdGUgZmluYWwgTXlNZXNzYWdlU291cmNlIHNyYyA9IG5ldyBNeU1lc3NhZ2VTb3VyY2UoKTsKKwlwcml2YXRlIGZpbmFsIFN0dWJUZXN0MTxUZXN0MT4gc3R1YiA9IG5ldyBTdHViVGVzdDE8VGVzdDE+KCBzcmMsIHRlc3QsIHBvb2wsIHBvb2wgKTsKKwkKKwkvKiogYSBmYWtlIE1lc3NhZ2VTb3VyY2UgZm9yIHRlc3RpbmcgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15TWVzc2FnZVNvdXJjZSBpbXBsZW1lbnRzIERlbGl2ZXJ5U2VydmljZQorCXsKKwkJLyoqICovCisJCXB1YmxpYyBNZXNzYWdlIHhyZXBseTsKKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRNZXNzYWdlKCBXaG8gcmVjaXBpZW50LCBNZXNzYWdlIG1zZyApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJYXNzZXJ0TnVsbCggcmVjaXBpZW50ICk7CisJCQlhc3NlcnROdWxsKCB4cmVwbHkgKTsKKwkJCXhyZXBseSA9IG1zZzsKKwkJfQorCisJCXB1YmxpYyBNYWlsYm94IGJlZ2luY2FsbCggTWVzc2FnZSBtc2cgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGVuZGNhbGwoIE1haWxib3ggbWIsIFR5cGUgcmVzcG9uc2VUeXBlICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gc2Vzc2lvbk1lc3NhZ2UoIFdobyBzZW5kZXIsIE1lc3NhZ2UgbXNnICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJLy8gaWdub3JlCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFNlc3Npb25NZXNzYWdlIGdldFNlc3Npb24oKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2Vzc2lvbiggU2Vzc2lvbk1lc3NhZ2Ugc2Vzc2lvbiApCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJCisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJCXRocm93cyBFeGNlcHRpb24KKwkJeworCQkJLy8gaWdub3JlCisJCQkKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJCQorCQl9CisKKwkJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdFRlc3QxRG90SmF2YS5qYXZhIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdFRlc3QxRG90SmF2YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzE0MjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0VGVzdDFEb3RKYXZhLmphdmEKQEAgLTAsMCArMSw3NTEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKiogVGVzdCBvZiBUZXN0MSAqLworcHVibGljIGNsYXNzIFRlc3RUZXN0MURvdEphdmEKK3sKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdF9ib29sZWFucygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEZhbHNlKCBUZXN0MS5CT09MMSApOworCQlhc3NlcnRUcnVlKCBUZXN0MS5CT09MMiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdF9ieXRlcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggQnl0ZS5NSU5fVkFMVUUsIFRlc3QxLkJZVEUxICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIC0xLCBUZXN0MS5CWVRFMiApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAwLCBUZXN0MS5CWVRFMyApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAxLCBUZXN0MS5CWVRFNCApOworCQlhc3NlcnRFcXVhbHMoIEJ5dGUuTUFYX1ZBTFVFLCBUZXN0MS5CWVRFNSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdF9zaG9ydHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIFNob3J0Lk1JTl9WQUxVRSwgVGVzdDEuU0hPUlQxICk7CisJCWFzc2VydEVxdWFscyggKHNob3J0KSAtMSwgVGVzdDEuU0hPUlQyICk7CisJCWFzc2VydEVxdWFscyggKHNob3J0KSAwLCBUZXN0MS5TSE9SVDMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoc2hvcnQpIDEsIFRlc3QxLlNIT1JUNCApOworCQlhc3NlcnRFcXVhbHMoIFNob3J0Lk1BWF9WQUxVRSwgVGVzdDEuU0hPUlQ1ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0X2ludHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIEludGVnZXIuTUlOX1ZBTFVFLCBUZXN0MS5JTlQxICk7CisJCWFzc2VydEVxdWFscyggLTEsIFRlc3QxLklOVDIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBUZXN0MS5JTlQzICk7CisJCWFzc2VydEVxdWFscyggMSwgVGVzdDEuSU5UNCApOworCQlhc3NlcnRFcXVhbHMoIEludGVnZXIuTUFYX1ZBTFVFLCBUZXN0MS5JTlQ1ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0X2xvbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCBMb25nLk1JTl9WQUxVRSwgVGVzdDEuTE9ORzEgKTsKKwkJYXNzZXJ0RXF1YWxzKCAobG9uZykgLTEsIFRlc3QxLkxPTkcyICk7CisJCWFzc2VydEVxdWFscyggKGxvbmcpIDAsIFRlc3QxLkxPTkczICk7CisJCWFzc2VydEVxdWFscyggKGxvbmcpIDEsIFRlc3QxLkxPTkc0ICk7CisJCWFzc2VydEVxdWFscyggTG9uZy5NQVhfVkFMVUUsIFRlc3QxLkxPTkc1ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0X2Zsb2F0cygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggRmxvYXQuTUlOX1ZBTFVFLCBUZXN0MS5GTE9BVDEgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoZmxvYXQpIC0xLCBUZXN0MS5GTE9BVDIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoZmxvYXQpIDAsIFRlc3QxLkZMT0FUMyApOworCQlhc3NlcnRFcXVhbHMoIChmbG9hdCkgMSwgVGVzdDEuRkxPQVQ0ICk7CisJCWFzc2VydEVxdWFscyggRmxvYXQuTUFYX1ZBTFVFLCBUZXN0MS5GTE9BVDUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgY29uc3RfZG91YmxlcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggRG91YmxlLk1JTl9WQUxVRSwgVGVzdDEuRE9VQkxFMSApOworCQlhc3NlcnRFcXVhbHMoIChkb3VibGUpIC0xLCBUZXN0MS5ET1VCTEUyICk7CisJCWFzc2VydEVxdWFscyggKGRvdWJsZSkgMCwgVGVzdDEuRE9VQkxFMyApOworCQlhc3NlcnRFcXVhbHMoIChkb3VibGUpIDEsIFRlc3QxLkRPVUJMRTQgKTsKKwkJYXNzZXJ0RXF1YWxzKCBEb3VibGUuTUFYX1ZBTFVFLCBUZXN0MS5ET1VCTEU1ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0X3N0cmluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoICIiLCBUZXN0MS5TVFJJTkcxICk7CisJCWFzc2VydEVxdWFscyggImEiLCBUZXN0MS5TVFJJTkcyICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIFRlc3QxLlNUUklORzMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYVx0Ylx0Y1xyXG4iLCBUZXN0MS5TVFJJTkc0ICk7CisJCWFzc2VydEVxdWFscyggInggeCIsIFRlc3QxLlNUUklORzUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAieFx1MDBiZngiLCBUZXN0MS5TVFJJTkc2ICk7CisJCWFzc2VydEVxdWFscyggInhcdTAzYTl4IiwgVGVzdDEuU1RSSU5HNyApOworCQlhc3NlcnRFcXVhbHMoICJ4XFx4IiwgVGVzdDEuU1RSSU5HOCApOworCQlhc3NlcnRFcXVhbHMoICJ4J3giLCBUZXN0MS5TVFJJTkc5ICk7CisJCWFzc2VydEVxdWFscyggInhcIngiLCBUZXN0MS5TVFJJTkcxMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBlbnVtX0UxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBUZXN0MS5FMS52YWx1ZXMoKS5sZW5ndGggKTsKKwkJYXNzZXJ0Tm90TnVsbCggVGVzdDEuRTEuQSApOworCQlhc3NlcnROb3ROdWxsKCBUZXN0MS5FMS5CICk7CisJCWFzc2VydE5vdE51bGwoIFRlc3QxLkUxLkMgKTsKKwkJYXNzZXJ0U2FtZSggVGVzdDEuRTEuQSwgVGVzdDEuRTEudmFsdWVPZiggIkEiICkgKTsKKwkJYXNzZXJ0U2FtZSggVGVzdDEuRTEuQiwgVGVzdDEuRTEudmFsdWVPZiggIkIiICkgKTsKKwkJYXNzZXJ0U2FtZSggVGVzdDEuRTEuQywgVGVzdDEuRTEudmFsdWVPZiggIkMiICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBUZXN0MS5FMS5BLm9yZGluYWwoKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIFRlc3QxLkUxLkIub3JkaW5hbCgpICk7CisJCWFzc2VydEVxdWFscyggMiwgVGVzdDEuRTEuQy5vcmRpbmFsKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgc3RydWN0X1MxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVGVzdDEuUzEgcyA9IG5ldyBUZXN0MS5TMSggMSwgMiwgMyApOworCQlhc3NlcnRFcXVhbHMoIDEsIHMueCApOworCQlhc3NlcnRFcXVhbHMoIDIsIHMueSApOworCQlhc3NlcnRFcXVhbHMoIDMsIHMueiApOworCQkKKwkJcyA9IG5ldyBUZXN0MS5TMSggbnVsbCwgbnVsbCwgbnVsbCApOworCQlhc3NlcnROdWxsKCBzLnggKTsKKwkJYXNzZXJ0TnVsbCggcy55ICk7CisJCWFzc2VydE51bGwoIHMueiApOworCQkKKwkJcyA9IG5ldyBUZXN0MS5TMSgpOworCQlhc3NlcnROdWxsKCBzLnggKTsKKwkJYXNzZXJ0TnVsbCggcy55ICk7CisJCWFzc2VydE51bGwoIHMueiApOworCQkKKwkJcy54ID0gNDsKKwkJcy55ID0gNTsKKwkJcy56ID0gNjsKKwkJCisJCWFzc2VydEVxdWFscyggNCwgcy54ICk7CisJCWFzc2VydEVxdWFscyggNSwgcy55ICk7CisJCWFzc2VydEVxdWFscyggNiwgcy56ICk7CisJCQorCQlzLnggPSBudWxsOworCQlhc3NlcnROdWxsKCBzLnggKTsKKwkJCisJCXMueCA9IDc7CisJCWFzc2VydEVxdWFscyggNywgcy54ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGV4Y2VwdF9FeGNwMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRlc3QxLkV4Y3AxIGUgPSBuZXcgVGVzdDEuRXhjcDEoICJmb28iLCAyMyApOworCQlhc3NlcnRFcXVhbHMoICJmb28iLCBlLm1zZyApOworCQlhc3NlcnRFcXVhbHMoIDIzLCBlLmNvZGUgKTsKKwkJCisJCWUgPSBuZXcgVGVzdDEuRXhjcDEoIG51bGwsIG51bGwgKTsKKwkJYXNzZXJ0TnVsbCggZS5tc2cgKTsKKwkJYXNzZXJ0TnVsbCggZS5jb2RlICk7CisJCQorCQllID0gbmV3IFRlc3QxLkV4Y3AxKCk7CisJCWFzc2VydE51bGwoIGUubXNnICk7CisJCWFzc2VydE51bGwoIGUuY29kZSApOworCQkKKwkJZS5tc2cgPSAiYmFyIjsKKwkJZS5jb2RlID0gMjQ7CisJCQorCQlhc3NlcnRFcXVhbHMoICJiYXIiLCBlLm1zZyApOworCQlhc3NlcnRFcXVhbHMoIDI0LCBlLmNvZGUgKTsKKwkJCisJCWUubXNnID0gbnVsbDsKKwkJZS5jb2RlID0gbnVsbDsKKwkJCisJCWFzc2VydE51bGwoIGUubXNnICk7CisJCWFzc2VydE51bGwoIGUuY29kZSApOworCisJCVRocm93YWJsZSB0ID0gZTsKKwkJYXNzZXJ0VHJ1ZSggdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbiApOworCQlhc3NlcnRGYWxzZSggdCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24gKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZXhjZXB0X0V4Y3AyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVGVzdDEuRXhjcDIgZSA9IG5ldyBUZXN0MS5FeGNwMigpOworCisJCVRocm93YWJsZSB0ID0gZTsKKwkJYXNzZXJ0VHJ1ZSggdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbiApOworCQlhc3NlcnRUcnVlKCB0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBleGNlcHRfRXhjcDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUZXN0MS5FeGNwMyBlID0gbmV3IFRlc3QxLkV4Y3AzKCk7CisKKwkJVGhyb3dhYmxlIHQgPSBlOworCQlhc3NlcnRUcnVlKCB0IGluc3RhbmNlb2YgRXhjZXB0aW9uICk7CisJCWFzc2VydFRydWUoIHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGV4Y2VwdF9FeGNwNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRlc3QxLkV4Y3A0IGUgPSBuZXcgVGVzdDEuRXhjcDQoKTsKKworCQlUaHJvd2FibGUgdCA9IGU7CisJCWFzc2VydFRydWUoIHQgaW5zdGFuY2VvZiBFeGNlcHRpb24gKTsKKwkJYXNzZXJ0RmFsc2UoIHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9ub3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdC5ub3RoaW5nKCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9pbmNyMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMiwgdGVzdC5pbmNyKCAxICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2luY3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAzLCB0ZXN0LmluY3IoIDIgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfaW5jcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIC0xLCB0ZXN0LmluY3IoIC0yICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3N1YjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDUsIHRlc3Quc3ViKCA3LCAyICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3N1YjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDgsIHRlc3Quc3ViKCAyMywgMTUgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2Rfc3ViMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggLTUsIHRlc3Quc3ViKCAyLCA3ICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3N1bSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMjQsIHRlc3Quc3VtKCBuZXcgaW50W10geyAxLCAyLCAzLCA3LCAxMSB9ICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMiwgdGVzdC50cmFucyggVGVzdDEuRTEuQSwgNSApICk7IC8vIGRpdmlkZSBieSAyCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF90cmFuczIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIDEwLCB0ZXN0LnRyYW5zKCBUZXN0MS5FMS5CLCA1ICkgKTsgLy8gbXVsIGJ5IDIKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX3RyYW5zMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMTIsIHRlc3QudHJhbnMoIFRlc3QxLkUxLkMsIDUgKSApOyAvLyBhZGQgNworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfZGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIE1hdGguc3FydCggMyApLCB0ZXN0LmRpc3QoIG5ldyBUZXN0MS5TMSggMSwgMSwgMSApLCBuZXcgVGVzdDEuUzEoIDAsIDAsIDAgKSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9kaXN0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggTWF0aC5zcXJ0KCAzNSApLCB0ZXN0LmRpc3QoIG5ldyBUZXN0MS5TMSggMSwgMiwgMyApLCBuZXcgVGVzdDEuUzEoIDYsIDUsIDQgKSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9kaXN0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggTWF0aC5zcXJ0KCA1NiApLCB0ZXN0LmRpc3QoIG5ldyBUZXN0MS5TMSggMSwgMiwgMyApLCBuZXcgVGVzdDEuUzEoIC0xLCAtMiwgLTMgKSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludFtdIHggPSB0ZXN0LmZpbGwoIDAsIDEgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCB4Lmxlbmd0aCApOworCQlmb3IgKGludCBpOiB4KQorCQkJYXNzZXJ0RXF1YWxzKCAxLCBpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludFtdIHggPSB0ZXN0LmZpbGwoIDEsIDIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCB4Lmxlbmd0aCApOworCQlmb3IgKGludCBpOiB4KQorCQkJYXNzZXJ0RXF1YWxzKCAyLCBpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9maWxsMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludFtdIHggPSB0ZXN0LmZpbGwoIDIsIDMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCB4Lmxlbmd0aCApOworCQlmb3IgKGludCBpOiB4KQorCQkJYXNzZXJ0RXF1YWxzKCAzLCBpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9maWxsT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IHN6ID0gMTA7CisJCQorCQkvLyBBbGwgY29uc3QgdHlwZXMKKwkJbWV0aG9kX2ZpbGxPYmplY3RIZWxwZXIoIHN6LCBUZXN0MS5CT09MMSApOwkKKwkJbWV0aG9kX2ZpbGxPYmplY3RIZWxwZXIoIHN6LCBUZXN0MS5CWVRFNSApOworCQltZXRob2RfZmlsbE9iamVjdEhlbHBlciggc3osIFRlc3QxLlNIT1JUNSApOwkKKwkJbWV0aG9kX2ZpbGxPYmplY3RIZWxwZXIoIHN6LCBUZXN0MS5JTlQ1ICk7CisJCW1ldGhvZF9maWxsT2JqZWN0SGVscGVyKCBzeiwgVGVzdDEuTE9ORzUgKTsJCisJCW1ldGhvZF9maWxsT2JqZWN0SGVscGVyKCBzeiwgVGVzdDEuRkxPQVQ1ICk7CisJCW1ldGhvZF9maWxsT2JqZWN0SGVscGVyKCBzeiwgVGVzdDEuRE9VQkxFNSApOwkKKwkJbWV0aG9kX2ZpbGxPYmplY3RIZWxwZXIoIHN6LCBUZXN0MS5TVFJJTkczICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF9ibG93MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQl0ZXN0LmJsb3coICJmb28iLCAyICk7CisJCQlmYWlsKCAiYmxvdyBkaWQgbm90IHRocm93IiApOworCQl9CisJCWNhdGNoKCBUZXN0MS5FeGNwMSBlICkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKCAiZm9vIiwgZS5tc2cgKTsKKwkJCWFzc2VydEVxdWFscyggMiwgZS5jb2RlICk7CisJCX0KKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2Jsb3cyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdHJ5CisJCXsKKwkJCXRlc3QuYmxvdyggImJhciIsIDMgKTsKKwkJCWZhaWwoICJibG93IGRpZCBub3QgdGhyb3ciICk7CisJCX0KKwkJY2F0Y2goIFRlc3QxLkV4Y3AxIGUgKQorCQl7CisJCQlhc3NlcnRFcXVhbHMoICJiYXIiLCBlLm1zZyApOworCQkJYXNzZXJ0RXF1YWxzKCAzLCBlLmNvZGUgKTsKKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZXRob2RfYmVldHMxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCA1LCB0ZXN0LmJlZXRzKCBUZXN0MS5FMS5BICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQl0ZXN0LmJlZXRzKCBUZXN0MS5FMS5CICk7CisJCQlmYWlsKCAiYmVldHMgZGlkIG5vdCB0aHJvdyIgKTsKKwkJfQorCQljYXRjaCAoIFRlc3QxLkV4Y3AzIGUgKQorCQl7CisJCQlhc3NlcnRUcnVlKCB0cnVlICk7CisJCX0KKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQl0ZXN0LmJlZXRzKCBUZXN0MS5FMS5DICk7CisJCQlmYWlsKCAiYmVldHMgZGlkIG5vdCB0aHJvdyIgKTsKKwkJfQorCQljYXRjaCAoIFRlc3QxLkV4Y3A0IGUgKQorCQl7CisJCQlhc3NlcnRUcnVlKCB0cnVlICk7CisJCX0KKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWV0aG9kX2JlZXRzNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydE51bGwoIHRlc3QuYmVldHMoIG51bGwgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBzdHJ1Y3RfUzMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UzNIZWxwZXIoICJib29sZWFuIiwgVGVzdDEuQk9PTDIgKTsKKwkJdGVzdFMzSGVscGVyKCAiYnl0ZSIsIFRlc3QxLkJZVEU1ICk7CisJCXRlc3RTM0hlbHBlciggInNob3J0IiwgVGVzdDEuU0hPUlQ1ICk7CisJCXRlc3RTM0hlbHBlciggImludCIsIFRlc3QxLklOVDUgKTsKKwkJdGVzdFMzSGVscGVyKCAibG9uZyIsIFRlc3QxLkxPTkc1ICk7CisJCXRlc3RTM0hlbHBlciggImZsb2F0IiwgVGVzdDEuRkxPQVQ1ICk7CisJCXRlc3RTM0hlbHBlciggImRvdWJsZSIsIFRlc3QxLkRPVUJMRTUgKTsKKwkJdGVzdFMzSGVscGVyKCAic3RyaW5nIiwgVGVzdDEuU1RSSU5HMyApOwkJCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHN0cnVjdF9TNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CQkKKwkJaW50IHN6ID0gMTA7CisJCQorCQl0ZXN0UzRIZWxwZXIoc3osICJib29sZWFuIiwgVGVzdDEuQk9PTDIgKTsKKwkJdGVzdFM0SGVscGVyKHN6LCAiYnl0ZSIsIFRlc3QxLkJZVEU1ICk7CisJCXRlc3RTNEhlbHBlcihzeiwgInNob3J0IiwgVGVzdDEuU0hPUlQ1ICk7CisJCXRlc3RTNEhlbHBlcihzeiwgImludCIsIFRlc3QxLklOVDUgKTsKKwkJdGVzdFM0SGVscGVyKHN6LCAibG9uZyIsIFRlc3QxLkxPTkc1ICk7CisJCXRlc3RTNEhlbHBlcihzeiwgImZsb2F0IiwgVGVzdDEuRkxPQVQ1ICk7CisJCXRlc3RTNEhlbHBlcihzeiwgImRvdWJsZSIsIFRlc3QxLkRPVUJMRTUgKTsKKwkJdGVzdFM0SGVscGVyKHN6LCAic3RyaW5nIiwgVGVzdDEuU1RSSU5HMyApOwkJCisKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZXhjZXB0X0V4Y3A1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IGNvZGUgPSA1MDA7CisJCVN0cmluZyBtc2cgPSAiRXhjcDUiOworCQkKKwkJdGVzdEV4Y3A1SGVscGVyIChtc2csIGNvZGUsIFRlc3QxLkJPT0wxKTsKKwkJdGVzdEV4Y3A1SGVscGVyIChtc2csIGNvZGUsIFRlc3QxLkJZVEU1KTsKKwkJdGVzdEV4Y3A1SGVscGVyIChtc2csIGNvZGUsIFRlc3QxLlNIT1JUNSk7CisJCXRlc3RFeGNwNUhlbHBlciAobXNnLCBjb2RlLCBUZXN0MS5JTlQ1KTsKKwkJdGVzdEV4Y3A1SGVscGVyIChtc2csIGNvZGUsIFRlc3QxLkxPTkc1KTsKKwkJdGVzdEV4Y3A1SGVscGVyIChtc2csIGNvZGUsIFRlc3QxLkZMT0FUNSk7CisJCXRlc3RFeGNwNUhlbHBlciAobXNnLCBjb2RlLCBUZXN0MS5ET1VCTEU1KTsKKwkJdGVzdEV4Y3A1SGVscGVyIChtc2csIGNvZGUsIFRlc3QxLlNUUklORzMpOwkJCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGV4Y2VwdF9FeGNwNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludCBzeiA9IDEwOworCQlpbnQgY29kZSA9IDUwMDsKKwkJU3RyaW5nIG1zZyA9ICJFeGNwNiI7CisJCQorCQl0ZXN0RXhjcDZIZWxwZXIoIHN6LCBtc2csIGNvZGUsIFRlc3QxLkJPT0wxICk7CisJCXRlc3RFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuQllURTUgKTsKKwkJdGVzdEV4Y3A2SGVscGVyKCBzeiwgbXNnLCBjb2RlLCBUZXN0MS5TSE9SVDUgKTsKKwkJdGVzdEV4Y3A2SGVscGVyKCBzeiwgbXNnLCBjb2RlLCBUZXN0MS5JTlQ1ICk7CisJCXRlc3RFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuTE9ORzUgKTsKKwkJdGVzdEV4Y3A2SGVscGVyKCBzeiwgbXNnLCBjb2RlLCBUZXN0MS5GTE9BVDUgKTsKKwkJdGVzdEV4Y3A2SGVscGVyKCBzeiwgbXNnLCBjb2RlLCBUZXN0MS5ET1VCTEU1ICk7CisJCXRlc3RFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuU1RSSU5HMyApOwkJCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF90aHJvd0V4Y3A1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIG1zZyA9ICJ0aHJvd0V4Y3A1IjsKKwkJaW50IGNvZGUgPSA1MDA7CisKKwkJbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIoIG1zZywgY29kZSwgVGVzdDEuQk9PTDEgKTsKKwkJbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIoIG1zZywgY29kZSwgVGVzdDEuQllURTUgKTsKKwkJbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIoIG1zZywgY29kZSwgVGVzdDEuU0hPUlQ1ICk7CisJCW1ldGhvZF90aHJvd0V4Y3A1SGVscGVyKCBtc2csIGNvZGUsIFRlc3QxLklOVDUgKTsKKwkJbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIoIG1zZywgY29kZSwgVGVzdDEuTE9ORzUgKTsKKwkJbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIoIG1zZywgY29kZSwgVGVzdDEuRkxPQVQ1ICk7CisJCW1ldGhvZF90aHJvd0V4Y3A1SGVscGVyKCBtc2csIGNvZGUsIFRlc3QxLkRPVUJMRTUgKTsKKwkJbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIoIG1zZywgY29kZSwgVGVzdDEuU1RSSU5HMyApOwkJCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIG1ldGhvZF90aHJvd0V4Y3A2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIG1zZyA9ICJ0aHJvd0V4Y3A2IjsKKwkJaW50IGNvZGUgPSA1MDA7CisJCWludCBzeiA9IDEwOworCisJCW1ldGhvZF90aHJvd0V4Y3A2SGVscGVyKCBzeiwgbXNnLCBjb2RlLCBUZXN0MS5CT09MMSApOworCQltZXRob2RfdGhyb3dFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuQllURTUgKTsKKwkJbWV0aG9kX3Rocm93RXhjcDZIZWxwZXIoIHN6LCBtc2csIGNvZGUsIFRlc3QxLlNIT1JUNSApOworCQltZXRob2RfdGhyb3dFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuSU5UNSApOworCQltZXRob2RfdGhyb3dFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuTE9ORzUgKTsKKwkJbWV0aG9kX3Rocm93RXhjcDZIZWxwZXIoIHN6LCBtc2csIGNvZGUsIFRlc3QxLkZMT0FUNSApOworCQltZXRob2RfdGhyb3dFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuRE9VQkxFNSApOworCQltZXRob2RfdGhyb3dFeGNwNkhlbHBlciggc3osIG1zZywgY29kZSwgVGVzdDEuU1RSSU5HMyApOwkJCisKKwl9CisJCisJLy8KKwkvLyBVdGlsaXR5IG1ldGhvZHMKKwkvLworCQorCXByaXZhdGUgdm9pZCB0ZXN0UzNIZWxwZXIoIFN0cmluZyB0eXBlLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJVGVzdDEuUzMgcyA9IG5ldyBUZXN0MS5TMyggdHlwZSwgdmFsdWUgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0eXBlLCBzLnRpcGUgKTsKKwkJYXNzZXJ0RXF1YWxzKCB2YWx1ZSwgcy54ICk7CisJCQorCQlzID0gbmV3IFRlc3QxLlMzKCBudWxsLCBudWxsICk7CisJCWFzc2VydE51bGwoIHMudGlwZSApOworCQlhc3NlcnROdWxsKCBzLnggKTsKKwkJCisJCXMgPSBuZXcgVGVzdDEuUzMoKTsKKwkJYXNzZXJ0TnVsbCggcy50aXBlICk7CisJCWFzc2VydE51bGwoIHMueCApOworCQkKKwkJcy50aXBlID0gdHlwZTsKKwkJcy54ID0gdmFsdWU7CQorCQlhc3NlcnRFcXVhbHMoIHR5cGUsIHMudGlwZSApOworCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCBzLnggKTsKKwkJCisJCXMueCA9IG51bGw7CisJCWFzc2VydE51bGwoIHMueCApOworCQkKKwkJcy54ID0gdmFsdWU7CisJCWFzc2VydEVxdWFscyggdmFsdWUsIHMueCApOworCX0KKworCS8qCisJICogamFjYXBwcyAxMC1PQ1QtMjAwNworCSAqIAorCSAqIHRlc3RTNEhlbHBlciAtIEZpbGwgYW4gUzQgc3RydWN0IHdpdGggYSB2YWx1ZXMgZm9yIHRoZSB0eXBlIAorCSAqIGFuZCBPYmplY3QgYXJyYXkgYW5kIHZlcmlmeSB0aGUgdmFsdWVzLgorCSAqIAorCSAqIEBwYXJhbSBzeiAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIE9iamVjdCBhcnJheQorCSAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGRhdGEgdG8gYmUgcHV0IGluIE9iamVjdCBhcnJheQorCSAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0eXBlIHRvIGZpbGwgdGhlIGFycmF5IHdpdGgKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgdGVzdFM0SGVscGVyKCBpbnQgc3osIFN0cmluZyB0eXBlLCBPYmplY3QgdmFsdWUgKQorCXsKKwkJT2JqZWN0W10gbXlPYmplY3QgPSB0ZXN0LmZpbGxPYmplY3QoIHN6LCB2YWx1ZSApOworCQkKKwkJVGVzdDEuUzQgcyA9IG5ldyBUZXN0MS5TNCggdHlwZSwgbXlPYmplY3QgKTsKKwkJYXNzZXJ0RXF1YWxzKCB0eXBlLCBzLnRpcGUgKTsKKwkJYXNzZXJ0RXF1YWxzKCBzeiwgbXlPYmplY3QubGVuZ3RoICk7CisJCQorCQlmb3IgKE9iamVjdCBlbGVtZW50IDogbXlPYmplY3QpCisJCXsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIGVsZW1lbnQgKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0RXhjcDVIZWxwZXIgKFN0cmluZyBtc2csIGludCBjb2RlLCBPYmplY3QgdmFsdWUpCisJeworCQlUZXN0MS5FeGNwNSBlID0gbmV3IFRlc3QxLkV4Y3A1KCBtc2csIGNvZGUsIHZhbHVlICk7CisJCWFzc2VydEVxdWFscyggbXNnLCBlLm1zZyApOworCQlhc3NlcnRFcXVhbHMoIGNvZGUsIGUuY29kZSApOworCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCBlLngpOworCQkKKwkJZSA9IG5ldyBUZXN0MS5FeGNwNSggbnVsbCwgbnVsbCwgbnVsbCApOworCQlhc3NlcnROdWxsKCBlLm1zZyApOworCQlhc3NlcnROdWxsKCBlLmNvZGUgKTsKKwkJYXNzZXJ0TnVsbCggZS54KTsKKworCQllID0gbmV3IFRlc3QxLkV4Y3A1KCk7CisJCWFzc2VydE51bGwoIGUubXNnICk7CisJCWFzc2VydE51bGwoIGUuY29kZSApOworCQlhc3NlcnROdWxsKCBlLnggKTsKKwkJCisJCWUubXNnID0gbXNnOworCQllLmNvZGUgPSBjb2RlOworCQllLnggPSB2YWx1ZTsKKwkJCisJCWFzc2VydEVxdWFscyggbXNnLCBlLm1zZyApOworCQlhc3NlcnRFcXVhbHMoIGNvZGUsIGUuY29kZSApOworCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCBlLnggKTsKKwkJCisJCWUubXNnID0gbnVsbDsKKwkJZS5jb2RlID0gbnVsbDsKKwkJZS54ID0gbnVsbDsKKwkJCisJCWFzc2VydE51bGwoIGUubXNnICk7CisJCWFzc2VydE51bGwoIGUuY29kZSApOworCQlhc3NlcnROdWxsKCBlLnggKTsJCQorCisJCVRocm93YWJsZSB0ID0gZTsKKwkJYXNzZXJ0VHJ1ZSggdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbiApOworCQlhc3NlcnRGYWxzZSggdCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24gKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3RFeGNwNkhlbHBlciAoaW50IHN6LCBTdHJpbmcgbXNnLCBpbnQgY29kZSwgT2JqZWN0IHZhbHVlICkKKwl7CisJCU9iamVjdFtdIG15T2JqZWN0ID0gdGVzdC5maWxsT2JqZWN0KCBzeiwgdmFsdWUgKTsKKwkJCisJCVRlc3QxLkV4Y3A2IGUgPSBuZXcgVGVzdDEuRXhjcDYoIG1zZywgY29kZSwgbXlPYmplY3QgKTsKKwkJYXNzZXJ0RXF1YWxzKCBtc2csIGUubXNnICk7CisJCWFzc2VydEVxdWFscyggY29kZSwgZS5jb2RlICk7CisKKwkJZm9yIChPYmplY3QgZWxlbWVudCA6IG15T2JqZWN0KQorCQl7CisJCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCBlbGVtZW50ICk7CisJCX0KKwkJCisJCWUgPSBuZXcgVGVzdDEuRXhjcDYoIG51bGwsIG51bGwsIG51bGwgKTsKKwkJYXNzZXJ0TnVsbCggZS5tc2cgKTsKKwkJYXNzZXJ0TnVsbCggZS5jb2RlICk7CisJCWFzc2VydE51bGwoIGUueCApOworCisJCWUgPSBuZXcgVGVzdDEuRXhjcDYoKTsKKwkJYXNzZXJ0TnVsbCggZS5tc2cgKTsKKwkJYXNzZXJ0TnVsbCggZS5jb2RlICk7CisJCWFzc2VydE51bGwoIGUueCApOworCQkKKwkJZS5tc2cgPSBtc2c7CisJCWUuY29kZSA9IGNvZGU7CisJCWUueCA9IG15T2JqZWN0OworCQkKKwkJYXNzZXJ0RXF1YWxzKCBtc2csIGUubXNnICk7CisJCWFzc2VydEVxdWFscyggY29kZSwgZS5jb2RlICk7CisJCQorCQlmb3IgKE9iamVjdCBlbGVtZW50IDogbXlPYmplY3QpCisJCXsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIGVsZW1lbnQgKTsKKwkJfQorCQkKKwkJZS5tc2cgPSBudWxsOworCQllLmNvZGUgPSBudWxsOworCQllLnggPSBudWxsOworCQkKKwkJYXNzZXJ0TnVsbCggZS5tc2cgKTsKKwkJYXNzZXJ0TnVsbCggZS5jb2RlICk7CisJCWFzc2VydE51bGwoIGUueCApOwkJCisKKwkJVGhyb3dhYmxlIHQgPSBlOworCQlhc3NlcnRUcnVlKCB0IGluc3RhbmNlb2YgRXhjZXB0aW9uICk7CisJCWFzc2VydEZhbHNlKCB0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbiApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgbWV0aG9kX3Rocm93RXhjcDVIZWxwZXIgKFN0cmluZyBtc2csIGludCBjb2RlLCBPYmplY3QgdmFsdWUpCisJeworCQl0cnkKKwkJeworCQkJdGVzdC50aHJvd0V4Y3A1KCBtc2csIGNvZGUsIHZhbHVlICk7CisJCQlmYWlsKCAidGhyb3dFeGNwNSBkaWQgbm90IHRocm93IiApOworCQl9CisJCWNhdGNoKCBUZXN0MS5FeGNwNSBlICkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKCBtc2csIGUubXNnICk7CisJCQlhc3NlcnRFcXVhbHMoIGNvZGUsIGUuY29kZSApOworCQkJYXNzZXJ0RXF1YWxzKCB2YWx1ZSwgZS54ICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIG1ldGhvZF90aHJvd0V4Y3A2SGVscGVyIChpbnQgc3osIFN0cmluZyBtc2csIGludCBjb2RlLCBPYmplY3QgdmFsdWUpCisJeworCQlPYmplY3RbXSBteU9iamVjdCA9IHRlc3QuZmlsbE9iamVjdCggc3osIHZhbHVlICk7CisJCQorCQl0cnkKKwkJeworCQkJdGVzdC50aHJvd0V4Y3A2KCBtc2csIGNvZGUsIG15T2JqZWN0ICk7CisJCQlmYWlsKCAidGhyb3dFeGNwNSBkaWQgbm90IHRocm93IiApOworCQl9CisJCWNhdGNoKCBUZXN0MS5FeGNwNiBlICkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKCBtc2csIGUubXNnICk7CisJCQlhc3NlcnRFcXVhbHMoIGNvZGUsIGUuY29kZSApOworCQkJCisJCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBteU9iamVjdC5sZW5ndGg7IGkrKyApIAorCQkJeworCQkJCWFzc2VydEVxdWFscyggdmFsdWUsIGUueFtpXSApOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBtZXRob2RfZmlsbE9iamVjdEhlbHBlciAoaW50IHN6LCBPYmplY3QgdmFsdWUpCisJeworCQlPYmplY3RbXSBteU9iamVjdCA9IHRlc3QuZmlsbE9iamVjdCggc3osIHZhbHVlICk7CisJCQorCQlmb3IgKE9iamVjdCBlbGVtZW50IDogbXlPYmplY3QpCisJCXsKKwkJCWFzc2VydEVxdWFscyggdmFsdWUsIGVsZW1lbnQgKTsKKwkJfQkKKwl9CisKKwlwcml2YXRlIGZpbmFsIFRlc3QxIHRlc3QgPSBuZXcgRmFrZVRlc3QxKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0VGVzdDFIZWxwZXIuamF2YSBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RUZXN0MUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YmI4OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0VGVzdDFIZWxwZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnRlc3RzOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEuc3VwcG9ydC5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnN1cHBvcnQuVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS50cmFuc3BvcnQuVGNwVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqIFRlc3Qgb2YgVGVzdDFIZWxwZXIgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VGVzdDFIZWxwZXIKK3sKKwlwcml2YXRlIHN0YXRpYyBTZXJ2ZXJGYWN0b3J5IGxpc3RlbmVyOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVHJhbnNwb3J0RmFjdG9yeS5kZWZpbmUoICJyb2hpdCIsIG5ldyBUY3BUcmFuc3BvcnRGYWN0b3J5KCkgKTsKKwkJCisJCVN0cmluZyB1cmkgPSAicm9oaXQ6Ly8wLjAuMC4wOjQwNDAiOworCQkKKwkJbGlzdGVuZXIgPSBUZXN0MUhlbHBlci5uZXdMaXN0ZW5lciggdXJpLCBudWxsLCBuZXcgTWFpblRlc3QxTGlzdGVuZXIoKSApOworCQkKKwkJbGlzdGVuZXIudHJhbnNwb3J0Q29udHJvbCggVHJhbnNwb3J0LlNUQVJUX0FORF9XQUlUX1VQLCA0MDAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVN0cmluZyB1cmkgPSAicm9oaXQ6Ly9sb2NhbGhvc3Q6NDA0MCI7CisKKwkJUmVtb3RlVGVzdDFTZXJ2ZXIgc2VydmVyID0gVGVzdDFIZWxwZXIubmV3U2VydmVyKCB1cmksIG51bGwsIG5ldyBNYWluVGVzdDFDbGllbnQoKSApOworCQlzZXJ2ZXIuX3N0YXJ0QW5kV2FpdFVwKCA0MDAwICk7CisKKwkJLy8gVE9ETyBub3RoaW5nIHRvIGRvIGJ1dCB3YWl0IGZvciBzZXJ2ZXIgdG8gcmVhbGx5IGJlIHVwLgorCQlUaHJlYWQuc2xlZXAoIDEwMDAgKTsKKwkKKwkJc2VydmVyLl9zdG9wQW5kV2FpdERvd24oIDQwMDAgKTsKKwkJc2VydmVyID0gbnVsbDsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmluaSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWxpc3RlbmVyLnRyYW5zcG9ydENvbnRyb2woIFRyYW5zcG9ydC5TVE9QX0FORF9XQUlUX0RPV04sIDAgKTsKKwkJbGlzdGVuZXIgPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RWYWx1ZUZhY3RvcnlUZXN0MURvdEphdmEuamF2YSBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RWYWx1ZUZhY3RvcnlUZXN0MURvdEphdmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc4OTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdFZhbHVlRmFjdG9yeVRlc3QxRG90SmF2YS5qYXZhCkBAIC0wLDAgKzEsMTEzNiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS5tc2cuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmJpbmRpbmdzLmphdmEubXNnLlN0cnVjdFZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLm1zZy5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5FMTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuRXhjcDE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLkV4Y3AyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5FeGNwMzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuRXhjcDQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLkV4Y3A1OworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5FeGNwNjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuUzE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLlMyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5TMzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuUzQ7CisKKworLyoqIFRlc3Qgb2YgVmFsdWVGYWN0b3J5VGVzdDEgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VmFsdWVGYWN0b3J5VGVzdDFEb3RKYXZhCit7CisJcHJpdmF0ZSBWYWx1ZUZhY3RvcnlUZXN0MSB2ZiA9IG5ldyBWYWx1ZUZhY3RvcnlUZXN0MSggInRjcDoiICk7CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9FMSgpCisJeworCQkvLyB0eXBlIC8vCisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRTEsCisJCQorCQkvLyBmaWVsZHMgLy8KKwkJCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9BLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfQiwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX0MgKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9FMV9leHBvcnQoKQorCXsKKwkJdGVzdEVudW1FeHBvcnQoIEUxLkEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0UxLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX0EgKTsKKwkJCisJCXRlc3RFbnVtRXhwb3J0KCBFMS5CLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FMSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9CICk7CisJCQorCQl0ZXN0RW51bUV4cG9ydCggRTEuQywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRTEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfQyApOworCX0KKwkKKwkvKiogKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X0UxX2ltcG9ydCgpCisJeworCQl0ZXN0RW51bUltcG9ydCggRTEuQSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRTEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfQSApOworCQkKKwkJdGVzdEVudW1JbXBvcnQoIEUxLkIsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0UxLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX0IgKTsKKwkJCisJCXRlc3RFbnVtSW1wb3J0KCBFMS5DLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FMSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9DICk7CisJfQorCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9TMSgpCisJeworCQkvLyB0eXBlIC8vCisKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1MxLAorCQkKKwkJLy8gZmllbGRzIC8vCisJCQorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ksCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl96ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfUzFfZXhwb3J0KCkKKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gdmYuZXhwb3J0Q3VzdG9tVmFsdWUoIG5ldyBTMSggMTksIDIzLCAyOSApICk7CisJCXN2LmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMSApOworCQlhc3NlcnRFcXVhbHMoIDMsIHN2LnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoIDE5LCBzdi5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl94ICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMywgc3YuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeSApICk7CisJCWFzc2VydEVxdWFscyggMjksIHN2LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ogKSApOworCX0KKwkKKwkvKiogKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X1MxX2ltcG9ydCgpCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMSwgdmYgKTsKKwkJc3YucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgMTAxICk7CisJCXN2LnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ksIDEwMyApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl96LCAxMDcgKTsKKwkJUzEgcyA9IChTMSkgdmYuaW1wb3J0Q3VzdG9tVmFsdWUoIHN2ICk7CisJCWFzc2VydEVxdWFscyggMTAxLCBzLnggKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMDMsIHMueSApOworCQlhc3NlcnRFcXVhbHMoIDEwNywgcy56ICk7CisJfQorCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9TMigpCisJeworCQkvLyB0eXBlIC8vCisKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1MyLAorCQkKKwkJLy8gZmllbGRzIC8vCisJCQorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfUzJfZXhwb3J0KCkKKwl7CisJCVMxIGEgPSBuZXcgUzEoIDIxLCAyMiwgMjMgKTsKKwkJUzEgYiA9IG5ldyBTMSggMzEsIDMyLCAzMyApOworCQlFMSBjID0gRTEuQTsKKwkJCisJCVN0cnVjdFZhbHVlIHN2ID0gdmYuZXhwb3J0Q3VzdG9tVmFsdWUoIG5ldyBTMiggYSwgYiwgYyApICk7CisJCXN2LmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9TMiApOworCQlhc3NlcnRFcXVhbHMoIDMsIHN2LnNpemUoKSApOworCQkKKwkJYXNzZXJ0U2FtZSggYSwgc3YuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApICk7CisJCWFzc2VydFNhbWUoIGIsIHN2LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2IgKSApOworCQlhc3NlcnRTYW1lKCBjLCBzdi5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jICkgKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9TMl9pbXBvcnQoKQorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfUzIsIHZmICk7CisJCQorCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hLCBuZXcgUzEoIDIxLCAyMiwgMjMgKSApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9iLCBuZXcgUzEoIDMxLCAzMiwgMzMgKSApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jLCBFMS5BICk7CisJCQorCQlTMiBzID0gKFMyKSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMSwgcy5hLnggKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMiwgcy5hLnkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMywgcy5hLnogKTsKKwkJYXNzZXJ0RXF1YWxzKCAzMSwgcy5iLnggKTsKKwkJYXNzZXJ0RXF1YWxzKCAzMiwgcy5iLnkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzMywgcy5iLnogKTsKKwkJYXNzZXJ0RXF1YWxzKCBFMS5BLCBzLmMgKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9TMygpCisJeworCQkvLyB0eXBlIC8vCisKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1MzLAorCQkKKwkJLy8gZmllbGRzIC8vCisJCQorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfdGlwZSwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9TM19leHBvcnQoKQorCXsJCQorCQl0ZXN0UzNFeHBvcnQoImJvb2xlYW4iLCBUZXN0MS5CT09MMSk7CisJCXRlc3RTM0V4cG9ydCgiYnl0ZSIsIFRlc3QxLkJZVEU1KTsKKwkJdGVzdFMzRXhwb3J0KCJzaG9ydCIsIFRlc3QxLlNIT1JUNSk7CisJCXRlc3RTM0V4cG9ydCgiaW50IiwgVGVzdDEuSU5UNSk7CisJCXRlc3RTM0V4cG9ydCgibG9uZyIsIFRlc3QxLkxPTkc1KTsKKwkJdGVzdFMzRXhwb3J0KCJmbG9hdCIsIFRlc3QxLkZMT0FUNSk7CisJCXRlc3RTM0V4cG9ydCgiZG91YmxlIiwgVGVzdDEuRE9VQkxFNSk7CisJCXRlc3RTM0V4cG9ydCgic3RyaW5nIiwgVGVzdDEuU1RSSU5HMyk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfUzNfaW1wb3J0KCkKKwl7CisJCXRlc3RTM0ltcG9ydCgiYm9vbGVhbiIsIFRlc3QxLkJPT0wxKTsKKwkJdGVzdFMzSW1wb3J0KCJieXRlIiwgVGVzdDEuQllURTUpOworCQl0ZXN0UzNJbXBvcnQoInNob3J0IiwgVGVzdDEuU0hPUlQ1KTsKKwkJdGVzdFMzSW1wb3J0KCJpbnQiLCBUZXN0MS5JTlQ1KTsKKwkJdGVzdFMzSW1wb3J0KCJsb25nIiwgVGVzdDEuTE9ORzUpOworCQl0ZXN0UzNJbXBvcnQoImZsb2F0IiwgVGVzdDEuRkxPQVQ1KTsKKwkJdGVzdFMzSW1wb3J0KCJkb3VibGUiLCBUZXN0MS5ET1VCTEU1KTsKKwkJdGVzdFMzSW1wb3J0KCJzdHJpbmciLCBUZXN0MS5TVFJJTkczKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9TNCgpCisJeworCQkvLyB0eXBlIC8vCisKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1M0LAorCQkKKwkJLy8gZmllbGRzIC8vCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl90aXBlLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCApOworCX0KKwkKKwkvKiogKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X1M0X2V4cG9ydCgpCisJewkKKwkJT2JqZWN0W10gYm9vbE9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuQk9PTDEsIFRlc3QxLkJPT0wyfTsKKwkJT2JqZWN0W10gYnl0ZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuQllURTEsIFRlc3QxLkJZVEUyLCBUZXN0MS5CWVRFMywgVGVzdDEuQllURTQsIFRlc3QxLkJZVEU1fTsKKwkJT2JqZWN0W10gc2hvcnRPYmplY3QgPSBuZXcgT2JqZWN0W10ge1Rlc3QxLlNIT1JUMSwgVGVzdDEuU0hPUlQyLCBUZXN0MS5TSE9SVDMsIFRlc3QxLlNIT1JUNCwgVGVzdDEuU0hPUlQ1fTsKKwkJT2JqZWN0W10gaW50T2JqZWN0ID0gbmV3IE9iamVjdFtde1Rlc3QxLklOVDEsIFRlc3QxLklOVDIsIFRlc3QxLklOVDMsIFRlc3QxLklOVDQsIFRlc3QxLklOVDV9OworCQlPYmplY3RbXSBsb25nT2JqZWN0ID0gbmV3IE9iamVjdFtdIHtUZXN0MS5MT05HMSwgVGVzdDEuTE9ORzIsIFRlc3QxLkxPTkczLCBUZXN0MS5MT05HNCwgVGVzdDEuTE9ORzV9OworCQlPYmplY3RbXSBmbG9hdE9iamVjdCA9IG5ldyBPYmplY3RbXXtUZXN0MS5GTE9BVDEsIFRlc3QxLkZMT0FUMiwgVGVzdDEuRkxPQVQzLCBUZXN0MS5GTE9BVDQsIFRlc3QxLkZMT0FUNX07CisJCU9iamVjdFtdIGRvdWJsZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuRE9VQkxFMSwgVGVzdDEuRE9VQkxFMiwgVGVzdDEuRE9VQkxFMywgVGVzdDEuRE9VQkxFNCwgVGVzdDEuRE9VQkxFNX07CisJCU9iamVjdFtdIHN0cmluZ09iamVjdCA9IG5ldyBPYmplY3QgW117VGVzdDEuU1RSSU5HMSwgVGVzdDEuU1RSSU5HMiwgVGVzdDEuU1RSSU5HMywgVGVzdDEuU1RSSU5HNCwgVGVzdDEuU1RSSU5HNX07CisKKwkJdGVzdFM0RXhwb3J0KCJib29sZWFuIiwgYm9vbE9iamVjdCk7CisJCXRlc3RTNEV4cG9ydCgiYnl0ZSIsIGJ5dGVPYmplY3QpOworCQl0ZXN0UzRFeHBvcnQoInNob3J0Iiwgc2hvcnRPYmplY3QpOworCQl0ZXN0UzRFeHBvcnQoImludCIsIGludE9iamVjdCk7CisJCXRlc3RTNEV4cG9ydCgibG9uZyIsIGxvbmdPYmplY3QpOworCQl0ZXN0UzRFeHBvcnQoImZsb2F0IiwgZmxvYXRPYmplY3QpOworCQl0ZXN0UzRFeHBvcnQoImRvdWJsZSIsIGRvdWJsZU9iamVjdCk7CisJCXRlc3RTNEV4cG9ydCgic3RyaW5nIiwgc3RyaW5nT2JqZWN0KTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9TNF9pbXBvcnQoKQorCXsKKwkJT2JqZWN0W10gYm9vbE9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuQk9PTDEsIFRlc3QxLkJPT0wyfTsKKwkJT2JqZWN0W10gYnl0ZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuQllURTEsIFRlc3QxLkJZVEUyLCBUZXN0MS5CWVRFMywgVGVzdDEuQllURTQsIFRlc3QxLkJZVEU1fTsKKwkJT2JqZWN0W10gc2hvcnRPYmplY3QgPSBuZXcgT2JqZWN0W10ge1Rlc3QxLlNIT1JUMSwgVGVzdDEuU0hPUlQyLCBUZXN0MS5TSE9SVDMsIFRlc3QxLlNIT1JUNCwgVGVzdDEuU0hPUlQ1fTsKKwkJT2JqZWN0W10gaW50T2JqZWN0ID0gbmV3IE9iamVjdFtde1Rlc3QxLklOVDEsIFRlc3QxLklOVDIsIFRlc3QxLklOVDMsIFRlc3QxLklOVDQsIFRlc3QxLklOVDV9OworCQlPYmplY3RbXSBsb25nT2JqZWN0ID0gbmV3IE9iamVjdFtdIHtUZXN0MS5MT05HMSwgVGVzdDEuTE9ORzIsIFRlc3QxLkxPTkczLCBUZXN0MS5MT05HNCwgVGVzdDEuTE9ORzV9OworCQlPYmplY3RbXSBmbG9hdE9iamVjdCA9IG5ldyBPYmplY3RbXXtUZXN0MS5GTE9BVDEsIFRlc3QxLkZMT0FUMiwgVGVzdDEuRkxPQVQzLCBUZXN0MS5GTE9BVDQsIFRlc3QxLkZMT0FUNX07CisJCU9iamVjdFtdIGRvdWJsZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuRE9VQkxFMSwgVGVzdDEuRE9VQkxFMiwgVGVzdDEuRE9VQkxFMywgVGVzdDEuRE9VQkxFNCwgVGVzdDEuRE9VQkxFNX07CisJCU9iamVjdFtdIHN0cmluZ09iamVjdCA9IG5ldyBPYmplY3QgW117VGVzdDEuU1RSSU5HMSwgVGVzdDEuU1RSSU5HMiwgVGVzdDEuU1RSSU5HMywgVGVzdDEuU1RSSU5HNCwgVGVzdDEuU1RSSU5HNX07CisKKwkJdGVzdFM0SW1wb3J0KCJib29sZWFuIiwgYm9vbE9iamVjdCk7CisJCXRlc3RTNEltcG9ydCgiYnl0ZSIsIGJ5dGVPYmplY3QpOworCQl0ZXN0UzRJbXBvcnQoInNob3J0Iiwgc2hvcnRPYmplY3QpOworCQl0ZXN0UzRJbXBvcnQoImludCIsIGludE9iamVjdCk7CisJCXRlc3RTNEltcG9ydCgibG9uZyIsIGxvbmdPYmplY3QpOworCQl0ZXN0UzRJbXBvcnQoImZsb2F0IiwgZmxvYXRPYmplY3QpOworCQl0ZXN0UzRJbXBvcnQoImRvdWJsZSIsIGRvdWJsZU9iamVjdCk7CisJCXRlc3RTNEltcG9ydCgic3RyaW5nIiwgc3RyaW5nT2JqZWN0KTsKKwl9CQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfZXhjcHMoKQorCXsKKwkJLy8gdHlwZSAvLworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AxLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDIgKTsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AzICk7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwNCApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3A1LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwNiwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2csCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl94ICk7CisJCQorCQkvLyBmaWVsZHMgLy8KKwkJCisvLwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZyApOworLy8JCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlICk7CisvLwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKTsJCisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfZXhjcHNfZXhwb3J0KCkKKwl7CisJCU9iamVjdFtdIGJvb2xPYmplY3QgPSBuZXcgT2JqZWN0W10ge1Rlc3QxLkJPT0wxLCBUZXN0MS5CT09MMn07CisJCU9iamVjdFtdIGJ5dGVPYmplY3QgPSBuZXcgT2JqZWN0W10ge1Rlc3QxLkJZVEUxLCBUZXN0MS5CWVRFMiwgVGVzdDEuQllURTMsIFRlc3QxLkJZVEU0LCBUZXN0MS5CWVRFNX07CisJCU9iamVjdFtdIHNob3J0T2JqZWN0ID0gbmV3IE9iamVjdFtdIHtUZXN0MS5TSE9SVDEsIFRlc3QxLlNIT1JUMiwgVGVzdDEuU0hPUlQzLCBUZXN0MS5TSE9SVDQsIFRlc3QxLlNIT1JUNX07CisJCU9iamVjdFtdIGludE9iamVjdCA9IG5ldyBPYmplY3RbXXtUZXN0MS5JTlQxLCBUZXN0MS5JTlQyLCBUZXN0MS5JTlQzLCBUZXN0MS5JTlQ0LCBUZXN0MS5JTlQ1fTsKKwkJT2JqZWN0W10gbG9uZ09iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuTE9ORzEsIFRlc3QxLkxPTkcyLCBUZXN0MS5MT05HMywgVGVzdDEuTE9ORzQsIFRlc3QxLkxPTkc1fTsKKwkJT2JqZWN0W10gZmxvYXRPYmplY3QgPSBuZXcgT2JqZWN0W117VGVzdDEuRkxPQVQxLCBUZXN0MS5GTE9BVDIsIFRlc3QxLkZMT0FUMywgVGVzdDEuRkxPQVQ0LCBUZXN0MS5GTE9BVDV9OworCQlPYmplY3RbXSBkb3VibGVPYmplY3QgPSBuZXcgT2JqZWN0W10ge1Rlc3QxLkRPVUJMRTEsIFRlc3QxLkRPVUJMRTIsIFRlc3QxLkRPVUJMRTMsIFRlc3QxLkRPVUJMRTQsIFRlc3QxLkRPVUJMRTV9OworCQlPYmplY3RbXSBzdHJpbmdPYmplY3QgPSBuZXcgT2JqZWN0IFtde1Rlc3QxLlNUUklORzEsIFRlc3QxLlNUUklORzIsIFRlc3QxLlNUUklORzMsIFRlc3QxLlNUUklORzQsIFRlc3QxLlNUUklORzV9OworCisJCVN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIjsKKwkJaW50IGNvZGUgPSA1MDA7CisJCQorCQlTdHJ1Y3RWYWx1ZSBzdiA9IHZmLmV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgRXhjcDEoICJhYmMiLCAyMyApICk7CisJCXN2LmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwMSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHN2LnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoICJhYmMiLCBzdi5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2cgKSApOworCQlhc3NlcnRFcXVhbHMoIDIzLCBzdi5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlICkgKTsKKwkJCisJCXN2ID0gdmYuZXhwb3J0Q3VzdG9tVmFsdWUoIG5ldyBFeGNwMigpICk7CisJCXN2LmNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9FeGNwMiApOworCQlhc3NlcnRFcXVhbHMoIDAsIHN2LnNpemUoKSApOworCQkKKwkJc3YgPSB2Zi5leHBvcnRDdXN0b21WYWx1ZSggbmV3IEV4Y3AzKCkgKTsKKwkJc3YuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AzICk7CisJCWFzc2VydEVxdWFscyggMCwgc3Yuc2l6ZSgpICk7CisJCQorCQlzdiA9IHZmLmV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgRXhjcDQoKSApOworCQlzdi5jaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDQgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBzdi5zaXplKCkgKTsKKwkJCisJCS8vIEltcG9ydCBleGNlcHRpb24gd2l0aCBvYmplY3QgYXMgcGFyYW0KKwkJdGVzdEV4Y3A1RXhwb3J0KG1zZywgY29kZSwgVGVzdDEuQk9PTDIpOworCQl0ZXN0RXhjcDVFeHBvcnQobXNnLCBjb2RlLCBUZXN0MS5CWVRFNSk7CisJCXRlc3RFeGNwNUV4cG9ydChtc2csIGNvZGUsIFRlc3QxLlNIT1JUNSk7CisJCXRlc3RFeGNwNUV4cG9ydChtc2csIGNvZGUsIFRlc3QxLklOVDUpOworCQl0ZXN0RXhjcDVFeHBvcnQobXNnLCBjb2RlLCBUZXN0MS5MT05HNSk7CisJCXRlc3RFeGNwNUV4cG9ydChtc2csIGNvZGUsIFRlc3QxLkZMT0FUNSk7CisJCXRlc3RFeGNwNUV4cG9ydChtc2csIGNvZGUsIFRlc3QxLkRPVUJMRTUpOworCQl0ZXN0RXhjcDVFeHBvcnQobXNnLCBjb2RlLCBUZXN0MS5TVFJJTkczKTsJCisJCQorCQkvLyBJbXBvcnQgZXhjZXB0aW9uIHdpdGggYXJyYXkgb2Ygb2JqZWN0IGFzIHBhcmFtCisJCXRlc3RFeGNwNkV4cG9ydChtc2csIGNvZGUsIGJvb2xPYmplY3QpOworCQl0ZXN0RXhjcDZFeHBvcnQobXNnLCBjb2RlLCBieXRlT2JqZWN0KTsKKwkJdGVzdEV4Y3A2RXhwb3J0KG1zZywgY29kZSwgc2hvcnRPYmplY3QpOworCQl0ZXN0RXhjcDZFeHBvcnQobXNnLCBjb2RlLCBpbnRPYmplY3QpOworCQl0ZXN0RXhjcDZFeHBvcnQobXNnLCBjb2RlLCBsb25nT2JqZWN0KTsKKwkJdGVzdEV4Y3A2RXhwb3J0KG1zZywgY29kZSwgZmxvYXRPYmplY3QpOworCQl0ZXN0RXhjcDZFeHBvcnQobXNnLCBjb2RlLCBkb3VibGVPYmplY3QpOworCQl0ZXN0RXhjcDZFeHBvcnQobXNnLCBjb2RlLCBzdHJpbmdPYmplY3QpOwkKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9leGNwc19pbXBvcnQoKQorCXsKKwkJT2JqZWN0W10gYm9vbE9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuQk9PTDEsIFRlc3QxLkJPT0wyfTsKKwkJT2JqZWN0W10gYnl0ZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuQllURTEsIFRlc3QxLkJZVEUyLCBUZXN0MS5CWVRFMywgVGVzdDEuQllURTQsIFRlc3QxLkJZVEU1fTsKKwkJT2JqZWN0W10gc2hvcnRPYmplY3QgPSBuZXcgT2JqZWN0W10ge1Rlc3QxLlNIT1JUMSwgVGVzdDEuU0hPUlQyLCBUZXN0MS5TSE9SVDMsIFRlc3QxLlNIT1JUNCwgVGVzdDEuU0hPUlQ1fTsKKwkJT2JqZWN0W10gaW50T2JqZWN0ID0gbmV3IE9iamVjdFtde1Rlc3QxLklOVDEsIFRlc3QxLklOVDIsIFRlc3QxLklOVDMsIFRlc3QxLklOVDQsIFRlc3QxLklOVDV9OworCQlPYmplY3RbXSBsb25nT2JqZWN0ID0gbmV3IE9iamVjdFtdIHtUZXN0MS5MT05HMSwgVGVzdDEuTE9ORzIsIFRlc3QxLkxPTkczLCBUZXN0MS5MT05HNCwgVGVzdDEuTE9ORzV9OworCQlPYmplY3RbXSBmbG9hdE9iamVjdCA9IG5ldyBPYmplY3RbXXtUZXN0MS5GTE9BVDEsIFRlc3QxLkZMT0FUMiwgVGVzdDEuRkxPQVQzLCBUZXN0MS5GTE9BVDQsIFRlc3QxLkZMT0FUNX07CisJCU9iamVjdFtdIGRvdWJsZU9iamVjdCA9IG5ldyBPYmplY3RbXSB7VGVzdDEuRE9VQkxFMSwgVGVzdDEuRE9VQkxFMiwgVGVzdDEuRE9VQkxFMywgVGVzdDEuRE9VQkxFNCwgVGVzdDEuRE9VQkxFNX07CisJCU9iamVjdFtdIHN0cmluZ09iamVjdCA9IG5ldyBPYmplY3QgW117VGVzdDEuU1RSSU5HMSwgVGVzdDEuU1RSSU5HMiwgVGVzdDEuU1RSSU5HMywgVGVzdDEuU1RSSU5HNCwgVGVzdDEuU1RSSU5HNX07CisKKwkJU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24iOworCQlpbnQgY29kZSA9IDUwMDsKKwkJCisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3AxLCB2ZiApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2csICJkZWYiICk7CisJCXN2LnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUsIDI5ICk7CisJCUV4Y3AxIGUxID0gKEV4Y3AxKSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZGVmIiwgZTEubXNnICk7CisJCWFzc2VydEVxdWFscyggMjksIGUxLmNvZGUgKTsKKwkJZTEgPSBudWxsOworCQkKKwkJc3YgPSBuZXcgU3RydWN0VmFsdWUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDIsIHZmICk7CisJCUV4Y3AyIGUyID0gKEV4Y3AyKSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0Tm90TnVsbCggZTIgKTsKKwkJZTIgPSBudWxsOworCQkKKwkJc3YgPSBuZXcgU3RydWN0VmFsdWUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDMsIHZmICk7CisJCUV4Y3AzIGUzID0gKEV4Y3AzKSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0Tm90TnVsbCggZTMgKTsKKwkJZTMgPSBudWxsOworCQkKKwkJc3YgPSBuZXcgU3RydWN0VmFsdWUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDQsIHZmICk7CisJCUV4Y3A0IGU0ID0gKEV4Y3A0KSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0Tm90TnVsbCggZTQgKTsKKwkJZTQgPSBudWxsOworCQkKKwkJLy8gSW1wb3J0IGV4Y2VwdGlvbiB3aXRoIG9iamVjdCBhcyBwYXJhbQorCQl0ZXN0RXhjcDVJbXBvcnQobXNnLCBjb2RlLCBUZXN0MS5CT09MMik7CisJCXRlc3RFeGNwNUltcG9ydChtc2csIGNvZGUsIFRlc3QxLkJZVEU1KTsKKwkJdGVzdEV4Y3A1SW1wb3J0KG1zZywgY29kZSwgVGVzdDEuU0hPUlQ1KTsKKwkJdGVzdEV4Y3A1SW1wb3J0KG1zZywgY29kZSwgVGVzdDEuSU5UNSk7CisJCXRlc3RFeGNwNUltcG9ydChtc2csIGNvZGUsIFRlc3QxLkxPTkc1KTsKKwkJdGVzdEV4Y3A1SW1wb3J0KG1zZywgY29kZSwgVGVzdDEuRkxPQVQ1KTsKKwkJdGVzdEV4Y3A1SW1wb3J0KG1zZywgY29kZSwgVGVzdDEuRE9VQkxFNSk7CisJCXRlc3RFeGNwNUltcG9ydChtc2csIGNvZGUsIFRlc3QxLlNUUklORzMpOwkKKwkJCisJCS8vIEltcG9ydCBleGNlcHRpb24gd2l0aCBhcnJheSBvZiBvYmplY3QgYXMgcGFyYW0KKwkJdGVzdEV4Y3A2SW1wb3J0KG1zZywgY29kZSwgYm9vbE9iamVjdCk7CisJCXRlc3RFeGNwNkltcG9ydChtc2csIGNvZGUsIGJ5dGVPYmplY3QpOworCQl0ZXN0RXhjcDZJbXBvcnQobXNnLCBjb2RlLCBzaG9ydE9iamVjdCk7CisJCXRlc3RFeGNwNkltcG9ydChtc2csIGNvZGUsIGludE9iamVjdCk7CisJCXRlc3RFeGNwNkltcG9ydChtc2csIGNvZGUsIGxvbmdPYmplY3QpOworCQl0ZXN0RXhjcDZJbXBvcnQobXNnLCBjb2RlLCBmbG9hdE9iamVjdCk7CisJCXRlc3RFeGNwNkltcG9ydChtc2csIGNvZGUsIGRvdWJsZU9iamVjdCk7CisJCXRlc3RFeGNwNkltcG9ydChtc2csIGNvZGUsIHN0cmluZ09iamVjdCk7CQorCX0KKwkKKwkvKiogKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9ub3RoaW5nKCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9ub3RoaW5nLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X25vdGhpbmcsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCX0KKwkKKwkvKiogKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9pbmNyKCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9pbmNyLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl94ICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9pbmNyLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCX0KKwkKKwkvKiogKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9zdWIoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3N1YiwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3kgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1YiwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9tZXRob2Rfc3VtKCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9zdW0sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3N1bSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9tZXRob2RfdHJhbnMoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3RyYW5zLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9lLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdHJhbnMsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX2Rpc3QoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2Rpc3QsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9iICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9kaXN0LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCX0KKwkKKwkvKiogKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZF9maWxsKCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9maWxsLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9uLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfZmlsbCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9tZXRob2RfZmlsbE9iamVjdCgpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfZmlsbE9iamVjdCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbiwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX28gKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2ZpbGxPYmplY3QsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX2Jsb3coKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX2Jsb3csCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X2Jsb3csCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX2JlZXRzKCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9iZWV0cywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfZSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfYmVldHMsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Rocm93RXhjcDUoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Rocm93RXhjcDUsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl92YWx1ZSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfdGhyb3dFeGNwNSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwl9CisJCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9tZXRob2RfdGhyb3dFeGNwNigpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfdGhyb3dFeGNwNSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfbXNnLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ZhbHVlICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF90aHJvd0V4Y3A2LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX2luUmVwbHlUbywKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX3Jlc3VsdCApOworCX0KKworCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfYm9vbGVhbigpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ib29sZWFuLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Jvb2xlYW4sCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfYm9vbGVhbl9hcnJheSgpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ib29sZWFuX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2Jvb2xlYW5fYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfYnl0ZSgpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ieXRlLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGUsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfYnl0ZV9hcnJheSgpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9ieXRlX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2J5dGVfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfc2hvcnQoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfc2hvcnQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfc2hvcnRfYXJyYXkoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3Bfc2hvcnRfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfc2hvcnRfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfaW50KCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2ludCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9pbnQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfaW50X2FycmF5KCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2ludF9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9pbnRfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfbG9uZygpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9sb25nLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmcsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfbG9uZ19hcnJheSgpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9sb25nX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX2xvbmdfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfZmxvYXQoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZmxvYXQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZmxvYXQsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfZmxvYXRfYXJyYXkoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfZmxvYXRfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfZmxvYXRfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfZG91YmxlKCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2RvdWJsZSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9kb3VibGUsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfZG91YmxlX2FycmF5KCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX2RvdWJsZV9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9kb3VibGVfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfc3RyaW5nKCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3N0cmluZywKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9zdHJpbmcsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfc3RyaW5nX2FycmF5KCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX3N0cmluZ19hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9zdHJpbmdfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfRTEoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfRTEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfRTFfYXJyYXkoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfRTFfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfRTFfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfUzEoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzEsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfUzFfYXJyYXkoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzFfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzFfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfUzIoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzIsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzIsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfUzJfYXJyYXkoKQorCXsKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX3BfUzJfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3BfUzJfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfQmxvYigpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9CbG9iLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX0Jsb2IsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3BfQmxvYl9hcnJheSgpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9CbG9iX2FycmF5LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX0Jsb2JfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfb2JqZWN0KCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX29iamVjdCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3QsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfb2JqZWN0X2FycmF5KCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX29iamVjdF9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfYSApOworCQkKKwkJY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX19yZXN1bHRfcF9vYmplY3RfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCQorCS8qKiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kX3Bfb2JqZWN0X3N0cnVjdCgpCisJeworCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfcF9vYmplY3Rfc3RydWN0LAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19tZXNzYWdlSWQsCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9hICk7CisJCQorCQljaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfX3Jlc3VsdF9wX29iamVjdF9zdHJ1Y3QsCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9faW5SZXBseVRvLAorCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfcmVzdWx0ICk7CisJfQorCisJLyoqICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdF9tZXRob2RfcF9vYmplY3Rfc3RydWN0X2FycmF5KCkKKwl7CisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9wX29iamVjdF9zdHJ1Y3RfYXJyYXksCisJCQlWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfX21lc3NhZ2VJZCwKKwkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX2EgKTsKKwkJCisJCWNoZWNrVHlwZSggVmFsdWVGYWN0b3J5VGVzdDEuX210X29yZ19hcGFjaGVfZXRjaF90ZXN0c19UZXN0MV9fcmVzdWx0X3Bfb2JqZWN0X3N0cnVjdF9hcnJheSwKKwkJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9fbWVzc2FnZUlkLAorCQkJVmFsdWVGYWN0b3J5VGVzdDEuX21mX19pblJlcGx5VG8sCisJCVZhbHVlRmFjdG9yeVRlc3QxLl9tZl9yZXN1bHQgKTsKKwl9CisJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVVRJTElUWSBNRVRIT0RTIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrVHlwZSggVHlwZSB0eXBlLCBGaWVsZC4uLiBmaWVsZHMgKQorCXsKKwkJYXNzZXJ0Tm90TnVsbCggdHlwZSApOworCQlhc3NlcnRTYW1lKCBUeXBlLmNsYXNzLCB0eXBlLmdldENsYXNzKCkgKTsKKwkJYXNzZXJ0U2FtZSggdHlwZSwgdmYuZ2V0VHlwZSggdHlwZS5nZXRJZCgpICkgKTsKKwkJCisJCVNldDxGaWVsZD4gdGZpZWxkcyA9IHR5cGUuZ2V0RmllbGRzKCk7CisKKwkJaWYgKGZpZWxkcyAhPSBudWxsKQorCQl7CisJCQlhc3NlcnRFcXVhbHMoIGZpZWxkcy5sZW5ndGgsIHRmaWVsZHMuc2l6ZSgpICk7CisJCQkKKwkJCWZvciAoRmllbGQgZjogZmllbGRzKQorCQkJeworCQkJCWFzc2VydE5vdE51bGwoIHR5cGUuZ2V0VmFsaWRhdG9yKCBmICkgKTsKKwkJCQlhc3NlcnRTYW1lKCBmLCB0eXBlLmdldEZpZWxkKCBmLmdldElkKCkgKSApOworCQkJCWFzc2VydFNhbWUoIGYsIHR5cGUuZ2V0RmllbGQoIGYuZ2V0TmFtZSgpICkgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWFzc2VydEVxdWFscyggMCwgdGZpZWxkcy5zaXplKCkgKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0RW51bUV4cG9ydCggRTEgZSwgVHlwZSB0LCBGaWVsZCBmICkKKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gdmYuZXhwb3J0Q3VzdG9tVmFsdWUoIGUgKTsKKwkJc3YuY2hlY2tUeXBlKCB0ICk7CisJCWFzc2VydEVxdWFscyggMSwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydFRydWUoIChCb29sZWFuKSBzdi5nZXQoIGYgKSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdEVudW1JbXBvcnQoIEUxIGUsIFR5cGUgdCwgRmllbGQgZiApCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IG5ldyBTdHJ1Y3RWYWx1ZSggdCwgdmYgKTsKKwkJc3YucHV0KCAgZiwgdHJ1ZSApOworCQlFMSBhID0gKEUxKSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0U2FtZSggZSwgYSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFMzRXhwb3J0KFN0cmluZyBzLCBPYmplY3QgdmFsdWUpCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IHZmLmV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgUzMoIHMsdmFsdWUgKSApOworCQlzdi5jaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfUzMgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBzdi5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBzLCBzdi5nZXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl90aXBlICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCB2YWx1ZSwgc3YuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCApICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0UzNJbXBvcnQoU3RyaW5nIHMsIE9iamVjdCB2YWx1ZSkKKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1MzLCB2ZiApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl90aXBlLCBzICk7CisJCXN2LnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIHZhbHVlICk7CisJCVMzIG15UzMgPSAoUzMpIHZmLmltcG9ydEN1c3RvbVZhbHVlKCBzdiApOworCQlhc3NlcnRFcXVhbHMoIHMsIG15UzMudGlwZSApOworCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCBteVMzLnggKTsKKwl9CQorCQorCXByaXZhdGUgdm9pZCB0ZXN0UzRFeHBvcnQoU3RyaW5nIHMsIE9iamVjdFtdIHZhbHVlKQorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSB2Zi5leHBvcnRDdXN0b21WYWx1ZSggbmV3IFM0KCBzLHZhbHVlICkgKTsKKwkJc3YuY2hlY2tUeXBlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1M0ICk7CisJCWFzc2VydEVxdWFscyggMiwgc3Yuc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggcywgc3YuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfdGlwZSApICk7CisJCWFzc2VydEVxdWFscyggdmFsdWUsIHN2LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFM0SW1wb3J0KFN0cmluZyBzLCBPYmplY3RbXSB2YWx1ZSkKKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX1M0LCB2ZiApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl90aXBlLCBzICk7CisJCXN2LnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIHZhbHVlICk7CisJCVM0IG15UzQgPSAoUzQpIHZmLmltcG9ydEN1c3RvbVZhbHVlKCBzdiApOworCQlhc3NlcnRFcXVhbHMoIHMsIG15UzQudGlwZSApOworCQlhc3NlcnRBcnJheUVxdWFscyggdmFsdWUsIG15UzQueCApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdEV4Y3A1RXhwb3J0KFN0cmluZyBtc2csIGludCBjb2RlLCBPYmplY3QgdmFsdWUpCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IHZmLmV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgRXhjcDUoIG1zZywgY29kZSwgdmFsdWUgKSApOworCQlzdi5jaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBzdi5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBtc2csIHN2LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZyApICk7CisJCWFzc2VydEVxdWFscyggY29kZSwgc3YuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSApICk7CisJCWFzc2VydEVxdWFscyggdmFsdWUsIHN2LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKSApOwkJCisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0RXhjcDVJbXBvcnQoU3RyaW5nIG1zZywgaW50IGNvZGUsIE9iamVjdCB2YWx1ZSkKKwl7CisJCVN0cnVjdFZhbHVlIHN2ID0gbmV3IFN0cnVjdFZhbHVlKCBWYWx1ZUZhY3RvcnlUZXN0MS5fbXRfb3JnX2FwYWNoZV9ldGNoX3Rlc3RzX1Rlc3QxX0V4Y3A1LCB2ZiApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9tc2csIG1zZyApOworCQlzdi5wdXQoIFZhbHVlRmFjdG9yeVRlc3QxLl9tZl9jb2RlLCBjb2RlICk7CisJCXN2LnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3gsIHZhbHVlICk7CQkKKwkJRXhjcDUgZSA9IChFeGNwNSkgdmYuaW1wb3J0Q3VzdG9tVmFsdWUoIHN2ICk7CisJCWFzc2VydEVxdWFscyggbXNnLCBlLm1zZyApOworCQlhc3NlcnRFcXVhbHMoIGNvZGUsIGUuY29kZSApOworCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCBlLnggKTsJCQorCX0JCisJCisJcHJpdmF0ZSB2b2lkIHRlc3RFeGNwNkV4cG9ydChTdHJpbmcgbXNnLCBpbnQgY29kZSwgT2JqZWN0W10gdmFsdWUpCisJeworCQlTdHJ1Y3RWYWx1ZSBzdiA9IHZmLmV4cG9ydEN1c3RvbVZhbHVlKCBuZXcgRXhjcDYoIG1zZywgY29kZSwgdmFsdWUgKSApOworCQlzdi5jaGVja1R5cGUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDYgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBzdi5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBtc2csIHN2LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZyApICk7CisJCWFzc2VydEVxdWFscyggY29kZSwgc3YuZ2V0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfY29kZSApICk7CisJCWFzc2VydEVxdWFscyggdmFsdWUsIHN2LmdldCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX3ggKSApOwkJCisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0RXhjcDZJbXBvcnQoU3RyaW5nIG1zZywgaW50IGNvZGUsIE9iamVjdFtdIHZhbHVlKQorCXsKKwkJU3RydWN0VmFsdWUgc3YgPSBuZXcgU3RydWN0VmFsdWUoIFZhbHVlRmFjdG9yeVRlc3QxLl9tdF9vcmdfYXBhY2hlX2V0Y2hfdGVzdHNfVGVzdDFfRXhjcDYsIHZmICk7CisJCXN2LnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX21zZywgbXNnICk7CisJCXN2LnB1dCggVmFsdWVGYWN0b3J5VGVzdDEuX21mX2NvZGUsIGNvZGUgKTsKKwkJc3YucHV0KCBWYWx1ZUZhY3RvcnlUZXN0MS5fbWZfeCwgdmFsdWUgKTsJCQorCQlFeGNwNiBlID0gKEV4Y3A2KSB2Zi5pbXBvcnRDdXN0b21WYWx1ZSggc3YgKTsKKwkJYXNzZXJ0RXF1YWxzKCBtc2csIGUubXNnICk7CisJCWFzc2VydEVxdWFscyggY29kZSwgZS5jb2RlICk7CisJCWFzc2VydEFycmF5RXF1YWxzKCB2YWx1ZSwgZS54ICk7CQkKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0WG1sLmphdmEgYi90ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC90ZXN0cy9UZXN0WG1sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViYjVmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3Rlc3RzL1Rlc3RYbWwuamF2YQpAQCAtMCwwICsxLDEyOTAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudGVzdHM7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLmNvbXBpbGVyLkV0Y2hHcmFtbWFyQ29uc3RhbnRzOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisKKy8qKiAqLworcHVibGljIGNsYXNzIFRlc3RYbWwgeworCisJRG9jdW1lbnQgZG9jdW1lbnQ7CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTG9hZCBUZXN0LnhtbCBpbnRvIERPTQorCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKwkJLy9TdHJpbmcgdXNlckRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKwkJdHJ5CisJCXsKKwkJCUZpbGUgZiA9IG5ldyBGaWxlKCJ0ZXN0cy90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvbWFpbi9ldGNoL3htbC9vcmcvYXBhY2hlL2V0Y2gvdGVzdHMvVGVzdDEueG1sIik7CisJCQkKKwkJCWRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShmKTsKKwkJfQorCQljYXRjaChFeGNlcHRpb24gZSkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gbG9hZCBUZXN0LnhtbCBkb2N1bWVudDogIiArIGUpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IGRpciBpcyAiK25ldyBGaWxlKCIuIiApLmdldEFic29sdXRlUGF0aCgpICk7CisJCQlhc3NlcnRUcnVlKCBmYWxzZSApOworCQl9CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQEFmdGVyCisJcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdW5sb2FkIFRlc3QueG1sIAorCQlkb2N1bWVudCA9IG51bGw7CisJfQorCisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtb2R1bGUiKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCAxKTsKKwkJCisJCVN0cmluZyBtb2R1bGVOYW1lID0gbGlzdC5pdGVtKDApLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKG1vZHVsZU5hbWUsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMiKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShsaXN0Lml0ZW0oMCksIG5ldyBTdHJpbmdbXSB7Im5hbWUifSkpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGxpc3QuaXRlbSgwKSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24iLCAic2VydmljZSJ9KSk7CisJCQorCQkKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlcnZpY2UiKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCAxKTsKKwkJCisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGxpc3QuaXRlbSgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhzZXJ2aWNlTmFtZSwgIlRlc3QxIik7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobGlzdC5pdGVtKDApLCBuZXcgU3RyaW5nW10geyJuYW1lIn0pKTsKKwkJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUobGlzdC5pdGVtKDApLCBuZXcgU3RyaW5nW10geyAiY29uc3RzIiwgImV4dGVybnMiLCAiZW51bXMiLCAic3RydWN0cyIsICJleGNlcHRpb25zIiwgIm1ldGhvZHMifSkpOworCQkKKwkJCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb25zdHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgY29uc3RzCisJCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY29uc3QiKTsKKwkJCisJCWFzc2VydEVxdWFscyhsaXN0LmdldExlbmd0aCgpLCA0Mik7CisJCQorCQlpbnQgbm9kZUNvdW50ID0gMDsKKwkJCisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJCT09MMSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJPT0xFQU4pLCAiZmFsc2UiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIkJPT0wyIiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuQk9PTEVBTiksICJ0cnVlIiwgbnVsbCk7CisJCisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJCWVRFMSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEUpLCAiLTEyOCIsIG51bGwpOworCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiQllURTIiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5CWVRFKSwgIi0xIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJCWVRFMyIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkJZVEUpLCAiMCIsIG51bGwpOworCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiQllURTQiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5CWVRFKSwgIjEiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIkJZVEU1IiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuQllURSksICIxMjciLCBudWxsKTsKKwkJCisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJTSE9SVDEiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVCksICItMzI3NjgiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNIT1JUMiIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNIT1JUKSwgIi0xIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJTSE9SVDMiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVCksICIwIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJTSE9SVDQiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVCksICIxIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJTSE9SVDUiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TSE9SVCksICIzMjc2NyIsIG51bGwpOworCQkKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIklOVDEiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQpLCAiLTIxNDc0ODM2NDgiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIklOVDIiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQpLCAiLTEiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIklOVDMiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQpLCAiMCIsIG51bGwpOworCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiSU5UNCIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLklOVCksICIxIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJJTlQ1IiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuSU5UKSwgIjIxNDc0ODM2NDciLCBudWxsKTsKKwkJCisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJMT05HMSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkxPTkcpLCAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIkxPTkcyIiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuTE9ORyksICItMSIsIG51bGwpOworCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiTE9ORzMiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5MT05HKSwgIjAiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIkxPTkc0IiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuTE9ORyksICIxIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJMT05HNSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkxPTkcpLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIsIG51bGwpOworCQkKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIkZMT0FUMSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUKSwgIjEuNGUtNDUiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIkZMT0FUMiIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkZMT0FUKSwgIi0xIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJGTE9BVDMiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5GTE9BVCksICIwIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJGTE9BVDQiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5GTE9BVCksICIxIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJGTE9BVDUiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5GTE9BVCksICIzLjQwMjgyMzVlMzgiLCBudWxsKTsKKwkJCisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJET1VCTEUxIiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuRE9VQkxFKSwgIjQuOWUtMzI0IiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJET1VCTEUyIiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuRE9VQkxFKSwgIi0xIiwgbnVsbCk7CisJCWNoZWNrQ29uc3RQcm9wZXJ0aWVzKGxpc3QuaXRlbShub2RlQ291bnQrKyksICJET1VCTEUzIiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuRE9VQkxFKSwgIjAiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIkRPVUJMRTQiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEUpLCAiMSIsIG51bGwpOworCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiRE9VQkxFNSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLkRPVUJMRSksICIxLjc5NzY5MzEzNDg2MjMxNTdlMzA4IiwgbnVsbCk7CisJCQorCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiU1RSSU5HMSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUklORyksICIiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNUUklORzIiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkcpLCAiYSIsIG51bGwpOworCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiU1RSSU5HMyIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUklORyksICJhYmMiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNUUklORzQiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkcpLCAiYVx0Ylx0Y1xyXG4iLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNUUklORzUiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkcpLCAieFx1MDAyMHgiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNUUklORzYiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkcpLCAieFx1MDBiZngiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNUUklORzciLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkcpLCAieFx1MDNhOXgiLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNUUklORzgiLCBnZXRUeXBlTmFtZShFdGNoR3JhbW1hckNvbnN0YW50cy5TVFJJTkcpLCAieFxceCIsIG51bGwpOworCQljaGVja0NvbnN0UHJvcGVydGllcyhsaXN0Lml0ZW0obm9kZUNvdW50KyspLCAiU1RSSU5HOSIsIGdldFR5cGVOYW1lKEV0Y2hHcmFtbWFyQ29uc3RhbnRzLlNUUklORyksICJ4J3giLCBudWxsKTsKKwkJY2hlY2tDb25zdFByb3BlcnRpZXMobGlzdC5pdGVtKG5vZGVDb3VudCsrKSwgIlNUUklORzEwIiwgZ2V0VHlwZU5hbWUoRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSSU5HKSwgInhcIngiLCBudWxsKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEV4dGVybnMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgY29uc3RzCisJCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZXh0ZXJuIik7CisJCQorCQlhc3NlcnRFcXVhbHMobGlzdC5nZXRMZW5ndGgoKSwgMSk7CisJCQorCQlpbnQgbm9kZUNvdW50ID0gMDsKKwkJCisJCQorCQkKKwkJTm9kZSBleHRlcm5Ob2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrRXh0ZXJuUHJvcGVydGllcyhleHRlcm5Ob2RlLCAiQmxvYiIsICItMTMwODAzOTgzOCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuQmxvYiIpOworCQljaGVja0V4dGVybk1hcFByb3BlcnRpZXMoZXh0ZXJuTm9kZSwgImphdmEiLCAiU3RySW50SGFzaE1hcCIsICJvcmcuYXBhY2hlLmV0Y2guYmluZGluZ3MuamF2YS51dGlsLlN0ckludEhhc2hNYXAiLCAiU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIiLCAgIm9yZy5hcGFjaGUuZXRjaC5iaW5kaW5ncy5qYXZhLnV0aWwuU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIiKTsKKwkJY2hlY2tFeHRlcm5NYXBQcm9wZXJ0aWVzKGV4dGVybk5vZGUsICJjc2hhcnAiLCAiU3RySW50SGFzaE1hcCIsICJPcmcuQXBhY2hlLkV0Y2guQmluZGluZ3MuQ3NoYXJwLlV0aWwiLCAiU3RySW50SGFzaE1hcFNlcmlhbGl6ZXIiLCAgIk9yZy5BcGFjaGUuRXRjaC5CaW5kaW5ncy5Dc2hhcnAuVXRpbCIpOworCX0KKwkJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEVudW1zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdmVyaWZ5IGVudW1zCisJCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW51bSIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0TGVuZ3RoKCksIDEpOworCQkKKwkJaW50IG5vZGVDb3VudCA9IDA7CisJCQorCQlOb2RlIGVudW1Ob2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrRW51bVByb3BlcnRpZXMoZW51bU5vZGUsICJFMSIsICI4NzQ1NDE0ODkiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLkUxIiwgImJsYWgiKTsKKwkJY2hlY2tFbnVtVmFsdWVQcm9wZXJ0aWVzKGVudW1Ob2RlLCAiQSIsICIzNTI5ODgyODQiKTsKKwkJY2hlY2tFbnVtVmFsdWVQcm9wZXJ0aWVzKGVudW1Ob2RlLCAiQiIsICIzNTI5ODgyODUiKTsKKwkJY2hlY2tFbnVtVmFsdWVQcm9wZXJ0aWVzKGVudW1Ob2RlLCAiQyIsICIzNTI5ODgyODYiKTsKKwkJCisJCQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U3RydWN0cygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHZlcmlmeSBzdHJ1Y3RzCisJCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3RydWN0Iik7CisJCQorCQlhc3NlcnRFcXVhbHMobGlzdC5nZXRMZW5ndGgoKSwgNCk7CisJCQorCQlpbnQgbm9kZUNvdW50ID0gMDsKKwkJCisJCU5vZGUgc3RydWN0Tm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja1N0cnVjdFByb3BlcnRpZXMoc3RydWN0Tm9kZSwgIlMxIiwgIjg3NTQ1OTg3NSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuUzEiLCAibnVsbCIsICJibGFoIik7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJ4IiwgIjM1Mjk4ODMzOSIsICJ4IiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgInZhbHVlIik7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJ5IiwgIjM1Mjk4ODM0MCIsICJ5IiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgInZhbHVlIik7CisJCWNoZWNrU3RydWN0VmFsdWVQcm9wZXJ0aWVzKHN0cnVjdE5vZGUsICJ6IiwgIjM1Mjk4ODM0MSIsICJ6IiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgInZhbHVlIik7CisJCQorCQorCX0KKwkJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGV4dEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgc3RydWN0cworCQlOb2RlTGlzdCBleGNlcHRpb25zTm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZXhjZXB0aW9ucyIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGV4Y2VwdGlvbnNOb2RlTGlzdC5nZXRMZW5ndGgoKSwgMSk7CisJCQorCQlOb2RlIGV4Y2VwdGlvbnNOb2RlID0gZXhjZXB0aW9uc05vZGVMaXN0Lml0ZW0oMCk7CisJCQorCQlBcnJheUxpc3Q8Tm9kZT5saXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworCQkJCisJCU5vZGVMaXN0IGV4Y2VwdGlvbnNOb2RlQ2hpbGRyZW4gPSBleGNlcHRpb25zTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zTm9kZUNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWlmKGV4Y2VwdGlvbnNOb2RlQ2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpID09ICJleGNlcHRpb24iKQorCQkJeworCQkJCWxpc3QuYWRkKGV4Y2VwdGlvbnNOb2RlQ2hpbGRyZW4uaXRlbShpKSk7CisJCQl9CisJCX0KKwkJCisJCQorCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCksIDYpOworCQkKKwkJaW50IG5vZGVDb3VudCA9IDA7CisJCQorCQlOb2RlIGV4Y2VwdGlvbk5vZGUgPSBsaXN0LmdldChub2RlQ291bnQrKyk7CisJCQorCQljaGVja0V4Y2VwdGlvblByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgIkV4Y3AxIiwgImZhbHNlIiwgIi0xNDQ2MDc1NzMyIiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5FeGNwMSIsICJudWxsIiwgImJsYWgiKTsKKwkJY2hlY2tFeGNlcHRpb25WYWx1ZVByb3BlcnRpZXMoZXhjZXB0aW9uTm9kZSwgIm1zZyIsICI3Njk3NTAzNjQiLCAibXNnIiwgInN0cmluZyIsICJmYWxzZSIsIG51bGwsICJ2YWx1ZSIpOworCQljaGVja0V4Y2VwdGlvblZhbHVlUHJvcGVydGllcyhleGNlcHRpb25Ob2RlLCAiY29kZSIsICItMzI1NTUxMTUwIiwgImNvZGUiLCAiaW50IiwgImZhbHNlIiwgbnVsbCwgInZhbHVlIik7CisJCQorCQkKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdE1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB2ZXJpZnkgc3RydWN0cworCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZCIpOworCQkKKwkJLyoqCisJCSAqIFRoZXJlIGFyZSAxMiBtZXRob2RzLCBhbmQgMTEgb2YgdGhlbSBoYXZlIHJlc3VsdC9yZXNwb25zZQorCQkgKiBtZXNzYWdlcyA9PiAyMyB0b3RhbCBtZXRob2RzCisJCSAqLworCQlhc3NlcnRFcXVhbHMoMTUwLCBsaXN0LmdldExlbmd0aCgpKTsKKwkJCisJCWludCBub2RlQ291bnQgPSAwOworCQkKKwkJTm9kZSBtZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAibm90aGluZyIsICIxODMwNjkwMDI0IiwgIm9yZy5hcGFjaGUuZXRjaC50ZXN0cy5UZXN0MS5ub3RoaW5nIiwgImZyZWUiLCAiZmFsc2UiLCAiYm90aCIsIG51bGwsICJkbyBhYnNvbHV0ZWx5IG5vdGhpbmciLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICI3OTM1MDM0NjEiLCAib3JnLmFwYWNoZS5ldGNoLnRlc3RzLlRlc3QxLl9yZXN1bHRfbm90aGluZyIsICJ2b2lkIiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9ub3RoaW5nIiwgIjc5MzUwMzQ2MSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuX3Jlc3VsdF9ub3RoaW5nIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImluY3IiLCAiLTkxNDE3NDMxMSIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuaW5jciIsICJxdWV1ZWQiLCAiZmFsc2UiLCAiYm90aCIsIG51bGwsICJJbmNyZW1lbnRzIGEgdmFsdWUgYnkgb25lLiIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIngiLCAiMzUyOTg4MzM5IiwgIngiLCAiaW50IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCAiYSB2YWx1ZSIpOworCQljaGVja1Jlc3VsdChtZXRob2ROb2RlLCAiLTUwNzUzMzYwNCIsICJvcmcuYXBhY2hlLmV0Y2gudGVzdHMuVGVzdDEuX3Jlc3VsdF9pbmNyIiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgImEgdmFsdWUgb25lIGxhcmdlci4iKTsKKwkJCisJLyoJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfaW5jciIsICItMTk4MjQ4OTUzMiIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuX3Jlc3VsdF9pbmNyIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAic3VtIiwgIjg3NDMyOTQ3MCIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3Quc3VtIiwgIm5vbmUiLCAiZmFsc2UiLCAiYm90aCIsIG51bGwsIG51bGwsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIngiLCAiMzUyOTg4MzM5IiwgIngiLCAiaW50IiwgInRydWUiLCAidHJ1ZSIsICIxIiwgbnVsbCk7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICI5ODU2MTE0NyIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuX3Jlc3VsdF9zdW0iLCAiaW50IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9zdW0iLCAiOTg1NjExNDciLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Ll9yZXN1bHRfc3VtIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiZmlsbCIsICItMTUxMTI3MDgwMCIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuZmlsbCIsICJub25lIiwgImZhbHNlIiwgImJvdGgiLCBudWxsLCBudWxsLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJuIiwgIjM1Mjk4ODMyOSIsICJuIiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCWNoZWNrTWV0aG9kRmllbGRQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJ4IiwgIjM1Mjk4ODMzOSIsICJ4IiwgImludCIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICItNzAwMDA5NzMiLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Ll9yZXN1bHRfZmlsbCIsICJpbnQiLCAidHJ1ZSIsICJ0cnVlIiwgIjEiLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9maWxsIiwgIi03MDAwMDk3MyIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuX3Jlc3VsdF9maWxsIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImFsd2F5c1dvcmtzIiwgIjg5OTMxMzczNCIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuYWx3YXlzV29ya3MiLCAibm9uZSIsICJmYWxzZSIsICJib3RoIiwgbnVsbCwgbnVsbCwgbnVsbCk7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsICJpc1RydWUiKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIi0yNTM2MjkxMTciLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Ll9yZXN1bHRfYWx3YXlzV29ya3MiLCAiaW50IiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9hbHdheXNXb3JrcyIsICItMjUzNjI5MTE3IiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5fcmVzdWx0X2Fsd2F5c1dvcmtzIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImlzVHJ1ZSIsICItMTk5NTU0NjQ5MSIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuaXNUcnVlIiwgIm5vbmUiLCAiZmFsc2UiLCAiYm90aCIsIG51bGwsIG51bGwsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIjIwODc3NDUzNTIiLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Ll9yZXN1bHRfaXNUcnVlIiwgImJvb2xlYW4iLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJfcmVzdWx0X2lzVHJ1ZSIsICIyMDg3NzQ1MzUyIiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5fcmVzdWx0X2lzVHJ1ZSIsIAorCQkJCSJub25lIiwgInRydWUiLCAiYm90aCIsICI0MDAwIiwgbnVsbCwgInJlc3VsdCIpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJhbHdheXNGYWlscyIsICI1ODg5ODMxNjEiLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0LmFsd2F5c0ZhaWxzIiwgIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgbnVsbCwgbnVsbCwgbnVsbCk7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsICJpc0ZhbHNlIik7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImlzRmFsc2UiLCAiMTIyMTQwNTI2MCIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuaXNGYWxzZSIsICJub25lIiwgImZhbHNlIiwgImJvdGgiLCBudWxsLCBudWxsLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICIxMTUyNjMxODgxIiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5fcmVzdWx0X2lzRmFsc2UiLCAiYm9vbGVhbiIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfaXNGYWxzZSIsICIxMTUyNjMxODgxIiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5fcmVzdWx0X2lzRmFsc2UiLCAKKwkJCQkibm9uZSIsICJ0cnVlIiwgImJvdGgiLCAiNDAwMCIsIG51bGwsICJyZXN1bHQiKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCQorCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAibTMiLCAiLTU2MzUxNDEyNSIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QubTMiLCAibm9uZSIsICJmYWxzZSIsICJib3RoIiwgbnVsbCwgbnVsbCwgbnVsbCk7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsICJjYW5fbTEiKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIi0xMzA3MDM4MDI2IiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5fcmVzdWx0X20zIiwgInZvaWQiLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsIG51bGwpOworCisJCW1ldGhvZE5vZGUgPSBsaXN0Lml0ZW0obm9kZUNvdW50KyspOworCQkKKwkJY2hlY2tNZXRob2RQcm9wZXJ0aWVzKG1ldGhvZE5vZGUsICJfcmVzdWx0X20zIiwgIi0xMzA3MDM4MDI2IiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5fcmVzdWx0X20zIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgImNhbl9tMSIsICItMzA3MDA2MDQ4IiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5jYW5fbTEiLCAibm9uZSIsICJmYWxzZSIsICJib3RoIiwgbnVsbCwgbnVsbCwgbnVsbCk7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQljaGVja1Jlc3VsdChtZXRob2ROb2RlLCAiLTUxODY4MTUwMSIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuX3Jlc3VsdF9jYW5fbTEiLCAiYm9vbGVhbiIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgbnVsbCk7CisKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfY2FuX20xIiwgIi01MTg2ODE1MDEiLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Ll9yZXN1bHRfY2FuX20xIiwgCisJCQkJIm5vbmUiLCAidHJ1ZSIsICJib3RoIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIm0xIiwgIi01NjM1MTQxMjciLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Lm0xIiwgIm5vbmUiLCAiZmFsc2UiLCAiY2xpZW50IiwgbnVsbCwgIlRlc3RcbjFcbjIiLCBudWxsKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7CisJCWNoZWNrRXhjZXB0aW9uKG1ldGhvZE5vZGUsICJFeGNwMSIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuRXhjcDEiLCAiRXhjZXB0aW9uIHRlc3QiKTsKKwkJY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIngiLCAiMzUyOTg4MzM5IiwgIngiLCAiYm9vbGVhbiIsICJ0cnVlIiwgImZhbHNlIiwgbnVsbCwgImhpIik7CisJCWNoZWNrUmVzdWx0KG1ldGhvZE5vZGUsICItMTMwNzAzODAyOCIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuX3Jlc3VsdF9tMSIsICJ2b2lkIiwgInRydWUiLCAiZmFsc2UiLCBudWxsLCBudWxsKTsKKworCQltZXRob2ROb2RlID0gbGlzdC5pdGVtKG5vZGVDb3VudCsrKTsKKwkJCisJCWNoZWNrTWV0aG9kUHJvcGVydGllcyhtZXRob2ROb2RlLCAiX3Jlc3VsdF9tMSIsICItMTMwNzAzODAyOCIsICJldGNoLmJpbmRpbmdzLnhtbC5jb21waWxlci50ZXN0LlRlc3QuX3Jlc3VsdF9tMSIsIAorCQkJCSJub25lIiwgInRydWUiLCAic2VydmVyIiwgIjQwMDAiLCBudWxsLCAicmVzdWx0Iik7CisJCWNoZWNrQXV0aG9yaXplKG1ldGhvZE5vZGUsIG51bGwpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIm0yIiwgIi01NjM1MTQxMjYiLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Lm0yIiwgIm5vbmUiLCAiZmFsc2UiLCAiYm90aCIsIG51bGwsICJUZXN0XG5hIGxpbmUgaXMgaGVyZSIsIG51bGwpOworCQljaGVja0F1dGhvcml6ZShtZXRob2ROb2RlLCBudWxsKTsKKwkJY2hlY2tFeGNlcHRpb24obWV0aG9kTm9kZSwgIkV4Y3AxIiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5FeGNwMSIsICJFeGNlcHRpb24gdGVzdCB2YWx1ZSBhZ2FpbiIpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAiYSIsICIzNTI5ODgzMTYiLCAiYSIsICJzdHJpbmciLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsICJ0ZXN0IGZvciBBIHBhcmFtZXRlciIpOworCQljaGVja01ldGhvZEZpZWxkUHJvcGVydGllcyhtZXRob2ROb2RlLCAiYiIsICIzNTI5ODgzMTciLCAiYiIsICJzdHJpbmciLCAidHJ1ZSIsICJ0cnVlIiwgIjEiLCAidGVzdCBmb3IgQiBwYXJhbWV0ZXIiKTsKKwkJY2hlY2tSZXN1bHQobWV0aG9kTm9kZSwgIi0xMzA3MDM4MDI3IiwgImV0Y2guYmluZGluZ3MueG1sLmNvbXBpbGVyLnRlc3QuVGVzdC5fcmVzdWx0X20yIiwgImJvb2xlYW4iLCAidHJ1ZSIsICJmYWxzZSIsIG51bGwsICJUaGVyZSBpcyBtdWNoIHRvIHNheSBhYm91dCB2b2lkISIpOworCQkKKwkJbWV0aG9kTm9kZSA9IGxpc3QuaXRlbShub2RlQ291bnQrKyk7CisJCQorCQljaGVja01ldGhvZFByb3BlcnRpZXMobWV0aG9kTm9kZSwgIl9yZXN1bHRfbTIiLCAiLTEzMDcwMzgwMjciLCAiZXRjaC5iaW5kaW5ncy54bWwuY29tcGlsZXIudGVzdC5UZXN0Ll9yZXN1bHRfbTIiLCAKKwkJCQkibm9uZSIsICJ0cnVlIiwgImJvdGgiLCAiNDAwMCIsIG51bGwsICJyZXN1bHQiKTsKKwkJY2hlY2tBdXRob3JpemUobWV0aG9kTm9kZSwgbnVsbCk7ICovCisJfQorCQorCQorCXByaXZhdGUgdm9pZCBjaGVja0NvbnN0UHJvcGVydGllcyhOb2RlIG5vZGUsIFN0cmluZyBjb25zdE5hbWUsIFN0cmluZyBjb25zdFR5cGUsIFN0cmluZyBjb25zdFZhbHVlLCBTdHJpbmcgY29uc3REZXNjcmlwdGlvbikKKwl7CisJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKG5vZGUsIG5ldyBTdHJpbmdbXSB7Im5hbWUiLCAidHlwZSIsICJ2YWx1ZSJ9KSk7CisKKwkJCisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgc3R1ZmYgaGFzIHNudWNrIGludG8gdGhlIFhNTCBiaW5kaW5nCisJCWFzc2VydEVxdWFscyhhdHRycy5nZXRMZW5ndGgoKSwgMyk7CisJCQorCQlTdHJpbmcgbmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInZhbHVlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkvLyB2ZXJpZnkgbmFtZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIGNvbnN0TmFtZSk7CisJCQorCQkvLyB2ZXJpZnkgdHlwZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHModHlwZUF0dHIsIGNvbnN0VHlwZSk7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKGNvbnN0VmFsdWUsIHZhbHVlQXR0cik7CisJCQorCQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tFeHRlcm5Qcm9wZXJ0aWVzKE5vZGUgbm9kZSwgU3RyaW5nIGV4dGVybk5hbWUsIFN0cmluZyB0eXBlSWQsIFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJ0eXBlSWQiLCAidHlwZU5hbWUifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShub2RlLCBuZXcgU3RyaW5nW10geyJleHRlcm5tYXAifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAzKTsKKwkJCisJCVN0cmluZyBuYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUlkQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZUlkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVOYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIGV4dGVybk5hbWUpOworCQlhc3NlcnRFcXVhbHModHlwZUlkQXR0ciwgdHlwZUlkKTsKKwkJYXNzZXJ0RXF1YWxzKHR5cGVOYW1lQXR0ciwgdHlwZU5hbWUpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tFeHRlcm5NYXBQcm9wZXJ0aWVzKE5vZGUgbm9kZSwgU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5JbXBvcnQsIFN0cmluZyBzZXJpYWxpemVyLCBTdHJpbmcgc0ltcG9ydCkKKwl7CisJCU5vZGUgbGFuZ3VhZ2VOb2RlID0gbnVsbDsKKwkJCisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlpZihjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpID09ICJleHRlcm5tYXAiKQorCQkJeworCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRoaXNOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlOb2RlIGxhbmd1YWdlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibGFuZ3VhZ2UiKTsKKwkJCQlTdHJpbmcgdGhpc0xhbmd1YWdlID0gbGFuZ3VhZ2VBdHRyLmdldE5vZGVWYWx1ZSgpOworCQkJCWlmKHRoaXNMYW5ndWFnZS5jb21wYXJlVG8obGFuZ3VhZ2UpID09IDApCisJCQkJeworCQkJCQlsYW5ndWFnZU5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIHZlcmlmeSB0aGF0IHRoZSBsYW5ndWFnZSBub2RlIGV4aXN0cworCQlhc3NlcnROb3ROdWxsKGxhbmd1YWdlTm9kZSk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUobGFuZ3VhZ2VOb2RlLCBuZXcgU3RyaW5nW10geyJsYW5ndWFnZSIsICJuYW1lIiwgIm5JbXBvcnQiLCAic2VyaWFsaXplciIsICJzSW1wb3J0In0pKTsKKworCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUobGFuZ3VhZ2VOb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiJ9KSk7CisKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gbGFuZ3VhZ2VOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCA1KTsKKwkJCisJCVN0cmluZyBuYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgbkltcG9ydEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5JbXBvcnQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHNlcmlhbGl6ZXJBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJzZXJpYWxpemVyIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBzSW1wb3J0QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgic0ltcG9ydCIpLmdldE5vZGVWYWx1ZSgpOworCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIG5hbWUKKwkJYXNzZXJ0RXF1YWxzKG5hbWVBdHRyLCBuYW1lKTsKKwkJCisJCS8vIHZlcmlmeSB0aGUgdmFsdWUgb2YgdGhlIGV4dGVybm1hcCBuSW1wb3J0CisJCWFzc2VydEVxdWFscyhuSW1wb3J0QXR0ciwgbkltcG9ydCk7CisJCQorCQkvLyB2ZXJpZnkgdGhlIHZhbHVlIG9mIHRoZSBleHRlcm5tYXAgc2VyaWFsaXplcgorCQlhc3NlcnRFcXVhbHMoc2VyaWFsaXplckF0dHIsIHNlcmlhbGl6ZXIpOworCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIHNJbXBvcnQKKwkJYXNzZXJ0RXF1YWxzKHNJbXBvcnRBdHRyLCBzSW1wb3J0KTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBub2RlcyBoYXZlIHNudWNrIGluCisJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChsYW5ndWFnZU5vZGUpLCAwKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrRW51bVByb3BlcnRpZXMoTm9kZSBlbnVtTm9kZSwgU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bVR5cGVJZCwgU3RyaW5nIGVudW1UeXBlTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gZW51bU5vZGUuZ2V0QXR0cmlidXRlcygpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKGVudW1Ob2RlLCBuZXcgU3RyaW5nW10geyJuYW1lIiwgInR5cGVJZCIsICJ0eXBlTmFtZSJ9KSk7CisKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGVudW1Ob2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiIsICJlbnRyeSJ9KSk7CisKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IHN0dWZmIGhhcyBzbnVjayBpbnRvIHRoZSBYTUwgYmluZGluZworCQlhc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIDMpOworCQkKKwkJU3RyaW5nIG5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZUlkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVOYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkvLyB2ZXJpZnkgbmFtZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHMobmFtZUF0dHIsIGVudW1OYW1lKTsKKwkJCisJCS8vIHZlcmlmeSB0eXBlIG9mIGNvbnN0YW50CisJCWFzc2VydEVxdWFscyh0eXBlQXR0ciwgZW51bVR5cGVJZCk7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKHZhbHVlQXR0ciwgZW51bVR5cGVOYW1lKTsKKwkJCisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQoZW51bU5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tFbnVtVmFsdWVQcm9wZXJ0aWVzKE5vZGUgZW51bU5vZGUsIFN0cmluZyB2YWx1ZU5hbWUsIFN0cmluZyB2YWx1ZUlkKQorCXsKKwkJTm9kZSB2YWx1ZU5vZGUgPSBudWxsOworCQkKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBlbnVtTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlpZihjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpID09ICJlbnRyeSIpCisJCQl7CisJCQkJTm9kZSB0aGlzTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gdGhpc05vZGUuZ2V0QXR0cmlidXRlcygpOworCQkJCU5vZGUgdmFsdWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ2YWx1ZSIpOworCQkJCVN0cmluZyB0aGlzVmFsdWUgPSB2YWx1ZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisJCQkJaWYodGhpc1ZhbHVlLmNvbXBhcmVUbyh2YWx1ZU5hbWUpID09IDApCisJCQkJeworCQkJCQl2YWx1ZU5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIHZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBub2RlIGV4aXN0cworCQlhc3NlcnROb3ROdWxsKHZhbHVlTm9kZSk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUodmFsdWVOb2RlLCBuZXcgU3RyaW5nW10geyJ2YWx1ZSIsICJlbnRyeUlkIn0pKTsKKworCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUodmFsdWVOb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiJ9KSk7CisKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gdmFsdWVOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAyKTsKKwkJCisJCVN0cmluZyBlbnRyeUlkQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZW50cnlJZCIpLmdldE5vZGVWYWx1ZSgpOworCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIG5hbWUKKwkJYXNzZXJ0RXF1YWxzKGVudHJ5SWRBdHRyLCB2YWx1ZUlkKTsKKwkJCisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gbm9kZXMgaGF2ZSBzbnVjayBpbgorCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQodmFsdWVOb2RlKSwgMCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja1N0cnVjdFByb3BlcnRpZXMoTm9kZSBzdHJ1Y3ROb2RlLCBTdHJpbmcgc3RydWN0TmFtZSwgU3RyaW5nIHN0cnVjdFR5cGVJZCwgU3RyaW5nIHN0cnVjdFR5cGVOYW1lLCBTdHJpbmcgYmFzZVR5cGUsIFN0cmluZyBkZXNjcmlwdGlvbikKKwl7CisJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHN0cnVjdE5vZGUuZ2V0QXR0cmlidXRlcygpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKHN0cnVjdE5vZGUsIG5ldyBTdHJpbmdbXSB7Im5hbWUiLCAidHlwZUlkIiwgInR5cGVOYW1lIiwgImJhc2VUeXBlIn0pKTsKKworCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUoc3RydWN0Tm9kZSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24iLCAiZmllbGQifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCA0KTsKKwkJCisJCVN0cmluZyBuYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGVJZCIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdmFsdWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgYmFzZVR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJiYXNlVHlwZSIpLmdldE5vZGVWYWx1ZSgpOworCQkKKwkJLy8gdmVyaWZ5IG5hbWUgb2YgY29uc3RhbnQKKwkJYXNzZXJ0RXF1YWxzKG5hbWVBdHRyLCBzdHJ1Y3ROYW1lKTsKKwkJCisJCS8vIHZlcmlmeSB0eXBlIG9mIGNvbnN0YW50CisJCWFzc2VydEVxdWFscyh0eXBlQXR0ciwgc3RydWN0VHlwZUlkKTsKKwkJCisJCS8vIHZlcmlmeSB2YWx1ZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHModmFsdWVBdHRyLCBzdHJ1Y3RUeXBlTmFtZSk7CisJCQorCQlhc3NlcnRFcXVhbHMoYmFzZVR5cGVBdHRyLCBiYXNlVHlwZSApOworCQkKKwkJTm9kZSBjaGlsZCA9IGdldERlc2NyaXB0aW9uRWxlbWVudChzdHJ1Y3ROb2RlKTsKKwkJCisJCWlmKGRlc2NyaXB0aW9uID09IG51bGwpCisJCXsKKwkJCWFzc2VydE51bGwoY2hpbGQpOworCQl9CisJCWVsc2UKKwkJewkKKwkJCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlID0gY2hpbGQuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CisJCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25WYWx1ZSwgZGVzY3JpcHRpb24pOworCQkJCisJCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKwkJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChjaGlsZCksIDApOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja1N0cnVjdFZhbHVlUHJvcGVydGllcyhOb2RlIHN0cnVjdE5vZGUsIFN0cmluZyBzdHJ1Y3ROYW1lLCBTdHJpbmcgZmllbGRJZCwgU3RyaW5nIGZpZWxkTmFtZSwgCisJCVN0cmluZyB0eXBlLCBTdHJpbmcgaXNQcmltaXRpdmVUeXBlLCBTdHJpbmcgaXNBcnJheSwgU3RyaW5nIGRpbWVuc2lvbiwgU3RyaW5nIGRlc2NyaXB0aW9uKQorCXsKKwkJTm9kZSBmaWVsZE5vZGUgPSBudWxsOworCQkKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBzdHJ1Y3ROb2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCkgPT0gImZpZWxkIikKKwkJCXsKKwkJCQlOb2RlIHRoaXNOb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0aGlzTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQkJTm9kZSB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5hbWUiKTsKKwkJCQlTdHJpbmcgdGhpc1ZhbHVlID0gdmFsdWVBdHRyLmdldE5vZGVWYWx1ZSgpOworCQkJCWlmKHRoaXNWYWx1ZS5jb21wYXJlVG8oc3RydWN0TmFtZSkgPT0gMCkKKwkJCQl7CisJCQkJCWZpZWxkTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gdmVyaWZ5IHRoYXQgdGhlIHZhbHVlIG5vZGUgZXhpc3RzCisJCWFzc2VydE5vdE51bGwoZmllbGROb2RlKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShmaWVsZE5vZGUsIG5ldyBTdHJpbmdbXSB7Im5hbWUiLCAiZmllbGRJZCIsICJmaWVsZE5hbWUiLCAidHlwZSIsICJpc1ByaW1pdGl2ZVR5cGUiLCAiaXNBcnJheSIsICJkaW1lbnNpb24ifSkpOworCisJCS8vdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24ifSkpOworCQkKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gZmllbGROb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJLy8gZGltZW5zaW9uIGF0dHIgaXMgbnVsbGFibGUsIG1lYW5pbmcgaXQgbWlnaHQganVzdCBub3QgYmUgdGhlcmUgaWYgaXNBcnJheSA9ICJmYWxzZSIKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCBpc0FycmF5ID09ICJmYWxzZSIgPyA2IDogNyk7CisJCQorCQlTdHJpbmcgZmllbGRJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGZpZWxkTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGlzQXJyYXlBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc0FycmF5IikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc1ByaW1pdGl2ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oICJpc1ByaW1pdGl2ZVR5cGUiICkuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQlOb2RlIGRpbWVuc2lvbk5vZGUgPSBhdHRycy5nZXROYW1lZEl0ZW0oImRpbWVuc2lvbiIpOworCQlTdHJpbmcgZGltZW5zaW9uQXR0ciA9IGRpbWVuc2lvbk5vZGUgPT0gbnVsbCA/IGRpbWVuc2lvbiA6IGRpbWVuc2lvbk5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisJCQorCQkKKwkJLy8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZXJubWFwIG5hbWUKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkSWRBdHRyLCBmaWVsZElkKTsKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkTmFtZUF0dHIsIGZpZWxkTmFtZSk7CisJCWFzc2VydEVxdWFscyh0eXBlQXR0ciwgdHlwZSk7CisJCWFzc2VydEVxdWFscyhpc0FycmF5QXR0ciwgaXNBcnJheSk7CisJCWFzc2VydEVxdWFscyhkaW1lbnNpb25BdHRyLCBkaW1lbnNpb24pOworCQlhc3NlcnRFcXVhbHMoIGlzUHJpbWl0aXZlQXR0ciwgaXNQcmltaXRpdmVUeXBlICk7CisJCQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KGZpZWxkTm9kZSk7CisJCQorCQlpZihkZXNjcmlwdGlvbiA9PSBudWxsKQorCQl7CisJCQlhc3NlcnROdWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsJCisJCQlTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IGNoaWxkLmdldFRleHRDb250ZW50KCkudHJpbSgpOworCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uVmFsdWUsIGRlc2NyaXB0aW9uKTsKKwkJCQorCQkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IGNoaWxkcmVuIG9uIGRlc2NyaXB0aW9uCisJCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQoY2hpbGQpLCAwKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tFeGNlcHRpb25Qcm9wZXJ0aWVzKE5vZGUgZXhjZXB0aW9uTm9kZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpc1VuY2hlY2tlZCwgU3RyaW5nIGV4Y2VwdGlvbklkLCAKKwkJCVN0cmluZyBleGNlcHRpb25OYW1lLCBTdHJpbmcgYmFzZVR5cGVOYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pCisJeworCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBleGNlcHRpb25Ob2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShleGNlcHRpb25Ob2RlLCAKKwkJCQluZXcgU3RyaW5nW10geyJuYW1lIiwgImlzVW5jaGVja2VkIiwgInR5cGVJZCIsICJ0eXBlTmFtZSIsICJiYXNlVHlwZSJ9KSk7CisKKwkJLy92ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUoZXhjZXB0aW9uTm9kZSwgbmV3IFN0cmluZ1tdIHsiZGVzY3JpcHRpb24iLCAiZmllbGQifSkpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IHN0dWZmIGhhcyBzbnVjayBpbnRvIHRoZSBYTUwgYmluZGluZworCQlhc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIDUpOworCQkKKwkJU3RyaW5nIG5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc1VuY2hlY2tlZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImlzVW5jaGVja2VkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZUlkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlTmFtZSA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZU5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGJhc2VUeXBlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiYmFzZVR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCS8vIHZlcmlmeSBuYW1lIG9mIGNvbnN0YW50CisJCWFzc2VydEVxdWFscyhuYW1lQXR0ciwgbmFtZSk7CisJCQorCQkvLyB2ZXJpZnkgdHlwZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHMoaXNVbmNoZWNrZWRBdHRyLCBpc1VuY2hlY2tlZCk7CisJCQorCQkvLyB2ZXJpZnkgdHlwZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHModHlwZUF0dHIsIGV4Y2VwdGlvbklkKTsKKwkJCisJCS8vIHZlcmlmeSB2YWx1ZSBvZiBjb25zdGFudAorCQlhc3NlcnRFcXVhbHModHlwZU5hbWUsIGV4Y2VwdGlvbk5hbWUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCBiYXNlVHlwZUF0dHIsIGJhc2VUeXBlTmFtZSApOworCQkKKwkJTm9kZSBjaGlsZCA9IGdldERlc2NyaXB0aW9uRWxlbWVudChleGNlcHRpb25Ob2RlKTsKKwkJCisJCWlmKGRlc2NyaXB0aW9uID09IG51bGwpCisJCXsKKwkJCWFzc2VydE51bGwoY2hpbGQpOworCQl9CisJCWVsc2UKKwkJewkKKwkJCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlID0gY2hpbGQuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CisJCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25WYWx1ZSwgZGVzY3JpcHRpb24pOworCQkJCisJCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKwkJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChjaGlsZCksIDApOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja0V4Y2VwdGlvblZhbHVlUHJvcGVydGllcyhOb2RlIGV4Y2VwdGlvbk5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmllbGRJZCwgU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyBpc0FycmF5LCBTdHJpbmcgZGltZW5zaW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pCisJeworCQlOb2RlIGZpZWxkTm9kZSA9IG51bGw7CisJCQorCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGV4Y2VwdGlvbk5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJaWYoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSA9PSAiZmllbGQiKQorCQkJeworCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRoaXNOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlOb2RlIHZhbHVlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpOworCQkJCVN0cmluZyB0aGlzVmFsdWUgPSB2YWx1ZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisJCQkJaWYodGhpc1ZhbHVlLmNvbXBhcmVUbyhuYW1lKSA9PSAwKQorCQkJCXsKKwkJCQkJZmllbGROb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCQkKKwkJLy8gdmVyaWZ5IHRoYXQgdGhlIHZhbHVlIG5vZGUgZXhpc3RzCisJCWFzc2VydE5vdE51bGwoZmllbGROb2RlKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gYXR0ciBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlBdHRyc09mTmFtZShmaWVsZE5vZGUsIG5ldyBTdHJpbmdbXSB7Im5hbWUiLCAiZmllbGRJZCIsICJmaWVsZE5hbWUiLCAidHlwZSIsICJpc0FycmF5IiwgImRpbWVuc2lvbiJ9KSk7CisKKy8vCQl2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisJCWFzc2VydFRydWUob25seUNoaWxkTm9kZXNPZk5hbWUoZmllbGROb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiIsICJmaWVsZCJ9KSk7CisJCisJCU5hbWVkTm9kZU1hcCBhdHRycyA9IGZpZWxkTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgc3R1ZmYgaGFzIHNudWNrIGludG8gdGhlIFhNTCBiaW5kaW5nCisJCS8vIGRpbWVuc2lvbiBhdHRyIGlzIG51bGxhYmxlLCBtZWFuaW5nIGl0IG1pZ2h0IGp1c3Qgbm90IGJlIHRoZXJlIGlmIGlzQXJyYXkgPSAiZmFsc2UiCisJCWFzc2VydEVxdWFscyhhdHRycy5nZXRMZW5ndGgoKSwgaXNBcnJheSA9PSAiZmFsc2UiID8gNSA6IDYpOworCQkKKwkJU3RyaW5nIGZpZWxkSWRBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJmaWVsZElkIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBmaWVsZE5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJmaWVsZE5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc0FycmF5QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiaXNBcnJheSIpLmdldE5vZGVWYWx1ZSgpOworCQkKKwkJTm9kZSBkaW1lbnNpb25Ob2RlID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJkaW1lbnNpb24iKTsKKwkJU3RyaW5nIGRpbWVuc2lvbkF0dHIgPSBkaW1lbnNpb25Ob2RlID09IG51bGwgPyBkaW1lbnNpb24gOiBkaW1lbnNpb25Ob2RlLmdldE5vZGVWYWx1ZSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkSWRBdHRyLCBmaWVsZElkKTsKKwkJYXNzZXJ0RXF1YWxzKGZpZWxkTmFtZUF0dHIsIGZpZWxkTmFtZSk7CisJCWFzc2VydEVxdWFscyh0eXBlQXR0ciwgdHlwZSk7CisJCWFzc2VydEVxdWFscyhpc0FycmF5QXR0ciwgaXNBcnJheSk7CisJCWFzc2VydEVxdWFscyhkaW1lbnNpb25BdHRyLCBkaW1lbnNpb24pOworCQkKKwkJTm9kZSBjaGlsZCA9IGdldERlc2NyaXB0aW9uRWxlbWVudChmaWVsZE5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisKKwlwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RQcm9wZXJ0aWVzKE5vZGUgbWV0aG9kTm9kZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2RJZCwgU3RyaW5nIG1ldGhvZE5hbWUsIAorCQkJU3RyaW5nIHBvb2wsIFN0cmluZyBpc09uZXdheSwgU3RyaW5nIGRpcmVjdGlvbiwgU3RyaW5nIHRpbWVvdXQsIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHJlc3VsdCkKKwl7CisJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG1ldGhvZE5vZGUuZ2V0QXR0cmlidXRlcygpOworCQlib29sZWFuIGlzUmVzdWx0TWVzc2FnZSA9IGZhbHNlOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKG1ldGhvZE5vZGUsIG5ldyBTdHJpbmdbXSB7Im5hbWUiLCAidHlwZUlkIiwgInR5cGVOYW1lIiwgImFzeW5jUmVjZWl2ZXJNb2RlIiwgImlzT25ld2F5IiwgIm1lc3NhZ2VEaXJlY3Rpb24iLCAidGltZW91dCIsCisJCQkJInJlc3BvbnNlRmllbGQifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShtZXRob2ROb2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiIsICJleGNlcHRpb24iLCAiYXV0aG9yaXplIiwgImZpZWxkIiwgInJlc3VsdCJ9KSk7CisJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJaXNSZXN1bHRNZXNzYWdlID0gbmFtZS5zdGFydHNXaXRoKCJfcmVzdWx0Iik7CisJCQorCQlhc3NlcnRFcXVhbHMoaXNSZXN1bHRNZXNzYWdlPyA4IDogNiwgYXR0cnMuZ2V0TGVuZ3RoKCkpOworCQkKKwkJU3RyaW5nIG5hbWVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyB0eXBlSWRBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHR5cGVOYW1lQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgidHlwZU5hbWUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIHBvb2xBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJhc3luY1JlY2VpdmVyTW9kZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgaXNPbmV3YXlBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc09uZXdheSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgZGlyZWN0aW9uQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibWVzc2FnZURpcmVjdGlvbiIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdGltZW91dEF0dHIgPSAiIjsKKwkJU3RyaW5nIHJlc3VsdEF0dHIgPSAiIjsKKwkJCisJCWlmICggaXNSZXN1bHRNZXNzYWdlICkKKwkJeworCQkJdGltZW91dEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInRpbWVvdXQiKS5nZXROb2RlVmFsdWUoKTsKKwkJCXJlc3VsdEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInJlc3BvbnNlRmllbGQiKS5nZXROb2RlVmFsdWUoKTsKKwkJfQorCQkKKwkJLy8gdmVyaWZ5IG5hbWUgb2YgbWV0aG9kCisJCWFzc2VydEVxdWFscyhuYW1lQXR0ciwgbmFtZSk7CisJCQorCQkvLyB2ZXJpZnkgdHlwZSBvZiBtZXRob2QKKwkJYXNzZXJ0RXF1YWxzKHR5cGVJZEF0dHIsIG1ldGhvZElkKTsKKwkJCisJCS8vIHZlcmlmeSB2YWx1ZSBvZiBtZXRob2QKKwkJYXNzZXJ0RXF1YWxzKHR5cGVOYW1lQXR0ciwgbWV0aG9kTmFtZSk7CisJCQorCQkvLyB2ZXJpZnkgdmFsdWUgb2YgcG9vbAorCQlhc3NlcnRFcXVhbHMocG9vbEF0dHIsIHBvb2wpOworCQkKKwkJLy8gdmVyaWZ5IHZhbHVlIG9mIGlzT25ld2F5CisJCWFzc2VydEVxdWFscyhpc09uZXdheUF0dHIsIGlzT25ld2F5KTsKKwkJCisJCS8vIHZlcmlmeSB2YWx1ZSBvZiBpc09uZXdheQorCQlhc3NlcnRFcXVhbHMoZGlyZWN0aW9uQXR0ciwgZGlyZWN0aW9uKTsKKwkJCisJCS8vIHZlcmlmeSB2YWx1ZSBvZiBpc09uZXdheQorCQlpZiAoIGlzUmVzdWx0TWVzc2FnZSApCisJCXsKKwkJCWFzc2VydEVxdWFscyh0aW1lb3V0QXR0ciwgdGltZW91dCk7CisJCQlhc3NlcnRFcXVhbHMocmVzdWx0QXR0ciwgcmVzdWx0KTsKKwkJfQorCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KG1ldGhvZE5vZGUpOworCQkKKwkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CQorCQkJU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBjaGlsZC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKKwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisJCQkKKwkJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBjaGlsZHJlbiBvbiBkZXNjcmlwdGlvbgorCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrQXV0aG9yaXplKE5vZGUgbWV0aG9kTm9kZSwgU3RyaW5nIGF1dGhvcml6ZU1ldGhvZE5hbWUpCisJeworCQlOb2RlIGNoaWxkID0gZ2V0QXV0aG9yaXplRWxlbWVudChtZXRob2ROb2RlKTsKKwkJCisJCWlmKGF1dGhvcml6ZU1ldGhvZE5hbWUgPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0TnVsbChjaGlsZCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKGNoaWxkLCBuZXcgU3RyaW5nW10geyJtZXRob2ROYW1lIn0pKTsKKworCQkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShjaGlsZCwgbmV3IFN0cmluZ1tdIHt9KSk7CisJCQorCQkJU3RyaW5nIGF1dGhvcml6ZUF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJtZXRob2ROYW1lIikuZ2V0Tm9kZVZhbHVlKCk7CisJCQkKKwkJCWFzc2VydEVxdWFscyhhdXRob3JpemVBdHRyLCBhdXRob3JpemVNZXRob2ROYW1lKTsKKwkJCQorCQkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IGNoaWxkcmVuIG9uIGRlc2NyaXB0aW9uCisJCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQoY2hpbGQpLCAwKTsKKwkJfQorCX0KKwkKKy8vCXByaXZhdGUgdm9pZCBjaGVja0V4Y2VwdGlvbihOb2RlIG1ldGhvZE5vZGUsIFN0cmluZyBleGNlcHRpb25OYW1lLCBTdHJpbmcgZXhjZXB0aW9uVHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQorLy8JeworLy8JCU5vZGUgZXhjZXB0aW9uTm9kZSA9IG51bGw7CisvLwkJCisvLwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBtZXRob2ROb2RlLmdldENoaWxkTm9kZXMoKTsKKy8vCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKy8vCQl7CisvLwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCkgPT0gImV4Y2VwdGlvbiIpCisvLwkJCXsKKy8vCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworLy8JCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gdGhpc05vZGUuZ2V0QXR0cmlidXRlcygpOworLy8JCQkJTm9kZSB2YWx1ZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oIm5hbWUiKTsKKy8vCQkJCVN0cmluZyB0aGlzVmFsdWUgPSB2YWx1ZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisvLwkJCQlpZih0aGlzVmFsdWUuY29tcGFyZVRvKGV4Y2VwdGlvbk5hbWUpID09IDApCisvLwkJCQl7CisvLwkJCQkJZXhjZXB0aW9uTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisvLwkJCQkJYnJlYWs7CisvLwkJCQl9CisvLwkJCX0KKy8vCQl9CisvLwkJCisvLwkJYXNzZXJ0RXF1YWxzKCBleGNlcHRpb25Ob2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKSwgZXhjZXB0aW9uVHlwZSApOworLy8JCQorLy8JCS8vIHZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBub2RlIGV4aXN0cworLy8JCWFzc2VydE5vdE51bGwoZXhjZXB0aW9uTm9kZSk7CisvLwkJCisvLwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisvLwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUoZXhjZXB0aW9uTm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsInR5cGUifSkpOworLy8KKy8vCQkKKy8vCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGNoaWxkIG5vZGVzIGV4aXN0CisvLwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShleGNlcHRpb25Ob2RlLCBuZXcgU3RyaW5nW10geyJkZXNjcmlwdGlvbiJ9KSk7CisvLwkKKy8vCQlOb2RlIGNoaWxkID0gZ2V0RGVzY3JpcHRpb25FbGVtZW50KGV4Y2VwdGlvbk5vZGUpOworLy8JCQorLy8JCWlmKGRlc2NyaXB0aW9uID09IG51bGwpCisvLwkJeworLy8JCQlhc3NlcnROdWxsKGNoaWxkKTsKKy8vCQl9CisvLwkJZWxzZQorLy8JCXsJCisvLwkJCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlID0gY2hpbGQuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CisvLwkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvbik7CisvLwkJCQorLy8JCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKy8vCQkJYXNzZXJ0RXF1YWxzKGdldENoaWxkRWxlbWVudENvdW50KGNoaWxkKSwgMCk7CisvLwkJfQorLy8JCQorLy8JfQorCQorCXByaXZhdGUgdm9pZCBjaGVja1Jlc3VsdChOb2RlIG1ldGhvZE5vZGUsIFN0cmluZyBmaWVsZElkLCBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGlzUHJpbWl0aXZlVHlwZSwKKwkJU3RyaW5nIGlzQXJyYXksIFN0cmluZyBkaW1lbnNpb24sIFN0cmluZyBkZXNjcmlwdGlvbikKKwl7CisJCU5vZGUgcmVzdWx0Tm9kZSA9IGdldFJlc3VsdEVsZW1lbnQobWV0aG9kTm9kZSk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyB1bmtub3duIGF0dHIgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5QXR0cnNPZk5hbWUocmVzdWx0Tm9kZSwgbmV3IFN0cmluZ1tdIHsiZmllbGRJZCIsICJmaWVsZE5hbWUiLCAidHlwZSIsICJpc1ByaW1pdGl2ZVR5cGUiLCAiaXNBcnJheSIsICJkaW1lbnNpb24ifSkpOworCisJCS8vIHZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBub2RlIGV4aXN0cworCQlhc3NlcnROb3ROdWxsKHJlc3VsdE5vZGUpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBjaGlsZCBub2RlcyBleGlzdAorCQlhc3NlcnRUcnVlKG9ubHlDaGlsZE5vZGVzT2ZOYW1lKHJlc3VsdE5vZGUsIG5ldyBTdHJpbmdbXSB7ImRlc2NyaXB0aW9uIn0pKTsKKwkKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gcmVzdWx0Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgc3R1ZmYgaGFzIHNudWNrIGludG8gdGhlIFhNTCBiaW5kaW5nCisJCQorCQkvLyB0aGlzIGlzIHNwZWNpYWwgY2FzZSBvZiBhIG9uZXdheSBtZXNzYWdlLCBzbyB3ZSBzaG91bGQgb25seSBoYXZlICd0eXBlPXZvaWQnIGFuZCAnaXNBcnJheT10cnVlJyBzcGVjaWZpZWQuCisJCVN0cmluZyBmaWVsZElkQXR0ciA9IG51bGw7CisJCVN0cmluZyBmaWVsZE5hbWVBdHRyID0gbnVsbDsKKwkJCisJCWlmKGZpZWxkSWQgPT0gbnVsbCkKKwkJeworCQkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAzKTsKKwkJCQorCQl9CisJCWVsc2UgLy8gZGltZW5zaW9uIGF0dHIgaXMgbnVsbGFibGUsIG1lYW5pbmcgaXQgbWlnaHQganVzdCBub3QgYmUgdGhlcmUgaWYgaXNBcnJheSA9ICJmYWxzZSIKKwkJeworCQkJZmllbGRJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJCWZpZWxkTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQkJCisJCQlhc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIGlzQXJyYXkgPT0gImZhbHNlIiA/IDUgOiA2KTsKKwkJfQorCQkKKwkJU3RyaW5nIHR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJ0eXBlIikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc0FycmF5QXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgiaXNBcnJheSIpLmdldE5vZGVWYWx1ZSgpOworCisJCU5vZGUgZGltZW5zaW9uTm9kZSA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZGltZW5zaW9uIik7CisJCVN0cmluZyBkaW1lbnNpb25BdHRyID0gZGltZW5zaW9uTm9kZSA9PSBudWxsID8gZGltZW5zaW9uIDogZGltZW5zaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmaWVsZElkQXR0ciwgZmllbGRJZCk7CisJCWFzc2VydEVxdWFscyhmaWVsZE5hbWVBdHRyLCBmaWVsZE5hbWUpOworCQlhc3NlcnRFcXVhbHModHlwZUF0dHIsIHR5cGUpOworCQlhc3NlcnRFcXVhbHMoaXNBcnJheUF0dHIsIGlzQXJyYXkpOworCQlhc3NlcnRFcXVhbHMoZGltZW5zaW9uQXR0ciwgZGltZW5zaW9uKTsKKwkJCisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQocmVzdWx0Tm9kZSk7CisJCQorCQlpZihkZXNjcmlwdGlvbiA9PSBudWxsKQorCQl7CisJCQlhc3NlcnROdWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsJCisJCQlTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IGNoaWxkLmdldFRleHRDb250ZW50KCkudHJpbSgpOworCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uVmFsdWUsIGRlc2NyaXB0aW9uKTsKKwkJCQorCQkJLy8gdmVyaWZ5IHRoYXQgbm8gbmV3IGNoaWxkcmVuIG9uIGRlc2NyaXB0aW9uCisJCQlhc3NlcnRFcXVhbHMoZ2V0Q2hpbGRFbGVtZW50Q291bnQoY2hpbGQpLCAwKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RGaWVsZFByb3BlcnRpZXMoTm9kZSBtZXRob2ROb2RlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGZpZWxkSWQsIFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlLCAKKwkJCVN0cmluZyBpc1ByaW1pdGl2ZVR5cGUsIFN0cmluZyBpc0FycmF5LCBTdHJpbmcgZGltZW5zaW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pCisJeworCQlOb2RlIGZpZWxkTm9kZSA9IG51bGw7CisJCQorCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG1ldGhvZE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkJaWYoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSA9PSAiZmllbGQiKQorCQkJeworCQkJCU5vZGUgdGhpc05vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRoaXNOb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlOb2RlIHZhbHVlQXR0ciA9IGF0dHJzLmdldE5hbWVkSXRlbSgibmFtZSIpOworCQkJCVN0cmluZyB0aGlzVmFsdWUgPSB2YWx1ZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisJCQkJaWYodGhpc1ZhbHVlLmNvbXBhcmVUbyhuYW1lKSA9PSAwKQorCQkJCXsKKwkJCQkJZmllbGROb2RlID0gY2hpbGRyZW4uaXRlbShpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdmFsdWUgbm9kZSBleGlzdHMKKwkJYXNzZXJ0Tm90TnVsbChmaWVsZE5vZGUpOworCQkKKwkJLy8gdmVyaWZ5IHRoYXQgbm8gdW5rbm93biBhdHRyIGV4aXN0CisJCWFzc2VydFRydWUob25seUF0dHJzT2ZOYW1lKGZpZWxkTm9kZSwgbmV3IFN0cmluZ1tdIHsibmFtZSIsICJmaWVsZElkIiwgImZpZWxkTmFtZSIsICJ0eXBlIiwgCisJCQkJImlzUHJpbWl0aXZlVHlwZSIsICJpc0FycmF5IiwgImRpbWVuc2lvbiIgfSkpOworCisJCS8vIHZlcmlmeSB0aGF0IG5vIHVua25vd24gY2hpbGQgbm9kZXMgZXhpc3QKKwkJYXNzZXJ0VHJ1ZShvbmx5Q2hpbGROb2Rlc09mTmFtZShmaWVsZE5vZGUsIG5ldyBTdHJpbmdbXSB7ImRlc2NyaXB0aW9uIn0pKTsKKwkKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gZmllbGROb2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCisJCS8vIHZlcmlmeSB0aGF0IG5vIG5ldyBzdHVmZiBoYXMgc251Y2sgaW50byB0aGUgWE1MIGJpbmRpbmcKKwkJLy8gZGltZW5zaW9uIGF0dHIgaXMgbnVsbGFibGUsIG1lYW5pbmcgaXQgbWlnaHQganVzdCBub3QgYmUgdGhlcmUgaWYgaXNBcnJheSA9ICJmYWxzZSIKKwkJYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCBpc0FycmF5ID09ICJmYWxzZSIgPyA2IDogNyk7CisJCQorCQlTdHJpbmcgZmllbGRJZEF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkSWQiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGZpZWxkTmFtZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oImZpZWxkTmFtZSIpLmdldE5vZGVWYWx1ZSgpOworCQlTdHJpbmcgdHlwZUF0dHIgPSBhdHRycy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJU3RyaW5nIGlzQXJyYXlBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc0FycmF5IikuZ2V0Tm9kZVZhbHVlKCk7CisJCVN0cmluZyBpc1ByaW1pdGl2ZVR5cGVBdHRyID0gYXR0cnMuZ2V0TmFtZWRJdGVtKCJpc1ByaW1pdGl2ZVR5cGUiKS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCU5vZGUgZGltZW5zaW9uTm9kZSA9IGF0dHJzLmdldE5hbWVkSXRlbSgiZGltZW5zaW9uIik7CisJCVN0cmluZyBkaW1lbnNpb25BdHRyID0gZGltZW5zaW9uTm9kZSA9PSBudWxsID8gZGltZW5zaW9uIDogZGltZW5zaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmaWVsZElkQXR0ciwgZmllbGRJZCk7CisJCWFzc2VydEVxdWFscyhmaWVsZE5hbWVBdHRyLCBmaWVsZE5hbWUpOworCQlhc3NlcnRFcXVhbHModHlwZUF0dHIsIHR5cGUpOworCQlhc3NlcnRFcXVhbHMoaXNBcnJheUF0dHIsIGlzQXJyYXkpOworCQlhc3NlcnRFcXVhbHMoZGltZW5zaW9uQXR0ciwgZGltZW5zaW9uKTsKKwkJYXNzZXJ0RXF1YWxzKCBpc1ByaW1pdGl2ZVR5cGUsIGlzUHJpbWl0aXZlVHlwZUF0dHIgKTsKKwkJCisJCU5vZGUgY2hpbGQgPSBnZXREZXNjcmlwdGlvbkVsZW1lbnQoZmllbGROb2RlKTsKKwkJCisJCWlmKGRlc2NyaXB0aW9uID09IG51bGwpCisJCXsKKwkJCWFzc2VydE51bGwoY2hpbGQpOworCQl9CisJCWVsc2UKKwkJewkKKwkJCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlID0gY2hpbGQuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CisJCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25WYWx1ZSwgZGVzY3JpcHRpb24pOworCQkJCisJCQkvLyB2ZXJpZnkgdGhhdCBubyBuZXcgY2hpbGRyZW4gb24gZGVzY3JpcHRpb24KKwkJCWFzc2VydEVxdWFscyhnZXRDaGlsZEVsZW1lbnRDb3VudChjaGlsZCksIDApOworCQl9CisJfQorCQorCXByaXZhdGUgTm9kZSBnZXREZXNjcmlwdGlvbkVsZW1lbnQoTm9kZSBub2RlKQorCXsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCXNob3J0IG5vZGVUeXBlID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpOworCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpOworCQkJaWYobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZU5hbWUgPT0gImRlc2NyaXB0aW9uIikKKwkJCXsKKwkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlbShpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBOb2RlIGdldEF1dGhvcml6ZUVsZW1lbnQoTm9kZSBub2RlKQorCXsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCXNob3J0IG5vZGVUeXBlID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpOworCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpOworCQkJaWYobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZU5hbWUgPT0gImF1dGhvcml6ZSIpCisJCQl7CisJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZW0oaSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgTm9kZSBnZXRSZXN1bHRFbGVtZW50KE5vZGUgbm9kZSkKKwl7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQorCQl7CisJCQlzaG9ydCBub2RlVHlwZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKTsKKwkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKKwkJCWlmKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG5vZGVOYW1lID09ICJyZXN1bHQiKQorCQkJeworCQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKGkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIGludCBnZXRDaGlsZEVsZW1lbnRDb3VudChOb2RlIG5vZGUpCisJeworCQlpbnQgY291bnQgPSAwOworCQkKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKKwkJCXsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gY291bnQ7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldFR5cGVOYW1lKGludCBldGNoR3JhbW1hckNvbnN0YW50c0xvb2t1cCkKKwl7CisJCXN3aXRjaCAoZXRjaEdyYW1tYXJDb25zdGFudHNMb29rdXApCisJCXsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuVk9JRDogcmV0dXJuICJ2b2lkIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQk9PTEVBTjogcmV0dXJuICJib29sZWFuIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuQllURTogcmV0dXJuICJieXRlIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuU0hPUlQ6IHJldHVybiAic2hvcnQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5JTlQ6IHJldHVybiAiaW50IjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuTE9ORzogcmV0dXJuICJsb25nIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuRkxPQVQ6IHJldHVybiAiZmxvYXQiOworCQkJY2FzZSBFdGNoR3JhbW1hckNvbnN0YW50cy5ET1VCTEU6IHJldHVybiAiZG91YmxlIjsKKwkJCWNhc2UgRXRjaEdyYW1tYXJDb25zdGFudHMuU1RSSU5HOiByZXR1cm4gInN0cmluZyI7CisJCQlkZWZhdWx0OiByZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gb25seUNoaWxkTm9kZXNPZk5hbWUoTm9kZSBub2RlLCBTdHJpbmdbXSBlbGVtZW50TmFtZXNUb0NoZWNrKQorCXsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJCisJCWJvb2xlYW4gaGFzVmFsaWRDaGlsZHJlbiA9IHRydWU7CisJCQorCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKKwkJeworCQkKKwkJCWlmKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKKwkJCXsKKwkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCk7CisJCQkJCisJCQkJYm9vbGVhbiBtYXRjaGVzID0gZmFsc2U7CisJCQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IGVsZW1lbnROYW1lc1RvQ2hlY2spCisJCQkJeworCQkJCQlpZigwID09IGVsZW1lbnROYW1lLmNvbXBhcmVUbyhlbGVtZW50KSApCisJCQkJCXsKKwkJCQkJCW1hdGNoZXMgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJaWYobWF0Y2hlcyA9PSBmYWxzZSkKKwkJCQl7CisJCQkJCWhhc1ZhbGlkQ2hpbGRyZW4gPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQkKKwkJfQorCQkKKwkJcmV0dXJuIGhhc1ZhbGlkQ2hpbGRyZW47CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBvbmx5QXR0cnNPZk5hbWUoTm9kZSBub2RlLCBTdHJpbmdbXSBhdHRyTmFtZXNUb0NoZWNrKQorCXsKKwkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCQorCQlib29sZWFuIGhhc1ZhbGlkQXR0cnMgPSB0cnVlOworCQkKKwkJZm9yKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspCisJCXsKKwkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJzLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKKwkJCQorCQkJYm9vbGVhbiBtYXRjaGVzID0gZmFsc2U7CisJCQlmb3IgKFN0cmluZyBlbGVtZW50IDogYXR0ck5hbWVzVG9DaGVjaykKKwkJCXsKKwkJCQlpZigwID09IGF0dHJOYW1lLmNvbXBhcmVUbyhlbGVtZW50KSApCisJCQkJeworCQkJCQltYXRjaGVzID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZihtYXRjaGVzID09IGZhbHNlKQorCQkJeworCQkJCWhhc1ZhbGlkQXR0cnMgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQl9CisJCQorCQlyZXR1cm4gaGFzVmFsaWRBdHRyczsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL2J1aWxkLnhtbCBiL3V0aWwvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTdmNzEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL2J1aWxkLnhtbApAQCAtMCwwICsxLDI3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImV0Y2gtdXRpbCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+CisgICAgPGRlc2NyaXB0aW9uPkNvbW1vbiB1dGlsaXRpZXMgZm9yIGNvbXBpbGVyIGltcGxlbWVudGF0aW9ucyBhbmQgamF2YSBiaW5kaW5nPC9kZXNjcmlwdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iRXRjaC5iYXNlZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgICA8aW1wb3J0IGZpbGU9IiR7RXRjaC5iYXNlZGlyfS9idWlsZC1zdXBwb3J0L2V0Y2guaW5jbHVkZXMueG1sIiAvPgorCisgICAgPCEtLSBTdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgc3ViLXByb2plY3QgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InByb2oiICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtFdGNoLmJhc2VkaXJ9L3V0aWwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtwcm9qfS90YXJnZXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtwcm9qfS9zcmMiIC8+ICAgICAgICAKKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkU3JjIiAgICAgICAgIGxvY2F0aW9uPSIke3RhcmdldH0vZ2VuZXJhdGVkLXNvdXJjZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNEaXJlY3RvcnkiICAgICBsb2NhdGlvbj0iJHt0YXJnZXR9L2NsYXNzZXMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlc291cmNlc0RpcmVjdG9yeSIgICBsb2NhdGlvbj0iJHt0YXJnZXR9L3Jlc291cmNlcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdFJlc3VsdHNEaXJlY3RvcnkiIGxvY2F0aW9uPSIke3RhcmdldH0vdGVzdC1yZXN1bHRzIiAvPgorCisgICAgPCEtLSBNQUNSTzogaW5pdC10YXJnZXQgLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImluaXQtdGFyZ2V0IiA+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iICAgZmFpbG9uZXJyb3I9ImZhbHNlIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDxkZWxldGUgZGlyPSIke3Jlc291cmNlc0RpcmVjdG9yeX0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtyZXNvdXJjZXNEaXJlY3Rvcnl9IiAvPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDwhLS0gTUFDUk86IGNvbXBpbGUtc291cmNlcyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iY29tcGlsZS1zb3VyY2VzIiA+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8amF2YWMgIGRlYnVnPSIke0V0Y2guamF2YWMuZGVidWd9IgorICAgICAgICAgICAgCQl0YXJnZXQ9IjEuNSIKKyAgICAgICAgICAgICAgICAgICAgb3B0aW1pemU9IiR7RXRjaC5qYXZhYy5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgPgorICAgICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9L21haW4vamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uc3ZuLyoqIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IkV0Y2guZGVwZW5kZW5jaWVzLmphci5wYXRocyIgLz4KKyAgICAgICAgICAgIDwvamF2YWM+CisKKyAgICAgICAgICAgIDxqYXZhYyAgZGVidWc9IiR7RXRjaC5qYXZhYy5kZWJ1Z30iCisgICAgICAgICAgICAJCXRhcmdldD0iMS41IgorICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtFdGNoLmphdmFjLm9wdGltaXplfSIKKyAgICAgICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS90ZXN0IiA+CisgICAgICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30vdGVzdC9qYXZhIiAvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5zdm4vKioiIC8+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iRXRjaC5kZXBlbmRlbmNpZXMuamFyLnBhdGhzIiAvPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIiAvPgorICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPC9qYXZhYz4KKworICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICAKKyAgICA8IS0tIE1BQ1JPOiBidW5kbGUtamFycyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0iYnVuZGxlLWphcnMiID4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXN0IiBkZWZhdWx0PSIke0V0Y2guc3VwcG9ydH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtkaXN0fS9saWIiIC8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gQ1JFQVRFIGphcnMgLS0+CisKKyAgICAgICAgICAgIDwhLS0gUGFja2FnZSB1cCBldGNoLXV0aWwgamFyIC0tPgorICAgICAgICAgICAgPGphciBqYXJmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtdXRpbC5qYXJ9IiA+CisgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNvcHlyaWdodCIgICAgdmFsdWU9IiR7RXRjaC5jb3B5cmlnaHROb3RpY2V9IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlZlcnNpb24iICAgICAgdmFsdWU9IiR7RXRjaC52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJMb25nVmVyc2lvbiIgIHZhbHVlPSIke0V0Y2gubG9uZ3ZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWxkLVRhZyIgICAgdmFsdWU9IiR7RXRjaC5idWlsZFRhZ30iIC8+CisgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU1ZOLVJldmlzaW9uIiB2YWx1ZT0iJHtFdGNoLnJ1bnRpbWUucmV2aXNpb25OdW1iZXJ9IiAvPgorICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPG1ldGFpbmYgZGlyPSIke0V0Y2guYmFzZWRpcn0iID4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+CisgICAgICAgICAgICAgICAgPC9tZXRhaW5mPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzRGlyZWN0b3J5fS9tYWluIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9ldGNoL3V0aWwvKioiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC9qYXI+CisKKyAgICAgICAgICAgIDwhLS0gcGxhY2Vob2xkZXIgLS0+CisgICAgICAgICAgICA8amFyIGphcmZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1jb21waWxlci5qYXJ9IiB1cGRhdGU9InRydWUiIGZpbGVzZXRtYW5pZmVzdD0ibWVyZ2UiPgorICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJWZXJzaW9uIiB2YWx1ZT0iJHtFdGNoLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4gICAKKyAgICAgICAgICAgIDwvamFyPgorICAgICAgICAgICAgPGphciBqYXJmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLmphcn0iIHVwZGF0ZT0idHJ1ZSIgZmlsZXNldG1hbmlmZXN0PSJtZXJnZSI+CisgICAgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlZlcnNpb24iIHZhbHVlPSIke0V0Y2gudmVyc2lvbn0iIC8+CisgICAgICAgICAgICAgICA8L21hbmlmZXN0PiAgIAorICAgICAgICAgICAgPC9qYXI+CisKKyAgICAgICAgICAgIDwhLS0gQ1JFQVRFIHNvdXJjZSBhcmNoaXZlcyAtLT4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPCEtLSBwYWNrYWdlIHVwIGV0Y2gtdXRpbCBzcmMgLS0+CisgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtdXRpbC1zcmMuemlwfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9L21haW4vamF2YSIgPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2V0Y2gvdXRpbC8qKi8qLmphdmEiIC8+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3Rlc3QvKioiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPC96aXA+CisKKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fS9lbXB0eS1kaXIiIC8+CisgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtY29tcGlsZXItc3JjLnppcH0iIHVwZGF0ZT0idHJ1ZSIgd2hlbmVtcHR5PSJjcmVhdGUiIGJhc2VkaXI9IiR7dGFyZ2V0fS9lbXB0eS1kaXIiIC8+CisgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJAe2Rpc3R9L2xpYi8ke2V0Y2gtamF2YS1ydW50aW1lLXNyYy56aXB9IiB1cGRhdGU9InRydWUiIHdoZW5lbXB0eT0iY3JlYXRlIiBiYXNlZGlyPSIke3RhcmdldH0vZW1wdHktZGlyIiAvPgorICAgICAgICAgICAgCisKKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8IS0tIE1BQ1JPOiB1cGRhdGUtamFycyAtLT4KKyAgICA8bWFjcm9kZWYgbmFtZT0idXBkYXRlLWphcnMiID4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXN0IiBkZWZhdWx0PSIke0V0Y2guZGlzdH0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcG9ydCIgZGVmYXVsdD0iJHtFdGNoLnN1cHBvcnR9IiAvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDwhLS0gcmVwYWNrYWdlIC5qYXIgLS0+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSJAe2Rpc3R9L2xpYiIgLz4KKyAgICAgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0vdG1wLWNvbXBpbGVyIiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fS90bXAtY29tcGlsZXIiIC8+CisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9L3RtcC1ydW50aW1lIiAgcXVpZXQ9InRydWUiIC8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3RhcmdldH0vdG1wLXJ1bnRpbWUiIC8+CisKKyAgICAgICAgICAgIDx1bmphciBzcmM9IkB7c3VwcG9ydH0vbGliLyR7ZXRjaC11dGlsLmphcn0iICAgICBkZXN0PSIke3RhcmdldH0vdG1wLWNvbXBpbGVyIiAvPgorICAgICAgICAgICAgPHVuamFyIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLWNvbXBpbGVyLmphcn0iIGRlc3Q9IiR7dGFyZ2V0fS90bXAtY29tcGlsZXIiIC8+CisgICAgICAgICAgICA8dW5qYXIgc3JjPSJAe3N1cHBvcnR9L2xpYi8ke2V0Y2gtdXRpbC5qYXJ9IiAgICAgZGVzdD0iJHt0YXJnZXR9L3RtcC1ydW50aW1lIiAvPgorICAgICAgICAgICAgPHVuamFyIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLWphdmEtcnVudGltZS5qYXJ9IiBkZXN0PSIke3RhcmdldH0vdG1wLXJ1bnRpbWUiIC8+CisKKyAgICAgICAgICAgIDxqYXIgamFyZmlsZT0iQHtkaXN0fS9saWIvJHtldGNoLWNvbXBpbGVyLmphcn0iIHVwZGF0ZT0idHJ1ZSIgZmlsZXNldG1hbmlmZXN0PSJtZXJnZSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0YXJnZXR9L3RtcC1jb21waWxlciIgIC8+CisgICAgICAgICAgICA8L2phcj4gICAgCisgICAgICAgICAgICA8amFyIGphcmZpbGU9IkB7ZGlzdH0vbGliLyR7ZXRjaC1qYXZhLXJ1bnRpbWUuamFyfSIgdXBkYXRlPSJ0cnVlIiBmaWxlc2V0bWFuaWZlc3Q9Im1lcmdlIiA+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RhcmdldH0vdG1wLXJ1bnRpbWUiICAvPgorICAgICAgICAgICAgPC9qYXI+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gcmVwYWNrYWdlIC56aXAgc3JjIC0tPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iQHtkaXN0fS9saWIiIC8+CisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9L3RtcC1jb21waWxlci1zcmMiIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9L3RtcC1jb21waWxlci1zcmMiIC8+CisgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9L3RtcC1ydW50aW1lLXNyYyIgIHF1aWV0PSJ0cnVlIiAvPgorICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9L3RtcC1ydW50aW1lLXNyYyIgLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPHVuemlwIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLXV0aWwtc3JjLnppcH0iIGRlc3Q9IiR7dGFyZ2V0fS90bXAtY29tcGlsZXItc3JjIiAvPgorICAgICAgICAgICAgPHVuemlwIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLWNvbXBpbGVyLXNyYy56aXB9IiBkZXN0PSIke3RhcmdldH0vdG1wLWNvbXBpbGVyLXNyYyIgLz4KKyAgICAgICAgICAgIDx1bnppcCBzcmM9IkB7c3VwcG9ydH0vbGliLyR7ZXRjaC11dGlsLXNyYy56aXB9IiBkZXN0PSIke3RhcmdldH0vdG1wLXJ1bnRpbWUtc3JjIiAvPgorICAgICAgICAgICAgPHVuemlwIHNyYz0iQHtzdXBwb3J0fS9saWIvJHtldGNoLWphdmEtcnVudGltZS1zcmMuemlwfSIgZGVzdD0iJHt0YXJnZXR9L3RtcC1ydW50aW1lLXNyYyIgLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0iQHtkaXN0fS9saWIvJHtldGNoLWNvbXBpbGVyLXNyYy56aXB9IiA+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RhcmdldH0vdG1wLWNvbXBpbGVyLXNyYyIgLz4KKyAgICAgICAgICAgIDwvemlwPgorICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0iQHtkaXN0fS9saWIvJHtldGNoLWphdmEtcnVudGltZS1zcmMuemlwfSIgPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0YXJnZXR9L3RtcC1ydW50aW1lLXNyYyIgLz4KKyAgICAgICAgICAgIDwvemlwPgorICAgICAgICAgICAgCisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIAorICAgIDwhLS0gSU5JVCBUQVJHRVQgLS0+CisgICAgPCEtLSBNb2RpZnkgdGhpcyB0YXJnZXQgdG8gZGVmaW5lIHByb2plY3Qgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNhbiBvbmx5IGJlIHNldCBhdCBydW50aW1lIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8taW5pdCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iIGZhaWxvbmVycm9yPSJmYWxzZSIgcXVpZXQ9InRydWUiIC8+CisKKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2dlbmVyYXRlZFNyY30iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iIC8+CisgICAgICAgIDxta2RpciBkaXI9IiR7cmVzb3VyY2VzRGlyZWN0b3J5fSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0UmVzdWx0c0RpcmVjdG9yeX0iIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIENMRUFOIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLWNsZWFuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gQlVJTEQgVEFSR0VUIC0tPgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtc291cmNlcyIgPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLWZvci1kaXN0IiA+CisgICAgICAgIDwhLS0gSW5pdGlhbGl6ZSB0YXJnZXQgZGlyZWN0b3JpZXMgLS0+CisgICAgICAgIDxpbml0LXRhcmdldCAvPgorCisgICAgICAgIDwhLS0gQ29tcGlsZSBTb3VyY2UgLS0+CisgICAgICAgIDxjb21waWxlLXNvdXJjZXMgLz4KKworICAgICAgICA8IS0tIEJ1bmRsZSBKYXJzIC0tPgorICAgICAgICA8YnVuZGxlLWphcnMgZGlzdD0iJHtFdGNoLnN1cHBvcnR9IiAvPgorCisgICAgICAgIDwhLS0gVXBkYXRlIEphcnMgLS0+CisgICAgICAgIDx1cGRhdGUtamFycyBkaXN0PSIke0V0Y2guZGlzdH0iIHN1cHBvcnQ9IiR7RXRjaC5zdXBwb3J0fSIgLz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtZm9yLWNsb3ZlciIgaWY9IkNsb3Zlci5lbmFibGVkIiA+CisKKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iUmVidWlsZGluZyB3aXRoIGNsb3ZlciIgLz4KKworICAgICAgICA8IS0tIGluaXRpYWxpemUtY2xvdmVyIC0tPgorICAgICAgICA8aW5pdGlhbGl6ZS1jbG92ZXIgc3VmZml4PSJldGNodXRpbCIgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vbWFpbi9qYXZhIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8dGVzdHNvdXJjZXMgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgICAgICAgICAgICA8L3Rlc3Rzb3VyY2VzPgorICAgICAgICA8L2luaXRpYWxpemUtY2xvdmVyPgorICAgICAgICAKKyAgICAgICAgPCEtLSBJbml0aWFsaXplIHRhcmdldCBkaXJlY3RvcmllcyAtLT4KKyAgICAgICAgPGluaXQtdGFyZ2V0IC8+CisgICAgICAgIAorICAgICAgICA8IS0tIENvbXBpbGUgU291cmNlIC0tPgorICAgICAgICA8Y29tcGlsZS1zb3VyY2VzIC8+CisgICAgICAgIAorICAgICAgICA8IS0tIEJ1bmRsZSBKYXJzIC0tPgorICAgICAgICA8YnVuZGxlLWphcnMgZGlzdD0iJHtFdGNoLmNsb3Zlci1zdXBwb3J0fSIgLz4KKworICAgICAgICA8IS0tIFVwZGF0ZSBKYXJzIC0tPgorICAgICAgICA8dXBkYXRlLWphcnMgZGlzdD0iJHtFdGNoLmNsb3Zlci1kaXN0fSIgc3VwcG9ydD0iJHtFdGNoLmNsb3Zlci1zdXBwb3J0fSIgLz4KKworICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iZG8tYnVpbGQiIGRlcGVuZHM9ImdlbmVyYXRlLXNvdXJjZXMsY29tcGlsZS1mb3ItZGlzdCxjb21waWxlLWZvci1jbG92ZXIiIC8+CisKKyAgICA8IS0tIFRFU1QgVEFSR0VUIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZG8tdGVzdCI+CisgICAgICAgIAorICAgICAgICA8IS0tIFJ1biBVbml0IFRlc3RzIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIiBkaXI9IiR7Y2xhc3Nlc0RpcmVjdG9yeX0iCisgICAgICAgICAgICBlcnJvclByb3BlcnR5PSJidWlsZC50ZXN0cy5mYWlsIiBmYWlsdXJlUHJvcGVydHk9ImJ1aWxkLnRlc3RzLmZhaWwiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vbWFpbiIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlc0RpcmVjdG9yeX0vdGVzdCIgLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5Lmp1bml0Lmphcn0iLz4KKyAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlbW92ZSBpZiBjbG92ZXIgbm90IGF2YWlsYWJsZSAtLT4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7RXRjaC5kZXBlbmRlbmN5LmNsb3Zlci5qYXJ9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InRydWUiIHRvZGlyPSIke3Rlc3RSZXN1bHRzRGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vdGVzdC9qYXZhIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9QZXJmQmFzaWNzLmphdmEiIC8+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3Rlc3RYbWxQYXJzZXIuamF2YSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovdGVzdEpheHAuamF2YSIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8L2JhdGNodGVzdD4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gUE9TVEJVSUxEIFRBUkdFVCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXBvc3RidWlsZCI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRvLXB1Ymxpc2giIGlmPSJidWlsZC50ZXN0cy5mYWlsIj4KKyAgICAgICAgPCEtLSBTZXQgZmxhZyBmaWxlIGlmIGFueSB0ZXN0cyBmYWlsZWQgLS0+CisgICAgICAgIDx0b3VjaCBmaWxlPSIke0V0Y2gucnVudGltZS50ZXN0cy5mYWlsfSIvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQWJzdHJhY3RTdGFydGFibGUuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9BYnN0cmFjdFN0YXJ0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWM4NGIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQWJzdHJhY3RTdGFydGFibGUuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKKy8qKgorICogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBTdGFydGFibGUuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFN0YXJ0YWJsZSBpbXBsZW1lbnRzIFN0YXJ0YWJsZQoreworCWZpbmFsIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3luY2hyb25pemVkICh0aGlzKQorCQl7CisJCQlpZiAoaXNTdGFydGVkKCkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggImlzIGFscmVhZHkgc3RhcnRlZCIgKTsKKworCQkJc3RhcnRlZCA9IHRydWU7CisJCX0KKwkJCisJCXRyeQorCQl7CisJCQlzdGFydDAoKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJc3RvcCgpOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKworCWZpbmFsIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzeW5jaHJvbml6ZWQgKHRoaXMpCisJCXsKKwkJCWNoZWNrSXNTdGFydGVkKCk7CisJCQlzZXRTdG9wcGVkKCk7CisJCX0KKwkJc3RvcDAoKTsKKwl9CisJCisJLyoqCisJICogU2lnbmFscyAoZnJvbSBhIHN1YmNsYXNzZXIpIHRoYXQgdGhlIHN0YXJ0YWJsZSBoYXMgc3RvcHBlZC4KKwkgKi8KKwlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBzZXRTdG9wcGVkKCkKKwl7CisJCXN0YXJ0ZWQgPSBmYWxzZTsKKwl9CisJCisJZmluYWwgcHVibGljIGJvb2xlYW4gaXNTdGFydGVkKCkKKwl7CisJCXJldHVybiBzdGFydGVkOworCX0KKwkKKwlmaW5hbCBwdWJsaWMgdm9pZCBjaGVja0lzU3RhcnRlZCgpCisJeworCQlpZiAoIWlzU3RhcnRlZCgpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggImlzIG5vdCBzdGFydGVkIiApOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBzdGFydGVkOworCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgc3RhcnQwKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHN0b3AwKCkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9BbGFybUxpc3RlbmVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQWxhcm1MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDA1OTAKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQWxhcm1MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworLyoqCisgKiBDbGFzc2VzIHdhbnRpbmcgYWxhcm1zIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIHJlY2VpdmUgdGhlCisgKiBhbGFybS4KKyAqIAorICogQHNlZSBBbGFybU1hbmFnZXIKKyAqLworcHVibGljIGludGVyZmFjZSBBbGFybUxpc3RlbmVyCit7CisJLyoqCisJICogUmVwb3J0cyB0aGF0IHRoZSBsaXN0ZW5lcidzIGFsYXJtIHdlbnQgb2ZmLgorCSAqIAorCSAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBtYW5hZ2VyIG9mIHRoZSBhbGFybS4KKwkgKiAKKwkgKiBAcGFyYW0gc3RhdGUgYSBiaXQgb2Ygc3RhdGUgZm9yIHRoZSBsaXN0ZW5lci4KKwkgKiAKKwkgKiBAcGFyYW0gZHVlIHRoZSB0aW1lIHRoZSBhbGFybSB3YXMgc2V0IHRvIGdvIG9mZi4gVGhpcyBpcyBpbiB0aGUKKwkgKiB0aW1lIGNvb3JkaW5hdGVzIGFzIHJldHVybmVkIGJ5IFRpbWVyLmdldE5hbm9zKCkuCisJICogCisJICogQHJldHVybiB0aGUgcG9zaXRpdmUgb3IgbmVnYXRpdmUgc25vb3plIHRpbWUgaW4gbXMgZm9yIHRoaXMgYWxhcm0sCisJICogb3IgMCB0byBzaHV0b2ZmIHRoZSBhbGFybS4gSWYgYSBwb3NpdGl2ZSBudW1iZXIgaXMgcmV0dXJuZWQsIGl0IGlzCisJICogYWRkZWQgdG8gdGhlIGN1cnJlbnQgZHVlIHRpbWUgb2YgdGhlIGFsYXJtIHRvIGNhbGN1bGF0ZSB0aGUgbmV3CisJICogZHVlIHRpbWUgZm9yIHRoZSBhbGFybS4gVGh1cyB0aGVyZSBzaG91bGQgYmUgdmVyeSBsaXR0bGUgZHJpZnQKKwkgKiBpbiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBhbGFybXMgKGFsdGhvdWdoIHRoZXJlIGlzIHNvbWUgYmVjYXVzZQorCSAqIG9mIHN5c3RlbSBjbG9jayBqaXR0ZXIpLgorCSAqIAorCSAqIElmIHRoZSBzeXN0ZW0gaXMgdmVyeSBidXN5LCBvciBpZiB0aGUgbGlzdGVuZXJzIGFyZSB0cnlpbmcgdG8KKwkgKiBkbyB0b28gbXVjaCwgYWxhcm1zIG1heSBub3QgYmUgcHJvY2Vzc2VkIHF1aWNrbHkgZW5vdWdoIGFuZAorCSAqIGNhbGN1bGF0ZWQgbmV3IGR1ZSB0aW1lcyB3aWxsIGFscmVhZHkgYmUgaW4gdGhlIHBhc3QuIFRoaXMgaXMgYQorCSAqIHBhdGhvbG9naWNhbCBjb25kaXRpb24gd2hpY2ggd2lsbCBzcGlyYWwgb3V0IG9mIGNvbnRyb2wgaWYgbm90CisJICogZGV0ZWN0ZWQuCisJICogCisJICogSWYgYSBuZWdhdGl2ZSBudW1iZXIgaXMgcmV0dXJuZWQsIGl0IGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgY3VycmVudAorCSAqIHZhbHVlIG9mIFRpbWVyLmdldE5hbm9zKCkgdG8gY2FsY3VsYXRlIHRoZSBuZXcgZHVlIHRpbWUgZm9yIHRoZQorCSAqIGFsYXJtLiAoSW4gdGhpcyBjYXNlLCBzdWJ0cmFjdGluZyB0aGUgbmVnYXRpdmUgbnVtYmVyIGlzIHRoZSBzYW1lCisJICogYXMgYWRkaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4uLikKKwkgKiAKKwkgKiBAc2VlIFRpbWVyI2dldE5hbm9zKCkKKwkgKi8KKwlwdWJsaWMgaW50IHdha2V1cCggQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIE9iamVjdCBzdGF0ZSwgbG9uZyBkdWUgKTsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9BbGFybU1hbmFnZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9BbGFybU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzVlNmFmCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0FsYXJtTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNTcwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCisvKioKKyAqIFRoZSBhbGFybSBtYW5hZ2VyIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFsYXJtcy4KKyAqIAorICogQSBsaXN0ZW5lciBkZXNpcmluZyBhIHdha2V1cCBjYWxsIHNob3VsZCBhZGQgaXRzZWxmIHRvIHRoZSBtYW5hZ2VyCisgKiB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBUaGUgbGlzdGVuZXIgbWF5IGJlIHJlbW92ZWQKKyAqIGF0IGFueSB0aW1lLiBXaGVuIHRoZSBhbGFybSBnb2VzIG9mZiwgdGhlIGxpc3RlbmVyIG1heSByZXNldCBvciByZW1vdmUKKyAqIHRoZSBhbGFybS4KKyAqIAorICogQHNlZSAjYWRkKEFsYXJtTGlzdGVuZXIsIE9iamVjdCwgaW50KQorICogQHNlZSAjcmVtb3ZlKEFsYXJtTGlzdGVuZXIpCisgKi8KK3B1YmxpYyBjbGFzcyBBbGFybU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0YWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCit7CisJLyoqCisJICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiB0aG9zZSBnZXR0aW5nIHdha2V1cCBjYWxscy4KKwkgKiAKKwkgKiBOb3RlOiB1c2VzIHRoZSBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQgQWxhcm0uCisJICogCisJICogQHBhcmFtIGxpc3RlbmVyIHRoZSB0YXJnZXQgb2YgdGhlIHdha2V1cCBjYWxsLgorCSAqIAorCSAqIEBwYXJhbSBzdGF0ZSBhIGJpdCBvZiBzdGF0ZSBmb3IgdGhlIGxpc3RlbmVyLgorCSAqIAorCSAqIEBwYXJhbSBkZWxheSB0aGUgcG9zaXRpdmUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgd2FrZXVwIGNhbGwuCisJICogCisJICogQHNlZSAjYWRkKEFsYXJtTGlzdGVuZXIsIE9iamVjdCwgaW50KQorCSAqIEBzZWUgI2dldEFsYXJtTWFuYWdlcihib29sZWFuKQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGF0aWNBZGQoIEFsYXJtTGlzdGVuZXIgbGlzdGVuZXIsIE9iamVjdCBzdGF0ZSwgaW50IGRlbGF5ICkKKwl7CisJCWdldEFsYXJtTWFuYWdlciggdHJ1ZSApLmFkZCggbGlzdGVuZXIsIHN0YXRlLCBkZWxheSApOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgb2YgdGhvc2UgZ2V0dGluZyB3YWtldXAgY2FsbHMuCisJICogCisJICogTm90ZTogdXNlcyB0aGUgc3RhdGljYWxseSBjb25maWd1cmVkIEFsYXJtLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgdGFyZ2V0IG9mIHRoZSB3YWtldXAgY2FsbC4KKwkgKiAKKwkgKiBAc2VlICNyZW1vdmUoQWxhcm1MaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RhdGljUmVtb3ZlKCBBbGFybUxpc3RlbmVyIGxpc3RlbmVyICkKKwl7CisJCUFsYXJtTWFuYWdlciBhbSA9IGdldEFsYXJtTWFuYWdlciggZmFsc2UgKTsKKwkJaWYgKGFtICE9IG51bGwpCisJCQlhbS5yZW1vdmUoIGxpc3RlbmVyICk7CisJfQorCQorCS8qKgorCSAqIEdldHMgdGhlIHN0YXRpY2FsbHkgY29uZmlndXJlZCBhbGFybSBtYW5hZ2VyLCBjcmVhdGluZyBvbmUgaWYKKwkgKiBzcGVjaWZpZWQgYW5kIG5vbmUgZXhpc3RzLgorCSAqIEBwYXJhbSBzdGFydEl0IGlmIHRydWUsIHdlIHJlYWxseSBuZWVkIG9uZSBhbmQgaWYgdGhlcmUgaXNuJ3QKKwkgKiBvbmUgdGhlbiBvbmUgc2hvdWxkIGJlIHN0YXJ0ZWQsIG90aGVyd2lzZSBvbmUgc2hvdWxkIG5vdCBiZQorCSAqIHN0YXJ0ZWQuCisJICogQHJldHVybiB0aGUgc3RhdGljYWxseSBjb25maWd1cmVkIGFsYXJtIG1hbmFnZXIsIG9yIGEgbmV3bHkKKwkgKiBjcmVhdGVkIG9uZSBpZiB0aGVyZSBpcyBub25lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQWxhcm1NYW5hZ2VyIGdldEFsYXJtTWFuYWdlciggYm9vbGVhbiBzdGFydEl0ICkKKwl7CisJCWlmIChhbGFybU1hbmFnZXIgPT0gbnVsbCkKKwkJeworCQkJc3luY2hyb25pemVkIChhbGFybU1hbmFnZXJTeW5jKQorCQkJeworCQkJCWlmIChhbGFybU1hbmFnZXIgPT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmICghc3RhcnRJdCkKKwkJCQkJCXJldHVybiBudWxsOworCisJCQkJCUFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCWFtLnN0YXJ0KCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQl0aHJvdyBlOworCQkJCQl9CisJCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggImNhdWdodCBleGNlcHRpb24iLCBlICk7CisJCQkJCX0KKwkJCQkJYWxhcm1NYW5hZ2VyID0gYW07CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBhbGFybU1hbmFnZXI7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIHN0YXRpY2FsbHkgY29uZmlndXJlZCBhbGFybSBtYW5hZ2VyLCByZXR1cm5pbmcgdGhlIG9sZCBvbmUKKwkgKiBpZiBhbnkuIERvbid0IGZvcmdldCB0byBzdG9wIHRoZSBvbGQgb25lLgorCSAqIEBwYXJhbSBuZXdBbGFybU1hbmFnZXIgYSBuZXcgQWxhcm1NYW5hZ2VyIHRvIGJlIHN0YXRpY2FsbHkgYXZhaWxhYmxlLgorCSAqIEByZXR1cm4gdGhlIG9sZCBzdGF0aWNhbGx5IGF2YWlsYWJsZSBBbGFybU1hbmFnZXIuCisJICovCisJcHVibGljIHN0YXRpYyBBbGFybU1hbmFnZXIgc2V0QWxhcm1NYW5hZ2VyKCBBbGFybU1hbmFnZXIgbmV3QWxhcm1NYW5hZ2VyICkKKwl7CisJCXN5bmNocm9uaXplZCAoYWxhcm1NYW5hZ2VyU3luYykKKwkJeworCQkJQWxhcm1NYW5hZ2VyIG9sZEFsYXJtTWFuYWdlciA9IGFsYXJtTWFuYWdlcjsKKwkJCWFsYXJtTWFuYWdlciA9IG5ld0FsYXJtTWFuYWdlcjsKKwkJCXJldHVybiBvbGRBbGFybU1hbmFnZXI7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlcjsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgYWxhcm1NYW5hZ2VyU3luYyA9IG5ldyBPYmplY3QoKTsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBBbGFybU1hbmFnZXIuCisJICogQHBhcmFtIG5Xb3JrZXJzIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdG8gY3JlYXRlIHRvIHByb2Nlc3MKKwkgKiB3YWtldXBzLiBNdXN0IGJlID4gMCBhbmQgPCAxMDAuCisJICovCisJcHVibGljIEFsYXJtTWFuYWdlciggaW50IG5Xb3JrZXJzICkKKwl7CisJCWlmIChuV29ya2VycyA8PSAwIHx8IG5Xb3JrZXJzID49IDEwMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJuV29ya2VycyA8PSAwIHx8IG5Xb3JrZXJzID49IDEwMCIgKTsKKwkJCisJCXRoaXMubldvcmtlcnMgPSBuV29ya2VyczsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQWxhcm1NYW5hZ2VyIHdpdGggdGhlIGRlZmF1bHQgbnVtYmVyIG9mCisJICogd29ya2Vycy4KKwkgKiBAc2VlICNERUZBVUxUX05XT1JLRVJTCisJICovCisJcHVibGljIEFsYXJtTWFuYWdlcigpCisJeworCQl0aGlzKCBERUZBVUxUX05XT1JLRVJTICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgaW50IG5Xb3JrZXJzOworCQorCS8qKgorCSAqIFRoZSBkZWZhdWx0IG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyAoMSkuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9OV09SS0VSUyA9IDE7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzdGFydDAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQljbGVhckFsYXJtcygpOworCQljbGVhclF1ZXVlKCk7CisJCQorCQl3b3JrZXIgPSBuZXcgVGhyZWFkW25Xb3JrZXJzXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuV29ya2VyczsgaSsrKQorCQl7CisJCQl3b3JrZXJbaV0gPSBuZXcgVGhyZWFkKCB0aGlzLCAiQWxhcm1NYW5hZ2VyIHdvcmtlciB0aHJlYWQgIitpICk7CisJCQl3b3JrZXJbaV0uc3RhcnQoKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFRocmVhZFtdIHdvcmtlcjsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHN0b3AwKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQljbGVhckFsYXJtcygpOworCQljbGVhclF1ZXVlKCk7CisJCQorCQlzeW5jaHJvbml6ZWQgKHRoaXMpCisJCXsKKwkJCW5vdGlmeUFsbCgpOworCQl9CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG5Xb3JrZXJzOyBpKyspCisJCXsKKwkJCWlmICh3b3JrZXJbaV0gIT0gbnVsbCkKKwkJCXsKKwkJCQl3b3JrZXJbaV0uam9pbigpOworCQkJCXdvcmtlcltpXSA9IG51bGw7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiB0aG9zZSBnZXR0aW5nIHdha2V1cCBjYWxscy4gSWYgdGhlCisJICogbGlzdGVuZXIgaXMgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGEgd2FrZXVwIGNhbGwsIHRoZSBzY2hlZHVsZSBpcworCSAqIGFkanVzdGVkLiBUaGVyZSBjYW4gb25seSBiZSBvbmUgb3V0c3RhbmRpbmcgd2FrZXVwIGNhbGwgcGVyIGxpc3RlbmVyLgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGlzIHRocmVhZCBzYWZlLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgdGFyZ2V0IG9mIHRoZSB3YWtldXAgY2FsbC4KKwkgKiAKKwkgKiBAcGFyYW0gc3RhdGUgYSBiaXQgb2Ygc3RhdGUgZm9yIHRoZSBsaXN0ZW5lci4KKwkgKiAKKwkgKiBAcGFyYW0gZGVsYXkgdGhlIHBvc2l0aXZlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHdha2V1cCBjYWxsLgorCSAqIAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKwkgKiAwLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoIEFsYXJtTGlzdGVuZXIgbGlzdGVuZXIsIE9iamVjdCBzdGF0ZSwgaW50IGRlbGF5ICkKKwl7CisJCWlmIChsaXN0ZW5lciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAibGlzdGVuZXIgPT0gbnVsbCIgKTsKKwkJCisJCWlmIChkZWxheSA8PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImRlbGF5IDw9IDAiICk7CisJCQorCQljaGVja0lzU3RhcnRlZCgpOworCQkKKwkJbG9uZyBkdWUgPSBUaW1lci5nZXROYW5vcygpICsgZGVsYXkgKiBUaW1lci5OQU5PU19QRVJfTUlMTEk7CisJCQorCQlBbGFybSBhbGFybSA9IGdldEFsYXJtKCBsaXN0ZW5lciApOworCQlpZiAoYWxhcm0gIT0gbnVsbCkKKwkJeworCQkJLy8gc2NoZWR1bGUgaXMgYmVpbmcgYWRqdXN0ZWQKKwkJCWRlcXVldWUoIGFsYXJtICk7CisJCQlhbGFybS5zZXREdWUoIGR1ZSApOworCQkJYWxhcm0uc2V0U3RhdGUoIHN0YXRlICk7CisJCQllbnF1ZXVlKCBhbGFybSApOworCQl9CisJCWVsc2UKKwkJeworCQkJYWxhcm0gPSBuZXcgQWxhcm0oIGxpc3RlbmVyLCBzdGF0ZSwgZHVlICk7CisJCQlhZGRBbGFybSggbGlzdGVuZXIsIGFsYXJtICk7CisJCQllbnF1ZXVlKCBhbGFybSApOworCQl9CisJCQorCQlub3RpZnlXb3JrZXIoICJhZGQiICk7CisJfQorCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGUoIEFsYXJtIGFsYXJtLCBpbnQgZGVsYXkgKQorCXsKKwkJbG9uZyBkdWUgPSBkZWxheSA+IDAKKwkJCT8gYWxhcm0uZ2V0RHVlKCkgKyBkZWxheSAqIFRpbWVyLk5BTk9TX1BFUl9NSUxMSQorCQkJOiBUaW1lci5nZXROYW5vcygpIC0gZGVsYXkgKiBUaW1lci5OQU5PU19QRVJfTUlMTEk7CisJCQorCQlhbGFybS5zZXREdWUoIGR1ZSApOworCQllbnF1ZXVlKCBhbGFybSApOworCQlub3RpZnlXb3JrZXIoICJ1cGRhdGUiICk7CisJfQorCQorCS8qKgorCSAqIFJlbW92ZXMgYW55IHNjaGVkdWxlZCB3YWtldXAgY2FsbCBmb3IgdGhpcyBsaXN0ZW5lci4KKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCBpcyB0aHJlYWQgc2FmZS4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHRhcmdldCBvZiB0aGUgd2FrZXVwIGNhbGwuCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZSggQWxhcm1MaXN0ZW5lciBsaXN0ZW5lciApCisJeworCQljaGVja0lzU3RhcnRlZCgpOworCQkKKwkJQWxhcm0gYWxhcm0gPSByZW1vdmVBbGFybSggbGlzdGVuZXIgKTsKKwkJaWYgKGFsYXJtICE9IG51bGwpCisJCXsKKwkJCWRlcXVldWUoIGFsYXJtICk7CisJCQlub3RpZnlXb3JrZXIoICJyZW1vdmUiICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoIEFsYXJtIGFsYXJtICkKKwl7CisJCXJlbW92ZUFsYXJtKCBhbGFybS5saXN0ZW5lciApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgd2FrZXVwKCBBbGFybSBhbGFybSApCisJeworCQl0cnkKKwkJeworCQkJaW50IGRlbGF5ID0gYWxhcm0ubGlzdGVuZXIud2FrZXVwKCB0aGlzLCBhbGFybS5nZXRTdGF0ZSgpLCBhbGFybS5nZXREdWUoKSApOworCQkJaWYgKGRlbGF5ICE9IDApCisJCQkJdXBkYXRlKCBhbGFybSwgZGVsYXkgKTsKKwkJCWVsc2UKKwkJCQlyZW1vdmUoIGFsYXJtICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXJlbW92ZSggYWxhcm0gKTsKKwkJCXJlcG9ydCggZSApOworCQl9CisJfQorCQorCXByaXZhdGUgQWxhcm0gZ2V0TmV4dER1ZUFsYXJtKCkKKwl7CisJCS8vIG9rLCB0aGUgd29ya2VyIG5lZWRzIHRvIGdldCB0aGUgbmV4dCBkdWUgYWxhcm0gYW5kCisJCS8vIHRoZW4gd2FpdCB1bnRpbCBpdHMgZHVlIHRpbWUsIHRoZW4gcmV0dXJuIGl0LiBpZiBhbGVydGVkCisJCS8vIGJ5IG5vdGlmeVdvcmtlciwgaXQgc2hvdWxkIHJlZnJlc2ggdGhlIG5leHQgZHVlIGFsYXJtLgorCQkvLyBvbmUgdHJpY2sgd2lsbCBiZSBpbiBleGNsdWRpbmcgbXVsdGlwbGUgd29ya2VycyBmcm9tCisJCS8vIGNvbWluZyBpbiBoZXJlIGF0IHRoZSBzYW1lIHRpbWUuCisJCXN5bmNocm9uaXplZCAoZ2V0TmV4dER1ZUFsYXJtU3luYykKKwkJeworCQkJc3luY2hyb25pemVkICh0aGlzKQorCQkJeworCQkJCXdoaWxlICh0cnVlKQorCQkJCXsKKwkJCQkJaWYgKCFpc1N0YXJ0ZWQoKSkKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQkKKwkJCQkJQWxhcm0gYWxhcm0gPSBnZXRGaXJzdCgpOworCQkJCQkKKwkJCQkJaWYgKGFsYXJtID09IG51bGwpCisJCQkJCXsKKwkJCQkJCXRyeQorCQkJCQkJeworCQkJCQkJCXdhaXQoIExvbmcuTUFYX1ZBTFVFICk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQlsb25nIGRlbGF5TnMgPSBhbGFybS5nZXREdWUoKSAtIFRpbWVyLmdldE5hbm9zKCk7CisJCQkJCWlmIChkZWxheU5zID4gMCkKKwkJCQkJeworCQkJCQkJdHJ5CisJCQkJCQl7CisJCQkJCQkJbG9uZyBkZWxheSA9IGRlbGF5TnMgLyBUaW1lci5OQU5PU19QRVJfTUlMTEk7CisJCQkJCQkJaWYgKGRlbGF5ID4gMCkKKwkJCQkJCQkJd2FpdCggZGVsYXkgKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJCisJCQkJCS8vIHRoZSBhbGFybSBiZWluZyByZXR1cm5lZCBoYXMgbm90IGJlZW4gcmVtb3ZlZAorCQkJCQkvLyBmcm9tIGFsYXJtc0J5TGlzdGVuZXIuIGl0IGlzIHByZXN1bWVkIHRoYXQgdGhlCisJCQkJCS8vIGFsYXJtIHdpbGwgYmUgc2V0IGFnYWluLiBpZiBub3QsIGl0IHNob3VsZCBiZQorCQkJCQkvLyByZW1vdmVkLgorCQkJCQkKKwkJCQkJZGVxdWV1ZSggYWxhcm0gKTsKKwkJCQkJcmV0dXJuIGFsYXJtOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgZmluYWwgT2JqZWN0IGdldE5leHREdWVBbGFybVN5bmMgPSBuZXcgT2JqZWN0KCk7CisJCisJcHJpdmF0ZSB2b2lkIG5vdGlmeVdvcmtlciggU3RyaW5nIHJlYXNvbiApCisJeworCQkvLyB0aGUgc2V0IG9mIGFsYXJtcyBoYXMgY2hhbmdlZC4KKwkJbm90aWZ5KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJ1bigpCisJeworCQl0cnkKKwkJeworCQkJQWxhcm0gYWxhcm07CisJCQl3aGlsZSAoKGFsYXJtID0gZ2V0TmV4dER1ZUFsYXJtKCkpICE9IG51bGwpCisJCQl7CisJCQkJd2FrZXVwKCBhbGFybSApOworCQkJfQorCQl9CisJCWNhdGNoICggUnVudGltZUV4Y2VwdGlvbiBlICkKKwkJeworCQkJcmVwb3J0KCBlICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlcG9ydCggRXhjZXB0aW9uIGUgKQorCXsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBTEFSTVMgQlkgTElTVEVORVIgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwlwcml2YXRlIEFsYXJtIGdldEFsYXJtKCBBbGFybUxpc3RlbmVyIGxpc3RlbmVyICkKKwl7CisJCXJldHVybiBhbGFybXNCeUxpc3RlbmVyLmdldCggbGlzdGVuZXIgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZEFsYXJtKCBBbGFybUxpc3RlbmVyIGxpc3RlbmVyLCBBbGFybSBhbGFybSApCisJeworCQlhbGFybXNCeUxpc3RlbmVyLnB1dCggbGlzdGVuZXIsIGFsYXJtICk7CisJfQorCQorCXByaXZhdGUgQWxhcm0gcmVtb3ZlQWxhcm0oIEFsYXJtTGlzdGVuZXIgbGlzdGVuZXIgKQorCXsKKwkJcmV0dXJuIGFsYXJtc0J5TGlzdGVuZXIucmVtb3ZlKCBsaXN0ZW5lciApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY2xlYXJBbGFybXMoKQorCXsKKwkJYWxhcm1zQnlMaXN0ZW5lci5jbGVhcigpOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxBbGFybUxpc3RlbmVyLEFsYXJtPiBhbGFybXNCeUxpc3RlbmVyID0gbmV3IEhhc2hNYXA8QWxhcm1MaXN0ZW5lcixBbGFybT4oKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEFMQVJNUyBCWSBEVUUgVElNRSAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCXByaXZhdGUgQWxhcm0gZ2V0Rmlyc3QoKQorCXsKKwkJaWYgKGFsYXJtcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBhbGFybXMuZmlyc3QoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGVucXVldWUoIEFsYXJtIGFsYXJtICkKKwl7CisJCWFsYXJtcy5hZGQoIGFsYXJtICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlcXVldWUoIEFsYXJtIGFsYXJtICkKKwl7CisJCWFsYXJtcy5yZW1vdmUoIGFsYXJtICk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjbGVhclF1ZXVlKCkKKwl7CisJCWFsYXJtcy5jbGVhcigpOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFRyZWVTZXQ8QWxhcm0+IGFsYXJtcyA9IG5ldyBUcmVlU2V0PEFsYXJtPigpOworCQorCS8vLy8vLy8vLy8vLy8KKwkvLyBDTEFTU0VTIC8vCisJLy8vLy8vLy8vLy8vLworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgQWxhcm0gaW1wbGVtZW50cyBDb21wYXJhYmxlPEFsYXJtPgorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgdGFyZ2V0IG9mIHRoZSB3YWtldXAgY2FsbC4KKwkJICogQHBhcmFtIHN0YXRlIGEgYml0IG9mIHN0YXRlIGZvciB0aGUgbGlzdGVuZXIuCisJCSAqIEBwYXJhbSBkdWUgdGhlIGFic29sdXRlIGR1ZSB0aW1lIGZvciB0aGUgYWxhcm0uCisJCSAqLworCQlBbGFybSggQWxhcm1MaXN0ZW5lciBsaXN0ZW5lciwgT2JqZWN0IHN0YXRlLCBsb25nIGR1ZSApCisJCXsKKwkJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKwkJCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKwkJCXRoaXMuZHVlID0gZHVlOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgc3RhdGUgZm9yIHRoZSBsaXN0ZW5lci4KKwkJICovCisJCU9iamVjdCBnZXRTdGF0ZSgpCisJCXsKKwkJCXJldHVybiBzdGF0ZTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBzdGF0ZSBhIG5ldyBiaXQgb2Ygc3RhdGUgZm9yIHRoZSBsaXN0ZW5lci4KKwkJICovCisJCXZvaWQgc2V0U3RhdGUoIE9iamVjdCBzdGF0ZSApCisJCXsKKwkJCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSB0aW1lIHRoZSBhbGFybSBpcyBkdWUuCisJCSAqLworCQlsb25nIGdldER1ZSgpCisJCXsKKwkJCXJldHVybiBkdWU7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIGR1ZQorCQkgKi8KKwkJdm9pZCBzZXREdWUoIGxvbmcgZHVlICkKKwkJeworCQkJdGhpcy5kdWUgPSBkdWU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpCisJCXsKKwkJCXJldHVybiAoaW50KSAoZHVlIF4gZHVlID4+PiAzMiBeIHNlcSBeIHNlcSA+Pj4gMzIpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyggT2JqZWN0IG9iaiApCisJCXsKKwkJCWlmIChvYmogPT0gdGhpcykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQorCQkJaWYgKG9iaiA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJaWYgKG9iai5nZXRDbGFzcygpICE9IEFsYXJtLmNsYXNzKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJQWxhcm0gb3RoZXIgPSAoQWxhcm0pIG9iajsKKwkJCQorCQkJcmV0dXJuIGR1ZSA9PSBvdGhlci5kdWUgJiYgc2VxID09IG90aGVyLnNlcTsKKwkJfQorCisJCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBBbGFybSBvdGhlciApCisJCXsKKwkJCWlmIChkdWUgPCBvdGhlci5kdWUpCisJCQkJcmV0dXJuIC0xOworCQkJCisJCQlpZiAoZHVlID4gb3RoZXIuZHVlKQorCQkJCXJldHVybiAxOworCQkJCisJCQkvLyBkdWUgdGltZSBpcyB0aGUgc2FtZSBmb3IgYm90aCwgbm93IHdlIG5lZWQgdG8KKwkJCS8vIGNvbXBhcmUgdGhlIHNlcS4KKwkJCQorCQkJaWYgKHNlcSA8IG90aGVyLnNlcSkKKwkJCQlyZXR1cm4gLTE7CisJCQkKKwkJCWlmIChzZXEgPiBvdGhlci5zZXEpCisJCQkJcmV0dXJuIDE7CisJCQkKKwkJCXJldHVybiAwOworCQl9CisJCQorCQkvKioKKwkJICogVGhlIGxpc3RlbmVyIGZvciB3YWtldXAgZXZlbnRzLgorCQkgKi8KKwkJZmluYWwgQWxhcm1MaXN0ZW5lciBsaXN0ZW5lcjsKKwkJCisJCS8qKgorCQkgKiBKdXN0IGEgYml0IG9mIHN0YXRlIGZvciB0aGUgbGlzdGVuZXIuCisJCSAqLworCQlwcml2YXRlIE9iamVjdCBzdGF0ZTsKKwkJCisJCS8qKgorCQkgKiBUaGUgdGltZSB0aGUgYWxhcm0gaXMgZHVlLgorCQkgKi8KKwkJcHJpdmF0ZSBsb25nIGR1ZTsKKwkJCisJCS8qKgorCQkgKiBBIHVuaXF1ZSBmb3IgYWxsIHJlYXNvbmFibGUgdGltZSBzZXF1ZW5jZSBudW1iZXIuCisJCSAqLworCQlwcml2YXRlIGZpbmFsIGxvbmcgc2VxID0gaWRHZW4ubmV4dCgpOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSWRHZW5lcmF0b3IgaWRHZW4gPSBuZXcgSWRHZW5lcmF0b3IoKTsKKwl9CisKKwkvKioKKwkgKiBTaHV0cyBkb3duIHRoZSBkZWZhdWx0IGFsYXJtIG1hbmFnZXIgaWYgdGhlcmUgaXMgb25lLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQWxhcm1NYW5hZ2VyIGFtID0gc2V0QWxhcm1NYW5hZ2VyKCBudWxsICk7CisJCWlmIChhbSAhPSBudWxsKQorCQkJYW0uc3RvcCgpOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9BcnJheUl0ZXJhdG9yLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQXJyYXlJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzQyMzgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQXJyYXlJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBJdGVyYXRvciBvdmVyIGEgZ2VuZXJpYyBhcnJheS4KKyAqLworcHVibGljIGNsYXNzIEFycmF5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxPYmplY3Q+Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQXJyYXlJdGVyYXRvci4KKwkgKiBAcGFyYW0gYXJyYXkKKwkgKi8KKwlwdWJsaWMgQXJyYXlJdGVyYXRvciggT2JqZWN0IGFycmF5ICkKKwl7CisJCWlmIChhcnJheSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAiYXJyYXkgPT0gbnVsbCIgKTsKKwkJCisJCWlmICghYXJyYXkuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiIWFycmF5LmdldENsYXNzKCkuaXNBcnJheSgpIiApOworCQkKKwkJdGhpcy5hcnJheSA9IGFycmF5OworCQlsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgoIGFycmF5ICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgT2JqZWN0IGFycmF5OworCQorCXByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKKwkKKwlwcml2YXRlIGludCBpbmRleCA9IDA7CisJCisJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisJeworCQlyZXR1cm4gaW5kZXggPCBsZW5ndGg7CisJfQorCisJcHVibGljIE9iamVjdCBuZXh0KCkKKwl7CisJCWlmICghaGFzTmV4dCgpKQorCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKwkJCisJCXJldHVybiBBcnJheS5nZXQoIGFycmF5LCBpbmRleCsrICk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlKCkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9Bc3NlcnRpb24uamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9Bc3NlcnRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODVjNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0Fzc2VydGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworLyoqCisgKiBQb3J0YWJsZSBhc3NlcnRpb24gY2hlY2tpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRpb24KK3sKKwkvKioKKwkgKiBDaGVja3MgYSB2YWx1ZSBmb3IgYmVpbmcgdHJ1ZSBhbmQgaWYgbm90IGl0IHRocm93cyBhbiBleGNlcHRpb24KKwkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRpb24gaW4gdGhlIG1lc3NhZ2UuCisJICogCisJICogQHBhcmFtIHZhbHVlIGEgYm9vbGVhbiB2YWx1ZSB3aGljaCBzaG91bGQgYmUgdHJ1ZSAoZS5nLiwgeCA8IDEwMCApLgorCSAqIAorCSAqIEBwYXJhbSBtc2cgYSBkZXNjcmlwdGlvbiBvZiB2YWx1ZSAoZS5nLiwgInggPCAxMDAiICkuCisJICogCisJICogQHRocm93cyBBc3NlcnRpb25FeGNlcHRpb24gd2hlbiB2YWx1ZSBpcyBub3QgdHJ1ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2soIGJvb2xlYW4gdmFsdWUsIFN0cmluZyBtc2cgKQorCQl0aHJvd3MgQXNzZXJ0aW9uRXhjZXB0aW9uCisJeworCQlpZiAoIXZhbHVlKQorCQkJdGhyb3cgbmV3IEFzc2VydGlvbkV4Y2VwdGlvbiggImFzc2VydGlvbiBmYWlsZWQ6ICIrbXNnICk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIGEgdmFsdWUgZm9yIGJlaW5nIHRydWUgYW5kIGlmIG5vdCBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uCisJICogd2l0aCB0aGUgc3BlY2lmaWVkIGRlc2NyaXB0aW9uIGluIHRoZSBtZXNzYWdlLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSBhIGJvb2xlYW4gdmFsdWUgd2hpY2ggc2hvdWxkIGJlIHRydWUgKGUuZy4sIHggPCAxMDAgKS4KKwkgKiAKKwkgKiBAcGFyYW0gZm10IGEgZGVzY3JpcHRpb24gb2YgdmFsdWUgKGUuZy4sICJ4ICglZCkgPCAxMDAiICkuCisJICogCisJICogQHBhcmFtIGFyZ3MgYXJncyBmb3IgdGhlIGZvcm1hdC4KKwkgKiAKKwkgKiBAdGhyb3dzIEFzc2VydGlvbkV4Y2VwdGlvbiB3aGVuIHZhbHVlIGlzIG5vdCB0cnVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVjayggYm9vbGVhbiB2YWx1ZSwgU3RyaW5nIGZtdCwgT2JqZWN0IC4uLiBhcmdzICkKKwkJdGhyb3dzIEFzc2VydGlvbkV4Y2VwdGlvbgorCXsKKwkJaWYgKCF2YWx1ZSkKKwkJCXRocm93IG5ldyBBc3NlcnRpb25FeGNlcHRpb24oICJhc3NlcnRpb24gZmFpbGVkOiAiKworCQkJCVN0cmluZy5mb3JtYXQoIGZtdCwgYXJncyApICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0Fzc2VydGlvbkV4Y2VwdGlvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0Fzc2VydGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYzQ2YzQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQXNzZXJ0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gdXBvbiBhc3NlcnRpb24gZmFpbHVyZS4KKyAqIAorICogQHNlZSBBc3NlcnRpb24jY2hlY2soYm9vbGVhbiwgU3RyaW5nLCBPYmplY3RbXSkKKyAqLworcHVibGljIGNsYXNzIEFzc2VydGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNTQ1NTIwNjAzNDQ1NzM1NDc4TDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYW4gYXNzZXJ0aW9uIGV4Y2VwdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZSBkZXNjcmliZXMgdGhlIGZhaWx1cmUuCisJICovCisJcHVibGljIEFzc2VydGlvbkV4Y2VwdGlvbiggU3RyaW5nIG1lc3NhZ2UgKQorCXsKKwkJc3VwZXIoIG1lc3NhZ2UgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQnl0ZUJ1ZmZlci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0J5dGVCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjJhZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0J5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CisKKy8qKgorICogQnl0ZSBidWZmZXIgd2l0aCBvcGVyYXRpb24gdG8gc3VwcG9ydCBnZXR0aW5nIGFuZCBwdXR0aW5nCisgKiBieXRlcy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIEJ5dGVCdWZmZXIKK3sKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKwl7CisJCXJldHVybiBsZW5ndGgoKSA9PSAwOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGdWxsKCkKKwl7CisJCXJldHVybiBsZW5ndGgoKSA9PSBzaXplKCk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIHRoZSBidWZmZXIgY2FuIGhvbGQuCisJICovCisJYWJzdHJhY3QgcHVibGljIGludCBzaXplKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgaW50IGxlbmd0aCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgYnl0ZSBmcm9tIHRoZSBidWZmZXIuCisJICogQHRocm93cyBFT0ZFeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgYnl0ZSBnZXQoKSB0aHJvd3MgRU9GRXhjZXB0aW9uOworCQorCS8qKgorCSAqIEdldHMgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIHRvIGZpbGwgYnVmLgorCSAqIEBwYXJhbSBidWYKKwkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgZGF0YSBwdXQgaW50byBidWYuCisJICovCisJcHVibGljIGludCBnZXQoIGJ5dGVbXSBidWYgKQorCXsKKwkJcmV0dXJuIGdldCggYnVmLCAwLCBidWYubGVuZ3RoICk7CisJfQorCQorCS8qKgorCSAqIEdldHMgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIHRvIGZpbGwgYnVmLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkCisJICogcG9zaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgorCSAqIEBwYXJhbSBidWYKKwkgKiBAcGFyYW0gb2ZmCisJICogQHBhcmFtIGxlbgorCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiBkYXRhIHB1dCBpbnRvIGJ1Zi4KKwkgKi8KKwlwdWJsaWMgaW50IGdldCggYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbiApCisJeworCQlpZiAob2ZmIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJvZmYgPCAwIiApOworCQkKKwkJaWYgKGxlbiA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibGVuIDwgMCIgKTsKKwkJCisJCWlmIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJvZmYrbGVuID4gYnVmLmxlbmd0aCIgKTsKKwkJCisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAwOworCisJCWludCBjb3VudCA9IDA7CisJCXRyeQorCQl7CisJCQl3aGlsZSAobGVuID4gMCkKKwkJCXsKKwkJCQlidWZbb2ZmXSA9IGdldCgpOworCQkJCWNvdW50Kys7CisJCQkJb2ZmKys7CisJCQkJbGVuLS07CisJCQl9CisJCX0KKwkJY2F0Y2ggKCBFT0ZFeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8uCisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KKwkKKwkvKioKKwkgKiBQdXRzIGEgYnl0ZSBpbnRvIHRoZSBidWZmZXIuCisJICogQHBhcmFtIGIKKwkgKiBAdGhyb3dzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaXMgZnVsbAorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIHB1dCggYnl0ZSBiICkgdGhyb3dzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOworCQorCS8qKgorCSAqIFB1dHMgdGhlIGJ5dGVzIGZyb20gYnVmIGludG8gdGhlIGJ1ZmZlci4KKwkgKiBAcGFyYW0gYnVmCisJICogQHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgY29waWVkIGludG8gdGhlIGJ1ZmZlci4KKwkgKi8KKwlwdWJsaWMgaW50IHB1dCggYnl0ZVtdIGJ1ZiApCisJeworCQlyZXR1cm4gcHV0KCBidWYsIDAsIGJ1Zi5sZW5ndGggKTsKKwl9CisJCisJLyoqCisJICogUHV0cyB0aGUgYnl0ZXMgZnJvbSBidWYgaW50byB0aGUgYnVmZmVyLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkCisJICogcG9zaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbGVuZ3RoOworCSAqIEBwYXJhbSBidWYKKwkgKiBAcGFyYW0gb2ZmCisJICogQHBhcmFtIGxlbgorCSAqIEByZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIGNvcGllZCBpbnRvIHRoZSBidWZmZXIuCisJICovCisJcHVibGljIGludCBwdXQoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQorCXsKKwkJaWYgKG9mZiA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAib2ZmIDwgMCIgKTsKKwkJCisJCWlmIChsZW4gPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImxlbiA8IDAiICk7CisJCQorCQlpZiAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAib2ZmK2xlbiA+IGJ1Zi5sZW5ndGgiICk7CisJCQorCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gMDsKKwkJCisJCWludCBjb3VudCA9IDA7CisJCXRyeQorCQl7CisJCQl3aGlsZSAobGVuID4gMCkKKwkJCXsKKwkJCQlwdXQoIGJ1ZltvZmZdICk7CisJCQkJY291bnQrKzsKKwkJCQlvZmYrKzsKKwkJCQlsZW4tLTsKKwkJCX0KKwkJfQorCQljYXRjaCAoIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBub3RoaW5nIHRvIGRvLgorCQl9CisJCXJldHVybiBjb3VudDsKKwl9CisJCisJLyoqCisJICogQ2xlYXJzIHRoZSBidWZmZXIuCisJICovCisJYWJzdHJhY3QgcHVibGljIHZvaWQgY2xlYXIoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgbGl0dGxlLWVuZGlhbiAzMi1iaXQgaW50ZWdlciBmcm9tIHRoZSBidWZmZXIuCisJICogQHRocm93cyBFT0ZFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgaW50IGdldEludCgpIHRocm93cyBFT0ZFeGNlcHRpb24KKwl7CisJCWludCBiMCA9IGdldCgpICYgMjU1OworCQlpbnQgYjEgPSBnZXQoKSAmIDI1NTsKKwkJaW50IGIyID0gZ2V0KCkgJiAyNTU7CisJCWludCBiMyA9IGdldCgpICYgMjU1OworCQlyZXR1cm4gYjAgfCBiMSA8PCA4IHwgYjIgPDwgMTYgfCBiMyA8PCAyNDsKKwl9CisJCisJLyoqCisJICogUHV0cyBhIGxpdHRsZS1lbmRpYW4gMzItYml0IGludGVnZXIgaW50byB0aGUgYnVmZmVyLgorCSAqIEBwYXJhbSB4CisJICovCisJcHVibGljIHZvaWQgcHV0SW50KCBpbnQgeCApCisJeworCQlwdXQoIChieXRlKSB4ICk7CisJCXB1dCggKGJ5dGUpICh4ID4+PiA4KSApOworCQlwdXQoIChieXRlKSAoeCA+Pj4gMTYpICk7CisJCXB1dCggKGJ5dGUpICh4ID4+PiAyNCkgKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0NoYXJJdGVyYXRvci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0NoYXJJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzhhZDcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQ2hhckl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCisvKioKKyAqIEBhdXRob3Igd2VydAorICovCitwdWJsaWMgY2xhc3MgQ2hhckl0ZXJhdG9yCit7CisJLyoqCisJICogQHBhcmFtIHMKKwkgKi8KKwlwdWJsaWMgQ2hhckl0ZXJhdG9yKCBTdHJpbmcgcyApCisJeworCQl0aGlzLnMgPSBzOworCQluID0gcy5sZW5ndGgoKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgczsKKwkKKwlwcml2YXRlIGZpbmFsIGludCBuOworCQorCXByaXZhdGUgaW50IGk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgY2hhcnMuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisJeworCQlyZXR1cm4gaSA8IG47CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gc2VxdWVuY2UuCisJICovCisJcHVibGljIGNoYXIgbmV4dCgpCisJeworCQlyZXR1cm4gcy5jaGFyQXQoIGkrKyApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9DaXJjdWxhckJ5dGVCdWZmZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9DaXJjdWxhckJ5dGVCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY3ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0NpcmN1bGFyQnl0ZUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIENpcmN1bGFyQnl0ZUJ1ZmZlci4KKyAqLworcHVibGljIGNsYXNzIENpcmN1bGFyQnl0ZUJ1ZmZlciBleHRlbmRzIEJ5dGVCdWZmZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBDaXJjdWxhckJ5dGVCdWZmZXIuCisJICoKKwkgKiBAcGFyYW0gc2l6ZQorCSAqLworCXB1YmxpYyBDaXJjdWxhckJ5dGVCdWZmZXIoIGludCBzaXplICkKKwl7CisJCXRoaXMuc2l6ZSA9IHNpemU7CisJCWJ1ZiA9IG5ldyBieXRlW3NpemVdOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIGludCBzaXplOworCQorCXByaXZhdGUgZmluYWwgYnl0ZVtdIGJ1ZjsKKwkKKwlwcml2YXRlIGludCBsZW5ndGg7CisJCisJcHJpdmF0ZSBpbnQgbmV4dEdldDsKKwkKKwlwcml2YXRlIGludCBuZXh0UHV0OworCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgc2l6ZSgpCisJeworCQlyZXR1cm4gc2l6ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGludCBsZW5ndGgoKQorCXsKKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xlYXIoKQorCXsKKwkJbGVuZ3RoID0gMDsKKwkJbmV4dEdldCA9IDA7CisJCW5leHRQdXQgPSAwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBieXRlIGdldCgpIHRocm93cyBFT0ZFeGNlcHRpb24KKwl7CisJCWlmIChpc0VtcHR5KCkpCisJCQl0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CisJCQorCQlsZW5ndGgtLTsKKwkJYnl0ZSBiID0gYnVmW25leHRHZXQrK107CisJCWlmIChuZXh0R2V0ID49IHNpemUpCisJCQluZXh0R2V0ID0gMDsKKwkJcmV0dXJuIGI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHV0KCBieXRlIGIgKSB0aHJvd3MgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24KKwl7CisJCWlmIChpc0Z1bGwoKSkKKwkJCXRocm93IG5ldyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbigpOworCQkKKwkJbGVuZ3RoKys7CisJCWJ1ZltuZXh0UHV0KytdID0gYjsKKwkJaWYgKG5leHRQdXQgPj0gc2l6ZSkKKwkJCW5leHRQdXQgPSAwOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvQ2lyY3VsYXJRdWV1ZS5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0NpcmN1bGFyUXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM5YWFmCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0NpcmN1bGFyUXVldWUuamF2YQpAQCAtMCwwICsxLDM4MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCisvKioKKyAqIEEgY2lyY3VsYXIgcXVldWUgb2YgYSBmaXhlZCBzaXplLiBFbGVtZW50cyBhcmUgYWRkZWQgdG8gb25lCisgKiBlbmQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIsIHdpdGggdGhlIHF1ZXVlIHNpemUgcmFuZ2luZworICogZnJvbSBlbXB0eSB0byBmdWxsLiBPcGVyYXRpb25zIGNhbiBvcHRpb25hbGx5IHdhaXQgdW50aWwKKyAqIGZpbmlzaGVkIG9yIHJldHVybiBzdGF0dXMgaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCisgKiBGb3IgaW5zdGFuY2UsIGFkZGluZyB0byBhIGZ1bGwgcXVldWUgY2FuIHdhaXQgdW50aWwgYW4gaXRlbQorICogaXMgcmVtb3ZlZCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgaXRlbSBvciBpdCBjYW4gd2FpdCBvbmx5CisgKiBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBiZWZvcmUgY29tcGxldGluZyBzdWNjZXNzZnVsbHkKKyAqIG9yIGdpdmluZyB1cC4KKyAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2lyY3VsYXJRdWV1ZTxUPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIENpcmN1bGFyUXVldWUuCisJICoKKwkgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgYWxsb3dlZCBpbiB0aGUgcXVldWUuCisJICovCisJcHVibGljIENpcmN1bGFyUXVldWUoIGludCBzaXplICkKKwl7CisJCWlmIChzaXplIDwgMSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJzaXplIDwgMSIgKTsKKwkJCisJCXRoaXMuc2l6ZSA9IHNpemU7CisJCWl0ZW1zID0gbmV3IE9iamVjdFtzaXplXTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQ2lyY3VsYXJRdWV1ZSB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcworCSAqIGRlZmF1bHRlZCB0byAxMC4KKwkgKi8KKwlwdWJsaWMgQ2lyY3VsYXJRdWV1ZSgpCisJeworCQl0aGlzKCAxMCApOworCX0KKworCXByaXZhdGUgZmluYWwgaW50IHNpemU7CisJCisJcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IG1heSBiZSBwdXQgaW4gdGhlIHF1ZXVlLgorCSAqLworCXB1YmxpYyBpbnQgc2l6ZSgpCisJeworCQlyZXR1cm4gc2l6ZTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBCQVNJQyBRVUVVRSBPUFMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcXVldWUuCisJICovCisJcHVibGljIGludCBjb3VudCgpCisJeworCQlyZXR1cm4gY291bnQ7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCisJeworCQlyZXR1cm4gY291bnQgPT0gMDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWV1ZSBpcyBmdWxsLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRnVsbCgpCisJeworCQlyZXR1cm4gY291bnQgPT0gc2l6ZTsKKwl9CisJCisJLyoqCisJICogR2V0cyB0aGUgaXRlbSBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisJICogQHJldHVybiB0aGUgaXRlbSBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisJICovCisJcHJpdmF0ZSBPYmplY3QgZ2V0MCgpCisJeworCQlBc3NlcnRpb24uY2hlY2soIGNvdW50ID4gMCwgImNvdW50ID4gMCIgKTsKKwkJCisJCU9iamVjdCBvYmogPSBpdGVtc1toZWFkXTsKKwkJCisJCUFzc2VydGlvbi5jaGVjayggb2JqICE9IG51bGwsICJvYmogIT0gbnVsbCIgKTsKKwkJCisJCWl0ZW1zW2hlYWRdID0gbnVsbDsKKwkJCisJCWNvdW50LS07CisJCWhlYWQrKzsKKwkJCisJCWlmIChoZWFkID09IHNpemUpCisJCQloZWFkID0gMDsKKwkJCisJCXJldHVybiBvYmo7CisJfQorCQorCS8qKgorCSAqIFB1dHMgdGhlIGl0ZW0gYXQgdGhlIHRhaWwgb2YgdGhlIHF1ZXVlLgorCSAqIEBwYXJhbSBvYmogbm9uLW51bGwgaXRlbSB0byBwdXQuCisJICovCisJcHJpdmF0ZSB2b2lkIHB1dDAoIE9iamVjdCBvYmogKQorCXsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBvYmogIT0gbnVsbCwgIm9iaiAhPSBudWxsIiApOworCQlBc3NlcnRpb24uY2hlY2soIGNvdW50IDwgc2l6ZSwgImNvdW50IDwgc2l6ZSIgKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBpdGVtc1t0YWlsXSA9PSBudWxsLCAiaXRlbXNbdGFpbF0gPT0gbnVsbCIgKTsKKwkJCisJCWl0ZW1zW3RhaWxdID0gb2JqOworCQkKKwkJY291bnQrKzsKKwkJdGFpbCsrOworCQkKKwkJaWYgKHRhaWwgPT0gc2l6ZSkKKwkJCXRhaWwgPSAwOworCX0KKwkKKwlwcml2YXRlIGludCBjb3VudDsKKwkKKwlwcml2YXRlIGludCBoZWFkOworCQorCXByaXZhdGUgaW50IHRhaWw7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFVCTElDIFFVRVVFIE9QUyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBuZXh0IGF2YWlsYWJsZSBpdGVtIGZyb20gdGhlIHF1ZXVlLCB3YWl0aW5nCisJICogdW50aWwgYW4gaXRlbSBpcyBhdmFpbGFibGUgb3IgdGhlIHF1ZXVlIGlzIGNsb3NlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUgb3IgbnVsbCBpZiB0aGUgcXVldWUKKwkgKiBpcyBjbG9zZWQuCisJICogCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkLgorCSAqLworCXB1YmxpYyBUIGdldCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGdldCggMCApOworCX0KKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBuZXh0IGF2YWlsYWJsZSBpdGVtIGZyb20gdGhlIHF1ZXVlLCB3YWl0aW5nCisJICogdW50aWwgYW4gaXRlbSBpcyBhdmFpbGFibGUgb3IgdGhlIHF1ZXVlIGlzIGNsb3NlZC4KKwkgKiAKKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGhlIG1heGltdW0gdGltZSBpbiBtcyB0byB3YWl0IGZvcgorCSAqIHNvbWV0aGluZyB0byBiZSBwdXQgaW4gdGhlIHF1ZXVlOyAwIG1lYW5zIHdhaXQgZm9yZXZlciwKKwkgKiBsZXNzIHRoYW4gMCBtZWFucyBkb24ndCB3YWl0IGF0IGFsbC4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUgb3IgbnVsbCBpZiBtYXhEZWxheQorCSAqIGhhcyBiZWVuIGV4Y2VlZGVkIG9yIHRoZSBxdWV1ZSBpcyBjbG9zZWQuCisJICogCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgVCBnZXQoIGludCBtYXhEZWxheSApIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCXsKKwkJaWYgKCFpc0VtcHR5KCkpCisJCQlyZXR1cm4gZ2V0QW5kTm90aWZ5KCk7CisJCQorCQkvLyB0aGUgcXVldWUgaXMgZW1wdHkuCisJCQorCQlpZiAoaXNDbG9zZWQoKSB8fCBtYXhEZWxheSA8IDApCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCS8vIHRoZSBxdWV1ZSBpcyBlbXB0eSwgbm90IGNsb3NlZCwgYW5kIGNhbGxlciBoYXMgcmVxdWVzdGVkIGEgZGVsYXkuLi4KKwkJCisJCWxvbmcgbm93ID0gVGltZXIuZ2V0TmFub3MoKTsKKwkJbG9uZyBlbmQgPSBnZXRFbmRUaW1lKCBub3csIG1heERlbGF5ICk7CisJCUFzc2VydGlvbi5jaGVjayggZW5kID4gbm93LCAiZW5kID4gbm93IiApOworCQkKKwkJbG9uZyBkOworCQl3aGlsZSAoKGQgPSAoZW5kIC0gbm93KSAvIFRpbWVyLk5BTk9TX1BFUl9NSUxMSSkgPiAwKQorCQl7CisJCQkvLyB0aGUgcXVldWUgaXMgZW1wdHksIG5vdCBjbG9zZWQsIGFuZCBkZWxheSBoYXMgbm90IHJ1biBvdXQuLi4KKwkJCQorCQkJQXNzZXJ0aW9uLmNoZWNrKCBpc0VtcHR5KCksICJpc0VtcHR5KCkiICk7CisJCQlBc3NlcnRpb24uY2hlY2soICFpc0Nsb3NlZCgpLCAiIWlzQ2xvc2VkKCkiICk7CisJCQlBc3NlcnRpb24uY2hlY2soIGQgPiAwLCAiZCA+IDAiICk7CisJCQkKKwkJCXdhaXQoIGQgKTsKKwkJCQorCQkJaWYgKCFpc0VtcHR5KCkpCisJCQkJcmV0dXJuIGdldEFuZE5vdGlmeSgpOworCQkJCisJCQlpZiAoaXNDbG9zZWQoKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCQorCQkJbm93ID0gVGltZXIuZ2V0TmFub3MoKTsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUHV0cyBhbiBpdGVtIGluIHRoZSBxdWV1ZSwgd2FpdGluZyB1bnRpbCBzcGFjZSBpcyBhdmFpbGFibGUKKwkgKiBvciB0aGUgcXVldWUgaXMgY2xvc2VkLgorCSAqIAorCSAqIEBwYXJhbSBvYmogYSBub24tbnVsbCBpdGVtIHRvIHB1dCBpbiB0aGUgcXVldWUuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtIHdhcyBwbGFjZWQgaW4gdGhlIHF1ZXVlCisJICogb3IgZmFsc2UgaWYgdGhlIHF1ZXVlIGlzIGNsb3NlZC4KKwkgKiAKKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gcHV0KCBUIG9iaiApIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHB1dCggb2JqLCAwICk7CisJfQorCQorCS8qKgorCSAqIFB1dHMgYW4gaXRlbSBpbiB0aGUgcXVldWUsIHdhaXRpbmcgdW50aWwgc3BhY2UgaXMgYXZhaWxhYmxlCisJICogb3IgdGhlIHF1ZXVlIGlzIGNsb3NlZC4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqIGEgbm9uLW51bGwgaXRlbSB0byBwdXQgaW4gdGhlIHF1ZXVlLgorCSAqIAorCSAqIEBwYXJhbSBtYXhEZWxheSB0aGUgbWF4aW11bSB0aW1lIGluIG1zIHRvIHdhaXQgZm9yCisJICogYXZhaWxhYmxlIHNwYWNlIHRoZSBxdWV1ZTsgMCBtZWFucyB3YWl0IGZvcmV2ZXIsCisJICogbGVzcyB0aGFuIDAgbWVhbnMgZG9uJ3Qgd2FpdCBhdCBhbGwuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtIHdhcyBwbGFjZWQgaW4gdGhlIHF1ZXVlCisJICogb3IgZmFsc2UgaWYgbWF4RGVsYXkgaGFzIGJlZW4gZXhjZWVkZWQgb3IgdGhlIHF1ZXVlCisJICogaXMgY2xvc2VkLgorCSAqIAorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZC4KKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcHV0KCBUIG9iaiwgaW50IG1heERlbGF5ICkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQlpZiAob2JqID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJvYmogPT0gbnVsbCIgKTsKKwkJCisJCWlmIChpc0Nsb3NlZCgpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJLy8gdGhlIHF1ZXVlIGlzIG5vdCBjbG9zZWQuCisJCQorCQlpZiAoIWlzRnVsbCgpKQorCQl7CisJCQlwdXRBbmROb3RpZnkoIG9iaiApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCS8vIHRoZSBxdWV1ZSBpcyBmdWxsIGFuZCBub3QgY2xvc2VkLgorCQkKKwkJaWYgKG1heERlbGF5IDwgMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCS8vIHRoZSBxdWV1ZSBpcyBmdWxsLCBub3QgY2xvc2VkLCBhbmQgdGhlIGNhbGxlciBoYXMgcmVxdWVzdGVkIGEgZGVsYXkuLi4KKwkJCisJCWxvbmcgbm93ID0gVGltZXIuZ2V0TmFub3MoKTsKKwkJbG9uZyBlbmQgPSBnZXRFbmRUaW1lKCBub3csIG1heERlbGF5ICk7CisJCUFzc2VydGlvbi5jaGVjayggZW5kID4gbm93LCAiZW5kID4gbm93IiApOworCQkKKwkJbG9uZyBkOworCQl3aGlsZSAoKGQgPSAoZW5kIC0gbm93KSAvIFRpbWVyLk5BTk9TX1BFUl9NSUxMSSkgPiAwKQorCQl7CisJCQkvLyB0aGUgcXVldWUgaXMgZnVsbCwgbm90IGNsb3NlZCwgYW5kIGRlbGF5IGhhcyBub3QgcnVuIG91dC4uLgorCQkJCisJCQlBc3NlcnRpb24uY2hlY2soIGlzRnVsbCgpLCAiaXNGdWxsKCkiICk7CisJCQlBc3NlcnRpb24uY2hlY2soICFpc0Nsb3NlZCgpLCAiIWlzQ2xvc2VkKCkiICk7CisJCQlBc3NlcnRpb24uY2hlY2soIGQgPiAwLCAiZCA+IDAiICk7CisJCQkKKwkJCXdhaXQoIGQgKTsKKwkJCQorCQkJaWYgKGlzQ2xvc2VkKCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQkvLyB0aGUgcXVldWUgaXMgbm90IGNsb3NlZC4KKwkJCQorCQkJaWYgKCFpc0Z1bGwoKSkKKwkJCXsKKwkJCQlwdXRBbmROb3RpZnkoIG9iaiApOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJCisJCQlub3cgPSBUaW1lci5nZXROYW5vcygpOworCQl9CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQ2xvc2VzIHRoZSBxdWV1ZSBzbyB0aGF0IG5vIG1vcmUgaXRlbXMgbWF5IGJlIHB1dCBpbnRvIGl0LgorCSAqIEdldCB3aWxsIHJldHVybiBudWxsIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgaXRlbXMgdG8gcmV0dXJuLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpCisJeworCQlpZiAoIWNsb3NlZCkKKwkJeworCQkJY2xvc2VkID0gdHJ1ZTsKKwkJCW5vdGlmeUFsbCgpOworCQl9CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaXMgY2xvc2VkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKKwl7CisJCXJldHVybiBjbG9zZWQ7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7CisJCisJLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJJVkFURSBPUFMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBHZXRzIHRoZSBpdGVtIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4gQWRkaXRpb25hbGx5LCB3YWtlcworCSAqIHVwIHRoZSBuZXh0IG9uZSB3YWl0aW5nIGZvciB0aGUgcXVldWUsIGVpdGhlciB0byBnZXQgb3IgcHV0LgorCSAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgVCBnZXRBbmROb3RpZnkoKQorCXsKKwkJLy8gdGhlIHF1ZXVlIGlzIG5vdyBub3QgZW1wdHkuCisJCQorCQkvLyBwdXR0ZXJzIHdhaXRpbmcgc2hvdWxkIGJlIG5vdGlmaWVkIGlmIHRoZSBxdWV1ZSBpcyBub3cgZnVsbC4KKwkJYm9vbGVhbiBub3RpZnkgPSBpc0Z1bGwoKTsKKwkJCisJCU9iamVjdCBvYmogPSBnZXQwKCk7CisJCQorCQkvLyBnZXR0ZXJzIHdhaXRpbmcgc2hvdWxkIGJlIG5vdGlmaWVkIGlmIHRoZSBxdWV1ZSBpcyBub3cgbm90IGVtcHR5LgorCQlub3RpZnkgPSBub3RpZnkgfHwgIWlzRW1wdHkoKTsKKwkJCisJCWlmIChub3RpZnkpCisJCQlub3RpZnkoKTsKKwkJCisJCXJldHVybiAoVCkgb2JqOworCX0KKwkKKwkvKioKKwkgKiBQdXRzIHRoZSBpdGVtIGF0IHRoZSB0YWlsIG9mIHRoZSBxdWV1ZS4gQWRkaXRpb25hbGx5LCB3YWtlcworCSAqIHVwIHRoZSBuZXh0IG9uZSB3YWl0aW5nIGZvciB0aGUgcXVldWUsIGVpdGhlciB0byBnZXQgb3IgcHV0LgorCSAqIEBwYXJhbSBvYmogbm9uLW51bGwgaXRlbSB0byBwdXQuCisJICovCisJcHJpdmF0ZSB2b2lkIHB1dEFuZE5vdGlmeSggVCBvYmogKQorCXsKKwkJLy8gdGhlIHF1ZXVlIGlzIG5vdyBub3QgZnVsbC4KKwkJCisJCS8vIGdldHRlcnMgd2FpdGluZyBzaG91bGQgYmUgbm90aWZpZWQgaWYgdGhlIHF1ZXVlIGlzIG5vdyBlbXB0eS4KKwkJYm9vbGVhbiBub3RpZnkgPSBpc0VtcHR5KCk7CisJCQorCQlwdXQwKCBvYmogKTsKKwkJCisJCS8vIHB1dHRlcnMgd2FpdGluZyBzaG91bGQgYmUgbm90aWZpZWQgaWYgdGhlIHF1ZXVlIGlzIG5vdyBub3QgZnVsbC4KKwkJbm90aWZ5ID0gbm90aWZ5IHx8ICFpc0Z1bGwoKTsKKwkJCisJCWlmIChub3RpZnkpCisJCQlub3RpZnkoKTsKKwl9CisKKwlwcml2YXRlIGxvbmcgZ2V0RW5kVGltZSggbG9uZyBub3csIGludCBtYXhEZWxheSApCisJeworCQlyZXR1cm4gbWF4RGVsYXkgPiAwID8gbm93ICsgbWF4RGVsYXkgKiBUaW1lci5OQU5PU19QRVJfTUlMTEkgOiBMb25nLk1BWF9WQUxVRTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0VtcHR5SXRlcmF0b3IuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9FbXB0eUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1ZTk0YQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9FbXB0eUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIEBwYXJhbSA8RT4KKyAqIEBhdXRob3Igd2VydAorICovCitwdWJsaWMgY2xhc3MgRW1wdHlJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Cit7CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI2hhc05leHQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc05leHQoKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNuZXh0KCkKKwkgKi8KKwlwdWJsaWMgRSBuZXh0KCkKKwl7CisJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI3JlbW92ZSgpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKCkKKwl7CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBBbiBlbXB0eSBpdGVyYXRvciB0byB1c2Ugd2hlbiB5b3UgbmVlZCBpdC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIEl0ZXJhdG9yPE9iamVjdD4gRU1QVFlfSVRFUkFUT1IgPSBuZXcgRW1wdHlJdGVyYXRvcjxPYmplY3Q+KCk7Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvRmxleEJ1ZmZlci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0ZsZXhCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhhYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0ZsZXhCdWZmZXIuamF2YQpAQCAtMCwwICsxLDc1NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIEZsZXhCdWZmZXIgd3JhcHMgYSBieXRlIGFycmF5IGFuZCBtYW5hZ2VzIHRoZSBhY3RpdmUgcmVnaW9uIG9mCisgKiBpdCAoMC4ubGVuZ3RoKS4gSXQgYWxzbyBzdXBwb3J0cyBkeW5hbWljYWxseSBleHRlbmRpbmcgdGhlIGJ1ZmZlcgorICogYXMgbmVlZGVkLgorICogCisgKiBBIEZsZXhCdWZmZXIgYWxzbyBoYXMgYW4gaW5kZXggKHJlYWQgb3Igd3JpdGUgY3Vyc29yKS4gVGhlIHZhcmlvdXMKKyAqIGdldCBhbmQgcHV0IG9wZXJhdGlvbnMgYWx3YXlzIG9jY3VyIGF0IHRoZSBjdXJyZW50IGluZGV4LCB3aXRoIHRoZQorICogaW5kZXggYWRqdXN0ZWQgYXBwcm9wcmlhdGVseSBhZnRlcndhcmQuIEdldCB3aWxsIG5vdCBtb3ZlIGluZGV4IHBhc3QKKyAqIGxlbmd0aC4gSWYgcHV0IG5lZWRzIHRvIG1vdmUgaW5kZXggcGFzdCBsZW5ndGgsIGxlbmd0aCBpcyBhbHNvCisgKiBhZGp1c3RlZC4gVGhpcyBtYXkgY2F1c2UgdGhlIGJ5dGUgYXJyYXkgdG8gYmUgcmUtYWxsb2NhdGVkIHRvIGEKKyAqIGxhcmdlciBzaXplLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmxleEJ1ZmZlcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBGbGV4QnVmZmVyIHdpdGggaW50ZXJuYWwgYnVmZmVyIGFuZCBpbmRleCBhbmQgbGVuZ3RoIG9mIDAuCisJICovCisJcHVibGljIEZsZXhCdWZmZXIoKQorCXsKKwkJdGhpcyggbmV3IGJ5dGVbSU5JVF9CVUZGRVJfTEVOXSwgMCwgMCApOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIEZsZXhCdWZmZXIgb3V0IG9mIGFuIGV4aXN0aW5nIGJ1ZmZlciwgcmVhZHkgdG8KKwkgKiByZWFkLCB3aXRoIHRoZSBpbmRleCBzZXQgdG8gMCBhbmQgbGVuZ3RoIHNldCB0byBidWZmZXIubGVuZ3RoLgorCSAqIFRoZSBidWZmZXIgaXMgYWRvcHRlZCwgbm90IGNvcGllZC4gSWYgeW91IHdhbnQgdG8gY29weSwgdXNlCisJICogb25lIG9mIHRoZSBwdXQgbWV0aG9kcyBpbnN0ZWFkLgorCSAqIAorCSAqIE5vdGU6IHRoaXMgaXMgdGhlIHNhbWUgYXMgRmxleEJ1ZmZlciggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICkuCisJICoKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYWRvcHQuCisJICogCisJICogQHNlZSAjcHV0KGJ5dGVbXSkKKwkgKi8KKwlwdWJsaWMgRmxleEJ1ZmZlciggYnl0ZVtdIGJ1ZmZlciApCisJeworCQl0aGlzKCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgRmxleEJ1ZmZlciBvdXQgb2YgYW4gZXhpc3RpbmcgYnVmZmVyLCByZWFkeSB0bworCSAqIHJlYWQsIHdpdGggdGhlIGluZGV4IHNldCB0byAwIGFuZCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4gVGhlCisJICogYnVmZmVyIGlzIGFkb3B0ZWQsIG5vdCBjb3BpZWQuIElmIHlvdSB3YW50IHRvIGNvcHksIHVzZSBvbmUKKwkgKiBvZiB0aGUgcHV0IG1ldGhvZHMgaW5zdGVhZC4KKwkgKiAKKwkgKiBOb3RlOiB0aGlzIGlzIHRoZSBzYW1lIGFzIEZsZXhCdWZmZXIoIGJ1ZmZlciwgMCwgbGVuZ3RoICkuCisJICoKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYWRvcHQuCisJICogCisJICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBidWZmZXIgKGluZGV4IGlzCisJICogcHJlc3VtZWQgdG8gYmUgMCkuCisJICogCisJICogQHNlZSAjcHV0KGJ5dGVbXSwgaW50LCBpbnQpCisJICovCisJcHVibGljIEZsZXhCdWZmZXIoIGJ5dGVbXSBidWZmZXIsIGludCBsZW5ndGggKQorCXsKKwkJdGhpcyggYnVmZmVyLCAwLCBsZW5ndGggKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgRmxleEJ1ZmZlciBvdXQgb2YgYW4gZXhpc3RpbmcgYnVmZmVyLCByZWFkeSB0bworCSAqIHJlYWQsIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBhbmQgbGVuZ3RoLiBUaGUgYnVmZmVyIGlzIGFkb3B0ZWQsCisJICogbm90IGNvcGllZC4gSWYgeW91IHdhbnQgdG8gY29weSwgdXNlIG9uZSBvZiB0aGUgcHV0IG1ldGhvZHMKKwkgKiBpbnN0ZWFkLgorCSAqIAorCSAqIE5vdGU6IGlmIHlvdSB3YW50IHRvIHN0YXJ0IG9mZiB3cml0aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorCSAqIGFuZCBub3QgcmVhZGluZyBpdCwgc3BlY2lmeSBpbmRleCBhcyB0aGUgcGxhY2UgdG8gc3RhcnQgd3JpdGluZywKKwkgKiBhbmQgbGVuZ3RoIGFzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHZhbGlkIGFmdGVyIGluZGV4ICh3aGljaAorCSAqIG1pZ2h0IHJlYXNvbmFibHkgYmUgMCkuCisJICoKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYWRvcHQuCisJICogCisJICogQHBhcmFtIGluZGV4IHRoZSBwbGFjZSB0byBzdGFydCByZWFkaW5nIG9yIHdyaXRpbmcuCisJICogCisJICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIsCisJICogc3RhcnRpbmcgYXQgaW5kZXguCisJICogCisJICogQHNlZSAjcHV0KGJ5dGVbXSwgaW50LCBpbnQpCisJICovCisJcHVibGljIEZsZXhCdWZmZXIoIGJ5dGVbXSBidWZmZXIsIGludCBpbmRleCwgaW50IGxlbmd0aCApCisJeworCQlpZiAoYnVmZmVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJidWZmZXIgPT0gbnVsbCIgKTsKKwkJCisJCWlmIChpbmRleCA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaW5kZXggPCAwIiApOworCQkKKwkJaWYgKGxlbmd0aCA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibGVuZ3RoIDwgMCIgKTsKKwkJCisJCWlmIChpbmRleCtsZW5ndGggPiBidWZmZXIubGVuZ3RoKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImluZGV4K2xlbmd0aCA+IGJ1ZmZlci5sZW5ndGgiICk7CisJCQorCQl0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJdGhpcy5pbmRleCA9IGluZGV4OworCQl0aGlzLmxlbmd0aCA9IGluZGV4K2xlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGJ5dGUgYXJyYXkuIE1pZ2h0IGNoYW5nZSBpZiBhbnkgb3BlcmF0aW9uCisJICogbmVlZHMgdG8gZXh0ZW5kIGxlbmd0aCBwYXN0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgorCSAqLworCWZpbmFsIHB1YmxpYyBieXRlW10gZ2V0QnVmKCkKKwl7CisJCXJldHVybiBidWZmZXI7CisJfQorCQorCWZpbmFsIHByaXZhdGUgdm9pZCBlbnN1cmVMZW5ndGgoIGludCBsZW4gKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWludCBuID0gYnVmZmVyLmxlbmd0aDsKKwkJaWYgKGxlbiA8PSBuKQorCQkJcmV0dXJuOworCQkKKwkJLy8gdGhlIGJ1ZmZlciBpcyBub3QgYmlnIGVub3VnaCwgd2UgaGF2ZSB0byBleHBhbmQgaXQuCisJCQorCQlpbnQgayA9IG47CisJCWlmIChrIDwgSU5JVF9CVUZGRVJfTEVOKQorCQkJayA9IElOSVRfQlVGRkVSX0xFTjsKKwkJCisJCXdoaWxlIChsZW4gPiBrICYmIGsgPCBNQVhfQlVGRkVSX0xFTikKKwkJCWsgPSBrIDw8IDE7CisJCQorCQlpZiAobGVuID4gaykKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggImJ1ZmZlciBvdmVyZmxvdyIgKTsKKwkJCisJCWJ5dGVbXSBiID0gbmV3IGJ5dGVba107CisJCVN5c3RlbS5hcnJheWNvcHkoIGJ1ZmZlciwgMCwgYiwgMCwgbiApOworCQlidWZmZXIgPSBiOworCX0KKwkKKwlwcml2YXRlIGJ5dGVbXSBidWZmZXI7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOSVRfQlVGRkVSX0xFTiA9IDMyOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBUUklNX0JVRkZFUl9MRU4gPSAxNioxMDI0OworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfQlVGRkVSX0xFTiA9IDQqMTAyNCoxMDI0OworCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBsZW5ndGguIFRoaXMgaXMgdGhlIGxhc3QKKwkgKiBpbmRleCBvZiB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIuCisJICovCisJZmluYWwgcHVibGljIGludCBsZW5ndGgoKQorCXsKKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBuZXcgdmFsdWUgb2YgbGVuZ3RoLiBMZW5ndGggbXVzdCBiZSA+PSAwLgorCSAqIElmIGxlbmd0aCA8IGluZGV4LCBpbmRleCBpcyBhbHNvIHNldCB0byBsZW5ndGguIElmIGxlbmd0aAorCSAqIGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlIGJ1ZmZlciBpcyBleHBhbmRlZC4KKwkgKiBAcmV0dXJuIHRoaXMgZmxleCBidWZmZXIgb2JqZWN0LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxlbmd0aCA8IDAuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIG92ZXJmbG93cyBpdHMgbWF4IGxlbmd0aC4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgRmxleEJ1ZmZlciBzZXRMZW5ndGgoIGludCBsZW5ndGggKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorCXsKKwkJaWYgKGxlbmd0aCA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibGVuZ3RoIDwgMCIgKTsKKwkJCisJCWVuc3VyZUxlbmd0aCggbGVuZ3RoICk7CisJCQorCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKwkJCisJCWlmIChpbmRleCA+IGxlbmd0aCkKKwkJCWluZGV4ID0gbGVuZ3RoOworCQkKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHJpdmF0ZSBpbnQgbGVuZ3RoOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgaW5kZXguCisJICovCisJZmluYWwgcHVibGljIGludCBpbmRleCgpCisJeworCQlyZXR1cm4gaW5kZXg7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgbmV3IHZhbHVlIG9mIGluZGV4LiBJbmRleCBtdXN0IGJlID49IDAuCisJICogQHJldHVybiB0aGlzIGZsZXggYnVmZmVyIG9iamVjdC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbmRleCA8IDAgb3IgaWYgaW5kZXggPiBsZW5ndGguCisJICovCisJZmluYWwgcHVibGljIEZsZXhCdWZmZXIgc2V0SW5kZXgoIGludCBpbmRleCApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwl7CisJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBsZW5ndGgpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaW5kZXggPCAwIHx8IGluZGV4ID4gbGVuZ3RoIiApOworCQkKKwkJdGhpcy5pbmRleCA9IGluZGV4OworCQkKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCXByaXZhdGUgaW50IGluZGV4OworCisJLyoqCisJICogQHJldHVybiBsZW5ndGgoKSAtIGluZGV4KCkuIFJlc3VsdCBpcyBhbHdheXMgPj0gMC4gVGhpcyBpcyB0aGUgYW1vdW50CisJICogb2YgZGF0YSB0aGF0IGNvdWxkIGJlIHJlYWQgdXNpbmcgdGhlIHZhcmlvdXMgZm9ybXMgb2YgZ2V0LiBJdCBkb2Vzbid0CisJICogcmVhbGx5IG1lYW4gYW55dGhpbmcgaW4gcmVsYXRpb24gdG8gcHV0LgorCSAqLworCWZpbmFsIHB1YmxpYyBpbnQgYXZhaWwoKQorCXsKKwkJcmV0dXJuIGxlbmd0aCAtIGluZGV4OworCX0KKworCS8qKgorCSAqIFNldHMgYm90aCBpbmRleCBhbmQgbGVuZ3RoIHRvIDAuIFRyaW1zIHRoZSBidWZmZXIgbGVuZ3RoIGlmIGl0IGlzIHBhc3QKKwkgKiB0aGUgcmVjb21tZW5kZWQgbGltaXQuCisJICogCisJICogU2hvcnRoYW5kIGZvciBzZXRMZW5ndGgoIDAgKS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoaXMgZmxleCBidWZmZXIgb2JqZWN0LgorCSAqLworCWZpbmFsIHB1YmxpYyBGbGV4QnVmZmVyIHJlc2V0KCkKKwl7CisJCWluZGV4ID0gMDsKKwkJbGVuZ3RoID0gMDsKKwkJCisJCWlmIChidWZmZXIubGVuZ3RoID4gVFJJTV9CVUZGRVJfTEVOKQorCQkJYnVmZmVyID0gbmV3IGJ5dGVbVFJJTV9CVUZGRVJfTEVOXTsKKwkJCisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIENvbXBhY3RzIHRoZSBidWZmZXIgYnkgbW92aW5nIHJlbWFpbmluZyBkYXRhIChmcm9tIGluZGV4IHRvIGxlbmd0aCkKKwkgKiB0byB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlci4gU2V0cyBpbmRleCB0byAwLCBhbmQgc2V0cyBsZW5ndGggdG8KKwkgKiBhdmFpbCAoYmVmb3JlIGluZGV4IHdhcyBjaGFuZ2VkKS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoaXMgZmxleCBidWZmZXIgb2JqZWN0LgorCSAqLworCWZpbmFsIHB1YmxpYyBGbGV4QnVmZmVyIGNvbXBhY3QoKQorCXsKKwkJaWYgKGluZGV4ID09IDApCisJCQlyZXR1cm4gdGhpczsKKwkJCisJCWludCBuID0gYXZhaWwoKTsKKwkJaWYgKG4gPT0gMCkKKwkJeworCQkJcmVzZXQoKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCQorCQlTeXN0ZW0uYXJyYXljb3B5KCBidWZmZXIsIGluZGV4LCBidWZmZXIsIDAsIG4gKTsKKwkJCisJCWluZGV4ID0gMDsKKwkJbGVuZ3RoID0gbjsKKwkJCisJCXJldHVybiB0aGlzOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB1bnNpZ25lZCBieXRlIHZhbHVlIGF0IGluZGV4LCBhbmQgYWRqdXN0cyBpbmRleAorCSAqIGJ5IGFkZGluZyBvbmUuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhdmFpbCgpIDwgMS4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgaW50IGdldCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJY2hlY2tBdmFpbCggMSApOworCQkKKwkJcmV0dXJuIGJ1ZmZlcltpbmRleCsrXSAmIDI1NTsKKwl9CisJCisJLyoqCisJICogQ29waWVzIGRhdGEgZnJvbSB0aGUgYnl0ZSBhcnJheSB0byBidWYgYXMgaWYgYnkgcmVwZWF0ZWQKKwkgKiBjYWxscyB0byBnZXQoKS4KKwkgKiBAcGFyYW0gYnVmIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGRhdGEuIEF0IG1vc3QKKwkgKiBtaW4oIGJ1Zi5sZW5ndGgsIGF2YWlsKCkgKSBieXRlcyBhcmUgdHJhbnNmZXJyZWQuCisJICogQHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgdHJhbnNmZXJyZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhdmFpbCgpIDwgMS4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgaW50IGdldCggYnl0ZVtdIGJ1ZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGdldCggYnVmLCAwLCBidWYubGVuZ3RoICk7CisJfQorCQorCS8qKgorCSAqIENvcGllcyBkYXRhIGZyb20gdGhlIGJ5dGUgYXJyYXkgdG8gYnVmIGFzIGlmIGJ5IHJlcGVhdGVkCisJICogY2FsbHMgdG8gZ2V0KCkuCisJICogQHBhcmFtIGJ1ZiBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBkYXRhLiBBdCBtb3N0CisJICogbWluKCBsZW4sIGF2YWlsKCkgKSBieXRlcyBhcmUgdHJhbnNmZXJyZWQsIHN0YXJ0aW5nCisJICogYXQgb2ZmLgorCSAqIEBwYXJhbSBvZmYgdGhlIGluZGV4IGluIGJ1ZiB0byByZWNlaXZlIHRoZSBkYXRhLgorCSAqIE9mZiBtdXN0IGJlID49IDAgJiYgPD0gYnVmLmxlbmd0aC4KKwkgKiBAcGFyYW0gbGVuIHRoZSBtYXggYW1vdW50IG9mIGRhdGEgdG8gdHJhbnNmZXIuIExlbgorCSAqIG11c3QgYmUgPj0gMCBhbmQgPD0gYnVmLmxlbmd0aCAtIG9mZi4KKwkgKiBAcmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSB0cmFuc2ZlcnJlZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGF2YWlsKCkgPCAxCisJICovCisJZmluYWwgcHVibGljIGludCBnZXQoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4gKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWNoZWNrQnVmKCBidWYsIG9mZiwgbGVuICk7CisJCQorCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gMDsKKwkJCisJCWNoZWNrQXZhaWwoIDEgKTsKKwkJCisJCWludCBuID0gTWF0aC5taW4oIGxlbiwgYXZhaWwoKSApOworCQkKKwkJU3lzdGVtLmFycmF5Y29weSggYnVmZmVyLCBpbmRleCwgYnVmLCBvZmYsIG4gKTsKKwkJaW5kZXggKz0gbjsKKwkJCisJCXJldHVybiBuOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgYXZhaWxhYmxlIGJ5dGUuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhdmFpbCgpIDwgMS4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgYnl0ZSBnZXRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworCQljaGVja0F2YWlsKCAxICk7CisJCQorCQlyZXR1cm4gYnVmZmVyW2luZGV4KytdOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGxpdHRsZUVuZGlhbiA9IGZhbHNlOworCisJLyoqCisJICogQHJldHVybiBhIHNob3J0IGNvbXBvc2VkIGZyb20gdGhlIG5leHQgMiBieXRlcy4gTGl0dGxlLWVuZGlhbi4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGF2YWlsKCkgPCAyLgorCSAqLworCWZpbmFsIHB1YmxpYyBzaG9ydCBnZXRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkJY2hlY2tBdmFpbCggMiApOworCisJCWlmIChsaXR0bGVFbmRpYW4pCisJCXsKKwkJCS8vIGxpdHRsZS1lbmRpYW4KKwkJCWludCB2YWx1ZSA9IGJ1ZmZlcltpbmRleCsrXSAmIDI1NTsKKwkJCXJldHVybiAoc2hvcnQpICh2YWx1ZSArICgoYnVmZmVyW2luZGV4KytdICYgMjU1KSA8PCA4KSk7CisJCX0KKwkJCisJCS8vIGJpZy1lbmRpYW4KKwkJaW50IHZhbHVlID0gYnVmZmVyW2luZGV4KytdOworCQlyZXR1cm4gKHNob3J0KSAoKHZhbHVlIDw8IDgpICsgKGJ1ZmZlcltpbmRleCsrXSAmIDI1NSkpOworICAgIH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIGFuIGludCBjb21wb3NlZCBmcm9tIHRoZSBuZXh0IDQgYnl0ZXMuIExpdHRsZS1lbmRpYW4uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhdmFpbCgpIDwgNC4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgaW50IGdldEludCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJY2hlY2tBdmFpbCggNCApOworCisJCWlmIChsaXR0bGVFbmRpYW4pCisJCXsKKwkJCS8vIGxpdHRsZS1lbmRpYW4KKwkJCWludCB2YWx1ZSA9IGJ1ZmZlcltpbmRleCsrXSAmIDI1NTsKKwkJCXZhbHVlICs9IChidWZmZXJbaW5kZXgrK10gJiAyNTUpIDw8IDg7CisJCQl2YWx1ZSArPSAoYnVmZmVyW2luZGV4KytdICYgMjU1KSA8PCAxNjsKKwkJCXJldHVybiB2YWx1ZSArICgoYnVmZmVyW2luZGV4KytdICYgMjU1KSA8PCAyNCk7CisJCX0KKwkJCisJCS8vIGJpZy1lbmRpYW4KKwkJaW50IHZhbHVlID0gYnVmZmVyW2luZGV4KytdOworCQl2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIChidWZmZXJbaW5kZXgrK10gJiAyNTUpOworCQl2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIChidWZmZXJbaW5kZXgrK10gJiAyNTUpOworCQlyZXR1cm4gKHZhbHVlIDw8IDgpICsgKGJ1ZmZlcltpbmRleCsrXSAmIDI1NSk7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIGxvbmcgY29tcG9zZWQgZnJvbSB0aGUgbmV4dCA4IGJ5dGVzLiBMaXR0bGUtZW5kaWFuLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYXZhaWwoKSA8IDguCisJICovCisJZmluYWwgcHVibGljIGxvbmcgZ2V0TG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkJY2hlY2tBdmFpbCggOCApOworCisJCWlmIChsaXR0bGVFbmRpYW4pCisJCXsKKwkJCS8vIGxpdHRsZS1lbmRpYW4KKwkJCWxvbmcgdmFsdWUgPSBidWZmZXJbaW5kZXgrK10gJiAyNTU7CisJCQl2YWx1ZSArPSAobG9uZykoYnVmZmVyW2luZGV4KytdICYgMjU1KSA8PCA4OworCQkJdmFsdWUgKz0gKGxvbmcpKGJ1ZmZlcltpbmRleCsrXSAmIDI1NSkgPDwgMTY7CisJCQl2YWx1ZSArPSAobG9uZykoYnVmZmVyW2luZGV4KytdICYgMjU1KSA8PCAyNDsKKwkJCXZhbHVlICs9IChsb25nKShidWZmZXJbaW5kZXgrK10gJiAyNTUpIDw8IDMyOworCQkJdmFsdWUgKz0gKGxvbmcpKGJ1ZmZlcltpbmRleCsrXSAmIDI1NSkgPDwgNDA7CisJCQl2YWx1ZSArPSAobG9uZykoYnVmZmVyW2luZGV4KytdICYgMjU1KSA8PCA0ODsKKwkJCXJldHVybiB2YWx1ZSArICgobG9uZykoYnVmZmVyW2luZGV4KytdICYgMjU1KSA8PCA1Nik7CisJCX0KKwkJCisJCS8vIGJpZy1lbmRpYW4KKwkJbG9uZyB2YWx1ZSA9IGJ1ZmZlcltpbmRleCsrXTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoYnVmZmVyW2luZGV4KytdICYgMjU1KTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoYnVmZmVyW2luZGV4KytdICYgMjU1KTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoYnVmZmVyW2luZGV4KytdICYgMjU1KTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoYnVmZmVyW2luZGV4KytdICYgMjU1KTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoYnVmZmVyW2luZGV4KytdICYgMjU1KTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoYnVmZmVyW2luZGV4KytdICYgMjU1KTsKKwkJcmV0dXJuICh2YWx1ZSA8PCA4KSArIChidWZmZXJbaW5kZXgrK10gJiAyNTUpOworICAgIH0KKworCS8qKgorCSAqIEByZXR1cm4gYSBmbG9hdCBmcm9tIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlcy4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGF2YWlsKCkgPCA0LgorCSAqLworCWZpbmFsIHB1YmxpYyBmbG9hdCBnZXRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkJcmV0dXJuIEZsb2F0LmludEJpdHNUb0Zsb2F0KCBnZXRJbnQoKSApOworICAgIH0KKworCS8qKgorCSAqIEByZXR1cm4gYSBkb3VibGUgZnJvbSB0aGUgbmV4dCBhdmFpbGFibGUgYnl0ZXMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhdmFpbCgpIDwgOC4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgZG91YmxlIGdldERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkJcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKCBnZXRMb25nKCkgKTsKKyAgICB9CisKKwkvKioKKwkgKiBGaWxscyBhIGJ1ZmZlciBmdWxseSBmcm9tIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlcy4KKwkgKiBAcGFyYW0gYgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYXZhaWwoKSA8IGIubGVuZ3RoLgorCSAqLworCWZpbmFsIHB1YmxpYyB2b2lkIGdldEZ1bGx5KCBieXRlW10gYiApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkgICAgY2hlY2tBdmFpbCggYi5sZW5ndGggKTsKKwkgICAgaW50IG4gPSBnZXQoIGIsIDAsIGIubGVuZ3RoICk7CisJICAgIGFzc2VydCBuID09IGIubGVuZ3RoOworICAgIH0KKwkKKwkvKioKKwkgKiBQdXRzIGEgYnl0ZSBpbnRvIHRoZSBidWZmZXIgYXQgdGhlIGN1cnJlbnQgaW5kZXgsCisJICogdGhlbiBhZGp1c3RzIHRoZSBpbmRleCBieSBvbmUuIEFkanVzdHMgdGhlIGxlbmd0aAorCSAqIGFzIG5lY2Vzc2FyeS4gVGhlIGJ1ZmZlciBpcyBleHBhbmRlZCBpZiBuZWVkZWQuCisJICogQHBhcmFtIGIKKwkgKiBAcmV0dXJuIHRoaXMgZmxleCBidWZmZXIgb2JqZWN0LgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBvdmVyZmxvd3MgaXRzIG1heCBsZW5ndGguCisJICovCisJZmluYWwgcHVibGljIEZsZXhCdWZmZXIgcHV0KCBpbnQgYiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJZW5zdXJlTGVuZ3RoKCBpbmRleCsxICk7CisJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSBiOworCQlmaXhMZW5ndGgoKTsKKwkJCisJCXJldHVybiB0aGlzOworCX0KKwkKKwkvKioKKwkgKiBQdXRzIHNvbWUgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGFzIGlmIGJ5IHJlcGVhdGVkCisJICogY2FsbHMgdG8gcHV0KCkuCisJICogQHBhcmFtIGJ1ZiB0aGUgc291cmNlIG9mIHRoZSBieXRlcyB0byBwdXQuIFRoZSBlbnRpcmUKKwkgKiBhcnJheSBvZiBieXRlcyBpcyBwdXQuCisJICogQHJldHVybiB0aGlzIGZsZXggYnVmZmVyIG9iamVjdC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgb3ZlcmZsb3dzIGl0cyBtYXggbGVuZ3RoLgorCSAqLworCWZpbmFsIHB1YmxpYyBGbGV4QnVmZmVyIHB1dCggYnl0ZVtdIGJ1ZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHB1dCggYnVmLCAwLCBidWYubGVuZ3RoICk7CisJfQorCQorCS8qKgorCSAqIFB1dHMgc29tZSBieXRlcyBpbnRvIHRoZSBidWZmZXIgYXMgaWYgYnkgcmVwZWF0ZWQKKwkgKiBjYWxscyB0byBwdXQoKS4KKwkgKiBAcGFyYW0gYnVmIHRoZSBzb3VyY2Ugb2YgdGhlIGJ5dGVzIHRvIHB1dC4KKwkgKiBAcGFyYW0gb2ZmIHRoZSBpbmRleCB0byB0aGUgZmlyc3QgYnl0ZSB0byBwdXQuCisJICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dC4KKwkgKiBAcmV0dXJuIHRoaXMgZmxleCBidWZmZXIgb2JqZWN0LgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBvdmVyZmxvd3MgaXRzIG1heCBsZW5ndGguCisJICovCisJZmluYWwgcHVibGljIEZsZXhCdWZmZXIgcHV0KCBieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQljaGVja0J1ZiggYnVmLCBvZmYsIGxlbiApOworCQkKKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuIHRoaXM7CisJCQorCQllbnN1cmVMZW5ndGgoIGluZGV4K2xlbiApOworCQlTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiwgYnVmZmVyLCBpbmRleCwgbGVuICk7CisJCWluZGV4ICs9IGxlbjsKKwkJZml4TGVuZ3RoKCk7CisJCQorCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBDb3BpZXMgdGhlIGF2YWlsYWJsZSBieXRlcyBmcm9tIGJ1ZiBpbnRvIGJ1ZmZlciBhcyBpZiBieQorCSAqIHJlcGVhdGVkIGV4ZWN1dGlvbiBvZiBwdXQoIGJ1Zi5nZXQoKSApLgorCSAqIEBwYXJhbSBidWYgdGhlIHNvdXJjZSBvZiB0aGUgYnl0ZXMgdG8gcHV0LiBBbGwgYXZhaWxhYmxlCisJICogYnl0ZXMgYXJlIGNvcGllZC4KKwkgKiBAcmV0dXJuIHRoaXMgZmxleCBidWZmZXIgb2JqZWN0LgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBvdmVyZmxvd3MgaXRzIG1heCBsZW5ndGguCisJICovCisJZmluYWwgcHVibGljIEZsZXhCdWZmZXIgcHV0KCBGbGV4QnVmZmVyIGJ1ZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJaW50IG4gPSBidWYuYXZhaWwoKTsKKwkJcHV0KCBidWYuYnVmZmVyLCBidWYuaW5kZXgsIG4gKTsKKwkJYnVmLnNraXAoIG4sIGZhbHNlICk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIENvcGllcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGJ1ZiBpbnRvIGJ1ZmZlcgorCSAqIGFzIGlmIGJ5IHJlcGVhdGVkIGV4ZWN1dGlvbiBvZiBwdXQoIGJ1Zi5nZXQoKSApLgorCSAqIEBwYXJhbSBidWYgdGhlIHNvdXJjZSBvZiB0aGUgYnl0ZXMgdG8gcHV0LgorCSAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBwdXQuIExlbiBtdXN0IGJlIDw9CisJICogYnVmLmF2YWlsKCkuCisJICogQHJldHVybiB0aGlzIGZsZXggYnVmZmVyIG9iamVjdC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgb3ZlcmZsb3dzIGl0cyBtYXggbGVuZ3RoLgorCSAqLworCWZpbmFsIHB1YmxpYyBGbGV4QnVmZmVyIHB1dCggRmxleEJ1ZmZlciBidWYsIGludCBsZW4gKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWlmIChsZW4gPiBidWYuYXZhaWwoKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJsZW4gPiBidWYuYXZhaWwoKSIgKTsKKwkJCisJCXB1dCggYnVmLmJ1ZmZlciwgYnVmLmluZGV4LCBsZW4gKTsKKwkJYnVmLnNraXAoIGxlbiwgZmFsc2UgKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogUHV0cyB0aGUgYnl0ZS4KKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJZmluYWwgcHVibGljIHZvaWQgcHV0Qnl0ZSggYnl0ZSB2YWx1ZSApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkJZW5zdXJlTGVuZ3RoKCBpbmRleCsxICk7CisJCQorCQlidWZmZXJbaW5kZXgrK10gPSB2YWx1ZTsKKwkJCisJCWZpeExlbmd0aCgpOworICAgIH0KKworCS8qKgorCSAqIFB1dHMgdGhlIHNob3J0IGFzIHRoZSBuZXh0IDIgYnl0ZXMuIExpdHRsZS1lbmRpYW4uCisJICogQHBhcmFtIHZhbHVlCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCWZpbmFsIHB1YmxpYyB2b2lkIHB1dFNob3J0KCBzaG9ydCB2YWx1ZSApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkJZW5zdXJlTGVuZ3RoKCBpbmRleCsyICk7CisJCQorCQlpZiAobGl0dGxlRW5kaWFuKQorCQl7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgdmFsdWU7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOworCQl9CisJCWVsc2UKKwkJeworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpICh2YWx1ZSA+Pj4gOCk7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgdmFsdWU7CisJCX0KKwkJCisJCWZpeExlbmd0aCgpOworICAgIH0KKworCS8qKgorCSAqIFB1dHMgdGhlIGludCBhcyB0aGUgbmV4dCA0IGJ5dGVzLiBMaXR0bGUtZW5kaWFuLgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlmaW5hbCBwdWJsaWMgdm9pZCBwdXRJbnQoIGludCB2YWx1ZSApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKwkJZW5zdXJlTGVuZ3RoKCBpbmRleCs0ICk7CisJCQorCQlpZiAobGl0dGxlRW5kaWFuKQorCQl7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgdmFsdWU7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDI0KTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDE2KTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDgpOworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpIHZhbHVlOworCQl9CisJCQorCQlmaXhMZW5ndGgoKTsKKyAgICB9CisKKwkvKioKKwkgKiBQdXRzIHRoZSBsb25nIGFzIHRoZSBuZXh0IDggYnl0ZXMuIExpdHRsZS1lbmRpYW4uCisJICogQHBhcmFtIHZhbHVlCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCWZpbmFsIHB1YmxpYyB2b2lkIHB1dExvbmcoIGxvbmcgdmFsdWUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisJCWVuc3VyZUxlbmd0aCggaW5kZXgrOCApOworCQkKKwkJaWYgKGxpdHRsZUVuZGlhbikKKwkJeworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpIHZhbHVlOworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDMyKTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4gNDApOworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA0OCk7CisJCQlidWZmZXJbaW5kZXgrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDU2KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDU2KTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDQ4KTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDQwKTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDMyKTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDI0KTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDE2KTsKKwkJCWJ1ZmZlcltpbmRleCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDgpOworCQkJYnVmZmVyW2luZGV4KytdID0gKGJ5dGUpIHZhbHVlOworCQl9CisJCQorCQlmaXhMZW5ndGgoKTsKKyAgICB9CisKKwkvKioKKwkgKiBQdXRzIHRoZSBmbG9hdCBhcyB0aGUgbmV4dCA0IGJ5dGVzLiBMaXR0bGUtZW5kaWFuLgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlmaW5hbCBwdWJsaWMgdm9pZCBwdXRGbG9hdCggZmxvYXQgdmFsdWUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisJCXB1dEludCggRmxvYXQuZmxvYXRUb0ludEJpdHMoIHZhbHVlICkgKTsKKyAgICB9CisKKwkvKioKKwkgKiBQdXRzIHRoZSBkb3VibGUgYXMgdGhlIG5leHQgOCBieXRlcy4gTGl0dGxlLWVuZGlhbi4KKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJZmluYWwgcHVibGljIHZvaWQgcHV0RG91YmxlKCBkb3VibGUgdmFsdWUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisJCXB1dExvbmcoIERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCB2YWx1ZSApICk7CisgICAgfQorCisJLyoqCisJICogQWRqdXN0cyBpbmRleCBhcyBpZiBieSBhIGdldCBvciBwdXQgYnV0IHdpdGhvdXQgdHJhbnNmZXJyaW5nCisJICogYW55IGRhdGEuIFRoaXMgY291bGQgYmUgdXNlZCB0byBza2lwIG92ZXIgYSBkYXRhIGl0ZW0gaW4gYW4KKwkgKiBpbnB1dCBvciBvdXRwdXQgYnVmZmVyLgorCSAqIAorCSAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwIG92ZXIuIExlbiBtdXN0IGJlCisJICogPj0gMC4gSWYgcHV0IGlzIGZhbHNlLCBpdCBpcyBhbiBlcnJvciBpZiBsZW4gPiBhdmFpbCgpLgorCSAqIElmIHB1dCBpcyB0cnVlLCB0aGUgYnVmZmVyIG1heSBiZSBleHRlbmRlZCAoYW5kIHRoZSBidWZmZXIKKwkgKiBsZW5ndGggYWRqdXN0ZWQpLgorCSAqIAorCSAqIEBwYXJhbSBwdXQgaWYgdHJ1ZSBpdCBpcyBvayB0byBleHRlbmQgdGhlIGxlbmd0aCBvZiB0aGUKKwkgKiBidWZmZXIuCisJICogCisJICogQHJldHVybiB0aGlzIGZsZXggYnVmZmVyIG9iamVjdC4KKwkgKiAKKwkgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBpZiBwdXQgaXMgZmFsc2UgYW5kIGxlbiA+IGF2YWlsKCkuCisJICogCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgbWF4IGJ1ZmZlciBzaXplIGlzIGV4Y2VlZGVkLgorCSAqLworCWZpbmFsIHB1YmxpYyBGbGV4QnVmZmVyIHNraXAoIGludCBsZW4sIGJvb2xlYW4gcHV0ICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlpZiAobGVuIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJsZW4gPCAwIiApOworCQkKKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuIHRoaXM7CisJCQorCQlpZiAocHV0KQorCQl7CisJCQllbnN1cmVMZW5ndGgoIGluZGV4K2xlbiApOworCQkJaW5kZXggKz0gbGVuOworCQkJZml4TGVuZ3RoKCk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQkKKwkJY2hlY2tBdmFpbCggbGVuICk7CisJCQorCQlpbmRleCArPSBsZW47CisJCQorCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBJZiBpbmRleCBoYXMgbW92ZWQgcGFzdCBsZW5ndGggZHVyaW5nIGEgcHV0LCB0aGVuIGFkanVzdCBsZW5ndGgKKwkgKiB0byB0cmFjayBpbmRleC4KKwkgKi8KKwlmaW5hbCBwcml2YXRlIHZvaWQgZml4TGVuZ3RoKCkKKwl7CisJCWlmIChpbmRleCA+IGxlbmd0aCkKKwkJCWxlbmd0aCA9IGluZGV4OworCX0KKworCS8qKgorCSAqIENoZWNrcyBidWYsIG9mZiwgYW5kIGxlbiBmb3IgYmVpbmcgcmVhc29uYWJsZS4KKwkgKiBAcGFyYW0gYnVmCisJICogQHBhcmFtIG9mZgorCSAqIEBwYXJhbSBsZW4KKwkgKi8KKwlmaW5hbCBwcml2YXRlIHZvaWQgY2hlY2tCdWYoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQorCXsKKwkJaWYgKGJ1ZiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAiYnVmID09IG51bGwiICk7CisJCQorCQlpZiAob2ZmIDwgMCB8fCBvZmYgPiBidWYubGVuZ3RoKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm9mZiA8IDAgfHwgb2ZmID4gYnVmLmxlbmd0aCIgKTsKKwkJCisJCWlmIChsZW4gPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImxlbiA8IDAiICk7CisJCQorCQlpZiAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAib2ZmK2xlbiA+IGJ1Zi5sZW5ndGgiICk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBieXRlcy4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJZmluYWwgcHVibGljIGJ5dGVbXSBnZXRBdmFpbEJ5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbYXZhaWwoKV07CisJCWdldCggYnVmICk7CisJCXJldHVybiBidWY7CisJfQorCQorCS8qKgorCSAqIENoZWNrcyB0aGF0IHRoZXJlIGFyZSBlbm91Z2ggYnl0ZXMgdG8gZm9yIGEgcmVhZC4KKwkgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggcmVxdWlyZWQgYnkgYSByZWFkIG9wZXJhdGlvbi4KKwkgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBpZiBsZW4gPiBhdmFpbCgpLgorCSAqLworCWZpbmFsIHByaXZhdGUgdm9pZCBjaGVja0F2YWlsKCBpbnQgbGVuICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlpZiAobGVuID4gYXZhaWwoKSkKKwkJCXRocm93IG5ldyBFT0ZFeGNlcHRpb24oICJsZW4gPiBhdmFpbCgpIiApOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvSGFzaC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0hhc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTBhYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0hhc2guamF2YQpAQCAtMCwwICsxLDUwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKKy8qKgorICogQSBwcmV0dHkgY29vbCBoYXNoIGZ1bmN0aW9uIHdoaWNoIGhhcyBmZXcgY29sbGlzaW9ucy4KKyAqLworcHVibGljIGNsYXNzIEhhc2gKK3sKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgbmFtZSB0byBiZSB1c2VkIGFzIHRoZSBpZCB3aGVuCisgICAgICogY29uc3RydWN0aW5nIGFuIElkTmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvciBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIGEgaGFzaCBvZiBuYW1lIGluIHRoZSB1bmljb2RlIGNoYXJhY3RlciBlbmNvZGluZyB3aGljaCBpcworICAgICAqIHZlcnkgbGlrZWx5IHRvIGJlIHVuaXF1ZSBvdmVyIHJlYXNvbmFibGUgbmFtZSBzcGFjZXMuIENvbGxpc2lvbnMKKyAgICAgKiBzaG91bGQgYmUgdmVyeSB1bmxpa2VseSBhcyB0aGV5IHdpbGwgZm9yY2UgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZQorICAgICAqIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaCggU3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAJLy8gY29tYmluYXRpb24gb2YgZGpiMiBhbmQgc2RibSBoYXNoIGFsZ29yaXRobToKKyAgICAgICAgaW50IGhhc2ggPSA1MzgxOworICAgICAgICBpbnQgbiA9IG5hbWUubGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICB7CisgICAgICAgIAljaGFyIGMgPSBuYW1lLmNoYXJBdCggaSApOworICAgICAgICAJaW50IGg2ID0gaGFzaCA8PCA2OworICAgICAgICAJaGFzaCA9IChoNiA8PCAxMCkgKyBoNiAtIGhhc2ggKyBjOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9JZEdlbmVyYXRvci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0lkR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxODBlMAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9JZEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworLyoqCisgKiBTeW5jaHJvbm91c2x5IGdlbmVyYXRlcyBsb25nIGlkIG51bWJlcnMuCisgKi8KK2ZpbmFsIHB1YmxpYyBjbGFzcyBJZEdlbmVyYXRvcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIElkR2VuZXJhdG9yIHdpdGggdGhlIGRlZmF1bHQgc3RhcnRpbmcgcG9pbnQgb2YgMQorCSAqIGFuZCB0aGUgZGVmYXVsdCBzdHJpZGUgb2YgMS4KKwkgKi8KKwlwdWJsaWMgSWRHZW5lcmF0b3IoKQorCXsKKwkJdGhpcyggMSwgMSApOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJZEdlbmVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgcG9pbnQKKwkgKiBhbmQgdGhlIGRlZmF1bHQgc3RyaWRlIG9mIDEuCisJICoKKwkgKiBAcGFyYW0gbmV4dElkCisJICovCisJcHVibGljIElkR2VuZXJhdG9yKCBsb25nIG5leHRJZCApCisJeworCQl0aGlzKCBuZXh0SWQsIDEgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgSWRHZW5lcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0aW5nIHBvaW50CisJICogYW5kIHRoZSBzcGVjaWZpZWQgc3RyaWRlOworCSAqIEBwYXJhbSBuZXh0SWQKKwkgKiBAcGFyYW0gc3RyaWRlCisJICovCisJcHVibGljIElkR2VuZXJhdG9yKCBsb25nIG5leHRJZCwgaW50IHN0cmlkZSApCisJeworCQlpZiAoc3RyaWRlIDw9IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAic3RyaWRlIDw9IDAiICk7CisJCQorCQl0aGlzLm5leHRJZCA9IG5leHRJZDsKKwkJdGhpcy5zdHJpZGUgPSBzdHJpZGU7CisJfQorCQorCXByaXZhdGUgbG9uZyBuZXh0SWQ7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgc3RyaWRlOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgaWQgaW4gc2VxdWVuY2UuCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBsb25nIG5leHQoKQorCXsKKwkJbG9uZyBpZCA9IG5leHRJZDsKKwkJbmV4dElkICs9IHN0cmlkZTsKKwkJcmV0dXJuIGlkOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9JbnRDb3VudGVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvSW50Q291bnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmQ1YWEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvSW50Q291bnRlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworLyoqCisgKiBBIHNhZmUgaW50ZWdlciBjb3VudGVyLgorICovCitwdWJsaWMgY2xhc3MgSW50Q291bnRlcgoreworCS8qKgorCSAqIEFkanVzdHMgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIGJ5IGsuCisJICogQHBhcmFtIGsgdGhlIGFkanVzdG1lbnQgdG8gdGhlIGNvdW50ZXIuCisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjb3VudGVyLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGFkanVzdCggaW50IGsgKQorICAgIHsKKyAgICAgICAgdmFsdWUgKz0gazsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisJCisJcHJpdmF0ZSBpbnQgdmFsdWU7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0xvZy5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL0xvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTAyNWIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvTG9nLmphdmEKQEAgLTAsMCArMSwxNzU4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBMb2cgaW1wbGVtZW50cyBhIHN0YW5kYXJkaXplZCByZXBvcnRpbmcgbWVjaGFuaXNtIGZvciBuYW1lZAorICogZXZlbnRzIHdoaWNoIGdldCByZXBvcnRlZCB0byBhIHZhcmlldHkgb2Ygc2lua3MgaW4gYSB2YXJpZXR5CisgKiBvZiBmb3JtYXRzLgorICogCisgKiBOT1RFOiBMb2cucmVwb3J0IGlzIG5vdCBhIHN1YnN0aXR1dGUgZm9yIFN5c3RlbS5vdXQucHJpbnRmLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiBMb2cucmVwb3J0KCAiU3lzdGVtVXAiLCAidGltZSIsIG5ldyBEYXRlKCkgKTsKKyAqIAorICogVGhlIGV2ZW50IGlzICJTeXN0ZW1VcCIsIGFuZCB0aGVyZSBpcyBvbmUgYWRkaXRpb25hbCBwYXJhbWV0ZXIKKyAqIG5hbWVkICJ0aW1lIiB3aGljaCBoYXMgYSB2YWx1ZSBvZiB0aGUgY3VycmVudCBkYXRlL3RpbWUuCisgKiAKKyAqIFVuZGVyIHRoZSBob29kLCB0aGUgZXZlbnQgaXMgdXNlZCB0byBzZWxlY3QgYSBUZW1wbGF0ZSwKKyAqIHdoaWNoIHRoZW4gY29udHJvbHMgaG93IHRoZSBldmVudCBpcyBoYW5kbGVkLiBUaGUgdGVtcGxhdGUKKyAqIGtub3dzIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBldmVudCwgcGVyaGFwcyBob3cgdGhlIGV2ZW50CisgKiBpcyBmb3JtYXR0ZWQsIGV0Yy4gSXQgaXMgZG9uZSB0aGlzIHdheSB0byBtaW5pbWl6ZSBob3cgbXVjaAorICogd29yayBpcyBkb25lIHVudGlsIGl0IGlzIHRpbWUgdG8gYWN0dWFsbHkgZG8gc29tZXRoaW5nIHdpdGgKKyAqIHRoZSBsb2cgZW50cnkuIEZvciBleGFtcGxlLCBpZiB0aGUgbG9nIGVudHJ5IGlzIG5vdCBpbXBvcnRhbnQKKyAqIGVub3VnaCwgaXQgd2lsbCBiZSBpZ25vcmVkLiBBbnkgd29yayBkb25lIHRvIGZvcm1hdCBpdCB3aWxsIGJlCisgKiB3YXN0ZWQgZWZmb3J0LiBGdXJ0aGVybW9yZSwgYSBwcmVmb3JtbWF0ZWQgbG9nIGVudHJ5IGNhbm5vdCBiZQorICogbG9jYWxpemVkLgorICovCitwdWJsaWMgY2xhc3MgTG9nCit7CisJcHJpdmF0ZSBMb2coKQorCXsKKwkJLy8gY2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUZBVUxUIERBVEUgRk9STUFUIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIFRoZSBkZWZhdWx0IGRhdGUgZm9ybWF0IHVzZWQgYnkgZW50cnkgZm9ybWF0dGVycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERhdGVGb3JtYXQgZGVmYXVsdERhdGVGb3JtYXQKKwkJPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCggIkhIOm1tOnNzLlNTUyIgKTsKKwkKKwkvLy8vLy8vLy8vLy8vLy8KKwkvLyBURU1QTEFURVMgLy8KKwkvLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIFJlZ2lzdGVycyB0aGUgdGVtcGxhdGUsIG1ha2luZyBpdCBnbG9iYWxseSBhdmFpbGFibGUuIEl0IGlzbid0IG5lY2Vzc2FyeQorCSAqIHRvIHJlZ2lzdGVyIGEgdGVtcGxhdGUgdG8gdXNlIGl0IGRpcmVjdGx5LCBidXQgTG9nLnJlcG9ydCBvbmx5IHdvcmtzCisJICogd2l0aCByZWdpc3RlcmVkIHRlbXBsYXRlcy4KKwkgKiAKKwkgKiBAcGFyYW0gdGVtcGxhdGUgdGhlIHRlbXBsYXRlIHRvIHJlZ2lzdGVyLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIHRoYXQgd2FzIHJlZ2lzdGVyZWQuCisJICogCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRlbXBsYXRlIG5hbWUgaGFzIGFscmVhZHkKKwkgKiBiZWVuIHJlZ2lzdGVyZWQuCisJICovCisJcHVibGljIHN0YXRpYyBUZW1wbGF0ZSByZWdpc3RlciggVGVtcGxhdGUgdGVtcGxhdGUgKQorCXsKKwkJc3luY2hyb25pemVkICh0ZW1wbGF0ZXMpCisJCXsKKwkJCWlmIChoYXNUZW1wbGF0ZSggdGVtcGxhdGUuZ2V0TmFtZSgpICkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJInRlbXBsYXRlICciK3RlbXBsYXRlLmdldE5hbWUoKSsiJyBhbHJlYWR5IHJlZ2lzdGVyZWQiICk7CisJCQlhZGRUZW1wbGF0ZSggdGVtcGxhdGUgKTsKKwkJfQorCQkKKwkJc3luY2hyb25pemVkICh0ZW1wbGF0ZSkKKwkJeworCQkJc3luYyggdGVtcGxhdGUgKTsKKwkJfQorCQkKKwkJcmV0dXJuIHRlbXBsYXRlOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSB0ZW1wbGF0ZSBmb3IgYW4gZXZlbnQgYW5kIHJlZ2lzdGVycyBpdCBhbGwgaW4gb25lIHN0ZXAuCisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50LgorCSAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgY2F0ZWdvcnkgb2YgdGhlIGV2ZW50LgorCSAqIEBwYXJhbSBlbmFibGUgZmxhZyB3aGljaCBhbGxvd3MgcmVwb3J0aW5nIG9mIHRoZSBldmVudC4KKwkgKiBAcGFyYW0gZmllbGRzIHRoZSBsaXN0IG9mIGZpZWxkcyBvZiB0aGUgZXZlbnQuCisJICogCisJICogQHJldHVybiB0aGUgdGVtcGxhdGUgdGhhdCB3YXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZC4KKwkgKiAKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdGVtcGxhdGUgbmFtZSBoYXMgYWxyZWFkeQorCSAqIGJlZW4gcmVnaXN0ZXJlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlbXBsYXRlIHJlZ2lzdGVyKCBTdHJpbmcgbmFtZSwgQ2F0ZWdvcnkgY2F0ZWdvcnksCisJCQlib29sZWFuIGVuYWJsZSwgU3RyaW5nIC4uLiBmaWVsZHMgKQorCQl7CisJCQlyZXR1cm4gcmVnaXN0ZXIoIG5ldyBUZW1wbGF0ZSggbmFtZSwgY2F0ZWdvcnksIGVuYWJsZSwgVGVtcGxhdGUuVU5MSU1JVEVEX0VOVFJJRVMsIGZpZWxkcyApICk7CisJCX0KKwkJCisJLyoqCisJICogUmVnaXN0ZXIgYW5kIHNldCBsb2cgZW50cnkgbGltaXQKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBjYXRlZ29yeQorCSAqIEBwYXJhbSBlbmFibGUKKwkgKiBAcGFyYW0gbGltaXQKKwkgKiBAcGFyYW0gZmllbGRzCisJICogQHJldHVybiB0aGUgdGVtcGxhdGUgdGhhdCB3YXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlbXBsYXRlIHJlZ2lzdGVyKCBTdHJpbmcgbmFtZSwgQ2F0ZWdvcnkgY2F0ZWdvcnksCisJCWJvb2xlYW4gZW5hYmxlLCBpbnQgbGltaXQsIFN0cmluZyAuLi4gZmllbGRzICkKKwl7CisJCXJldHVybiByZWdpc3RlciggbmV3IFRlbXBsYXRlKCBuYW1lLCBjYXRlZ29yeSwgZW5hYmxlLCBsaW1pdCwgZmllbGRzICkgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50LgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZWQgdGVtcGxhdGUgZXhpc3RzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNUZW1wbGF0ZSggU3RyaW5nIG5hbWUgKQorCXsKKwkJcmV0dXJuIHRlbXBsYXRlcy5jb250YWluc0tleSggbmFtZSApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVGVtcGxhdGUoIFRlbXBsYXRlIHRlbXBsYXRlICkKKwl7CisJCXRlbXBsYXRlcy5wdXQoIHRlbXBsYXRlLmdldE5hbWUoKSwgdGVtcGxhdGUgKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVGVtcGxhdGUgZ2V0VGVtcGxhdGUwKCBTdHJpbmcgbmFtZSApCisJeworCQlyZXR1cm4gdGVtcGxhdGVzLmdldCggbmFtZSApOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQuCisJICogCisJICogQHBhcmFtIHJlZ2lzdGVyIGZsYWcgZGV0ZXJtaW5lcyBpZiBhIG5ld2x5IGNyZWF0ZWQgdGVtcGxhdGUKKwkgKiB3aWxsIGJlIHJlZ2lzdGVyZWQgb3Igbm90LiBUaGUgdGVtcGxhdGUgc2hvdWxkIG5vdCBiZSByZWdpc3RlcmVkCisJICogaWYgdGhlICJuYW1lIiBvZiB0aGUgZXZlbnQgaXMgcmVhbGx5IGFuIGFscmVhZHkgZm9ybWF0dGVkIHN0cmluZworCSAqIHdoaWNoIHNob3VsZCBub3QgYmUgcmVtZW1iZXJlZC4gdGhpcyBtaWdodCBoYXBwZW4gaWYgbGVnYWN5IGxvZ2dpbmcKKwkgKiBvciB0cmFjaW5nIGNvZGUgaXMgYmVpbmcgY29udmVydGVkIChlLmcuLCBieSBjaGFuZ2luZyBjYWxscyB0bworCSAqIFN5c3RlbS5vdXQucHJpbnRsbigpIGludG8gTG9nLnJlcG9ydCgpLgorCSAqIAorCSAqIEBwYXJhbSBkZWZDYXQgdGhlIGRlZmF1bHQgY2F0ZWdvcnkgaWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90CisJICogZXhpc3QuCisJICogCisJICogQHBhcmFtIGRlZkVuYWJsZSB0aGUgZGVmYXVsdCBlbmFibGUgaWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90CisJICogZXhpc3QuCisJICogCisJICogQHJldHVybiB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaWYgcmVnaXN0ZWQsIG9yCisJICogYSBuZXcgdGVtcGxhdGUgd2l0aCBzcGVjaWZpZWQgbmFtZSBhbmQgZGVmYXVsdCBjYXRlZ29yeSBhbmQKKwkgKiBlbmFibGUuIFRoZSBuZXcgdGVtcGxhdGUgbWF5IG9yIG1heSBub3QgYmUgcmVnaXN0ZXJlZCBkZXBlbmRpbmcKKwkgKiB1cCB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIHBhcmFtZXRlci4KKwkgKiAKKwkgKiBAc2VlICNnZXRUZW1wbGF0ZShTdHJpbmcpCisJICovCisJcHVibGljIHN0YXRpYyBUZW1wbGF0ZSBnZXRUZW1wbGF0ZSggU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVnaXN0ZXIsCisJCUNhdGVnb3J5IGRlZkNhdCwgYm9vbGVhbiBkZWZFbmFibGUgKQorCXsKKwkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRUZW1wbGF0ZTAoIG5hbWUgKTsKKwkJaWYgKHRlbXBsYXRlID09IG51bGwpCisJCXsKKwkJCWlmICghcmVnaXN0ZXIpCisJCQkJcmV0dXJuIG5ldyBUZW1wbGF0ZSggbmFtZSwgZGVmQ2F0LCBkZWZFbmFibGUsIFRlbXBsYXRlLlVOTElNSVRFRF9FTlRSSUVTICk7CisKKwkJCXN5bmNocm9uaXplZCAodGVtcGxhdGVzKQorCQkJeworCQkJCXRlbXBsYXRlID0gZ2V0VGVtcGxhdGUwKCBuYW1lICk7CisJCQkJaWYgKHRlbXBsYXRlID09IG51bGwpCisJCQkJCXRlbXBsYXRlID0gcmVnaXN0ZXIoIG5hbWUsIGRlZkNhdCwgZGVmRW5hYmxlICk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRlbXBsYXRlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQuCisJICogCisJICogQHJldHVybiB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaWYgcmVnaXN0ZXJlZCwgb3IKKwkgKiBhIG5ldyB0ZW1wbGF0ZSB3aXRoIHNwZWNpZmllZCBuYW1lIGFuZCBkZWZhdWx0IGNhdGVnb3J5IGFuZAorCSAqIGRlZmF1bHQgZW5hYmxlLiBUaGUgbmV3IHRlbXBsYXRlIG1heSBvciBtYXkgbm90IGJlIHJlZ2lzdGVyZWQKKwkgKiBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgb2YgdGhlIGFsbG93QXV0b1JlZ2lzdGVyIGdsb2JhbC4KKwkgKiAKKwkgKiBAc2VlICNnZXRUZW1wbGF0ZShTdHJpbmcsIGJvb2xlYW4sIENhdGVnb3J5LCBib29sZWFuKQorCSAqIEBzZWUgI2dldEFsbG93QXV0b1JlZ2lzdGVyKCkKKwkgKiBAc2VlICNnZXREZWZhdWx0Q2F0ZWdvcnkoKQorCSAqIEBzZWUgI2dldERlZmF1bHRFbmFibGUoKQorCSAqIEBzZWUgI2dldERlZmF1bHRMaW1pdCgpCisJICovCisJcHVibGljIHN0YXRpYyBUZW1wbGF0ZSBnZXRUZW1wbGF0ZSggU3RyaW5nIG5hbWUgKQorCXsKKwkJcmV0dXJuIGdldFRlbXBsYXRlKCBuYW1lLCBnZXRBbGxvd0F1dG9SZWdpc3RlcigpLAorCQkJZ2V0RGVmYXVsdENhdGVnb3J5KCksIGdldERlZmF1bHRFbmFibGUoKSApOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGVuYWJsZSBmbGFnIGZvciB1bmtub3duIGV2ZW50cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVmYXVsdEVuYWJsZSgpCisJeworCQlyZXR1cm4gZGVmYXVsdEVuYWJsZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZGVmYXVsdCBsaW1pdCBmb3IgdW5rbm93biBldmVudHMuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdExpbWl0KCkKKwl7CisJCXJldHVybiBkZWZhdWx0TGltaXQ7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgY2F0ZWdvcnkgZm9yIHVua25vd24gZXZlbnRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ2F0ZWdvcnkgZ2V0RGVmYXVsdENhdGVnb3J5KCkKKwl7CisJCXJldHVybiBkZWZhdWx0Q2F0ZWdvcnk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF1dG8gcmVnaXN0ZXIgZmxhZywgd2hpY2ggY29udHJvbHMKKwkgKiB3aGV0aGVyIExvZy5yZXBvcnQobmFtZSwgLi4uKSBhbmQgTG9nLmdldFRlbXBsYXRlKG5hbWUpIHdpbGwKKwkgKiByZWdpc3RlciBhIG5ld2x5IGNyZWF0ZWQgdGVtcGxhdGUuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGdldEFsbG93QXV0b1JlZ2lzdGVyKCkKKwl7CisJCXJldHVybiBhbGxvd0F1dG9SZWdpc3RlcjsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGF1dG8gcmVnaXN0ZXIgZmxhZy4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXV0byByZWdpc3RlciBmbGFnLgorCSAqIAorCSAqIEBzZWUgI2dldFRlbXBsYXRlKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsb3dBdXRvUmVnaXN0ZXIoIGJvb2xlYW4gdmFsdWUgKQorCXsKKwkJYWxsb3dBdXRvUmVnaXN0ZXIgPSB2YWx1ZTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbGxvd0F1dG9SZWdpc3RlciA9IHRydWU7CisJCisJcHJpdmF0ZSBzdGF0aWMgQ2F0ZWdvcnkgZGVmYXVsdENhdGVnb3J5ID0gQ2F0ZWdvcnkuRGVidWc7CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWZhdWx0RW5hYmxlID0gdHJ1ZTsKKwkKKwlwcml2YXRlIHN0YXRpYyBpbnQgZGVmYXVsdExpbWl0ID0gVGVtcGxhdGUuVU5MSU1JVEVEX0VOVFJJRVM7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwPFN0cmluZywgVGVtcGxhdGU+IHRlbXBsYXRlcyA9CisJCUNvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcCggbmV3IEhhc2hNYXA8U3RyaW5nLCBUZW1wbGF0ZT4oKSApOworCisJLy8vLy8vLy8vLy8KKwkvLyBTSU5LUyAvLworCS8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgc2luayB0byB0aGUgc2V0IG9mIHNpbmtzIHdoaWNoCisJICogZGVzaXJlIG5vdGlmaWNhdGlvbiBvZiBldmVudHMuCisJICogQHBhcmFtIHNpbmsKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkU2luayggU2luayBzaW5rICkKKwl7CisJCWlmIChzaW5rID09IG51bGwpCisJCXsKKwkJCS8vIEhBQ0s6IHRoaXMgaXMgc3BlY2lhbCBoYWNrIHRoYXQgYWRkcyBhIGRlZmF1bHQKKwkJCS8vIGxvZyBzaW5rIHdoaWNoIHByaW50cyB0byBzdGFuZGFyZCBvdXQuIEJ1dCB3ZQorCQkJLy8gb25seSB3YW50IG9uZSwgc28gd2hpbGUgYSBudWxsU2luayBpcyBhY3RpdmUsCisJCQkvLyBkb24ndCBhZGQgYW5vdGhlci4KKworCQkJaWYgKG51bGxTaW5rICE9IG51bGwpCisJCQkJcmV0dXJuOworCQkJCisJCQludWxsU2luayA9IHNpbmsgPSBuZXcgU2luaygpCisJCQl7CisJCQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkKKwkJCQl7CisJCQkJCWNoZWNrSXNTdGFydGVkKCk7CisJCQkJCXN0YXJ0ZWQgPSB0cnVlOworCQkJCQlzeW5jKCB0aGlzICk7CisJCQkJfQorCisJCQkJcHVibGljIGJvb2xlYW4gaXNTdGFydGVkKCkKKwkJCQl7CisJCQkJCXJldHVybiBzdGFydGVkOworCQkJCX0KKworCQkJCXB1YmxpYyBib29sZWFuIGhhc0ludGVyZXN0KCBUZW1wbGF0ZSB0ZW1wbGF0ZSApCisJCQkJeworCQkJCQlyZXR1cm4gc3RhcnRlZDsKKwkJCQl9CisJCQkJCisJCQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlcG9ydCggRW50cnkgZW50cnkgKQorCQkJCXsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCBlbnRyeSApOworCQkJCX0KKworCQkJCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkKKwkJCQl7CisJCQkJCXN0YXJ0ZWQgPSBmYWxzZTsKKwkJCQkJc3luYyggdGhpcyApOworCQkJCX0KKwkJCQkKKwkJCQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IHRydWU7CisKKwkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCQkJCXsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCisJCQkJcHVibGljIHZvaWQgc2V0QWNjZXB0Q2F0KCBTdHJpbmcgdG9rZW5MaXN0ICkKKwkJCQl7CisJCQkJCS8vIGlnbm9yZS4KKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBzZXREZW55Q2F0KCBTdHJpbmcgdG9rZW5MaXN0ICkKKwkJCQl7CisJCQkJCS8vIGlnbm9yZS4KKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBzZXRBY2NlcHROYW1lKCBTdHJpbmcgdG9rZW5MaXN0ICkKKwkJCQl7CisJCQkJCS8vIGlnbm9yZS4KKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBzZXREZW55TmFtZSggU3RyaW5nIHRva2VuTGlzdCApCisJCQkJeworCQkJCQkvLyBpZ25vcmUuCisJCQkJfQorCisJCQkJcHVibGljIHZvaWQgY2hlY2tJc1N0YXJ0ZWQoKQorCQkJCXsKKwkJCQkJaWYgKHN0YXJ0ZWQpCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiYWxyZWFkeSBzdGFydGVkIiApOworCQkJCX0KKwkJCX07CisJCX0KKwkJCisJCXN5bmNocm9uaXplZCAoc2luaykKKwkJeworCQkJaWYgKHNpbmtzLmFkZCggc2luayApKQorCQkJCXN5bmMoIHNpbmsgKTsKKwkJCQorCQkJU3RyaW5nIG5hbWUgPSBzaW5rLmdldE5hbWUoKTsKKwkJCWlmIChuYW1lICE9IG51bGwpCisJCQkJc2lua3NCeU5hbWUucHV0KCBuYW1lLCBzaW5rICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU2luayBudWxsU2luazsKKwkKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgc2luayBmcm9tIHRoZSBzZXQgb2Ygc2lua3Mgd2hpY2gKKwkgKiBkZXNpcmUgbm90aWZpY2F0aW9uIG9mIGV2ZW50cy4KKwkgKiBAcGFyYW0gc2luaworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVTaW5rKCBTaW5rIHNpbmsgKQorCXsKKwkJc3luY2hyb25pemVkIChzaW5rKQorCQl7CisJCQlpZiAoc2lua3MucmVtb3ZlKCBzaW5rICkpCisJCQkJc3luYyggc2luayApOworCQkJCisJCQlTdHJpbmcgbmFtZSA9IHNpbmsuZ2V0TmFtZSgpOworCQkJaWYgKG5hbWUgIT0gbnVsbCkKKwkJCQlzaW5rc0J5TmFtZS5yZW1vdmUoIG5hbWUgKTsKKwkJCQorCQkJaWYgKHNpbmsgPT0gbnVsbFNpbmspCisJCQkJbnVsbFNpbmsgPSBudWxsOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgbmFtZWQgc2luayBvciBudWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU2luayBmaW5kU2luayggU3RyaW5nIG5hbWUgKQorCXsKKwkJcmV0dXJuIHNpbmtzQnlOYW1lLmdldCggbmFtZSApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzaW5rCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHN5bmMoIFNpbmsgc2luayApCisJeworCQkvLyBzaW5rIGlzIHN5bmNocm9uaXplZC4KKwkJCisJCS8vIHRoZSBpbnRlcmVzdHMgb2YgdGhpcyBzaW5rIG11c3QgYmUgY29tcGFyZWQgdG8gYWxsIHRoZQorCQkvLyB0ZW1wbGF0ZXMuIHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBtdXN0IGJlIGZyb3plbiBzbyB0aGF0CisJCS8vIHdlIGFyZSBzdXJlIGFsbCB0ZW1wbGF0ZXMgYXJlIGZhaXJseSBjb25zaWRlcmVkLiBpZiBhCisJCS8vIHRlbXBsYXRlIGlzIGFkZGVkIG9yIHJlbW92ZWQsIGEgc2ltaWxhciBwcm9jZXNzIGlzCisJCS8vIHBlcmZvcm1lZCBidXQgZnJlZXppbmcgdGhlIHNpbmsgbGlzdC4KKwkJCisJCWJvb2xlYW4gaW5zdGFsbGVkID0gc2lua3MuY29udGFpbnMoIHNpbmsgKTsKKwkJc3luY2hyb25pemVkICh0ZW1wbGF0ZXMpCisJCXsKKwkJCWZvciAoVGVtcGxhdGUgdGVtcGxhdGUgOiB0ZW1wbGF0ZXMudmFsdWVzKCkpCisJCQl7CisJCQkJaWYgKGluc3RhbGxlZCAmJiBzaW5rLmhhc0ludGVyZXN0KCB0ZW1wbGF0ZSApKQorCQkJCQl0ZW1wbGF0ZS5hZGRTaW5rKCBzaW5rICk7CisJCQkJZWxzZQorCQkJCQl0ZW1wbGF0ZS5yZW1vdmVTaW5rKCBzaW5rICk7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIHRlbXBsYXRlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHN5bmMoIFRlbXBsYXRlIHRlbXBsYXRlICkKKwl7CisJCS8vIHRlbXBsYXRlIGlzIHN5bmNocm9uaXplZCBhdCB0aGlzIHBvaW50LiB0ZW1wbGF0ZXMKKwkJLy8gYXJlIGVzc2VudGlhbGx5IGltbXV0YWJsZSBleGNlcHQgZm9yIHRoZSBlbmFibGUKKwkJLy8gZmxhZy4KKworCQlpZiAoIXRlbXBsYXRlLmdldEVuYWJsZSgpKQorCQl7CisJCQl0ZW1wbGF0ZS5jbGVhclNpbmtzKCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXN5bmNocm9uaXplZCAoc2lua3MpCisJCXsKKwkJCWZvciAoU2luayBzaW5rIDogc2lua3MpCisJCQl7CisJCQkJaWYgKHNpbmsuaGFzSW50ZXJlc3QoIHRlbXBsYXRlICkpCisJCQkJCXRlbXBsYXRlLmFkZFNpbmsoIHNpbmsgKTsKKwkJCQllbHNlCisJCQkJCXRlbXBsYXRlLnJlbW92ZVNpbmsoIHNpbmsgKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQ8U2luaz4gc2lua3MgPQorCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQoIG5ldyBIYXNoU2V0PFNpbms+KCkgKTsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXA8U3RyaW5nLCBTaW5rPiBzaW5rc0J5TmFtZSA9CisJCUNvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcCggbmV3IEhhc2hNYXA8U3RyaW5nLCBTaW5rPigpICk7CisJCisJLyoqCisJICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIHNpbmtzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU2lua1tdIGdldFNpbmtzKCkKKwl7CisJCXN5bmNocm9uaXplZCAoc2lua3MpCisJCXsKKwkJCXJldHVybiBzaW5rcy50b0FycmF5KCBuZXcgU2lua1tzaW5rcy5zaXplKCldICk7CisJCX0KKwl9CisJCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFUE9SVCBFVkVOVFMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogUmVwb3J0cyB0aGUgbmFtZWQgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50LgorCSAqIEBwYXJhbSBmaWVsZFZhbHVlcyBhIHNlcXVlbmNlIG9mIGZpZWxkL3ZhbHVlIHBhaXJzIHdoaWNoIGFyZQorCSAqIHBhcmFtZXRlcnMgb2YgdGhlIGV2ZW50LgorCSAqIEByZXR1cm4gdGhlIGVudHJ5IHRoYXQgd2FzIHJlcG9ydGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRW50cnkgcmVwb3J0KCBTdHJpbmcgbmFtZSwgT2JqZWN0IC4uLiBmaWVsZFZhbHVlcyApCisJeworCQlyZXR1cm4gbmV3RW50cnkoIG5hbWUsIGZpZWxkVmFsdWVzICkucmVwb3J0KCk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZW50cnkgZm9yIHRoZSBuYW1lZCBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQKKwkgKiBwYXJhbWV0ZXJzLgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudC4KKwkgKiBAcGFyYW0gZmllbGRWYWx1ZXMgYSBzZXF1ZW5jZSBvZiBmaWVsZC92YWx1ZSBwYWlycyB3aGljaCBhcmUKKwkgKiBwYXJhbWV0ZXJzIG9mIHRoZSBldmVudC4KKwkgKiBAcmV0dXJuIHRoZSBlbnRyeSB0aGF0IHdhcyBjcmVhdGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRW50cnkgbmV3RW50cnkoIFN0cmluZyBuYW1lLCBPYmplY3QgLi4uIGZpZWxkVmFsdWVzICkKKwl7CisJCXJldHVybiBnZXRUZW1wbGF0ZSggbmFtZSApLm5ld0VudHJ5KCBmaWVsZFZhbHVlcyApOworCX0KKwkKKwkvKioKKwkgKiBMb2cgZW50cnkgaWQgZ2VuZXJhdG9yLgorCSAqLworCWZpbmFsIHN0YXRpYyBJZEdlbmVyYXRvciBlbnRyeUlkR2VuID0gbmV3IElkR2VuZXJhdG9yKCBUaW1lci5nZXROYW5vcygpICk7CisKKwkvKioKKwkgKiBTdGFuZGFyZCB3YXkgb2YgYXR0YWNoaW5nIGFuIGV4Y2VwdGlvbiB0byBhIGxvZyBlbnRyeS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENQID0gImV4Y3AiOworCisJLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gc3RhY2sgdHJhY2VzIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQHBhcmFtIHQKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwIG9mIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc3BlY2lmaWVkIHRocm93YWJsZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdGFja1RyYWNlKCBUaHJvd2FibGUgdCApCisJeworCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKCBzdyApOworCQl0LnByaW50U3RhY2tUcmFjZSggcHcgKTsKKwkJcmV0dXJuIHN3LnRvU3RyaW5nKCkudHJpbSgpOworCX0KKworCS8vLy8vLy8vLy8vLy8KKwkvLyBDbGFzc2VzIC8vCisJLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIENhdGVnb3JpZXMgb2YgZXZlbnRzLiBDYXRlZ29yeSBtYXkgYmUgcmVwb3J0ZWQgd2hlbiB0aGUgZXZlbnQgaXMKKwkgKiBsb2dnZWQsIGFuZCBzaW5rcyBtYXkgdXNlIGNhdGVnb3J5IHRvIHNlbGVjdCBldmVudHMgdG8gYmUgbG9nZ2VkLgorCSAqLworCXB1YmxpYyBlbnVtIENhdGVnb3J5CisJeworCQkvKioKKwkJICogVmVyeSBkZXRhaWxlZCBpbmZvIGFib3V0IGEgcHJvY2Vzcy4KKwkJICovCisJCVZlcmJvc2UsCisJCS8qKgorCQkgKiBHZW5lcmFsIGluZm8gYWJvdXQgYSBwcm9jZXNzLgorCQkgKi8KKwkJSW5mbywKKwkJLyoqCisJCSAqIEEgd2FybmluZyBhYm91dCBzb21ldGhpbmcgdGhhdCBtYXkgbm90IGJlIHJpZ2h0IGluIGEgcHJvY2Vzcy4KKwkJICovCisJCVdhcm5pbmcsCisJCS8qKgorCQkgKiBBIHJlcG9ydCBhYm91dCBhbiBlcnJvciBpbiBhIHByb2Nlc3MuCisJCSAqLworCQlFcnJvciwKKwkJLyoqCisJCSAqIEEgZGVidWdnaW5nIHJlcG9ydCBhYm91dCBhIHByb2Nlc3MuCisJCSAqLworCQlEZWJ1ZywKKwkJLyoqCisJCSAqIEFuIGF1ZGl0IHJlcG9ydCBmcm9tIGEgcHJvY2Vzcy4KKwkJICovCisJCUF1ZGl0LAorCQkvKioKKwkJICogQSBzdGF0aXN0aWMgcmVwb3J0LgorCQkgKi8KKwkJU3RhdAorCX0KKwkKKwkvKioKKwkgKiBBIHRlbXBsYXRlIGZvciBhbiBldmVudC4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgc3RhdGljIGNsYXNzIFRlbXBsYXRlCisJeworCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgVGVtcGxhdGUuCisJCSAqCisJCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudC4KKwkJICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeSBvZiB0aGUgZXZlbnQuCisJCSAqIEBwYXJhbSBlbmFibGUgZmxhZyB3aGljaCBhbGxvd3MgcmVwb3J0aW5nIG9mIHRoZSBldmVudC4KKwkJICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvbiBob3cgbWFueSBzdWNoIG1lc3NhZ2VzIHBlciBwZXJpb2QKKwkJICogdG8gYWxsb3cuCisJCSAqIEBwYXJhbSBmaWVsZHMgdGhlIGxpc3Qgb2YgZmllbGRzIG9mIHRoZSBldmVudC4KKwkJICovCisJCXB1YmxpYyBUZW1wbGF0ZSggU3RyaW5nIG5hbWUsIENhdGVnb3J5IGNhdGVnb3J5LAorCQkJYm9vbGVhbiBlbmFibGUsIGludCBsaW1pdCwgU3RyaW5nIC4uLiBmaWVsZHMgKQorCQl7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OworCQkJdGhpcy5saW1pdCA9IGxpbWl0OworCQkJc2V0RW5hYmxlKCBlbmFibGUgKTsKKwkJCWFkZEZpZWxkcyggZmllbGRzICk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBGbGFnIGluZGljYXRpbmcgdW5saW1pdGVkIGVudHJ5IHJhdGUuCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkxJTUlURURfRU5UUklFUyA9IC0xOworCisJCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJCQorCQlwcml2YXRlIGZpbmFsIENhdGVnb3J5IGNhdGVnb3J5OworCQkKKwkJcHJpdmF0ZSBpbnQgbGltaXQgPSBVTkxJTUlURURfRU5UUklFUzsKKwkJCisJCXByaXZhdGUgaW50IGRyb3BDb3VudCA9IDA7CisJCQorCQlwcml2YXRlIGludCBtaW51dGVDb3VudCA9IDA7CisJCQorCQlwcml2YXRlIGxvbmcgbGFzdE5hbm9zOworCQkJCQkJCQkKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHRlbXBsYXRlLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkKKwkJeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBjYXRlZ29yeSBvZiB0aGlzIHRlbXBsYXRlLgorCQkgKi8KKwkJcHVibGljIENhdGVnb3J5IGdldENhdGVnb3J5KCkKKwkJeworCQkJcmV0dXJuIGNhdGVnb3J5OworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiBlbnRyaWVzIHBlciBtaW51dGVzCisJCSAqLworCQlwdWJsaWMgaW50IGdldExpbWl0KCkKKwkJeworCQkJcmV0dXJuIGxpbWl0OworCQl9CisJCQorCQkvKioKKwkJICogc2V0IGxvZyBlbnRyaWVzIHBlciBtaW51dGUKKwkJICogQHBhcmFtIGxpbWl0CisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRMaW1pdCggaW50IGxpbWl0ICkKKwkJeworCQkJdGhpcy5saW1pdCA9IGxpbWl0OworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gZHJvcHBlZCBlbnRyaWVzIGNvdW50CisJCSAqLworCQlwdWJsaWMgaW50IGdldERyb3BDb3VudCgpCisJCXsKKwkJCXJldHVybiBkcm9wQ291bnQ7CisJCX0KKwkJCisJCS8qKgorCQkgKiBzZXQgZHJvcCBjb3VudCB0byAwCisJCSAqLworCQlwdWJsaWMgdm9pZCByZXNldERyb3BDb3VudCgpCisJCXsKKwkJCWRyb3BDb3VudCA9IDA7CisJCX0KKwkJCQkKKwkJLy8vLy8vLy8vLy8vLy8vLworCQkvLyBFTkFCTEVNRU5UIC8vCisJCS8vLy8vLy8vLy8vLy8vLy8KKwkJCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBlbmFibGUgZmxhZyBvZiB0aGlzIHRlbXBsYXRlLiBJZiB0cnVlLCB0aGUKKwkJICogZXZlbnQgd2lsbCBiZSByZXBvcnRlZCB0byBzaW5rcyB0aGF0IGFyZSBpbnRlcmVzdGVkLiBJZgorCQkgKiBmYWxzZSwgdGhlIGV2ZW50IHdpbGwgbm90IGJlIHJlcG9ydGVkIG5vIG1hdHRlciB3aGF0LgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlKCkKKwkJeworCQkJcmV0dXJuIGVuYWJsZTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFNldHMgdGhlIGVuYWJsZSBmbGFnIG9mIHRoaXMgdGVtcGxhdGUuCisJCSAqIAorCQkgKiBAcGFyYW0gZW5hYmxlIHRoZSBlbmFibGUgZmxhZyBvZiB0aGlzIHRlbXBsYXRlLiBJZiB0cnVlLCB0aGUKKwkJICogZXZlbnQgd2lsbCBiZSByZXBvcnRlZCB0byBzaW5rcyB0aGF0IGFyZSBpbnRlcmVzdGVkLiBJZgorCQkgKiBmYWxzZSwgdGhlIGV2ZW50IHdpbGwgbm90IGJlIHJlcG9ydGVkIG5vIG1hdHRlciB3aGF0LgorCQkgKi8KKwkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEVuYWJsZSggYm9vbGVhbiBlbmFibGUgKQorCQl7CisJCQlpZiAoZW5hYmxlICE9IHRoaXMuZW5hYmxlKQorCQkJeworCQkJCXRoaXMuZW5hYmxlID0gZW5hYmxlOworCQkJCXN5bmMoIHRoaXMgKTsKKwkJCX0KKwkJCQorCQkJaWYgKGlzTGltaXRlZExvZ2dpbmcoKSkKKwkJCXsKKwkJCQlsYXN0TmFub3MgPSBUaW1lci5nZXROYW5vcygpOworCQkJCWRyb3BDb3VudCA9IDA7CisJCQkJbWludXRlQ291bnQgPSAwOworCQkJfQorCQl9CisJCQorCQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlID0gdHJ1ZTsKKworCQkvLy8vLy8vLy8vLy8KKwkJLy8gRklFTERTIC8vCisJCS8vLy8vLy8vLy8vLworCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgbmFtZS4KKwkJICogQHJldHVybiB0cnVlIGlmIHRoaXMgZmllbGQgaXMgZGVmaW5lZC4KKwkJICovCisJCXB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKCBTdHJpbmcgZmllbGQgKQorCQl7CisJCQlyZXR1cm4gX2ZpZWxkcy5jb250YWlucyggZmllbGQgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBmaWVsZCB0byB0aGUgdGVtcGxhdGUgaWYgaXQgaGFzbid0IGFscmVhZHkKKwkJICogYmVlbiBhZGRlZC4KKwkJICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCBuYW1lLgorCQkgKiBAcmV0dXJuIHRoaXMgdGVtcGxhdGUuCisJCSAqLworCQlwdWJsaWMgVGVtcGxhdGUgYWRkRmllbGQoIFN0cmluZyBmaWVsZCApCisJCXsKKwkJCXN5bmNocm9uaXplZCAoX2ZpZWxkcykKKwkJCXsKKwkJCQlpZiAoIWhhc0ZpZWxkKCBmaWVsZCApKQorCQkJCXsKKwkJCQkJaW50IGlkID0gX2ZpZWxkcy5zaXplKCk7CisJCQkJCV9maWVsZHMuYWRkKCBmaWVsZCApOworCQkJCQlmaWVsZElkcy5wdXQoIGZpZWxkLCBpZCApOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0aGlzOworCQl9CisJCQorCQkvKioKKwkJICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCBuYW1lLgorCQkgKiBAcGFyYW0gY3JlYXRlIGZsYWcgd2hpY2ggc3BlY2lmaWVzIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZQorCQkgKiBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KKwkJICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KKwkJICovCisJCXB1YmxpYyBpbnQgZ2V0RmllbGRJZCggU3RyaW5nIGZpZWxkLCBib29sZWFuIGNyZWF0ZSApCisJCXsKKwkJCUludGVnZXIgaWQgPSBmaWVsZElkcy5nZXQoIGZpZWxkICk7CisJCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoIWNyZWF0ZSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWFkZEZpZWxkKCBmaWVsZCApOworCQkJCWlkID0gZmllbGRJZHMuZ2V0KCBmaWVsZCApOworCQkJfQorCQkJcmV0dXJuIGlkOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgY291bnQgb2YgZmllbGRzIGluIHRoZSB0ZW1wbGF0ZS4KKwkJICovCisJCXB1YmxpYyBpbnQgY291bnRGaWVsZHMoKQorCQl7CisJCQlyZXR1cm4gX2ZpZWxkcy5zaXplKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gZmllbGRzIGEgbGlzdCBvZiBmaWVsZHMgdG8gYWRkLgorCQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZS4KKwkJICovCisJCXB1YmxpYyBUZW1wbGF0ZSBhZGRGaWVsZHMoIFN0cmluZyAuLi4gZmllbGRzICkKKwkJeworCQkJZm9yIChTdHJpbmcgZmllbGQ6IGZpZWxkcykKKwkJCQlhZGRGaWVsZCggZmllbGQgKTsKKwkJCQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIGZpZWxkcyBvZiB0aGUgdGVtcGxhdGUuCisJCSAqLworCQlwdWJsaWMgU3RyaW5nW10gZ2V0RmllbGRzKCkKKwkJeworCQkJc3luY2hyb25pemVkIChfZmllbGRzKQorCQkJeworCQkJCXJldHVybiBfZmllbGRzLnRvQXJyYXkoIG5ldyBTdHJpbmdbX2ZpZWxkcy5zaXplKCldICk7CisJCQl9CisJCX0KKwkJCisJCXByaXZhdGUgTGlzdDxTdHJpbmc+IF9maWVsZHMgPQorCQkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdCggbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgKTsKKwkJCisJCXByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gZmllbGRJZHMgPQorCQkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCkgKTsKKworCQkvLy8vLy8vLy8vLworCQkvLyBTSU5LUyAvLworCQkvLy8vLy8vLy8vLworCQkKKwkJLyoqCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgZW5hYmxlZCBhbmQgdGhlcmUgYXJlIGFueQorCQkgKiBzaW5rcyBpbnRlcmVzdGVkIGluIHRoZSBldmVudC4KKwkJICovCisJCWJvb2xlYW4gaXNFbmFibGVkKCkKKwkJeworCQkJcmV0dXJuIGVuYWJsZSAmJiBoYXNTaW5rcygpOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgbG9nIHNpbmtzIGludGVyZXN0ZWQgaW4gdGhpcworCQkgKiB0ZW1wbGF0ZS4KKwkJICovCisJCXByaXZhdGUgYm9vbGVhbiBoYXNTaW5rcygpCisJCXsKKwkJCXJldHVybiAhdHNpbmtzLmlzRW1wdHkoKTsKKwkJfQorCisJCS8qKgorCQkgKiBBZGRzIHNpbmsgdG8gdGhlIHNldCBvZiB0aG9zZSBub3RpZmllZCB3aGVuIHRoaXMKKwkJICogdGVtcGxhdGUgZ2VuZXJhdGVzIGFuIGV2ZW50LgorCQkgKiBAcGFyYW0gc2luaworCQkgKi8KKwkJdm9pZCBhZGRTaW5rKCBTaW5rIHNpbmsgKQorCQl7CisJCQlzeW5jaHJvbml6ZWQgKHRzaW5rcykKKwkJCXsKKwkJCQl0c2lua3MuYWRkKCBzaW5rICk7CisJCQkJc2lua3NBcnJheSA9IG51bGw7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogUmVtb3ZlcyBzaW5rIGZyb20gdGhlIHNldCBvZiB0aG9zZSBub3RpZmllZCB3aGVuIHRoaXMKKwkJICogdGVtcGxhdGUgZ2VuZXJhdGVzIGFuIGV2ZW50LgorCQkgKiBAcGFyYW0gc2luaworCQkgKi8KKwkJdm9pZCByZW1vdmVTaW5rKCBTaW5rIHNpbmsgKQorCQl7CisJCQlzeW5jaHJvbml6ZWQgKHRzaW5rcykKKwkJCXsKKwkJCQl0c2lua3MucmVtb3ZlKCBzaW5rICk7CisJCQkJc2lua3NBcnJheSA9IG51bGw7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogUmVtb3ZlcyBhbGwgdGhlIHNpbmtzLgorCQkgKi8KKwkJdm9pZCBjbGVhclNpbmtzKCkKKwkJeworCQkJc3luY2hyb25pemVkICh0c2lua3MpCisJCQl7CisJCQkJdHNpbmtzLmNsZWFyKCk7CisJCQkJc2lua3NBcnJheSA9IG51bGw7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgbGlzdCBvZiBzaW5rcyBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQuCisJCSAqLworCQlwdWJsaWMgU2lua1tdIGdldFNpbmtzKCkKKwkJeworCQkJc3luY2hyb25pemVkICh0c2lua3MpCisJCQl7CisJCQkJaWYgKHNpbmtzQXJyYXkgPT0gbnVsbCkKKwkJCQkJc2lua3NBcnJheSA9IHRzaW5rcy50b0FycmF5KCBuZXcgU2lua1t0c2lua3Muc2l6ZSgpXSApOworCQkJCXJldHVybiBzaW5rc0FycmF5OworCQkJfQorCQl9CisJCQorCQlwcml2YXRlIFNldDxTaW5rPiB0c2lua3MgPSBuZXcgSGFzaFNldDxTaW5rPigpOworCQkKKwkJcHJpdmF0ZSBTaW5rW10gc2lua3NBcnJheTsKKworCQkvLy8vLy8vLy8vLy8vCisJCS8vIEVOVFJJRVMgLy8KKwkJLy8vLy8vLy8vLy8vLworCQkKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgYSBuZXcgZW50cnkgZm9yIHRoaXMgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisJCSAqIHBhcmFtZXRlciB2YWx1ZXMuIElmIHRoZSBldmVudCBpcyBlbmFibGVkIGFuZCBzb21lIHNpbmsKKwkJICogd2FudHMgaXQsIHRoZW4gYSBmdW5jdGlvbmFsIGVudHJ5IG9iamVjdCBpcyByZXR1cm5lZCB3aGljaAorCQkgKiBjYW4gYmUgdXNlZCB0byByZXBvcnQgdGhlIGV2ZW50LiBJZiB0aGUgZXZlbnQgaXMgZGlzYWJsZWQKKwkJICogb3Igbm8gc2luayB3YW50cyBpdCwgYSBkdW1teSBlbnRyeSBvYmplY3QgaXMgcmV0dXJuZWQgd2hpY2gKKwkJICogZG9lc24ndCByZXBvcnQgYW55dGhpbmcuCisJCSAqIAorCQkgKiBAcGFyYW0gZmllbGRWYWx1ZXMgYSBzZXF1ZW5jZSBvZiBmaWVsZC92YWx1ZSBwYWlycyB3aGljaCBhcmUKKwkJICogcGFyYW1ldGVycyBvZiB0aGUgZXZlbnQuCisJCSAqIAorCQkgKiBAcmV0dXJuIGNvbnN0cnVjdGVkIGVudHJ5IG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIHJlcG9ydAorCQkgKiB0aGUgZXZlbnQuCisJCSAqIAorCQkgKiBAc2VlIE5vcm1hbEVudHJ5CisJCSAqIEBzZWUgRHVtbXlFbnRyeQorCQkgKi8KKwkJcHVibGljIEVudHJ5IG5ld0VudHJ5KCBPYmplY3QgLi4uIGZpZWxkVmFsdWVzICkKKwkJeworCQkJc3luY2hyb25pemVkIChjb3VudFN5bmMpCisJCQl7CisJCQkJY291bnQrKzsKKwkJCQkKKwkJCQlpbnQgayA9IGZpZWxkVmFsdWVzLmxlbmd0aDsKKwkJCQlmaWVsZFZhbHVlc0NvdW50ICs9IGs7CisJCQkJaWYgKGsgPT0gMCkKKwkJCQkJemVyb0ZpZWxkVmFsdWVzQ291bnQrKzsKKwkJCX0KKwkJCQorCQkJaWYgKGlzRW5hYmxlZCgpKQorCQkJeworCQkJCWlmIChpc0xpbWl0ZWRMb2dnaW5nKCkpCisJCQkJeworCQkJCQlpZiAoaXNMb2dnaW5nVG9vRmFzdCgpKQorCQkJCQl7CisJCQkJCQlkcm9wQ291bnQrKzsKKwkJCQkJCXN5bmNocm9uaXplZChjb3VudFN5bmMpCisJCQkJCQl7CisJCQkJCQkJZHVtbXlDb3VudCsrOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIG5ldyBEdW1teUVudHJ5KCk7CisJCQkJCX0KKwkJCQkJbWludXRlQ291bnQrKzsKKwkJCQl9CisJCQkJcmV0dXJuIG5ldyBOb3JtYWxFbnRyeSggdGhpcywgZmllbGRWYWx1ZXMgKTsKKwkJCX0KKwkJCQorCQkJc3luY2hyb25pemVkIChjb3VudFN5bmMpCisJCQl7CisJCQkJZHVtbXlDb3VudCsrOworCQkJfQorCQkJCisJCQlyZXR1cm4gbmV3IER1bW15RW50cnkoKTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBpc0xvZ2dpbmdUb29GYXN0KCkKKwkJeworCQkJaWYgKCFpc0xpbWl0ZWRMb2dnaW5nKCkpCisJCQkJcmV0dXJuIGZhbHNlOwkvLyBsb2dnaW5nIGlzIG5vdCBsaW1pdGVkLgorCQkJCisJCQlpZiAoVGltZXIuZ2V0U2Vjb25kc1NpbmNlKGxhc3ROYW5vcykgPiA2MCkKKwkJCXsKKwkJCQkvLyBvdmVyIGEgbWludXRlIG5vdywgcmVzZXQgY291bnRlcnMuCisJCQkJbWludXRlQ291bnQgPSAwOworCQkJCS8vZHJvcENvdW50ID0gMDsKKwkJCQkvLyByZXNldCB0aW1lIHN0YW1wLgorCQkJCWxhc3ROYW5vcyA9IFRpbWVyLmdldE5hbm9zKCk7CisJCQkJCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKG1pbnV0ZUNvdW50IDwgZ2V0TGltaXQoKSkKKwkJCXsKKwkJCQkvLyBzdGlsbCB3aXRoaW4gbGltaXQuCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBpc0xpbWl0ZWRMb2dnaW5nKCkKKwkJeworCQkJcmV0dXJuIGxpbWl0ICE9IFVOTElNSVRFRF9FTlRSSUVTOworCQl9CisJfQorCQorCS8qKgorCSAqIENvdW50IG9mIGxvZyBlbnRyaWVzIGNyZWF0ZWQuCisJICovCisJc3RhdGljIGludCBjb3VudDsKKwkKKwkvKioKKwkgKiBDb3VudCBvZiBkdW1teSBsb2cgZW50cmllcyBjcmVhdGVkLgorCSAqLworCXN0YXRpYyBpbnQgZHVtbXlDb3VudDsKKwkJCisJLyoqCisJICogQ291bnQgb2YgZmllbGQgdmFsdWUgcGFpcnMgcmVwb3J0ZWQuCisJICovCisJc3RhdGljIGludCBmaWVsZFZhbHVlc0NvdW50OworCQorCS8qKgorCSAqIERlc2NyaXB0aW9uIG9mIHplcm9GaWVsZFZhbHVlc0NvdW50LgorCSAqLworCXN0YXRpYyBpbnQgemVyb0ZpZWxkVmFsdWVzQ291bnQ7CisJCisJLyoqCisJICogU3luY2hyb25pemUgYWNjZXNzIHRvIGNvdW50ZXJzLgorCSAqLworCWZpbmFsIHN0YXRpYyBPYmplY3QgY291bnRTeW5jID0gbmV3IE9iamVjdCgpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19TVEFUUyA9ICJMb2dTdGF0cyI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlQgPSAiY291bnQiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX0NPVU5UID0gImR1bW15Q291bnQiOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9WQUxVRVNfQ09VTlQgPSAiZmllbGRWYWx1ZXNDb3VudCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST19GSUVMRF9WQUxVRVNfQ09VTlQgPSAiemVyb0ZpZWxkVmFsdWVzQ291bnQiOworCQorCS8qKgorCSAqIFJlcG9ydHMgbG9nIHN0YXRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRMb2dTdGF0cygpCisJeworCQlzeW5jaHJvbml6ZWQgKGNvdW50U3luYykKKwkJeworCQkJTG9nLnJlcG9ydCggTE9HX1NUQVRTLAorCQkJCUNPVU5ULCBjb3VudCwKKwkJCQlEVU1NWV9DT1VOVCwgZHVtbXlDb3VudCwKKwkJCQlGSUVMRF9WQUxVRVNfQ09VTlQsIGZpZWxkVmFsdWVzQ291bnQsCisJCQkJWkVST19GSUVMRF9WQUxVRVNfQ09VTlQsIHplcm9GaWVsZFZhbHVlc0NvdW50KTsKKwkJfQorCX0KKwkKKwlzdGF0aWMKKwl7CisJCUxvZy5yZWdpc3RlciggTE9HX1NUQVRTLCBDYXRlZ29yeS5TdGF0LCB0cnVlLAorCQkJQ09VTlQsIERVTU1ZX0NPVU5ULCBGSUVMRF9WQUxVRVNfQ09VTlQsIFpFUk9fRklFTERfVkFMVUVTX0NPVU5UICk7CisJfQorCQorCS8qKgorCSAqIEludGVyZmFjZSBmb3IgbG9nIGVudHJpZXMuCisJICovCisJcHVibGljIGludGVyZmFjZSBFbnRyeQorCXsKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGZvciB0aGlzIGVudHJ5LgorCQkgKi8KKwkJcHVibGljIFRlbXBsYXRlIGdldFRlbXBsYXRlKCk7CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGlzIGVudHJ5LiBUaGlzIGlzIHRoZQorCQkgKiB2YWx1ZSByZXR1cm5lZCBieSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSB3aGVuCisJCSAqIHRoZSBlbnRyeSB3YXMgY3JlYXRlZC4KKwkJICovCisJCXB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpOworCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgbmFtZS4KKwkJICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpcyBkZWZpbmVkIGFuZCBoYXMgYSB2YWx1ZS4KKwkJICovCisJCXB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKCBTdHJpbmcgZmllbGQgKTsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIG5hbWUuCisJCSAqIEByZXR1cm4gdGhlIGZpZWxkJ3MgdmFsdWUgKHBvc3NpYmx5IG51bGwpLgorCQkgKi8KKwkJcHVibGljIE9iamVjdCBnZXRGaWVsZCggU3RyaW5nIGZpZWxkICk7CisJCQorCQkvKioKKwkJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgorCQkgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIG5hbWUuCisJCSAqIEBwYXJhbSB2YWx1ZSB0aGUgZmllbGQgdmFsdWUsIG1heSBiZSBudWxsLgorCQkgKiBAcmV0dXJuIHRoaXMgZW50cnkuCisJCSAqLworCQlwdWJsaWMgRW50cnkgc2V0RmllbGQoIFN0cmluZyBmaWVsZCwgT2JqZWN0IHZhbHVlICk7CisJCQorCQkvKioKKwkJICogQHJldHVybiByZXBvcnRzIHRoaXMgZW50cnkgdG8gaW50ZXJlc3RlZCBsb2cgc2lua3MuIEFuCisJCSAqIGVudHJ5IGlkIGlzIGFzc2lnbmVkIGlmIHRoZSBlbnRyeSBpcyBhY3R1YWxseSBnb2luZyB0bworCQkgKiBiZSByZXBvcnRlZCB0byBhIHNpbmsuCisJCSAqLworCQlwdWJsaWMgRW50cnkgcmVwb3J0KCk7CisJCQorCQkvKioKKwkJICogQ2FsbHMgdGhlIEZpZWxkVmFsdWVGb3JtYXR0ZXIuZm9ybWF0KCkgbWV0aG9kIGZvciBlYWNoIGZpZWxkCisJCSAqIGRlZmluZWQgaW4gdGhlIHRlbXBsYXRlIChldmVuIHRob3NlIHdpdGggbnVsbCB2YWx1ZXMpLgorCQkgKiAKKwkJICogQHBhcmFtIGZvcm1hdHRlcgorCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJCSAqLworCQlwdWJsaWMgdm9pZCBmb3JtYXRGaWVsZFZhbHVlcyggRmllbGRWYWx1ZUZvcm1hdHRlciBmb3JtYXR0ZXIgKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uOworCQkKKwkJLyoqCisJCSAqIENvbnZlcnRzIGVudHJ5IHRvIHN0cmluZyB2YWx1ZSB1c2luZyBzdGFuZGFyZCBkYXRlIGZvcm1hdC4KKwkJICogQHJldHVybiBzdHJpbmcgdmFsdWUgb2YgZW50cnkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKKwkJCisJCS8qKgorCQkgKiBDb252ZXJ0cyBlbnRyeSB0byBzdHJpbmcgdmFsdWUgdXNpbmcgc3RhbmRhcmQgZGF0ZSBmb3JtYXQuCisJCSAqIEBwYXJhbSBicmllZgorCQkgKiBAcmV0dXJuIHN0cmluZyB2YWx1ZSBvZiBlbnRyeQorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZyggYm9vbGVhbiBicmllZiApOworCisJCS8qKgorCQkgKiBDb252ZXJ0cyBlbnRyeSB0byBzdHJpbmcgdXNpbmcgc3BlY2lmaWVkIGRhdGUgZm9ybWF0LgorCQkgKiBAcGFyYW0gZGYKKwkJICogQHJldHVybiBzdHJpbmcgdmFsdWUgb2YgZW50cnkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoIERhdGVGb3JtYXQgZGYgKTsKKworCQkvKioKKwkJICogQ29udmVydHMgZW50cnkgdG8gc3RyaW5nIHVzaW5nIHNwZWNpZmllZCBkYXRlIGZvcm1hdC4KKwkJICogQHBhcmFtIGJyaWVmCisJCSAqIEBwYXJhbSBkZgorCQkgKiBAcmV0dXJuIHN0cmluZyB2YWx1ZSBvZiBlbnRyeQorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZyggYm9vbGVhbiBicmllZiwgRGF0ZUZvcm1hdCBkZiApOworCQkKKwkJLyoqCisJCSAqIEBwYXJhbSB3dHIKKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHZvaWQgd3JpdGUoIFdyaXRlciB3dHIgKSB0aHJvd3MgSU9FeGNlcHRpb247CisJCQorCQkvKioKKwkJICogQHBhcmFtIHd0cgorCQkgKiBAcGFyYW0gYnJpZWYKKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHZvaWQgd3JpdGUoIFdyaXRlciB3dHIsIGJvb2xlYW4gYnJpZWYgKSB0aHJvd3MgSU9FeGNlcHRpb247CisJCQorCQkvKioKKwkJICogQHBhcmFtIHd0cgorCQkgKiBAcGFyYW0gZGYKKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHZvaWQgd3JpdGUoIFdyaXRlciB3dHIsIERhdGVGb3JtYXQgZGYgKSB0aHJvd3MgSU9FeGNlcHRpb247CisJCQorCQkvKioKKwkJICogQHBhcmFtIHd0cgorCQkgKiBAcGFyYW0gYnJpZWYKKwkJICogQHBhcmFtIGRmCisJCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkJICovCisJCXB1YmxpYyB2b2lkIHdyaXRlKCBXcml0ZXIgd3RyLCBib29sZWFuIGJyaWVmLCBEYXRlRm9ybWF0IGRmICkgdGhyb3dzIElPRXhjZXB0aW9uOworCQkKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGlkIGFzc2lnbmVkIHRvIHRoZSBlbnRyeSB3aGVuIGl0IHdhcyBsb2dnZWQuCisJCSAqIElmIHRoZSBlbnRyeSB3YXMgbm90IGxvZ2dlZCwgcmV0dXJucyAwLgorCQkgKi8KKwkJcHVibGljIGxvbmcgZ2V0RW50cnlJZCgpOworCX0KKwkKKwkvKioKKwkgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBlbnRyeSB3aGljaCBpbmNsdWRlcyBzdXBwb3J0CisJICogZm9yIHRlbXBsYXRlIGFuZCB0aW1lc3RhbXAuCisJICovCisJYWJzdHJhY3QgcHVibGljIHN0YXRpYyBjbGFzcyBBYnN0cmFjdEVudHJ5IGltcGxlbWVudHMgRW50cnkKKwl7CisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIHRoZSBBYnN0cmFjdEVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCB0ZW1wbGF0ZQorCQkgKiBhbmQgdGltZXN0YW1wLgorCQkgKgorCQkgKiBAcGFyYW0gdGVtcGxhdGUgdGhlIHRlbXBsYXRlIHdoaWNoIGNyZWF0ZWQgdGhpcyBlbnRyeS4KKwkJICogQHBhcmFtIHRpbWVzdGFtcCB0aGUgY3VycmVudCB2YWx1ZSBvZiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJICovCisJCXB1YmxpYyBBYnN0cmFjdEVudHJ5KCBUZW1wbGF0ZSB0ZW1wbGF0ZSwgbG9uZyB0aW1lc3RhbXAgKQorCQl7CisJCQl0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7CisJCQl0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBUZW1wbGF0ZSB0ZW1wbGF0ZTsKKwkJCisJCXByaXZhdGUgZmluYWwgbG9uZyB0aW1lc3RhbXA7CisKKwkJZmluYWwgcHVibGljIFRlbXBsYXRlIGdldFRlbXBsYXRlKCkKKwkJeworCQkJcmV0dXJuIHRlbXBsYXRlOworCQl9CisKKwkJZmluYWwgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkKKwkJeworCQkJcmV0dXJuIHRpbWVzdGFtcDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlmaW5hbCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwkJeworCQkJcmV0dXJuIHRvU3RyaW5nKCBmYWxzZSwgZGVmYXVsdERhdGVGb3JtYXQgKTsKKwkJfQorCisJCWZpbmFsIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoIGJvb2xlYW4gYnJpZWYgKQorCQl7CisJCQlyZXR1cm4gdG9TdHJpbmcoIGJyaWVmLCBkZWZhdWx0RGF0ZUZvcm1hdCApOworCQl9CisKKwkJZmluYWwgcHVibGljIFN0cmluZyB0b1N0cmluZyggRGF0ZUZvcm1hdCBkZiApCisJCXsKKwkJCXJldHVybiB0b1N0cmluZyggZmFsc2UsIGRmICk7CisJCX0KKworCQlmaW5hbCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCBib29sZWFuIGJyaWVmLCBEYXRlRm9ybWF0IGRmICkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJCXdyaXRlKCBzdywgYnJpZWYsIGRmICk7CisJCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisJCQl9CisJCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCXJldHVybiAiZm9ybWF0IGZhaWxlZCwgY2F1Z2h0IGV4Y2VwdGlvbiAiK2U7CisJCQl9CisJCX0KKworCQlmaW5hbCBwdWJsaWMgdm9pZCB3cml0ZSggV3JpdGVyIHd0ciApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQl3cml0ZSggd3RyLCBmYWxzZSwgZGVmYXVsdERhdGVGb3JtYXQgKTsKKwkJfQorCisJCWZpbmFsIHB1YmxpYyB2b2lkIHdyaXRlKCBXcml0ZXIgd3RyLCBib29sZWFuIGJyaWVmICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCXdyaXRlKCB3dHIsIGJyaWVmLCBkZWZhdWx0RGF0ZUZvcm1hdCApOworCQl9CisKKwkJZmluYWwgcHVibGljIHZvaWQgd3JpdGUoIGZpbmFsIFdyaXRlciB3dHIsIERhdGVGb3JtYXQgZGYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJd3JpdGUoIHd0ciwgZmFsc2UsIGRmICk7CisJCX0KKwl9CisJCisJLyoqCisJICogRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgZW50cnkgd2hpY2ggZG9lc24ndCBkbyBqYWNrLgorCSAqIFJldHVybmVkIGJ5IFRlbXBsYXRlLm5ld0VudHJ5IHdoZW4gdGhlIGV2ZW50IGlzIGRpc2FibGVkCisJICogb3IgdGhlcmUgaXMgbm8gaW50ZXJlc3QgaW4gaXQuCisJICovCisJZmluYWwgcHVibGljIHN0YXRpYyBjbGFzcyBEdW1teUVudHJ5IGV4dGVuZHMgQWJzdHJhY3RFbnRyeQorCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIER1bW15RW50cnkuCisJCSAqLworCQlwdWJsaWMgRHVtbXlFbnRyeSgpCisJCXsKKwkJCXN1cGVyKCBudWxsLCAwICk7CisJCX0KKwkJCisJCXB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKCBTdHJpbmcgZmllbGQgKQorCQl7CisJCQkvLyBpZ25vcmUuCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCXB1YmxpYyBPYmplY3QgZ2V0RmllbGQoIFN0cmluZyBmaWVsZCApCisJCXsKKwkJCS8vIGlnbm9yZS4KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIEVudHJ5IHNldEZpZWxkKCBTdHJpbmcgZmllbGQsIE9iamVjdCB2YWx1ZSApCisJCXsKKwkJCS8vIGlnbm9yZS4KKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJcHVibGljIEVudHJ5IHJlcG9ydCgpCisJCXsKKwkJCS8vIGlnbm9yZS4KKwkJCXJldHVybiB0aGlzOworCQl9CisJCQorCQlwdWJsaWMgbG9uZyBnZXRFbnRyeUlkKCkKKwkJeworCQkJLy8gaWdub3JlLgorCQkJcmV0dXJuIDA7CisJCX0KKworCQlwdWJsaWMgdm9pZCBmb3JtYXRGaWVsZFZhbHVlcyggRmllbGRWYWx1ZUZvcm1hdHRlciBmb3JtYXR0ZXIgKQorCQl7CisJCQkvLyBpZ25vcmUuCisJCX0KKworCQlwdWJsaWMgdm9pZCB3cml0ZSggV3JpdGVyIHd0ciwgYm9vbGVhbiBicmllZiwgRGF0ZUZvcm1hdCBkZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQl3dHIud3JpdGUoICJEdW1teUVudHJ5KCIgKTsKKwkJCXd0ci53cml0ZSggZ2V0VGVtcGxhdGUoKS5nZXROYW1lKCkgKTsKKwkJCXd0ci53cml0ZSggIikiICk7CisJCX0KKwl9CisJCisJLyoqCisJICogQSBub3JtYWwgaW1wbGVtZW50YXRpb24gb2YgZW50cnkgd2hpY2ggc2F2ZXMgZmllbGQgdmFsdWVzCisJICogYW5kIHJlcG9ydHMgdG8gc2lua3MuIFJldHVybmVkIGJ5IFRlbXBsYXRlLm5ld0VudHJ5IHdoZW4KKwkgKiB0aGUgZXZlbnQgaXMgZW5hYmxlZCBhbmQgdGhlcmUgaXMgaW50ZXJlc3QgaW4gaXQuCisJICovCisJZmluYWwgcHVibGljIHN0YXRpYyBjbGFzcyBOb3JtYWxFbnRyeSBleHRlbmRzIEFic3RyYWN0RW50cnkKKwl7CisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIHRoZSBQbGFpbkVudHJ5LgorCQkgKgorCQkgKiBAcGFyYW0gdGVtcGxhdGUgdGhlIHRlbXBsYXRlIHdoaWNoIGNyZWF0ZWQgdGhpcyBlbnRyeS4KKwkJICogQHBhcmFtIGZpZWxkVmFsdWVzIGEgc2VxdWVuY2Ugb2YgZmllbGQvdmFsdWUgcGFpcnMgd2hpY2ggYXJlCisJCSAqIHBhcmFtZXRlcnMgb2YgdGhlIGV2ZW50LgorCQkgKi8KKwkJcHVibGljIE5vcm1hbEVudHJ5KCBUZW1wbGF0ZSB0ZW1wbGF0ZSwgT2JqZWN0IC4uLiBmaWVsZFZhbHVlcyApCisJCXsKKwkJCXN1cGVyKCB0ZW1wbGF0ZSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKTsKKwkJCWZpZWxkcyA9IG5ldyBPYmplY3RbdGVtcGxhdGUuY291bnRGaWVsZHMoKV07CisJCQlzZXRGaWVsZHMoIGZpZWxkVmFsdWVzICk7CisJCX0KKworCQkvLy8vLy8vLy8vLy8KKwkJLy8gRklFTERTIC8vCisJCS8vLy8vLy8vLy8vLworCQkKKwkJcHVibGljIGJvb2xlYW4gaGFzRmllbGQoIFN0cmluZyBmaWVsZCApCisJCXsKKwkJCXJldHVybiBoYXNGaWVsZCggZ2V0VGVtcGxhdGUoKS5nZXRGaWVsZElkKCBmaWVsZCwgZmFsc2UgKSApOworCQl9CisJCQorCQlwdWJsaWMgT2JqZWN0IGdldEZpZWxkKCBTdHJpbmcgZmllbGQgKQorCQl7CisJCQlyZXR1cm4gZ2V0RmllbGQoIGdldFRlbXBsYXRlKCkuZ2V0RmllbGRJZCggZmllbGQsIGZhbHNlICkgKTsKKwkJfQorCisJCXB1YmxpYyBFbnRyeSBzZXRGaWVsZCggU3RyaW5nIGZpZWxkLCBPYmplY3QgdmFsdWUgKQorCQl7CisJCQlyZXR1cm4gc2V0RmllbGQoIGdldFRlbXBsYXRlKCkuZ2V0RmllbGRJZCggZmllbGQsIHRydWUgKSwgdmFsdWUgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBmaWVsZFZhbHVlcyBhIHNlcXVlbmNlIG9mIGZpZWxkL3ZhbHVlIHBhaXJzIHdoaWNoIGFyZQorCQkgKiBwYXJhbWV0ZXJzIG9mIHRoZSBldmVudC4KKwkJICogQHJldHVybiB0aGUgZW50cnkuCisJCSAqLworCQlwdWJsaWMgRW50cnkgc2V0RmllbGRzKCBPYmplY3QgLi4uIGZpZWxkVmFsdWVzICkKKwkJeworCQkJaWYgKGZpZWxkVmFsdWVzLmxlbmd0aCA9PSAwKQorCQkJCXJldHVybiB0aGlzOworCQkJCisJCQlpZiAoZmllbGRWYWx1ZXMubGVuZ3RoICUgMiAhPSAwKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJmaWVsZFZhbHVlcyBtdXN0IGJlIHNlcXVlbmNlIG9mIGZpZWxkL3ZhbHVlIHBhaXJzIiApOworCQkJCisJCQlJdGVyYXRvcjxPYmplY3Q+IGkgPSBuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KCBmaWVsZFZhbHVlcyApOworCQkJd2hpbGUgKGkuaGFzTmV4dCgpKQorCQkJeworCQkJCU9iamVjdCBmaWVsZE9iaiA9IGkubmV4dCgpOworCQkJCU9iamVjdCB2YWx1ZU9iaiA9IGkubmV4dCgpOworCQkJCQorCQkJCWlmICghKGZpZWxkT2JqIGluc3RhbmNlb2YgU3RyaW5nKSkKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCSJmaWVsZCBub3QgYSBzdHJpbmc6ICIrZmllbGRPYmogKTsKKwkJCQkKKwkJCQlzZXRGaWVsZCggKFN0cmluZykgZmllbGRPYmosIHZhbHVlT2JqICk7CisJCQl9CisJCQkKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJLy8vLy8vLy8vLy8vLy8vLworCQkvLyBGSUVMRCBJTVBMIC8vCisJCS8vLy8vLy8vLy8vLy8vLy8KKwkJCisJCXByaXZhdGUgYm9vbGVhbiBoYXNGaWVsZCggaW50IGZpZCApCisJCXsKKwkJCXJldHVybiBnZXRGaWVsZCggZmlkICkgIT0gbnVsbDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBPYmplY3QgZ2V0RmllbGQoIGludCBmaWQgKQorCQl7CisJCQlyZXR1cm4gZmlkID49IDAgJiYgZmlkIDwgZmllbGRzLmxlbmd0aCA/IGZpZWxkc1tmaWRdIDogbnVsbDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBFbnRyeSBzZXRGaWVsZCggaW50IGZpZCwgT2JqZWN0IHZhbHVlICkKKwkJeworCQkJaWYgKGZpZCA+PSBmaWVsZHMubGVuZ3RoKQorCQkJeworCQkJCU9iamVjdFtdIG5ld0ZpZWxkcyA9IG5ldyBPYmplY3RbZ2V0VGVtcGxhdGUoKS5jb3VudEZpZWxkcygpXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KCBmaWVsZHMsIDAsIG5ld0ZpZWxkcywgMCwgZmllbGRzLmxlbmd0aCApOworCQkJCWZpZWxkcyA9IG5ld0ZpZWxkczsKKwkJCX0KKwkJCQorCQkJZmllbGRzW2ZpZF0gPSB2YWx1ZTsKKwkJCQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJCisJCXByaXZhdGUgT2JqZWN0W10gZmllbGRzOworCisJCS8vLy8vLy8vLy8vLworCQkvLyBSRVBPUlQgLy8KKwkJLy8vLy8vLy8vLy8vCisKKwkJcHVibGljIEVudHJ5IHJlcG9ydCgpCisJCXsKKwkJCWlmIChlbnRyeUlkICE9IDApCisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggInRoaXMgZW50cnkgYWxyZWFkeSByZXBvcnRlZCIgKTsKKwkJCQorCQkJZW50cnlJZCA9IGVudHJ5SWRHZW4ubmV4dCgpOworCQkJCisJCQlmb3IgKFNpbmsgc2luayA6IGdldFRlbXBsYXRlKCkuZ2V0U2lua3MoKSkKKwkJCQlzaW5rLnJlcG9ydCggdGhpcyApOworCQkJCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGZvcm1hdEZpZWxkVmFsdWVzKCBGaWVsZFZhbHVlRm9ybWF0dGVyIGZvcm1hdHRlciApCisJCQl0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJaW50IGkgPSAwOworCQkJZm9yIChTdHJpbmcgZmllbGQgOiBnZXRUZW1wbGF0ZSgpLmdldEZpZWxkcygpKQorCQkJCWZvcm1hdHRlci5mb3JtYXQoIGZpZWxkLCBnZXRGaWVsZCggaSsrICkgKTsKKwkJfQorCQkKKwkJcHVibGljIGxvbmcgZ2V0RW50cnlJZCgpCisJCXsKKwkJCXJldHVybiBlbnRyeUlkOworCQl9CisJCQorCQlwcml2YXRlIGxvbmcgZW50cnlJZDsKKworCQkvLy8vLy8vLy8vLy8vLy8vCisJCS8vIEZPUk1BVFRJTkcgLy8KKwkJLy8vLy8vLy8vLy8vLy8vLworCQkKKwkJcHVibGljIHZvaWQgd3JpdGUoIGZpbmFsIFdyaXRlciB3dHIsIGJvb2xlYW4gYnJpZWYsIERhdGVGb3JtYXQgZGYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJaWYgKCFicmllZikKKwkJCXsKKwkJCQlTdHJpbmcgZHM7CisJCQkJc3luY2hyb25pemVkIChkZikKKwkJCQl7CisJCQkJCWRzID0gZGYuZm9ybWF0KCBnZXRUaW1lc3RhbXAoKSApOworCQkJCX0KKwkJCQl3dHIud3JpdGUoIGRzICk7CisJCQkJd3RyLndyaXRlKCAiIDogIiApOworCQkJCXd0ci53cml0ZSggTG9uZy50b1N0cmluZyggZ2V0RW50cnlJZCgpICkgKTsKKwkJCQl3dHIud3JpdGUoICIgOiAiICk7CisJCQkJd3RyLndyaXRlKCBnZXRUZW1wbGF0ZSgpLmdldENhdGVnb3J5KCkudG9TdHJpbmcoKSApOworCQkJCXd0ci53cml0ZSggIiA6ICIgKTsKKwkJCQkKKwkJCQkvLyBwcmludCBvdXQgZHJvcCBjb3VudAorCQkJCWlmICggZ2V0VGVtcGxhdGUoKS5nZXRMaW1pdCgpID4gVGVtcGxhdGUuVU5MSU1JVEVEX0VOVFJJRVMgJiYgIGdldFRlbXBsYXRlKCkuZ2V0RHJvcENvdW50KCkgPiAwICkKKwkJCQl7CisJCQkJCXd0ci53cml0ZSggIigiICk7CisJCQkJCXd0ci53cml0ZSggSW50ZWdlci50b1N0cmluZyggZ2V0VGVtcGxhdGUoKS5nZXREcm9wQ291bnQoKSApICk7CisJCQkJCXd0ci53cml0ZSggIikiICk7CisJCQkJCXd0ci53cml0ZSggIiA6ICIgKTsKKwkJCQkJCisJCQkJCWdldFRlbXBsYXRlKCkucmVzZXREcm9wQ291bnQoKTsKKwkJCQl9CisJCQl9CisJCQkJCQkKKwkJCXd0ci53cml0ZSggZ2V0VGVtcGxhdGUoKS5nZXROYW1lKCkgKTsKKwkJCQorCQkJZm9ybWF0RmllbGRWYWx1ZXMoCisJCQkJbmV3IEZpZWxkVmFsdWVGb3JtYXR0ZXIoKQorCQkJCXsKKwkJCQkJcHJpdmF0ZSBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJcHVibGljIHZvaWQgZm9ybWF0KCBTdHJpbmcgZmllbGQsIE9iamVjdCB2YWx1ZSApCisJCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24KKwkJCQkJeworCQkJCQkJaWYgKHZhbHVlID09IG51bGwpCisJCQkJCQkJcmV0dXJuOworCQkJCQkJCisJCQkJCQlpZiAoZmlyc3QpCisJCQkJCQl7CisJCQkJCQkJd3RyLndyaXRlKCAiIDogIiApOworCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJd3RyLndyaXRlKCAiOyAiICk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCXd0ci53cml0ZSggZmllbGQgKTsKKwkJCQkJCXd0ci53cml0ZSggJz0nICk7CisJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBUaHJvd2FibGUpCisJCQkJCQkJd3RyLndyaXRlKCBnZXRTdGFja1RyYWNlKCAoVGhyb3dhYmxlKSB2YWx1ZSApICk7CisJCQkJCQllbHNlCisJCQkJCQkJd3RyLndyaXRlKCB2YWx1ZS50b1N0cmluZygpICk7CisJCQkJCX0KKwkJCQl9ICk7CisJCQl3dHIud3JpdGUoICc7JyApOworCQl9CisJfQorCQorCS8qKgorCSAqIEFycmF5IGl0ZXJhdG9yIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpdGVyYXRvciBvdmVyCisJICogYW4gYXJiaXRyYXJ5IGFycmF5IG9mIGEgc3BlY2lmaWVkIHR5cGUuCisJICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LgorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJyYXlJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+CisJeworCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgQXJyYXlJdGVyYXRvci4KKwkJICoKKwkJICogQHBhcmFtIHZhbHVlcyB0aGUgYXJyYXkgb2YgdmFsdWVzIHRvIGl0ZXJhdGUgb3Zlci4KKwkJICovCisJCXB1YmxpYyBBcnJheUl0ZXJhdG9yKCBUW10gdmFsdWVzICkKKwkJeworCQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJCX0KKwkJCisJCXByaXZhdGUgVFtdIHZhbHVlczsKKwkJCisJCXByaXZhdGUgaW50IGluZGV4OworCisJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKQorCQl7CisJCQlyZXR1cm4gaW5kZXggPCB2YWx1ZXMubGVuZ3RoOworCQl9CisKKwkJcHVibGljIFQgbmV4dCgpCisJCXsKKwkJCWlmIChpbmRleCA+PSB2YWx1ZXMubGVuZ3RoKQorCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisJCQkKKwkJCXJldHVybiB2YWx1ZXNbaW5kZXgrK107CisJCX0KKworCQlwdWJsaWMgdm9pZCByZW1vdmUoKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBJbnRlcmZhY2UgZm9yIHRob3NlIGludGVyZXN0ZWQgaW4gZXZlbnRzLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgU2luayBleHRlbmRzIFN0YXJ0YWJsZQorCXsKKwkJLyoqCisJCSAqIFJlcG9ydHMgdGhlIHNwZWNpZmllZCBldmVudCB0byB0aGUgc2luay4KKwkJICogQHBhcmFtIGVudHJ5CisJCSAqLworCQlwdWJsaWMgdm9pZCByZXBvcnQoIEVudHJ5IGVudHJ5ICk7CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHNpbmsgKGlmIGl0IGhhcyBvbmUpLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKwkJLyoqCisJCSAqIEBwYXJhbSB0ZW1wbGF0ZQorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNpbmsgaGFzIGFueSBpbnRlcmVzdCBpbiB0aGUgdGVtcGxhdGUuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBoYXNJbnRlcmVzdCggVGVtcGxhdGUgdGVtcGxhdGUgKTsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gdG9rZW5MaXN0CisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRBY2NlcHRDYXQoIFN0cmluZyB0b2tlbkxpc3QgKTsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gdG9rZW5MaXN0CisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXREZW55Q2F0KCBTdHJpbmcgdG9rZW5MaXN0ICk7CisJCQorCQkvKioKKwkJICogQHBhcmFtIHRva2VuTGlzdAorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0QWNjZXB0TmFtZSggU3RyaW5nIHRva2VuTGlzdCApOworCQkKKwkJLyoqCisJCSAqIEBwYXJhbSB0b2tlbkxpc3QKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldERlbnlOYW1lKCBTdHJpbmcgdG9rZW5MaXN0ICk7CisJfQorCQorCS8qKgorCSAqIEludGVyZmFjZSBmb3IgcmVwb3J0aW5nIGZpZWxkL3ZhbHVlIHBhaXJzIGluIHJlc3BvbnNlIHRvIGEKKwkgKiBjYWxsIHRvIEVudHJ5LmZvcm1hdEZpZWxkVmFsdWVzKCkuCisJICogCisJICogQHNlZSBFbnRyeSNmb3JtYXRGaWVsZFZhbHVlcyhGaWVsZFZhbHVlRm9ybWF0dGVyKQorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgRmllbGRWYWx1ZUZvcm1hdHRlcgorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgbmFtZS4KKwkJICogQHBhcmFtIHZhbHVlIHRoZSBmaWVsZCB2YWx1ZSwgbWF5IGJlIG51bGwuCisJCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkJICovCisJCXB1YmxpYyB2b2lkIGZvcm1hdCggU3RyaW5nIGZpZWxkLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgSU9FeGNlcHRpb247CisJfQorCQorCS8qKgorCSAqIEEgY29tYmluYXRpb24gaW50ZXJmYWNlIG9mIFNpbmsgYW5kIEZpZWxkVmFsdWVGb3JtYXR0ZXIuCisJICovCisJcHVibGljIGludGVyZmFjZSBTaW5rRmllbGRWYWx1ZUZvcm1hdHRlciBleHRlbmRzIFNpbmssIEZpZWxkVmFsdWVGb3JtYXR0ZXIKKwl7CisJCS8vIG5vdGhpbmcgZWxzZSB0byBhZGQuCisJfQorCisJLyoqCisJICogUmVtb3ZlcyBhbmQgc3RvcHMgYWxsIHRoZSBzaW5rcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKQorCXsKKwkJZm9yIChTaW5rIHNpbmsgOiBMb2cuZ2V0U2lua3MoKSkKKwkJeworCQkJTG9nLnJlbW92ZVNpbmsoIHNpbmsgKTsKKwkJCXRyeQorCQkJeworCQkJCXNpbmsuc3RvcCgpOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIGZpZWxkVmFsdWVzCisJICogQHJldHVybiBhbiBleGNlcHRpb24gcmVwb3J0IHVzaW5nIHRoZSBsb2cgZW50cnkgbWVjaGFuaXNtCisJICovCisJcHVibGljIHN0YXRpYyBMb2dFbnRyeUV4Y2VwdGlvbiBuZXdFeGNlcHRpb24oIFN0cmluZyBuYW1lLCBPYmplY3QgLi4uIGZpZWxkVmFsdWVzICkKKwl7CisJCXJldHVybiBuZXcgTG9nRW50cnlFeGNlcHRpb24oIG5hbWUsIGZpZWxkVmFsdWVzICk7CisJfQorCQorCS8qKgorCSAqCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBMb2dFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEVudHJ5CisJeworCQkvKioKKwkJICogQHBhcmFtIG5hbWUKKwkJICogQHBhcmFtIGZpZWxkVmFsdWVzCisJCSAqLworCQlwdWJsaWMgTG9nRW50cnlFeGNlcHRpb24oIFN0cmluZyBuYW1lLCBPYmplY3QgLi4uIGZpZWxkVmFsdWVzICkKKwkJeworCQkJVGVtcGxhdGUgdCA9IExvZy5nZXRUZW1wbGF0ZSggbmFtZSwgZ2V0QWxsb3dBdXRvUmVnaXN0ZXIoKSwgQ2F0ZWdvcnkuRXJyb3IsIHRydWUgKTsKKwkJCWVudHJ5ID0gbmV3IE5vcm1hbEVudHJ5KCB0LCBmaWVsZFZhbHVlcyApOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgZW50cnkgYXMgcmVwb3J0ZWQuCisJCSAqLworCQlwdWJsaWMgTG9nRW50cnlFeGNlcHRpb24gcmVwb3J0KCkKKwkJeworCQkJaWYgKG9rVG9Mb2cgJiYgZW50cnkuZ2V0VGVtcGxhdGUoKS5pc0VuYWJsZWQoKSkKKwkJCXsKKwkJCQlva1RvTG9nID0gZmFsc2U7CisJCQkJZW50cnkucmVwb3J0KCk7CisJCQl9CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCS8qKgorCQkgKiBAcGFyYW0gb2tUb0xvZworCQkgKiBAcmV0dXJuIHRoaXMgbG9nIGVudHJ5IGV4Y2VwdGlvbi4KKwkJICovCisJCXB1YmxpYyBMb2dFbnRyeUV4Y2VwdGlvbiBzZXRPa1RvTG9nKCBib29sZWFuIG9rVG9Mb2cgKQorCQl7CisJCQl0aGlzLm9rVG9Mb2cgPSBva1RvTG9nOworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJCisJCXByaXZhdGUgYm9vbGVhbiBva1RvTG9nID0gdHJ1ZTsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKKwkJeworCQkJcmV0dXJuIGdldE1lc3NhZ2UoIGZhbHNlICk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gYnJpZWYKKwkJICogQHJldHVybiBhIHRleHQgZm9ybSBvZiB0aGUgbWVzc2FnZS4KKwkJICogQHNlZSAjdG9TdHJpbmcoYm9vbGVhbikKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSggYm9vbGVhbiBicmllZiApCisJCXsKKwkJCXJldHVybiB0b1N0cmluZyggYnJpZWYgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBFbnRyeSBlbnRyeTsKKwkJCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gRU5UUlkgTUVUSE9EUyAvLworCQkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJcHVibGljIFRlbXBsYXRlIGdldFRlbXBsYXRlKCkKKwkJeworCQkJcmV0dXJuIGVudHJ5LmdldFRlbXBsYXRlKCk7CisJCX0KKworCQlwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKQorCQl7CisJCQlyZXR1cm4gZW50cnkuZ2V0VGltZXN0YW1wKCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZCggU3RyaW5nIGZpZWxkICkKKwkJeworCQkJcmV0dXJuIGVudHJ5Lmhhc0ZpZWxkKCBmaWVsZCApOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRGaWVsZCggU3RyaW5nIGZpZWxkICkKKwkJeworCQkJcmV0dXJuIGVudHJ5LmdldEZpZWxkKCBmaWVsZCApOworCQl9CisKKwkJcHVibGljIExvZ0VudHJ5RXhjZXB0aW9uIHNldEZpZWxkKCBTdHJpbmcgZmllbGQsIE9iamVjdCB2YWx1ZSApCisJCXsKKwkJCWVudHJ5LnNldEZpZWxkKCBmaWVsZCwgdmFsdWUgKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJcHVibGljIHZvaWQgZm9ybWF0RmllbGRWYWx1ZXMoIEZpZWxkVmFsdWVGb3JtYXR0ZXIgZm9ybWF0dGVyICkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQllbnRyeS5mb3JtYXRGaWVsZFZhbHVlcyggZm9ybWF0dGVyICk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJCXsKKwkJCXJldHVybiB0b1N0cmluZyggZmFsc2UgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBicmllZgorCQkgKiBAcmV0dXJuIGEgdGV4dCBmb3JtIG9mIHRoZSBtZXNzYWdlLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZyggYm9vbGVhbiBicmllZiApCisJCXsKKwkJCXJldHVybiBlbnRyeS50b1N0cmluZyggYnJpZWYgKTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZyggRGF0ZUZvcm1hdCBkZiApCisJCXsKKwkJCXJldHVybiBlbnRyeS50b1N0cmluZyggZGYgKTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZyggYm9vbGVhbiBicmllZiwgRGF0ZUZvcm1hdCBkZiApCisJCXsKKwkJCXJldHVybiBlbnRyeS50b1N0cmluZyggYnJpZWYsIGRmICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB3cml0ZSggV3JpdGVyIHd0ciApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQllbnRyeS53cml0ZSggd3RyICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB3cml0ZSggV3JpdGVyIHd0ciwgYm9vbGVhbiBicmllZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQllbnRyeS53cml0ZSggd3RyLCBicmllZiApOworCQl9CisKKwkJcHVibGljIHZvaWQgd3JpdGUoIFdyaXRlciB3dHIsIERhdGVGb3JtYXQgZGYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJZW50cnkud3JpdGUoIHd0ciwgZGYgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHdyaXRlKCBXcml0ZXIgd3RyLCBib29sZWFuIGJyaWVmLCBEYXRlRm9ybWF0IGRmICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCWVudHJ5LndyaXRlKCB3dHIsIGJyaWVmLCBkZiApOworCQl9CisKKwkJcHVibGljIGxvbmcgZ2V0RW50cnlJZCgpCisJCXsKKwkJCXJldHVybiBlbnRyeS5nZXRFbnRyeUlkKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvTW9uaXRvci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL01vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjlmNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL01vbml0b3IuamF2YQpAQCAtMCwwICsxLDMzOCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCisKKy8qKgorICogQSBjbGFzcyB3aGljaCB3ZSBjYW4gdXNlIHRvIG1vbml0b3IgY29uZGl0aW9ucy4KKyAqIAorICogQHBhcmFtIDxUPiBUaGUgdHlwZSBvZiBvYmplY3QgdGhhdCBtYXkgYmUgc3RvcmVkIGluIHRoZSBtb25pdG9yLgorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvcjxUPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIE1vbml0b3IuCisJICogCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBtb25pdG9yLgorCSAqIAorCSAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhpcyBtb25pdG9yLgorCSAqLworCXB1YmxpYyBNb25pdG9yKCBTdHJpbmcgZGVzY3JpcHRpb24sIFQgaW5pdGlhbFZhbHVlICkKKwl7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJdGhpcy52YWx1ZSA9IGluaXRpYWxWYWx1ZTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgTW9uaXRvciB3aXRoIG51bGwgaW5pdGlhbCB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1vbml0b3IuCisJICovCisJcHVibGljIE1vbml0b3IoIFN0cmluZyBkZXNjcmlwdGlvbiApCisJeworCQl0aGlzKCBkZXNjcmlwdGlvbiwgbnVsbCApOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1vbml0b3IuCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOworCQorCXByaXZhdGUgVCB2YWx1ZTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuICJNb25pdG9yICIrZGVzY3JpcHRpb24rIjogIit2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbW9uaXRvci4KKwkgKi8KKwlwdWJsaWMgVCBnZXQoKQorCXsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgc2V0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIFQgc2V0KCBUIG5ld1ZhbHVlICkKKwl7CisJCVQgb2xkVmFsdWUgPSB2YWx1ZTsKKwkJdmFsdWUgPSBuZXdWYWx1ZTsKKwkJbm90aWZ5QWxsKCk7CisJCXJldHVybiBvbGRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBXYWl0cyB1bnRpbCB2YWx1ZSBlcXVhbHMgdGhlIGRlc2lyZWQgdmFsdWUgYW5kCisJICogdGhlbiBzZXRzIHRoZSB2YWx1ZS4gV2lsbCB3YWl0IGZvcmV2ZXIuCisJICogCisJICogQHBhcmFtIGRlc2lyZWRWYWx1ZSB0aGUgdmFsdWUgd2Ugd2FudC4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHNldC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUKKwkgKiAKKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHdhaXRpbmcgd2FzIGludGVycnVwdGVkLgorCSAqIAorCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpZiB3ZSB3YWl0ZWQgdG9vIGxvbmcuCisJICovCisJcHVibGljIFQgd2FpdFVudGlsRXFBbmRTZXQoIFQgZGVzaXJlZFZhbHVlLCBUIG5ld1ZhbHVlICkKKwkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisJeworCQlyZXR1cm4gd2FpdFVudGlsRXFBbmRTZXQoIGRlc2lyZWRWYWx1ZSwgMCwgbmV3VmFsdWUgKTsKKwl9CisKKwkvKioKKwkgKiBXYWl0cyB1bnRpbCB2YWx1ZSBlcXVhbHMgdGhlIGRlc2lyZWQgdmFsdWUgYW5kCisJICogdGhlbiBzZXRzIHRoZSB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzaXJlZFZhbHVlIHRoZSB2YWx1ZSB3ZSB3YW50LgorCSAqIAorCSAqIEBwYXJhbSBtYXhEZWxheSB0aGUgbWF4IGFtb3VudCBvZiB0aW1lIGluIG1zIHRvIHdhaXQuCisJICogSWYgMCBpcyBzcGVjaWZpZWQsIHdlIHdpbGwgd2FpdCBmb3JldmVyLgorCSAqIAorCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgc2V0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZQorCSAqIAorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQuCisJICogCisJICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGlmIHdlIHdhaXRlZCB0b28gbG9uZy4KKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIFQgd2FpdFVudGlsRXFBbmRTZXQoIFQgZGVzaXJlZFZhbHVlLCBpbnQgbWF4RGVsYXksCisJCVQgbmV3VmFsdWUgKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKwl7CisJCXdhaXRVbnRpbEVxKCBkZXNpcmVkVmFsdWUsIG1heERlbGF5ICk7CisJCXJldHVybiBzZXQoIG5ld1ZhbHVlICk7CisJfQorCisJLyoqCisJICogV2FpdHMgdW50aWwgdmFsdWUgZXF1YWxzIHRoZSBkZXNpcmVkIHZhbHVlLiBXaWxsIHdhaXQgZm9yZXZlci4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzaXJlZFZhbHVlIHRoZSB2YWx1ZSB3ZSB3YW50LgorCSAqIAorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQuCisJICogCisJICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGlmIHdlIHdhaXRlZCB0b28gbG9uZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxFcSggVCBkZXNpcmVkVmFsdWUgKQorCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKwl7CisJCXdhaXRVbnRpbEVxKCBkZXNpcmVkVmFsdWUsIDAgKTsKKwl9CisKKwkvKioKKwkgKiBXYWl0cyB1bnRpbCB2YWx1ZSBlcXVhbHMgdGhlIGRlc2lyZWQgdmFsdWUuCisJICogCisJICogQHBhcmFtIGRlc2lyZWRWYWx1ZSB0aGUgdmFsdWUgd2Ugd2FudC4KKwkgKiAKKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGhlIG1heCBhbW91bnQgb2YgdGltZSBpbiBtcyB0byB3YWl0LgorCSAqIElmIDAgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIHdhaXQgZm9yZXZlci4KKwkgKiAKKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHdhaXRpbmcgd2FzIGludGVycnVwdGVkLgorCSAqIAorCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpZiB3ZSB3YWl0ZWQgdG9vIGxvbmcuCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdhaXRVbnRpbEVxKCBUIGRlc2lyZWRWYWx1ZSwgaW50IG1heERlbGF5ICkKKwkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisJeworCQljaGVja0RlbGF5KCBtYXhEZWxheSApOworCQkKKwkJbG9uZyBub3cgPSBUaW1lci5nZXROYW5vcygpOworCQlsb25nIGVuZCA9IGVuZFRpbWUoIG5vdywgbWF4RGVsYXkgKTsKKwkJCisJCWxvbmcgZDsKKwkJd2hpbGUgKCFlcSggdmFsdWUsIGRlc2lyZWRWYWx1ZSApICYmIChkID0gcmVtVGltZSggZW5kLCBub3cgKSkgPiAwKQorCQl7CisJCQl3YWl0KCBkICk7CisJCQlub3cgPSBUaW1lci5nZXROYW5vcygpOworCQl9CisJCQorCQlpZiAoIWVxKCB2YWx1ZSwgZGVzaXJlZFZhbHVlICkpCisJCQl0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbiggInRpbWVvdXQiICk7CisJfQorCisJLyoqCisJICogV2FpdHMgdW50aWwgdmFsdWUgZG9lcyBub3QgZXF1YWwgdGhlIHVuZGVzaXJlZCB2YWx1ZSBhbmQgdGhlbgorCSAqIHNldHMgdGhlIHZhbHVlLiBXaWxsIHdhaXQgZm9yZXZlci4KKwkgKiAKKwkgKiBAcGFyYW0gdW5kZXNpcmVkVmFsdWUgdGhlIHZhbHVlIHdlIGRvIG5vdCB3YW50LgorCSAqIAorCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgc2V0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZQorCSAqIAorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQuCisJICogCisJICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGlmIHdlIHdhaXRlZCB0b28gbG9uZy4KKwkgKi8KKwlwdWJsaWMgVCB3YWl0VW50aWxOb3RFcUFuZFNldCggVCB1bmRlc2lyZWRWYWx1ZSwgVCBuZXdWYWx1ZSApCisJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHdhaXRVbnRpbE5vdEVxQW5kU2V0KCB1bmRlc2lyZWRWYWx1ZSwgMCwgbmV3VmFsdWUgKTsKKwl9CisKKwkvKioKKwkgKiBXYWl0cyB1bnRpbCB2YWx1ZSBkb2VzIG5vdCBlcXVhbCB0aGUgdW5kZXNpcmVkIHZhbHVlIGFuZCB0aGVuCisJICogc2V0cyB0aGUgdmFsdWUuCisJICogCisJICogQHBhcmFtIHVuZGVzaXJlZFZhbHVlIHRoZSB2YWx1ZSB3ZSBkbyBub3Qgd2FudC4KKwkgKiAKKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGhlIG1heCBhbW91bnQgb2YgdGltZSBpbiBtcyB0byB3YWl0LgorCSAqIElmIDAgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIHdhaXQgZm9yZXZlci4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHNldC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUKKwkgKiAKKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHdhaXRpbmcgd2FzIGludGVycnVwdGVkLgorCSAqIAorCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpZiB3ZSB3YWl0ZWQgdG9vIGxvbmcuCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBUIHdhaXRVbnRpbE5vdEVxQW5kU2V0KCBUIHVuZGVzaXJlZFZhbHVlLCBpbnQgbWF4RGVsYXksCisJCVQgbmV3VmFsdWUgKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKwl7CisJCXdhaXRVbnRpbE5vdEVxKCB1bmRlc2lyZWRWYWx1ZSwgbWF4RGVsYXkgKTsKKwkJcmV0dXJuIHNldCggbmV3VmFsdWUgKTsKKwl9CisJCisJLyoqCisJICogV2FpdHMgdW50aWwgdmFsdWUgZG9lcyBub3QgZXF1YWwgdGhlIHVuZGVzaXJlZCB2YWx1ZS4gV2lsbAorCSAqIHdhaXQgZm9yZXZlci4KKwkgKiAKKwkgKiBAcGFyYW0gdW5kZXNpcmVkVmFsdWUgdGhlIHZhbHVlIHdlIGRvIG5vdCB3YW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuCisJICogCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZC4KKwkgKiAKKwkgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaWYgd2Ugd2FpdGVkIHRvbyBsb25nLgorCSAqLworCXB1YmxpYyBUIHdhaXRVbnRpbE5vdEVxKCBUIHVuZGVzaXJlZFZhbHVlICkKKwkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisJeworCQlyZXR1cm4gd2FpdFVudGlsTm90RXEoIHVuZGVzaXJlZFZhbHVlLCAwICk7CisJfQorCQorCS8qKgorCSAqIFdhaXRzIHVudGlsIHZhbHVlIGRvZXMgbm90IGVxdWFsIHRoZSB1bmRlc2lyZWQgdmFsdWUuCisJICogCisJICogQHBhcmFtIHVuZGVzaXJlZFZhbHVlIHRoZSB2YWx1ZSB3ZSBkbyBub3Qgd2FudC4KKwkgKiAKKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGhlIG1heCBhbW91bnQgb2YgdGltZSBpbiBtcyB0byB3YWl0LgorCSAqIElmIDAgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIHdhaXQgZm9yZXZlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLgorCSAqIAorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQuCisJICogCisJICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGlmIHdlIHdhaXRlZCB0b28gbG9uZy4KKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIFQgd2FpdFVudGlsTm90RXEoIFQgdW5kZXNpcmVkVmFsdWUsIGludCBtYXhEZWxheSApCisJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbgorCXsKKwkJY2hlY2tEZWxheSggbWF4RGVsYXkgKTsKKwkJCisJCWxvbmcgbm93ID0gVGltZXIuZ2V0TmFub3MoKTsKKwkJbG9uZyBlbmQgPSBlbmRUaW1lKCBub3csIG1heERlbGF5ICk7CisJCQorCQlsb25nIGQ7CisJCXdoaWxlIChlcSggdmFsdWUsIHVuZGVzaXJlZFZhbHVlICkgJiYgKGQgPSByZW1UaW1lKCBlbmQsIG5vdyApKSA+IDApCisJCXsKKwkJCXdhaXQoIGQgKTsKKwkJCW5vdyA9IFRpbWVyLmdldE5hbm9zKCk7CisJCX0KKwkJCisJCWlmIChlcSggdmFsdWUsIHVuZGVzaXJlZFZhbHVlICkpCisJCQl0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbiggInRpbWVvdXQiICk7CisJCQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJJVkFURSBNRVRIT0RTIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJcHJpdmF0ZSB2b2lkIGNoZWNrRGVsYXkoIGludCBtYXhEZWxheSApCisJeworCQlpZiAobWF4RGVsYXkgPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm1heERlbGF5IDwgMCIgKTsKKwl9CisKKwkvKioKKwkgKiBDYWxjdWxhdGVzIHRoZSBlbmRpbmcgdGltZSBmb3Igd2FpdGluZy4KKwkgKiAKKwkgKiBAcGFyYW0gbm93IGN1cnJlbnQgbmFub3RpbWUuCisJICogCisJICogQHBhcmFtIG1heERlbGF5IHRoZSBtYXggYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gd2FpdC4KKwkgKiBJZiAwIGlzIHNwZWNpZmllZCwgd2Ugd2lsbCB3YWl0IGZvcmV2ZXIuCisJICogCisJICogQHJldHVybiB0aGUgbmFub3RpbWUgZm9yIGVuZGluZy4KKwkgKi8KKwlwcml2YXRlIGxvbmcgZW5kVGltZSggbG9uZyBub3csIGludCBtYXhEZWxheSApCisJeworCQlyZXR1cm4gbWF4RGVsYXkgPiAwID8gbm93ICsgbWF4RGVsYXkgKiBUaW1lci5OQU5PU19QRVJfTUlMTEkgOiBMb25nLk1BWF9WQUxVRTsKKwl9CisJCisJLyoqCisJICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIG5vdyB0byBlbmQuCisJICogCisJICogQHBhcmFtIGVuZCBuYW5vdGltZSBmb3IgZW5kaW5nLgorCSAqIAorCSAqIEBwYXJhbSBub3cgY3VycmVudCBuYW5vdGltZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSBub3cgdG8gZW5kLgorCSAqLworCXByaXZhdGUgbG9uZyByZW1UaW1lKCBsb25nIGVuZCwgbG9uZyBub3cgKQorCXsKKwkJcmV0dXJuIChlbmQgLSBub3cpIC8gVGltZXIuTkFOT1NfUEVSX01JTExJOworCX0KKworCS8qKgorCSAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqIAorCSAqIEBwYXJhbSB2MSBhIHZhbHVlIHRvIGNvbXBhcmUsIHdoaWNoIG1heSBiZSBudWxsLgorCSAqIAorCSAqIEBwYXJhbSB2MiBhbm90aGVyIHZhbHVlIHRvIGNvbXBhcmUsIHdoaWNoIG1heSBiZSBudWxsLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBJZiBib3RoCisJICogdmFsdWVzIGFyZSBudWxsLCB0aGV5IGFyZSBjb25zaWRlcmVkIGVxdWFsLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBlcSggVCB2MSwgVCB2MiApCisJeworCQlpZiAodjEgIT0gbnVsbCAmJiB2MiAhPSBudWxsKQorCQkJcmV0dXJuIHYxLmVxdWFscyggdjIgKTsKKwkJCisJCXJldHVybiB2MSA9PSB2MjsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvUGVyZlRlc3QuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9QZXJmVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTJkOTYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvUGVyZlRlc3QuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRnJhbWV3b3JrIGZvciBydW5uaW5nIHBlcmZvcm1hbmNlIHRlc3RzLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgUGVyZlRlc3QKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBQZXJmVGVzdC4KKwkgKiBAcGFyYW0gZGVzY3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0LgorCSAqIEBwYXJhbSBydW50aW1lIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBydW4gZWFjaCB0ZXN0IGN5Y2xlLgorCSAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHRlc3QgY3ljbGVzIHRvIHJ1bi4KKwkgKiBAcGFyYW0gblRocmVhZHMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZSBmb3IgdGhlIHRlc3QuCisJICovCisJcHVibGljIFBlcmZUZXN0KCBTdHJpbmcgZGVzY3IsIGludCBydW50aW1lLCBpbnQgY291bnQsIGludCBuVGhyZWFkcyApCisJeworCQlpZiAocnVudGltZSA8IDEpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAicnVudGltZSA8IDEiICk7CisJCQorCQlpZiAoY291bnQgPCAxKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNvdW50IDwgMSIgKTsKKwkJCisJCWlmIChuVGhyZWFkcyA8IDEpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiblRocmVhZHMgPCAxIiApOworCQkKKwkJdGhpcy5kZXNjciA9IGRlc2NyOworCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOworCQl0aGlzLmNvdW50ID0gY291bnQ7CisJCXRoaXMublRocmVhZHMgPSBuVGhyZWFkczsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgUGVyZlRlc3QuCisJICogQHBhcmFtIGRlc2NyIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdC4KKwkgKiBAcGFyYW0gcnVudGltZSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gcnVuIGVhY2ggdGVzdCBjeWNsZS4KKwkgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiB0ZXN0IGN5Y2xlcyB0byBydW4uCisJICovCisJcHVibGljIFBlcmZUZXN0KCBTdHJpbmcgZGVzY3IsIGludCBydW50aW1lLCBpbnQgY291bnQgKQorCXsKKwkJdGhpcyggZGVzY3IsIHJ1bnRpbWUsIGNvdW50LCAxICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyOworCQorCXByaXZhdGUgZmluYWwgaW50IHJ1bnRpbWU7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgY291bnQ7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgblRocmVhZHM7CisJCisJLyoqCisJICogUnVucyB0aGUgcGVyZiB0ZXN0LgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJZmluYWwgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKwkJbG9uZyBvbGRuID0gMDsKKwkJbG9uZyBuID0gMTsKKwkJZG91YmxlIHQgPSAwOworCQl3aGlsZSAodCA8IDEpCisJCXsKKwkJCWlmICh0ID4gMC4xKQorCQkJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXM6ICVkIHRvb2sgJWYsIHRyeWluZyAlZCB0byBnZXQgPj0gMSBzZWNvbmRcbiIsIGRlc2NyLCBvbGRuLCB0LCBuICk7CisJCQlvbGRuID0gbjsKKwkJCXQgPSBydW5PbmUoIG4gKTsKKwkJCW4gKj0gMjsKKwkJfQorCQluID0gb2xkbjsKKwkJCisJCWludCBrID0gMjsKKwkJbiA9IChsb25nKSAoayAqIG4gLyB0KTsKKwkJU3lzdGVtLm91dC5wcmludGYoICIlczogJWQgdG9vayAlZiwgdHJ5aW5nICVkIGZvciAlZCBzZWNvbmRzXG4iLCBkZXNjciwgb2xkbiwgdCwgbiwgayApOworCQlvbGRuID0gbjsKKwkJdCA9IHJ1bk9uZSggbiApOworCQkKKwkJayA9IDQ7CisJCW4gPSAobG9uZykgKGsgKiBuIC8gdCk7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXM6ICVkIHRvb2sgJWYsIHRyeWluZyAlZCBmb3IgJWQgc2Vjb25kc1xuIiwgZGVzY3IsIG9sZG4sIHQsIG4sIGsgKTsKKwkJb2xkbiA9IG47CisJCXQgPSBydW5PbmUoIG4gKTsKKwkJCisJCW4gPSAobG9uZykgKHJ1bnRpbWUgKiBuIC8gdCk7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXM6ICVkIHRvb2sgJWYsIHVzaW5nICVkIGZvciAlZCBzZWNvbmRzXG4iLAorCQkJZGVzY3IsIG9sZG4sIHQsIG4sIHJ1bnRpbWUgKTsKKwkJCisJCUxpc3Q8RG91YmxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCBjb3VudCApOworCQlkb3VibGUgc3VtID0gMDsKKwkJZm9yIChpbnQgaSA9IDE7IGkgPD0gY291bnQ7IGkrKykKKwkJeworCQkJdCA9IHJ1bk9uZSggbiApOworCQkJZG91YmxlIHIgPSBuL3Q7CisJCQlsaXN0LmFkZCggciApOworCQkJc3VtICs9IHI7CisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzICVkLyVkXHQlZFx0JWRcdCVmXHQlZlx0JWZcbiIsCisJCQkJZGVzY3IsIGksIGNvdW50LCBuVGhyZWFkcywgbiwgdCwgciwgcipuVGhyZWFkcyApOworCQl9CisJCUNvbGxlY3Rpb25zLnNvcnQoIGxpc3QgKTsKKwkJU3lzdGVtLm91dC5wcmludGYoICIlcyBtaW5cdCVmXG4iLCBkZXNjciwgbGlzdC5nZXQoIDAgKSpuVGhyZWFkcyApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzIG1lZGlhblx0JWZcbiIsIGRlc2NyLCBsaXN0LmdldCggY291bnQvMiApKm5UaHJlYWRzICk7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXMgYXZnXHQlZlxuIiwgZGVzY3IsIHN1bSpuVGhyZWFkcy9jb3VudCApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzIG1heFx0JWZcbiIsIGRlc2NyLCBsaXN0LmdldCggY291bnQtMSApKm5UaHJlYWRzICk7CisgICAgfQorCQorCWZpbmFsIHByaXZhdGUgZG91YmxlIHJ1bk9uZSggbG9uZyBuICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkgICAgbG9uZyB0MCA9IFN5c3RlbS5uYW5vVGltZSgpOworCSAgICAKKwkgICAgaWYgKG5UaHJlYWRzID09IDEpCisJICAgIAlydW4oIG4gKTsKKwkgICAgZWxzZQorCSAgICAJcnVuVGhyZWFkcyggbiApOworCSAgICAKKwkgICAgbG9uZyB0MSA9IFN5c3RlbS5uYW5vVGltZSgpOworCSAgICByZXR1cm4gKHQxIC0gdDApIC8gMTAwMDAwMDAwMC4wOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcnVuVGhyZWFkcyggZmluYWwgbG9uZyBuICkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQlUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtuVGhyZWFkc107CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG5UaHJlYWRzOyBpKyspCisJCXsKKwkJCXRocmVhZHNbaV0gPSBuZXcgVGhyZWFkKCBuZXcgUnVubmFibGUoKQorCQkJeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQkJeworCQkJCQl0cnkKKwkJCQkJeworCQkJCQkJUGVyZlRlc3QudGhpcy5ydW4oIG4gKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCQkJeworCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gKTsKKwkJfQorCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuVGhyZWFkczsgaSsrKQorCQkJdGhyZWFkc1tpXS5zdGFydCgpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuVGhyZWFkczsgaSsrKQorCQkJdGhyZWFkc1tpXS5qb2luKCk7CisJfQorCisJLyoqCisJICogUnVucyB0aGUgdGVzdCB3aXRoIHRoZSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMuCisJICogQHBhcmFtIG4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIHJ1biggbG9uZyBuICkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvUGxhaW5CeXRlQnVmZmVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvUGxhaW5CeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMDI4YwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9QbGFpbkJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CisKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBQbGFpbkJ5dGVCdWZmZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBQbGFpbkJ5dGVCdWZmZXIgZXh0ZW5kcyBCeXRlQnVmZmVyCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgUGxhaW5CeXRlQnVmZmVyLgorCSAqCisJICogQHBhcmFtIHNpemUKKwkgKi8KKwlwdWJsaWMgUGxhaW5CeXRlQnVmZmVyKCBpbnQgc2l6ZSApCisJeworCQl0aGlzLnNpemUgPSBzaXplOworCQlidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgc2l6ZTsKKwkKKwlwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXI7CisJCisJcHJpdmF0ZSBpbnQgbmV4dEdldDsKKwkKKwlwcml2YXRlIGludCBuZXh0UHV0OworCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgc2l6ZSgpCisJeworCQlyZXR1cm4gc2l6ZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSBiYWNraW5nIHRoaXMgYnVmZmVyLgorCSAqLworCXB1YmxpYyBieXRlW10gZ2V0QnVmKCkKKwl7CisJCXJldHVybiBidWZmZXI7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgbGVuZ3RoKCkKKwl7CisJCXJldHVybiBuZXh0UHV0LW5leHRHZXQ7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsZWFyKCkKKwl7CisJCW5leHRHZXQgPSAwOworCQluZXh0UHV0ID0gMDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYnl0ZSBnZXQoKSB0aHJvd3MgRU9GRXhjZXB0aW9uCisJeworCQlpZiAobmV4dEdldCA+PSBuZXh0UHV0KQorCQkJdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOworCQkKKwkJcmV0dXJuIGJ1ZmZlcltuZXh0R2V0KytdOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGdldCggYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbiApCisJeworCQlpZiAob2ZmIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJvZmYgPCAwIiApOworCQkKKwkJaWYgKGxlbiA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibGVuIDwgMCIgKTsKKwkJCisJCWlmIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJvZmYrbGVuID4gYnVmLmxlbmd0aCIgKTsKKwkJCisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAwOworCQkKKwkJaW50IGNvdW50ID0gTWF0aC5taW4oIGxlbiwgbmV4dFB1dC1uZXh0R2V0ICk7CisJCQorCQlpZiAoY291bnQgPiAwKQorCQl7CisJCQlTeXN0ZW0uYXJyYXljb3B5KCBidWZmZXIsIG5leHRHZXQsIGJ1Ziwgb2ZmLCBjb3VudCApOworCQkJbmV4dEdldCArPSBjb3VudDsKKwkJfQorCQkKKwkJcmV0dXJuIGNvdW50OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHB1dCggYnl0ZSBiICkgdGhyb3dzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uCisJeworCQlpZiAobmV4dFB1dCA+PSBzaXplKQorCQkJdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7CisJCWJ1ZmZlcltuZXh0UHV0KytdID0gYjsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGludCBwdXQoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQorCXsKKwkJaWYgKG9mZiA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAib2ZmIDwgMCIgKTsKKwkJCisJCWlmIChsZW4gPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImxlbiA8IDAiICk7CisJCQorCQlpZiAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAib2ZmK2xlbiA+IGJ1Zi5sZW5ndGgiICk7CisJCQorCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gMDsKKwkJCisJCWludCBjb3VudCA9IE1hdGgubWluKCBsZW4sIHNpemUtbmV4dFB1dCApOworCQkKKwkJaWYgKGNvdW50ID4gMCkKKwkJeworCQkJU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYsIGJ1ZmZlciwgbmV4dFB1dCwgY291bnQgKTsKKwkJCW5leHRQdXQgKz0gY291bnQ7CisJCX0KKwkJCisJCXJldHVybiBjb3VudDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Jlc291cmNlcy5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Jlc291cmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2M2U0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvUmVzb3VyY2VzLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBIYXNoTWFwIG9mIHN0cmluZyB0byBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBSZXNvdXJjZXMuCisJICovCisJcHVibGljIFJlc291cmNlcygpCisJeworCQl0aGlzKCBudWxsICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFJlc291cmNlcyB3aXRoIGEgcmVmZXJlbmNlIHRvIHJlbGF0ZWQgUmVzb3VyY2VzLgorCSAqIEBwYXJhbSByZWxhdGVkCisJICovCisJcHVibGljIFJlc291cmNlcyggUmVzb3VyY2VzIHJlbGF0ZWQgKQorCXsKKwkJdGhpcy5yZWxhdGVkID0gcmVsYXRlZDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgcmVsYXRlZDsKKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgcmVsYXRlZCBSZXNvdXJjZXMuCisJICovCisJcHVibGljIFJlc291cmNlcyBnZXRSZWxhdGVkKCkKKwl7CisJCXJldHVybiByZWxhdGVkOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFJlc291cmNlcyBvciBhbnkgcmVsYXRlZCBSZXNvdXJjZXMgaGFzIHRoZSBrZXkuCisJICogQHBhcmFtIGtleSB0aGUgc3RyaW5nIG5hbWUgb2YgYSByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZXMgb3IgYW55IHJlbGF0ZWQgUmVzb3VyY2VzIGhhcyB0aGUga2V5LgorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KCBTdHJpbmcga2V5ICkKKwl7CisJCXJldHVybiByZXMuY29udGFpbnNLZXkoIGtleSApIHx8CisJCQlyZWxhdGVkICE9IG51bGwgJiYgcmVsYXRlZC5jb250YWluc0tleSgga2V5ICk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWVkIHJlc291cmNlIGZyb20gdGhpcyBSZXNvdXJjZXMgaWYgcHJlc2VudCwgb3RoZXJ3aXNlCisJICogc2VhcmNoZXMgZm9yIGtleSBpbiB0aGUgcmVsYXRlZCBSZXNvdXJjZXMuCisJICogQHBhcmFtIGtleSB0aGUgc3RyaW5nIG5hbWUgb2YgYSByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UuCisJICovCisJcHVibGljIE9iamVjdCBnZXQoIFN0cmluZyBrZXkgKQorCXsKKwkJT2JqZWN0IG8gPSByZXMuZ2V0KCBrZXkgKTsKKwkJCisJCWlmIChvICE9IG51bGwpCisJCQlyZXR1cm4gbzsKKwkJCisJCXJldHVybiByZWxhdGVkICE9IG51bGwgPyByZWxhdGVkLmdldCgga2V5ICkgOiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBQdXRzIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIHRoaXMgUmVzb3VyY2VzLiBObyByZWxhdGVkIFJlc291cmNlcyBhcmUKKwkgKiBhZmZlY3RlZC4KKwkgKiBAcGFyYW0ga2V5IHRoZSBzdHJpbmcgbmFtZSBvZiBhIHJlc291cmNlLgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlLgorCSAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUga2V5IGluIHRoaXMgUmVzb3VyY2VzIG9ubHkuCisJICovCisJcHVibGljIE9iamVjdCBwdXQoIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSApCisJeworCQlyZXR1cm4gcmVzLnB1dCgga2V5LCB2YWx1ZSApOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBuYW1lZCByZXNvdXJjZSBmcm9tIHRoaXMgUmVzb3VyY2VzIG9ubHkuIE5vIHJlbGF0ZWQgUmVzb3VyY2VzCisJICogYXJlIGFmZmVjdGVkLgorCSAqIEBwYXJhbSBrZXkgdGhlIHN0cmluZyBuYW1lIG9mIGEgcmVzb3VyY2UuCisJICogQHJldHVybiB0aGUgb2xkIHZhbHVlIG9mIHRoZSBrZXkgaW4gdGhpcyBSZXNvdXJjZXMgb25seS4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IHJlbW92ZSggU3RyaW5nIGtleSApCisJeworCQlyZXR1cm4gcmVzLnJlbW92ZSgga2V5ICk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9SdW5uZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9SdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTIzY2ViCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1J1bm5lci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBzdGFydGFibGUgd2hpY2ggY3JlYXRlcyBhIHRocmVhZCBhbmQgcnVucy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFJ1bm5lcgorCWV4dGVuZHMgQWJzdHJhY3RTdGFydGFibGUgaW1wbGVtZW50cyBSdW5uYWJsZQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFJ1bm5lci4KKwkgKi8KKwlwdWJsaWMgUnVubmVyKCkKKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBoYW5kbGVyIHRoZSBoYW5kbGVyIHRvIG5vdGlmeSBvZiBzdGFydGVkIGFuZCBzdG9wcGVkIGV2ZW50cy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKCBSdW5uZXJIYW5kbGVyIGhhbmRsZXIgKQorCXsKKwkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKwl9CisJCisJLyoqCisJICogVGhlIGhhbmRsZXIgaXMgdXNlZCB0byByZXBvcnQgc3RhcnRlZCBhbmQgc3RvcHBlZCBldmVudHMuCisJICovCisJcHJpdmF0ZSBSdW5uZXJIYW5kbGVyIGhhbmRsZXI7CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc3RhcnQwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGhyZWFkID0gbmV3IFRocmVhZCggdGhpcyApOworCQl0aHJlYWQuc3RhcnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzdG9wMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRocmVhZCB0ID0gdGhyZWFkOworCQlpZiAodCAhPSBudWxsKQorCQl7CisJCQl0aHJlYWQgPSBudWxsOworCQkJLy90LmpvaW4oKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFRocmVhZCB0aHJlYWQ7CisJCisJZmluYWwgcHVibGljIHZvaWQgcnVuKCkKKwl7CisJCWZpcmVTdGFydGVkKCk7CisJCQorCQl0cnkKKwkJeworCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQl3aGlsZSAoaXNTdGFydGVkKCkpCisJCQl7CisJCQkJaWYgKCFydW4wKCBmaXJzdCApKQorCQkJCQlicmVhazsKKwkJCQlmaXJzdCA9IGZhbHNlOworCQkJfQorCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlmaXJlRXhjZXB0aW9uKCAicnVuIiwgZSApOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJc2V0U3RvcHBlZCgpOworCQkJZmlyZVN0b3BwZWQoKTsKKwkJCS8vTG9nLnJlcG9ydCggInRocmVhZCBkZWFkIiApOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBmaXJlU3RhcnRlZCgpCisJeworCQloYW5kbGVyLnN0YXJ0ZWQoKTsKKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIGFuIGV4Y2VwdGlvbiBjYXVnaHQgYnkgdGhlIHRocmVhZCBtYW5hZ2luZyB0aGUgcnVubmFibGUuCisJICogQHBhcmFtIHdoYXQKKwkgKiBAcGFyYW0gZQorCSAqLworCXByb3RlY3RlZCB2b2lkIGZpcmVFeGNlcHRpb24oIFN0cmluZyB3aGF0LCBFeGNlcHRpb24gZSApCisJeworCQl0cnkKKwkJeworCQkJaGFuZGxlci5leGNlcHRpb24oIHdoYXQsIGUgKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiB4ICkKKwkJeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCWlmICh4ICE9IGUpCisJCQkJeC5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaXJlU3RvcHBlZCgpCisJeworCQloYW5kbGVyLnN0b3BwZWQoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZmlyc3QgdHJ1ZSB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkCisJICogQHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCBrZWVwIHJ1bm5pbmcuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBydW4wKCBib29sZWFuIGZpcnN0ICkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9SdW5uZXJIYW5kbGVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvUnVubmVySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMjM3YjUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvUnVubmVySGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworLyoqCisgKiBSdW5uZXJIYW5kbGVyIHJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiBydW5uZXIgZXZlbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJ1bm5lckhhbmRsZXIKK3sKKwkvKioKKwkgKiBSZXBvcnRzIHRoYXQgdGhlIHRocmVhZCBjb250cm9sbGluZyB0aGUgcnVubmVyIGhhcyBzdGFydGVkLgorCSAqLworCXZvaWQgc3RhcnRlZCgpOworCisJLyoqCisJICogUmVwb3J0cyB0aGF0IHRoZSB0aHJlYWQgY29udHJvbGxpbmcgdGhlIHJ1bm5lciBoYXMgc3RvcHBlZC4KKwkgKi8KKwl2b2lkIHN0b3BwZWQoKTsKKworCS8qKgorCSAqIFJlcG9ydHMgdGhhdCB0aGUgdGhyZWFkIGNvbnRyb2xsaW5nIHRoZSBydW5uZXIgaGFzIGNhdWdodCBhbgorCSAqIGV4Y2VwdGlvbi4KKwkgKiBAcGFyYW0gd2hhdCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBvcmlnaW4KKwkgKiBAcGFyYW0gZSBhbiBleGNlcHRpb24gdGhhdCB3YXMgY2F1Z2h0CisJICovCisJdm9pZCBleGNlcHRpb24oIFN0cmluZyB3aGF0LCBFeGNlcHRpb24gZSApOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1NpbmdsZUl0ZXJhdG9yLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvU2luZ2xlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE5ODBmCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1NpbmdsZUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIEFuIGl0ZXJhdG9yIG92ZXIgYSBzaW5nbGUgb2JqZWN0LgorICogQHBhcmFtIDxFPgorICovCitmaW5hbCBwdWJsaWMgY2xhc3MgU2luZ2xlSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBTaW5nbGVJdGVyYXRvci4KKwkgKgorCSAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSBpdGVyYXRlZC4KKwkgKi8KKwlwdWJsaWMgU2luZ2xlSXRlcmF0b3IoIEUgb2JqICkKKwl7CisJCXRoaXMub2JqID0gb2JqOworCX0KKwkKKwlwcml2YXRlIEUgb2JqOworCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNoYXNOZXh0KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKwl7CisJCXJldHVybiBvYmogIT0gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IjbmV4dCgpCisJICovCisJcHVibGljIEUgbmV4dCgpCisJeworCQlpZiAob2JqID09IG51bGwpCisJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkKKwkJRSBvID0gb2JqOworCQlvYmogPSBudWxsOworCQlyZXR1cm4gbzsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IjcmVtb3ZlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoKQorCXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1N0YXJ0YWJsZS5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1N0YXJ0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODk3YjkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvU3RhcnRhYmxlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIFN0YXJ0YWJsZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0YXJ0YWJsZQoreworCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHN0YXJ0ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdGFydGVkKCk7CisKKwkvKioKKwkgKiBDaGVja3MgdGhhdCB0aGUgc3RhcnRhYmxlIGlzIHN0YXJ0ZWQuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbm90IHN0YXJ0ZWQuCisJICovCisJcHVibGljIHZvaWQgY2hlY2tJc1N0YXJ0ZWQoKTsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9TdHJpbmdVdGlsLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvU3RyaW5nVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzY4OGEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvU3RyaW5nVXRpbC5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKKy8qKgorICogTWlzY2VsbGFuZW91cyBzdHJpbmcgdXRpbGl0eSBmdW5jdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdVdGlsCit7CisJLyoqCisJICogTWFrZXMgYSByYW5kb20gc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGNoYXJhY3RlcnMsIHdoaWNoCisJICogYXJlIEItWiAobWludXMgRSxJLE8sVSksIGIteiAobWludXMgZSxpLG8sdSksIGFuZCAyLTkuIFRodXMKKwkgKiB3ZSBoYXZlIG5vIHZvd2VsIGxpa2UgY2hhcmFjdGVycyBpbiB0aGUgcmVzdWx0IHNvIHRoYXQgc3RyaW5ncworCSAqIGxpa2UgJ2Zvb2wnLCAnaWRpb3QnLCBhbmQgJ2Rvb2Z1cycgd2lsbCBub3QgZXZlciBhcHBlYXIuCisJICogCisJICogQmVjYXVzZSB0aGVyZSBhcmUgNTAgY2hvaWNlcyBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdGluZworCSAqIHN0cmluZywgZWFjaCBjaGFyYWN0ZXIgY29udHJpYnV0ZXMgNS42NCBiaXRzIG9mIHJhbmRvbW5lc3MuIHNvLCBpZgorCSAqIHlvdSB3YW50IGF0IGxlYXN0IDY0IGJpdHMgb2YgcmFuZG9tbmVzcywgeW91J2xsIG5lZWQgYXQgbGVhc3QgMTIKKwkgKiBjaGFyYWN0ZXJzLgorCSAqIAorCSAqIEBwYXJhbSBuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgcmFuZG9tIHN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBybmRTdHJpbmcoIGludCBuICkKKwl7CisJCXJldHVybiBybmRTdHJpbmcoIG4sIERFRkFVTFRfQ0hBUlMgKTsKKwl9CisJCisJLyoqCisJICogTWFrZXMgYSByYW5kb20gc3RyaW5nIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycy4KKwkgKiBAcGFyYW0gbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisJICogQHBhcmFtIGNoYXJzIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gY29uc3RydWN0IHRoZSByYW5kb20gc3RyaW5nLgorCSAqIEByZXR1cm4gYSByYW5kb20gc3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJuZFN0cmluZyggaW50IG4sIGNoYXJbXSBjaGFycyApCisJeworCQlpZiAobiA8IDEpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibiA8IDEiICk7CisJCQorCQlpbnQgayA9IGNoYXJzLmxlbmd0aDsKKwkJaWYgKGsgPCAyKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNoYXJzLmxlbmd0aCA8IDIiICk7CisJCQorCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCBuICk7CisJCXdoaWxlIChuLS0gPiAwKQorCQkJc2IuYXBwZW5kKCBjaGFyc1soaW50KSAoTWF0aC5yYW5kb20oKSAqIGspXSApOworCQkKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBERUZBVUxUX0NIQVJTID0gKAorCQkiQkNERkdISktMTU5QUVJTVFZXWFlaIiArCisJCSJiY2RmZ2hqa2xtbnBxcnN0dnd4eXoiICsKKwkJIjIzNDU2Nzg5IgorCQkpLnRvQ2hhckFycmF5KCk7CisKKwkvKioKKwkgKiBAcGFyYW0gcworCSAqIEBwYXJhbSBjCisJICogQHJldHVybiBhbiBhcnJheSB4IG9mIHR3byBlbGVtZW50cyBjb250YWluaW5nIHMgc3BsaXQgaW4gdHdvIGJ5IHRoZQorCSAqIGxlZnRtb3N0IGMuIHhbMF0gaXMgdGhlIGNoYXJzIGJlZm9yZSBjLCB4WzFdIGlzIHRoZSBjaGFycyBhZnRlciBjLgorCSAqIElmIGMgaXMgbm90IGluIHMsIHJldHVybnMgbnVsbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGxlZnRTcGxpdCggU3RyaW5nIHMsIGNoYXIgYyApCisJeworCQlpZiAocyA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCAicyA9PSBudWxsIiApOworCQkKKwkJaW50IGkgPSBzLmluZGV4T2YoIGMgKTsKKwkJaWYgKGkgPCAwKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgcy5zdWJzdHJpbmcoIDAsIGkgKSwgcy5zdWJzdHJpbmcoIGkrMSApIH07CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBzCisJICogQHBhcmFtIGMKKwkgKiBAcmV0dXJuIGFuIGFycmF5IHggb2YgdHdvIGVsZW1lbnRzIGNvbnRhaW5pbmcgcyBzcGxpdCBpbiB0d28gYnkgdGhlCisJICogcmlnaHRtb3N0IGMuIHhbMF0gaXMgdGhlIGNoYXJzIGJlZm9yZSBjLCB4WzFdIGlzIHRoZSBjaGFycyBhZnRlciBjLgorCSAqIElmIGMgaXMgbm90IGluIHMsIHJldHVybnMgbnVsbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHJpZ2h0U3BsaXQoIFN0cmluZyBzLCBjaGFyIGMgKQorCXsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbiggInMgPT0gbnVsbCIgKTsKKwkJCisJCWludCBpID0gcy5sYXN0SW5kZXhPZiggYyApOworCQlpZiAoaSA8IDApCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiBuZXcgU3RyaW5nW10geyBzLnN1YnN0cmluZyggMCwgaSApLCBzLnN1YnN0cmluZyggaSsxICkgfTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYQorCSAqIEBwYXJhbSBiCisJICogQHJldHVybiB0cnVlIGlmIGEgZXF1YWxzIGIsIGZhbHNlIG90aGVyd2lzZS4gdGFrZXMgaW50byBhY2NvdW50IG51bGxzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoIFN0cmluZyBhLCBTdHJpbmcgYiApCisJeworCQlpZiAoYSA9PSBiKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCXJldHVybiBhLmVxdWFscyggYiApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBhCisJICogQHJldHVybiBtYXRjaGVzIGJlaGF2aW9yIG9mIGVxdWFscywgYWJvdmUuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoIFN0cmluZyBhICkKKwl7CisJCWlmIChhID09IG51bGwpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGEuaGFzaENvZGUoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYQorCSAqIEBwYXJhbSBiCisJICogQHJldHVybiB0cnVlIGlmIGEgZXF1YWxzIGIsIGZhbHNlIG90aGVyd2lzZS4gdGFrZXMgaW50byBhY2NvdW50IG51bGxzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKCBTdHJpbmcgYSwgU3RyaW5nIGIgKQorCXsKKwkJaWYgKGEgPT0gYikKKwkJCXJldHVybiB0cnVlOworCQkKKwkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlyZXR1cm4gYS5lcXVhbHNJZ25vcmVDYXNlKCBiICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGEKKwkgKiBAcmV0dXJuIG1hdGNoZXMgYmVoYXZpb3Igb2YgZXF1YWxzSWdub3JlQ2FzZSwgYWJvdmUuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGVJZ25vcmVDYXNlKCBTdHJpbmcgYSApCisJeworCQlpZiAoYSA9PSBudWxsKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBhLnRvTG93ZXJDYXNlKCkuaGFzaENvZGUoKTsKKwl9CisJCisJLyoqCisJICogVHJhbnNsYXRlcyBhIGhleCBjaGFyIGludG8gYW4gaW50LgorCSAqIEBwYXJhbSBjIGEgaGV4IGNoYXIgKDAtOSwgQS1GLCBhLWYpLgorCSAqIEByZXR1cm4gYW4gaW50ICgwLTE1KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBmcm9tSGV4KCBjaGFyIGMgKQorCXsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJcmV0dXJuIGMgLSAnMCc7CisJCWlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJCXJldHVybiBjIC0gJ2EnICsgMTA7CisJCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJCXJldHVybiBjIC0gJ2EnICsgMTA7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJiYWQgaGV4IGNoYXIgIitjICk7CisJfQorCQorCS8qKgorCSAqIFRyYW5zbGF0ZXMgYW4gaW50IGludG8gYSBoZXggY2hhci4KKwkgKiBAcGFyYW0gaSBhbiBpbnQgKDAtMTUpCisJICogQHJldHVybiBhIGhleCBjaGFyICgwLTksIGEtZikuCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyIHRvSGV4KCBpbnQgaSApCisJeworCQlpZiAoaSA+PSAwICYmIGkgPD0gOSkKKwkJCXJldHVybiAoY2hhcikgKCcwJyArIGkpOworCQlpZiAoaSA+PSAxMCAmJiBpIDw9IDE1KQorCQkJcmV0dXJuIChjaGFyKSAoJ2EnICsgaSAtIDEwKTsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImJhZCBoZXggZGlnaXQgc2VsZWN0b3IgIitpICk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBkaWdlc3QKKwkgKiBAcmV0dXJuIHN0cmluZyB2ZXJzaW9uIG9mIGRpZ2VzdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5nZXJwcmludCggYnl0ZVtdIGRpZ2VzdCApCisJeworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCBkaWdlc3QubGVuZ3RoICogMiApOworCQlmb3IgKGJ5dGUgYjogZGlnZXN0KQorCQl7CisJCQlzYi5hcHBlbmQoIHRvSGV4KCBiID4+PiA0ICYgMTUgKSApOworCQkJc2IuYXBwZW5kKCB0b0hleCggYiAmIDE1ICkgKTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVGltZW91dEV4Y2VwdGlvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1RpbWVvdXRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDU3ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1RpbWVvdXRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKKy8qKgorICogUnVudGltZUV4Y2VwdGlvbiBmb3IgVGltZW91dCBjb25kaXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lb3V0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVGltZW91dEV4Y2VwdGlvbi4KKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqLworCXB1YmxpYyBUaW1lb3V0RXhjZXB0aW9uKCBTdHJpbmcgbWVzc2FnZSApCisJeworCQlzdXBlciggbWVzc2FnZSApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UaW1lci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1RpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNjM2MwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UaW1lci5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKKy8qKgorICogVGltZXIgZW5hYmxlcyBtYWtpbmcgaGlnaCBwcmVjaXNpb24gaW50ZXJ2YWwgdGVzdHMuIEluIHRoZSB1c3VhbAorICogc2NlbmFyaW8sIHNvbWUgY29kZSBpcyBnb2luZyB0byBiZSBicmFja2V0ZWQgYnkgY2FsbHMgdG8KKyAqIGluaXRpYWxpemUgYSB0aW1lciBhbmQgbGF0ZXIgZ2V0IHRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIGluaXQuCisgKiAKKyAqIFRyeWluZyB0byB1c2UgdGhlIHN5c3RlbSBjbG9jayAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKSBpcworICogcHJvYmxlbWF0aWMgYmVjYXVzZSBwZXJpb2RpYyBzeXN0ZW0gdGltZSBhZGp1c3RtZW50cyAoYnkgbnRwLAorICogd2luZG93cyB0aW1lLCBldGMuKSB3aWxsIGludmFsaWRhdGUgYW55IGludGVydmFsIHRlc3RpbmcgYmFzZWQKKyAqIG9uIHRoZSBzeXN0ZW0gY2xvY2suIEFsc28sIHRoZSBzeXN0ZW0gY2xvY2sgcmVzb2x1dGlvbiBpcyBub3QKKyAqIGFsbCB0aGF0IGdvb2QgKDE1IG1zIHR5cGljYWxseSBvbiBhIHdpbmRvd3MgYm94KS4KKyAqIAorICogVGltZXIgdG1yID0gbmV3IFRpbWVyKCkuaW5pdCgpOworICogZm9vKCk7CisgKiBsb25nIG5zID0gdG1yLmVsYXBzZWROYW5vcygpOworICogU3lzdGVtLm91dC5wcmludGxuKCAiZm9vKCkgdG9vayAiK25zKyIgbmFub3MiICk7CisgKiAKKyAqIFRpbWVyIGtlZXBzIHN0YXRlLCBpbml0aWFsaXplZCBieSBpbml0KCksIGFuZCB1c2VkIGJ5IGVsYXBzZWRCbGFoKCkKKyAqIGFuZCB0aHVzIGlzIHRocmVhZCBzYWZlIGFzIGxvbmcgYXMgY2FsbHMgdG8gaW5pdCgpIGFyZSBzZXJpYWxpemVkLgorICogCisgKiBGb3IgbG93ZXIgY29zdCB0aW1pbmcgbmVlZHMsIFRpbWVyIHN1cHBvcnRzIGEgc2V0IG9mIHN0YXRpYyBpbnRlcmZhY2VzLgorICogCisgKiBsb25nIHQwID0gVGltZXIuZ2V0U3RhcnRUaW1lKCk7CisgKiBmb28oKTsKKyAqIGxvbmcgbnMgPSBUaW1lci5nZXROYW5vc1NpbmNlKCB0MCApOworICogU3lzdGVtLm91dC5wcmludGxuKCAiZm9vKCkgdG9vayAiK25zKyIgbmFub3MiICk7CisgKiAKKyAqIE5vdGU6IHJlYWRpbmcgdGhlIGhpZ2ggcHJlY2lzaW9uIGNsb2NrICh3aGljaCBhbGwgdGhlc2UgbWV0aG9kcworICogdWx0aW1hdGVseSBkbykgdGFrZXMgYWJvdXQgMSw0ODcgbmFub3NlY29uZHMgb24gV2luZG93cyBYUCBQcm8KKyAqIHJ1bm5pbmcgb24gYSBEZWxsIFByZWNpc2lvbiAzNzAgd29ya3N0YXRpb24gdXNpbmcgamRrIDEuNS4wXzA0LgorICogQnkgY29tcGFyaXNvbiwgYSBtZXRob2QgY2FsbCB0YWtlcyBhYm91dCAxLjk3IG5hbm9zZWNvbmRzLiBBbHNvLAorICogb24gdGhlIGFib3ZlIHBsYXRmb3JtLCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgdGltZXIgaXMgMSwzOTYgbnMuCisgKiBDb3VsZCBiZSB0aGF0IHRoZSByZXNvbHV0aW9uIGlzIHNtYWxsZXIsIGJ1dCB3ZSdsbCBuZXZlciBrbm93IGl0CisgKiBiZWNhdXNlIGp1c3QgZ2V0dGluZyB0aGUgdmFsdWUgZnJvbSB0aGUgT1MgaXMgdGhlIGRvbWluYW50IGZhY3Rvci4KKyAqIAorICogQHNlZSAjZ2V0TmFub3MoKQorICogQHNlZSAjZ2V0TmFub3NTaW5jZShsb25nKQorICovCitwdWJsaWMgY2xhc3MgVGltZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBUaW1lci4gVGhlIHRpbWVyIGlzIG5vdCBzdGFydGVkLgorCSAqIEBzZWUgI2luaXQoKQorCSAqLworCXB1YmxpYyBUaW1lcigpCisJeworCQkvLyBub3RoaW5nIHRvIGRvLgorCX0KKwkKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgc3RhcnRUaW1lIG9mIHRoaXMgdGltZXIuCisJICogQHJldHVybiByZXR1cm5zIHRoaXMgdGltZXIuCisJICovCisJcHVibGljIFRpbWVyIGluaXQoKQorCXsKKwkJc3RhcnRUaW1lID0gZ2V0TmFub3MoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGVsYXBzZWQgdGltZSBpbiBuYW5vcyBzaW5jZSB0aGUgbGFzdCBpbml0LgorCSAqLworCXB1YmxpYyBsb25nIGVsYXBzZWROYW5vcygpCisJeworCQlpZiAoc3RhcnRUaW1lID09IExvbmcuTUlOX1ZBTFVFKQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiVGltZXIgbm90IHN0YXJ0ZWQiICk7CisJCXJldHVybiBnZXROYW5vc1NpbmNlKCBzdGFydFRpbWUgKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZWxhcHNlZCB0aW1lIGluIG1pY3JvcyBzaW5jZSB0aGUgbGFzdCBpbml0LgorCSAqLworCXB1YmxpYyBsb25nIGVsYXBzZWRNaWNyb3MoKQorCXsKKwkJcmV0dXJuIGVsYXBzZWROYW5vcygpIC8gTkFOT1NfUEVSX01JQ1JPOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzIHNpbmNlIHRoZSBsYXN0IGluaXQuCisJICovCisJcHVibGljIGxvbmcgZWxhcHNlZE1pbGxpcygpCisJeworCQlyZXR1cm4gZWxhcHNlZE5hbm9zKCkgLyBOQU5PU19QRVJfTUlMTEk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBsYXN0IGluaXQuCisJICovCisJcHVibGljIGRvdWJsZSBlbGFwc2VkU2Vjb25kcygpCisJeworCQlyZXR1cm4gZWxhcHNlZE5hbm9zKCkgLyBOQU5PU19QRVJfU0VDT05EOworCX0KKwkKKwlwcml2YXRlIGxvbmcgc3RhcnRUaW1lID0gTG9uZy5NSU5fVkFMVUU7CisJCisJLyoqCisJICogTnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBtaWNyb3NlY29uZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTkFOT1NfUEVSX01JQ1JPID0gMTAwMDsKKwkKKwkvKioKKwkgKiBOdW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIG1pbGxpc2Vjb25kcy4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTkFOT1NfUEVSX01JTExJID0gMTAwMDAwMDsKKwkKKwkvKioKKwkgKiBOdW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIHNlY29uZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGRvdWJsZSBOQU5PU19QRVJfU0VDT05EID0gMTAwMDAwMDAwMC4wOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNUQVRJQyBJTlRFUkZBQ0UgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQHJldHVybiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgYSB0aW1pbmcgdGVzdCBpbiBuYW5vcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TmFub3MoKQorCXsKKwkJcmV0dXJuIFN5c3RlbS5uYW5vVGltZSgpOworCX0KKwkKKwkvKioKKwkgKiBEb24ndCB1c2UgdGhpcyBtZXRob2QgZm9yIG5ld2x5IGJ1aWx0IHRpbWluZy4gVGhpcyBpcyBvbmx5CisJICogZm9yIGVhc3kgYmFja3dhcmRzIGNvbXBhdGlibGUgKGZvciBkZWx0YSB0aW1lIHB1cnBvc2VzKSByZXBsYWNlbWVudAorCSAqIG9mIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIHBvaW50IG9mIGEgdGltaW5nIHRlc3QgaW4gbWlsbGlzLgorCSAqIAorCSAqIEBzZWUgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGxvbmcgY3VycmVudFRpbWVNaWxsaXMoKQorCXsKKwkJcmV0dXJuIGdldE5hbm9zKCkgLyBOQU5PU19QRVJfTUlMTEk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBzdGFydFRpbWUgYSB2YWx1ZSByZXR1cm5lZCBieSBnZXRTdGFydFRpbWUuCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG5hbm9zIHdoaWNoIGhhdmUgcGFzc2VkIHNpbmNlIHN0YXJ0VGltZS4KKwkgKiAKKwkgKiBAc2VlICNnZXROYW5vcygpCisJICovCisJcHVibGljIHN0YXRpYyBsb25nIGdldE5hbm9zU2luY2UoIGxvbmcgc3RhcnRUaW1lICkKKwl7CisJCXJldHVybiBTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0VGltZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHN0YXJ0VGltZSBhIHZhbHVlIHJldHVybmVkIGJ5IGdldFN0YXJ0VGltZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWljcm9zIHdoaWNoIGhhdmUgcGFzc2VkIHNpbmNlIHN0YXJ0VGltZS4KKwkgKiAKKwkgKiBAc2VlICNnZXROYW5vcygpCisJICovCisJcHVibGljIHN0YXRpYyBsb25nIGdldE1pY3Jvc1NpbmNlKCBsb25nIHN0YXJ0VGltZSApCisJeworCQlyZXR1cm4gZ2V0TmFub3NTaW5jZSggc3RhcnRUaW1lICkgLyBOQU5PU19QRVJfTUlDUk87CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBzdGFydFRpbWUgYSB2YWx1ZSByZXR1cm5lZCBieSBnZXRTdGFydFRpbWUuCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpcyB3aGljaCBoYXZlIHBhc3NlZCBzaW5jZSBzdGFydFRpbWUuCisJICogCisJICogQHNlZSAjZ2V0TmFub3MoKQorCSAqLworCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRNaWxsaXNTaW5jZSggbG9uZyBzdGFydFRpbWUgKQorCXsKKwkJcmV0dXJuIGdldE5hbm9zU2luY2UoIHN0YXJ0VGltZSApIC8gTkFOT1NfUEVSX01JTExJOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzdGFydFRpbWUgYSB2YWx1ZSByZXR1cm5lZCBieSBnZXRTdGFydFRpbWUuCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNlY29uZHMgd2hpY2ggaGF2ZSBwYXNzZWQgc2luY2Ugc3RhcnRUaW1lLgorCSAqIAorCSAqIEBzZWUgI2dldE5hbm9zKCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRTZWNvbmRzU2luY2UoIGxvbmcgc3RhcnRUaW1lICkKKwl7CisJCXJldHVybiBnZXROYW5vc1NpbmNlKCBzdGFydFRpbWUgKSAvIE5BTk9TX1BFUl9TRUNPTkQ7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZSBvZiBtYW55IGludm9jYXRpb25zIG9mCisJICogZ2V0TmFub3NTaW5jZSggZ2V0U3RhcnRUaW1lKCkgKS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0UmVzb2x1dGlvbigpCisJeworCQlsb25nIHIgPSBMb25nLk1BWF9WQUxVRTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykKKwkJeworCQkJciA9IE1hdGgubWluKCByLCBnZXROYW5vc1NpbmNlKCBnZXROYW5vcygpICkgKTsKKwkJfQorCQlyZXR1cm4gcjsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHMgdGhlIG51bWJlciBvZiBzZWNvbmRzCisJICogQHJldHVybiBhIG5pY2UgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgYW1vdW50IG9mIHRpbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBob3dMb25nKCBpbnQgcyApCisJeworCQlpZiAocyA8IDYwKQorCQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoIHMgKSArICJzIjsKKwkJCisJCWludCBtID0gcyAvIDYwOworCQlpZiAobSA8IDYwKQorCQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoIG0gKSArICJtICIrcyU2MCsicyI7CisJCQorCQlpbnQgaCA9IG0gLyA2MDsKKwkJaWYgKGggPCAyNCkKKwkJCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKCBoICkgKyAiaCAiK20lNjArIm0iOworCQkKKwkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoIGggLyAyNCApICsgImQgIitoJTI0KyJoIjsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVG9kby5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1RvZG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM3MjVjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1RvZG8uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKKy8qKgorICogQSBUb2RvIGlzIHVzZWQgdG8gcGVyZm9ybSBhIGxpZ2h0d2VpZ2h0IGFjdGlvbi4KKyAqIAorICogQHNlZSBUb2RvTWFuYWdlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRvZG8KK3sKKwkvKioKKwkgKiBQZXJmb3JtcyB0aGUgYWN0aW9uLgorCSAqIEBwYXJhbSBtZ3IgdGhlIHRvZG8gbWFuYWdlciB3aGVyZSB0aGlzIHRvZG8gd2FzIHF1ZXVlZC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisJICovCisJcHVibGljIHZvaWQgZG9pdCggVG9kb01hbmFnZXIgbWdyICkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJlcG9ydHMgYW4gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgdG9kby4KKwkgKiBAcGFyYW0gbWdyIHRoZSB0b2RvIG1hbmFnZXIgd2hlcmUgdGhpcyB0b2RvIHdhcyBxdWV1ZWQuCisJICogQHBhcmFtIGUgdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSB0b2RvIHRocmV3LgorCSAqLworCXB1YmxpYyB2b2lkIGV4Y2VwdGlvbiggVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZSApOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1RvZG9NYW5hZ2VyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVG9kb01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY1NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1RvZG9NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzNDIgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworLyoqCisgKiBBIHN0YW5kYWxvbmUgdmVyaW9uIG9mIGEgcHJvY2Vzc29yIGZvciB0b2RvIGl0ZW1zLgorICovCitwdWJsaWMgY2xhc3MgVG9kb01hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0YWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgVG9kb01hbmFnZXIuCisJICogQHBhcmFtIG1heEVudHJpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHF1ZXVlIGJlZm9yZQorCSAqIHRoZSBjYWxsZXIgb2YgYWRkRW50cnkgaXMgZGVsYXllZC4KKwkgKiBAcGFyYW0gZW50cnlEZWxheSBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYSBjYWxsZXIgd2hvIHRyaWVzIHRvCisJICogYWRkIGEgZW50cnkgb3ZlciB0aGUgbGltaXQuCisJICogQHBhcmFtIG1pbldvcmtlcnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHdvcmtlcnMgdG8ga2VlcCB3YWl0aW5nLgorCSAqIEBwYXJhbSBtYXhXb3JrZXJzIHRoZSBtYXh1bXVtIG51bWJlciBvZiB3b3JrZXJzIHRvIGFsbG93LgorCSAqIEBwYXJhbSB3b3JrZXJMaW5nZXIgbWlsbGlzZWNvbmRzIGEgd29ya2VyIHdpbGwgd2FpdCBmb3IgYSBUb2RvCisJICogYmVmb3JlIGNvbnNpZGVyaW5nIHF1aXR0aW5nLgorCSAqIEBwYXJhbSB0aHJlc2hvbGQgdGhlIHBlciB3b3JrZXIgdGhyZXNob2xkIGZvciBxdWV1ZSBsZW5ndGguIElmCisJICogcXVldWUgbGVuZ3RoIGV4Y2VlZHMgdGhpcyBhbW91bnQsIGEgbmV3IHdvcmtlciBpcyBhZGRlZCBpZiBhbGxvd2VkLgorCSAqLworCXB1YmxpYyBUb2RvTWFuYWdlciggaW50IG1heEVudHJpZXMsIGludCBlbnRyeURlbGF5LCBpbnQgbWluV29ya2VycywKKwkJaW50IG1heFdvcmtlcnMsIGludCB3b3JrZXJMaW5nZXIsIGludCB0aHJlc2hvbGQgKQorCXsKKwkJaWYgKG1heEVudHJpZXMgPCAxKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm1heEVudHJpZXMgPCAxIiApOworCQkKKwkJaWYgKGVudHJ5RGVsYXkgPCAxKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImVudHJ5RGVsYXkgPCAxIiApOworCQkKKwkJaWYgKG1pbldvcmtlcnMgPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm1pbldvcmtlcnMgPCAwIiApOworCQkKKwkJaWYgKG1heFdvcmtlcnMgPCAxKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm1heFdvcmtlcnMgPCAxIiApOworCQkKKwkJaWYgKG1heFdvcmtlcnMgPCBtaW5Xb3JrZXJzKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm1heFdvcmtlcnMgPCBtaW5Xb3JrZXJzIiApOworCQkKKwkJaWYgKHdvcmtlckxpbmdlciA8IDEpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAid29ya2VyTGluZ2VyIDwgMSIgKTsKKwkJCisJCWlmICh0aHJlc2hvbGQgPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInRocmVzaG9sZCA8IDAiICk7CisJCQorCQl0aGlzLm1heEVudHJpZXMgPSBtYXhFbnRyaWVzOworCQl0aGlzLmVudHJ5RGVsYXkgPSBlbnRyeURlbGF5OworCQl0aGlzLm1pbldvcmtlcnMgPSBtaW5Xb3JrZXJzOworCQl0aGlzLm1heFdvcmtlcnMgPSBtYXhXb3JrZXJzOworCQl0aGlzLndvcmtlckxpbmdlciA9IHdvcmtlckxpbmdlcjsKKwkJdGhpcy50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisJfQorCQorCXByaXZhdGUgZmluYWwgaW50IG1heEVudHJpZXM7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgZW50cnlEZWxheTsKKwkKKwlwcml2YXRlIGZpbmFsIGludCBtaW5Xb3JrZXJzOworCQorCXByaXZhdGUgZmluYWwgaW50IG1heFdvcmtlcnM7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgd29ya2VyTGluZ2VyOworCQorCXByaXZhdGUgZmluYWwgaW50IHRocmVzaG9sZDsKKworCUBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0MCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisJICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgfQorCisJQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcDAoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworCSAgICAvLyBub3RoaW5nIHRvIGRvLgorCQlub3RpZnlBbGwoKTsKKyAgICB9CisJCisJLyoqCisJICogQHBhcmFtIHRvZG8KKwkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZCggVG9kbyB0b2RvICkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisJeworCQljaGVja0lzU3RhcnRlZCgpOworCQkKKwkJaW50IG4gPSBhZGRFbnRyeSggdG9kbyApOworCQlub3RpZnkoKTsKKwkJCisJCWNvbnNpZGVyU3RhcnRpbmdBV29ya2VyKCBuICk7CisJCQorCQlpZiAobiA+IG1heEVudHJpZXMpCisJCQlUaHJlYWQuc2xlZXAoIGVudHJ5RGVsYXkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oKQorCXsKKwkJYm9vbGVhbiBuZWVkc0FkanVzdCA9IHRydWU7CisJCXRyeQorCQl7CisJCQlUb2RvIHRvZG87CisJCQl3aGlsZSAoKHRvZG8gPSBnZXROZXh0VG9kbygpKSAhPSBudWxsKQorCQkJeworCQkJCXRyeQorCQkJCXsKKwkJCQkJdG9kby5kb2l0KCB0aGlzICk7CisJCQkJfQorCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJdG9kby5leGNlcHRpb24oIHRoaXMsIGUgKTsKKwkJCQl9CisJCQl9CisJCQluZWVkc0FkanVzdCA9IGZhbHNlOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJaWYgKG5lZWRzQWRqdXN0KQorCQkJCXdvcmtlcnMuYWRqdXN0KCAtMSApOworCQl9CisJfQorCisJLy8vLy8vLy8vLy8vLworCS8vIFdPUktFUlMgLy8KKwkvLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHdvcmtlcnMuCisJICovCisJcHVibGljIGludCBudW1Xb3JrZXJzKCkKKwl7CisJCXJldHVybiB3b3JrZXJzLmdldCgpOworCX0KKworCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY29uc2lkZXJTdGFydGluZ0FXb3JrZXIoIGludCBxbGVuICkKKyAgICB7CisJICAgIGludCBuID0gbnVtV29ya2VycygpOworCSAgICAKKwkgICAgaWYgKG4gPj0gbWF4V29ya2VycykKKwkgICAgCXJldHVybjsKKwkgICAgCisJICAgIC8vIHN0YXJ0IGEgbmV3IHdvcmtlciBpZiB0aGVyZSBhcmUgbm9uZSBvciBpZiB0aGUgcXVldWUKKwkgICAgLy8gbGVuZ3RoIHBlciB3b3JrZXIgaGFzIGV4Y2VlZGVkIHRoZSB0aHJlc2hvbGQuCisJICAgIAorCSAgICBpZiAobiA9PSAwIHx8IChxbGVuICsgbiAtIDEpIC8gbiA+IHRocmVzaG9sZCkKKwkgICAgCXN0YXJ0QVdvcmtlcigpOworCSAgICAKKyAgICB9CisJCisJcHJpdmF0ZSB2b2lkIHN0YXJ0QVdvcmtlcigpCisJeworCQl3b3JrZXJzLmFkanVzdCggMSApOworCQluZXcgVGhyZWFkKCB0aGlzICkuc3RhcnQoKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBJbnRDb3VudGVyIHdvcmtlcnMgPSBuZXcgSW50Q291bnRlcigpOworCisJLy8vLy8vLy8vLy8KKwkvLyBRVUVVRSAvLworCS8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQWRkcyB0aGUgdG9kbyB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUuCisJICogQHBhcmFtIHRvZG8gdGhlIHRvZG8gdG8gYWRkLgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcXVldWUgbGVuZ3RoLgorCSAqLworCXByaXZhdGUgc3luY2hyb25pemVkIGludCBhZGRFbnRyeSggVG9kbyB0b2RvICkKKyAgICB7CisJCUVudHJ5IGUgPSBuZXcgRW50cnkoKTsKKwkJCisJCWUudG9kbyA9IHRvZG87CisJCQorCQlpZiAodGFpbCAhPSBudWxsKQorCQkJdGFpbC5uZXh0ID0gZTsKKwkJZWxzZQorCQkJaGVhZCA9IGU7CisJCQorCQl0YWlsID0gZTsKKwkgICAgCisJCXJldHVybiBlbnRyaWVzLmFkanVzdCggMSApOworICAgIH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgdG9kbyBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSwgb3IgbnVsbCBpZiB0aGUKKwkgKiBxdWV1ZSBpcyBlbXB0eS4KKwkgKi8KKwlwcml2YXRlIHN5bmNocm9uaXplZCBUb2RvIHJlbW92ZUVudHJ5KCkKKyAgICB7CisJICAgIGlmIChoZWFkID09IG51bGwpCisJICAgIAlyZXR1cm4gbnVsbDsKKwkgICAgCisJICAgIEVudHJ5IGUgPSBoZWFkOworCSAgICBoZWFkID0gZS5uZXh0OworCSAgICAKKwkgICAgaWYgKGhlYWQgPT0gbnVsbCkKKwkgICAgCXRhaWwgPSBudWxsOworCSAgICAKKwkgICAgZW50cmllcy5hZGp1c3QoIC0xICk7CisJICAgIAorCSAgICByZXR1cm4gZS50b2RvOworICAgIH0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdG9kb3MuCisJICovCisJcHVibGljIGludCBudW1FbnRyaWVzKCkKKwl7CisJCXJldHVybiBlbnRyaWVzLmdldCgpOworCX0KKwkKKwlwcml2YXRlIEVudHJ5IGhlYWQ7CisJCisJcHJpdmF0ZSBFbnRyeSB0YWlsOworCQorCXByaXZhdGUgZmluYWwgSW50Q291bnRlciBlbnRyaWVzID0gbmV3IEludENvdW50ZXIoKTsKKwkKKwkvKiogQW4gZW50cnkgaW4gdGhlIHRvZG8gcXVldWUgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEVudHJ5CisJeworCQkvKiogdGhlIHRvZG8gdG8gYmUgcGVyZm9ybWVkLiAqLworCQlwdWJsaWMgVG9kbyB0b2RvOworCQkvKiogdGhlIG5leHQgdG9kbyBpbiB0aGUgcXVldWUuICovCisJCXB1YmxpYyBFbnRyeSBuZXh0OworCX0KKworCS8vLy8vLy8vLy8KKwkvLyBCTEFIIC8vCisJLy8vLy8vLy8vLworCQorCXByaXZhdGUgc3luY2hyb25pemVkIFRvZG8gZ2V0TmV4dFRvZG8oKQorCXsKKwkJVG9kbyB0b2RvID0gbnVsbDsKKwkJYm9vbGVhbiBsaW5nZXJlZCA9IGZhbHNlOworCQl3aGlsZSAoaXNTdGFydGVkKCkgJiYgKHRvZG8gPSByZW1vdmVFbnRyeSgpKSA9PSBudWxsKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlpZiAobGluZ2VyZWQgJiYgd29ya2Vycy5nZXQoKSA+IG1pbldvcmtlcnMpCisJCQkJeworCQkJCQl3b3JrZXJzLmFkanVzdCggLTEgKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCQorCQkJCXdhaXQoIHdvcmtlckxpbmdlciApOworCQkJCQorCQkJCS8vIHdlIGxpbmdlcmVkLiB3ZSBtaWdodCBoYXZlIGJlZW4gd29rZW4gYmVjYXVzZQorCQkJCS8vIHdlJ3JlIHN0b3BwaW5nLCBvciBhIHRvZG8gbWlnaHQgaGF2ZSBiZWVuCisJCQkJLy8gcXVldWVkLgorCQkJCQorCQkJCWxpbmdlcmVkID0gdHJ1ZTsKKwkJCX0KKwkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQl7CisJCQkJd29ya2Vycy5hZGp1c3QoIC0xICk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRvZG87CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1RBVElDIFNUVUZGIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQHBhcmFtIHRvZG8KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9kbyggVG9kbyB0b2RvICkKKwl7CisJCXRyeQorCQl7CisJCQlnZXRUb2RvTWFuYWdlcigpLmFkZCggdG9kbyApOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQl0b2RvLmV4Y2VwdGlvbiggbnVsbCwgZSApOworCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgY29uZmlndXJlZCB0b2RvIG1hbmFnZXIuIGlmIHRoZXJlIGlzbid0IG9uZSwgaXQgbWFrZXMKKwkgKiBvbmUgd2l0aCBvbmUgd29ya2VyIHRocmVhZC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gY3JlYXRpbmcgdGhlIHRvZG8gbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRvZG9NYW5hZ2VyIGdldFRvZG9NYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHRvZG9NYW5hZ2VyID09IG51bGwpCisJCXsKKwkJCXN5bmNocm9uaXplZCAoVG9kb01hbmFnZXIuY2xhc3MpCisJCQl7CisJCQkJaWYgKHRvZG9NYW5hZ2VyID09IG51bGwpCisJCQkJeworCQkJCQl0b2RvTWFuYWdlciA9IG5ldyBUb2RvTWFuYWdlciggNTAsIDEwLCAwLCA1LCA1MDAwLCAwICk7CisJCQkJCXRvZG9NYW5hZ2VyLnN0YXJ0KCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0b2RvTWFuYWdlcjsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG5ld1RvZG9NYW5hZ2VyCisJICogQHJldHVybiB0aGUgb2xkIHRvZG8gbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUb2RvTWFuYWdlciBzZXRUb2RvTWFuYWdlciggVG9kb01hbmFnZXIgbmV3VG9kb01hbmFnZXIgKQorCXsKKwkJVG9kb01hbmFnZXIgb2xkVG9kb01hbmFnZXIgPSB0b2RvTWFuYWdlcjsKKwkJdG9kb01hbmFnZXIgPSBuZXdUb2RvTWFuYWdlcjsKKwkJcmV0dXJuIG9sZFRvZG9NYW5hZ2VyOworCX0KKwkKKwkvKioKKwkgKiBTaHV0cyBkb3duIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBzdGF0aWMgdG9kbyBtYW5hZ2VyIGlmIGFueS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRvZG9NYW5hZ2VyIG9sZFRvZG9NYW5hZ2VyID0gc2V0VG9kb01hbmFnZXIoIG51bGwgKTsKKwkJaWYgKG9sZFRvZG9NYW5hZ2VyICE9IG51bGwpCisJCQlvbGRUb2RvTWFuYWdlci5zdG9wKCk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRvZG9NYW5hZ2VyIHRvZG9NYW5hZ2VyOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1VSTC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1VSTC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDBkMTIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVVJMLmphdmEKQEAgLTAsMCArMSwxMzE3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIE1vZGVscyBhIHVybCBvZiB0aGUgZm9ybSBzY2hlbWU6Ly91c2VyOnBhc3N3b3JkQGhvc3Q6cG9ydC91cmk7cGFybXM/dGVybXMjZnJhZ21lbnQKKyAqLworcHVibGljIGNsYXNzIFVSTAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSB1cmwgZnJvbSBhIHN0cmluZy4KKwkgKiBAcGFyYW0gdXJsU3RyCisJICovCisJcHVibGljIFVSTCggU3RyaW5nIHVybFN0ciApCisJeworCQlpZiAodXJsU3RyICE9IG51bGwgJiYgdXJsU3RyLmxlbmd0aCgpID4gMCkKKwkJCXBhcnNlKCB1cmxTdHIgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIHVybCBmcm9tIGFub3RoZXIgdXJsLgorCSAqIEBwYXJhbSBvdGhlcgorCSAqLworCXB1YmxpYyBVUkwoIFVSTCBvdGhlciApCisJeworCQlzY2hlbWUgPSBvdGhlci5zY2hlbWU7CisJCXVzZXIgPSBvdGhlci51c2VyOworCQlwYXNzd29yZCA9IG90aGVyLnBhc3N3b3JkOworCQlob3N0ID0gb3RoZXIuaG9zdDsKKwkJcG9ydCA9IG90aGVyLnBvcnQ7CisJCXVyaSA9IG90aGVyLnVyaTsKKwkJcGFyYW1zID0gY29weUxpc3QoIG90aGVyLnBhcmFtcyApOworCQl0ZXJtcyA9IGNvcHlUZXJtcyggb3RoZXIudGVybXMgKTsKKwkJZnJhZ21lbnQgPSBvdGhlci5mcmFnbWVudDsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHVybC4KKwkgKi8KKwlwdWJsaWMgVVJMKCkKKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorCQorCXByaXZhdGUgdm9pZCBwYXJzZSggU3RyaW5nIHMgKQorCXsKKwkJLy8gcyBpcyBzY2hlbWU6Wy8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0vXXVyaVs7cGFyYW1zXVs/dGVybXNdWyNmcmFnbWVudF0KKwkJCisJCVN0cmluZ1tdIHggPSBTdHJpbmdVdGlsLmxlZnRTcGxpdCggcywgJzonICk7CisJCWlmICh4ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibWlzc2luZyBzY2hlbWUiICk7CisJCQorCQlzZXRTY2hlbWUoIHVuZXNjYXBlKCB4WzBdICkgKTsKKwkJcyA9IHhbMV07CisJCQorCQkvLyBzIGlzIFsvL1t1c2VyWzpwYXNzd29yZF1AXWhvc3RbOnBvcnRdL111cmlbO3BhcmFtc11bP3Rlcm1zXVsjZnJhZ21lbnRdCisJCQorCQl4ID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIHMsICcjJyApOworCQlpZiAoeCAhPSBudWxsKQorCQl7CisJCQlzZXRGcmFnbWVudCggdW5lc2NhcGUoIHhbMV0gKSApOworCQkJcyA9IHhbMF07CisJCX0KKwkJCisJCS8vIHMgaXMgWy8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0vXXVyaVs7cGFyYW1zXVs/dGVybXNdCisJCQorCQl4ID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIHMsICc/JyApOworCQlpZiAoeCAhPSBudWxsKQorCQl7CisJCQlwYXJzZVRlcm1zKCB4WzFdICk7CisJCQlzID0geFswXTsKKwkJfQorCQkKKwkJLy8gcyBpcyBbLy9bdXNlcls6cGFzc3dvcmRdQF1ob3N0Wzpwb3J0XS9ddXJpWztwYXJhbXNdCisJCQorCQl4ID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIHMsICc7JyApOworCQlpZiAoeCAhPSBudWxsKQorCQl7CisJCQlwYXJzZVBhcmFtcyggeFsxXSApOworCQkJcyA9IHhbMF07CisJCX0KKwkJCisJCS8vIHMgaXMgWy8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0vXXVyaQorCQkKKwkJaWYgKHMuc3RhcnRzV2l0aCggIi8vIiApKQorCQl7CisJCQlzID0gcy5zdWJzdHJpbmcoIDIgKTsKKwkJCS8vIHMgaXMgW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0vdXJpCisJCQl4ID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIHMsICcvJyApOworCQkJaWYgKHggIT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBzIGlzIFt1c2VyWzpwYXNzd29yZF1AXWhvc3RbOnBvcnRdL3VyaQorCQkJCXBhcnNlSG9zdCggeFswXSApOworCQkJCXMgPSB4WzFdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIHMgaXMgW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0KKwkJCQlwYXJzZUhvc3QoIHMgKTsKKwkJCQlzID0gIiI7CisJCQl9CisJCX0KKwkJc2V0VXJpKCB1bmVzY2FwZSggcyApICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlSG9zdCggU3RyaW5nIHMgKQorCXsKKwkJLy8gcyBpcyBbdXNlcls6cGFzc3dvcmRdQF1ob3N0Wzpwb3J0XQorCQlTdHJpbmdbXSB4ID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIHMsICdAJyApOworCQlpZiAoeCAhPSBudWxsKQorCQl7CisJCQlwYXJzZVVzZXJQYXNzd29yZCggeFswXSApOworCQkJcGFyc2VIb3N0UG9ydCggeFsxXSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcGFyc2VIb3N0UG9ydCggcyApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlVXNlclBhc3N3b3JkKCBTdHJpbmcgcyApCisJeworCQkvLyBzIGlzIHVzZXJbOnBhc3N3b3JkXQorCQlTdHJpbmdbXSB4ID0gU3RyaW5nVXRpbC5sZWZ0U3BsaXQoIHMsICc6JyApOworCQlpZiAoeCAhPSBudWxsKQorCQl7CisJCQlzZXRVc2VyKCB1bmVzY2FwZSggeFswXSApICk7CisJCQlzZXRQYXNzd29yZCggdW5lc2NhcGUoIHhbMV0gKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJc2V0VXNlciggdW5lc2NhcGUoIHMgKSApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlSG9zdFBvcnQoIFN0cmluZyBzICkKKwl7CisJCS8vIHMgaXMgaG9zdFs6cG9ydF0KKwkJU3RyaW5nW10geCA9IFN0cmluZ1V0aWwubGVmdFNwbGl0KCBzLCAnOicgKTsKKwkJaWYgKHggIT0gbnVsbCkKKwkJeworCQkJc2V0SG9zdCggdW5lc2NhcGUoIHhbMF0gKSApOworCQkJU3RyaW5nIHAgPSB1bmVzY2FwZSggeFsxXSApOworCQkJY2hlY2tOb3RJbnRlZ2VyKCAicG9ydCIsIHAgKTsKKwkJCXNldFBvcnQoIEludGVnZXIucGFyc2VJbnQoIHAgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJc2V0SG9zdCggdW5lc2NhcGUoIHMgKSApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW1zKCBTdHJpbmcgcyApCisJeworCQkvLyBzIGlzIHBhcmFtWztwYXJhbV0qCisJCQorCQlpZiAocy5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuOworCQkKKwkJZW5zdXJlUGFyYW1zKCk7CisJCQorCQlTdHJpbmdbXSB4OworCQl3aGlsZSAoKHggPSBTdHJpbmdVdGlsLmxlZnRTcGxpdCggcywgJzsnICkpICE9IG51bGwpCisJCXsKKwkJCWFkZFBhcmFtKCB1bmVzY2FwZSggeFswXSApICk7CisJCQlzID0geFsxXTsKKwkJfQorCQkKKwkJYWRkUGFyYW0oIHVuZXNjYXBlKCBzICkgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcGFyc2VUZXJtcyggU3RyaW5nIHMgKQorCXsKKwkJLy8gcyBpcyB0ZXJtWyZ0ZXJtXSoKKwkJCisJCWlmIChzLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm47CisJCQorCQlTdHJpbmdbXSB4OworCQl3aGlsZSAoKHggPSBTdHJpbmdVdGlsLmxlZnRTcGxpdCggcywgJyYnICkpICE9IG51bGwpCisJCXsKKwkJCXBhcnNlVGVybSggeFswXSApOworCQkJcyA9IHhbMV07CisJCX0KKwkJCisJCXBhcnNlVGVybSggcyApOworCX0KKworCXByaXZhdGUgdm9pZCBwYXJzZVRlcm0oIFN0cmluZyBzICkKKwl7CisJCS8vIHMgaXMgbmFtZVs9dmFsdWVdCisJCQorCQlpZiAocy5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuOworCQkKKwkJZW5zdXJlVGVybXMoKTsKKwkJCisJCVN0cmluZ1tdIHggPSBTdHJpbmdVdGlsLmxlZnRTcGxpdCggcywgJz0nICk7CisJCWlmICh4ICE9IG51bGwpCisJCQlhZGRUZXJtKCB1bmVzY2FwZSggeFswXSApLCB1bmVzY2FwZSggeFsxXSApICk7CisJCWVsc2UKKwkJCWFkZFRlcm0oIHVuZXNjYXBlKCBzICksICIiICk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgc2NoZW1lOworCQorCXByaXZhdGUgU3RyaW5nIHVzZXI7CisJCisJcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7CisJCisJcHJpdmF0ZSBTdHJpbmcgaG9zdDsKKwkKKwlwcml2YXRlIEludGVnZXIgcG9ydDsKKwkKKwlwcml2YXRlIFN0cmluZyB1cmk7CisJCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyYW1zOworCQorCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0ZXJtczsKKwkKKwlwcml2YXRlIFN0cmluZyBmcmFnbWVudDsKKworCS8vLy8vLy8vLy8vLworCS8vIFNDSEVNRSAvLworCS8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHNjaGVtZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpCisJeworCQlyZXR1cm4gc2NoZW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBzY2hlbWUuCisJICogCisJICogQHBhcmFtIHNjaGVtZSB0aGUgc2NoZW1lIHRvIHNldCB3aGljaCBtYXkgYmUgbnVsbCBidXQgbm90IGJsYW5rLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFNjaGVtZSggU3RyaW5nIHNjaGVtZSApCisJeworCQljaGVja05vdEJsYW5rKCAic2NoZW1lIiwgc2NoZW1lICk7CisJCXRoaXMuc2NoZW1lID0gc2NoZW1lOworCX0KKwkKKwkvKioKKwkgKiBUZXN0cyB0aGUgc2NoZW1lIGZvciBhIG1hdGNoLiBUaGUgc2NoZW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4KKwkgKiAKKwkgKiBAcGFyYW0gdGVzdFNjaGVtZSBhIHNjaGVtZSB0byB0ZXN0IGFnYWluc3QuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBzY2hlbWVzIG1hdGNoLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTY2hlbWUoIFN0cmluZyB0ZXN0U2NoZW1lICkKKwl7CisJCXJldHVybiB0ZXN0U2NoZW1lLmVxdWFsc0lnbm9yZUNhc2UoIHNjaGVtZSApOworCX0KKworCS8vLy8vLy8vLy8KKwkvLyBVU0VSIC8vCisJLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHVzZXIuCisJICovCisJcHVibGljIFN0cmluZyBnZXRVc2VyKCkKKwl7CisJCXJldHVybiB1c2VyOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB1c2VyLgorCSAqIAorCSAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyIHRvIHNldCB3aGljaCBtYXkgYmUgbnVsbCBidXQgbm90IGJsYW5rLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZXIoIFN0cmluZyB1c2VyICkKKwl7CisJCWNoZWNrTm90QmxhbmsoICJ1c2VyIiwgdXNlciApOworCQl0aGlzLnVzZXIgPSB1c2VyOworCX0KKworCS8vLy8vLy8vLy8vLy8vCisJLy8gUEFTU1dPUkQgLy8KKwkvLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHBhc3N3b3JkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQorCXsKKwkJcmV0dXJuIHBhc3N3b3JkOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBwYXNzd29yZC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHBhc3N3b3JkIHRvIHNldCB3aGljaCBtYXkgYmUgbnVsbCBidXQgbm90IGJsYW5rLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKCBTdHJpbmcgcGFzc3dvcmQgKQorCXsKKwkJLy9jaGVja05vdEJsYW5rKCAicGFzc3dvcmQiLCBwYXNzd29yZCApOworCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisJfQorCisJLy8vLy8vLy8vLworCS8vIEhPU1QgLy8KKwkvLy8vLy8vLy8vCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBob3N0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpCisJeworCQlyZXR1cm4gaG9zdDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBob3N0LgorCSAqIAorCSAqIEBwYXJhbSBob3N0IHRoZSBob3N0IHRvIHNldCB3aGljaCBtYXkgYmUgbnVsbCBidXQgbm90IGJsYW5rLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEhvc3QoIFN0cmluZyBob3N0ICkKKwl7CisJCWNoZWNrTm90QmxhbmsoICJob3N0IiwgaG9zdCApOworCQl0aGlzLmhvc3QgPSBob3N0OworCX0KKworCS8vLy8vLy8vLy8KKwkvLyBQT1JUIC8vCisJLy8vLy8vLy8vLworCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGEgcG9ydCBoYXMgYmVlbiBzcGVjaWZpZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNQb3J0KCkKKwl7CisJCXJldHVybiBwb3J0ICE9IG51bGw7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHBvcnQuIE51bGwgaWYgbm8gcG9ydCBoYXMgYmVlbiBzcGVjaWZpZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0UG9ydCgpCisJeworCQlyZXR1cm4gcG9ydDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBwb3J0LgorCSAqIAorCSAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIHNldCB3aGljaCBtYXkgYmUgYmV0d2VlbiAwIGFuZCA2NTUzNS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb3J0KCBJbnRlZ2VyIHBvcnQgKQorCXsKKwkJaWYgKHBvcnQgIT0gbnVsbCAmJiAocG9ydCA8IDAgfHwgcG9ydCA+IDY1NTM1KSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzUiICk7CisJCQorCQl0aGlzLnBvcnQgPSBwb3J0OworCX0KKworCS8vLy8vLy8vLworCS8vIFVSSSAvLworCS8vLy8vLy8vLworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHVyaS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVyaSgpCisJeworCQlyZXR1cm4gdXJpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHVyaS4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdG8gc2V0IHdoaWNoIG1heSBiZSBudWxsIG9yIGJsYW5rLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFVyaSggU3RyaW5nIHVyaSApCisJeworCQl0aGlzLnVyaSA9IHVyaTsKKwl9CisKKwkvLy8vLy8vLy8vLy8KKwkvLyBQQVJBTVMgLy8KKwkvLy8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhcmFtLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1BhcmFtcygpCisJeworCQlyZXR1cm4gcGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLnNpemUoKSA+IDA7CisJfQorCisJLyoqCisJICogRmV0Y2hzIHRoZSBmaXJzdCBwYXJhbSBmb3VuZCB3aGljaCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LiBUaGUKKwkgKiBzZWFyY2ggb3JkZXIgaXMgbm90IHNwZWNpZmllZCwgYW5kIHRoZSBwYXJhbXMgYXJlIG5vdCBtYWludGFpbmVkIGluIGFueQorCSAqIHNwZWNpZmljIG9yZGVyLgorCSAqIAorCSAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBvZiB0aGUgcGFyYW0gdG8gZmV0Y2ggKGUuZy4sICJ0cmFuc3BvcnQ9IikuCisJICogCisJICogQHJldHVybiB0aGUgZmlyc3QgcGFyYW0gd2hpY2ggc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguCisJICovCisJcHVibGljIFN0cmluZyBnZXRQYXJhbSggU3RyaW5nIHByZWZpeCApCisJeworCQljaGVja05vdE51bGwoIHByZWZpeCwgInByZWZpeCA9PSBudWxsIiApOworCQkKKwkJaWYgKHBhcmFtcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlmb3IgKFN0cmluZyBwOiBwYXJhbXMpCisJCQlpZiAocC5zdGFydHNXaXRoKCBwcmVmaXggKSkKKwkJCQlyZXR1cm4gcDsKKwkJCisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBwYXJhbXMuIFRoZSBwYXJhbXMgYXJlIHN0cmluZ3MsIGdlbmVyYWxseQorCSAqIG9mIHRoZSBmb3JtICJ0cmFuc3BvcnQ9dGNwIi4gQnV0IHRoZXkgY2FuIGJlIGFueXRoaW5nIHlvdSBsaWtlLCByZWFsbHkuCisJICogVGhlIGl0ZXJhdG9yIG1pZ2h0IGJlIGVtcHR5LgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbXMoKQorCXsKKwkJaWYgKHBhcmFtcyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7fTsKKwkJCisJCXJldHVybiBwYXJhbXMudG9BcnJheSggbmV3IFN0cmluZ1tdIHt9ICk7CisJfQorCQorCS8qKgorCSAqIEFkZHMgYSBwYXJhbSB0byB0aGUgbGlzdCBvZiBwYXJhbXMgZm9yIHRoaXMgdXJsLiBPbmx5IHRoZSB1bmlxdWUKKwkgKiBwYXJhbXMgYXJlIG1haW50YWluZWQuIER1cGxpY2F0ZSBwYXJhbSB2YWx1ZXMgYXJlIHN1cHByZXNzZWQuCisJICogCisJICogQHBhcmFtIHBhcmFtIGEgcGFyYW0gKGUuZy4sICJ0cmFuc3BvcnQ9dGNwIiBvciAiMDE4MzE4NjQ1NzQ4OTg0NzUiKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQYXJhbSggU3RyaW5nIHBhcmFtICkKKwl7CisJCWNoZWNrTm90TnVsbCggcGFyYW0sICJwYXJhbSA9PSBudWxsIiApOworCQllbnN1cmVQYXJhbXMoKTsKKwkJcGFyYW1zLmFkZCggcGFyYW0gKTsKKwl9CisJCisJLyoqCisJICogUmVtb3ZlcyB0aGUgZmlyc3QgcGFyYW0gZm91bmQgd2hpY2ggc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeC4gVGhlCisJICogc2VhcmNoIG9yZGVyIGlzIG5vdCBzcGVjaWZpZWQsIGFuZCB0aGUgcGFyYW1zIGFyZSBub3QgbWFpbnRhaW5lZCBpbiBhbnkKKwkgKiBzcGVjaWZpYyBvcmRlci4KKwkgKiAKKwkgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggb2YgdGhlIHBhcmFtIHRvIHJlbW92ZSAoZS5nLiwgInRyYW5zcG9ydD0iKS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwYXJhbSByZW1vdmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgcmVtb3ZlUGFyYW0oIFN0cmluZyBwcmVmaXggKQorCXsKKwkJY2hlY2tOb3ROdWxsKCBwcmVmaXgsICJwcmVmaXggPT0gbnVsbCIgKTsKKwkJCisJCWlmIChwYXJhbXMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJZm9yIChTdHJpbmcgcDogZ2V0UGFyYW1zKCkpCisJCXsKKwkJCWlmIChwLnN0YXJ0c1dpdGgoIHByZWZpeCApKQorCQkJeworCQkJCXBhcmFtcy5yZW1vdmUoIHAgKTsKKwkJCQlyZXR1cm4gcDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGFsbCB0aGUgcGFyYW1zLgorCSAqLworCXB1YmxpYyB2b2lkIGNsZWFyUGFyYW1zKCkKKwl7CisJCWlmIChwYXJhbXMgIT0gbnVsbCkKKwkJCXBhcmFtcy5jbGVhcigpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZW5zdXJlUGFyYW1zKCkKKwl7CisJCWlmIChwYXJhbXMgPT0gbnVsbCkKKwkJCXBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUVVFUlkgVEVSTVMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcXVlcnkgdGVybS4gUXVlcnkgdGVybXMKKwkgKiBhcmUgb2YgdGhlIGZvcm0gbmFtZT12YWx1ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNUZXJtcygpCisJeworCQlyZXR1cm4gdGVybXMgIT0gbnVsbCAmJiAhdGVybXMuaXNFbXB0eSgpOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcXVlcnkgdGVybSB3aXRoIHRoZSBzcGVjaWZpZWQKKwkgKiBuYW1lLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1Rlcm0oIFN0cmluZyBuYW1lICkKKwl7CisJCWNoZWNrTmFtZSggbmFtZSApOworCQkKKwkJaWYgKHRlcm1zID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlyZXR1cm4gdGVybXMuY29udGFpbnNLZXkoIG5hbWUgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBxdWVyeSB0ZXJtIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgYm9vbGVhbiBoYXNUZXJtKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICkKKwl7CisJCWNoZWNrTmFtZSggbmFtZSApOworCQkKKwkJaWYgKHRlcm1zID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiBoYXNUZXJtKCBuYW1lICk7CisJCQorCQlPYmplY3Qgb2JqID0gdGVybXMuZ2V0KCBuYW1lICk7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChvYmogaW5zdGFuY2VvZiBMaXN0KQorCQkJcmV0dXJuICgoTGlzdDxTdHJpbmc+KSBvYmopLmNvbnRhaW5zKCB2YWx1ZSApOworCQkKKwkJcmV0dXJuIG9iai5lcXVhbHMoIHZhbHVlICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBxdWVyeSB0ZXJtIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNUZXJtKCBTdHJpbmcgbmFtZSwgSW50ZWdlciB2YWx1ZSApCisJeworCQlyZXR1cm4gaGFzVGVybSggbmFtZSwgdG9TdHJpbmcoIHZhbHVlICkgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHF1ZXJ5IHRlcm0gd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1Rlcm0oIFN0cmluZyBuYW1lLCBEb3VibGUgdmFsdWUgKQorCXsKKwkJcmV0dXJuIGhhc1Rlcm0oIG5hbWUsIHRvU3RyaW5nKCB2YWx1ZSApICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBxdWVyeSB0ZXJtIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNUZXJtKCBTdHJpbmcgbmFtZSwgQm9vbGVhbiB2YWx1ZSApCisJeworCQlyZXR1cm4gaGFzVGVybSggbmFtZSwgdG9TdHJpbmcoIHZhbHVlICkgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHF1ZXJ5IHRlcm0gc3BlY2lmaWVkIGJ5IG5hbWUgaGFzIG11bHRpcGxlIHZhbHVlcy4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgYm9vbGVhbiBoYXNNdWx0aXBsZVZhbHVlcyggU3RyaW5nIG5hbWUgKQorCXsKKwkJY2hlY2tOYW1lKCBuYW1lICk7CisJCQorCQlpZiAodGVybXMgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCU9iamVjdCBvYmogPSB0ZXJtcy5nZXQoIG5hbWUgKTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpCisJCQlyZXR1cm4gKChMaXN0PFN0cmluZz4pIG9iaikuc2l6ZSgpID4gMTsKKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBxdWVyeSB0ZXJtLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0ZXJtLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KKwkgKiAKKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSB0ZXJtIGhhcyBtdWx0aXBsZSB2YWx1ZXMuCisJICogVXNlIGdldFRlcm1zKG5hbWUpIGluc3RlYWQuCisJICogCisJICogQHNlZSAjZ2V0VGVybXMoU3RyaW5nKQorCSAqIEBzZWUgI2dldEludGVnZXJUZXJtKFN0cmluZykKKwkgKiBAc2VlICNnZXREb3VibGVUZXJtKFN0cmluZykKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgU3RyaW5nIGdldFRlcm0oIFN0cmluZyBuYW1lICkKKwl7CisJCWNoZWNrTmFtZSggbmFtZSApOworCQkKKwkJaWYgKHRlcm1zID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCU9iamVjdCBvYmogPSB0ZXJtcy5nZXQoIG5hbWUgKTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkKKwkJeworCQkJSXRlcmF0b3I8U3RyaW5nPiBpID0gKChMaXN0PFN0cmluZz4pIG9iaikuaXRlcmF0b3IoKTsKKwkJCQorCQkJaWYgKCFpLmhhc05leHQoKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCQorCQkJU3RyaW5nIHYgPSBpLm5leHQoKTsKKwkJCQorCQkJaWYgKGkuaGFzTmV4dCgpKQorCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkJInRlcm0gJyVzJyBoYXMgbXVsdGlwbGUgdmFsdWVzIiwgbmFtZSApICk7CisJCQkKKwkJCXJldHVybiB2OworCQl9CisJCQorCQlyZXR1cm4gKFN0cmluZykgb2JqOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdGVybSwgb3IgZGVmYXVsdFZhbHVlIGlmIG5vdCBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRlcm0oIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdFZhbHVlICkKKwl7CisJCVN0cmluZyB2YWx1ZSA9IGdldFRlcm0oIG5hbWUgKTsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQlyZXR1cm4gdmFsdWU7CisJfQorCQorCS8qKgorCSAqIEdldHMgdGhlIEludGVnZXIgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBxdWVyeSB0ZXJtLgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgSW50ZWdlciB2YWx1ZSwgb3IgbnVsbCBpZiBub3QgZm91bmQuCisJICogQHNlZSAjZ2V0VGVybShTdHJpbmcpCisJICovCisJcHVibGljIEludGVnZXIgZ2V0SW50ZWdlclRlcm0oIFN0cmluZyBuYW1lICkKKwl7CisJCVN0cmluZyBzID0gZ2V0VGVybSggbmFtZSApOworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoIHMgKTsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcXVlcnkgdGVybS4KKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgdGVybSBpcyBub3QgZm91bmQuCisJICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSwgb3IgZGVmYXVsdFZhbHVlIGlmIG5vdCBmb3VuZC4KKwkgKiBAc2VlICNnZXRUZXJtKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgaW50IGdldEludGVnZXJUZXJtKCBTdHJpbmcgbmFtZSwgaW50IGRlZmF1bHRWYWx1ZSApCisJeworCQlJbnRlZ2VyIHZhbHVlID0gZ2V0SW50ZWdlclRlcm0oIG5hbWUgKTsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQlyZXR1cm4gdmFsdWU7CisJfQorCQorCS8qKgorCSAqIEdldHMgdGhlIERvdWJsZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBEb3VibGUgdmFsdWUsIG9yIG51bGwgaWYgbm90IGZvdW5kLgorCSAqIEBzZWUgI2dldFRlcm0oU3RyaW5nKQorCSAqLworCXB1YmxpYyBEb3VibGUgZ2V0RG91YmxlVGVybSggU3RyaW5nIG5hbWUgKQorCXsKKwkJU3RyaW5nIHMgPSBnZXRUZXJtKCBuYW1lICk7CisJCWlmIChzID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIERvdWJsZS52YWx1ZU9mKCBzICk7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgZG91YmxlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcXVlcnkgdGVybS4KKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgdGVybSBpcyBub3QgZm91bmQuCisJICogQHJldHVybiB0aGUgZG91YmxlIHZhbHVlLCBvciBkZWZhdWx0VmFsdWUgaWYgbm90IGZvdW5kLgorCSAqIEBzZWUgI2dldFRlcm0oU3RyaW5nKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVGVybSggU3RyaW5nIG5hbWUsIGRvdWJsZSBkZWZhdWx0VmFsdWUgKQorCXsKKwkJRG91YmxlIHZhbHVlID0gZ2V0RG91YmxlVGVybSggbmFtZSApOworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiBkZWZhdWx0VmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcXVlcnkgdGVybS4KKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUsIG9yIG51bGwgaWYgbm90IGZvdW5kLgorCSAqIEBzZWUgI2dldFRlcm0oU3RyaW5nKQorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW5UZXJtKCBTdHJpbmcgbmFtZSApCisJeworCQlTdHJpbmcgcyA9IGdldFRlcm0oIG5hbWUgKTsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCBzICk7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHRlcm0gaXMgbm90IGZvdW5kLgorCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUsIG9yIGRlZmF1bHRWYWx1ZSBpZiBub3QgZm91bmQuCisJICogQHNlZSAjZ2V0VGVybShTdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblRlcm0oIFN0cmluZyBuYW1lLCBib29sZWFuIGRlZmF1bHRWYWx1ZSApCisJeworCQlCb29sZWFuIHZhbHVlID0gZ2V0Qm9vbGVhblRlcm0oIG5hbWUgKTsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOworCQlyZXR1cm4gdmFsdWU7CisJfQorCQorCS8qKgorCSAqIEdldHMgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHN0cmluZyB2YWx1ZXMgb2YgdGhlIHF1ZXJ5IHRlcm0uIE1heSBiZSBlbXB0eS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgU3RyaW5nW10gZ2V0VGVybXMoIFN0cmluZyBuYW1lICkKKwl7CisJCWNoZWNrTmFtZSggbmFtZSApOworCQkKKwkJaWYgKHRlcm1zID09IG51bGwpCisJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt9OworCQkKKwkJT2JqZWN0IG9iaiA9IHRlcm1zLmdldCggbmFtZSApOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt9OworCQkKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpCisJCQlyZXR1cm4gKChMaXN0PFN0cmluZz4pIG9iaikudG9BcnJheSggbmV3IFN0cmluZ1tdIHt9ICk7CisJCQorCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgKFN0cmluZykgb2JqIH07CisJfQorCQorCS8qKgorCSAqIEdldHMgdGhlIG5hbWVzIG9mIHRoZSBxdWVyeSB0ZXJtcy4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHN0cmluZyBuYW1lcy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0VGVybU5hbWVzKCkKKwl7CisJCWlmICh0ZXJtcyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7fTsKKwkJCisJCXJldHVybiB0ZXJtcy5rZXlTZXQoKS50b0FycmF5KCBuZXcgU3RyaW5nW10ge30gKTsKKwl9CisJCisJLyoqCisJICogQWRkcyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0gdG8gdGhlIGxpc3Qgb2YgcXVlcnkgdGVybXMuIER1cGxpY2F0ZQorCSAqIG5hbWUvdmFsdWUgcGFpcnMgYXJlIHN1cHByZXNzZWQuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgdm9pZCBhZGRUZXJtKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICkKKwl7CisJCWNoZWNrTmFtZSggbmFtZSApOworCQkKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQllbnN1cmVUZXJtcygpOworCQkKKwkJT2JqZWN0IG9iaiA9IHRlcm1zLmdldCggbmFtZSApOworCQlpZiAob2JqID09IG51bGwpCisJCXsKKwkJCXRlcm1zLnB1dCggbmFtZSwgdmFsdWUgKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpCisJCXsKKwkJCUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSAoTGlzdDxTdHJpbmc+KSBvYmo7CisJCQlpZiAoIXZhbHVlcy5jb250YWlucyggdmFsdWUgKSkKKwkJCQl2YWx1ZXMuYWRkKCB2YWx1ZSApOworCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyBvYmogaXMgbm90IGEgbGlzdCBidXQgd2UgbmVlZCBvbmUsIHNvIHJlcGxhY2Ugb2JqIGluIHRlcm1zIHdpdGggYQorCQkvLyBsaXN0LCB0aGVuIGFkZCB2YWx1ZSB0byB0aGUgbGlzdC4KKwkJCisJCUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGVybXMucHV0KCBuYW1lLCB2YWx1ZXMgKTsKKwkJdmFsdWVzLmFkZCggKFN0cmluZykgb2JqICk7CisKKwkJdmFsdWVzLmFkZCggdmFsdWUgKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgcXVlcnkgdGVybSB0byB0aGUgbGlzdCBvZiBxdWVyeSB0ZXJtcy4gRHVwbGljYXRlCisJICogbmFtZS92YWx1ZSBwYWlycyBhcmUgc3VwcHJlc3NlZC4KKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFRlcm0oIFN0cmluZyBuYW1lLCBJbnRlZ2VyIHZhbHVlICkKKwl7CisJCWFkZFRlcm0oIG5hbWUsIHRvU3RyaW5nKCB2YWx1ZSApICk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0gdG8gdGhlIGxpc3Qgb2YgcXVlcnkgdGVybXMuIER1cGxpY2F0ZQorCSAqIG5hbWUvdmFsdWUgcGFpcnMgYXJlIHN1cHByZXNzZWQuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRUZXJtKCBTdHJpbmcgbmFtZSwgRG91YmxlIHZhbHVlICkKKwl7CisJCWFkZFRlcm0oIG5hbWUsIHRvU3RyaW5nKCB2YWx1ZSApICk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0gdG8gdGhlIGxpc3Qgb2YgcXVlcnkgdGVybXMuIER1cGxpY2F0ZQorCSAqIG5hbWUvdmFsdWUgcGFpcnMgYXJlIHN1cHByZXNzZWQuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRUZXJtKCBTdHJpbmcgbmFtZSwgQm9vbGVhbiB2YWx1ZSApCisJeworCQlhZGRUZXJtKCBuYW1lLCB0b1N0cmluZyggdmFsdWUgKSApOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmVzIGFsbCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHRlcm0uCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRydWUgaWYgc29tZXRoaW5nIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlVGVybSggU3RyaW5nIG5hbWUgKQorCXsKKwkJY2hlY2tOYW1lKCBuYW1lICk7CisJCQorCQlpZiAodGVybXMgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCXJldHVybiB0ZXJtcy5yZW1vdmUoIG5hbWUgKSAhPSBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbmFtZS92YWx1ZSBwYWlyIGZyb20gdGhlIGxpc3Qgb2YgcXVlcnkgdGVybXMuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUvdmFsdWUgcGFpciB3YXMgZm91bmQgYW5kIHJlbW92ZWQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlVGVybSggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApCisJeworCQljaGVja05hbWUoIG5hbWUgKTsKKwkJCisJCWlmICh0ZXJtcyA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gcmVtb3ZlVGVybSggbmFtZSApOworCQkKKwkJT2JqZWN0IG9iaiA9IHRlcm1zLmdldCggbmFtZSApOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkKKwkJeworCQkJTGlzdDxTdHJpbmc+IHZhbHVlcyA9IChMaXN0PFN0cmluZz4pIG9iajsKKwkJCWJvb2xlYW4gb2sgPSB2YWx1ZXMucmVtb3ZlKCB2YWx1ZSApOworCQkJaWYgKHZhbHVlcy5pc0VtcHR5KCkpCisJCQkJdGVybXMucmVtb3ZlKCBuYW1lICk7CisJCQlyZXR1cm4gb2s7CisJCX0KKwkJCisJCWlmIChvYmouZXF1YWxzKCB2YWx1ZSApKQorCQl7CisJCQl0ZXJtcy5yZW1vdmUoIG5hbWUgKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG5hbWUvdmFsdWUgcGFpciBmcm9tIHRoZSBsaXN0IG9mIHF1ZXJ5IHRlcm1zLgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lL3ZhbHVlIHBhaXIgd2FzIGZvdW5kIGFuZCByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlcm0oIFN0cmluZyBuYW1lLCBJbnRlZ2VyIHZhbHVlICkKKwl7CisJCXJldHVybiByZW1vdmVUZXJtKCBuYW1lLCB0b1N0cmluZyggdmFsdWUgKSApOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBuYW1lL3ZhbHVlIHBhaXIgZnJvbSB0aGUgbGlzdCBvZiBxdWVyeSB0ZXJtcy4KKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZS92YWx1ZSBwYWlyIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVUZXJtKCBTdHJpbmcgbmFtZSwgRG91YmxlIHZhbHVlICkKKwl7CisJCXJldHVybiByZW1vdmVUZXJtKCBuYW1lLCB0b1N0cmluZyggdmFsdWUgKSApOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBuYW1lL3ZhbHVlIHBhaXIgZnJvbSB0aGUgbGlzdCBvZiBxdWVyeSB0ZXJtcy4KKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZS92YWx1ZSBwYWlyIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVUZXJtKCBTdHJpbmcgbmFtZSwgQm9vbGVhbiB2YWx1ZSApCisJeworCQlyZXR1cm4gcmVtb3ZlVGVybSggbmFtZSwgdG9TdHJpbmcoIHZhbHVlICkgKTsKKwl9CisJCisJLyoqCisJICogUmVtb3ZlcyBhbGwgdGhlIHF1ZXJ5IHRlcm1zLgorCSAqLworCXB1YmxpYyB2b2lkIGNsZWFyVGVybXMoKQorCXsKKwkJaWYgKHRlcm1zICE9IG51bGwpCisJCQl0ZXJtcy5jbGVhcigpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZW5zdXJlVGVybXMoKQorCXsKKwkJaWYgKHRlcm1zID09IG51bGwpCisJCQl0ZXJtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCX0KKworCS8vLy8vLy8vLy8vLy8vCisJLy8gRlJBR01FTlQgLy8KKwkvLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogQHJldHVybiB0aGUgZnJhZ21lbnQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRGcmFnbWVudCgpCisJeworCQlyZXR1cm4gZnJhZ21lbnQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZnJhZ21lbnQuCisJICogCisJICogQHBhcmFtIGZyYWdtZW50IHRoZSBmcmFnbWVudCB0byBzZXQgd2hpY2ggbWF5IGJlIG51bGwgYnV0IG5vdCBibGFuay4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGcmFnbWVudCggU3RyaW5nIGZyYWdtZW50ICkKKwl7CisJCWNoZWNrTm90QmxhbmsoICJmcmFnbWVudCIsIGZyYWdtZW50ICk7CisJCXRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKKwl9CisKKwkvLy8vLy8vLy8vCisJLy8gVVRJTCAvLworCS8vLy8vLy8vLy8KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkKKwkJZXNjYXBlKCBzYiwgc2NoZW1lICk7CisJCXNiLmFwcGVuZCggJzonICk7CisJCQorCQlpZiAoaG9zdCAhPSBudWxsKQorCQl7CisJCQlzYi5hcHBlbmQoICIvLyIgKTsKKwkJCWlmICh1c2VyICE9IG51bGwpCisJCQl7CisJCQkJZXNjYXBlKCBzYiwgdXNlciApOworCQkJCWlmIChwYXNzd29yZCAhPSBudWxsKQorCQkJCXsKKwkJCQkJc2IuYXBwZW5kKCAnOicgKTsKKwkJCQkJZXNjYXBlKCBzYiwgcGFzc3dvcmQgKTsKKwkJCQl9CisJCQkJc2IuYXBwZW5kKCAnQCcgKTsKKwkJCX0KKwkJCWVzY2FwZSggc2IsIGhvc3QgKTsKKwkJCWlmIChwb3J0ICE9IG51bGwpCisJCQl7CisJCQkJc2IuYXBwZW5kKCAnOicgKTsKKwkJCQlzYi5hcHBlbmQoIHBvcnQgKTsKKwkJCX0KKwkJCXNiLmFwcGVuZCggJy8nICk7CisJCX0KKwkJCisJCWlmICh1cmkgIT0gbnVsbCkKKwkJCWVzY2FwZSggc2IsIHVyaSApOworCQkKKwkJaWYgKGhhc1BhcmFtcygpKQorCQkJcGFyYW1zVG9TdHJpbmcoIHNiICk7CisJCQorCQlpZiAoaGFzVGVybXMoKSkKKwkJCXRlcm1zVG9TdHJpbmcoIHNiICk7CisJCQorCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKKwkJeworCQkJc2IuYXBwZW5kKCAnIycgKTsKKwkJCWVzY2FwZSggc2IsIGZyYWdtZW50ICk7CisJCX0KKwkJCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKQorCXsKKwkJaW50IGNvZGUgPSAyMzU0Nzg1MzsKKwkJY29kZSBePSBoYyggc2NoZW1lICk7CisJCWNvZGUgXj0gaGMoIHVzZXIgKTsKKwkJY29kZSBePSBoYyggcGFzc3dvcmQgKTsKKwkJY29kZSBePSBoYyggaG9zdCApOworCQljb2RlIF49IGhjKCBwb3J0ICk7CisJCWNvZGUgXj0gaGMoIHVyaSApOworCQljb2RlIF49IGhjKCBwYXJhbXMgKTsKKwkJY29kZSBePSBoYyggdGVybXMgKTsKKwkJY29kZSBePSBoYyggZnJhZ21lbnQgKTsKKwkJcmV0dXJuIGNvZGU7CisJfQorCQorCXByaXZhdGUgaW50IGhjKCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gKQorCXsKKwkJcmV0dXJuIG0gIT0gbnVsbCA/IG0uaGFzaENvZGUoKSA6IDc5MzsKKwl9CisKKwlwcml2YXRlIGludCBoYyggTGlzdDxTdHJpbmc+IHMgKQorCXsKKwkJcmV0dXJuIHMgIT0gbnVsbCA/IHMuaGFzaENvZGUoKSA6IDE2MTsKKwl9CisKKwlwcml2YXRlIGludCBoYyggSW50ZWdlciBpICkKKwl7CisJCXJldHVybiBpICE9IG51bGwgPyBpLmhhc2hDb2RlKCkgOiA1OTsKKwl9CisKKwlwcml2YXRlIGludCBoYyggU3RyaW5nIHMgKQorCXsKKwkJcmV0dXJuIHMgIT0gbnVsbCA/IHMuaGFzaENvZGUoKSA6IDkxOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyggT2JqZWN0IG9iaiApCisJeworCQlpZiAob2JqID09IHRoaXMpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChvYmouZ2V0Q2xhc3MoKSAhPSBVUkwuY2xhc3MpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlVUkwgb3RoZXIgPSAoVVJMKSBvYmo7CisJCQorCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxzSWdub3JlQ2FzZSggc2NoZW1lLCBvdGhlci5zY2hlbWUgKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmICghU3RyaW5nVXRpbC5lcXVhbHMoIHVzZXIsIG90aGVyLnVzZXIgKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmICghU3RyaW5nVXRpbC5lcXVhbHMoIHBhc3N3b3JkLCBvdGhlci5wYXNzd29yZCApKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKCFTdHJpbmdVdGlsLmVxdWFscyggaG9zdCwgb3RoZXIuaG9zdCApKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKCFlcSggcG9ydCwgb3RoZXIucG9ydCApKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKCFTdHJpbmdVdGlsLmVxdWFscyggdXJpLCBvdGhlci51cmkgKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmICghZXEoIHBhcmFtcywgb3RoZXIucGFyYW1zICkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlpZiAoIWVxKCB0ZXJtcywgb3RoZXIudGVybXMgKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmICghU3RyaW5nVXRpbC5lcXVhbHMoIGZyYWdtZW50LCBvdGhlci5mcmFnbWVudCApKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBlcSggT2JqZWN0IGEsIE9iamVjdCBiICkKKwl7CisJCXJldHVybiBhID09IGIgfHwgYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyggYiApOworCX0KKworCXByaXZhdGUgdm9pZCBwYXJhbXNUb1N0cmluZyggU3RyaW5nQnVmZmVyIHNiICkKKwl7CisJCWZvciAoU3RyaW5nIHA6IGdldFBhcmFtcygpKQorCQl7CisJCQlzYi5hcHBlbmQoICc7JyApOworCQkJZXNjYXBlKCBzYiwgcCApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlcm1zVG9TdHJpbmcoIFN0cmluZ0J1ZmZlciBzYiApCisJeworCQljaGFyIHNlcCA9ICc/JzsKKwkJZm9yIChTdHJpbmcgbjogZ2V0VGVybU5hbWVzKCkpCisJCXsKKwkJCWZvciAoU3RyaW5nIHY6IGdldFRlcm1zKCBuICkpCisJCQl7CisJCQkJc2IuYXBwZW5kKCBzZXAgKTsKKwkJCQllc2NhcGUoIHNiLCBuICk7CisJCQkJc2IuYXBwZW5kKCAnPScgKTsKKwkJCQllc2NhcGUoIHNiLCB2ICk7CisJCQkJc2VwID0gJyYnOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogRHVtcHMgdGhlIHVybCBjb250ZW50cyBmb3IgZWFzeSB2aWV3aW5nLgorCSAqLworCXB1YmxpYyB2b2lkIGR1bXAoKQorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiLS0tLS0tLS0tLS0tLS0tIiApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJzY2hlbWUgPSAiK3NjaGVtZSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ1c2VyID0gIit1c2VyICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggInBhc3N3b3JkID0gIitwYXNzd29yZCApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJob3N0ID0gIitob3N0ICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggInBvcnQgPSAiK3BvcnQgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAidXJpID0gIit1cmkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAicGFyYW1zID0gIitwYXJhbXMgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAidGVybXMgPSAiK3Rlcm1zICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImZyYWdtZW50ID0gIitmcmFnbWVudCApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZXNjYXBlKCBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBzICkKKwl7CisJCWlmIChzID09IG51bGwpCisJCXsKKwkJCXNiLmFwcGVuZCggIm51bGwiICk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUNoYXJJdGVyYXRvciBpID0gbmV3IENoYXJJdGVyYXRvciggcyApOworCQl3aGlsZSAoaS5oYXNOZXh0KCkpCisJCXsKKwkJCWNoYXIgYyA9IGkubmV4dCgpOworCQkJaWYgKGlzRXNjYXBlZCggYyApKQorCQkJeworCQkJCXNiLmFwcGVuZCggJyUnICk7CisJCQkJc2IuYXBwZW5kKCBTdHJpbmdVdGlsLnRvSGV4KCBjID4+PiA0ICYgMTUgKSApOworCQkJCXNiLmFwcGVuZCggU3RyaW5nVXRpbC50b0hleCggYyAmIDE1ICkgKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGMgPT0gJyAnKQorCQkJeworCQkJCXNiLmFwcGVuZCggJysnICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2IuYXBwZW5kKCBjICk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXNjYXBlZCggY2hhciBjICkKKwl7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgcmV0dXJuIGZhbHNlOworCQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHJldHVybiBmYWxzZTsKKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSByZXR1cm4gZmFsc2U7CisJCWlmIChjID09ICcgJykgcmV0dXJuIGZhbHNlOworCQlpZiAoYyA9PSAnLCcpIHJldHVybiBmYWxzZTsKKwkJaWYgKGMgPT0gJy4nKSByZXR1cm4gZmFsc2U7CisJCWlmIChjID09ICcvJykgcmV0dXJuIGZhbHNlOworCQlpZiAoYyA9PSAnIScpIHJldHVybiBmYWxzZTsKKwkJaWYgKGMgPT0gJyQnKSByZXR1cm4gZmFsc2U7CisJCWlmIChjID09ICdeJykgcmV0dXJuIGZhbHNlOworCQlpZiAoYyA9PSAnKicpIHJldHVybiBmYWxzZTsKKwkJaWYgKGMgPT0gJygnKSByZXR1cm4gZmFsc2U7CisJCWlmIChjID09ICcpJykgcmV0dXJuIGZhbHNlOworCQlpZiAoYyA9PSAnXycpIHJldHVybiBmYWxzZTsKKwkJaWYgKGMgPT0gJy0nKSByZXR1cm4gZmFsc2U7CisJCWlmIChjID09ICd7JykgcmV0dXJuIGZhbHNlOworCQlpZiAoYyA9PSAnfScpIHJldHVybiBmYWxzZTsKKwkJaWYgKGMgPT0gJ1snKSByZXR1cm4gZmFsc2U7CisJCWlmIChjID09ICddJykgcmV0dXJuIGZhbHNlOworCQlpZiAoYyA9PSAnfCcpIHJldHVybiBmYWxzZTsKKwkJaWYgKGMgPT0gJ1xcJykgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoIFN0cmluZyBzICkKKwl7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJQ2hhckl0ZXJhdG9yIGkgPSBuZXcgQ2hhckl0ZXJhdG9yKCBzICk7CisJCXdoaWxlIChpLmhhc05leHQoKSkKKwkJeworCQkJY2hhciBjID0gaS5uZXh0KCk7CisJCQlpZiAoYyA9PSAnJScpCisJCQl7CisJCQkJY2hhciBjMSA9IGkubmV4dCgpOworCQkJCWNoYXIgYzIgPSBpLm5leHQoKTsKKwkJCQlzYi5hcHBlbmQoIChjaGFyKSAoU3RyaW5nVXRpbC5mcm9tSGV4KCBjMSApIDw8IDQgfCBTdHJpbmdVdGlsLmZyb21IZXgoIGMyICkpICk7CisJCQl9CisJCQllbHNlIGlmIChjID09ICcrJykKKwkJCXsKKwkJCQlzYi5hcHBlbmQoICcgJyApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXNiLmFwcGVuZCggYyApOworCQkJfQorCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTmFtZSggU3RyaW5nIG5hbWUgKQorCXsKKwkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibmFtZSBudWxsIG9yIGVtcHR5IiApOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyggT2JqZWN0IHZhbHVlICkKKwl7CisJCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IG51bGw7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tOb3ROdWxsKCBPYmplY3QgdiwgU3RyaW5nIG1zZyApCisJeworCQlpZiAodiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCBtc2cgKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTm90QmxhbmsoIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPT0gMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG5hbWUrIiBpcyBibGFuayIgKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTm90SW50ZWdlciggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApCisJeworCQljaGVja05vdEJsYW5rKCBuYW1lLCB2YWx1ZSApOworCQl0cnkKKwkJeworCQkJSW50ZWdlci5wYXJzZUludCggdmFsdWUgKTsKKwkJfQorCQljYXRjaCAoIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlICkKKwkJeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggbmFtZSsiIGlzIG5vdCBpbnRlZ2VyIiApOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGNvcHlMaXN0KCBMaXN0PFN0cmluZz4gcGFyYW1zICkKKwl7CisJCS8vIGp1c3QgZ29lcyBvbmUgbGV2ZWwgZGVlcC4KKwkJCisJCWlmIChwYXJhbXMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPiggcGFyYW1zICk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29weVRlcm1zKCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRlcm1zICkKKwl7CisJCWlmICh0ZXJtcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG50ZXJtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gbWU6IHRlcm1zLmVudHJ5U2V0KCkpCisJCXsKKwkJCVN0cmluZyBuYW1lID0gbWUuZ2V0S2V5KCk7CisJCQlPYmplY3QgdmFsdWUgPSBtZS5nZXRWYWx1ZSgpOworCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkKKwkJCQl2YWx1ZSA9IGNvcHlMaXN0KCAoTGlzdDxTdHJpbmc+KSB2YWx1ZSApOworCQkJbnRlcm1zLnB1dCggbmFtZSwgdmFsdWUgKTsKKwkJfQorCQlyZXR1cm4gbnRlcm1zOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvQW5kQ29uc3RyYWludC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9BbmRDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwMDYwMQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvQW5kQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgQW5kQ29uc3RyYWludC4KKyAqLworcHVibGljIGNsYXNzIEFuZENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50Cit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQW5kQ29uc3RyYWludC4KKwkgKiBAcGFyYW0gYQorCSAqIEBwYXJhbSBiCisJICovCisJcHVibGljIEFuZENvbnN0cmFpbnQoIENvbnN0cmFpbnQgYSwgQ29uc3RyYWludCBiICkKKwl7CisJCXRoaXMuYSA9IGE7CisJCXRoaXMuYiA9IGI7CisJfQorCQorCXByaXZhdGUgZmluYWwgQ29uc3RyYWludCBhOworCQorCXByaXZhdGUgZmluYWwgQ29uc3RyYWludCBiOworCQorCXB1YmxpYyB2b2lkIGNoZWNrVmFsdWUoIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWEuY2hlY2tWYWx1ZSggdmFsdWUgKTsKKwkJYi5jaGVja1ZhbHVlKCB2YWx1ZSApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiAiKCIrYSsiKSBBTkQgKCIrYisiKSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Cb29sZWFuQ29udmVydGVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0Jvb2xlYW5Db252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGY3NDEyCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Cb29sZWFuQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSGFuZGxlIHRyYW5zbGF0aW9uIG9mIHZhcmlvdXMgdHlwZXMgb2YgYm9vbGVhbiB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBCb29sZWFuQ29udmVydGVyCit7CisJLyoqCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybiByZXN1bHQgb2YgdHJhbnNsYXRpb24gb2YgYm9vbGVhbiB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJvb2xlYW4gdmFsdWVPZiggU3RyaW5nIHZhbHVlICkKKwl7CisJCUJvb2xlYW4gdiA9IHZhbHVlcy5nZXQoIHZhbHVlLnRvTG93ZXJDYXNlKCkgKTsKKwkJaWYgKHYgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJiYWQgYm9vbGVhbiB2YWx1ZTogIit2YWx1ZSApOworCQlyZXR1cm4gdjsKKwl9CisJCisJLyoqCisJICogRGVmaW5lcyBzdGF0aWMga2V5IHBhaXJzIHRvIHVzZSBmb3IgdHJ1ZS9mYWxzZSBpdGVtIGNvbnZlcnNpb25zLgorCSAqIEBwYXJhbSB0cnVlS2V5CisJICogQHBhcmFtIGZhbHNlS2V5CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZSggU3RyaW5nIHRydWVLZXksIFN0cmluZyBmYWxzZUtleSApCisJeworCQlpZiAodHJ1ZUtleSAhPSBudWxsKQorCQkJdmFsdWVzLnB1dCggdHJ1ZUtleS50b0xvd2VyQ2FzZSgpLCBCb29sZWFuLlRSVUUgKTsKKwkJCisJCWlmIChmYWxzZUtleSAhPSBudWxsKQorCQkJdmFsdWVzLnB1dCggZmFsc2VLZXkudG9Mb3dlckNhc2UoKSwgQm9vbGVhbi5GQUxTRSApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXA8U3RyaW5nLEJvb2xlYW4+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxCb29sZWFuPigpOworCXN0YXRpYworCXsKKwkJZGVmaW5lKCAidHJ1ZSIsICJmYWxzZSIgKTsKKwkJZGVmaW5lKCAieWVzIiwgIm5vIiApOworCQlkZWZpbmUoICIxIiwgIjAiICk7CisJCWRlZmluZSggImVuYWJsZSIsICJkaXNhYmxlIiApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvQm9vbGVhbk9wdGlvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Cb29sZWFuT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlMzhmNQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvQm9vbGVhbk9wdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKKy8qKgorICogQW4gb3B0aW9uIHdob3NlIHZhbHVlIGlzIGEgYm9vbGVhbi4KKyAqLworcHVibGljIGNsYXNzIEJvb2xlYW5PcHRpb24gZXh0ZW5kcyBPcHRpb24KK3sKKwkvKioKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gdG9rZW5zCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGZsYWdzCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbk9wdGlvbiggQ29tbWFuZFBhcnNlciBjcCwgU3RyaW5nIHRva2VucywgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsCisJCVN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGZsYWdzLCBCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29uc3RyYWludCBjb25zdHJhaW50ICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNwLCB0b2tlbnMsIG5hbWUsIG1ldGhvZCwgUEFSQU1TLCBkZXNjcmlwdGlvbiwgZmxhZ3MsIGRlZmF1bHRWYWx1ZSwgY29uc3RyYWludCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFBBUkFNUyA9CisJCXsgQ29tbWFuZFBhcnNlci5jbGFzcywgT3B0aW9uLmNsYXNzLCBTdHJpbmcuY2xhc3MsIEJvb2xlYW4uY2xhc3MgfTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJcmV0dXJuIEJvb2xlYW5Db252ZXJ0ZXIudmFsdWVPZiggdmFsdWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0Jvb2xlYW5QYXJhbWV0ZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvQm9vbGVhblBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmN2Y0OGYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0Jvb2xlYW5QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIEEgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGlzIGEgYm9vbGVhbi4KKyAqLworcHVibGljIGNsYXNzIEJvb2xlYW5QYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIKK3sKKwkvKioKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gaXNSZXF1aXJlZAorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgQm9vbGVhblBhcmFtZXRlciggQ29tbWFuZFBhcnNlciBjcCwgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsCisJCVN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBpc1JlcXVpcmVkLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdXBlciggY3AsIG5hbWUsIG1ldGhvZCwgUEFSQU1TLCBkZXNjcmlwdGlvbiwgaXNSZXF1aXJlZCwgY29uc3RyYWludCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFBBUkFNUyA9CisJCXsgQ29tbWFuZFBhcnNlci5jbGFzcywgUGFyYW1ldGVyLmNsYXNzLCBCb29sZWFuLmNsYXNzIH07CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRWYWx1ZSggU3RyaW5nIHZhbHVlICkKKwl7CisJCXJldHVybiBCb29sZWFuQ29udmVydGVyLnZhbHVlT2YoIHZhbHVlICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Db21tYW5kUGFyc2VyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0NvbW1hbmRQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWEyZWUxCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Db21tYW5kUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMTA1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkNoYXJJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5TdHJpbmdVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKKworCisvKioKKyAqIENvbW1hbmRQYXJzZXIgaW1wbGVtZW50cyBzdGFuZGFyZCBwYXJzaW5nIG9mIGNvbW1hbmQgbGluZXMuCisgKiBDb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgcGFyYW1ldGVycyBhcmUgZGVzY3JpYmVkIGFuZCB0aGVuCisgKiBoYW5kbGluZyBvZiBwcmludGluZyB1c2FnZSBhbmQgaGVscCBtZXNzYWdlcyBpcyBhdXRvbWF0aWMsCisgKiBhcyBpcyBkaXN0cmlidXRpb24gb2YgZGVmYXVsdCBvcHRpb24gdmFsdWVzIHdoZW4gbm9uZSBpcworICogc3BlY2lmaWVkIGJlZm9yZSB0aGUgZmlyc3QgcGFyYW1ldGVyLiBEYXRhIHR5cGUgY29udmVyc2lvbnMKKyAqIGFuZCB2YWx1ZSBjb25zdHJhaW50IGNoZWNraW5nIGlzIGFsc28gc3VwcG9ydGVkLgorICovCitwdWJsaWMgY2xhc3MgQ29tbWFuZFBhcnNlcgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBDb21tYW5kUGFyc2VyIGZvciB0aGUgc3BlY2lmaWVkIHByb2dyYW0uCisJICogQHBhcmFtIHByb2dyYW0KKwkgKi8KKwlwdWJsaWMgQ29tbWFuZFBhcnNlciggUHJvZ3JhbSBwcm9ncmFtICkKKwl7CisJCXRoaXMucHJvZ3JhbSA9IHByb2dyYW07CisJfQorCQorCS8qKgorCSAqIERlc2NyaXB0aW9uIG9mIHByb2cKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgUHJvZ3JhbSBwcm9ncmFtOworCQorCS8qKgorCSAqIERlZmluZXMgYW4gb3B0aW9uLiBDaGVja3Mgb3B0aW9uIGZsYWdzIGFuZCBkZWZhdWx0IHZhbHVlLgorCSAqIEBwYXJhbSBvcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmUoIE9wdGlvbiBvcHRpb24gKQorCXsKKwkJLy8gaGlkZGVuIG9wdGlvbnMgYXJlIGp1c3QgdGhhdCwgaGlkZGVuLCB0aGV5IGFyZW4ndCByZXF1aXJlZC4gaGlkZGVuIG1lYW5zCisJCS8vIGhlbHAgZG9lc24ndCBzaG93IHRoZW0uIHRoZXkgY2FuIHN0aWxsIGJlIHNwZWNpZmllZC4KKy8vCQlpZiAob3B0aW9uLmlzSGlkZGVuKCkgJiYgb3B0aW9uLmdldERlZmF1bHRWYWx1ZXMoKSA9PSBudWxsKQorLy8JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaGlkZGVuIG9wdGlvbiAnIitvcHRpb24rIicgaGFzIG5vIGRlZmF1bHQgdmFsdWUiICk7CisKKwkJLy8gYWRkaW5nIGhpZGRlbiB0byBhbiBvcHRpb24ganVzdCBtZWFucyBpdCBpc24ndCBzaG93biBpbiB0aGUgaGVscC4gaXQKKwkJLy8geW91IHNob3VsZG4ndCBoYXZlIHRvIG90aGVyd2lzZSBlZGl0IGl0LiBydWRlIGl0IGlzLCBob3dldmVyLCB0byBoaWRlCisJCS8vIGEgcmVxdWlyZWQgb3B0aW9uIHdpdGggbm8gZGVmYXVsdCB2YWx1ZS4KKy8vCQlpZiAob3B0aW9uLmlzSGlkZGVuKCkgJiYgb3B0aW9uLmlzU2luZ2xldG9uKCkpCisvLwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJoaWRkZW4gb3B0aW9uICciK29wdGlvbisiJyByZWR1bmRhbnRseSBtYXJrZWQgc2luZ2xldG9uIiApOworCQkKKwkJaWYgKG9wdGlvbi5pc1JlcXVpcmVkKCkgJiYgb3B0aW9uLmdldERlZmF1bHRWYWx1ZXMoKSAhPSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm9wdGlvbiAnIitvcHRpb24rIicgd2l0aCBkZWZhdWx0IHZhbHVlIHJlZHVuZGFudGx5IG1hcmtlZCByZXF1aXJlZCIgKTsKKwkJCisJCS8vIHdlIHN0aWxsIHdhbnQgdG8gcHJvY2VzcyBoaWRkZW4gb3B0aW9ucywganVzdCBub3Qgc2hvdyB0aGVtLgorCQlpZiAodHJ1ZSAvKiAhb3B0aW9uLmlzSGlkZGVuKCkgKi8pCisJCXsKKwkJCUl0ZXJhdG9yPFN0cmluZz4gaSA9IG9wdGlvbi5nZXRUb2tlbnMoKTsKKwkJCXdoaWxlIChpLmhhc05leHQoKSkKKwkJCXsKKwkJCQlTdHJpbmcgdG9rZW4gPSBpLm5leHQoKTsKKwkJCQkKKwkJCQlpZiAodG9rZW4uc3RhcnRzV2l0aCggIi0tIiApKQorCQkJCXsKKwkJCQkJLy8gbG9uZyBvcHRpb24gKGUuZy4sIC0tbmFtZSkKKworCQkJCQlTdHJpbmcgbmFtZSA9IHRva2VuLnN1YnN0cmluZyggMiApOworCisJCQkJCS8vIHJ1bGUgb3V0IGVtcHR5IG5hbWUKKwkJCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJsb25nIG9wdGlvbiB0b2tlbiAnIit0b2tlbisiJyBoYXMgbm8gY2hhcnMgYWZ0ZXIgdGhlIGRhc2hlcyIgKTsKKwkJCQkJCisJCQkJCS8vIHJ1bGUgb3V0IHRocmVlIG9yIG1vcmUgZGFzaGVzCisJCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoICItIiApKQorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImxvbmcgb3B0aW9uIHRva2VuICciK3Rva2VuKyInIHN0YXJ0cyB3aXRoIHRocmVlIG9yIG1vcmUgZGFzaGVzIiApOworCQkJCQkKKwkJCQkJY2hlY2tWYWxpZENoYXJzKCBuYW1lLCAibG9uZyBvcHRpb24iLCB0b2tlbiwgbG9uZ1Rva2VuQ2hhcnMgKTsKKwkJCQkJZGVmaW5lT3B0aW9uKCBvcHRpb25zLCBuYW1lLCBvcHRpb24gKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCQorCQkJCWlmICghdG9rZW4uc3RhcnRzV2l0aCggIi0iICkpCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJvcHRpb24gdG9rZW4gJyIrdG9rZW4rIicgZG9lcyBub3Qgc3RhcnQgd2l0aCBkYXNoIiApOworCQkJCQorCQkJCS8vIHNob3J0IG9wdGlvbiAoZS5nLiwgLWMpCisJCQkJCisJCQkJU3RyaW5nIGMgPSB0b2tlbi5zdWJzdHJpbmcoIDEgKTsKKworCQkJCS8vIHJ1bGUgb3V0IGFueSBidXQgc2luZ2xlIGNoYXIKKwkJCQlpZiAoYy5sZW5ndGgoKSAhPSAxKQorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAic2hvcnQgb3B0aW9uIHRva2VuICciK3Rva2VuKyInIG11c3QgaGF2ZSBvbmx5IG9uZSBjaGFyIGFmdGVyIHRoZSBkYXNoIiApOworCisJCQkJY2hlY2tWYWxpZENoYXJzKCBjLCAic2hvcnQgb3B0aW9uIiwgdG9rZW4sIHNob3J0VG9rZW5DaGFycyApOworCQkJCWRlZmluZU9wdGlvbiggc2hvcnRPcHRpb25zLCBjLCBvcHRpb24gKTsKKwkJCX0KKwkJfQorCQkKKwkJb3B0aW9uTGlzdC5hZGQoIG9wdGlvbiApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tWYWxpZENoYXJzKCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyLCBTdHJpbmcgdG9rZW4sIFBhdHRlcm4gcGF0dGVybiApCisJeworCQlpZiAoIXBhdHRlcm4ubWF0Y2hlciggbmFtZSApLm1hdGNoZXMoKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIGRlc2NyKyIgdG9rZW4gJyIrdG9rZW4rIicgaGFzIGJhZCBjaGFycyIgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIGxvbmdUb2tlbkNoYXJzID0gUGF0dGVybi5jb21waWxlKCAiXlthLXowLTldKygtW2EtejAtOV0rKSokIiApOworCQorCXByaXZhdGUgZmluYWwgUGF0dGVybiBzaG9ydFRva2VuQ2hhcnMgPSBQYXR0ZXJuLmNvbXBpbGUoICJeW2EtekEtWjAtOV0kIiApOworCQorCXByaXZhdGUgdm9pZCBkZWZpbmVPcHRpb24oIE1hcDxTdHJpbmcsIE9wdGlvbj4gbWFwLCBTdHJpbmcgdG9rZW4sIE9wdGlvbiBvcHRpb24gKQorCXsKKwkJT3B0aW9uIG90aGVyID0gbWFwLnB1dCggdG9rZW4sIG9wdGlvbiApOworCQlpZiAob3RoZXIgIT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJIm9wdGlvbnMgJyIrb3B0aW9uKyInIGFuZCAnIitvdGhlcisiJyBoYXZlIG92ZXJsYXBwaW5nIHRva2VuIHNldHMiICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhcmFtZXRlcgorCSAqIEBwYXJhbSBpc0NhdGNoQWxsCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lKCBQYXJhbWV0ZXIgcGFyYW1ldGVyLCBib29sZWFuIGlzQ2F0Y2hBbGwgKQorCXsKKwkJaWYgKHBhcmFtZXRlci5pc1JlcXVpcmVkKCkgJiYgIWxhc3RJc1JlcXVpcmVkKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkicmVxdWlyZWQgcGFyYW1ldGVyICciK3BhcmFtZXRlcisiJyBjYW5ub3QgZm9sbG93IG9wdGlvbmFsIG9uZSIgKTsKKwkJCisJCWxhc3RJc1JlcXVpcmVkICA9IHBhcmFtZXRlci5pc1JlcXVpcmVkKCk7CisJCQorCQlpZiAoaXNDYXRjaEFsbCkKKwkJeworCQkJZGVmaW5lQ2F0Y2hBbGwoIHBhcmFtZXRlciApOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoY2F0Y2hBbGxQYXJhbWV0ZXIgIT0gbnVsbCkKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKwkJCQkiY2Fubm90IGRlZmluZSBwYXJhbWV0ZXIgJyIrcGFyYW1ldGVyKyInOiBjYXRjaCBhbGwgcGFyYW1ldGVyIGFscmVhZHkgZGVmaW5lZCIgKTsKKwkJCisJCXBhcmFtZXRlcnMuYWRkKCBwYXJhbWV0ZXIgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHBhcmFtZXRlcgorCSAqLworCXByaXZhdGUgdm9pZCBkZWZpbmVDYXRjaEFsbCggUGFyYW1ldGVyIHBhcmFtZXRlciApCisJeworCQlpZiAocGFyYW1ldGVyICE9IG51bGwgJiYgY2F0Y2hBbGxQYXJhbWV0ZXIgIT0gbnVsbCkKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKwkJCQkiY2Fubm90IGRlZmluZSBjYXRjaCBhbGwgcGFyYW1ldGVyICciK3BhcmFtZXRlcisiJzogY2F0Y2ggYWxsIHBhcmFtZXRlciBhbHJlYWR5IGRlZmluZWQiICk7CisJCQorCQljYXRjaEFsbFBhcmFtZXRlciA9IHBhcmFtZXRlcjsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFyZ3MKKwkgKiBAcmV0dXJuIHRydWUgaWYgcGFyc2luZyB3YXMgc3VjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwYXJzZSggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUl0ZXJhdG9yPFBhcmFtZXRlcj4gcGFyYW1ldGVyc0l0ZXJhdG9yID0gZ2V0UGFyYW1ldGVycygpOworCQkKKwkJYXJnc0l0ZXJhdG9yID0gbmV3IFN0cmluZ0FycmF5SXRlcmF0b3IoIGFyZ3MgKTsKKwkJd2hpbGUgKGFyZ3NJdGVyYXRvci5oYXNOZXh0KCkpCisJCXsKKwkJCVN0cmluZyB0b2tlbiA9IGFyZ3NJdGVyYXRvci5uZXh0KCk7CisJCQkKKwkJCWlmICh0b2tlbi5zdGFydHNXaXRoKCAiLSIgKSkKKwkJCXsKKwkJCQkvLyBtaWdodCBiZSBhIGxvbmcgb3B0aW9uIChlLmcuLCAtLW5hbWUpLCBhIHNob3J0IG9wdGlvbgorCQkJCS8vIChlLmcuLCAtYykgb3IgYSBwYXJhbWV0ZXIgKC0pLgorCQkJCWlmICh0b2tlbi5zdGFydHNXaXRoKCAiLS0iICkpCisJCQkJeworCQkJCQkvLyBoYW5kbGUgbG9uZyBvcHRpb24gKGUuZy4sIC0tbmFtZSkKKwkJCQkJCisJCQkJCVN0cmluZ1tdIHggPSBTdHJpbmdVdGlsLmxlZnRTcGxpdCggdG9rZW4sICc9JyApOworCQkJCQlTdHJpbmcgdG9rID0gbnVsbDsKKwkJCQkJU3RyaW5nIHZhbCA9IG51bGw7CisJCQkJCWlmICh4ICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXRvayA9IHhbMF07CisJCQkJCQl2YWwgPSB4WzFdOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdG9rID0gdG9rZW47CisJCQkJCQl2YWwgPSBudWxsOworCQkJCQl9CisJCQkJCQorCQkJCQlPcHRpb24gb3B0aW9uID0gZmluZE9wdGlvbiggdG9rLnN1YnN0cmluZyggMiApICk7CisJCQkJCWlmIChvcHRpb24gPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJcmVwb3J0KCAidW5leHBlY3RlZCBjb21tYW5kIGxpbmUgb3B0aW9uIiwgdG9rZW4sIGFyZ3NJdGVyYXRvciApOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCQorCQkJCQlPYmplY3RbXSB2YWx1ZXMgPSBudWxsOworCQkJCQkKKwkJCQkJaWYgKG9wdGlvbi53YW50c1ZhbHVlKCkpCisJCQkJCXsKKwkJCQkJCXZhbHVlcyA9IG9wdGlvbi5nZXRBbmRDb252ZXJ0VmFsdWUoIHRvaywgdmFsLCBhcmdzSXRlcmF0b3IgKTsKKwkJCQkJCWlmICh2YWx1ZXMgPT0gbnVsbCkKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkKKwkJCQkJCWlmICghb3B0aW9uLmNoZWNrVmFsdWUoIHRvaywgdmFsdWVzICkpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYgKHZhbCAhPSBudWxsKQorCQkJCQkJCXJlcG9ydCggInVuZXhwZWN0ZWQgb3B0aW9uIHZhbHVlIiwgdG9rLCBhcmdzSXRlcmF0b3IgKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKCFvcHRpb24uZGVsaXZlclZhbHVlKCB0b2ssIHZhbHVlcywgZmFsc2UgKSkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICh0b2tlbi5sZW5ndGgoKSA+IDEpCisJCQkJeworCQkJCQkvLyBoYW5kbGUgc2hvcnQgb3B0aW9uIChlLmcuLCAtYykKKwkJCQkJCisJCQkJCUNoYXJJdGVyYXRvciBpID0gbmV3IENoYXJJdGVyYXRvciggdG9rZW4uc3Vic3RyaW5nKCAxICkgKTsKKwkJCQkJd2hpbGUgKGkuaGFzTmV4dCgpKQorCQkJCQl7CisJCQkJCQlTdHJpbmcgdG9rID0gU3RyaW5nLnZhbHVlT2YoIGkubmV4dCgpICk7CisJCQkJCQkKKwkJCQkJCU9wdGlvbiBvcHRpb24gPSBmaW5kU2hvcnRPcHRpb24oIHRvayApOworCQkJCQkJaWYgKG9wdGlvbiA9PSBudWxsKQorCQkJCQkJeworCQkJCQkJCXJlcG9ydCggU3RyaW5nLmZvcm1hdCgKKwkJCQkJCQkJInVuZXhwZWN0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAoLSVzKSIsIHRvayApLAorCQkJCQkJCQl0b2tlbiwgYXJnc0l0ZXJhdG9yICk7CisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlPYmplY3RbXSB2YWx1ZXMgPSBudWxsOworCQkJCQkJCisJCQkJCQlpZiAob3B0aW9uLndhbnRzVmFsdWUoKSkKKwkJCQkJCXsKKwkJCQkJCQlTdHJpbmcgdmFsID0gcmVzdCggaSApOworCQkJCQkJCQorCQkJCQkJCXZhbHVlcyA9IG9wdGlvbi5nZXRBbmRDb252ZXJ0VmFsdWUoIHRvaywgdmFsLCBhcmdzSXRlcmF0b3IgKTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAodmFsdWVzID09IG51bGwpCisJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAoIW9wdGlvbi5jaGVja1ZhbHVlKCB0b2ssIHZhbHVlcyApKQorCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmICghb3B0aW9uLmRlbGl2ZXJWYWx1ZSggdG9rLCB2YWx1ZXMsIGZhbHNlICkpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvLyB0b2tlbiBpcyAtLCB3aGljaCBpcyBhIHBhcmFtZXRlciwgc28ganVzdCBmYWxsIHRocm91Z2guLi4KKwkJCX0KKwkJCQorCQkJLy8gb2ssIHdlJ3JlIGRlbGl2ZXJpbmcgYSBub24tb3B0aW9uIHZhbHVlLgorCQkJaWYgKCFmaW5hbGl6ZU9wdGlvbnMoICIgYmVmb3JlIHRoZSBmaXJzdCBwYXJhbWV0ZXIiICkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlpZiAocGFyYW1ldGVyc0l0ZXJhdG9yLmhhc05leHQoKSB8fCBjYXRjaEFsbFBhcmFtZXRlciAhPSBudWxsKQorCQkJeworCQkJCVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpID8KKwkJCQkJKFBhcmFtZXRlcikgcGFyYW1ldGVyc0l0ZXJhdG9yLm5leHQoKSA6IGNhdGNoQWxsUGFyYW1ldGVyOworCQkJCQorCQkJCU9iamVjdCB2YWx1ZSA9IHBhcmFtZXRlci5jb252ZXJ0VmFsdWUoIHRva2VuICk7CisJCQkJaWYgKHZhbHVlID09IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkKKwkJCQlpZiAoIXBhcmFtZXRlci5jaGVja1ZhbHVlKCB2YWx1ZSApKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCisJCQkJaWYgKCFwYXJhbWV0ZXIuZGVsaXZlclZhbHVlKCB2YWx1ZSApKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCisJCQkJaWYgKHBhcmFtZXRlciA9PSBjYXRjaEFsbFBhcmFtZXRlcikKKwkJCQkJaGFzRGVsaXZlcmVkVG9DYXRjaEFsbCA9IHRydWU7CisJCQkJCisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCXJlcG9ydCggInVuZXhwZWN0ZWQgY29tbWFuZCBsaW5lIHRva2VuIiwgdG9rZW4sIGFyZ3NJdGVyYXRvciApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQkvLyBvaywgd2UncmUgYWJvdXQgdG8gY2FsbCBydW4sIGZpbmFsaXplIG9wdGlvbnMKKwkJCisJCWlmICghZmluYWxpemVPcHRpb25zKCAiIG9uIHRoZSBjb21tYW5kIGxpbmUiICkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQkvLyBjaGVjayBmb3IgdW5zcGVjaWZpZWQgYnV0IHJlcXVpcmVkIHBhcmFtZXRlcnMuCisJCQorCQlpZiAocGFyYW1ldGVyc0l0ZXJhdG9yLmhhc05leHQoKSkKKwkJeworCQkJUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNJdGVyYXRvci5uZXh0KCk7CisJCQlpZiAocGFyYW1ldGVyLmlzUmVxdWlyZWQoKSkKKwkJCXsKKwkJCQlyZXBvcnQoICJyZXF1aXJlZCBwYXJhbWV0ZXIgJyIrcGFyYW1ldGVyKyInIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQiLCBudWxsLCBudWxsICk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCQorCQlpZiAoY2F0Y2hBbGxQYXJhbWV0ZXIgIT0gbnVsbCAmJiBjYXRjaEFsbFBhcmFtZXRlci5pc1JlcXVpcmVkKCkgJiYgIWhhc0RlbGl2ZXJlZFRvQ2F0Y2hBbGwpCisJCXsKKwkJCXJlcG9ydCggInJlcXVpcmVkIHBhcmFtZXRlciAnIitjYXRjaEFsbFBhcmFtZXRlcisiJyBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIiwgbnVsbCwgbnVsbCApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgcmVzdCggQ2hhckl0ZXJhdG9yIGkgKQorCXsKKwkJaWYgKCFpLmhhc05leHQoKSkKKwkJCXJldHVybiBudWxsOworCQkKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl3aGlsZSAoaS5oYXNOZXh0KCkpCisJCQlzYi5hcHBlbmQoIGkubmV4dCgpICk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVyIHRva2VuLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc05leHRUb2tlbigpCisJeworCQlyZXR1cm4gYXJnc0l0ZXJhdG9yLmhhc05leHQoKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbmV4dCB0b2tlbi4KKwkgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzbid0IG9uZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG5leHRUb2tlbigpCisJeworCQlyZXR1cm4gYXJnc0l0ZXJhdG9yLm5leHQoKTsKKwl9CisJCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGFyZ3NJdGVyYXRvcjsKKwkKKwlwcml2YXRlIGJvb2xlYW4gaGFzRGVsaXZlcmVkVG9DYXRjaEFsbCA9IGZhbHNlOworCisvLwkvKioKKy8vCSAqIERlbGl2ZXJzIGFuIG9wdGlvbiB2YWx1ZSBmcm9tIGFub3RoZXIgc291cmNlLgorLy8JICogQHBhcmFtIHRva2VuCisvLwkgKiBAcGFyYW0gc3RyVmFsdWUKKy8vCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIGRlbGl2ZXJlZCB0byB0aGUgb3B0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisvLwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorLy8JICovCisvLwlwdWJsaWMgYm9vbGVhbiBkZWxpdmVyVmFsdWUoIFN0cmluZyB0b2tlbiwgU3RyaW5nIHN0clZhbHVlICkKKy8vCQl0aHJvd3MgRXhjZXB0aW9uCisvLwl7CisvLwkJT3B0aW9uIG9wdGlvbiA9IGZpbmRPcHRpb24oIHRva2VuICk7CisvLwkJaWYgKG9wdGlvbiA9PSBudWxsKQorLy8JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAibm8gc3VjaCBvcHRpb24gJyIrdG9rZW4rIiciICk7CisvLworLy8JCWlmICghb3B0aW9uLndhbnRzVmFsdWUoKSkKKy8vCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbiggIm9wdGlvbiAnIit0b2tlbisiJyBkb2VzIG5vdCBhY2NlcHQgYSB2YWx1ZSIgKTsKKy8vCisvLwkJT2JqZWN0IHZhbHVlID0gb3B0aW9uLmNvbnZlcnRWYWx1ZSggc3RyVmFsdWUgKTsKKy8vCQlpZiAodmFsdWUgPT0gbnVsbCkKKy8vCQkJcmV0dXJuIGZhbHNlOworLy8KKy8vCQlpZiAoIW9wdGlvbi5jaGVja1ZhbHVlKCB0b2tlbiwgdmFsdWUgKSkKKy8vCQkJcmV0dXJuIGZhbHNlOworLy8KKy8vCQlyZXR1cm4gb3B0aW9uLmRlbGl2ZXJWYWx1ZSggdG9rZW4sIHZhbHVlLCBmYWxzZSApOworLy8JfQorCQorCS8qKgorCSAqIEZpbmFsaXplcyB0aGUgb3B0aW9ucyBiZWZvcmUgc29tZSBpbXBvcnRhbnQgZXZlbnQgKGRlc2NyaWJlZCBieSB3aGVuKS4KKwkgKiAKKwkgKiBAcGFyYW0gd2hlbgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3B0aW9ucyBhcmUgb2ssIGZhbHNlIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSwgc3VjaAorCSAqIGFzIGEgcmVxdWlyZWQgb3B0aW9uIHdpdGhvdXQgYSB2YWx1ZSwgZXRjLgorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gZmluYWxpemVPcHRpb25zKCBTdHJpbmcgd2hlbiApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChoYXNGaW5hbGl6ZWRPcHRpb25zKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQloYXNGaW5hbGl6ZWRPcHRpb25zID0gdHJ1ZTsKKwkJCisJCUl0ZXJhdG9yPE9wdGlvbj4gaSA9IGdldE9wdGlvbkxpc3QoKTsKKwkJd2hpbGUgKGkuaGFzTmV4dCgpKQorCQl7CisJCQlPcHRpb24gb3B0aW9uID0gaS5uZXh0KCk7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbiggImNoZWNraW5nIG9wdGlvbiAiK29wdGlvbiApOworCQkJaWYgKCFpc0FscmVhZHlTcGVjaWZpZWQoIG9wdGlvbiwgZmFsc2UgKSkKKwkJCXsKKwkJCQlpZiAob3B0aW9uLmdldERlZmF1bHRWYWx1ZXMoKSAhPSBudWxsKQorCQkJCXsKKwkJCQkJaWYgKCFvcHRpb24uZGVsaXZlclZhbHVlKCBvcHRpb24uZ2V0UHJpbWFyeVRva2VuKCksCisJCQkJCQkJb3B0aW9uLmdldERlZmF1bHRWYWx1ZXMoKSwgdHJ1ZSApKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQllbHNlIGlmIChvcHRpb24uaXNSZXF1aXJlZCgpKQorCQkJCXsKKwkJCQkJLy8gb2ssIGl0IGlzbid0IGFscmVhZHkgc3BlY2lmaWVkLCBpdCBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0CisJCQkJCS8vIHZhbHVlLCBhbmQgaXQgaXMgcmVxdWlyZWQuIHdlIGJsb3cgYmVldHMuCisJCQkJCXJlcG9ydCggIm9wdGlvbiAnIitvcHRpb24rIicgbXVzdCBiZSBzcGVjaWZpZWQiK3doZW4sIG51bGwsIG51bGwgKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBoYXNGaW5hbGl6ZWRPcHRpb25zID0gZmFsc2U7CisKKwkvKioKKwkgKiBAcGFyYW0gdG9rZW4KKwkgKiBAcmV0dXJuIHRoZSBvcHRpb24gbWF0Y2hpbmcgdG9rZW4gb3IgbnVsbC4KKwkgKi8KKwlwcml2YXRlIE9wdGlvbiBmaW5kT3B0aW9uKCBTdHJpbmcgdG9rZW4gKQorCXsKKwkJT3B0aW9uIG8gPSBnZXRPcHRpb24oIHRva2VuICk7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJmaW5kT3B0aW9uKCAlcyApIGZvdW5kICVzXG4iLCB0b2tlbiwgbyApOworCQlyZXR1cm4gbzsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdG9rZW4KKwkgKiBAcmV0dXJuIHRoZSBvcHRpb24gbWF0Y2hpbmcgdG9rZW4gb3IgbnVsbC4KKwkgKi8KKwlwcml2YXRlIE9wdGlvbiBmaW5kU2hvcnRPcHRpb24oIFN0cmluZyB0b2tlbiApCisJeworCQlPcHRpb24gbyA9IGdldFNob3J0T3B0aW9uKCB0b2tlbiApOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAiZmluZFNob3J0T3B0aW9uKCAlcyApIGZvdW5kICVzXG4iLCB0b2tlbiwgbyApOworCQlyZXR1cm4gbzsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG1zZworCSAqIEBwYXJhbSB0b2tlbgorCSAqIEBwYXJhbSBpCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0KCBTdHJpbmcgbXNnLCBTdHJpbmcgdG9rZW4sIEl0ZXJhdG9yPFN0cmluZz4gaSApCisJeworCQlTeXN0ZW0uZXJyLnByaW50KCBwcm9ncmFtICk7CisJCVN5c3RlbS5lcnIucHJpbnQoICI6ICIgKTsKKwkJU3lzdGVtLmVyci5wcmludCggbXNnICk7CisJCQorCQlpZiAodG9rZW4gIT0gbnVsbCkKKwkJeworCQkJU3lzdGVtLmVyci5wcmludCggIjogIiApOworCQkJU3lzdGVtLmVyci5wcmludCggdG9rZW4gKTsKKwkJCXdoaWxlIChpICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpCisJCQl7CisJCQkJU3lzdGVtLmVyci5wcmludCggJyAnICk7CisJCQkJU3lzdGVtLmVyci5wcmludCggaS5uZXh0KCkgKTsKKwkJCX0KKwkJfQorCQkKKwkJU3lzdGVtLmVyci5wcmludGxuKCk7CisJCVN5c3RlbS5lcnIuZmx1c2goKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLE9wdGlvbj4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3B0aW9uPigpOworCQorCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxPcHRpb24+IHNob3J0T3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3B0aW9uPigpOworCQorCXByaXZhdGUgZmluYWwgTGlzdDxPcHRpb24+IG9wdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9wdGlvbj4oKTsKKwkKKwlwcml2YXRlIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7CisJCisJcHJpdmF0ZSBQYXJhbWV0ZXIgY2F0Y2hBbGxQYXJhbWV0ZXI7CisKKwkvKioKKwkgKiBAcGFyYW0ganVzdFVzYWdlIHRydWUgaWYgdGhlCisJICovCisJcHVibGljIHZvaWQgc2hvd0hlbHAoIGJvb2xlYW4ganVzdFVzYWdlICkKKwl7CisJCVN5c3RlbS5lcnIucHJpbnQoICJ1c2FnZTogIiApOworCQkKKwkJU3lzdGVtLmVyci5wcmludCggcHJvZ3JhbSApOworCQkKKwkJYm9vbGVhbiBoYXNPcHRpb25zID0gZmFsc2U7CisJCQorCQl7CisJCQlJdGVyYXRvcjxPcHRpb24+IGkgPSBnZXRPcHRpb25MaXN0KCk7CisJCQl3aGlsZSAoaS5oYXNOZXh0KCkpCisJCQl7CisJCQkJT3B0aW9uIG9wdGlvbiA9IGkubmV4dCgpOworCQkJCWlmIChvcHRpb24uaXNIaWRkZW4oKSkKKwkJCQkJY29udGludWU7CisJCQkJCisJCQkJLy8gb25seSBzaG93IFtvcHRpb25zXSBpZiB0aGVyZSBhcmUgYW55IHZpc2libGUgb3B0aW9ucy4uLgorCQkJCVN5c3RlbS5lcnIucHJpbnQoICIgW29wdGlvbnNdIiApOworCQkJCWhhc09wdGlvbnMgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCQorCQlpbnQgYnJhY2tldHMgPSAwOworCQkKKwkJeworCQkJSXRlcmF0b3I8UGFyYW1ldGVyPiBpID0gZ2V0UGFyYW1ldGVycygpOworCQkJd2hpbGUgKGkuaGFzTmV4dCgpKQorCQkJeworCQkJCVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBpLm5leHQoKTsKKwkJCQlpZiAoIXBhcmFtZXRlci5pc1JlcXVpcmVkKCkpCisJCQkJeworCQkJCQlicmFja2V0cysrOworCQkJCQlTeXN0ZW0uZXJyLnByaW50KCAiIFsiICk7CisJCQkJfQorCQkJCXBhcmFtZXRlci5zaG93U2hvcnREZXNjcmlwdGlvbigpOworCQkJfQorCQl9CisJCQorCQlpZiAoY2F0Y2hBbGxQYXJhbWV0ZXIgIT0gbnVsbCkKKwkJeworCQkJaWYgKCFjYXRjaEFsbFBhcmFtZXRlci5pc1JlcXVpcmVkKCkpCisJCQl7CisJCQkJYnJhY2tldHMrKzsKKwkJCQlTeXN0ZW0uZXJyLnByaW50KCAiIFsiICk7CisJCQl9CisJCQljYXRjaEFsbFBhcmFtZXRlci5zaG93U2hvcnREZXNjcmlwdGlvbigpOworCQkJU3lzdGVtLmVyci5wcmludCggIiAuLi4iICk7CisJCX0KKwkJCisJCXdoaWxlIChicmFja2V0cy0tID4gMCkKKwkJCVN5c3RlbS5lcnIucHJpbnQoICIgXSIgKTsKKwkJCisJCVN5c3RlbS5lcnIucHJpbnRsbigpOworCQkKKwkJaWYgKCFqdXN0VXNhZ2UpCisJCXsKKwkJCXsKKwkJCQlpZiAoaGFzT3B0aW9ucykKKwkJCQl7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigpOworCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oICJPUFRJT05TOiIgKTsKKwkJCQl9CisJCQkJCisJCQkJSXRlcmF0b3I8T3B0aW9uPiBpID0gZ2V0T3B0aW9uTGlzdCgpOworCQkJCXdoaWxlIChpLmhhc05leHQoKSkKKwkJCQl7CisJCQkJCU9wdGlvbiBvcHRpb24gPSBpLm5leHQoKTsKKwkJCQkJaWYgKG9wdGlvbi5pc0hpZGRlbigpKQorCQkJCQkJY29udGludWU7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigpOworCQkJCQlvcHRpb24uc2hvd0xvbmdEZXNjcmlwdGlvbigpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJeworCQkJCUl0ZXJhdG9yPFBhcmFtZXRlcj4gaSA9IGdldFBhcmFtZXRlcnMoKTsKKwkJCQkKKwkJCQlpZiAoaS5oYXNOZXh0KCkgfHwgY2F0Y2hBbGxQYXJhbWV0ZXIgIT0gbnVsbCkKKwkJCQl7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigpOworCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oICJQQVJBTUVURVJTOiIgKTsKKwkJCQl9CisJCQkJCisJCQkJd2hpbGUgKGkuaGFzTmV4dCgpKQorCQkJCXsKKwkJCQkJUGFyYW1ldGVyIHBhcmFtZXRlciA9IGkubmV4dCgpOworCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKKwkJCQkJcGFyYW1ldGVyLnNob3dMb25nRGVzY3JpcHRpb24oKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChjYXRjaEFsbFBhcmFtZXRlciAhPSBudWxsKQorCQkJeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigpOworCQkJCWNhdGNoQWxsUGFyYW1ldGVyLnNob3dMb25nRGVzY3JpcHRpb24oKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBvcHRpb24gaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgb3IKKwkgKiBub3QsIGFuZCBtYXJrcyBpdCBhcyBoYXZpbmcgYmVlbiBzcGVjaWZpZWQuCisJICogQHBhcmFtIG9wdGlvbgorCSAqIEBwYXJhbSB1cGRhdGUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCAob3RoZXIgdGhhbiBieSBkZWZhdWx0KS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FscmVhZHlTcGVjaWZpZWQoIE9wdGlvbiBvcHRpb24sIGJvb2xlYW4gdXBkYXRlICkKKwl7CisJCWlmIChzcGVjaWZpZWRPcHRpb25zLmNvbnRhaW5zKCBvcHRpb24gKSkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJaWYgKHVwZGF0ZSkKKwkJCXNwZWNpZmllZE9wdGlvbnMuYWRkKCBvcHRpb24gKTsKKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSBTZXQ8T3B0aW9uPiBzcGVjaWZpZWRPcHRpb25zID0gbmV3IEhhc2hTZXQ8T3B0aW9uPigpOworCisJcHJpdmF0ZSBib29sZWFuIGxhc3RJc1JlcXVpcmVkID0gdHJ1ZTsKKworCS8qKgorCSAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBwYXJhbWV0ZXJzLgorCSAqLworCXByaXZhdGUgSXRlcmF0b3I8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkKKwl7CisJCXJldHVybiBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHRva2VuCisJICogQHJldHVybiB0aGUgb3B0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRva2VuLCBvciBudWxsLgorCSAqLworCXB1YmxpYyBPcHRpb24gZ2V0T3B0aW9uKCBTdHJpbmcgdG9rZW4gKQorCXsKKwkJcmV0dXJuIG9wdGlvbnMuZ2V0KCB0b2tlbiApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0b2tlbgorCSAqIEByZXR1cm4gdGhlIG9wdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiwgb3IgbnVsbC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uIGdldFNob3J0T3B0aW9uKCBTdHJpbmcgdG9rZW4gKQorCXsKKwkJcmV0dXJuIHNob3J0T3B0aW9ucy5nZXQoIHRva2VuICk7CisJfQorCQorCXByaXZhdGUgSXRlcmF0b3I8T3B0aW9uPiBnZXRPcHRpb25MaXN0KCkKKwl7CisJCXJldHVybiBvcHRpb25MaXN0Lml0ZXJhdG9yKCk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUZJTkUgUEFSQU1FVEVSIFNIT1JUQ1VUUyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGlzUmVxdWlyZWQKKwkgKiBAcGFyYW0gaXNDYXRjaEFsbAorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVCb29sZWFuUGFyYW1ldGVyKCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIGRlc2NyaXB0aW9uLAorCQlib29sZWFuIGlzUmVxdWlyZWQsIGJvb2xlYW4gaXNDYXRjaEFsbCwgQ29uc3RyYWludCBjb25zdHJhaW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZGVmaW5lKCBuZXcgQm9vbGVhblBhcmFtZXRlciggdGhpcywgbmFtZSwgbWV0aG9kLCBkZXNjcmlwdGlvbiwKKwkJCWlzUmVxdWlyZWQsIGNvbnN0cmFpbnQgKSwgaXNDYXRjaEFsbCApOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gaXNSZXF1aXJlZAorCSAqIEBwYXJhbSBpc0NhdGNoQWxsCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGRlZmluZURvdWJsZVBhcmFtZXRlciggU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsIFN0cmluZyBkZXNjcmlwdGlvbiwKKwkJYm9vbGVhbiBpc1JlcXVpcmVkLCBib29sZWFuIGlzQ2F0Y2hBbGwsIENvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWRlZmluZSggbmV3IERvdWJsZVBhcmFtZXRlciggdGhpcywgbmFtZSwgbWV0aG9kLCBkZXNjcmlwdGlvbiwKKwkJCWlzUmVxdWlyZWQsIGNvbnN0cmFpbnQgKSwgaXNDYXRjaEFsbCApOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gaXNSZXF1aXJlZAorCSAqIEBwYXJhbSBpc0NhdGNoQWxsCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGRlZmluZUZpbGVQYXJhbWV0ZXIoIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgZGVzY3JpcHRpb24sCisJCWJvb2xlYW4gaXNSZXF1aXJlZCwgYm9vbGVhbiBpc0NhdGNoQWxsLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBGaWxlUGFyYW1ldGVyKCB0aGlzLCBuYW1lLCBtZXRob2QsIGRlc2NyaXB0aW9uLAorCQkJaXNSZXF1aXJlZCwgY29uc3RyYWludCApLCBpc0NhdGNoQWxsICk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG1ldGhvZAorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBpc1JlcXVpcmVkCisJICogQHBhcmFtIGlzQ2F0Y2hBbGwKKwkgKiBAcGFyYW0gY29uc3RyYWludAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lSW50ZWdlclBhcmFtZXRlciggU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsIFN0cmluZyBkZXNjcmlwdGlvbiwKKwkJYm9vbGVhbiBpc1JlcXVpcmVkLCBib29sZWFuIGlzQ2F0Y2hBbGwsIENvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWRlZmluZSggbmV3IEludGVnZXJQYXJhbWV0ZXIoIHRoaXMsIG5hbWUsIG1ldGhvZCwgZGVzY3JpcHRpb24sCisJCQlpc1JlcXVpcmVkLCBjb25zdHJhaW50ICksIGlzQ2F0Y2hBbGwgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGlzUmVxdWlyZWQKKwkgKiBAcGFyYW0gaXNDYXRjaEFsbAorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVTdHJpbmdQYXJhbWV0ZXIoIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgZGVzY3JpcHRpb24sCisJCWJvb2xlYW4gaXNSZXF1aXJlZCwgYm9vbGVhbiBpc0NhdGNoQWxsLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBTdHJpbmdQYXJhbWV0ZXIoIHRoaXMsIG5hbWUsIG1ldGhvZCwgZGVzY3JpcHRpb24sCisJCQlpc1JlcXVpcmVkLCBjb25zdHJhaW50ICksIGlzQ2F0Y2hBbGwgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGlzUmVxdWlyZWQKKwkgKiBAcGFyYW0gaXNDYXRjaEFsbAorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVVcmxQYXJhbWV0ZXIoIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgZGVzY3JpcHRpb24sCisJCWJvb2xlYW4gaXNSZXF1aXJlZCwgYm9vbGVhbiBpc0NhdGNoQWxsLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBVcmxQYXJhbWV0ZXIoIHRoaXMsIG5hbWUsIG1ldGhvZCwgZGVzY3JpcHRpb24sCisJCQlpc1JlcXVpcmVkLCBjb25zdHJhaW50ICksIGlzQ2F0Y2hBbGwgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIERFRklORSBPUFRJT04gU0hPUlRDVVRTIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIERlZmluZXMgYSBib29sZWFuIG9wdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBib29sZWFuIG9wdGlvbiBtYXkgYmUKKwkgKiBzcGVjaWZpZWQgYXMgdHJ1ZSwgZmFsc2UsIHllcywgbm8sIDEsIDAsIGVuYWJsZSwgb3IgZGlzYWJsZSAoZS5nLiwgLXgwCisJICogd291bGQgc3BlY2lmeSB0aGUgYm9vbGVhbiBvcHRpb24gLXggYXMgZmFsc2UpLgorCSAqIAorCSAqIEBwYXJhbSB0b2tlbnMgYSBzZXF1ZW5jZSBvZiBzaG9ydCBhbmQgbG9uZyB0b2tlbnMgd2hpY2ggYXJlIHVzZWQgdG8KKwkgKiBzcGVjaWZ5IHRoZSBvcHRpb24gKGUuZy4sICIteHwtLWV4dGVuZCIpLiBUaGUgdG9rZW5zIGFyZSBzZXBhcmF0ZWQgZnJvbQorCSAqIGVhY2ggb3RoZXIgYnkgdmVydGljYWwgYmFyLCBjb21tYSwgc2VtaS1jb2xvbiwgb3IgYW55IHNvcnQgb2Ygd2hpdGVzcGFjZS4KKwkgKiBUaGUgdG9rZW5zIGNvbWUgaW4gc2hvcnQgKC14KSBhbmQgbG9uZyAoLS1leHRlbmQpIHZhcmlldGllcy4gU2hvcnQgdG9rZW5zCisJICogbWF5IG9ubHkgaGF2ZSBhIHNpbmdsZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIGFmdGVyIHRoZSBkYXNoLiBDYXNlIGlzCisJICogc2lnbmlmaWNhbnQuIExvbmcgdG9rZW5zIG11c3QgbWF0Y2ggdGhpcyBwYXR0ZXJuOiBbYS16MC05XSsoLVthLXowLTldKykqLgorCSAqIFRoYXQgaXMsIG9uZSBvciBtb3JlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGJyb2tlbiB1cCBieSBzaW5nbGUgaW50ZXJuYWwKKwkgKiBkYXNoZXMuIE5vIHVwcGVyIGNhc2UuIE5vdGUgdGhhdCAteCBhbmQgLS14IGFyZSBub3QgdGhlIHNhbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24uCisJICogCisJICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSBvZiBhIG1ldGhvZCBvZiB0aGUgdGFyZ2V0IGNsYXNzIHRvIGNhbGwgd2l0aCB0aGUKKwkgKiBvcHRpb24gd2hlbiBpdCBpcyBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLiBUaGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUKKwkgKiBzaWduYXR1cmUgYm9vbGVhbiBtZXRob2QoQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHRva2VuLAorCSAqIEJvb2xlYW4gdmFsdWUpIG9yIHZvaWQgbWV0aG9kKENvbW1hbmRQYXJzZXIgY3AsIE9wdGlvbiBvcHRpb24sIFN0cmluZworCSAqIHRva2VuLCBCb29sZWFuIHZhbHVlKS4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiB0aGUgb3B0aW9uIHdoaWNoIGlzIGZvcm1hdHRlZCBpbnRvIGEKKwkgKiBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBjb21tYW5kLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyBzb21lIGZsYWcgdmFsdWVzIHdoaWNoIG1heSBiZSBvcidlZCB0b2dldGhlci4KKwkgKiAKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29uc3RyYWludCBhIGNvbnN0cmFpbnQgZXhwcmVzc2lvbiBmb3IgdmFsdWVzIG9mIHRoZSBvcHRpb24uCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHRva2VucywgdGhlIG1ldGhvZCwgb3IKKwkgKiB0aGUgZmxhZ3MuCisJICogCisJICogQHNlZSBPcHRpb24jSElEREVOCisJICogQHNlZSBPcHRpb24jTk9ORQorCSAqIEBzZWUgT3B0aW9uI1JFUVVJUkVECisJICogQHNlZSBPcHRpb24jU0lOR0xFVE9OCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lQm9vbGVhbk9wdGlvbiggU3RyaW5nIHRva2VucywgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsCisJCVN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGZsYWdzLCBCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29uc3RyYWludCBjb25zdHJhaW50ICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZGVmaW5lKCBuZXcgQm9vbGVhbk9wdGlvbiggdGhpcywgdG9rZW5zLCBuYW1lLCBtZXRob2QsIGRlc2NyaXB0aW9uLCBmbGFncywKKwkJCWRlZmF1bHRWYWx1ZSwgY29uc3RyYWludCApICk7CisJfQorCisJLyoqCisJICogRGVmaW5lcyBhIGRvdWJsZSBvcHRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgZG91YmxlIG9wdGlvbiBtYXkgYmUgc3BlY2lmaWVkCisJICogYXMgYW55IHZhbGlkIGZsb2F0aW5nIHBvaW50IG51bWJlciAoZS5nLiwgLXgwLjEgd291bGQgc3BlY2lmeSB0aGUgZG91YmxlCisJICogb3B0aW9uIC14IGFzIDAuMSkuCisJICogCisJICogQHBhcmFtIHRva2VucyBhIHNlcXVlbmNlIG9mIHNob3J0IGFuZCBsb25nIHRva2VucyB3aGljaCBhcmUgdXNlZCB0bworCSAqIHNwZWNpZnkgdGhlIG9wdGlvbiAoZS5nLiwgIi14fC0tZXh0ZW5kIikuIFRoZSB0b2tlbnMgYXJlIHNlcGFyYXRlZCBmcm9tCisJICogZWFjaCBvdGhlciBieSB2ZXJ0aWNhbCBiYXIsIGNvbW1hLCBzZW1pLWNvbG9uLCBvciBhbnkgc29ydCBvZiB3aGl0ZXNwYWNlLgorCSAqIFRoZSB0b2tlbnMgY29tZSBpbiBzaG9ydCAoLXgpIGFuZCBsb25nICgtLWV4dGVuZCkgdmFyaWV0aWVzLiBTaG9ydCB0b2tlbnMKKwkgKiBtYXkgb25seSBoYXZlIGEgc2luZ2xlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGRhc2guIENhc2UgaXMKKwkgKiBzaWduaWZpY2FudC4gTG9uZyB0b2tlbnMgbXVzdCBtYXRjaCB0aGlzIHBhdHRlcm46IFthLXowLTldKygtW2EtejAtOV0rKSouCisJICogVGhhdCBpcywgb25lIG9yIG1vcmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYnJva2VuIHVwIGJ5IHNpbmdsZSBpbnRlcm5hbAorCSAqIGRhc2hlcy4gTm8gdXBwZXIgY2FzZS4gTm90ZSB0aGF0IC14IGFuZCAtLXggYXJlIG5vdCB0aGUgc2FtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9mIHRoZSB0YXJnZXQgY2xhc3MgdG8gY2FsbCB3aXRoIHRoZQorCSAqIG9wdGlvbiB3aGVuIGl0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuIFRoZSBtZXRob2QgbXVzdCBoYXZlIHRoZQorCSAqIHNpZ25hdHVyZSBib29sZWFuIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisJICogRG91YmxlIHZhbHVlKSBvciB2b2lkIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcKKwkgKiB0b2tlbiwgRG91YmxlIHZhbHVlKS4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiB0aGUgb3B0aW9uIHdoaWNoIGlzIGZvcm1hdHRlZCBpbnRvIGEKKwkgKiBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBjb21tYW5kLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyBzb21lIGZsYWcgdmFsdWVzIHdoaWNoIG1heSBiZSBvcidlZCB0b2dldGhlci4KKwkgKiAKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29uc3RyYWludCBhIGNvbnN0cmFpbnQgZXhwcmVzc2lvbiBmb3IgdmFsdWVzIG9mIHRoZSBvcHRpb24uCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHRva2VucywgdGhlIG1ldGhvZCwgb3IKKwkgKiB0aGUgZmxhZ3MuCisJICogCisJICogQHNlZSBPcHRpb24jSElEREVOCisJICogQHNlZSBPcHRpb24jTk9ORQorCSAqIEBzZWUgT3B0aW9uI1JFUVVJUkVECisJICogQHNlZSBPcHRpb24jU0lOR0xFVE9OCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lRG91YmxlT3B0aW9uKCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwKKwkJU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIERvdWJsZSBkZWZhdWx0VmFsdWUsIENvbnN0cmFpbnQgY29uc3RyYWludCApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWRlZmluZSggbmV3IERvdWJsZU9wdGlvbiggdGhpcywgdG9rZW5zLCBuYW1lLCBtZXRob2QsIGRlc2NyaXB0aW9uLCBmbGFncywKKwkJCWRlZmF1bHRWYWx1ZSwgY29uc3RyYWludCApICk7CisJfQorCisJLyoqCisJICogRGVmaW5lcyBhIGZpbGUgb3B0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGZpbGUgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQKKwkgKiBhcyBhbnkgdmFsaWQgZmlsZSBvciBkaXJlY3RvcnkgbmFtZSAoZS5nLiwgLXhmb28udHh0IHdvdWxkIHNwZWNpZnkgdGhlCisJICogZmlsZSBvcHRpb24gLXggYXMgZm9vLnR4dCkuCisJICogCisJICogQHBhcmFtIHRva2VucyBhIHNlcXVlbmNlIG9mIHNob3J0IGFuZCBsb25nIHRva2VucyB3aGljaCBhcmUgdXNlZCB0bworCSAqIHNwZWNpZnkgdGhlIG9wdGlvbiAoZS5nLiwgIi14fC0tZXh0ZW5kIikuIFRoZSB0b2tlbnMgYXJlIHNlcGFyYXRlZCBmcm9tCisJICogZWFjaCBvdGhlciBieSB2ZXJ0aWNhbCBiYXIsIGNvbW1hLCBzZW1pLWNvbG9uLCBvciBhbnkgc29ydCBvZiB3aGl0ZXNwYWNlLgorCSAqIFRoZSB0b2tlbnMgY29tZSBpbiBzaG9ydCAoLXgpIGFuZCBsb25nICgtLWV4dGVuZCkgdmFyaWV0aWVzLiBTaG9ydCB0b2tlbnMKKwkgKiBtYXkgb25seSBoYXZlIGEgc2luZ2xlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGRhc2guIENhc2UgaXMKKwkgKiBzaWduaWZpY2FudC4gTG9uZyB0b2tlbnMgbXVzdCBtYXRjaCB0aGlzIHBhdHRlcm46IFthLXowLTldKygtW2EtejAtOV0rKSouCisJICogVGhhdCBpcywgb25lIG9yIG1vcmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYnJva2VuIHVwIGJ5IHNpbmdsZSBpbnRlcm5hbAorCSAqIGRhc2hlcy4gTm8gdXBwZXIgY2FzZS4gTm90ZSB0aGF0IC14IGFuZCAtLXggYXJlIG5vdCB0aGUgc2FtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9mIHRoZSB0YXJnZXQgY2xhc3MgdG8gY2FsbCB3aXRoIHRoZQorCSAqIG9wdGlvbiB3aGVuIGl0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuIFRoZSBtZXRob2QgbXVzdCBoYXZlIHRoZQorCSAqIHNpZ25hdHVyZSBib29sZWFuIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisJICogRmlsZSB2YWx1ZSkgb3Igdm9pZCBtZXRob2QoQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nCisJICogdG9rZW4sIEZpbGUgdmFsdWUpLgorCSAqIAorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvcHRpb24gd2hpY2ggaXMgZm9ybWF0dGVkIGludG8gYQorCSAqIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGNvbW1hbmQuCisJICogCisJICogQHBhcmFtIGZsYWdzIHNvbWUgZmxhZyB2YWx1ZXMgd2hpY2ggbWF5IGJlIG9yJ2VkIHRvZ2V0aGVyLgorCSAqIAorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgb3B0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBjb25zdHJhaW50IGEgY29uc3RyYWludCBleHByZXNzaW9uIGZvciB2YWx1ZXMgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdG9rZW5zLCB0aGUgbWV0aG9kLCBvcgorCSAqIHRoZSBmbGFncy4KKwkgKiAKKwkgKiBAc2VlIE9wdGlvbiNISURERU4KKwkgKiBAc2VlIE9wdGlvbiNOT05FCisJICogQHNlZSBPcHRpb24jUkVRVUlSRUQKKwkgKiBAc2VlIE9wdGlvbiNTSU5HTEVUT04KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVGaWxlT3B0aW9uKCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwKKwkJU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIEZpbGUgZGVmYXVsdFZhbHVlLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBGaWxlT3B0aW9uKCB0aGlzLCB0b2tlbnMsIG5hbWUsIG1ldGhvZCwgZGVzY3JpcHRpb24sIGZsYWdzLAorCQkJZGVmYXVsdFZhbHVlLCBjb25zdHJhaW50ICkgKTsKKwl9CisKKwkvKioKKwkgKiBEZWZpbmVzIGFuIGludGVnZXIgb3B0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGludGVnZXIgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQKKwkgKiBhcyBhbnkgdmFsaWQgaW50ZWdyYWwgbnVtYmVyIChlLmcuLCAteDEyMyB3b3VsZCBzcGVjaWZ5IHRoZSBpbnRlZ2VyCisJICogb3B0aW9uIC14IGFzIDEyMykuCisJICogCisJICogQHBhcmFtIHRva2VucyBhIHNlcXVlbmNlIG9mIHNob3J0IGFuZCBsb25nIHRva2VucyB3aGljaCBhcmUgdXNlZCB0bworCSAqIHNwZWNpZnkgdGhlIG9wdGlvbiAoZS5nLiwgIi14fC0tZXh0ZW5kIikuIFRoZSB0b2tlbnMgYXJlIHNlcGFyYXRlZCBmcm9tCisJICogZWFjaCBvdGhlciBieSB2ZXJ0aWNhbCBiYXIsIGNvbW1hLCBzZW1pLWNvbG9uLCBvciBhbnkgc29ydCBvZiB3aGl0ZXNwYWNlLgorCSAqIFRoZSB0b2tlbnMgY29tZSBpbiBzaG9ydCAoLXgpIGFuZCBsb25nICgtLWV4dGVuZCkgdmFyaWV0aWVzLiBTaG9ydCB0b2tlbnMKKwkgKiBtYXkgb25seSBoYXZlIGEgc2luZ2xlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGRhc2guIENhc2UgaXMKKwkgKiBzaWduaWZpY2FudC4gTG9uZyB0b2tlbnMgbXVzdCBtYXRjaCB0aGlzIHBhdHRlcm46IFthLXowLTldKygtW2EtejAtOV0rKSouCisJICogVGhhdCBpcywgb25lIG9yIG1vcmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYnJva2VuIHVwIGJ5IHNpbmdsZSBpbnRlcm5hbAorCSAqIGRhc2hlcy4gTm8gdXBwZXIgY2FzZS4gTm90ZSB0aGF0IC14IGFuZCAtLXggYXJlIG5vdCB0aGUgc2FtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9mIHRoZSB0YXJnZXQgY2xhc3MgdG8gY2FsbCB3aXRoIHRoZQorCSAqIG9wdGlvbiB3aGVuIGl0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuIFRoZSBtZXRob2QgbXVzdCBoYXZlIHRoZQorCSAqIHNpZ25hdHVyZSBib29sZWFuIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisJICogSW50ZWdlciB2YWx1ZSkgb3Igdm9pZCBtZXRob2QoQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nCisJICogdG9rZW4sIEludGVnZXIgdmFsdWUpLgorCSAqIAorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvcHRpb24gd2hpY2ggaXMgZm9ybWF0dGVkIGludG8gYQorCSAqIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGNvbW1hbmQuCisJICogCisJICogQHBhcmFtIGZsYWdzIHNvbWUgZmxhZyB2YWx1ZXMgd2hpY2ggbWF5IGJlIG9yJ2VkIHRvZ2V0aGVyLgorCSAqIAorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgb3B0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBjb25zdHJhaW50IGEgY29uc3RyYWludCBleHByZXNzaW9uIGZvciB2YWx1ZXMgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdG9rZW5zLCB0aGUgbWV0aG9kLCBvcgorCSAqIHRoZSBmbGFncy4KKwkgKiAKKwkgKiBAc2VlIE9wdGlvbiNISURERU4KKwkgKiBAc2VlIE9wdGlvbiNOT05FCisJICogQHNlZSBPcHRpb24jUkVRVUlSRUQKKwkgKiBAc2VlIE9wdGlvbiNTSU5HTEVUT04KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVJbnRlZ2VyT3B0aW9uKCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwKKwkJU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIEludGVnZXIgZGVmYXVsdFZhbHVlLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBJbnRlZ2VyT3B0aW9uKCB0aGlzLCB0b2tlbnMsIG5hbWUsIG1ldGhvZCwgZGVzY3JpcHRpb24sIGZsYWdzLAorCQkJZGVmYXVsdFZhbHVlLCBjb25zdHJhaW50ICkgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdG9rZW5zCisJICogQHBhcmFtIG1ldGhvZAorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBmbGFncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lTnVsbE9wdGlvbiggU3RyaW5nIHRva2VucywgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIGRlc2NyaXB0aW9uLAorCQlpbnQgZmxhZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBOdWxsT3B0aW9uKCB0aGlzLCB0b2tlbnMsIG1ldGhvZCwgZGVzY3JpcHRpb24sIGZsYWdzICkgKTsKKwl9CisKKwkvKioKKwkgKiBEZWZpbmVzIGEgc3RyaW5nIG9wdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQKKwkgKiBhcyBhbnkgdmFsaWQgY2hhcmFjdGVycyAoZS5nLiwgLXh4eXogd291bGQgc3BlY2lmeSB0aGUgc3RyaW5nCisJICogb3B0aW9uIC14IGFzIHh5eikuCisJICogCisJICogQHBhcmFtIHRva2VucyBhIHNlcXVlbmNlIG9mIHNob3J0IGFuZCBsb25nIHRva2VucyB3aGljaCBhcmUgdXNlZCB0bworCSAqIHNwZWNpZnkgdGhlIG9wdGlvbiAoZS5nLiwgIi14fC0tZXh0ZW5kIikuIFRoZSB0b2tlbnMgYXJlIHNlcGFyYXRlZCBmcm9tCisJICogZWFjaCBvdGhlciBieSB2ZXJ0aWNhbCBiYXIsIGNvbW1hLCBzZW1pLWNvbG9uLCBvciBhbnkgc29ydCBvZiB3aGl0ZXNwYWNlLgorCSAqIFRoZSB0b2tlbnMgY29tZSBpbiBzaG9ydCAoLXgpIGFuZCBsb25nICgtLWV4dGVuZCkgdmFyaWV0aWVzLiBTaG9ydCB0b2tlbnMKKwkgKiBtYXkgb25seSBoYXZlIGEgc2luZ2xlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGRhc2guIENhc2UgaXMKKwkgKiBzaWduaWZpY2FudC4gTG9uZyB0b2tlbnMgbXVzdCBtYXRjaCB0aGlzIHBhdHRlcm46IFthLXowLTldKygtW2EtejAtOV0rKSouCisJICogVGhhdCBpcywgb25lIG9yIG1vcmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYnJva2VuIHVwIGJ5IHNpbmdsZSBpbnRlcm5hbAorCSAqIGRhc2hlcy4gTm8gdXBwZXIgY2FzZS4gTm90ZSB0aGF0IC14IGFuZCAtLXggYXJlIG5vdCB0aGUgc2FtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9mIHRoZSB0YXJnZXQgY2xhc3MgdG8gY2FsbCB3aXRoIHRoZQorCSAqIG9wdGlvbiB3aGVuIGl0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuIFRoZSBtZXRob2QgbXVzdCBoYXZlIHRoZQorCSAqIHNpZ25hdHVyZSBib29sZWFuIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisJICogU3RyaW5nIHZhbHVlKSBvciB2b2lkIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcKKwkgKiB0b2tlbiwgU3RyaW5nIHZhbHVlKS4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiB0aGUgb3B0aW9uIHdoaWNoIGlzIGZvcm1hdHRlZCBpbnRvIGEKKwkgKiBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBjb21tYW5kLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyBzb21lIGZsYWcgdmFsdWVzIHdoaWNoIG1heSBiZSBvcidlZCB0b2dldGhlci4KKwkgKiAKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29uc3RyYWludCBhIGNvbnN0cmFpbnQgZXhwcmVzc2lvbiBmb3IgdmFsdWVzIG9mIHRoZSBvcHRpb24uCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHRva2VucywgdGhlIG1ldGhvZCwgb3IKKwkgKiB0aGUgZmxhZ3MuCisJICogCisJICogQHNlZSBPcHRpb24jSElEREVOCisJICogQHNlZSBPcHRpb24jTk9ORQorCSAqIEBzZWUgT3B0aW9uI1JFUVVJUkVECisJICogQHNlZSBPcHRpb24jU0lOR0xFVE9OCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lU3RyaW5nT3B0aW9uKCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwKKwkJU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIFN0cmluZyBkZWZhdWx0VmFsdWUsIENvbnN0cmFpbnQgY29uc3RyYWludCApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWRlZmluZSggbmV3IFN0cmluZ09wdGlvbiggdGhpcywgdG9rZW5zLCBuYW1lLCBtZXRob2QsIGRlc2NyaXB0aW9uLAorCQkJZmxhZ3MsIGRlZmF1bHRWYWx1ZSwgY29uc3RyYWludCApICk7CisJfQorCisJLyoqCisJICogRGVmaW5lcyBhIG15c3RlcmlvdXMgdGhpbmcuCisJICogCisJICogQHBhcmFtIHRva2VucyBhIHNlcXVlbmNlIG9mIHNob3J0IGFuZCBsb25nIHRva2VucyB3aGljaCBhcmUgdXNlZCB0bworCSAqIHNwZWNpZnkgdGhlIG9wdGlvbiAoZS5nLiwgIi14fC0tZXh0ZW5kIikuIFRoZSB0b2tlbnMgYXJlIHNlcGFyYXRlZCBmcm9tCisJICogZWFjaCBvdGhlciBieSB2ZXJ0aWNhbCBiYXIsIGNvbW1hLCBzZW1pLWNvbG9uLCBvciBhbnkgc29ydCBvZiB3aGl0ZXNwYWNlLgorCSAqIFRoZSB0b2tlbnMgY29tZSBpbiBzaG9ydCAoLXgpIGFuZCBsb25nICgtLWV4dGVuZCkgdmFyaWV0aWVzLiBTaG9ydCB0b2tlbnMKKwkgKiBtYXkgb25seSBoYXZlIGEgc2luZ2xlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGRhc2guIENhc2UgaXMKKwkgKiBzaWduaWZpY2FudC4gTG9uZyB0b2tlbnMgbXVzdCBtYXRjaCB0aGlzIHBhdHRlcm46IFthLXowLTldKygtW2EtejAtOV0rKSouCisJICogVGhhdCBpcywgb25lIG9yIG1vcmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYnJva2VuIHVwIGJ5IHNpbmdsZSBpbnRlcm5hbAorCSAqIGRhc2hlcy4gTm8gdXBwZXIgY2FzZS4gTm90ZSB0aGF0IC14IGFuZCAtLXggYXJlIG5vdCB0aGUgc2FtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZXMgdGhlIG5hbWVzIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9mIHRoZSB0YXJnZXQgY2xhc3MgdG8gY2FsbCB3aXRoIHRoZQorCSAqIG9wdGlvbiB3aGVuIGl0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuIFRoZSBtZXRob2QgbXVzdCBoYXZlIHRoZQorCSAqIHNpZ25hdHVyZSBib29sZWFuIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sCisJICogT2JqZWN0W10gdmFsdWVzKSBvciB2b2lkIG1ldGhvZChDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcKKwkgKiB0b2tlbiwgT2JqZWN0W10gdmFsdWUpLgorCSAqIAorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvcHRpb24gd2hpY2ggaXMgZm9ybWF0dGVkIGludG8gYQorCSAqIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGNvbW1hbmQuCisJICogCisJICogQHBhcmFtIGZsYWdzIHNvbWUgZmxhZyB2YWx1ZXMgd2hpY2ggbWF5IGJlIG9yJ2VkIHRvZ2V0aGVyLgorCSAqIAorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgb3B0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBjb25zdHJhaW50cyBjb25zdHJhaW50IGV4cHJlc3Npb25zIGZvciB2YWx1ZXMgb2YgdGhlIG9wdGlvbi4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdG9rZW5zLCB0aGUgbWV0aG9kLCBvcgorCSAqIHRoZSBmbGFncy4KKwkgKiAKKwkgKiBAc2VlIE9wdGlvbiNISURERU4KKwkgKiBAc2VlIE9wdGlvbiNOT05FCisJICogQHNlZSBPcHRpb24jUkVRVUlSRUQKKwkgKiBAc2VlIE9wdGlvbiNTSU5HTEVUT04KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVTdHJpbmdBcnJheU9wdGlvbiggU3RyaW5nIHRva2VucywgU3RyaW5nW10gbmFtZXMsCisJCVN0cmluZyBtZXRob2QsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGZsYWdzLCBTdHJpbmdbXSBkZWZhdWx0VmFsdWVzLAorCQlDb25zdHJhaW50W10gY29uc3RyYWludHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBTdHJpbmdBcnJheU9wdGlvbiggdGhpcywgdG9rZW5zLCBuYW1lcywgbWV0aG9kLAorCQkJZGVzY3JpcHRpb24sIGZsYWdzLCBkZWZhdWx0VmFsdWVzLCBjb25zdHJhaW50cyApICk7CisJfQorCisJLyoqCisJICogRGVmaW5lcyBhIHVybCBvcHRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgdXJsIG9wdGlvbiBtYXkgYmUgc3BlY2lmaWVkCisJICogYXMgYW55IHZhbGlkIHVybCAoZS5nLiwgLXhodHRwOi8vZm9vLmNvbSB3b3VsZCBzcGVjaWZ5IHRoZSB1cmwKKwkgKiBvcHRpb24gLXggYXMgaHR0cDovL2Zvby5jb20pLgorCSAqIAorCSAqIEBwYXJhbSB0b2tlbnMgYSBzZXF1ZW5jZSBvZiBzaG9ydCBhbmQgbG9uZyB0b2tlbnMgd2hpY2ggYXJlIHVzZWQgdG8KKwkgKiBzcGVjaWZ5IHRoZSBvcHRpb24gKGUuZy4sICIteHwtLWV4dGVuZCIpLiBUaGUgdG9rZW5zIGFyZSBzZXBhcmF0ZWQgZnJvbQorCSAqIGVhY2ggb3RoZXIgYnkgdmVydGljYWwgYmFyLCBjb21tYSwgc2VtaS1jb2xvbiwgb3IgYW55IHNvcnQgb2Ygd2hpdGVzcGFjZS4KKwkgKiBUaGUgdG9rZW5zIGNvbWUgaW4gc2hvcnQgKC14KSBhbmQgbG9uZyAoLS1leHRlbmQpIHZhcmlldGllcy4gU2hvcnQgdG9rZW5zCisJICogbWF5IG9ubHkgaGF2ZSBhIHNpbmdsZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIGFmdGVyIHRoZSBkYXNoLiBDYXNlIGlzCisJICogc2lnbmlmaWNhbnQuIExvbmcgdG9rZW5zIG11c3QgbWF0Y2ggdGhpcyBwYXR0ZXJuOiBbYS16MC05XSsoLVthLXowLTldKykqLgorCSAqIFRoYXQgaXMsIG9uZSBvciBtb3JlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGJyb2tlbiB1cCBieSBzaW5nbGUgaW50ZXJuYWwKKwkgKiBkYXNoZXMuIE5vIHVwcGVyIGNhc2UuIE5vdGUgdGhhdCAteCBhbmQgLS14IGFyZSBub3QgdGhlIHNhbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24uCisJICogCisJICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSBvZiBhIG1ldGhvZCBvZiB0aGUgdGFyZ2V0IGNsYXNzIHRvIGNhbGwgd2l0aCB0aGUKKwkgKiBvcHRpb24gd2hlbiBpdCBpcyBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLiBUaGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUKKwkgKiBzaWduYXR1cmUgYm9vbGVhbiBtZXRob2QoQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHRva2VuLAorCSAqIFVSTCB2YWx1ZSkgb3Igdm9pZCBtZXRob2QoQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nCisJICogdG9rZW4sIFVSTCB2YWx1ZSkuCisJICogCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgdGhlIG9wdGlvbiB3aGljaCBpcyBmb3JtYXR0ZWQgaW50byBhCisJICogaGVscCBtZXNzYWdlIGZvciB0aGUgY29tbWFuZC4KKwkgKiAKKwkgKiBAcGFyYW0gZmxhZ3Mgc29tZSBmbGFnIHZhbHVlcyB3aGljaCBtYXkgYmUgb3InZWQgdG9nZXRoZXIuCisJICogCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBvcHRpb24uCisJICogCisJICogQHBhcmFtIGNvbnN0cmFpbnQgYSBjb25zdHJhaW50IGV4cHJlc3Npb24gZm9yIHZhbHVlcyBvZiB0aGUgb3B0aW9uLgorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0b2tlbnMsIHRoZSBtZXRob2QsIG9yCisJICogdGhlIGZsYWdzLgorCSAqIAorCSAqIEBzZWUgT3B0aW9uI0hJRERFTgorCSAqIEBzZWUgT3B0aW9uI05PTkUKKwkgKiBAc2VlIE9wdGlvbiNSRVFVSVJFRAorCSAqIEBzZWUgT3B0aW9uI1NJTkdMRVRPTgorCSAqLworCXB1YmxpYyB2b2lkIGRlZmluZVVybE9wdGlvbiggU3RyaW5nIHRva2VucywgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsCisJCVN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGZsYWdzLCBVUkwgZGVmYXVsdFZhbHVlLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlkZWZpbmUoIG5ldyBVcmxPcHRpb24oIHRoaXMsIHRva2VucywgbmFtZSwgbWV0aG9kLCBkZXNjcmlwdGlvbiwgZmxhZ3MsCisJCQlkZWZhdWx0VmFsdWUsIGNvbnN0cmFpbnQgKSApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvQ29uc3RyYWludC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Db25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0Mjc1ZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKKy8qKgorICogQ29uc3RyYWludCBhbGxvd3Mgc2l0dWF0aW9uYWwgY29uZGl0aW9ucyB0byBiZSBwbGFjZWQgdXBvbgorICogdmFsdWVzIG90aGVyd2lzZSBhY2NlcHRhYmxlIGdpdmVuIGFuIGl0ZW0ncyB0eXBlLiBUaHVzLCB5b3UKKyAqIGNhbiBoYXZlIGFuIGl0ZW0gd2hvc2UgdmFsdWUgaXMgPj0gMCwgb3Igd2hvc2UgdmFsdWUgaXMgYQorICogcmVhZGFibGUgZmlsZSwgZXRjLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbnN0cmFpbnQKK3sKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpZiB0aGUgdmFsdWUgaXMgYmFkLgorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrVmFsdWUoIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0RvdWJsZU9wdGlvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Eb3VibGVPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjYwM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Eb3VibGVPcHRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIEFuIG9wdGlvbiB3aG9zZSB2YWx1ZSBpcyBhIGRvdWJsZS4KKyAqLworcHVibGljIGNsYXNzIERvdWJsZU9wdGlvbiBleHRlbmRzIE9wdGlvbgoreworCS8qKgorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSB0b2tlbnMKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZmxhZ3MKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBEb3VibGVPcHRpb24oIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLAorCQlTdHJpbmcgZGVzY3JpcHRpb24sIGludCBmbGFncywgRG91YmxlIGRlZmF1bHRWYWx1ZSwgQ29uc3RyYWludCBjb25zdHJhaW50ICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNwLCB0b2tlbnMsIG5hbWUsIG1ldGhvZCwgUEFSQU1TLCBkZXNjcmlwdGlvbiwgZmxhZ3MsIGRlZmF1bHRWYWx1ZSwgY29uc3RyYWludCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFBBUkFNUyA9CisJCXsgQ29tbWFuZFBhcnNlci5jbGFzcywgT3B0aW9uLmNsYXNzLCBTdHJpbmcuY2xhc3MsIERvdWJsZS5jbGFzcyB9OworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoIFN0cmluZyB2YWx1ZSApCisJeworCQlyZXR1cm4gbmV3IERvdWJsZSggdmFsdWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0RvdWJsZVBhcmFtZXRlci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Eb3VibGVQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E1YmYyCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9Eb3VibGVQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIEEgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGlzIGEgZG91YmxlLgorICovCitwdWJsaWMgY2xhc3MgRG91YmxlUGFyYW1ldGVyIGV4dGVuZHMgUGFyYW1ldGVyCit7CisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGlzUmVxdWlyZWQKKwkgKiBAcGFyYW0gY29uc3RyYWludAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIERvdWJsZVBhcmFtZXRlciggQ29tbWFuZFBhcnNlciBjcCwgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsCisJCVN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBpc1JlcXVpcmVkLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdXBlciggY3AsIG5hbWUsIG1ldGhvZCwgUEFSQU1TLCBkZXNjcmlwdGlvbiwgaXNSZXF1aXJlZCwgY29uc3RyYWludCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFBBUkFNUyA9CisJCXsgQ29tbWFuZFBhcnNlci5jbGFzcywgUGFyYW1ldGVyLmNsYXNzLCBEb3VibGUuY2xhc3MgfTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29udmVydFZhbHVlKCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJcmV0dXJuIG5ldyBEb3VibGUoIHZhbHVlICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9GaWxlT3B0aW9uLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0ZpbGVPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjY5YjRiCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9GaWxlT3B0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBBbiBvcHRpb24gd2hvc2UgdmFsdWUgaXMgYSBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgRmlsZU9wdGlvbiBleHRlbmRzIE9wdGlvbgoreworCS8qKgorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSB0b2tlbnMKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZmxhZ3MKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBGaWxlT3B0aW9uKCBDb21tYW5kUGFyc2VyIGNwLCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwKKwkJU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIEZpbGUgZGVmYXVsdFZhbHVlLCBDb25zdHJhaW50IGNvbnN0cmFpbnQgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdXBlciggY3AsIHRva2VucywgbmFtZSwgbWV0aG9kLCBQQVJBTVMsIGRlc2NyaXB0aW9uLCBmbGFncywgZGVmYXVsdFZhbHVlLCBjb25zdHJhaW50ICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gUEFSQU1TID0KKwkJeyBDb21tYW5kUGFyc2VyLmNsYXNzLCBPcHRpb24uY2xhc3MsIFN0cmluZy5jbGFzcywgRmlsZS5jbGFzcyB9OworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoIFN0cmluZyB2YWx1ZSApCisJeworCQlyZXR1cm4gbmV3IEZpbGUoIHZhbHVlICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9GaWxlUGFyYW1ldGVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0ZpbGVQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzhjNDhhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9GaWxlUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBBIHBhcmFtZXRlciB3aG9zZSB2YWx1ZSBpcyBhIGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlUGFyYW1ldGVyIGV4dGVuZHMgUGFyYW1ldGVyCit7CisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGlzUmVxdWlyZWQKKwkgKiBAcGFyYW0gY29uc3RyYWludAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIEZpbGVQYXJhbWV0ZXIoIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLAorCQlTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaXNSZXF1aXJlZCwgQ29uc3RyYWludCBjb25zdHJhaW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNwLCBuYW1lLCBtZXRob2QsIFBBUkFNUywgZGVzY3JpcHRpb24sIGlzUmVxdWlyZWQsIGNvbnN0cmFpbnQgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBQQVJBTVMgPQorCQl7IENvbW1hbmRQYXJzZXIuY2xhc3MsIFBhcmFtZXRlci5jbGFzcywgRmlsZS5jbGFzcyB9OworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb252ZXJ0VmFsdWUoIFN0cmluZyB2YWx1ZSApCisJeworCQlyZXR1cm4gbmV3IEZpbGUoIHZhbHVlICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9JbnRSYW5nZUNvbnN0cmFpbnQuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvSW50UmFuZ2VDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiOTBkOAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvSW50UmFuZ2VDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBJbnRSYW5nZUNvbnN0cmFpbnQKKyAqLworcHVibGljIGNsYXNzIEludFJhbmdlQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBJbnRSYW5nZUNvbnN0cmFpbnQuCisJICoKKwkgKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQuCisJICogCisJICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZSBhbGxvd2VkLgorCSAqLworCXB1YmxpYyBJbnRSYW5nZUNvbnN0cmFpbnQoIGludCBtaW4sIGludCBtYXggKQorCXsKKwkJaWYgKG1pbiA+IG1heCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJtaW4gPiBtYXgiICk7CisJCXRoaXMubWluID0gbWluOworCQl0aGlzLm1heCA9IG1heDsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgbWluOworCQorCXByaXZhdGUgZmluYWwgaW50IG1heDsKKwkKKwlwdWJsaWMgdm9pZCBjaGVja1ZhbHVlKCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpbnQgdiA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7CisJCWlmICh2IDwgbWluIHx8IHYgPiBtYXgpCisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAidmFsdWUgbm90IGluIHJhbmdlICIrbWluKyIgdG8gIittYXggKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gInZhbHVlIG11c3QgYmUgaW4gcmFuZ2UgIittaW4rIiB0byAiK21heDsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0ludGVnZXJPcHRpb24uamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvSW50ZWdlck9wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGU2YmEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0ludGVnZXJPcHRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIEFuIG9wdGlvbiB3aG9zZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlck9wdGlvbiBleHRlbmRzIE9wdGlvbgoreworCS8qKgorCSAqIE1ldGhvZCBzaG91bGQgYmUgZGVjbGFyZWQgYXM6CisJICogCisJICogcHVibGljIGJvb2xlYW4gbWV0aG9kKCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4sIEludGVnZXIgdmFsdWUgKTsKKwkgKiAKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gdG9rZW5zCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGZsYWdzCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgSW50ZWdlck9wdGlvbiggQ29tbWFuZFBhcnNlciBjcCwgU3RyaW5nIHRva2VucywgU3RyaW5nIG5hbWUsIFN0cmluZyBtZXRob2QsCisJCVN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGZsYWdzLCBJbnRlZ2VyIGRlZmF1bHRWYWx1ZSwgQ29uc3RyYWludCBjb25zdHJhaW50ICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNwLCB0b2tlbnMsIG5hbWUsIG1ldGhvZCwgUEFSQU1TLCBkZXNjcmlwdGlvbiwgZmxhZ3MsIGRlZmF1bHRWYWx1ZSwgY29uc3RyYWludCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFBBUkFNUyA9CisJCXsgQ29tbWFuZFBhcnNlci5jbGFzcywgT3B0aW9uLmNsYXNzLCBTdHJpbmcuY2xhc3MsIEludGVnZXIuY2xhc3MgfTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZiggdmFsdWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0ludGVnZXJQYXJhbWV0ZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvSW50ZWdlclBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTA3MzEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL0ludGVnZXJQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIEEgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGlzIGFuIGludGVnZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlZ2VyUGFyYW1ldGVyIGV4dGVuZHMgUGFyYW1ldGVyCit7CisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGlzUmVxdWlyZWQKKwkgKiBAcGFyYW0gY29uc3RyYWludAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIEludGVnZXJQYXJhbWV0ZXIoIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLAorCQlTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaXNSZXF1aXJlZCwgQ29uc3RyYWludCBjb25zdHJhaW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNwLCBuYW1lLCBtZXRob2QsIFBBUkFNUywgZGVzY3JpcHRpb24sIGlzUmVxdWlyZWQsIGNvbnN0cmFpbnQgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBQQVJBTVMgPQorCQl7IENvbW1hbmRQYXJzZXIuY2xhc3MsIFBhcmFtZXRlci5jbGFzcywgSW50ZWdlci5jbGFzcyB9OworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb252ZXJ0VmFsdWUoIFN0cmluZyB2YWx1ZSApCisJeworCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKCB2YWx1ZSApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvTnVsbE9wdGlvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9OdWxsT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5OTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvTnVsbE9wdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CisKKy8qKgorICogQW4gb3B0aW9uIHdoaWNoIGhhcyBubyB2YWx1ZS4KKyAqLworcHVibGljIGNsYXNzIE51bGxPcHRpb24gZXh0ZW5kcyBPcHRpb24KK3sKKwkvKioKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gdG9rZW5zCisJICogQHBhcmFtIG1ldGhvZAorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBmbGFncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIE51bGxPcHRpb24oIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBtZXRob2QsCisJCVN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGZsYWdzICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNwLCB0b2tlbnMsIChTdHJpbmdbXSkgbnVsbCwgbWV0aG9kLCBQQVJBTVMsIGRlc2NyaXB0aW9uLCBmbGFncywgbnVsbCwgbnVsbCApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFBBUkFNUyA9CisJCXsgQ29tbWFuZFBhcnNlci5jbGFzcywgT3B0aW9uLmNsYXNzLCBTdHJpbmcuY2xhc3MgfTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB3YW50c1ZhbHVlKCkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRWYWx1ZSggU3RyaW5nIHZhbHVlICkKKwl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3RbXSBnZXRBcmdzKCBTdHJpbmcgdG9rZW4sIE9iamVjdCB2YWx1ZSApCisJeworCQlBc3NlcnRpb24uY2hlY2soIHZhbHVlID09IG51bGwsICJ2YWx1ZSA9PSBudWxsIiApOworCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgZ2V0Q29tbWFuZFBhcnNlcigpLCB0aGlzLCB0b2tlbiB9OworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvT25lT2ZDb25zdHJhaW50LmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL09uZU9mQ29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmRhNWQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL09uZU9mQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisKKy8qKgorICogQSBDb25zdHJhaW50IHdoaWNoIGxpbWl0cyBhIHZhbHVlIHRvIG9uZSBvZiBhIGZldworICogY2hvaWNlcy4KKyAqLworcHVibGljIGNsYXNzIE9uZU9mQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBPbmVPZkNvbnN0cmFpbnQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIGFsbG93ZWQgdmFsdWVzCisJICovCisJcHVibGljIE9uZU9mQ29uc3RyYWludCggU3RyaW5nIC4uLiB2YWx1ZSApCisJeworCQlzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoU3RyaW5nIHM6IHZhbHVlKQorCQkJc2V0LmFkZCggcyApOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIE9uZU9mQ29uc3RyYWludC4KKwkgKgorCSAqIEBwYXJhbSBzZXQgdGhlIHNldCBvZiBhbGxvd2VkIHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgT25lT2ZDb25zdHJhaW50KCBTZXQ8U3RyaW5nPiBzZXQgKQorCXsKKwkJdGhpcy5zZXQgPSBzZXQ7CisJfQorCQorCXByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gc2V0OworCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuICJvbmUgb2YgIitzZXQ7CisJfQorCQorCXB1YmxpYyB2b2lkIGNoZWNrVmFsdWUoIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmICghc2V0LmNvbnRhaW5zKCB2YWx1ZSApKQorCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbiggIiIrdmFsdWUrIiBpcyBub3QgdmFsaWQsIGV4cGVjdGVkIG9uZSBvZiAiK3NldCApOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL09wdFBhcmFtQmFzZS5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9PcHRQYXJhbUJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzQwNWNkCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9PcHRQYXJhbUJhc2UuamF2YQpAQCAtMCwwICsxLDI4OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBTaGFyZWQgYmFzZSBjbGFzcyBvZiBvcHRpb25zIGFuZCBwYXJhbWV0ZXJzLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgT3B0UGFyYW1CYXNlCit7CisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIHBhcmFtcworCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBpc1JlcXVpcmVkCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPcHRQYXJhbUJhc2UoIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLAorCQlDbGFzczw/PltdIHBhcmFtcywgU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIGlzUmVxdWlyZWQsCisJCUNvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRoaXMuY3AgPSBjcDsKKwkJbmFtZXMgPSBuZXcgU3RyaW5nW10geyBuYW1lIH07CisJCXRoaXMubWV0aG9kID0gZmluZE1ldGhvZCggY3AucHJvZ3JhbSwgbWV0aG9kLCBwYXJhbXMgKTsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQl0aGlzLmlzUmVxdWlyZWQgPSBpc1JlcXVpcmVkOworCQlpZiAoY29uc3RyYWludCAhPSBudWxsKQorCQkJY29uc3RyYWludHMgPSBuZXcgQ29uc3RyYWludFtdIHsgY29uc3RyYWludCB9OworCQllbHNlCisJCQljb25zdHJhaW50cyA9IG51bGw7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSBuYW1lcworCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gcGFyYW1zCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGlzUmVxdWlyZWQKKwkgKiBAcGFyYW0gY29uc3RyYWludHMKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPcHRQYXJhbUJhc2UoIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZ1tdIG5hbWVzLCBTdHJpbmcgbWV0aG9kLAorCQlDbGFzczw/PltdIHBhcmFtcywgU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIGlzUmVxdWlyZWQsCisJCUNvbnN0cmFpbnRbXSBjb25zdHJhaW50cyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChjb25zdHJhaW50cyAhPSBudWxsICYmIGNvbnN0cmFpbnRzLmxlbmd0aCAhPSBuYW1lcy5sZW5ndGgpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCSJjb25zdHJhaW50cy5sZW5ndGggIT0gbmFtZXMubGVuZ3RoIiApOworCQkKKwkJdGhpcy5jcCA9IGNwOworCQl0aGlzLm5hbWVzID0gbmFtZXM7CisJCXRoaXMubWV0aG9kID0gZmluZE1ldGhvZCggY3AucHJvZ3JhbSwgbWV0aG9kLCBwYXJhbXMgKTsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQl0aGlzLmlzUmVxdWlyZWQgPSBpc1JlcXVpcmVkOworCQl0aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7CisJfQorCQorCXByaXZhdGUgZmluYWwgQ29tbWFuZFBhcnNlciBjcDsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG5hbWVzOworCisJcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOworCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOworCQorCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1JlcXVpcmVkOworCQorCXByaXZhdGUgZmluYWwgQ29uc3RyYWludFtdIGNvbnN0cmFpbnRzOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgcGFyc2VyIG9mIHRoaXMgaXRlbS4KKwkgKi8KKwlwdWJsaWMgQ29tbWFuZFBhcnNlciBnZXRDb21tYW5kUGFyc2VyKCkKKwl7CisJCXJldHVybiBjcDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGl0ZW0uCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldE5hbWVzKCkKKwl7CisJCXJldHVybiBuYW1lczsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBpdGVtLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpdGVtIGlzIHJlcXVpcmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKQorCXsKKwkJcmV0dXJuIGlzUmVxdWlyZWQ7CisJfQorCQorCS8vLy8vLy8vLy8KKwkvLyBIRUxQIC8vCisJLy8vLy8vLy8vLworCQorCS8qKgorCSAqIFNob3dzIGEgdmVyeSBzaG9ydCBzeW5vcHNpcyBvZiB0aGUgaXRlbSBmb3IgdGhlIGNvbW1hbmQgbGluZSB1c2FnZSBtZXNzYWdlLgorCSAqCisJICovCisJYWJzdHJhY3QgcHVibGljIHZvaWQgc2hvd1Nob3J0RGVzY3JpcHRpb24oKTsKKwkKKwkvKioKKwkgKiBTaG93cyB0aGUgbG9uZ2VyICJoZWxwIiBkZXNjcmlwdGlvbiB3aGljaCBhcHBlYXJzIHVuZGVybmVhdGggdGhlCisJICogY29tbWFuZCBsaW5lIHVzYWdlIG1lc3NhZ2UuCisJICoKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBzaG93TG9uZ0Rlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTaG93cyB0aGUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgaXRlbS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93RGVzY3JpcHRpb24oKQorCXsKKwkJU3lzdGVtLmVyci5wcmludCggREVTQ19GTEFHICk7CisJCVN5c3RlbS5lcnIucHJpbnRsbiggZGVzY3JpcHRpb24gKTsKKwl9CisKKwkvKioKKwkgKiBTaG93cyB3aGV0aGVyIHRoZSBpdGVtIGlzIHJlcXVpcmVkIG9yIG5vdC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93SXNSZXF1aXJlZCgpCisJeworCQlpZiAoaXNSZXF1aXJlZCgpKQorCQl7CisJCQlTeXN0ZW0uZXJyLnByaW50KCBERVNDX0ZMQUcgKTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbiggInJlcXVpcmVkIChtdXN0IGJlIHNwZWNpZmllZCkuIiApOworCQl9CisJfQorCQorCS8qKgorCSAqIFNob3dzIHRoZSBjb25zdHJhaW50IGlmIGFueS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93Q29uc3RyYWludCgpCisJeworCQlpZiAoY29uc3RyYWludHMgIT0gbnVsbCkKKwkJeworCQkJaW50IG4gPSBjb25zdHJhaW50cy5sZW5ndGg7CisJCQlTeXN0ZW0uZXJyLnByaW50KCBERVNDX0ZMQUcgKTsKKwkJCQorCQkJaWYgKG4gPiAxKQorCQkJCVN5c3RlbS5lcnIucHJpbnQoICJjb25zdHJhaW50OiB7IiApOworCQkJZWxzZQorCQkJCVN5c3RlbS5lcnIucHJpbnQoICJjb25zdHJhaW50OiAiICk7CisJCQkKKwkJCWZvciAoQ29uc3RyYWludCBjb25zdHJhaW50OiBjb25zdHJhaW50cykKKwkJCXsKKwkJCQlTeXN0ZW0uZXJyLnByaW50KCAnICcgKTsKKwkJCQlTeXN0ZW0uZXJyLnByaW50KCBjb25zdHJhaW50ICk7CisJCQl9CisJCQkKKwkJCWlmIChuID4gMSkKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oICIgfSIgKTsKKwkJCWVsc2UKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBGbGFnIHZhbHVlIHRvIHVzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGZvciB0aGUKKwkgKiBuYW1lIG9mIHRoZSBpdGVtLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfRkxBRyA9ICIgICAiOworCQorCS8qKgorCSAqIEZsYWcgdmFsdWUgdG8gdXNlIGF0IGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgZGVzY3JpcHRpdmUKKwkgKiB0ZXh0IG9mIGFuIGl0ZW0uCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ19GTEFHID0gIiAgICAgICMgIjsKKwkKKwkvLy8vLy8vLy8vLworCS8vIFZBTFVFIC8vCisJLy8vLy8vLy8vLy8KKwkKKwkvKioKKwkgKiBJbnZva2VzIHRoZSBjb25zdHJhaW50IGNoZWNrVmFsdWUgbWV0aG9kIGlmIHRoZXJlIGlzCisJICogYSBjb25zdHJhaW50LgorCSAqIAorCSAqIEBwYXJhbSB3aG8KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWVzCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb2ssIGZhbHNlIG90aGVyd2lzZS4gSWYgZmFsc2UKKwkgKiBpcyByZXR1cm5lZCwgYSBtZXNzYWdlIGhhcyBiZWVuIHByaW50ZWQgb24gU3lzdGVtLmVyci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhbHVlKCBTdHJpbmcgd2hvLCBPYmplY3RbXSB2YWx1ZXMgKQorCXsKKwkJaWYgKGNvbnN0cmFpbnRzICE9IG51bGwpCisJCXsKKwkJCWludCBuID0gY29uc3RyYWludHMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQl7CisJCQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gY29uc3RyYWludHNbaV07CisJCQkJCisJCQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCkKKwkJCQkJY29udGludWU7CisJCQkJCisJCQkJdHJ5CisJCQkJeworCQkJCQljb25zdHJhaW50LmNoZWNrVmFsdWUoIHZhbHVlc1tpXSApOworCQkJCX0KKwkJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCVN5c3RlbS5lcnIucHJpbnQoIHdobyApOworCQkJCQlTeXN0ZW0uZXJyLnByaW50KCAiOiB2YWxpZGF0aW9uIG9mIHZhbHVlICIgKTsKKwkJCQkJU3lzdGVtLmVyci5wcmludCggbmFtZXNbaV0gKTsKKwkJCQkJU3lzdGVtLmVyci5wcmludCggIj0nIiApOworCQkJCQlTeXN0ZW0uZXJyLnByaW50KCB2YWx1ZXNbaV0gKTsKKwkJCQkJU3lzdGVtLmVyci5wcmludCggIicgZmFpbGVkOiAiICk7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbiggZS5nZXRNZXNzYWdlKCkgKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybiB2YWx1ZSBjb252ZXJ0ZWQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgaXRlbQorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKCBTdHJpbmcgdmFsdWUgKTsKKworCS8vLy8vLy8vLy8vLworCS8vIE1FVEhPRCAvLworCS8vLy8vLy8vLy8vLworCisJLyoqCisJICogQHBhcmFtIHByb2dyYW0KKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIHBhcmFtcworCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBmb3IgcHJvZyBnaXZlbiBwYXJhbXMuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNZXRob2QgZmluZE1ldGhvZCggUHJvZ3JhbSBwcm9ncmFtLCBTdHJpbmcgbWV0aG9kLAorCQlDbGFzczw/PltdIHBhcmFtcyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBwcm9ncmFtLmdldENsYXNzKCkuZ2V0TWV0aG9kKCBtZXRob2QsIHBhcmFtcyApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcmdzCisJICogQHJldHVybiB2YWx1ZSByZXR1cm5lZCBmcm9tIG1ldGhvZCwgb3IgdHJ1ZSBpZiBudWxsIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gY2FsbE1ldGhvZCggT2JqZWN0W10gYXJncyApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCByZXN1bHQgPSBtZXRob2QuaW52b2tlKCBjcC5wcm9ncmFtLCBhcmdzICk7CisJCQorCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCXJldHVybiAoKEJvb2xlYW4pIHJlc3VsdCkuYm9vbGVhblZhbHVlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9PcHRpb24uamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhMTI2MgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvT3B0aW9uLmphdmEKQEAgLTAsMCArMSw0MjUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKgorICogQSBjb21tYW5kIGxpbmUgdmFsdWUgd2hpY2ggaXMgaW50cm9kdWNlZCBieSBhIHNwZWNpZmllZCB0b2tlbi4KKyAqIEFuIG9wdGlvbiBpcyBub3QgZGVwZW5kZW50IHVwb24gcG9zaXRpb24gb24gdGhlIGNvbW1hbmQgbGluZQorICogdG8gYmUgcmVjb2duaXplZCAoYnV0IHN0aWxsLCBwb3NpdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lIG1pZ2h0CisgKiBiZSBpbXBvcnRhbnQpLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgT3B0aW9uIGV4dGVuZHMgT3B0UGFyYW1CYXNlCit7CisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIHRva2VucworCSAqIEBwYXJhbSBuYW1lCisJICogQHBhcmFtIG1ldGhvZAorCSAqIEBwYXJhbSBwYXJhbXMKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZmxhZ3MKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPcHRpb24oIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLAorCQlDbGFzczw/PltdIHBhcmFtcywgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIE9iamVjdCBkZWZhdWx0VmFsdWUsCisJCUNvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBjcCwgbmFtZSwgbWV0aG9kLCBwYXJhbXMsIGRlc2NyaXB0aW9uLCAoZmxhZ3MgJiBSRVFVSVJFRCkgIT0gMCwKKwkJCWNvbnN0cmFpbnQgKTsKKwkJCisJCWlmICghc2V0VG9rZW5zKCB0b2tlbnMgKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJubyB0b2tlbnMgZm9yIG9wdGlvbiIgKTsKKwkJCisJCWlzQXJyYXkgPSBwYXJhbXMubGVuZ3RoID4gMyAmJiBwYXJhbXNbM10uaXNBcnJheSgpOworCQl0aGlzLmZsYWdzID0gZmxhZ3M7CisJCQorCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpCisJCQlkZWZhdWx0VmFsdWVzID0gbmV3IE9iamVjdFtdIHsgZGVmYXVsdFZhbHVlIH07CisJCWVsc2UKKwkJCWRlZmF1bHRWYWx1ZXMgPSBudWxsOworCQkKKwkJaWYgKGNvbnN0cmFpbnQgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT0gbnVsbCkKKwkJCWNvbnN0cmFpbnQuY2hlY2tWYWx1ZSggZGVmYXVsdFZhbHVlICk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSB0b2tlbnMKKwkgKiBAcGFyYW0gbmFtZXMKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIHBhcmFtcworCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBmbGFncworCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzCisJICogQHBhcmFtIGNvbnN0cmFpbnRzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgT3B0aW9uKCBDb21tYW5kUGFyc2VyIGNwLCBTdHJpbmcgdG9rZW5zLCBTdHJpbmdbXSBuYW1lcywgU3RyaW5nIG1ldGhvZCwKKwkJQ2xhc3M8Pz5bXSBwYXJhbXMsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGZsYWdzLCBPYmplY3RbXSBkZWZhdWx0VmFsdWVzLAorCQlDb25zdHJhaW50W10gY29uc3RyYWludHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdXBlciggY3AsIG5hbWVzLCBtZXRob2QsIHBhcmFtcywgZGVzY3JpcHRpb24sIChmbGFncyAmIFJFUVVJUkVEKSAhPSAwLAorCQkJY29uc3RyYWludHMgKTsKKwkJCisJCWlmICghc2V0VG9rZW5zKCB0b2tlbnMgKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJubyB0b2tlbnMgZm9yIG9wdGlvbiIgKTsKKwkJCisJCWlmIChkZWZhdWx0VmFsdWVzICE9IG51bGwgJiYgZGVmYXVsdFZhbHVlcy5sZW5ndGggIT0gbmFtZXMubGVuZ3RoKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImRlZmF1bHRWYWx1ZS5sZW5ndGggIT0gbmFtZS5sZW5ndGgiICk7CisJCQorCQlpc0FycmF5ID0gcGFyYW1zLmxlbmd0aCA+IDMgJiYgcGFyYW1zWzNdLmlzQXJyYXkoKTsKKwkJdGhpcy5mbGFncyA9IGZsYWdzOworCQl0aGlzLmRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VmFsdWVzOworCQkKKwkJaWYgKGNvbnN0cmFpbnRzICE9IG51bGwgJiYgZGVmYXVsdFZhbHVlcyAhPSBudWxsKQorCQl7CisJCQlpbnQgbiA9IGNvbnN0cmFpbnRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJeworCQkJCUNvbnN0cmFpbnQgYyA9IGNvbnN0cmFpbnRzW2ldOworCQkJCU9iamVjdCB2ID0gZGVmYXVsdFZhbHVlc1tpXTsKKwkJCQlpZiAoYyAhPSBudWxsKQorCQkJCQljLmNoZWNrVmFsdWUoIHYgKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0FycmF5OworCQorCXByaXZhdGUgZmluYWwgaW50IGZsYWdzOworCQorCXByaXZhdGUgZmluYWwgT2JqZWN0W10gZGVmYXVsdFZhbHVlczsKKwkKKwkvKioKKwkgKiBUaGUgb3B0aW9uIGhhcyBubyBzcGVjaWFsIGhhbmRsaW5nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOworCisJLyoqCisJICogVGhlIG9wdGlvbiBpcyBoaWRkZW4gZnJvbSB0aGUgdXNlci4gSXQgbXVzdCBub3QgYmUgc3BlY2lmaWVkLgorCSAqIEl0IG11c3Qgbm90IGJlIHJlcXVpcmVkIG9yIGl0IG11c3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOID0gMTsKKworCS8qKgorCSAqIFRoZSBvcHRpb24gbWF5IG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFVE9OID0gMjsKKworCS8qKgorCSAqIFRoZSBvcHRpb24gaXMgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEID0gNDsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHRva2VucyBvZiBhbiBvcHRpb24uCisJICovCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0VG9rZW5zKCkKKwl7CisJCXJldHVybiB0b2tlbnMuaXRlcmF0b3IoKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBvcHRpb24gaXMgaGlkZGVuLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkKKwl7CisJCXJldHVybiBtYXRjaEZsYWdzKCBISURERU4gKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBvcHRpb24gbWF5IG9ubHkgYXBwZWFyIG9uY2UuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaW5nbGV0b24oKQorCXsKKwkJcmV0dXJuIG1hdGNoRmxhZ3MoIFNJTkdMRVRPTiApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBmbGFnCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBmbGFnIGhhcyBiZWVuIHNwZWNpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHJpdmF0ZSBib29sZWFuIG1hdGNoRmxhZ3MoIGludCBmbGFnICkKKwl7CisJCXJldHVybiAoZmxhZ3MgJiBmbGFnKSAhPSAwOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCisJICovCisJcHVibGljIE9iamVjdFtdIGdldERlZmF1bHRWYWx1ZXMoKQorCXsKKwkJcmV0dXJuIGRlZmF1bHRWYWx1ZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gdG9TdHJpbmcoIHByaW1hcnlUb2tlbiAhPSBudWxsID8gcHJpbWFyeVRva2VuIDogIih1bmtub3duKSIgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHRva2VuCisJICogQHJldHVybiB0aGUKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHRvU3RyaW5nKCBTdHJpbmcgdG9rZW4gKQorCXsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlciggdG9rZW4gKTsKKwkJCisJCVN0cmluZ1tdIG5hbWVzID0gZ2V0TmFtZXMoKTsKKwkJaWYgKG5hbWVzICE9IG51bGwpCisJCXsKKwkJCWZvciAoU3RyaW5nIG5hbWU6IG5hbWVzKQorCQkJeworCQkJCXNiLmFwcGVuZCggJyAnICk7CisJCQkJc2IuYXBwZW5kKCBuYW1lICk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCS8vLy8vLy8vLy8vLworCS8vIFRPS0VOUyAvLworCS8vLy8vLy8vLy8vLworCisJcHJpdmF0ZSBib29sZWFuIHNldFRva2VucyggU3RyaW5nIHMgKQorCXsKKwkJdG9rZW5zLmNsZWFyKCk7CisJCXByaW1hcnlUb2tlbiA9IG51bGw7CisJCQorCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBzLCAifCw7IFxyXG5cdCIgKTsKKwkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJeworCQkJU3RyaW5nIHQgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCXRva2Vucy5hZGQoIHQgKTsKKwkJCWlmIChwcmltYXJ5VG9rZW4gPT0gbnVsbCkKKwkJCQlwcmltYXJ5VG9rZW4gPSB0OworCQl9CisJCQorCQlyZXR1cm4gdG9rZW5zLnNpemUoKSA+IDA7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IHRva2VuIGluIHRoZSB0b2tlbiBsaXN0IG9mIHRoZSBvcHRpb24uCisJICovCisJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5VG9rZW4oKQorCXsKKwkJcmV0dXJuIHByaW1hcnlUb2tlbjsKKwl9CisJCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCisJcHJpdmF0ZSBTdHJpbmcgcHJpbWFyeVRva2VuOworCisJLy8vLy8vLy8vLworCS8vIEhFTFAgLy8KKwkvLy8vLy8vLy8vCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzaG93U2hvcnREZXNjcmlwdGlvbigpCisJeworCQlTeXN0ZW0uZXJyLnByaW50KCBpc1JlcXVpcmVkKCkgPyAiIHsiIDogIiBbIiApOworCQkKKwkJU3lzdGVtLmVyci5wcmludCggJyAnICk7CisJCVN5c3RlbS5lcnIucHJpbnQoIHByaW1hcnlUb2tlbiApOworCQkKKwkJaWYgKHdhbnRzVmFsdWUoKSkKKwkJeworCQkJZm9yIChTdHJpbmcgbmFtZTogZ2V0TmFtZXMoKSkKKwkJCXsKKwkJCQlTeXN0ZW0uZXJyLnByaW50KCAnICcgKTsKKwkJCQlTeXN0ZW0uZXJyLnByaW50KCBuYW1lICk7CisJCQl9CisJCX0KKwkJCisJCVN5c3RlbS5lcnIucHJpbnQoIGlzUmVxdWlyZWQoKSA/ICIgfSIgOiAiIF0iICk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNob3dMb25nRGVzY3JpcHRpb24oKQorCXsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpID0gdG9rZW5zLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpLmhhc05leHQoKSkKKwkJeworCQkJU3lzdGVtLmVyci5wcmludCggTkFNRV9GTEFHICk7CisJCQlTeXN0ZW0uZXJyLnByaW50KCBpLm5leHQoKSApOworCQkJaWYgKHdhbnRzVmFsdWUoKSkKKwkJCXsKKwkJCQlmb3IgKFN0cmluZyBuYW1lOiBnZXROYW1lcygpKQorCQkJCXsKKwkJCQkJU3lzdGVtLmVyci5wcmludCggJyAnICk7CisJCQkJCVN5c3RlbS5lcnIucHJpbnQoIG5hbWUgKTsKKwkJCQl9CisJCQl9CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKKwkJfQorCQkKKwkJc2hvd0Rlc2NyaXB0aW9uKCk7CisJCQorCQlzaG93SXNSZXF1aXJlZCgpOworCQkKKwkJc2hvd0NvbnN0cmFpbnQoKTsKKwkJCisJCWlmIChpc1NpbmdsZXRvbigpKQorCQl7CisJCQlTeXN0ZW0uZXJyLnByaW50KCBERVNDX0ZMQUcgKTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbiggInNpbmdsZXRvbiAobWF5IG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UpLiIgKTsKKwkJfQorCQkKKwkJaWYgKGRlZmF1bHRWYWx1ZXMgIT0gbnVsbCkKKwkJeworCQkJaW50IG4gPSBkZWZhdWx0VmFsdWVzLmxlbmd0aDsKKwkJCQorCQkJU3lzdGVtLmVyci5wcmludCggREVTQ19GTEFHICk7CisJCQkKKwkJCWlmIChuID4gMSkKKwkJCQlTeXN0ZW0uZXJyLnByaW50KCAiZGVmYXVsdDogeyIgKTsKKwkJCWVsc2UKKwkJCQlTeXN0ZW0uZXJyLnByaW50KCAiZGVmYXVsdDogIiApOworCQkJCisJCQlmb3IgKE9iamVjdCBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZXMpCisJCQl7CisJCQkJU3lzdGVtLmVyci5wcmludCggJyAnICk7CisJCQkJU3lzdGVtLmVyci5wcmludCggZGVmYXVsdFZhbHVlICk7CisJCQl9CisJCQkKKwkJCWlmIChuID4gMSkKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oICIgfSIgKTsKKwkJCWVsc2UKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKKwkJfQorCX0KKworCS8vLy8vLy8vLy8vCisJLy8gVkFMVUUgLy8KKwkvLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wdGlvbiBuZWVkcyBhIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gd2FudHNWYWx1ZSgpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdG9rZW4KKwkgKiBAcGFyYW0gdmFsdWUgdmFsdWUgc3BlY2lmaWVkIG9uIHRoZSB0b2tlbiAoZS5nLiwgLS1jb3VudD0yMykKKwkgKiBAcGFyYW0gdGtucworCSAqIEByZXR1cm4gdmFsdWUgZnJvbSB0b2tlbnMgY29udmVydGVkIGFzIGFwcHJvcHJpYXRlLgorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRBbmRDb252ZXJ0VmFsdWUoIFN0cmluZyB0b2tlbiwgU3RyaW5nIHZhbHVlLCBJdGVyYXRvcjxTdHJpbmc+IHRrbnMgKQorCXsKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggImxvb2tpbmcgZm9yIHZhbHVlIGZvciB0b2tlbiAlczogdmFsdWUgPSAlc1xuIiwgdG9rZW4sIHZhbHVlICApOworCQlPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0W2dldE5hbWVzKCkubGVuZ3RoXTsKKwkJaW50IGkgPSAwOworCQlmb3IgKFN0cmluZyBuYW1lOiBnZXROYW1lcygpKQorCQl7CisJCQlpZiAodmFsdWUgPT0gbnVsbCAmJiAhdGtucy5oYXNOZXh0KCkpCisJCQl7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCAib3B0aW9uICciK3RvU3RyaW5nKCB0b2tlbiApKyInOiBtaXNzaW5nIHZhbHVlICIrbmFtZSApOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJdmFsdWVzW2krK10gPSBjb252ZXJ0VmFsdWUoIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IHRrbnMubmV4dCgpICk7CisJCQl2YWx1ZSA9IG51bGw7CisJCX0KKwkJcmV0dXJuIHZhbHVlczsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gY2hlY2tWYWx1ZSggU3RyaW5nIHRva2VuLCBPYmplY3RbXSB2YWx1ZXMgKQorCXsKKwkJcmV0dXJuIHN1cGVyLmNoZWNrVmFsdWUoICJvcHRpb24gJyIrdG9TdHJpbmcoIHRva2VuICkrIiciLCB2YWx1ZXMgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdG9rZW4KKwkgKiBAcGFyYW0gdmFsdWVzCisJICogQHBhcmFtIGhpZGRlbk9rCisJICogQHJldHVybiB2YWx1ZSByZXR1cm5lZCBieSBjYWxsZWQgbWV0aG9kLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gZGVsaXZlclZhbHVlKCBTdHJpbmcgdG9rZW4sIE9iamVjdFtdIHZhbHVlcywgYm9vbGVhbiBoaWRkZW5PayApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlpZiAoIWNoZWNrT2tUb0RlbGl2ZXIoIHRva2VuLCBoaWRkZW5PayApKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJaWYgKGlzQXJyYXkpCisJCQkJcmV0dXJuIGNhbGxNZXRob2QoIGdldEFyZ3MoIHRva2VuLCB2YWx1ZXMgKSApOworCQkJCisJCQlyZXR1cm4gY2FsbE1ldGhvZCggZ2V0QXJncyggdG9rZW4sIHZhbHVlcyAhPSBudWxsID8gdmFsdWVzWzBdIDogbnVsbCApICk7CisJCX0KKwkJY2F0Y2ggKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUgKQorCQl7CisJCQlUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisJCQlpZiAodCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKKwkJCQl0aHJvdyAoRXhjZXB0aW9uKSB0OworCQkJaWYgKHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQorCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0OworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJjYXVnaHQgZXhjZXB0aW9uOiAiK3QsIHQgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSB0b2tlbgorCSAqIEBwYXJhbSBoaWRkZW5PaworCSAqIEByZXR1cm4gZmFsc2UgaWYgZmxhZ3MgcHJldmVudCBkZWxpdmVyeSBvZiB0aGUgb3B0aW9uIHZhbHVlLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBjaGVja09rVG9EZWxpdmVyKCBTdHJpbmcgdG9rZW4sIGJvb2xlYW4gaGlkZGVuT2sgKQorCXsKKwkJLy8gYWxsb3cgaGlkZGVuIG9wdGlvbiB0byBiZSBzcGVjaWZpZWQuIGp1c3QgZG9uJ3Qgc2hvdyBpdCBpbiBoZWxwLgorLy8JCWlmIChpc0hpZGRlbigpICYmICFoaWRkZW5PaykKKy8vCQl7CisvLwkJCWdldENvbW1hbmRQYXJzZXIoKS5yZXBvcnQoICJvcHRpb24gJyIrdG9TdHJpbmcoIHRva2VuICkrIicgbm90IGFsbG93ZWQiLCBudWxsLCBudWxsICk7CisvLwkJCXJldHVybiBmYWxzZTsKKy8vCQl9CisJCQorCQlpZiAoZ2V0Q29tbWFuZFBhcnNlcigpLmlzQWxyZWFkeVNwZWNpZmllZCggdGhpcywgdHJ1ZSApICYmIGlzU2luZ2xldG9uKCkpCisJCXsKKwkJCWdldENvbW1hbmRQYXJzZXIoKS5yZXBvcnQoICJvcHRpb24gJyIrdG9TdHJpbmcoIHRva2VuICkrIicgbm90IGFsbG93ZWQgbW9yZSB0aGFuIG9uY2UiLCBudWxsLCBudWxsICk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0b2tlbgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEByZXR1cm4gdGhlIGFyZ3MgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorCSAqLworCXByb3RlY3RlZCBPYmplY3RbXSBnZXRBcmdzKCBTdHJpbmcgdG9rZW4sIE9iamVjdCB2YWx1ZSApCisJeworCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgZ2V0Q29tbWFuZFBhcnNlcigpLCB0aGlzLCB0b2tlbiwgdmFsdWUgfTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL09yQ29uc3RyYWludC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9PckNvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzVkZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9PckNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIE9yQ29uc3RyYWludC4KKyAqLworcHVibGljIGNsYXNzIE9yQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBPckNvbnN0cmFpbnQuCisJICogQHBhcmFtIGEKKwkgKiBAcGFyYW0gYgorCSAqLworCXB1YmxpYyBPckNvbnN0cmFpbnQoIENvbnN0cmFpbnQgYSwgQ29uc3RyYWludCBiICkKKwl7CisJCXRoaXMuYSA9IGE7CisJCXRoaXMuYiA9IGI7CisJfQorCQorCXByaXZhdGUgZmluYWwgQ29uc3RyYWludCBhOworCQorCXByaXZhdGUgZmluYWwgQ29uc3RyYWludCBiOworCQorCXB1YmxpYyB2b2lkIGNoZWNrVmFsdWUoIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlhLmNoZWNrVmFsdWUoIHZhbHVlICk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZWEgKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQliLmNoZWNrVmFsdWUoIHZhbHVlICk7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlYiApCisJCQl7CisJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbiggImZhaWxlZCBib3RoIGNvbnN0cmFpbnRzOiAiKworCQkJCQllYS5nZXRNZXNzYWdlKCkrIiBBTkQgIitlYi5nZXRNZXNzYWdlKCkgKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiAiKCIrYSsiKSBPUiAoIitiKyIpIjsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1BhcmFtZXRlci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9QYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRhMTBkCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKKy8qKgorICogQSBjb21tYW5kIGxpbmUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGJ5IHBvc2l0aW9uLiBBIHBhcmFtZXRlcgorICogaXMgZGVwZW5kZW50IHVwb24gcG9zaXRpb24gb24gdGhlIGNvbW1hbmQgbGluZSB0byBiZSByZWNvZ25pemVkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgT3B0UGFyYW1CYXNlCit7CisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIHBhcmFtcworCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBpc1JlcXVpcmVkCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBQYXJhbWV0ZXIoIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLAorCQlDbGFzczw/PltdIHBhcmFtcywgU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIGlzUmVxdWlyZWQsCisJCUNvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBjcCwgbmFtZSwgbWV0aG9kLCBwYXJhbXMsIGRlc2NyaXB0aW9uLCBpc1JlcXVpcmVkLCBjb25zdHJhaW50ICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gZ2V0TmFtZXMoKVswXTsKKwl9CisKKwkvLy8vLy8vLy8vCisJLy8gSEVMUCAvLworCS8vLy8vLy8vLy8KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNob3dTaG9ydERlc2NyaXB0aW9uKCkKKwl7CisJCVN5c3RlbS5lcnIucHJpbnQoICcgJyApOworCQlTeXN0ZW0uZXJyLnByaW50KCBnZXROYW1lcygpWzBdICk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2hvd0xvbmdEZXNjcmlwdGlvbigpCisJeworCQlTeXN0ZW0uZXJyLnByaW50KCBOQU1FX0ZMQUcgKTsKKwkJU3lzdGVtLmVyci5wcmludGxuKCBnZXROYW1lcygpWzBdICk7CisJCQorCQlzaG93RGVzY3JpcHRpb24oKTsKKwkJCisJCXNob3dJc1JlcXVpcmVkKCk7CisJCQorCQlzaG93Q29uc3RyYWludCgpOworCX0KKworCS8vLy8vLy8vLy8vCisJLy8gVkFMVUUgLy8KKwkvLy8vLy8vLy8vLworCisJLyoqCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBvaywgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGNoZWNrVmFsdWUoIE9iamVjdCB2YWx1ZSApCisJeworCQlyZXR1cm4gc3VwZXIuY2hlY2tWYWx1ZSggInBhcmFtZXRlciAnIit0b1N0cmluZygpKyInIiwKKwkJCW5ldyBPYmplY3RbXSB7IHZhbHVlIH0gKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiBAcmV0dXJuIHZhbHVlIHJldHVybmVkIGJ5IGNhbGxlZCBtZXRob2QuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBkZWxpdmVyVmFsdWUoIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlyZXR1cm4gY2FsbE1ldGhvZCggZ2V0QXJncyggdmFsdWUgKSApOworCQl9CisJCWNhdGNoICggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlICkKKwkJeworCQkJVGhyb3dhYmxlIHggPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOworCQkJaWYgKHggaW5zdGFuY2VvZiBFeGNlcHRpb24pCisJCQkJdGhyb3cgKEV4Y2VwdGlvbikgeDsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCB4ICk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybiB0aGUgYXJncyB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisJICovCisJcHJpdmF0ZSBPYmplY3RbXSBnZXRBcmdzKCBPYmplY3QgdmFsdWUgKQorCXsKKwkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGdldENvbW1hbmRQYXJzZXIoKSwgdGhpcywgdmFsdWUgfTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1Bhcml0eUNvbnN0cmFpbnQuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvUGFyaXR5Q29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYWMxNzUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1Bhcml0eUNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIFBhcml0eUNvbnN0cmFpbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJpdHlDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludAoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFBhcml0eUNvbnN0cmFpbnQuCisJICoKKwkgKiBAcGFyYW0gd2FudHNPZGQKKwkgKi8KKwlwdWJsaWMgUGFyaXR5Q29uc3RyYWludCggYm9vbGVhbiB3YW50c09kZCApCisJeworCQl0aGlzLndhbnRzT2RkID0gd2FudHNPZGQ7CisJfQorCQorCXByaXZhdGUgZmluYWwgYm9vbGVhbiB3YW50c09kZDsKKwkKKwlwdWJsaWMgdm9pZCBjaGVja1ZhbHVlKCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpbnQgdiA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7CisJCWJvb2xlYW4gdmFsdWVJc09kZCA9ICh2ICYgMSkgIT0gMDsKKwkJaWYgKHZhbHVlSXNPZGQgIT0gd2FudHNPZGQpCisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCB3YW50c09kZCA/ICJpcyBub3Qgb2RkIiA6ICJpcyBub3QgZXZlbiIgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiB3YW50c09kZCA/ICJtdXN0IGJlIG9kZCIgOiAibXVzdCBiZSBldmVuIjsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1Byb2dyYW0uamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvUHJvZ3JhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDA0MzEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1Byb2dyYW0uamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBQcm9ncmFtCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBQcm9ncmFtCit7CisJLyoqCisJICogQHBhcmFtIHByb2dyYW0KKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG1haW4oIGZpbmFsIFByb2dyYW0gcHJvZ3JhbSwgU3RyaW5nW10gYXJncyApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCUNvbW1hbmRQYXJzZXIgY3AgPSBuZXcgQ29tbWFuZFBhcnNlciggcHJvZ3JhbSApOworCQkKKwkJY3AuZGVmaW5lTnVsbE9wdGlvbiggcHJvZ3JhbS5nZXRIZWxwVG9rZW5zKCksICJkb0hlbHAiLAorCQkJInByaW50IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4iLAorCQkJT3B0aW9uLk5PTkUgKTsKKwkJCisJCXByb2dyYW0uZGVmaW5lT3B0aW9uc0FuZFBhcmFtZXRlcnMoIGNwICk7CisJCQorCQlpZiAoIWNwLnBhcnNlKCBhcmdzICkpCisJCXsKKwkJCXByb2dyYW0uZXhpdCggMSwgcHJvZ3JhbS50b1N0cmluZygpLCAiY21kTGluZVBhcnNlRmFpbHVyZSIsIHRydWUgKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKAorCQkJbmV3IFRocmVhZCgpCisJCQl7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCQl7CisJCQkJCXByb2dyYW0uc2h1dGRvd24oIHByb2dyYW0uc2h1dGRvd25Tb3VyY2UsCisJCQkJCQlwcm9ncmFtLnNodXRkb3duUmVhc29uLCBwcm9ncmFtLnNodXRkb3duRW1lcmdlbmN5ICk7CisJCQkJfQorCQkJfSk7CisJCQorCQlwcm9ncmFtLnJ1bigpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb2RlIHRoZSBleGl0IGNvZGUuCisJICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIG9mIHRoZSByZXF1ZXN0LgorCSAqIEBwYXJhbSByZWFzb24gdGhlIHJlYXNvbiBmb3IgdGhlIHJlcXVlc3QuCisJICogQHBhcmFtIGVtZXJnZW5jeSBwZXJmb3JtIG1pbmltYWwgc2h1dGRvd24gaWYgdHJ1ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGl0KCBpbnQgY29kZSwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHJlYXNvbiwKKwkJYm9vbGVhbiBlbWVyZ2VuY3kgKQorCXsKKwkJc2h1dGRvd25Tb3VyY2UgPSBzb3VyY2U7CisJCXNodXRkb3duUmVhc29uID0gcmVhc29uOworCQlzaHV0ZG93bkVtZXJnZW5jeSA9IGVtZXJnZW5jeTsKKwkJU3lzdGVtLmV4aXQoIGNvZGUgKTsKKwl9CisJCisJLyoqCisJICogVGhlIHNvdXJjZSBvZiB0aGUgcmVxdWVzdC4KKwkgKi8KKwlTdHJpbmcgc2h1dGRvd25Tb3VyY2UgPSAicnVudGltZSI7CisJCisJLyoqCisJICogVGhlIHJlYXNvbiBmb3IgdGhlIHJlcXVlc3QuCisJICovCisJU3RyaW5nIHNodXRkb3duUmVhc29uID0gInVua25vd24iOworCQorCS8qKgorCSAqIEZ1bGwgc2h1dGRvd24gKGZhbHNlKSBvciBtaW5pbWFsICh0cnVlKT8KKwkgKi8KKwlib29sZWFuIHNodXRkb3duRW1lcmdlbmN5ID0gZmFsc2U7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHRva2VucyB0aGUgdXNlciBtaWdodCBzcGVjaWZ5IHRvIGdldCBoZWxwLgorCSAqIFRoZSBkZWZhdWx0IGxpc3Qgb2YgdG9rZW5zIGlzICItaHwtLWhlbHAiLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscFRva2VucygpCisJeworCQlyZXR1cm4gIi1ofC0taGVscCI7CisJfQorCisJLyoqCisJICogUHJpbnRzIHRoZSBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBwcm9ncmFtLgorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSBvcHRpb24KKwkgKiBAcGFyYW0gdG9rZW4KKwkgKiBAcmV0dXJuIGZhbHNlIGluZGljYXRpbmcgdGhlIHByb2dyYW0gc2hvdWxkIGV4aXQuCisJICovCisJcHVibGljIGJvb2xlYW4gZG9IZWxwKCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4gKQorCXsKKwkJY3Auc2hvd0hlbHAoIGZhbHNlICk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS50b1N0cmluZygpOworCX0KKwkKKwkvKioKKwkgKiBHaXZlcyB0aGUgcHJvZ3JhbSBhIGNoYW5jZSB0byBkZWZpbmUgaXRzIG9wdGlvbnMgYW5kIHBhcmFtZXRlcnMuCisJICogQHBhcmFtIGNwCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkZWZpbmVPcHRpb25zQW5kUGFyYW1ldGVycyggQ29tbWFuZFBhcnNlciBjcCApCisJCXRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogUnVucyB0aGUgcHJvZ3JhbSBhZnRlciBzdWNjZXNzZnVsIGNvbW1hbmQgbGluZSBwYXJzaW5nLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBTaHV0cyBkb3duIHRoZSBwcm9ncmFtIGluIGFuIG9yZGVybHkgd2F5IHdoZW4gU3lzdGVtLmV4aXQgaXMgY2FsbGVkLAorCSAqIG9yIHdoZW4gdGhlIHByb2dyYW0gaXMga2lsbGVkIGJ5IGV4dGVybmFsIGNvbW1hbmQgKF5DKSBvciB1bml4IGtpbGwuCisJICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIG9mIHRoZSByZXF1ZXN0CisJICogQHBhcmFtIHJlYXNvbiB0aGUgcmVhc29uIGZvciB0aGUgc2h1dGRvd24KKwkgKiBAcGFyYW0gZW1lcmdlbmN5IG9ubHkgYSBtaW5pbWFsIGFtb3VudCBvZiBzaHV0ZG93biBzaG91bGQgYmUgcGVyZm9ybWVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2h1dGRvd24oIFN0cmluZyBzb3VyY2UsIFN0cmluZyByZWFzb24sIGJvb2xlYW4gZW1lcmdlbmN5ICkKKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9TdHJpbmdBcnJheUl0ZXJhdG9yLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1N0cmluZ0FycmF5SXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDU4MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9TdHJpbmdBcnJheUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbHkgYW4gSXRlcmF0b3IgZm9yIFN0cmluZ1tdLgorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nQXJyYXlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFN0cmluZz4KK3sKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nQXJyYXlJdGVyYXRvciggU3RyaW5nW10gYXJyYXkgKQorCXsKKwkJdGhpcy5hcnJheSA9IGFycmF5OworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGFycmF5OworCQorCXByaXZhdGUgaW50IGluZGV4OworCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNoYXNOZXh0KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKwl7CisJCXJldHVybiBpbmRleCA8IGFycmF5Lmxlbmd0aDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IjbmV4dCgpCisJICovCisJcHVibGljIFN0cmluZyBuZXh0KCkKKwl7CisJCWlmIChpbmRleCA+PSBhcnJheS5sZW5ndGgpCisJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkKKwkJcmV0dXJuIGFycmF5W2luZGV4KytdOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNyZW1vdmUoKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZSgpCisJeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1N0cmluZ0FycmF5T3B0aW9uLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1N0cmluZ0FycmF5T3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ZWRkMgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvU3RyaW5nQXJyYXlPcHRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIEFuIG9wdGlvbiB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZy4KKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0FycmF5T3B0aW9uIGV4dGVuZHMgT3B0aW9uCit7CisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIHRva2VucworCSAqIEBwYXJhbSBuYW1lcworCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZmxhZ3MKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlcworCSAqIEBwYXJhbSBjb25zdHJhaW50cworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cmluZ0FycmF5T3B0aW9uKCBDb21tYW5kUGFyc2VyIGNwLCBTdHJpbmcgdG9rZW5zLCBTdHJpbmdbXSBuYW1lcywKKwkJU3RyaW5nIG1ldGhvZCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIFN0cmluZ1tdIGRlZmF1bHRWYWx1ZXMsCisJCUNvbnN0cmFpbnRbXSBjb25zdHJhaW50cyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBjcCwgdG9rZW5zLCBuYW1lcywgbWV0aG9kLCBQQVJBTVMsIGRlc2NyaXB0aW9uLCBmbGFncywKKwkJCWRlZmF1bHRWYWx1ZXMsIGNvbnN0cmFpbnRzICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gUEFSQU1TID0KKwkJeyBDb21tYW5kUGFyc2VyLmNsYXNzLCBPcHRpb24uY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0W10uY2xhc3MgfTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJcmV0dXJuIHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvU3RyaW5nTGVuZ3RoQ29uc3RyYWludC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9TdHJpbmdMZW5ndGhDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyMDk2MgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvU3RyaW5nTGVuZ3RoQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgU3RyaW5nTGVuZ3RoQ29uc3RyYWludAorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nTGVuZ3RoQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBTdHJpbmdMZW5ndGhDb25zdHJhaW50LgorCSAqCisJICogQHBhcmFtIG1pbiB0aGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkLgorCSAqIAorCSAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nTGVuZ3RoQ29uc3RyYWludCggaW50IG1pbiwgaW50IG1heCApCisJeworCQlpZiAobWluID4gbWF4KQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIm1pbiA+IG1heCIgKTsKKwkJdGhpcy5taW4gPSBtaW47CisJCXRoaXMubWF4ID0gbWF4OworCX0KKwkKKwlwcml2YXRlIGZpbmFsIGludCBtaW47CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgbWF4OworCQorCXB1YmxpYyB2b2lkIGNoZWNrVmFsdWUoIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludCB2ID0gKChTdHJpbmcpIHZhbHVlKS5sZW5ndGgoKTsKKwkJaWYgKHYgPCBtaW4gfHwgdiA+IG1heCkKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oICJsZW5ndGggbm90IGluIHJhbmdlICIrbWluKyIgdG8gIittYXggKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiAibGVuZ3RoIG11c3QgYmUgaW4gcmFuZ2UgIittaW4rIiB0byAiK21heDsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1N0cmluZ09wdGlvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9TdHJpbmdPcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzUwOTkwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9TdHJpbmdPcHRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCisvKioKKyAqIEFuIG9wdGlvbiB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZy4KKyAqLworcHVibGljIGNsYXNzIFN0cmluZ09wdGlvbiBleHRlbmRzIE9wdGlvbgoreworCS8qKgorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSB0b2tlbnMKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZmxhZ3MKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogQHBhcmFtIGNvbnN0cmFpbnQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBTdHJpbmdPcHRpb24oIENvbW1hbmRQYXJzZXIgY3AsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBuYW1lLCBTdHJpbmcgbWV0aG9kLAorCQlTdHJpbmcgZGVzY3JpcHRpb24sIGludCBmbGFncywgU3RyaW5nIGRlZmF1bHRWYWx1ZSwgQ29uc3RyYWludCBjb25zdHJhaW50ICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNwLCB0b2tlbnMsIG5hbWUsIG1ldGhvZCwgUEFSQU1TLCBkZXNjcmlwdGlvbiwgZmxhZ3MsCisJCQlkZWZhdWx0VmFsdWUsIGNvbnN0cmFpbnQgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBQQVJBTVMgPQorCQl7IENvbW1hbmRQYXJzZXIuY2xhc3MsIE9wdGlvbi5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MgfTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJcmV0dXJuIHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvU3RyaW5nUGFyYW1ldGVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1N0cmluZ1BhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGI2OTkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1N0cmluZ1BhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKKy8qKgorICogQSBwYXJhbWV0ZXIgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIKK3sKKwkvKioKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gaXNSZXF1aXJlZAorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgU3RyaW5nUGFyYW1ldGVyKCBDb21tYW5kUGFyc2VyIGNwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwKKwkJU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIGlzUmVxdWlyZWQsIENvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBjcCwgbmFtZSwgbWV0aG9kLCBQQVJBTVMsIGRlc2NyaXB0aW9uLCBpc1JlcXVpcmVkLCBjb25zdHJhaW50ICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gUEFSQU1TID0KKwkJeyBDb21tYW5kUGFyc2VyLmNsYXNzLCBQYXJhbWV0ZXIuY2xhc3MsIFN0cmluZy5jbGFzcyB9OworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb252ZXJ0VmFsdWUoIFN0cmluZyB2YWx1ZSApCisJeworCQlyZXR1cm4gdmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9VcmxPcHRpb24uamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvVXJsT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiYmM4YgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvVXJsT3B0aW9uLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKKworLyoqCisgKiBBbiBvcHRpb24gd2hvc2UgdmFsdWUgaXMgYSB1cmwuCisgKi8KK3B1YmxpYyBjbGFzcyBVcmxPcHRpb24gZXh0ZW5kcyBPcHRpb24KK3sKKwkvKioKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gdG9rZW5zCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGZsYWdzCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgVXJsT3B0aW9uKCBDb21tYW5kUGFyc2VyIGNwLCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgbmFtZSwKKwkJU3RyaW5nIG1ldGhvZCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZmxhZ3MsIFVSTCBkZWZhdWx0VmFsdWUsCisJCUNvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBjcCwgdG9rZW5zLCBuYW1lLCBtZXRob2QsIFBBUkFNUywgZGVzY3JpcHRpb24sIGZsYWdzLAorCQkJZGVmYXVsdFZhbHVlLCBjb25zdHJhaW50ICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gUEFSQU1TID0KKwkJeyBDb21tYW5kUGFyc2VyLmNsYXNzLCBPcHRpb24uY2xhc3MsIFN0cmluZy5jbGFzcywgVVJMLmNsYXNzIH07CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRWYWx1ZSggU3RyaW5nIHZhbHVlICkKKwl7CisJCXJldHVybiBuZXcgVVJMKCB2YWx1ZSApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvVXJsUGFyYW1ldGVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1VybFBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTU3NzQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY21kL1VybFBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jbWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CisKKy8qKgorICogQSBwYXJhbWV0ZXIgd2hvc2UgdmFsdWUgaXMgYSB1cmwuCisgKi8KK3B1YmxpYyBjbGFzcyBVcmxQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIKK3sKKwkvKioKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBtZXRob2QKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gaXNSZXF1aXJlZAorCSAqIEBwYXJhbSBjb25zdHJhaW50CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgVXJsUGFyYW1ldGVyKCBDb21tYW5kUGFyc2VyIGNwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1ldGhvZCwKKwkJU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIGlzUmVxdWlyZWQsIENvbnN0cmFpbnQgY29uc3RyYWludCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN1cGVyKCBjcCwgbmFtZSwgbWV0aG9kLCBQQVJBTVMsIGRlc2NyaXB0aW9uLCBpc1JlcXVpcmVkLCBjb25zdHJhaW50ICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gUEFSQU1TID0KKwkJeyBDb21tYW5kUGFyc2VyLmNsYXNzLCBQYXJhbWV0ZXIuY2xhc3MsIFVSTC5jbGFzcyB9OworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb252ZXJ0VmFsdWUoIFN0cmluZyB2YWx1ZSApCisJeworCQlyZXR1cm4gbmV3IFVSTCggdmFsdWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9XaG8uamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL1doby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWYyMzUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9XaG8uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZTsKKworLyoqCisgKiBBYnN0cmFjdGlvbiBvZiBzZW5kZXIgdXNlZCBieSB0aGUgdmFyaW91cyBzb3VyY2VzIG9mIGRhdGEsCisgKiBwYWNrZXRzLCBvciBtZXNzYWdlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBXaG8KK3sKKwkvLyBub3RoaW5nIGVsc2UuCit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9Db25uZWN0aW9uLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9Db25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkNmQzOAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL0Nvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDM0OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUnVubmVySGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Ub2RvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRvZG9NYW5hZ2VyOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgcnVubmVyIHdoaWNoIGhhbmRsZXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gPEg+IHRoZSBldmVudCBoYW5kbGVyIHR5cGUuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBDb25uZWN0aW9uPEggZXh0ZW5kcyBTZXNzaW9uPgorCWV4dGVuZHMgUnVubmVyIGltcGxlbWVudHMgVHJhbnNwb3J0PEg+LCBSdW5uZXJIYW5kbGVyCit7CisJLy8vLy8vLy8vLy8vLworCS8vIFFVRVJJRVMgLy8KKwkvLy8vLy8vLy8vLy8vCisKKwkvKiogU291cmNlIHF1ZXJ5IHRvIGdldCB0aGUgbG9jYWwgYWRkcmVzcy4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9BRERSRVNTID0gIkxPQ0FMX0FERFJFU1MiOworCisJLyoqIFNvdXJjZSBxdWVyeSB0byBnZXQgdGhlIHJlbW90ZSBhZGRyZXNzLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9BRERSRVNTID0gIlJFTU9URV9BRERSRVNTIjsKKwkKKwkvLy8vLy8vLy8vLy8KKwkvLyBFVkVOVFMgLy8KKwkvLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEhvc3QgbmFtZSB0byBzcGVjaWZ5IHRvIHNlbGVjdCBsaXN0ZW5pbmcgb24gYWxsIGludGVyZmFjZXMuCisJICogVGhlIHZhbHVlIGlzICIwLjAuMC4wIi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfSU5URlMgPSAiMC4wLjAuMCI7CisJCisJLyoqCisJICogQHBhcmFtIHMKKwkgKiBAcmV0dXJuIG51bGwgaWYgcyBpcyBudWxsIG9yIEFMTF9JTlRGUyAoIjAuMC4wLjAiKS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVIb3N0KCBTdHJpbmcgcyApCisJeworCQlpZiAocyAhPSBudWxsICYmIHMuZXF1YWxzKCBBTExfSU5URlMgKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gczsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBDb25uZWN0aW9uLgorCSAqLworCXB1YmxpYyBDb25uZWN0aW9uKCkKKwl7CisJCXNldEhhbmRsZXIoIHRoaXMgKTsKKwl9CisJCisJcHVibGljIHZvaWQgc3RhcnRlZCgpCisJeworCQkvLyBpZ25vcmUKKwl9CisJCisJcHVibGljIHZvaWQgc3RvcHBlZCgpCisJeworCQkvLyBpZ25vcmUKKwl9CisKKwlwdWJsaWMgdm9pZCBleGNlcHRpb24oIFN0cmluZyB3aGF0LCBmaW5hbCBFeGNlcHRpb24gZSApCisJeworCQlUb2RvTWFuYWdlci5hZGRUb2RvKCBuZXcgVG9kbygpCisJCXsKKwkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG0gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBlICk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIGV4Y2VwdGlvbiggVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZXggKQorCQkJeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJaWYgKGV4ICE9IGUpCisJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9ICk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcnVuMCggYm9vbGVhbiBmaXJzdCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWJvb2xlYW4gb2sgPSBvcGVuU29ja2V0KCAhZmlyc3QgKTsKKy8vCQlMb2cucmVwb3J0KCAib3BlblNvY2tldERvbmUiLCAicmVzdWx0Iiwgb2ssICJjIiwgdGhpcywgInQiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpICk7CisJCWlmICghb2spCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQl0cnkKKwkJeworCQkJc2V0dXBTb2NrZXQoKTsKKy8vCQkJTG9nLnJlcG9ydCggInNldHVwU29ja2V0RG9uZSIsICJjIiwgdGhpcyApOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlmaXJlRXhjZXB0aW9uKCAic2V0dXAiLCBlICk7CisJCQljbG9zZSggdHJ1ZSApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQl0cnkKKwkJeworLy8JCQlMb2cucmVwb3J0KCAiYmVmb3JlRmlyZVVwIiwgImMiLCB0aGlzICk7CisJCQlmaXJlVXAoKTsKKwkJCXJlYWRTb2NrZXQoKTsKKy8vCQkJTG9nLnJlcG9ydCggInJlYWRTb2NrZXREb25lIiwgImMiLCB0aGlzICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQljYXRjaCAoIFNvY2tldEV4Y2VwdGlvbiBlICkKKwkJeworLy8JCQlMb2cucmVwb3J0KCAicmVhZFNvY2tldERvbmUiLCAiYyIsIHRoaXMsICJlIiwgZSApOworCQkJCisJCQlpZiAoInNvY2tldCBjbG9zZWQiLmVxdWFsc0lnbm9yZUNhc2UoIGUuZ2V0TWVzc2FnZSgpICkpCisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWZpcmVFeGNlcHRpb24oICJydW4iLCBlICk7CisJCQljbG9zZSggdHJ1ZSApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCWZpcmVFeGNlcHRpb24oICJydW4iLCBlICk7CisJCQljbG9zZSggdHJ1ZSApOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJZmluYWxseQorCQl7CisvLwkJCUxvZy5yZXBvcnQoICJiZWZvcmVGaXJlRG93biIsICJjIiwgdGhpcyApOworCQkJZmlyZURvd24oKTsKKwkJCWNsb3NlKCBmYWxzZSApOworLy8JCQlMb2cucmVwb3J0KCAiY2xvc2VEb25lIiwgImMiLCB0aGlzICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPcGVucyB0aGUgc29ja2V0IG9mIGEgY29ubmVjdGlvbi4KKwkgKiBAcGFyYW0gcmVjb25uZWN0IHRydWUgaWYgd2UgYXJlIHRyeWluZyB0byByZWNvbm5lY3QsIGZhbHNlIGlmIHRoaXMKKwkgKiBpcyB0aGUgZmlyc3QgdGltZS4KKwkgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIHJlY29ubmVjdCwgZmFsc2UgaWYgd2Ugc2hvdWxkIHN0b3AuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBvcGVuU29ja2V0KCBib29sZWFuIHJlY29ubmVjdCApIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogU2V0cyB1cCBhIG5ld2x5IG9wZW5lZCBzb2NrZXQuIFRoaXMgbWF5IGludm9sdmUgc2V0dGluZyBzb2NrZXQKKwkgKiBvcHRpb25zIGFuZCBvcGVuaW5nIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHNldHVwU29ja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFBlcmZvcm1zIHRoZSB1c3VhbCBhbmQgY3VzdG9tYXJ5IG9wZXJhdGlvbnMgb24gYSBzb2NrZXQsIHN1Y2gKKwkgKiBhcyByZWFkIG9yIGFjY2VwdC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHJlYWRTb2NrZXQoKSB0aHJvd3MgRXhjZXB0aW9uOworCisJLyoqCisJICogVGVybWluYXRlcyBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQuCisJICogQHBhcmFtIHJlc2V0IHRydWUgaWYgdGhlIHNvY2tldCBzaG91bGQgYmUgdGVybWluYXRlZCBpbW1lZGlhdGVseS4KKwkgKiBGYWxzZSBpZiB0aGUgcGVuZGluZyBvdXRwdXQgZGF0YSBzaG91bGQgYmUgYWxsb3dlZCB0byBsaW5nZXIuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBjbG9zZSggYm9vbGVhbiByZXNldCApIHRocm93cyBFeGNlcHRpb247CisKKwkvKioKKwkgKiBUZXJtaW5hdGVzIG9wZXJhdGlvbnMgb24gdGhlIHNvY2tldC4gU2FtZSBhcyBjbG9zZSggZmFsc2UgKTsKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqIEBzZWUgI2Nsb3NlKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQljbG9zZSggZmFsc2UgKTsKKwl9CisJCisJcHVibGljIE9iamVjdCB0cmFuc3BvcnRRdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHF1ZXJ5ID09IExPQ0FMX0FERFJFU1MpCisJCQlyZXR1cm4gbG9jYWxBZGRyZXNzKCk7CisKKwkJaWYgKHF1ZXJ5ID09IFJFTU9URV9BRERSRVNTKQorCQkJcmV0dXJuIHJlbW90ZUFkZHJlc3MoKTsKKwkJCisJCWlmIChxdWVyeSBpbnN0YW5jZW9mIFdhaXRVcCkKKwkJeworCQkJd2FpdFVwKCAoKFdhaXRVcCkgcXVlcnkpLm1heERlbGF5ICk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJaWYgKHF1ZXJ5IGluc3RhbmNlb2YgV2FpdERvd24pCisJCXsKKwkJCXdhaXREb3duKCAoKFdhaXREb3duKSBxdWVyeSkubWF4RGVsYXkgKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIHF1ZXJ5OiAiK3F1ZXJ5ICk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbG9jYWwgYWRkcmVzcworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgU29ja2V0QWRkcmVzcyBsb2NhbEFkZHJlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSByZW1vdGUgYWRkcmVzcworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgU29ja2V0QWRkcmVzcyByZW1vdGVBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCQorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoY29udHJvbCA9PSBTVEFSVCkKKwkJeworCQkJc3RhcnQoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb250cm9sID09IFNUQVJUX0FORF9XQUlUX1VQKQorCQl7CisJCQlzdGFydCgpOworCQkJd2FpdFVwKCAoSW50ZWdlcikgdmFsdWUgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb250cm9sID09IFNUT1ApCisJCXsKKwkJCXN0b3AoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb250cm9sID09IFNUT1BfQU5EX1dBSVRfRE9XTikKKwkJeworCQkJc3RvcCgpOworCQkJd2FpdERvd24oIChJbnRlZ2VyKSB2YWx1ZSApOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoY29udHJvbCA9PSBSRVNFVCkKKwkJeworCQkJY2xvc2UoIHRydWUgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gY29udHJvbDogIitjb250cm9sICk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisKKwlwcml2YXRlIHZvaWQgZmlyZVVwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3RhdHVzLnNldCggU2Vzc2lvbi5VUCApOworCQlUb2RvTWFuYWdlci5hZGRUb2RvKCBuZXcgVG9kbygpCisJCXsKKwkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG0gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLlVQICk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIGV4Y2VwdGlvbiggVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfSApOworCX0KKworCXByaXZhdGUgdm9pZCBmaXJlRG93bigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN0YXR1cy5zZXQoIFNlc3Npb24uRE9XTiApOworCQlUb2RvTWFuYWdlci5hZGRUb2RvKCBuZXcgVG9kbygpCisJCXsKKwkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG0gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLkRPV04gKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgZXhjZXB0aW9uKCBUb2RvTWFuYWdlciBtZ3IsIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9ICk7CisJfQorCQorCXB1YmxpYyBIIGdldFNlc3Npb24oKQorCXsKKwkJcmV0dXJuIHNlc3Npb247CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIEggc2Vzc2lvbiApCisJeworCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBUaGUgc2Vzc2lvbiBmb3IgdGhlIGNvbm5lY3Rpb24uCisJICovCisJcHJvdGVjdGVkIEggc2Vzc2lvbjsKKwkKKwkvKioKKwkgKiBXYWl0cyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyB1cC4KKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHdhaXRVcCggaW50IG1heERlbGF5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3RhdHVzLndhaXRVbnRpbEVxKCBTZXNzaW9uLlVQLCBtYXhEZWxheSApOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbWF4RGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHdhaXREb3duKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdGF0dXMud2FpdFVudGlsRXEoIFNlc3Npb24uRE9XTiwgbWF4RGVsYXkgKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBNb25pdG9yPFN0cmluZz4gc3RhdHVzID0gbmV3IE1vbml0b3I8U3RyaW5nPiggInN0YXR1cyIsIFNlc3Npb24uRE9XTiApOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vSW5ldFdoby5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vSW5ldFdoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzRkMDIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9JbmV0V2hvLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisKKworLyoqCisgKiBXaG8gZm9yIGFuIGluZXQgYWRkcmVzcyAvIHBvcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBJbmV0V2hvIGltcGxlbWVudHMgV2hvCit7CisJLyoqCisJICogQHBhcmFtIGFkZHIKKwkgKiBAcGFyYW0gcG9ydAorCSAqLworCXB1YmxpYyBJbmV0V2hvKCBJbmV0QWRkcmVzcyBhZGRyLCBpbnQgcG9ydCApCisJeworCQl0aGlzLmFkZHIgPSBhZGRyOworCQl0aGlzLnBvcnQgPSBwb3J0OworCX0KKwkKKwlwcml2YXRlIGZpbmFsIEluZXRBZGRyZXNzIGFkZHI7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGFkZHJlc3Mgb2Ygd2hvLgorCSAqLworCXB1YmxpYyBJbmV0QWRkcmVzcyBnZXRJbmV0QWRkcmVzcygpCisJeworCQlyZXR1cm4gYWRkcjsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBwb3J0IG9mIHdoby4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFBvcnQoKQorCXsKKwkJcmV0dXJuIHBvcnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFkZHIKKwkgKiBAcGFyYW0gcG9ydAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGFkZHIgYW5kIHBvcnQgbWF0Y2ggdGhpcyB3aG8uCisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyggSW5ldEFkZHJlc3MgYWRkciwgaW50IHBvcnQgKQorCXsKKwkJcmV0dXJuIGFkZHIuZXF1YWxzKCBhZGRyICkgJiYgcG9ydCA9PSBwb3J0OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9QYWNrZXRpemVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9QYWNrZXRpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MjRmOQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1BhY2tldGl6ZXIuamF2YQpAQCAtMCwwICsxLDMxMyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisKKy8qKgorICogUGFja2V0aXplcyBhIHN0cmVhbSBkYXRhIHNvdXJjZS4gUmVhZHMgYSBwYWNrZXQgaGVhZGVyOgorICogYSAzMi1iaXQgZmxhZyBhbmQgYSAzMi1iaXQgbGVuZ3RoLCBib3RoIGJpZy1lbmRpYW4sIHZlcmlmaWVzCisgKiB0aGUgZmxhZywgYW5kIHRoZW4sIHVzaW5nIHRoZSBsZW5ndGggZnJvbSB0aGUgaGVhZGVyLAorICogcmVhZHMgdGhlIHBhY2tldCBkYXRhIGFuZCBwYXNzZXMgaXQgdG8gdGhlIHBhY2tldCBoYW5kbGVyLgorICogQXMgYSBwYWNrZXQgc291cmNlLCBhY2NlcHRzIGEgcGFja2V0IGFuZCBwcmVwZW5kcyBhIHBhY2tldAorICogaGVhZGVyIHRvIGl0IGJlZm9yZSBkZWxpdmVyaW5nIGl0IHRvIGEgZGF0YSBzb3VyY2UuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYWNrZXRpemVyIGltcGxlbWVudHMgU2Vzc2lvbkRhdGEsIFRyYW5zcG9ydFBhY2tldAoreworCS8qKgorCSAqIFVSSSB0ZXJtIHRvIHNwZWNpZnkgbWF4IHBhY2tldCBzaXplLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BWF9QS1RfU0laRV9URVJNID0gIlBhY2tldGl6ZXIubWF4UGt0U2l6ZSI7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJRyA9IDB4ZGVhZGJlZWY7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhFQURFUl9TSVpFID0gODsKKwkKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBtYXhpbXVtIHBhY2tldCBzaXplIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCwgMTYzNzYgYnl0ZXMuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9NQVhfUEtUX1NJWkUgPSAxNjM4NCAtIEhFQURFUl9TSVpFOworCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFBhY2tldGl6ZXIgd2l0aCBudWxsIHBhY2tldCBoYW5kbGVyIGFuZCB1cmkgc3BlY2lmaWVkCisJICogb3IgZGVmYXVsdGVkIG1heGltdW0gcGFja2V0IHNpemUuCisJICogQHBhcmFtIHRyYW5zcG9ydCB1c2VkIHRvIGRlbGl2ZXIgZGF0YSB0byB0aGUgcGVlci4KKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqLworCXB1YmxpYyBQYWNrZXRpemVyKCBUcmFuc3BvcnREYXRhIHRyYW5zcG9ydCwgU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCB0cmFuc3BvcnQsIG5ldyBVUkwoIHVyaSApLCByZXNvdXJjZXMgKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgUGFja2V0aXplciB3aXRoIG51bGwgcGFja2V0IGhhbmRsZXIgYW5kIHVyaSBzcGVjaWZpZWQKKwkgKiBvciBkZWZhdWx0ZWQgbWF4aW11bSBwYWNrZXQgc2l6ZS4KKwkgKiAKKwkgKiBAcGFyYW0gdHJhbnNwb3J0IHVzZWQgdG8gZGVsaXZlciBkYXRhIHRvIHRoZSBwZWVyLgorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICogCisJICogQHNlZSAjTUFYX1BLVF9TSVpFX1RFUk0KKwkgKiBAc2VlICNERUZBVUxUX01BWF9QS1RfU0laRQorCSAqLworCXB1YmxpYyBQYWNrZXRpemVyKCBUcmFuc3BvcnREYXRhIHRyYW5zcG9ydCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCB0cmFuc3BvcnQsIHVyaS5nZXRJbnRlZ2VyVGVybSggTUFYX1BLVF9TSVpFX1RFUk0sIERFRkFVTFRfTUFYX1BLVF9TSVpFICkgKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBQYWNrZXRpemVyIHdpdGggdGhlIHNwZWNpZmllZCBwYWNrZXQgaGFuZGxlciBhbmQgbWF4aW11bQorCSAqIHBhY2tldCBzaXplLgorCSAqIAorCSAqIEBwYXJhbSBoYW5kbGVyIHRoZSBoYW5kbGVyIHRvIHJlY2VpdmUgdGhlIHBhY2tldHMuCisJICogCisJICogQHBhcmFtIG1heFBrdFNpemUgdGhlIG1heGltdW0gcGFja2V0IHNpemUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkLgorCSAqIE11c3QgYmUgPj0gMC4gSWYgbWF4UGt0U2l6ZSA9PSAwLCB0aGVyZSBpcyBubyBsaW1pdC4KKwkgKi8KKwlwcml2YXRlIFBhY2tldGl6ZXIoIFRyYW5zcG9ydERhdGEgdHJhbnNwb3J0LCBpbnQgbWF4UGt0U2l6ZSApCisJeworCQlpZiAobWF4UGt0U2l6ZSA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibWF4UGt0U2l6ZSA8IDAiICk7CisJCQorCQl0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKwkJdGhpcy5tYXhQa3RTaXplID0gbWF4UGt0U2l6ZTsKKwkJCisJCXRyYW5zcG9ydC5zZXRTZXNzaW9uKCB0aGlzICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgVHJhbnNwb3J0RGF0YSB0cmFuc3BvcnQ7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgbWF4UGt0U2l6ZTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0cmFuc3BvcnQuCisJICovCisJcHVibGljIFRyYW5zcG9ydERhdGEgZ2V0VHJhbnNwb3J0KCkKKwl7CisJCXJldHVybiB0cmFuc3BvcnQ7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJQYWNrZXRpemVyLyVzIiwgdHJhbnNwb3J0ICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbkRhdGEoIFdobyBzZW5kZXIsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGhlcmUgYXJlIHR3byBvcHRpb25zIGhlcmUuIG9uZSBpcyB0aGF0IHdlIGhhdmUgbm8gYnVmZmVyZWQgZGF0YQorCQkvLyBhbmQgdGhlIGVudGlyZSBwYWNrZXQgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgYnVmLiBpbiB0aGF0IGNhc2UKKwkJLy8gd2UgY291bGQgb3B0aW1pemUgdGhlIGRheWxpZ2h0cyBvdXQgb2YgdGhlIHByb2Nlc3MgYW5kIGRpcmVjdGx5CisJCS8vIGRyb3AgdGhlIHBhY2tldCBvbiB0aGUgaGFuZGxlci4KKwkJCisJCXdoaWxlIChidWYuYXZhaWwoKSA+IDApCisJCXsKKwkJCWlmICh3YW50SGVhZGVyKQorCQkJeworCQkJCS8vIGRvIHdlIGhhdmUgZW5vdWdoIHRvIG1ha2UgYSBoZWFkZXI/CisJCQkJCisJCQkJaWYgKHNhdmVkQnVmLmxlbmd0aCgpICsgYnVmLmF2YWlsKCkgPj0gSEVBREVSX1NJWkUpCisJCQkJeworCQkJCQlpbnQgcGt0U2l6ZTsKKwkJCQkJCisJCQkJCWlmIChzYXZlZEJ1Zi5sZW5ndGgoKSA9PSAwKQorCQkJCQl7CisJCQkJCQkvLyBzYXZlZEJ1ZiBpcyBlbXB0eSwgZW50aXJlIGhlYWRlciBpbiBidWYuCisJCQkJCQkKKwkJCQkJCXBrdFNpemUgPSBwcm9jZXNzSGVhZGVyKCBidWYsIGZhbHNlICk7CisJCQkJCX0KKwkJCQkJZWxzZSAvLyBoZWFkZXIgc3BsaXQgYWNyb3NzIHNhdmVkQnVmIGFuZCBidWYKKwkJCQkJeworCQkJCQkJLy8gbW92ZSBqdXN0IGVub3VnaCBkYXRhIGZyb20gYnVmIHRvIHNhdmVkQnVmIHRvIGhhdmUgYSBoZWFkZXIuCisJCQkJCQkKKwkJCQkJCWludCBuZWVkRnJvbUJ1ZiA9IEhFQURFUl9TSVpFIC0gc2F2ZWRCdWYubGVuZ3RoKCk7CisJCQkJCQlzYXZlZEJ1Zi5wdXQoIGJ1ZiwgbmVlZEZyb21CdWYgKTsKKwkJCQkJCXNhdmVkQnVmLnNldEluZGV4KCAwICk7CisJCQkJCQkKKwkJCQkJCXBrdFNpemUgPSBwcm9jZXNzSGVhZGVyKCBzYXZlZEJ1ZiwgdHJ1ZSApOworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAocGt0U2l6ZSA9PSAwKQorCQkJCQkJY29udGludWU7CisJCQkJCQorCQkJCQlib2R5TGVuID0gcGt0U2l6ZTsKKwkJCQkJd2FudEhlYWRlciA9IGZhbHNlOworCQkJCX0KKwkJCQllbHNlIC8vIHdhbnQgaGVhZGVyLCBidXQgdGhlcmUncyBub3QgZW5vdWdoIHRvIG1ha2UgaXQuCisJCQkJeworCQkJCQkvLyBzYXZlIGJ1ZiBpbiBzYXZlZEJ1Zi4KKwkJCQkJCisJCQkJCXNhdmVkQnVmLnNldEluZGV4KCBzYXZlZEJ1Zi5sZW5ndGgoKSApOworCQkJCQlzYXZlZEJ1Zi5wdXQoIGJ1ZiApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHNhdmVkQnVmLmxlbmd0aCgpICsgYnVmLmF2YWlsKCkgPj0gYm9keUxlbikKKwkJCXsKKwkJCQkvLyB3YW50IGJvZHksIGFuZCB0aGVyZSdzIGVub3VnaCB0byBtYWtlIGl0LgorCQkJCQorCQkJCS8vIHRocmVlIHBvc3NpYmxlIGNhc2VzOiB0aGUgYm9keSBpcyBlbnRpcmVseSBpbiBzYXZlZEJ1ZiwKKwkJCQkvLyB0aGUgYm9keSBpcyBzcGxpdCwgb3IgdGhlIGJvZHkgaXMgZW50aXJlbHkgaW4gYnVmLiBhc3NlcnQKKwkJCQkvLyB0aGF0IHRoZSBib2R5IGNhbm5vdCBlbnRpcmVseSBiZSBpbiBzYXZlZEJ1Ziwgb3IgZWxzZQorCQkJCS8vIHdlJ2QgaGF2ZSBwcm9jZXNzZWQgaXQgbGFzdCB0aW1lLgorCQkJCWFzc2VydCBzYXZlZEJ1Zi5sZW5ndGgoKSA8IGJvZHlMZW47CisJCQkJCisJCQkJaWYgKHNhdmVkQnVmLmxlbmd0aCgpID09IDApCisJCQkJeworCQkJCQkvLyBzYXZlZEJ1ZiBpcyBlbXB0eSwgZW50aXJlIGJvZHkgaW4gYnVmLgorCisJCQkJCWludCBsZW5ndGggPSBidWYubGVuZ3RoKCk7CisJCQkJCWludCBpbmRleCA9IGJ1Zi5pbmRleCgpOworCQkJCQlidWYuc2V0TGVuZ3RoKCBpbmRleCtib2R5TGVuICk7CisJCQkJCQorCQkJCQlzZXNzaW9uLnNlc3Npb25QYWNrZXQoIHNlbmRlciwgYnVmICk7CisJCQkJCQorCQkJCQlidWYuc2V0TGVuZ3RoKCBsZW5ndGggKTsKKwkJCQkJYnVmLnNldEluZGV4KCBpbmRleCtib2R5TGVuICk7CisJCQkJCQorCQkJCQl3YW50SGVhZGVyID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZSAvLyBib2R5IHNwbGl0IGFjcm9zcyBzYXZlZEJ1ZiBhbmQgYnVmCisJCQkJeworCQkJCQkvLyBtb3ZlIGp1c3QgZW5vdWdoIGRhdGEgZnJvbSBidWYgdG8gc2F2ZWRCdWYgdG8gaGF2ZSBhIGJvZHkuCisJCQkJCQorCQkJCQlpbnQgbmVlZEZyb21CdWYgPSBib2R5TGVuIC0gc2F2ZWRCdWYubGVuZ3RoKCk7CisJCQkJCXNhdmVkQnVmLnB1dCggYnVmLCBuZWVkRnJvbUJ1ZiApOworCQkJCQlzYXZlZEJ1Zi5zZXRJbmRleCggMCApOworCQkJCQkKKwkJCQkJc2Vzc2lvbi5zZXNzaW9uUGFja2V0KCBzZW5kZXIsIHNhdmVkQnVmICk7CisJCQkJCQorCQkJCQlzYXZlZEJ1Zi5yZXNldCgpOworCQkJCQl3YW50SGVhZGVyID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQllbHNlIC8vIHdhbnQgYm9keSwgYnV0IHRoZXJlJ3Mgbm90IGVub3VnaCB0byBtYWtlIGl0LgorCQkJeworCQkJCS8vIHNhdmUgYnVmIGluIHNhdmVkQnVmLgorCQkJCQorCQkJCXNhdmVkQnVmLnB1dCggYnVmICk7CisJCQl9CisJCX0KKwkJLy8gYnVmIGlzIG5vdyBlbXB0eSwgYW5kIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHRvIGRvLgorCQlhc3NlcnQgYnVmLmF2YWlsKCkgPT0gMDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgcHJvY2Vzc0hlYWRlciggRmxleEJ1ZmZlciBidWYsIGJvb2xlYW4gcmVzZXQgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisJCWludCBzaWcgPSBidWYuZ2V0SW50KCk7CisJCWlmIChzaWcgIT0gU0lHKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCAiYmFkIFNJRyIgKTsKKwkJCisJCWludCBwa3RTaXplID0gYnVmLmdldEludCgpOworCQkKKwkJaWYgKHJlc2V0KQorCQkJYnVmLnJlc2V0KCk7CisJCQorCQlpZiAocGt0U2l6ZSA8IDAgfHwgbWF4UGt0U2l6ZSA+IDAgJiYgcGt0U2l6ZSA+IG1heFBrdFNpemUpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJwa3RTaXplIDwgMCB8fCAobWF4UGt0U2l6ZSA+IDAgJiYgcGt0U2l6ZSA+IG1heFBrdFNpemUpIiApOworCQkKKwkJcmV0dXJuIHBrdFNpemU7CisgICAgfQorCisJcHJpdmF0ZSBib29sZWFuIHdhbnRIZWFkZXIgPSB0cnVlOworCQorCXByaXZhdGUgaW50IGJvZHlMZW47CisJCisJcHJpdmF0ZSBmaW5hbCBGbGV4QnVmZmVyIHNhdmVkQnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydFBhY2tldCggV2hvIHJlY2lwaWVudCwgRmxleEJ1ZmZlciBidWYgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBkYXRhLWl6ZSB0aGUgcGFja2V0LgorCQkKKwkJLy8gYXNzZXJ0IGluZGV4IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgaGVhZGVyLgorCQlpbnQgZGF0YVNpemUgPSBidWYuYXZhaWwoKTsKKwkJaWYgKGRhdGFTaXplIDwgSEVBREVSX1NJWkUpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiZGF0YVNpemUgPCBIRUFERVJfU0laRSIgKTsKKwkJCisJCWludCBwa3RTaXplID0gZGF0YVNpemUgLSBIRUFERVJfU0laRTsKKwkJaWYgKG1heFBrdFNpemUgPiAwICYmIHBrdFNpemUgPiBtYXhQa3RTaXplKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCAibWF4UGt0U2l6ZSA+IDAgJiYgcGt0U2l6ZSA+IG1heFBrdFNpemUiICk7CisJCQorCQlpbnQgaW5kZXggPSBidWYuaW5kZXgoKTsKKwkJYnVmLnB1dEludCggU0lHICk7CisJCWJ1Zi5wdXRJbnQoIHBrdFNpemUgKTsKKwkJYnVmLnNldEluZGV4KCBpbmRleCApOworCQl0cmFuc3BvcnQudHJhbnNwb3J0RGF0YSggcmVjaXBpZW50LCBidWYgKTsKKwl9CisKKwlwdWJsaWMgaW50IGhlYWRlclNpemUoKQorCXsKKwkJcmV0dXJuIEhFQURFUl9TSVpFOworCX0KKworCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gc2Vzc2lvbi5zZXNzaW9uUXVlcnkoIHF1ZXJ5ICk7CisJfQorCisJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzZXNzaW9uLnNlc3Npb25Db250cm9sKCBjb250cm9sLCB2YWx1ZSApOworCX0KKworCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggZXZlbnQgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNvdXJjZSBtZXRob2RzIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiB0cmFuc3BvcnQudHJhbnNwb3J0UXVlcnkoIHF1ZXJ5ICk7CisJfQorCisJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyYW5zcG9ydC50cmFuc3BvcnRDb250cm9sKCBjb250cm9sLCB2YWx1ZSApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdHJhbnNwb3J0LnRyYW5zcG9ydE5vdGlmeSggZXZlbnQgKTsKKwl9CisKKwlwdWJsaWMgU2Vzc2lvblBhY2tldCBnZXRTZXNzaW9uKCkKKwl7CisJCXJldHVybiBzZXNzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25QYWNrZXQgc2Vzc2lvbiApCisJeworCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCX0KKwkKKwlwcml2YXRlIFNlc3Npb25QYWNrZXQgc2Vzc2lvbjsKK30KKwpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vU2Vzc2lvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWFhMzcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9TZXNzaW9uLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKKy8qKgorICogT3V0LW9mLWJhbmQgcXVlcnksIGNvbnRyb2wsIGFuZCBub3RpZmljYXRpb24gaW50ZXJmYWNlIGZvciBzZXNzaW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBTZXNzaW9uCit7CisJLyoqCisJICogR2V0cyBhIGNvbmZpZ3VyYXRpb24gb3Igb3BlcmF0aW9uYWwgdmFsdWUgZnJvbSB0aGUgaGFuZGxlci4gVGhlCisJICogcmVxdWVzdCBpcyBwYXNzZWQgdXAgdGhlIGNoYWluIG9mIHNlc3Npb25zIHVudGlsIHNvbWUgc2Vzc2lvbgorCSAqIHJlY29nbml6ZXMgdGhlIHF1ZXJ5LCB3aGVyZXVwb24gaXQgcmV0dXJucyB0aGUgcmVxdWVzdGVkIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSBxdWVyeSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgcXVlcnksIHdoaWNoIGNvdWxkIGJlIGFzCisJICogc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworCSAqIGEgY2xhc3Mgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMgZm9yIHF1ZXJ5IHRlcm1zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgb3IgbnVsbCBpZiBub3QgZGVmaW5lZC4KKwkgKiAKKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBpcyBub3QgcmVjb2duaXplZAorCSAqIGJ5IGFueSBzZXNzaW9uICh3aGljaCBpcyB0byBzYXksIGlmIHRoZSBsYXN0IHNlc3Npb24gaW4gdGhlIHNlc3Npb24KKwkgKiBjaGFpbiBkb2VzIG5vdCByZWNvZ25pemUgaXQsIGl0IHNob3VsZCB0aHJvdyB0aGlzIGV4Y2VwdGlvbikuIFR5cGljYWxseQorCSAqIHRoaXMgd291bGQgYmUgYSBzZXJ2aWNlJ3MgY2xpZW50IG9yIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uOworCQorCS8qKgorCSAqIFNldHMgYSBjb25maWd1cmF0aW9uIG9yIG9wZXJhdGlvbmFsIHZhbHVlIGluIHRoZSBzZXNzaW9uLiBUaGUKKwkgKiByZXF1ZXN0IGlzIHBhc3NlZCB1cCB0aGUgY2hhaW4gb2Ygc2Vzc2lvbnMgdW50aWwgc29tZSBzZXNzaW9uCisJICogcmVjb2duaXplcyB0aGUgY29udHJvbCwgd2hlcmV1cG9uIGl0IHN0b3JlcyB0aGUgc3BlY2lmaWVkIHZhbHVlCisJICogYW5kIHJldHVybnMuCisJICogCisJICogQHBhcmFtIGNvbnRyb2wgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbnRyb2wsIHdoaWNoIGNvdWxkIGJlIGFzCisJICogc2ltcGxlIGFzIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLCBvciBtb3JlIGNvbXBsZXggc3VjaCBhcworCSAqIGEgY2xhc3Mgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMgZm9yIGNvbnRyb2wgdGVybXMuCisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCisJICogCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQKKwkgKiB0eXBlIG9yIGlmIHRoZSB2YWx1ZSBpcyBpbmFwcHJvcHJpYXRlLgorCSAqIAorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIGNvbnRyb2wgaXMgbm90IHJlY29nbml6ZWQKKwkgKiBieSBhbnkgc2Vzc2lvbiAod2hpY2ggaXMgdG8gc2F5LCBpZiB0aGUgbGFzdCBzZXNzaW9uIGluIHRoZSBzZXNzaW9uCisJICogY2hhaW4gZG9lcyBub3QgcmVjb2duaXplIGl0LCBpdCBzaG91bGQgdGhyb3cgdGhpcyBleGNlcHRpb24pLiBUeXBpY2FsbHkKKwkgKiB0aGlzIHdvdWxkIGJlIGEgc2VydmljZSdzIGNsaWVudCBvciBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogTm90aWZpZXMgdGhlIGNoYWluIG9mIHNlc3Npb25zIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuIFVubGlrZSBxdWVyeQorCSAqIGFuZCBjb250cm9sIG9wZXJhdGlvbnMgYWJvdmUsIGV2ZW50cyBhcmUgYWx3YXlzIHBhc3NlZCB1cCB0byB0aGUKKwkgKiB0b3AgdG8gYWxsb3cgYWxsIHNlc3Npb25zIHRvIG5vdGljZSB0aGVtLgorCSAqIAorCSAqIEBwYXJhbSBldmVudCBhIGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LCBwb3NzaWJseSB3aXRoCisJICogcGFyYW1ldGVycy4gVGhlIHNpbXBsZXN0IGV2ZW50IGNvdWxkIGJlIGEgc3RyaW5nLCBpbnRlZ2VyLAorCSAqIG9yIGVudW0sIGJ1dCBhbnkgY2xhc3MgaW5zdGFuY2Ugd2lsbCBkbyAoYXMgbG9uZyBhcyBzb21lIHNlc3Npb24KKwkgKiBpbiB0aGUgY2hhaW4gZXhwZWN0cyBpdCkuCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBXZWxsLWtub3duIGV2ZW50cyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJLyoqCisJICogU2Vzc2lvbiBldmVudCByZXBvcnRpbmcgdGhlIHRyYW5zcG9ydCBpcyB1cC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUCA9ICJVUCI7CisJCisJLyoqCisJICogU2Vzc2lvbiBldmVudCByZXBvcnRpbmcgdGhlIHRyYW5zcG9ydCBpcyBkb3duLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERPV04gPSAiRE9XTiI7Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9TZXNzaW9uRGF0YS5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vU2Vzc2lvbkRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGY1YjBlCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vU2Vzc2lvbkRhdGEuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CisKKy8qKgorICogSW50ZXJmYWNlIHVzZWQgdG8gZGVsaXZlciBwYWNrZXRzIHRvIHRoZSBzZXNzaW9uIGZyb20gdGhlIHRyYW5zcG9ydC4KKyAqLworcHVibGljIGludGVyZmFjZSBTZXNzaW9uRGF0YSBleHRlbmRzIFNlc3Npb24KK3sKKwkvKioKKwkgKiBEZWxpdmVycyBkYXRhIHRvIHRoZSBzZXNzaW9uIGZyb20gdGhlIHRyYW5zcG9ydC4KKwkgKiBAcGFyYW0gc2VuZGVyIHRoZSBzZW5kZXIgb2YgdGhlIGRhdGEsIGZvciB0cmFuc3BvcnRzIHdoaWNoIGFsbG93CisJICogbXVsdGlwbGUgc2VuZGVycy4gVGhpcyBpcyB3aG8gdG8gcmV0dXJuIGFueSByZXNwb25zZSB0by4KKwkgKiBAcGFyYW0gYnVmIGEgRmxleEJ1ZmZlciBwb3NpdGlvbmVkIGF0IHRoZSBkYXRhLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgc2Vzc2lvbkRhdGEoIFdobyBzZW5kZXIsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Nlc3Npb25MaXN0ZW5lci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vU2Vzc2lvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhNzhkZAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Nlc3Npb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvOworCisvKioKKyAqIEludGVyZmFjZSB1c2VkIHRvIGRlbGl2ZXIgbmV3IGNvbm5lY3Rpb25zIHRvIHRoZSBzZXNzaW9uIGZyb20gdGhlIGxpc3RlbmVyLgorICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgY29ubmVjdGlvbiBmb3IgdGhlIHNlc3Npb24uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbkxpc3RlbmVyPFQ+IGV4dGVuZHMgU2Vzc2lvbgoreworCS8qKgorCSAqIERlbGl2ZXJzIGEgc29ja2V0IHRvIHRoZSBzZXNzaW9uIGZyb20gdGhlIGxpc3RlbmVyLgorCSAqIEBwYXJhbSBjb25uZWN0aW9uCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXNzaW9uQWNjZXB0ZWQoIFQgY29ubmVjdGlvbiApIHRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9TZXNzaW9uUGFja2V0LmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9TZXNzaW9uUGFja2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMTcwNAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Nlc3Npb25QYWNrZXQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CisKKy8qKgorICogSW50ZXJmYWNlIHVzZWQgdG8gZGVsaXZlciBwYWNrZXRzIHRvIHRoZSBzZXNzaW9uIGZyb20gdGhlIHRyYW5zcG9ydC4KKyAqLworcHVibGljIGludGVyZmFjZSBTZXNzaW9uUGFja2V0IGV4dGVuZHMgU2Vzc2lvbgoreworCS8qKgorCSAqIERlbGl2ZXJzIGEgcGFja2V0IHRvIHRoZSBzZXNzaW9uIGZyb20gdGhlIHRyYW5zcG9ydC4KKwkgKiBAcGFyYW0gc2VuZGVyIHRoZSBzZW5kZXIgb2YgdGhlIHBhY2tldCwgZm9yIHRyYW5zcG9ydHMgd2hpY2ggYWxsb3cKKwkgKiBtdWx0aXBsZSBzZW5kZXJzLiBUaGlzIGlzIHdobyB0byByZXR1cm4gYW55IHJlc3BvbnNlIHRvLgorCSAqIEBwYXJhbSBidWYgYSBGbGV4QnVmZmVyIHBvc2l0aW9uZWQgYXQgdGhlIHBhY2tldC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNlc3Npb25QYWNrZXQoIFdobyBzZW5kZXIsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1RjcENvbm5lY3Rpb24uamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1RjcENvbm5lY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhlY2MzCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGNwQ29ubmVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5GbGV4QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0aW9uIHdoaWNoIGhhbmRsZXMgYSB0Y3AgY29ubmVjdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFRjcENvbm5lY3Rpb24gZXh0ZW5kcyBUY3BUcmFuc3BvcnQKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBDb25uZWN0aW9uIGZyb20gYSB1cmkuCisJICogQHBhcmFtIHNvY2tldAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICovCisJcHVibGljIFRjcENvbm5lY3Rpb24oIFNvY2tldCBzb2NrZXQsIFN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJdGhpcyggc29ja2V0LCBuZXcgVVJMKCB1cmkgKSwgcmVzb3VyY2VzICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIENvbm5lY3Rpb24gZnJvbSBhIHVyaS4KKwkgKiBAcGFyYW0gc29ja2V0CisJICogQHBhcmFtIHVyaQorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKi8KKwlwdWJsaWMgVGNwQ29ubmVjdGlvbiggU29ja2V0IHNvY2tldCwgVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQlzdXBlciggdXJpLCByZXNvdXJjZXMgKTsKKwkJCisJCWlmIChzb2NrZXQgPT0gbnVsbCkKKwkJeworCQkJU3RyaW5nIGggPSB1cmkuZ2V0SG9zdCgpOworCQkJaWYgKGggPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaG9zdCA9PSBudWxsIiApOworCQkJCisJCQlJbnRlZ2VyIHAgPSB1cmkuZ2V0UG9ydCgpOworCQkJaWYgKHAgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAicG9ydCA9PSBudWxsIiApOworCQkJCisJCQlpZiAocCA8PSAwIHx8IHAgPiA2NTUzNSkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAicG9ydCA8PSAwIHx8IHBvcnQgPiA2NTUzNSIgKTsKKwkJCQorCQkJdGhpcy5zb2NrZXQgPSBudWxsOworCQkJaG9zdCA9IGg7CisJCQlwb3J0ID0gcDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMuc29ja2V0ID0gc29ja2V0OworCQkJaG9zdCA9IG51bGw7CisJCQlwb3J0ID0gMDsKKwkJfQorCX0KKworCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCVNvY2tldCBzID0gc29ja2V0OworCQkKKwkJaWYgKHMgIT0gbnVsbCkKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KAorCQkJCSJUY3BDb25uZWN0aW9uKHVwLCAlczolZCwgJXM6JWQpIiwKKwkJCQlzLmdldExvY2FsQWRkcmVzcygpLCBzLmdldExvY2FsUG9ydCgpLAorCQkJCXMuZ2V0SW5ldEFkZHJlc3MoKSwgcy5nZXRQb3J0KCkgKTsKKwkJCisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVGNwQ29ubmVjdGlvbihkb3duLCAlczolZCkiLCBob3N0LCBwb3J0ICk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2ZXIoKQorCXsKKwkJcmV0dXJuIGhvc3QgPT0gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU29ja2V0IG5ld1NvY2tldCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQlyZXR1cm4gbmV3IFNvY2tldCggaG9zdCwgcG9ydCApOworCQl9CisJCWNhdGNoICggQ29ubmVjdEV4Y2VwdGlvbiBlICkKKwkJeworCQkJQ29ubmVjdEV4Y2VwdGlvbiB4ID0gbmV3IENvbm5lY3RFeGNlcHRpb24oICJDb25uZWN0aW9uIHJlZnVzZWQ6ICIraG9zdCsiOiIrcG9ydCApOworCQkJeC5pbml0Q2F1c2UoIGUgKTsKKwkJCXRocm93IHg7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZWFkU29ja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBpbnB1dFN0cmVhbTsKKwkJaWYgKGlzID09IG51bGwpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJzb2NrZXQgY2xvc2VkIiApOworCQkKKwkJLy8gVE9ETyBhbGxvdyBzZXR0aW5nIGlucHV0IGJ1ZmZlciBzaXplLgorCQlmaW5hbCBGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVs4MTkyXSApOworCQkKKwkJdHJ5CisJCXsKKwkJCXdoaWxlIChpc1N0YXJ0ZWQoKSkKKwkJCXsKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggInJlYWRpbmciICk7CisJCQkJaW50IG4gPSBpcy5yZWFkKCBidWYuZ2V0QnVmKCkgKTsKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggInJlYWQgIituICk7CisJCQkJCisJCQkJaWYgKG4gPD0gMCkKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJYnVmLnNldExlbmd0aCggbiApOworCQkJCWJ1Zi5zZXRJbmRleCggMCApOworCQkJCWZpcmVEYXRhKCBidWYgKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoIFNvY2tldEV4Y2VwdGlvbiBlICkKKwkJeworLy8JCQlMb2cucmVwb3J0KCAicmVhZFNvY2tldEZhaWxlZCIsCisvLwkJCQkicy5sb2NhbCIsIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCksCisvLwkJCQkicy5yZW1vdGUiLCBzLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSwKKy8vCQkJCSJlIiwgZS50b1N0cmluZygpICk7CisJCQkKKwkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKKwkJCWlmIChtc2cgPT0gbnVsbCkKKwkJCQl0aHJvdyBlOworCQkJCisJCQltc2cgPSBtc2cudG9Mb3dlckNhc2UoKTsKKwkJCQorCQkJaWYgKG1zZy5pbmRleE9mKCAic29ja2V0IGNsb3NlZCIgKSA+PSAwKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKG1zZy5pbmRleE9mKCAicmVjdiBmYWlsZWQiICkgPj0gMCkKKwkJCQlyZXR1cm47CisJCQkKKwkJCWlmIChtc2cuaW5kZXhPZiggImNvbm5lY3Rpb24gcmVzZXQiICkgPj0gMCkKKwkJCQlyZXR1cm47CisJCQkKKwkJCXRocm93IGU7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UY3BMaXN0ZW5lci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGNwTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGNlNmFjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGNwTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkJpbmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5VUkw7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGNvbm5lY3Rpb24gd2hpY2ggaGFuZGxlcyBhIHNvY2tldCBsaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIFRjcExpc3RlbmVyIGV4dGVuZHMgQ29ubmVjdGlvbjxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Pj4KKwlpbXBsZW1lbnRzIFRyYW5zcG9ydDxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Pj4KK3sKKwkvKioKKwkgKiBRdWVyeSB0ZXJtIGZvciBVUkkgdG8gc3BlY2lmeSBiYWNrbG9nIHZhbHVlIHRvIFNlcnZlclNvY2tldC4gVGhlIHZhbHVlCisJICogaXMgIlRjcExpc3RlbmVyLmJhY2tsb2ciLiBUaGUgYmFja2xvZyBtdXN0IGJlID49IDAgYW5kIHNvbWV3aGF0CisJICogcmVhc29uYWJsZS4gVGhlIHZhbHVlIDAgc3BlY2lmaWVzIHRoZSBzeXN0ZW0gZGVmYXVsdCwgdGhlIHNhbWUgYXMgaWYgeW91CisJICogbGVhdmUgdGhlIHRlcm0gb2ZmIGFsdG9nZXRoZXIuCisJICogCisJICogRXhhbXBsZTogdGNwOi8vaG9zdDpwb3J0P1RjcExpc3RlbmVyLmJhY2tsb2c9MjUwCisJICogCisJICogQHNlZSAjVGNwTGlzdGVuZXIoU3RyaW5nLCBSZXNvdXJjZXMpCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQkFDS0xPRyA9ICJUY3BMaXN0ZW5lci5iYWNrbG9nIjsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgVGNwTGlzdGVuZXIsIGluaXRpYWxpemVkIGZyb20gdGhlIFVSSS4gTGlzdGVucyBvbiB0aGUgaG9zdAorCSAqIGFuZCBwb3J0IHNwZWNpZmllZCBpbiB0aGUgVVJJLiBUbyBsaXN0ZW4gb24gYWxsIGludGVyZmFjZXMsIHNwZWNpZnkKKwkgKiBob3N0IGFzIEFMTF9JTlRGUyAoIjAuMC4wLjAiKS4gSWYgcG9ydCBpcyBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIHRvIDAsCisJICogYW4gdW51c2VkIHBvcnQgd2lsbCBiZSBzZWxlY3RlZC4KKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqLworCXB1YmxpYyBUY3BMaXN0ZW5lciggU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCBuZXcgVVJMKCB1cmkgKSwgcmVzb3VyY2VzICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgYSBUY3BMaXN0ZW5lciwgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgVVJJLiBMaXN0ZW5zIG9uIHRoZSBob3N0CisJICogYW5kIHBvcnQgc3BlY2lmaWVkIGluIHRoZSBVUkkuIFRvIGxpc3RlbiBvbiBhbGwgaW50ZXJmYWNlcywgc3BlY2lmeQorCSAqIGhvc3QgYXMgQUxMX0lOVEZTICgiMC4wLjAuMCIpLiBJZiBwb3J0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgdG8gMCwKKwkgKiBhbiB1bnVzZWQgcG9ydCB3aWxsIGJlIHNlbGVjdGVkLgorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzIAorCSAqIEBzZWUgVVJMI2dldEhvc3QoKQorCSAqIEBzZWUgVVJMI2dldFBvcnQoKQorCSAqIEBzZWUgVVJMI2dldEludGVnZXJUZXJtKFN0cmluZywgaW50KQorCSAqIEBzZWUgI0JBQ0tMT0cKKwkgKiBAc2VlICNBTExfSU5URlMKKwkgKiBAc2VlICNsb2NhbEFkZHJlc3MoKQorCSAqLworCXB1YmxpYyBUY3BMaXN0ZW5lciggVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCB0cmFuc2xhdGVIb3N0KCB1cmkuZ2V0SG9zdCgpICksIHVyaS5nZXRQb3J0KCksCisJCQl1cmkuZ2V0SW50ZWdlclRlcm0oIEJBQ0tMT0csIDAgKSApOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFRjcExpc3RlbmVyLgorCSAqIEBwYXJhbSBob3N0IGFkZHJlc3MgdG8gbGlzdGVuIHRvLiBOdWxsIG1lYW5zIGFueSBsb2NhbCBhZGRyZXNzLgorCSAqIEBwYXJhbSBwb3J0IHBvcnQgdG8gbGlzdGVuIG9uLiBQb3J0IG11c3QgYmUgPj0gMC4gUG9ydCBvZiAwCisJICogbWVhbnMgYWxsb2NhdGUgYW4gYXZhaWxhYmxlIHBvcnQuCisJICogQHBhcmFtIGJhY2tsb2cgbWF4IG51bWJlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMuCisJICovCisJcHJpdmF0ZSBUY3BMaXN0ZW5lciggU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZyApCisJeworCQlpZiAocG9ydCA8IDAgfHwgcG9ydCA+IDY1NTM1KQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSIgKTsKKwkJCisJCWlmIChiYWNrbG9nIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJiYWNrbG9nIDwgMCIgKTsKKwkJCisJCXRoaXMuaG9zdCA9IGhvc3Q7CisJCXRoaXMucG9ydCA9IHBvcnQ7CisJCXRoaXMuYmFja2xvZyA9IGJhY2tsb2c7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKKwkKKwlwcml2YXRlIGZpbmFsIGludCBiYWNrbG9nOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHN0b3AwKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJY2xvc2UoIHRydWUgKTsKKwkJc3VwZXIuc3RvcDAoKTsKKwl9CisJCisJcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgY2hlY2tTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCVNlcnZlclNvY2tldCBzcyA9IHNlcnZlclNvY2tldDsKKwkJaWYgKHNzID09IG51bGwpCisJCQl0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCAic29ja2V0IGNsb3NlZCIgKTsKKwkJcmV0dXJuIHNzOworCX0KKworCXByaXZhdGUgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCVNlcnZlclNvY2tldCBzID0gc2VydmVyU29ja2V0OworCQkKKwkJaWYgKHMgIT0gbnVsbCkKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVGNwTGlzdGVuZXIodXAsICVzLCAlZCkiLAorCQkJCXMuZ2V0SW5ldEFkZHJlc3MoKSwgcy5nZXRMb2NhbFBvcnQoKSApOworCQkKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJUY3BMaXN0ZW5lcihkb3duLCAlcywgJWQpIiwgaG9zdCwgcG9ydCApOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBvcGVuU29ja2V0KCBib29sZWFuIHJlY29ubmVjdCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQl3aGlsZSAoaXNTdGFydGVkKCkpCisJCXsKKwkJCWlmIChyZWNvbm5lY3QgfHwgIWZpcnN0KQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJdHJ5CisJCQl7CisJCQkJSW5ldEFkZHJlc3MgaCA9IGhvc3QgIT0gbnVsbCA/IEluZXRBZGRyZXNzLmdldEJ5TmFtZSggaG9zdCApIDogbnVsbDsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCXNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoIHBvcnQsIGJhY2tsb2csIGggKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCWNhdGNoICggQmluZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCUJpbmRFeGNlcHRpb24geCA9IG5ldyBCaW5kRXhjZXB0aW9uKCAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzczogIitoKyI6Iitwb3J0ICk7CisJCQkJCXguaW5pdENhdXNlKCBlICk7CisJCQkJCXRocm93IHg7CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJaWYgKGZpcnN0KQorCQkJCXsKKwkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJZmlyZUV4Y2VwdGlvbiggIm9wZW4iLCBlICk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXR1cFNvY2tldCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcmVhZFNvY2tldCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNlcnZlclNvY2tldCBzcyA9IGNoZWNrU29ja2V0KCk7CisJCXdoaWxlIChpc1N0YXJ0ZWQoKSkKKwkJeworCQkJU29ja2V0IHMgPSBzcy5hY2NlcHQoKTsKKwkJCXRyeQorCQkJeworCQkJCWlmIChzZXNzaW9uID09IG51bGwpCisJCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbiggInNlc3Npb24gPT0gbnVsbCIgKTsKKwkJCQlzZXNzaW9uLnNlc3Npb25BY2NlcHRlZCggcyApOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJcy5jbG9zZSgpOworCQkJCWZpcmVFeGNlcHRpb24oICJzZXNzaW9uQWNjZXB0ZWQiLCBlICk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSggYm9vbGVhbiByZXNldCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNlcnZlclNvY2tldCBzcyA9IHNlcnZlclNvY2tldDsKKwkJaWYgKHNzICE9IG51bGwpCisJCXsKKwkJCXNlcnZlclNvY2tldCA9IG51bGw7CisJCQlzcy5jbG9zZSgpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNvY2tldEFkZHJlc3MgbG9jYWxBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZXR1cm4gY2hlY2tTb2NrZXQoKS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU29ja2V0QWRkcmVzcyByZW1vdGVBZGRyZXNzKCkKKwl7CisJCS8vIGlnbm9yZS4KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGNwT3B0aW9ucy5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGNwT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjVjYzMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UY3BPcHRpb25zLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKKworLyoqCisgKiBUQ1AgY29ubmVjdGlvbiBvcHRpb25zLgorICovCitwdWJsaWMgY2xhc3MgVGNwT3B0aW9ucworeworCS8qKgorCSAqIENvbnN0cnVjdHMgVGNwT3B0aW9ucyBmcm9tIHVyaSBhbmQgcmVzb3VyY2VzLgorCSAqIAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICovCisJcHVibGljIFRjcE9wdGlvbnMoIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJYXV0b0ZsdXNoID0gdXJpLmdldEJvb2xlYW5UZXJtKCBBVVRPX0ZMVVNILCBmYWxzZSApOworCQlidWZmZXJTaXplID0gY2hlY2tCdWZmZXJTaXplKCB1cmkuZ2V0SW50ZWdlclRlcm0oIEJVRkZFUl9TSVpFLCAwICkgKTsKKwkJa2VlcEFsaXZlID0gdXJpLmdldEJvb2xlYW5UZXJtKCBLRUVQX0FMSVZFLCBmYWxzZSApOworCQlsaW5nZXJUaW1lID0gY2hlY2tMaW5nZXJUaW1lKCB1cmkuZ2V0SW50ZWdlclRlcm0oIExJTkdFUl9USU1FLCAzMCApICk7CisJCW5vRGVsYXkgPSB1cmkuZ2V0Qm9vbGVhblRlcm0oIE5PX0RFTEFZLCB0cnVlICk7CisJCXJlY29ubmVjdERlbGF5ID0gY2hlY2tSZWNvbm5lY3REZWxheSggdXJpLmdldEludGVnZXJUZXJtKAorCQkJUkVDT05ORUNUX0RFTEFZLCAwICkgKTsKKwkJdHJhZmZpY0NsYXNzID0gY2hlY2tUcmFmZmljQ2xhc3MoIHVyaS5nZXRJbnRlZ2VyVGVybSggVFJBRkZJQ19DTEFTUywgMCApICk7CisJfQorCisJLyoqCisJICogVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUgYXV0byBmbHVzaCBmbGFnLiBUaGUgdGVybSBzdHJpbmcgaXMKKwkgKiAiVGNwVHJhbnNwb3J0LmF1dG9GbHVzaCIuIFRoZSB2YWx1ZSBpcyAidHJ1ZSIgb3IgImZhbHNlIi4gVGhlIGRlZmF1bHQgaXMKKwkgKiAiZmFsc2UiLiBBdXRvLWZsdXNoIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBzdHJlYW0gaXMgYnVmZmVyZWQuIFRydWUgbWVhbnMKKwkgKiB0aGF0IGFueSAic2VudCIgZGF0YSBpcyBhdXRvbWF0aWNhbGx5IHB1c2hlZCB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbXMKKwkgKiB3aXRob3V0IGJ1ZmZlcmluZy4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVVRPX0ZMVVNIID0gIlRjcFRyYW5zcG9ydC5hdXRvRmx1c2giOworCisJLyoqCisJICogVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBUaGUgdGVybQorCSAqIHN0cmluZyBpcyAiVGNwVHJhbnNwb3J0LmJ1ZmZlclNpemUiLiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciBiZXR3ZWVuIDAKKwkgKiBhbmQgNjU1MzYuIFRoZSBkZWZhdWx0IGlzIDAsIHdoaWNoIG1lYW5zIG5vIG91dHB1dCBidWZmZXJpbmcuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlVGRkVSX1NJWkUgPSAiVGNwVHJhbnNwb3J0LmJ1ZmZlclNpemUiOworCisJLyoqCisJICogVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUga2VlcCBhbGl2ZSBmbGFnLiBUaGUgdGVybSBzdHJpbmcgaXMKKwkgKiAiVGNwVHJhbnNwb3J0LmtlZXBBbGl2ZSIuIFRoZSB2YWx1ZSBpcyAidHJ1ZSIgb3IgImZhbHNlIi4gVGhlIGRlZmF1bHQgaXMKKwkgKiAiZmFsc2UiLiBIZXJlIGtlZXAgYWxpdmUgcmVmZXJzIHRvIFRDUCBzcGVjaWZpZWQga2VlcCBhbGl2ZSwgd2hpY2ggaXMgbm90CisJICogdGhlIHNhbWUgYXMgYW55IGFwcGxpY2F0aW9uIGxldmVsIGtlZXAgYWxpdmUuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgS0VFUF9BTElWRSA9ICJUY3BUcmFuc3BvcnQua2VlcEFsaXZlIjsKKworCS8qKgorCSAqIFRlcm0gb24gdGhlIHVyaSB3aGljaCBzcGVjaWZpZXMgdGhlIGxpbmdlciBvbiBjbG9zZSB0aW1lIGluIHNlY29uZHMuIFRoZQorCSAqIHRlcm0gc3RyaW5nIGlzICJUY3BUcmFuc3BvcnQubGluZ2VyVGltZSIuIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIGJldHdlZW4KKwkgKiAtMSBhbmQgNjU1MzUuIFRoZSBkZWZhdWx0IGlzIDMwLiBUaGUgdmFsdWUgLTEgbWVhbnMgIm5vIGxpbmdlciBvbiBjbG9zZSIuCisJICogVGhlIHZhbHVlIGRldGVybWluZXMgaG93IGxvbmcgY2xvc2Ugd2lsbCB3YWl0IGZvciBidWZmZXJlZCBidXQKKwkgKiB1bmFja25vd2xlZGdlZCBkYXRhIHRvIGJlIGRlbGl2ZXJlZC4gV2hlbiB0aGUgdGltZSBleHBpcmVzLCB0aGUKKwkgKiBjb25uZWN0aW9uIHdpbGwgYmUgZm9yY2VmdWxseSBjbG9zZWQuIChUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgbGluZ2VyIG9mCisJICogLTEgYW5kIGEgbGluZ2VyIG9mIDAgaXMgc3VidGxlLCBidXQgY29tZXMgZG93biB0byBhIGNsb3NlIHdpdGggYSBsaW5nZXIKKwkgKiBvZiAtMSBtZWFucyBwZXJmb3JtIGZvcmNlZnVsIGNsb3NlIHdoaWxlIGEgY2xvc2Ugd2l0aCBhIGxpbmdlciBvZiAwIG1lYW5zCisJICogcGVyZm9ybSBhIGdyYWNlZnVsIGNsb3NlIGlmIHRoZXJlIGlzIG5vIGJ1ZmZlcmVkIGRhdGEgYW5kIGEgZm9yY2VmdWwKKwkgKiBjbG9zZSBpZiB0aGVyZSBpcyBidWZmZXJlZCBkYXRhLiBBIGZvcmNlZnVsIGNsb3NlIGlzIHNlbmQgUlNULCB3aGlsZSBhCisJICogZ3JhY2VmdWwgY2xvc2UgbWVhbnMgc2VuZCBGSU4gYW5kIHdhaXQgZm9yIEZJTkFDSy4pCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElOR0VSX1RJTUUgPSAiVGNwVHJhbnNwb3J0LmxpbmdlclRpbWUiOworCisJLyoqCisJICogVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUgbm8gZGVsYXkgZmxhZy4gVGhlIHRlcm0gc3RyaW5nIGlzCisJICogIlRjcFRyYW5zcG9ydC5ub0RlbGF5Ii4gVGhlIHZhbHVlIGlzICJ0cnVlIiBvciAiZmFsc2UiLiBUaGUgZGVmYXVsdCBpcworCSAqICJ0cnVlIi4gV2hlbiB0cnVlLCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0bworCSAqIHRyYW5zbWl0IGRhdGEgQVNBUC4gV2hlbiBmYWxzZSwgZGF0YSBtaWdodCBiZSBkZWxheWVkIHNvbWV3aGF0IGluIG9yZGVyCisJICogdG8gYWxsb3cgZm9yIG1vcmUgZWZmaWNpZW50IHRyYW5zbWlzc2lvbiBieSBjb21iaW5pbmcgcGFja2V0cyAoc2VlCisJICogTmFnbGUncyBBbGdvcml0aG0pLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PX0RFTEFZID0gIlRjcFRyYW5zcG9ydC5ub0RlbGF5IjsKKworCS8qKgorCSAqIFRlcm0gb24gdGhlIHVyaSB3aGljaCBzcGVjaWZpZXMgdGhlIHJlY29ubmVjdCBkZWxheSBpbiBtaWxsaXNlY29uZHMuIFRoZQorCSAqIHRlcm0gc3RyaW5nIGlzICJUY3BUcmFuc3BvcnQucmVjb25uZWN0RGVsYXkiLiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciA+PQorCSAqIDAuIFRoZSBkZWZhdWx0IGlzIDAuIFRoZSB2YWx1ZSAwIG1lYW5zIG5vIGF1dG9tYXRpYyByZWNvbm5lY3Rpb24gaXMKKwkgKiBkZXNpcmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFQ09OTkVDVF9ERUxBWSA9ICJUY3BUcmFuc3BvcnQucmVjb25uZWN0RGVsYXkiOworCisJLyoqCisJICogVGVybSBvbiB0aGUgdXJpIHdoaWNoIHNwZWNpZmllcyB0aGUgdHJhZmZpYyBjbGFzcy4gVGhlIHRlcm0gc3RyaW5nIGlzCisJICogIlRjcFRyYW5zcG9ydC50cmFmZmljQ2xhc3MiLiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NS4KKwkgKiBUaGUgZGVmYXVsdCBpcyAwLiBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyBuZXR3b3JrIGFuZCBzZXJ2aWNlIHNwZWNpZmljCisJICogdmFsdWUuIEl0IGlzIG1hcHBlZCB0byB0aGUgSVB2NCB0eXBlIG9mIHNlcnZpY2UgKFRPUykgZmllbGQgYW5kIHRoZSBJUHY2CisJICogdHJhZmZpYyBjbGFzcyBmaWVsZC4gU2VlIGFsc28gRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgKERTQ1ApLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQUZGSUNfQ0xBU1MgPSAiVGNwVHJhbnNwb3J0LnRyYWZmaWNDbGFzcyI7CisKKwkvKioKKwkgKiBUaGUgYXV0byBmbHVzaCBzZXR0aW5nIGZvciB0aGlzIGNvbm5lY3Rpb24uIElmIHRydWUsIGVhY2ggY2FsbCB0byBzZW5kCisJICogbXVzdCBhdXRvbWF0aWNhbGx5IGNhbGwgZmx1c2guCisJICovCisJcHVibGljIGZpbmFsIGJvb2xlYW4gYXV0b0ZsdXNoOworCisJcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrQnVmZmVyU2l6ZSggaW50IGJ1ZmZlclNpemUgKQorCXsKKwkJaWYgKGJ1ZmZlclNpemUgPCAwIHx8IGJ1ZmZlclNpemUgPiA2NTUzNikKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJImJ1ZmZlclNpemUgPCAwIHx8IGJ1ZmZlclNpemUgPiA2NTUzNiIgKTsKKwkJcmV0dXJuIGJ1ZmZlclNpemU7CisJfQorCisJLyoqCisJICogVGhlIG91dHB1dCBidWZmZXIgc2l6ZSB0byB1c2UgZm9yIHRoaXMgY29ubmVjdGlvbi4gVGhlIHZhbHVlIGlzIHNwZWNpZmllZAorCSAqIGFzIGJ5dGVzLCAwIG1lYW5zIHVuYnVmZmVyZWQgb3V0cHV0LiBJZiB1c2luZyBidWZmZXJlZCBvdXRwdXQsIHlvdSdsbAorCSAqIHdhbnQgdG8gZGlzYWJsZSBhdXRvIGZsdXNoIGFuZCBjYWxsIGZsdXNoIG1hbnVhbGx5IG9ubHkgd2hlbiBuZWVkZWQuIE9ubHkKKwkgKiBtZWFuaW5nZnVsIGZvciBzdHJlYW0gcHJvdG9jb2xzIGFuZCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggdXNlIGEgc3RyZWFtCisJICogaW50ZXJmYWNlIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorCSAqLworCXB1YmxpYyBmaW5hbCBpbnQgYnVmZmVyU2l6ZTsKKworCS8qKiBUaGUgdGNwIGtlZXAgYWxpdmUgc2V0dGluZyBmb3IgdGhpcyBjb25uZWN0aW9uLiAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGtlZXBBbGl2ZTsKKworCXByaXZhdGUgc3RhdGljIGludCBjaGVja0xpbmdlclRpbWUoIGludCBsaW5nZXJUaW1lICkKKwl7CisJCWlmIChsaW5nZXJUaW1lIDwgLTEgfHwgbGluZ2VyVGltZSA+IDI0MCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJImxpbmdlclRpbWUgPCAtMSB8fCBsaW5nZXJUaW1lID4gMjQwIiApOworCQlyZXR1cm4gbGluZ2VyVGltZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgdGNwIGxpbmdlciB0aW1lIHNldHRpbmcgZm9yIHRoaXMgY29ubmVjdGlvbi4gVGltZSBpbiBzZWNvbmRzLCAtMQorCSAqIG1lYW5zIGRpc2FibGUuCisJICovCisJcHVibGljIGZpbmFsIGludCBsaW5nZXJUaW1lOworCisJLyoqCisJICogVGhlIHRjcCBubyBkZWxheSBzZXR0aW5nIGZvciB0aGlzIGNvbm5lY3Rpb24uIFRydWUgZGlzYWJsZXMgbmFnbGUncworCSAqIGFsZ29yaXRobSBhbmQgY2F1c2VzIGFsbCBzZW5kcyB0byBiZSBtYWRlIGFzYXAuCisJICovCisJcHVibGljIGZpbmFsIGJvb2xlYW4gbm9EZWxheTsKKworCXByaXZhdGUgc3RhdGljIGludCBjaGVja1JlY29ubmVjdERlbGF5KCBpbnQgcmVjb25uZWN0RGVsYXkgKQorCXsKKwkJaWYgKHJlY29ubmVjdERlbGF5IDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJyZWNvbm5lY3REZWxheSA8IDAiICk7CisJCXJldHVybiByZWNvbm5lY3REZWxheTsKKwl9CisKKwkvKioKKwkgKiBUaGUgcmVjb25uZWN0IGRlbGF5IGZvciB0aGlzIGNvbm5lY3Rpb24uIFRpbWUgaW4gbWlsbGlzZWNvbmRzLCAwIG1lYW5zIGRvCisJICogbm90IHJlY29ubmVjdC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgaW50IHJlY29ubmVjdERlbGF5OworCisJcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrVHJhZmZpY0NsYXNzKCBpbnQgdHJhZmZpY0NsYXNzICkKKwl7CisJCWlmICh0cmFmZmljQ2xhc3MgPCAwIHx8IHRyYWZmaWNDbGFzcyA+IDI1NSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJInRyYWZmaWNDbGFzcyA8IDAgfHwgdHJhZmZpY0NsYXNzID4gMjU1IiApOworCQlyZXR1cm4gdHJhZmZpY0NsYXNzOworCX0KKworCS8qKgorCSAqIFRoZSB0cmFmZmljIGNsYXNzIGZvciB0aGlzIGNvbm5lY3Rpb24uIDAtMjU1LCAwIG1lYW5zIG5vcm1hbCBoYW5kbGluZy4KKwkgKiBBbHNvIGNhbGxlZCB0eXBlIG9mIHNlcnZpY2Ugb3IgZHNjcC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgaW50IHRyYWZmaWNDbGFzczsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1RjcFRyYW5zcG9ydC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGNwVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NTkwZQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1RjcFRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMzgyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pbzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKKworCisvKioKKyAqIENvbnN0YW50cyBhbmQgbWV0aG9kcyByZWxhdGVkIHRvIHRjcCB0cmFuc3BvcnQuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBUY3BUcmFuc3BvcnQgZXh0ZW5kcyBDb25uZWN0aW9uPFNlc3Npb25EYXRhPgorCWltcGxlbWVudHMgVHJhbnNwb3J0RGF0YQoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFRjcFRyYW5zcG9ydC4gUHVsbHMgY29tbW9uIHBhcmFtZXRlcnMgb2ZmIHRoZSB1cmkuCisJICoKKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqLworCXByb3RlY3RlZCBUY3BUcmFuc3BvcnQoIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJb3B0aW9ucyA9IG5ldyBUY3BPcHRpb25zKCB1cmksIHJlc291cmNlcyApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFRjcE9wdGlvbnMgb3B0aW9uczsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdG9wMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQljbG9zZSggZmFsc2UgKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCX0KKwkJc3VwZXIuc3RvcDAoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc29ja2V0IGZvciB0aGlzIGNvbm5lY3Rpb24uCisJICovCisJcHJvdGVjdGVkIFNvY2tldCBzb2NrZXQ7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzb2NrZXQgZm9yIHRoaXMgY29ubmVjdGlvbiBpZiBpdCBpcyBnb29kLgorCSAqIEB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIGlmIHRoZSBzb2NrZXQgaXMgYmFkLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBTb2NrZXQgY2hlY2tTb2NrZXQoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uCisJeworCQlTb2NrZXQgcyA9IHNvY2tldDsKKwkJCisJCWlmIChzID09IG51bGwpCisJCQl0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCAic29ja2V0IGNsb3NlZCIgKTsKKwkJCisJCWlmIChzLmlzQ2xvc2VkKCkpCisJCQl0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCAic29ja2V0IGNsb3NlZCIgKTsKKwkJCisJCXJldHVybiBzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgdm9pZCBjbG9zZSggYm9vbGVhbiByZXNldCApCisJeworCQkvLyBMb2cucmVwb3J0KCAiY2xvc2UiICk7CisKKwkJU29ja2V0IHMgPSBzb2NrZXQ7CisJCWlmIChzICE9IG51bGwpCisJCXsKKwkJCXRyeQorCQkJeworCQkJCXRyeQorCQkJCXsKKwkJCQkJaWYgKHJlc2V0KQorCQkJCQl7CisJCQkJCQlzLnNldFNvTGluZ2VyKCBmYWxzZSwgMCApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZmx1c2goKTsKKwkJCQkJCXNodXRkb3duT3V0cHV0KCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZmluYWxseQorCQkJCXsKKwkJCQkJLy8gTG9nLnJlcG9ydCggImNsb3NpbmciICk7CisJCQkJCXMuY2xvc2UoKTsKKwkJCQkJLy8gTG9nLnJlcG9ydCggImNsb3NlZCIgKTsKKwkJCQl9CisJCQl9CisJCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCS8vIGlnbm9yZS4KKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlpbnB1dFN0cmVhbSA9IG51bGw7CisJCQkJb3V0cHV0U3RyZWFtID0gbnVsbDsKKwkJCQlzb2NrZXQgPSBudWxsOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU2VuZHMgc29tZSBkYXRhIHRvIHRoZSByZW1vdGUgZW5kLiBJZiB0aGUgY29ubmVjdGlvbiBpcyBidWZmZXJlZCwgdGhlCisJICogZGF0YSBpcyBzYXZlZCB1bnRpbCB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgdGhlIGJ1ZmZlciBpcyBmbHVzaGVkLiBJZiB0aGUKKwkgKiBhdXRvRmx1c2ggc2V0dGluZyBpcyB0cnVlLCBzZW5kIGF1dG9tYXRpY2FsbHkgZmx1c2hlcyB0aGUgZGF0YS4gSWYgdGhlCisJICogY29ubmVjdGlvbiBpcyBub3QgYnVmZmVyZWQsIHRoZSBkYXRhIGlzIHNlbnQgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0KKwkgKiBpbW1lZGlhdGVseS4gVGhlIG9wZXJhdGluZyBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJhbnNtaXQgdGhlIGRhdGEKKwkgKiBpbW1lZGlhdGVseSwgZGVwZW5kaW5nIHVwb24gdGhlIG5vRGVsYXkgc2V0dGluZy4KKwkgKiAKKwkgKiBAcGFyYW0gYnVmIHRoZSBieXRlcyB0byBiZSBzZW50LgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB0cmFuc21pdHRpbmcgdGhlIGRhdGEuIFN1Y2ggYQorCSAqIHByb2JsZW0gY2F1c2VzIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gdG8gYmUgcmVzZXQuCisJICogQHNlZSAjZmx1c2goKQorCSAqIEBzZWUgVGNwT3B0aW9ucyNBVVRPX0ZMVVNICisJICogQHNlZSBUY3BPcHRpb25zI0JVRkZFUl9TSVpFCisJICogQHNlZSBUY3BPcHRpb25zI05PX0RFTEFZCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2VuZCggYnl0ZVtdIGJ1ZiApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlbmQoIGJ1ZiwgMCwgYnVmLmxlbmd0aCApOworCX0KKworCS8qKgorCSAqIFNlbmRzIHNvbWUgZGF0YSB0byB0aGUgcmVtb3RlIGVuZC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgYnVmZmVyZWQsIHRoZQorCSAqIGRhdGEgaXMgc2F2ZWQgdW50aWwgdGhlIGJ1ZmZlciBpcyBmdWxsIG9yIHRoZSBidWZmZXIgaXMgZmx1c2hlZC4gSWYgdGhlCisJICogYXV0b0ZsdXNoIHNldHRpbmcgaXMgdHJ1ZSwgc2VuZCBhdXRvbWF0aWNhbGx5IGZsdXNoZXMgdGhlIGRhdGEuIElmIHRoZQorCSAqIGNvbm5lY3Rpb24gaXMgbm90IGJ1ZmZlcmVkLCB0aGUgZGF0YSBpcyBzZW50IHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtCisJICogaW1tZWRpYXRlbHkuIFRoZSBvcGVyYXRpbmcgc3lzdGVtIG1heSBvciBtYXkgbm90IHRyYW5zbWl0IHRoZSBkYXRhCisJICogaW1tZWRpYXRlbHksIGRlcGVuZGluZyB1cG9uIHRoZSBub0RlbGF5IHNldHRpbmcuCisJICogQHBhcmFtIGJ1ZiB0aGUgYnl0ZXMgdG8gYmUgc2VudC4KKwkgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW50byBidWYgb2YgdGhlIGZpcnN0IGJ5dGUgdG8gc2VuZC4KKwkgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gdHJhbnNtaXR0aW5nIHRoZSBkYXRhLiBTdWNoIGEKKwkgKiBwcm9ibGVtIGNhdXNlcyB0aGUgY3VycmVudCBjb25uZWN0aW9uIHRvIGJlIHJlc2V0LgorCSAqIEBzZWUgI2ZsdXNoKCkKKwkgKiBAc2VlIFRjcE9wdGlvbnMjQVVUT19GTFVTSAorCSAqIEBzZWUgVGNwT3B0aW9ucyNCVUZGRVJfU0laRQorCSAqIEBzZWUgVGNwT3B0aW9ucyNOT19ERUxBWQorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHNlbmQoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0cnkKKwkJeworCQkJT3V0cHV0U3RyZWFtIG9zID0gY2hlY2tPdXRwdXRTdHJlYW0oKTsKKwkJCW9zLndyaXRlKCBidWYsIG9mZiwgbGVuICk7CisJCQlpZiAob3B0aW9ucy5hdXRvRmx1c2gpCisJCQkJb3MuZmx1c2goKTsKKwkJfQorCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorCQl7CisJCQljbG9zZSggdHJ1ZSApOworCQkJdGhyb3cgZTsKKwkJfQorCQljYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gZSApCisJCXsKKwkJCWNsb3NlKCB0cnVlICk7CisJCQl0aHJvdyBlOworCQl9CisJfQorCisJLyoqCisJICogUHVzaGVzIGFueSBidWZmZXJlZCBkYXRhIHRvIHRoZSB3aXJlLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJdHJ5CisJCXsKKwkJCWNoZWNrT3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKKwkJfQorCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorCQl7CisJCQljbG9zZSggdHJ1ZSApOworCQkJdGhyb3cgZTsKKwkJfQorCQljYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gZSApCisJCXsKKwkJCWNsb3NlKCB0cnVlICk7CisJCQl0aHJvdyBlOworCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgb3V0cHV0IHN0cmVhbSBpZiBpdCBpcyBzdGlsbCBnb29kLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG91dHB1dCBzdHJlYW0gaXMgbm90IGdvb2QuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIE91dHB1dFN0cmVhbSBjaGVja091dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJT3V0cHV0U3RyZWFtIG9zID0gb3V0cHV0U3RyZWFtOworCQlpZiAob3MgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggImNsb3NlZCIgKTsKKwkJcmV0dXJuIG9zOworCX0KKworCS8qKgorCSAqIFJlcG9ydHMgc29tZSBkYXRhIHRvIHRoZSBzZXNzaW9uLgorCSAqIEBwYXJhbSBidWYKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVEYXRhKCBGbGV4QnVmZmVyIGJ1ZiApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlc3Npb24uc2Vzc2lvbkRhdGEoIG51bGwsIGJ1ZiApOworCX0KKworCS8qKgorCSAqIFRoaXMgaW5wdXQgc3RyZWFtIGZvciB0aGlzIGNvbm5lY3Rpb24uCisJICovCisJcHJvdGVjdGVkIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCisJLyoqCisJICogVGhlIG91dHB1dCBzdHJlYW0gZm9yIHRoaXMgY29ubmVjdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTb2NrZXRBZGRyZXNzIGxvY2FsQWRkcmVzcygpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGNoZWNrU29ja2V0KCkuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcmVzcygpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGNoZWNrU29ja2V0KCkuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpOworCX0KKworCXB1YmxpYyBmaW5hbCB2b2lkIHRyYW5zcG9ydERhdGEoIFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc2VuZCggYnVmLmdldEJ1ZigpLCBidWYuaW5kZXgoKSwgYnVmLmF2YWlsKCkgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXR1cFNvY2tldCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNvY2tldCBzID0gY2hlY2tTb2NrZXQoKTsKKwkJCisJCXMuc2V0S2VlcEFsaXZlKCBvcHRpb25zLmtlZXBBbGl2ZSApOworCQlzLnNldFNvTGluZ2VyKCBvcHRpb25zLmxpbmdlclRpbWUgPj0gMCwgb3B0aW9ucy5saW5nZXJUaW1lID49IDAgPyBvcHRpb25zLmxpbmdlclRpbWUgOiAwICk7CisJCXMuc2V0VGNwTm9EZWxheSggb3B0aW9ucy5ub0RlbGF5ICk7CisJCXMuc2V0VHJhZmZpY0NsYXNzKCBvcHRpb25zLnRyYWZmaWNDbGFzcyApOworCQkKKwkJaW5wdXRTdHJlYW0gPSBzLmdldElucHV0U3RyZWFtKCk7CisJCQorCQlvdXRwdXRTdHJlYW0gPSBzLmdldE91dHB1dFN0cmVhbSgpOworCQlpZiAob3B0aW9ucy5idWZmZXJTaXplID4gMCkKKwkJCW91dHB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSggb3V0cHV0U3RyZWFtLCBvcHRpb25zLmJ1ZmZlclNpemUgKTsKKwl9CisKKwkvKioKKwkgKiBTaHV0cyBkb3duIHRoZSBpbnB1dCBjaGFubmVsLiBUaGlzIHNpZGUgd2lsbCBnZXQgYW4gZW9mIHJlYWRpbmcgdGhlCisJICogaW5wdXQuIFRoZSBvdGhlciBzaWRlIHdpbGwgbm90IGJlIGFibGUgdG8gdGVsbC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgc2h1dGRvd25JbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJY2hlY2tTb2NrZXQoKS5zaHV0ZG93bklucHV0KCk7CisJfQorCisJLyoqCisJICogU2h1dHMgZG93biB0aGUgb3V0cHV0IGNoYW5uZWwuIFRoaXMgc2lkZSB3aWxsIGdldCBhbiBlcnJvciB0cnlpbmcgdG8KKwkgKiBzZW5kLiBUaGUgb3RoZXIgc2lkZSB3aWxsIGdldCBhbiBlb2YgcmVhZGluZyB0aGUgaW5wdXQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNodXRkb3duT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQljaGVja1NvY2tldCgpLnNodXRkb3duT3V0cHV0KCk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gYSBuZXcgc29ja2V0IGZvciB0aGlzIGNvbm5lY3Rpb24uCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgU29ja2V0IG5ld1NvY2tldCgpIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsaXN0ZW5lciBpbml0aWF0ZWQgY29ubmVjdGlvbi4KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlcigpOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChxdWVyeSA9PSBJU19TRVJWRVIpCisJCQlyZXR1cm4gaXNTZXJ2ZXIoKTsKKwkJCisJCXJldHVybiBzdXBlci50cmFuc3BvcnRRdWVyeSggcXVlcnkgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gb3BlblNvY2tldCggYm9vbGVhbiByZWNvbm5lY3QgKQorCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwl7CisJCS8vIGlmIGEgb25lIHRpbWUgY29ubmVjdGlvbiBmcm9tIGEgc2VydmVyIHNvY2tldCBsaXN0ZW5lciwganVzdAorCQkvLyByZXR1cm4gdGhlIGV4aXN0aW5nIHNvY2tldC4KKwkJaWYgKCFyZWNvbm5lY3QgJiYgc29ja2V0ICE9IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJCisJCS8vIGlmIGEgb25lIHRpbWUgY29ubmVjdGlvbiBmcm9tIGEgc2VydmVyIHNvY2tldCBsaXN0ZW5lciwgYW5kCisJCS8vIHRoaXMgaXMgYSByZWNvbm5lY3QsIHRoZW4gYmFpbC4KKwkJaWYgKHJlY29ubmVjdCAmJiBpc1NlcnZlcigpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJLy8gaWYgYSByZWNvbm5lY3QgYnV0IG5vIHJldHJpZXMgYWxsb3dlZCwgdGhlbiBiYWlsLgorCQlpZiAocmVjb25uZWN0ICYmIG9wdGlvbnMucmVjb25uZWN0RGVsYXkgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCS8vIG9rLCB3ZSBkb24ndCBoYXZlIGFuIGV4aXN0aW5nIHNvY2tldCwgYW5kIHRoaXMgaXMgZWl0aGVyIHRoZSBmaXJzdAorCQkvLyBjb25uZWN0aW9uIGF0dGVtcHQgb3IgYSByZWNvbm5lY3Qgd2l0aCBkZWxheSA+IDAuCisJCQorCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCisJCXdoaWxlIChpc1N0YXJ0ZWQoKSkKKwkJeworCQkJLy8gaWYgcmVjb25uZWN0IGlzIGZhbHNlIGFuZCBmaXJzdCBpcyB0cnVlLCB0aGlzIGlzIG91cgorCQkJLy8gdmVyeSBmaXJzdCBhdHRlbXB0IHRvIGNvbm5lY3QuIG90aGVyd2lzZSwgd2UgYXJlIHRyeWluZworCQkJLy8gdG8gcmVjb25uZWN0IGEgYnJva2VuIGxpbmsgb3IgZXN0YWJsaXNoIGEgbGluayB3aGVyZSB3ZQorCQkJLy8gaGF2ZSBhbHJlYWR5IGZhaWxlZCBhdCBsZWFzdCBvbmNlLgorCQkJCisJCQlpZiAocmVjb25uZWN0IHx8ICFmaXJzdCkKKwkJCXsKKwkJCQlpZiAob3B0aW9ucy5yZWNvbm5lY3REZWxheSA9PSAwKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCisJCQkJd2FpdCggb3B0aW9ucy5yZWNvbm5lY3REZWxheSApOworCQkJCQorCQkJCWlmICghaXNTdGFydGVkKCkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvLyB0cnkgdG8gb3BlbiBhIHNvY2tldC4KKwkJCQorCQkJdHJ5CisJCQl7CisJCQkJc29ja2V0ID0gbmV3U29ja2V0KCk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQlpZiAoZmlyc3QpCisJCQkJeworCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQlmaXJlRXhjZXB0aW9uKCAib3BlbiIsIGUgKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UbHNDb25uZWN0aW9uLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UbHNDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwYmFjOAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rsc0Nvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEhhbmRzaGFrZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXI7CitpbXBvcnQgamF2YXgubmV0LnNzbC5YNTA5VHJ1c3RNYW5hZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVVJMOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgY29ubmVjdGlvbiB3aGljaCBoYW5kbGVzIGEgc2VjdXJlIHRjcCBjb25uZWN0aW9uLgorICovCitwdWJsaWMgY2xhc3MgVGxzQ29ubmVjdGlvbiBleHRlbmRzIFRjcFRyYW5zcG9ydAoreworCS8qKgorCSAqIFRlcm0gb24gdXJpIHdoaWNoIHNwZWNpZmllcyB3aGV0aGVyIHNlcnZlciBjZXJ0aWZpY2F0ZSBzaG91bGQgYmUgYXV0aGVudGljYXRlZC4KKwkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX1JFUUQgPSAiVGxzQ29ubmVjdGlvbi5hdXRoUmVxZCI7CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQ29ubmVjdGlvbiBmcm9tIGEgdXJpLgorCSAqIEBwYXJhbSBzb2NrZXQKKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqLworCXB1YmxpYyBUbHNDb25uZWN0aW9uKCBTU0xTb2NrZXQgc29ja2V0LCBTdHJpbmcgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzICkKKwl7CisJCXRoaXMoIHNvY2tldCwgbmV3IFVSTCggdXJpICksIHJlc291cmNlcyApOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBDb25uZWN0aW9uIGZyb20gYSB1cmkuCisJICogQHBhcmFtIHNvY2tldAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICovCisJcHVibGljIFRsc0Nvbm5lY3Rpb24oIFNTTFNvY2tldCBzb2NrZXQsIFVSTCB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJc3VwZXIoIHVyaSwgcmVzb3VyY2VzICk7CisJCXNldERlZmF1bHRBdXRoUmVxZCggdXJpLmdldEJvb2xlYW5UZXJtKCBBVVRIX1JFUUQsIHRydWUgKSApOworCQkKKwkJaWYgKHNvY2tldCA9PSBudWxsKQorCQl7CisJCQlTdHJpbmcgaCA9IHVyaS5nZXRIb3N0KCk7CisJCQlpZiAoaCA9PSBudWxsKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJob3N0ID09IG51bGwiICk7CisJCQkKKwkJCUludGVnZXIgcCA9IHVyaS5nZXRQb3J0KCk7CisJCQlpZiAocCA9PSBudWxsKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJwb3J0ID09IG51bGwiICk7CisJCQkKKwkJCWlmIChwIDw9IDAgfHwgcCA+IDY1NTM1KQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJwb3J0IDw9IDAgfHwgcG9ydCA+IDY1NTM1IiApOworCQkJCisJCQl0aGlzLnNvY2tldCA9IG51bGw7CisJCQlob3N0ID0gaDsKKwkJCXBvcnQgPSBwOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisJCQlob3N0ID0gbnVsbDsKKwkJCXBvcnQgPSAwOworCQl9CisJfQorCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKKwkKKwlwcml2YXRlIGZpbmFsIGludCBwb3J0OworCisJcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRBdXRoUmVxZCggYm9vbGVhbiBhdXRoUmVxZCApCisJeworCQl0aGlzLmF1dGhSZXFkID0gYXV0aFJlcWQ7CisJfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBhdXRoUmVxZDsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCVNvY2tldCBzID0gc29ja2V0OworCQkKKwkJaWYgKHMgIT0gbnVsbCkKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KAorCQkJCSJUbHNDb25uZWN0aW9uKHVwLCAlczolZCwgJXM6JWQpIiwKKwkJCQlzLmdldExvY2FsQWRkcmVzcygpLCBzLmdldExvY2FsUG9ydCgpLAorCQkJCXMuZ2V0SW5ldEFkZHJlc3MoKSwgcy5nZXRQb3J0KCkgKTsKKwkJCisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVGxzQ29ubmVjdGlvbihkb3duLCAlczolZCkiLCBob3N0LCBwb3J0ICk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2ZXIoKQorCXsKKwkJcmV0dXJuIGhvc3QgPT0gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU29ja2V0IG5ld1NvY2tldCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNTTFNvY2tldEZhY3Rvcnkgc3Nsc29ja2V0ZmFjdG9yeSA9IG51bGw7CisJCWlmIChhdXRoUmVxZCkKKwkJeworCQkJc3Nsc29ja2V0ZmFjdG9yeSA9IChTU0xTb2NrZXRGYWN0b3J5KSBTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVRydXN0TWFuYWdlcltdIHRydXN0QWxsQ2VydHMgPSBuZXcgVHJ1c3RNYW5hZ2VyW10geyBuZXcgWDUwOVRydXN0TWFuYWdlcigpCisJCQl7CisJCQkJcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBnZXRBY2NlcHRlZElzc3VlcnMoKQorCQkJCXsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCisJCQkJcHVibGljIHZvaWQgY2hlY2tDbGllbnRUcnVzdGVkKAorCQkJCQlqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10gY2VydHMsIFN0cmluZyBhdXRoVHlwZSApCisJCQkJeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBjaGVja1NlcnZlclRydXN0ZWQoCisJCQkJCWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBjZXJ0cywgU3RyaW5nIGF1dGhUeXBlICkKKwkJCQl7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0gfTsKKwkJCVNTTENvbnRleHQgc3NsYyA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoICJTU0x2MyIgKTsKKwkJCXNzbGMuaW5pdCggbnVsbCwgdHJ1c3RBbGxDZXJ0cywgbnVsbCApOworCQkJc3Nsc29ja2V0ZmFjdG9yeSA9IHNzbGMuZ2V0U29ja2V0RmFjdG9yeSgpOworCQl9CisJCXJldHVybiBzc2xzb2NrZXRmYWN0b3J5LmNyZWF0ZVNvY2tldCggaG9zdCwgcG9ydCApOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlYWRTb2NrZXQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IGlucHV0U3RyZWFtOworCQlpZiAoaXMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggInNvY2tldCBjbG9zZWQiICk7CisJCQorCQkvLyBUT0RPIGFsbG93IHNldHRpbmcgaW5wdXQgYnVmZmVyIHNpemUuCisJCWZpbmFsIEZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlWzgxOTJdICk7CisJCQorCQl0cnkKKwkJeworCQkJd2hpbGUgKGlzU3RhcnRlZCgpKQorCQkJeworLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCAicmVhZGluZyIgKTsKKwkJCQlpbnQgbiA9IGlzLnJlYWQoIGJ1Zi5nZXRCdWYoKSApOworLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCAicmVhZCAiK24gKTsKKwkJCQkKKwkJCQlpZiAobiA8PSAwKQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQlidWYuc2V0TGVuZ3RoKCBuICk7CisJCQkJYnVmLnNldEluZGV4KCAwICk7CisJCQkJZmlyZURhdGEoIGJ1ZiApOworCQkJfQorCQl9CisJCWNhdGNoICggU1NMSGFuZHNoYWtlRXhjZXB0aW9uIGV4ICkKKwkJeworCQkJU1NMSGFuZHNoYWtlRXhjZXB0aW9uIGV4YyA9IG5ldyBTU0xIYW5kc2hha2VFeGNlcHRpb24oCisJCQkJIiBQcm9ibGVtIGluIHNldHRpbmcgdXAgU1NMIENvbm5lY3Rpb24uIEVpdGhlciBkaXNhYmxlIgorCQkJCQkrICIgc2VydmVyIGF1dGhlbnRpY2F0aW9uIGJ5IHVzaW5nIGZsYWcgVGxzQ29ubmVjdGlvbi5hdXRoUmVxZD1mYWxzZSBpbiB1cmkgb3IgcHJvdmlkZSIKKwkJCQkJKyAiIGEgdHJ1c3RzdG9yZSBsb2NhdGlvbiB3aGljaCBjb250YWlucyB0aGUgdmFsaWQgY2VydGlmaWNhdGUiICk7CisJCQkvLyBleGMuc2V0U3RhY2tUcmFjZSggZXguZ2V0U3RhY2tUcmFjZSgpICk7CisJCQl0aHJvdyBleGM7CisJCX0KKwkJY2F0Y2ggKCBTb2NrZXRFeGNlcHRpb24gZSApCisJCXsKKy8vCQkJTG9nLnJlcG9ydCggInJlYWRTb2NrZXRGYWlsZWQiLAorLy8JCQkJInMubG9jYWwiLCBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorLy8JCQkJInMucmVtb3RlIiwgcy5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCksCisvLwkJCQkiZSIsIGUudG9TdHJpbmcoKSApOworCQkJCisJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisJCQlpZiAobXNnID09IG51bGwpCisJCQkJdGhyb3cgZTsKKwkJCQorCQkJbXNnID0gbXNnLnRvTG93ZXJDYXNlKCk7CisJCQkKKwkJCWlmIChtc2cuaW5kZXhPZiggInNvY2tldCBjbG9zZWQiICkgPj0gMCkKKwkJCQlyZXR1cm47CisJCQkKKwkJCWlmIChtc2cuaW5kZXhPZiggIlNvY2tldCBpcyBjbG9zZWQiICkgPj0gMCkKKwkJCQlyZXR1cm47CisJCQkKKwkJCWlmIChtc2cuaW5kZXhPZiggInJlY3YgZmFpbGVkIiApID49IDApCisJCQkJcmV0dXJuOworCQkJCisJCQlpZiAobXNnLmluZGV4T2YoICJjb25uZWN0aW9uIHJlc2V0IiApID49IDApCisJCQkJcmV0dXJuOworCQkJCisJCQl0aHJvdyBlOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNodXRkb3duSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisvLwkJY2hlY2tTb2NrZXQoKS5zaHV0ZG93bklucHV0KCk7CisJCWNoZWNrU29ja2V0KCkuY2xvc2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2h1dGRvd25PdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisvLwkJY2hlY2tTb2NrZXQoKS5zaHV0ZG93bk91dHB1dCgpOworCQljaGVja1NvY2tldCgpLmNsb3NlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGxzTGlzdGVuZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rsc0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3YjllNwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rsc0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5CaW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGEgY29ubmVjdGlvbiB3aGljaCBoYW5kbGVzIGEgc2VjdXJlIHNvY2tldCBsaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIFRsc0xpc3RlbmVyIGV4dGVuZHMgQ29ubmVjdGlvbjxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Pj4KKwlpbXBsZW1lbnRzIFRyYW5zcG9ydDxTZXNzaW9uTGlzdGVuZXI8U29ja2V0Pj4KK3sKKwkvKioKKwkgKiBRdWVyeSB0ZXJtIGZvciBVUkkgdG8gc3BlY2lmeSBiYWNrbG9nIHZhbHVlIHRvIFNlcnZlclNvY2tldC4gVGhlIHZhbHVlCisJICogaXMgIlRsc0xpc3RlbmVyLmJhY2tsb2ciLiBUaGUgYmFja2xvZyBtdXN0IGJlID49IDAgYW5kIHNvbWV3aGF0CisJICogcmVhc29uYWJsZS4gVGhlIHZhbHVlIDAgc3BlY2lmaWVzIHRoZSBzeXN0ZW0gZGVmYXVsdCwgdGhlIHNhbWUgYXMgaWYgeW91CisJICogbGVhdmUgdGhlIHRlcm0gb2ZmIGFsdG9nZXRoZXIuCisJICogCisJICogRXhhbXBsZTogdGxzOi8vaG9zdDpwb3J0P1Rsc0xpc3RlbmVyLmJhY2tsb2c9MjUwCisJICogCisJICogQHNlZSAjVGxzTGlzdGVuZXIoU3RyaW5nLCBSZXNvdXJjZXMpCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQkFDS0xPRyA9ICJUbHNMaXN0ZW5lci5iYWNrbG9nIjsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgVGxzTGlzdGVuZXIsIGluaXRpYWxpemVkIGZyb20gdGhlIFVSSS4gTGlzdGVucyBvbiB0aGUgaG9zdAorCSAqIGFuZCBwb3J0IHNwZWNpZmllZCBpbiB0aGUgVVJJLiBUbyBsaXN0ZW4gb24gYWxsIGludGVyZmFjZXMsIHNwZWNpZnkKKwkgKiBob3N0IGFzIEFMTF9JTlRGUyAoIjAuMC4wLjAiKS4gSWYgcG9ydCBpcyBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIHRvIDAsCisJICogYW4gdW51c2VkIHBvcnQgd2lsbCBiZSBzZWxlY3RlZC4KKwkgKiBAcGFyYW0gdXJpCisJICogQHBhcmFtIHJlc291cmNlcworCSAqLworCXB1YmxpYyBUbHNMaXN0ZW5lciggU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCBuZXcgVVJMKCB1cmkgKSwgcmVzb3VyY2VzICk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdHMgYSBUbHNMaXN0ZW5lciwgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgVVJJLiBMaXN0ZW5zIG9uIHRoZSBob3N0CisJICogYW5kIHBvcnQgc3BlY2lmaWVkIGluIHRoZSBVUkkuIFRvIGxpc3RlbiBvbiBhbGwgaW50ZXJmYWNlcywgc3BlY2lmeQorCSAqIGhvc3QgYXMgQUxMX0lOVEZTICgiMC4wLjAuMCIpLiBJZiBwb3J0IGlzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgdG8gMCwKKwkgKiBhbiB1bnVzZWQgcG9ydCB3aWxsIGJlIHNlbGVjdGVkLgorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzIAorCSAqIEBzZWUgVVJMI2dldEhvc3QoKQorCSAqIEBzZWUgVVJMI2dldFBvcnQoKQorCSAqIEBzZWUgVVJMI2dldEludGVnZXJUZXJtKFN0cmluZywgaW50KQorCSAqIEBzZWUgI0JBQ0tMT0cKKwkgKiBAc2VlICNBTExfSU5URlMKKwkgKiBAc2VlICNsb2NhbEFkZHJlc3MoKQorCSAqLworCXB1YmxpYyBUbHNMaXN0ZW5lciggVVJMIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCB0cmFuc2xhdGVIb3N0KCB1cmkuZ2V0SG9zdCgpICksIHVyaS5nZXRQb3J0KCksCisJCQl1cmkuZ2V0SW50ZWdlclRlcm0oIEJBQ0tMT0csIDAgKSApOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFRsc0xpc3RlbmVyLgorCSAqIEBwYXJhbSBob3N0IGFkZHJlc3MgdG8gbGlzdGVuIHRvLiBOdWxsIG1lYW5zIGFueSBsb2NhbCBhZGRyZXNzLgorCSAqIEBwYXJhbSBwb3J0IHBvcnQgdG8gbGlzdGVuIG9uLiBQb3J0IG11c3QgYmUgPj0gMC4gUG9ydCBvZiAwCisJICogbWVhbnMgYWxsb2NhdGUgYW4gYXZhaWxhYmxlIHBvcnQuCisJICogQHBhcmFtIGJhY2tsb2cgbWF4IG51bWJlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMuCisJICovCisJcHJpdmF0ZSBUbHNMaXN0ZW5lciggU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZyApCisJeworCQlpZiAocG9ydCA8IDAgfHwgcG9ydCA+IDY1NTM1KQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSIgKTsKKwkJCisJCWlmIChiYWNrbG9nIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJiYWNrbG9nIDwgMCIgKTsKKwkJCisJCXRoaXMuaG9zdCA9IGhvc3Q7CisJCXRoaXMucG9ydCA9IHBvcnQ7CisJCXRoaXMuYmFja2xvZyA9IGJhY2tsb2c7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKKwkKKwlwcml2YXRlIGZpbmFsIGludCBiYWNrbG9nOworCQorCXByaXZhdGUgU3RyaW5nIEtFWVNUT1JFID0gbnVsbDsKKwlwcml2YXRlIGNoYXJbXSBLRVlTVE9SRVBXID0gbnVsbDsKKwlwcml2YXRlIGNoYXJbXSBLRVlQQUlSUFdEID0gbnVsbDsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzdG9wMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWNsb3NlKCB0cnVlICk7CisJCXN1cGVyLnN0b3AwKCk7CisJfQorCQorCXByaXZhdGUgU1NMU2VydmVyU29ja2V0IGNoZWNrU29ja2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlTU0xTZXJ2ZXJTb2NrZXQgc3MgPSBzc2xTZXJ2ZXJTb2NrZXQ7CisJCWlmIChzcyA9PSBudWxsKQorCQkJdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbiggInNvY2tldCBjbG9zZWQiICk7CisJCXJldHVybiBzczsKKwl9CisKKwlwcml2YXRlIFNTTFNlcnZlclNvY2tldCBzc2xTZXJ2ZXJTb2NrZXQ7CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlTU0xTZXJ2ZXJTb2NrZXQgcyA9IHNzbFNlcnZlclNvY2tldDsKKwkJCisJCWlmIChzICE9IG51bGwpCisJCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIlRsc0xpc3RlbmVyKHVwLCAlcywgJWQpIiwKKwkJCQlzLmdldEluZXRBZGRyZXNzKCksIHMuZ2V0TG9jYWxQb3J0KCkgKTsKKworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIlRsc0xpc3RlbmVyKGRvd24sICVzLCAlZCkiLCBob3N0LCBwb3J0ICk7CisJCQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBvcGVuU29ja2V0KCBib29sZWFuIHJlY29ubmVjdCApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQl3aGlsZSAoaXNTdGFydGVkKCkpCisJCXsKKwkJCWlmIChyZWNvbm5lY3QgfHwgIWZpcnN0KQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJdHJ5CisJCQl7CisJCQkJSW5ldEFkZHJlc3MgaCA9IGhvc3QgIT0gbnVsbCA/IEluZXRBZGRyZXNzLmdldEJ5TmFtZSggaG9zdCApIDogbnVsbDsKKwkJCQl0cnkKKwkJCQl7CisJLy8JCQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCggcG9ydCwgYmFja2xvZywgaCApOworCQkJCQlpbml0aWFsaXplU1NMVmFyaWFibGVzKCk7CisJCQkJCUtleVN0b3JlIGtleXN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkpLUyIpOworCQkJCQlrZXlzdG9yZS5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oS0VZU1RPUkUpLCBLRVlTVE9SRVBXKTsKKwkJCQkJS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoIlN1blg1MDkiKTsKKwkJCQkJa21mLmluaXQoa2V5c3RvcmUsIEtFWVBBSVJQV0QpOworCQkJCQlTU0xDb250ZXh0IHNzbGMgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJTU0x2MyIpOworCQkJCQlzc2xjLmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIG51bGwsIG51bGwpOworCQkJCQlTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IHNzbFNlcnZlclNvY2tldEZhY3RvcnkgPSBzc2xjLmdldFNlcnZlclNvY2tldEZhY3RvcnkoKTsKKwkJCQkJCisJCQkvKgkJU1NMU2VydmVyU29ja2V0RmFjdG9yeSBzc2xTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0KKwkJICAgICAgICAgICAgICAgICAgIChTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5KSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsgICAqLworCQkgICAgICAgICAgICBzc2xTZXJ2ZXJTb2NrZXQgPQorCQkgICAgICAgICAgICAgICAgICAgIChTU0xTZXJ2ZXJTb2NrZXQpIHNzbFNlcnZlclNvY2tldEZhY3RvcnkuY3JlYXRlU2VydmVyU29ja2V0KCBwb3J0LCBiYWNrbG9nLCBoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBCaW5kRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJdGhyb3cgbmV3IEJpbmRFeGNlcHRpb24oICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlOiAiK2grIjoiK3BvcnQgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorCQkJCXsKKwkJCQkJSU9FeGNlcHRpb24gZXhjID0gbmV3IElPRXhjZXB0aW9uKCIgUHJvYmxlbSBpbiBzZXR0aW5nIHVwIFNTTCBDb25uZWN0aW9uLiBJbiBvcmRlciB0byB1c2UgU1NMICIgKworCQkJCQkJICIgcGxlYXNlIHNwZWNpZnkgdmFsaWQga2V5c3RvcmUgbG9jYXRpb24gYW5kIHBhc3N3b3JkIHVzaW5nIFZNIGFyZ3VtZW50cy4iICk7CisJCQkJCWV4Yy5zZXRTdGFja1RyYWNlKCBleC5nZXRTdGFja1RyYWNlKCkgKTsKKwkJCQkJZmlyZUV4Y2VwdGlvbigib3BlbiIsZXhjKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCWlmIChmaXJzdCkKKwkJCQl7CisJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCWZpcmVFeGNlcHRpb24oICJvcGVuIiwgZSApOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0dXBTb2NrZXQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBub3RoaW5nIHRvIGRvLgorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlYWRTb2NrZXQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTU0xTZXJ2ZXJTb2NrZXQgc3MgPSBjaGVja1NvY2tldCgpOworCQl3aGlsZSAoaXNTdGFydGVkKCkpCisJCXsKKwkJCVNTTFNvY2tldCBzID0gKFNTTFNvY2tldCkgc3MuYWNjZXB0KCk7CisJCQl0cnkKKwkJCXsKKwkJCQlpZiAoc2Vzc2lvbiA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oICJzZXNzaW9uID09IG51bGwiICk7CisJCQkJc2Vzc2lvbi5zZXNzaW9uQWNjZXB0ZWQoIHMgKTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCXMuY2xvc2UoKTsKKwkJCQlmaXJlRXhjZXB0aW9uKCAic2Vzc2lvbkFjY2VwdGVkIiwgZSApOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xvc2UoIGJvb2xlYW4gcmVzZXQgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTU0xTZXJ2ZXJTb2NrZXQgc3MgPSBzc2xTZXJ2ZXJTb2NrZXQ7CisJCWlmIChzcyAhPSBudWxsKQorCQl7CisJCQlzc2xTZXJ2ZXJTb2NrZXQgPSBudWxsOworCQkJc3MuY2xvc2UoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTb2NrZXRBZGRyZXNzIGxvY2FsQWRkcmVzcygpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGNoZWNrU29ja2V0KCkuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcmVzcygpCisJeworCQkvLyBpZ25vcmUuCisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNTTFZhcmlhYmxlcyAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkgU3RyaW5nIGtleVN0b3JlID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIik7CisJCSAgaWYoa2V5U3RvcmUgPT0gbnVsbCkgeworLy8JCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiamF2YXgubmV0LnNzbC5rZXlTdG9yZSBpcyBub3QgZGVmaW5lZCIpOworCQkJICB0aHJvdyBuZXcgRXhjZXB0aW9uKCIga2V5U3RvcmUgdmFyaWFibGUgaXMgbm90IGRlZmluZWQuIFBsZWFzZSBkZWZpbmUga2V5c3RvcmUgbG9jYXRpb24gdXNpbmciICsKKwkJCSAgCQkiIFZNIEFyZ3VtZW50cyIpOworCQkgIH0KKwkJICBlbHNlCisJCSAgeworCQkJICBLRVlTVE9SRSA9IGtleVN0b3JlOworLy8JCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiamF2YXgubmV0LnNzbC5rZXlTdG9yZSA9ICIgKyBLRVlTVE9SRSk7CisJCSAgfQorCQkgIAorCQkgIFN0cmluZyBrZXlwd2QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIpOworCQkgIGlmKGtleXB3ZCA9PSBudWxsKQorCQkgIHsKKy8vCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCBpcyBub3QgZGVmaW5lZCIpOworCQkJICB0aHJvdyBuZXcgRXhjZXB0aW9uKCIgS2V5U3RvcmUgUGFzc3dvcmQgaXMgbm90IGRlZmluZS4gUGxlYXNlIGRlZmluZSBrZXlzdG9yZSBwYXNzd29yZCB1c2luZyIgKworCQkgIAkJIiBWTSBBcmd1bWVudHMiKTsKKwkJICB9CisJCSAgZWxzZQorCQkgIHsKKwkJCSAgS0VZU1RPUkVQVyA9IGtleXB3ZC50b0NoYXJBcnJheSgpOworCQkgIH0KKwkJICAJCSAgCisJCSAgU3RyaW5nIGtleXBhaXJwd2QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5UGFpclBhc3N3b3JkIik7CisJCSAgaWYoa2V5cGFpcnB3ZCA9PSBudWxsKSB7CisvLwkJICAgU3lzdGVtLm91dC5wcmludGxuKCJqYXZheC5uZXQuc3NsLmtleVBhaXJQYXNzd29yZCBpcyBub3QgZGVmaW5lZCIpOworCQkgICBLRVlQQUlSUFdEID0gS0VZU1RPUkVQVzsKKwkJICB9CisJCSAgZWxzZSB7CisJCQkgIEtFWVBBSVJQV0QgPSBrZXlwYWlycHdkLnRvQ2hhckFycmF5KCk7CisJCSAgfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVHJhbnNwb3J0LmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzJkMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvOworCisvKioKKyAqIE91dC1vZi1iYW5kIHF1ZXJ5LCBjb250cm9sLCBhbmQgbm90aWZpY2F0aW9uIGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cy4KKyAqIEBwYXJhbSA8Uz4gdGhlIHN1YmNsYXNzIG9mIFNlc3Npb24gZm9yIHRoaXMgVHJhbnNwb3J0LgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zcG9ydDxTIGV4dGVuZHMgU2Vzc2lvbj4KK3sKKwkvKioKKwkgKiBOYW1lIG9mIHZhbHVlIGZhY3RvcnkgaW4gcmVzb3VyY2VzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0ZBQ1RPUlkgPSAiVHJhbnNwb3J0LnZhbHVlRmFjdG9yeSI7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIGZvciB0aGlzIHRyYW5zcG9ydC4KKwkgKiBAcmV0dXJuIHRoZSBzZXNzaW9uIGZvciB0aGlzIHRyYW5zcG9ydC4KKwkgKi8KKwlwdWJsaWMgUyBnZXRTZXNzaW9uKCk7CisJCisJLyoqCisJICogU2V0cyB0aGUgc2Vzc2lvbiBmb3IgdGhpcyB0cmFuc3BvcnQuCisJICogQHBhcmFtIHNlc3Npb24gc2Vzc2lvbiB0byByZWNlaXZlIGRhdGEgZnJvbSB0aGUgdHJhbnNwb3J0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFMgc2Vzc2lvbiApOworCQkKKwkvKioKKwkgKiBHZXRzIGEgY29uZmlndXJhdGlvbiBvciBvcGVyYXRpb25hbCB2YWx1ZSBmcm9tIHRoZSB0cmFuc3BvcnQuIFRoZQorCSAqIHJlcXVlc3QgaXMgcGFzc2VkIGRvd24gdGhlIGNoYWluIG9mIHRyYW5zcG9ydHMgdW50aWwgc29tZSB0cmFuc3BvcnQKKwkgKiByZWNvZ25pemVzIHRoZSBxdWVyeSwgd2hlcmV1cG9uIGl0IHJldHVybnMgdGhlIHJlcXVlc3RlZCB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gcXVlcnkgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHF1ZXJ5LCB3aGljaCBjb3VsZCBiZSBhcworCSAqIHNpbXBsZSBhcyBhIHN0cmluZywgaW50ZWdlciwgb3IgZW51bSwgb3IgbW9yZSBjb21wbGV4IHN1Y2ggYXMKKwkgKiBhIGNsYXNzIHdpdGggaW5zdGFuY2UgdmFyaWFibGVzIGZvciBxdWVyeSB0ZXJtcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIG9yIG51bGwgaWYgbm90IGRlZmluZWQuCisJICogCisJICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgaXMgbm90IHJlY29nbml6ZWQKKwkgKiBieSBhbnkgdHJhbnNwb3J0ICh3aGljaCBpcyB0byBzYXksIGlmIHRoZSBsYXN0IHRyYW5zcG9ydCBpbiB0aGUgdHJhbnNwb3J0CisJICogY2hhaW4gZG9lcyBub3QgcmVjb2duaXplIGl0LCBpdCBzaG91bGQgdGhyb3cgdGhpcyBleGNlcHRpb24pLiBUeXBpY2FsbHkKKwkgKiB0aGlzIHdvdWxkIGJlIHNvbWUgc29ydCBvZiB0cmFuc3BvcnQgbWVjaGFuaXNtIHN1Y2ggYXMgdGNwLCB1ZHAsIGptcywKKwkgKiBodHRwLCBzaXAsIGV0Yy4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogU2V0cyBhIGNvbmZpZ3VyYXRpb24gb3Igb3BlcmF0aW9uYWwgdmFsdWUgaW4gdGhlIHRyYW5zcG9ydC4gVGhlCisJICogcmVxdWVzdCBpcyBwYXNzZWQgZG93biB0aGUgY2hhaW4gb2YgdHJhbnNwb3J0cyB1bnRpbCBzb21lIHRyYW5zcG9ydAorCSAqIHJlY29nbml6ZXMgdGhlIGNvbnRyb2wsIHdoZXJldXBvbiBpdCBzdG9yZXMgdGhlIHNwZWNpZmllZCB2YWx1ZQorCSAqIGFuZCByZXR1cm5zLgorCSAqIAorCSAqIEBwYXJhbSBjb250cm9sIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjb250cm9sLCB3aGljaCBjb3VsZCBiZSBhcworCSAqIHNpbXBsZSBhcyBhIHN0cmluZywgaW50ZWdlciwgb3IgZW51bSwgb3IgbW9yZSBjb21wbGV4IHN1Y2ggYXMKKwkgKiBhIGNsYXNzIHdpdGggaW5zdGFuY2UgdmFyaWFibGVzIGZvciBjb250cm9sIHRlcm1zLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgorCSAqIAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0CisJICogdHlwZSBvciBpZiB0aGUgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZS4KKwkgKiAKKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBjb250cm9sIGlzIG5vdCByZWNvZ25pemVkCisJICogYnkgYW55IHRyYW5zcG9ydCAod2hpY2ggaXMgdG8gc2F5LCBpZiB0aGUgbGFzdCB0cmFuc3BvcnQgaW4gdGhlIHRyYW5zcG9ydAorCSAqIGNoYWluIGRvZXMgbm90IHJlY29nbml6ZSBpdCwgaXQgc2hvdWxkIHRocm93IHRoaXMgZXhjZXB0aW9uKS4gVHlwaWNhbGx5CisJICogdGhpcyB3b3VsZCBiZSBzb21lIHNvcnQgb2YgdHJhbnNwb3J0IG1lY2hhbmlzbSBzdWNoIGFzIHRjcCwgdWRwLCBqbXMsCisJICogaHR0cCwgc2lwLCBldGMuCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBOb3RpZmllcyB0aGUgY2hhaW4gb2YgdHJhbnNwb3J0cyBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LiBVbmxpa2UgcXVlcnkKKwkgKiBhbmQgY29udHJvbCBvcGVyYXRpb25zIGFib3ZlLCBldmVudHMgYXJlIGFsd2F5cyBwYXNzZWQgZG93biB0byB0aGUKKwkgKiBib3R0b20gdG8gYWxsb3cgYWxsIHRyYW5zcG9ydHMgdG8gbm90aWNlIHRoZW0gKHRob3VnaCBpdCBpcyBwb3NzaWJsZQorCSAqIHRoYXQgYW4gZXZlbnQgbWlnaHQgYmUgZGVsYXllZCBmb3IgYSBiaXQpLgorCSAqIAorCSAqIEBwYXJhbSBldmVudCBhIGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LCBwb3NzaWJseSB3aXRoCisJICogcGFyYW1ldGVycy4gVGhlIHNpbXBsZXN0IGV2ZW50IGNvdWxkIGJlIGEgc3RyaW5nLCBpbnRlZ2VyLCBvciBlbnVtLAorCSAqIGJ1dCBhbnkgY2xhc3MgaW5zdGFuY2Ugd2lsbCBkbyAoYXMgbG9uZyBhcyBzb21lIHRyYW5zcG9ydCBpbiB0aGUKKwkgKiBjaGFpbiBleHBlY3RzIGl0KS4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gV2VsbC1rbm93biBxdWVyaWVzLCBjb250cm9scywgYW5kIGV2ZW50cy4gLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIFRyYW5zcG9ydCBjb250cm9sIHdoaWNoIHN0YXJ0cyB0aGUgdHJhbnNwb3J0IHN0YWNrLiBUaGUgYXJndW1lbnQKKwkgKiBzaG91bGQgYmUgbnVsbC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFSVCA9ICJTVEFSVCI7CisJCisJLyoqCisJICogVHJhbnNwb3J0IGNvbnRyb2wgd2hpY2ggc3RhcnRzIHRoZSB0cmFuc3BvcnQgc3RhY2sgYW5kIHdhaXRzCisJICogZm9yIGl0IHRvIGNvbWUgdXAuIFRoZSBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGludGVnZXIgbnVtYmVyIG9mCisJICogbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFSVF9BTkRfV0FJVF9VUCA9ICJTVEFSVF9BTkRfV0FJVF9VUCI7CisJCisJLyoqCisJICogVHJhbnNwb3J0IHF1ZXJ5IHdoaWNoIHdhaXRzIGZvciB0aGUgdHJhbnNwb3J0IHN0YWNrIHRvIGNvbWUgdXAuCisJICovCisJcHVibGljIGNsYXNzIFdhaXRVcAorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBtYXhEZWxheSBtYXggZGVsYXkgaW4gbWlsbGlzZWNvbmRzLgorCQkgKi8KKwkJcHVibGljIFdhaXRVcCggaW50IG1heERlbGF5ICkKKwkJeworCQkJdGhpcy5tYXhEZWxheSA9IG1heERlbGF5OworCQl9CisJCQorCQkvKioKKwkJICogbWF4IGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KKwkJICovCisJCXB1YmxpYyBmaW5hbCBpbnQgbWF4RGVsYXk7CisJfQorCQorCS8qKgorCSAqIFRyYW5zcG9ydCBjb250cm9sIHdoaWNoIHN0b3BzIHRoZSB0cmFuc3BvcnQgc3RhY2suIFRoZSBhcmd1bWVudAorCSAqIHNob3VsZCBiZSBudWxsLCBvciBhIEJvb2xlYW4gcmVzZXQgKHRydWUgZm9yIGluc3RhbnQgY2xvc2UsCisJICogZmFsc2UgZm9yIGEgbmljZXIsIGdlbnRsZXIgY2xvc2UpLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1AgPSAiU1RPUCI7CisKKwkvKioKKwkgKiBUcmFuc3BvcnQgY29udHJvbCB3aGljaCBzdG9wcyB0aGUgdHJhbnNwb3J0IHN0YWNrIGFuZCB3YWl0cworCSAqIGZvciBpdCB0byBnbyBkb3duLiBUaGUgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBpbnRlZ2VyIG51bWJlciBvZgorCSAqIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUF9BTkRfV0FJVF9ET1dOID0gIlNUT1BfQU5EX1dBSVRfRE9XTiI7CisKKwkvKioKKwkgKiBUcmFuc3BvcnQgY29udHJvbCB3aGljaCByZXNldHMgdGhlIHRyYW5zcG9ydCBzdGFjayAoZS5nLiwgY2xvc2VzIHRoZQorCSAqIHNvY2tldCkgd2l0aG91dCBzdG9wcGluZyBpdC4gSWYgaXQgaXMgc2V0IHRvIHJlY29ubmVjdCwgdGhlbiBpdCB3aWxsIGRvCisJICogdGhhdC4gT25seSBtZWFuaW5nZnVsIGZvciBjb25uZWN0aW9uIG9yaWVudGVkIHRyYW5zcG9ydHMuIE90aGVycyB0eXBlcworCSAqIHdpbGwgaWdub3JlIHRoaXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVQgPSAiUkVTRVQiOworCisJLyoqCisJICogVHJhbnNwb3J0IHF1ZXJ5IHdoaWNoIGFza3MgaXMgdGhpcyBhIGxpc3RlbmVyIGluaXRpYXRlZCBjb25uZWN0aW9uIG9yCisJICogaXMgdGhpcyBhIGNsaWVudCBpbml0aWF0ZWQgY29ubmVjdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TRVJWRVIgPSAiSVNfU0VSVkVSIjsKKworCS8qKgorCSAqIFRyYW5zcG9ydCBxdWVyeSB3aGljaCB3YWl0cyBmb3IgdGhlIHRyYW5zcG9ydCBzdGFjayB0byBnbyBkb3duLgorCSAqLworCXB1YmxpYyBjbGFzcyBXYWl0RG93bgorCXsKKwkJLyoqCisJCSAqIEBwYXJhbSBtYXhEZWxheSBtYXggZGVsYXkgaW4gbWlsbGlzZWNvbmRzLgorCQkgKi8KKwkJcHVibGljIFdhaXREb3duKCBpbnQgbWF4RGVsYXkgKQorCQl7CisJCQl0aGlzLm1heERlbGF5ID0gbWF4RGVsYXk7CisJCX0KKworCQkvKioKKwkJICogbWF4IGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KKwkJICovCisJCXB1YmxpYyBmaW5hbCBpbnQgbWF4RGVsYXk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVHJhbnNwb3J0RGF0YS5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVHJhbnNwb3J0RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzM2NDcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UcmFuc3BvcnREYXRhLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5GbGV4QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworCisvKioKKyAqIEludGVyZmFjZSB1c2VkIHRvIGRlbGl2ZXIgZGF0YSB0byB0aGUgdHJhbnNwb3J0IGZyb20gdGhlIHNlc3Npb24uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0RGF0YSBleHRlbmRzIFRyYW5zcG9ydDxTZXNzaW9uRGF0YT4KK3sKKwkvKioKKwkgKiBEZWxpdmVycyB0aGUgZGF0YSB0byB0aGUgdHJhbnNwb3J0LgorCSAqIEBwYXJhbSByZWNpcGllbnQgc3BlY2lmaWVzIHRoZSByZWNpcGllbnQgd2hlbiB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkKKwkgKiBvZiBtb3JlIHRoYW4gb25lLgorCSAqIEBwYXJhbSBidWYgdGhlIEZsZXhCdWZmZXIgcG9zaXRpb25lZCBvbiB0aGUgZGF0YS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydERhdGEoIFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1RyYW5zcG9ydFBhY2tldC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVHJhbnNwb3J0UGFja2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxZTJiYwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1RyYW5zcG9ydFBhY2tldC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKKworLyoqCisgKiBJbnRlcmZhY2UgdXNlZCB0byBkZWxpdmVyIHBhY2tldHMgdG8gdGhlIHRyYW5zcG9ydCBmcm9tIHRoZSBzZXNzaW9uLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zcG9ydFBhY2tldCBleHRlbmRzIFRyYW5zcG9ydDxTZXNzaW9uUGFja2V0PgoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBhY2tldCBoZWFkZXIgZm9yIHRoZSB0cmFuc3BvcnQuCisJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0IGhlYWRlciBmb3IgdGhlIHRyYW5zcG9ydC4KKwkgKi8KKwlwdWJsaWMgaW50IGhlYWRlclNpemUoKTsKKwkKKwkvKioKKwkgKiBEZWxpdmVycyB0aGUgcGFja2V0IHRvIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgYWRkaW5nIHRoZSBwYWNrZXQgaGVhZGVyLgorCSAqIEBwYXJhbSByZWNpcGllbnQgc3BlY2lmaWVzIHRoZSByZWNpcGllbnQgd2hlbiB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkKKwkgKiBvZiBtb3JlIHRoYW4gb25lLgorCSAqIEBwYXJhbSBidWYgdGhlIEZsZXhCdWZmZXIgcG9zaXRpb25lZCBvbiB0aGUgcGFja2V0LCBpbmNsdWRpbmcgc3BhY2UgZm9yCisJICogdGhlIGhlYWRlci4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydFBhY2tldCggV2hvIHJlY2lwaWVudCwgRmxleEJ1ZmZlciBidWYgKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVWRwQ29ubmVjdGlvbi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVWRwQ29ubmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2YyMjMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9VZHBDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkZsZXhCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3Rpb24gd2hpY2ggaGFuZGxlcyBhIHVkcCBjb25uZWN0aW9uLgorICovCitwdWJsaWMgY2xhc3MgVWRwQ29ubmVjdGlvbiBleHRlbmRzIENvbm5lY3Rpb248U2Vzc2lvblBhY2tldD4KKwlpbXBsZW1lbnRzIFRyYW5zcG9ydFBhY2tldAoreworCS8qKgorCSAqIFRlcm0gb24gdGhlIHVyaSB3aGljaCBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgdHJhZmZpYyBjbGFzcy4KKwkgKiBAc2VlICNzZXREZWZhdWx0VHJhZmZpY0NsYXNzKGludCkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBRkZJQ19DTEFTUyA9ICJVZHBDb25uZWN0aW9uLnRyYWZmaWNDbGFzcyI7CisJCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgQ29ubmVjdGlvbiBmcm9tIGEgdXJpLgorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgVWRwQ29ubmVjdGlvbiggU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1ID0gbmV3IFVSTCggdXJpICk7CisJCQorCQlsaXN0ZW4gPSB1LmdldEJvb2xlYW5UZXJtKCAibGlzdGVuIiwgZmFsc2UgKTsKKwkJCisJCWhvc3QgPSB0cmFuc2xhdGVIb3N0KCB1LmdldEhvc3QoKSApOworCQlpZiAoIWxpc3RlbiAmJiBob3N0ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaG9zdCA9PSBudWxsIiApOworCQkKKwkJcG9ydCA9IHUuZ2V0UG9ydCgpOworCQlpZiAocG9ydCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBvcnQgPT0gbnVsbCIgKTsKKwkJCisJCWlmIChwb3J0IDw9IDAgfHwgcG9ydCA+IDY1NTM1KQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBvcnQgPD0gMCB8fCBwb3J0ID4gNjU1MzUiICk7CisJCQorCQlzZXREZWZhdWx0VHJhZmZpY0NsYXNzKCB1LmdldEludGVnZXJUZXJtKCBUUkFGRklDX0NMQVNTLCAwICkgKTsKKwkJCisJCS8vIHRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGRvIHRoaXM6CisJCS8vIDEuIGJvdW5kIHNvY2tldCwgdW5jb25uZWN0ZWQgKGxpc3RlbmluZyB0byBhbnlvbmUgb24gd2VsbC1rbm93biBob3N0L3BvcnQKKwkJLy8gMi4gYm91bmQgc29ja2V0LCBjb25uZWN0ZWQgKGxpc3RlbmluZyB0byBzb21lb25lIG9uIHdlbGwta25vd24gaG9zdC9wb3J0KQorCQkvLyAzLiB1bmJvdW5kIHNvY2tldCwgY29ubmVjdGVkIChsaXN0ZW5pbmcgdG8gc29tZW9uZSBvbiBhc3NpZ25lZCBob3N0L3BvcnQpCisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CisJCisJcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIHBvcnQ7CisJCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGxpc3RlbjsKKwkKKwlwcml2YXRlIERhdGFncmFtU29ja2V0IHNvY2tldDsKKwkKKwkvLyBUT0RPIGFzc2lnbiBkZWZhdWx0UmVjaXBpZW50IGEgdmFsdWUgc29tZWhvdworCXByaXZhdGUgV2hvIGRlZmF1bHRSZWNpcGllbnQ7CisJCisJLyoqCisJICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRyYWZmaWMgY2xhc3MgKG9yIHR5cGUgb2Ygc2VydmljZQorCSAqIG9yIGRzY3ApLiBGb3IgZXhhbXBsZSwgY2FsbCBzaWduYWxpbmcgdHJhZmZpYyBpcyBjbGFzc2lmaWVkIGFzCisJICogRFNDUCBDUzMgKDAxMTAwMCkgd2l0aCByZXN1bHRpbmcgdHJhZmZpYyBjbGFzcyB2YWx1ZSBvZiAwMTEwMDAwMCwKKwkgKiAweDYwLCBvciA5Ni4gRm9yIG1vcmUgb24gRFNDUCBzZWUgUkZDIDI0NzQgKHN1cGVyY2VkZXMgVE9TIGRlZmluZWQKKwkgKiBpbiBSRkMgNzkxKQorCSAqIEBwYXJhbSB0cmFmZmljQ2xhc3MgdHJhZmZpYyBjbGFzcyBvciB0eXBlIG9mIHNlcnZpY2Ugb3IgZHNjcC4gVGhlCisJICogZGVmYXVsdCBpcyAwLCB3aGljaCBpbXBsaWVzIG5vcm1hbCBoYW5kbGluZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VHJhZmZpY0NsYXNzKCBpbnQgdHJhZmZpY0NsYXNzICkKKwl7CisJCXRoaXMudHJhZmZpY0NsYXNzID0gdHJhZmZpY0NsYXNzOworCX0KKwkKKwlwcml2YXRlIGludCB0cmFmZmljQ2xhc3MgPSAwOworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIG9wZW5Tb2NrZXQoIGJvb2xlYW4gcmVjb25uZWN0ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKHNvY2tldCAhPSBudWxsKQorCQkJc29ja2V0LmNsb3NlKCk7CisJCQorCQlzb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKKwkJCisJCWlmIChsaXN0ZW4pCisJCQlzb2NrZXQuYmluZCggaG9zdCAhPSBudWxsID8gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCBob3N0LCBwb3J0ICkgOiBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIHBvcnQgKSApOworCQllbHNlCisJCQlzb2NrZXQuY29ubmVjdCggbmV3IEluZXRTb2NrZXRBZGRyZXNzKCBob3N0LCBwb3J0ICkgKTsKKwkJCisJCWlmICghcmVjb25uZWN0ICYmIHNvY2tldCAhPSBudWxsKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0dXBTb2NrZXQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlEYXRhZ3JhbVNvY2tldCBzID0gY2hlY2tTb2NrZXQoKTsKKwkJCisJCXMuc2V0VHJhZmZpY0NsYXNzKCB0cmFmZmljQ2xhc3MgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZWFkU29ja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZmluYWwgRGF0YWdyYW1Tb2NrZXQgcyA9IGNoZWNrU29ja2V0KCk7CisJCS8vIFRPRE8gYWxsb3cgYnVmZmVyIHNpemUgdG8gYmUgc3BlY2lmaWVkLgorCQlmaW5hbCBGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVs4MTkyXSApOworCQlmaW5hbCBEYXRhZ3JhbVBhY2tldCBwID0gbmV3IERhdGFncmFtUGFja2V0KCBuZXcgYnl0ZVswXSwgMCApOworCQkKKwkJdHJ5CisJCXsKKwkJCXdoaWxlIChpc1N0YXJ0ZWQoKSkKKwkJCXsKKwkJCQlwLnNldERhdGEoIGJ1Zi5nZXRCdWYoKSApOworCQkJCQorCQkJCXMucmVjZWl2ZSggcCApOworCQkJCQorCQkJCWJ1Zi5zZXRJbmRleCggMCApOworCQkJCWJ1Zi5zZXRMZW5ndGgoIHAuZ2V0TGVuZ3RoKCkgKTsKKwkJCQkKKwkJCQlpZiAocy5pc0Nvbm5lY3RlZCgpKQorCQkJCQlzZXNzaW9uLnNlc3Npb25QYWNrZXQoIG51bGwsIGJ1ZiApOworCQkJCWVsc2UKKwkJCQkJc2Vzc2lvbi5zZXNzaW9uUGFja2V0KCBnZXRXaG8oIHAuZ2V0QWRkcmVzcygpLCBwLmdldFBvcnQoKSApLCBidWYgKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoIFNvY2tldEV4Y2VwdGlvbiBlICkKKwkJeworCQkJaWYgKCJzb2NrZXQgY2xvc2VkIi5lcXVhbHNJZ25vcmVDYXNlKCBlLmdldE1lc3NhZ2UoKSkpCisJCQkJcmV0dXJuOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKworCXByaXZhdGUgRGF0YWdyYW1Tb2NrZXQgY2hlY2tTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCURhdGFncmFtU29ja2V0IHMgPSBzb2NrZXQ7CisJCWlmIChzID09IG51bGwgfHwgcy5pc0Nsb3NlZCgpKQorCQkJdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbiggInNvY2tldCBjbG9zZWQiICk7CisJCXJldHVybiBzOworCX0KKwkKKwlwcml2YXRlIFdobyBnZXRXaG8oIEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0ICkKKwl7CisJCWlmIChsYXN0V2hvID09IG51bGwgfHwgIWxhc3RXaG8ubWF0Y2hlcyggYWRkcmVzcywgcG9ydCApKQorCQkJbGFzdFdobyA9IG5ldyBJbmV0V2hvKCBhZGRyZXNzLCBwb3J0ICk7CisJCXJldHVybiBsYXN0V2hvOworCX0KKwkKKwlwcml2YXRlIEluZXRXaG8gbGFzdFdobzsKKwkKKwlwcml2YXRlIGZpbmFsIERhdGFncmFtUGFja2V0IG91dHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoIG5ldyBieXRlWzBdLCAwICk7CisKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRQYWNrZXQoIFdobyByZWNpcGllbnQsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAicGFja2V0KCAlcywgYnVmKCAlZCwgJWQgKSkiLCByZWNpcGllbnQsIGJ1Zi5pbmRleCgpLCBidWYuYXZhaWwoKSApOworCQlpZiAoc29ja2V0LmlzQ29ubmVjdGVkKCkpCisJCXsKKwkJCW91dHAuc2V0RGF0YSggYnVmLmdldEJ1ZigpLCBidWYuaW5kZXgoKSwgYnVmLmF2YWlsKCkgKTsKKwkJCXNvY2tldC5zZW5kKCBvdXRwICk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChyZWNpcGllbnQgPT0gbnVsbCkKKwkJCXJlY2lwaWVudCA9IGRlZmF1bHRSZWNpcGllbnQ7CisJCQorCQlpZiAocmVjaXBpZW50ICE9IG51bGwpCisJCXsKKwkJCUluZXRXaG8gaXcgPSAoSW5ldFdobykgcmVjaXBpZW50OworCQkJb3V0cC5zZXREYXRhKCBidWYuZ2V0QnVmKCksIGJ1Zi5pbmRleCgpLCBidWYuYXZhaWwoKSApOworCQkJb3V0cC5zZXRBZGRyZXNzKCBpdy5nZXRJbmV0QWRkcmVzcygpICk7CisJCQlvdXRwLnNldFBvcnQoIGl3LmdldFBvcnQoKSApOworCQkJc29ja2V0LnNlbmQoIG91dHAgKTsKKwkJCQorCQkJcmV0dXJuOworCQl9CisJCQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibm8gcmVjaXBpZW50IiApOworCX0KKworCXB1YmxpYyBpbnQgaGVhZGVyU2l6ZSgpCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSggYm9vbGVhbiByZXNldCApCisJeworCQlEYXRhZ3JhbVNvY2tldCBzID0gc29ja2V0OworCQlpZiAocyAhPSBudWxsKQorCQl7CisJCQlzb2NrZXQgPSBudWxsOworCQkJcy5jbG9zZSgpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNvY2tldEFkZHJlc3MgbG9jYWxBZGRyZXNzKCkKKwl7CisJCXJldHVybiBzb2NrZXQuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcmVzcygpCisJeworCQlyZXR1cm4gc29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL0Fic3RyYWN0SGFuZGxlci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL0Fic3RyYWN0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmQ1NDkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vQWJzdHJhY3RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pbzsKKworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIEhhbmRsZXIuCisgKiBAcGFyYW0gPFQ+CisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdEhhbmRsZXI8VCBleHRlbmRzIFNlbGVjdGFibGVDaGFubmVsPgorCWltcGxlbWVudHMgSGFuZGxlcjxUPgoreworCS8qKgorCSAqIEBwYXJhbSBjaGFubmVsCisJICovCisJcHVibGljIEFic3RyYWN0SGFuZGxlciggVCBjaGFubmVsICkKKwl7CisJCXRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisJfQorCQorCXByaXZhdGUgZmluYWwgVCBjaGFubmVsOworCisJcHVibGljIGZpbmFsIFQgY2hhbm5lbCgpCisJeworCQlyZXR1cm4gY2hhbm5lbDsKKwl9CisKKwlwdWJsaWMgZmluYWwgdm9pZCByZWdpc3RlcmVkKCBTZWxlY3RvciBzZWxlY3RvciwgU2VsZWN0aW9uS2V5IGtleSApCisJeworCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCXRoaXMua2V5ID0ga2V5OworCQlyZWdpc3RlcmVkKCk7CisJfQorCisJcHJpdmF0ZSBTZWxlY3RvciBzZWxlY3RvcjsKKwkKKwlwcml2YXRlIFNlbGVjdGlvbktleSBrZXk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgU2VsZWN0b3Igb2YgdGhlIGhhbmRsZXIuCisJICovCisJcHVibGljIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yKCkKKwl7CisJCXJldHVybiBzZWxlY3RvcjsKKwl9CisKKwlwdWJsaWMgZmluYWwgU2VsZWN0aW9uS2V5IGtleSgpCisJeworCQlyZXR1cm4ga2V5OworCX0KKwkKKwkvKioKKwkgKiBOb3RpZmllcyB0aGUgaGFuZGxlciB0aGF0IGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBhIHNlbGVjdG9yLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyZWQoKQorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisKKwlwdWJsaWMgZmluYWwgaW50IGdldExhc3RJbnRlcmVzdE9wcygpCisJeworCQlyZXR1cm4gbGFzdEludGVyZXN0T3BzOworCX0KKworCXB1YmxpYyBmaW5hbCB2b2lkIHNldExhc3RJbnRlcmVzdE9wcyggaW50IG9wcyApCisJeworCQlsYXN0SW50ZXJlc3RPcHMgPSBvcHM7CisJfQorCisJcHJpdmF0ZSBpbnQgbGFzdEludGVyZXN0T3BzOworCQorCXB1YmxpYyBmaW5hbCB2b2lkIHNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU2VsZWN0aW9uS2V5IGsgPSBrZXk7CisJCWlmIChrID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlpbnQgb3BzID0gay5yZWFkeU9wcygpOworCQkKKwkJaWYgKChvcHMgJiBTZWxlY3Rpb25LZXkuT1BfQUNDRVBUKSAhPSAwKQorCQl7CisJCQlkb0FjY2VwdCgpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoKG9wcyAmIFNlbGVjdGlvbktleS5PUF9DT05ORUNUKSAhPSAwKQorCQl7CisJCQlkb0Nvbm5lY3QoKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKChvcHMgJiBTZWxlY3Rpb25LZXkuT1BfUkVBRCkgIT0gMCkKKwkJCWRvUmVhZCgpOworCQkKKwkJaWYgKChvcHMgJiBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpICE9IDApCisJCQlkb1dyaXRlKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZG9BY2NlcHQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJkb0FjY2VwdCBub3QgaW1wbGVtZW50ZWQiICk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZG9Db25uZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCAiZG9Db25uZWN0IG5vdCBpbXBsZW1lbnRlZCIgKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkb1JlYWQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJkb1JlYWQgbm90IGltcGxlbWVudGVkIiApOworCX0KKworCXByb3RlY3RlZCB2b2lkIGRvV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJkb1dyaXRlIG5vdCBpbXBsZW1lbnRlZCIgKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgaW50IGdldEludGVyZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGNhbkFjY2VwdCgpKQorCQkJcmV0dXJuIFNlbGVjdGlvbktleS5PUF9BQ0NFUFQ7CisJCQorCQlpZiAoY2FuQ29ubmVjdCgpKQorCQkJcmV0dXJuIFNlbGVjdGlvbktleS5PUF9DT05ORUNUOworCQkKKwkJaW50IG9wcyA9IGNhblJlYWQoKSA/IFNlbGVjdGlvbktleS5PUF9SRUFEIDogMDsKKwkJCisJCWlmIChjYW5Xcml0ZSgpKQorCQkJb3BzIHw9IFNlbGVjdGlvbktleS5PUF9XUklURTsKKwkJCisJCXJldHVybiBvcHM7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGhhbmRsZXIgY2FuIGFjY2VwdC4gQ2FsbGVkIGZyb20KKwkgKiB7QGxpbmsgI2dldEludGVyZXN0T3BzKCl9LgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNhbkFjY2VwdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgaGFuZGxlciBjYW4gY29ubmVjdC4gQ2FsbGVkIGZyb20KKwkgKiB7QGxpbmsgI2dldEludGVyZXN0T3BzKCl9LgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNhbkNvbm5lY3QoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGhhbmRsZXIgY2FuIHJlYWQuIENhbGxlZCBmcm9tCisJICoge0BsaW5rICNnZXRJbnRlcmVzdE9wcygpfS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBoYW5kbGVyIGNhbiB3cml0ZS4gQ2FsbGVkIGZyb20KKwkgKiB7QGxpbmsgI2dldEludGVyZXN0T3BzKCl9LgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNhbldyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGludGVyZXN0IG9wcyBvZiB0aGUgY2hhbm5lbC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCB1cGRhdGVJbnRlcmVzdE9wcygpCisJeworCQlTZWxlY3RvciBzID0gc2VsZWN0b3I7CisJCWlmIChzID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAic2VsZWN0b3IgPT0gbnVsbCIgKTsKKwkJcy51cGRhdGVJbnRlcmVzdE9wcyggdGhpcyApOworCX0KKwkKKwkvKioKKwkgKiBDYW5jZWxzIHRoZSByZWdpc3RyYXRpb24gb2YgdGhpcyBoYW5kbGVyLgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIGNhbmNlbCgpCisJeworCQlTZWxlY3RvciBzID0gc2VsZWN0b3I7CisJCWlmIChzICE9IG51bGwpCisJCQlzLmNhbmNlbCggdGhpcyApOworCQllbHNlCisJCQljYW5jZWxlZCggbnVsbCApOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjYW5jZWxlZCggRXhjZXB0aW9uIGUgKQorCXsKKwkJdHJ5CisJCXsKKwkJCWlmIChlICE9IG51bGwpCisJCQkJcmVwb3J0RXhjZXB0aW9uKCBlICk7CisJCQkKKwkJCWlmIChrZXkgIT0gbnVsbCkKKwkJCQlrZXkuY2FuY2VsKCk7CisJCQkKKwkJCWNoYW5uZWwuY2xvc2UoKTsKKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlMSApCisJCXsKKwkJCXJlcG9ydEV4Y2VwdGlvbiggZTEgKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXNlbGVjdG9yID0gbnVsbDsKKwkJCWtleSA9IG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZXBvcnRFeGNlcHRpb24oIEV4Y2VwdGlvbiBlICkKKwl7CisJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCisJCXsKKwkJCWlmIChlIGluc3RhbmNlb2YgRU9GRXhjZXB0aW9uKQorCQkJCXJldHVybjsKKwkJCQorCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOworCQkJaWYgKG1zZyAhPSBudWxsKQorCQkJeworCQkJCWlmIChtc2cuZXF1YWxzKCAiQW4gZXhpc3RpbmcgY29ubmVjdGlvbiB3YXMgZm9yY2libHkgY2xvc2VkIGJ5IHRoZSByZW1vdGUgaG9zdCIgKSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCQorCQlTeXN0ZW0uZXJyLnByaW50ZiggIiVzOiBjYXVnaHQgZXhjZXB0aW9uOiAlc1xuIiwgdGhpcywgZSApOworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9BY2NlcHRIYW5kbGVyLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vQWNjZXB0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjE3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vQWNjZXB0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pbzsKKworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworLyoqCisgKiBTZWxlY3Rvci5IYW5kbGVyIGZvciBhIHRjcCBsaXN0ZW5pbmcgcG9ydC4KKyAqLworcHVibGljIGNsYXNzIEFjY2VwdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXI8U2VydmVyU29ja2V0Q2hhbm5lbD4KK3sKKwkvKioKKwkgKiBAcGFyYW0gY2hhbm5lbAorCSAqIEBwYXJhbSBmYWN0b3J5IAorCSAqLworCXB1YmxpYyBBY2NlcHRIYW5kbGVyKCBTZXJ2ZXJTb2NrZXRDaGFubmVsIGNoYW5uZWwsIFN0cmVhbUhhbmRsZXJGYWN0b3J5IGZhY3RvcnkgKQorCXsKKwkJc3VwZXIoIGNoYW5uZWwgKTsKKwkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJlYW1IYW5kbGVyRmFjdG9yeSBmYWN0b3J5OworCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJBY2NlcHRIYW5kbGVyKCVzKSIsIGNoYW5uZWwoKS5zb2NrZXQoKS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5BY2NlcHQoKQorCXsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9BY2NlcHQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTb2NrZXRDaGFubmVsIHNjID0gY2hhbm5lbCgpLmFjY2VwdCgpOworCQl0cnkKKwkJeworCQkJc2MuY29uZmlndXJlQmxvY2tpbmcoIGZhbHNlICk7CisJCQlhY2NlcHRlZENoYW5uZWwoIHNjICk7CisJCX0KKwkJY2F0Y2ggKCBFT0ZFeGNlcHRpb24gZSApCisJCXsKKwkJCXNjLmNsb3NlKCk7CisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlzYy5jbG9zZSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFjY2VwdGVkQ2hhbm5lbCggU29ja2V0Q2hhbm5lbCBzYyApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNlbGVjdG9yKCkucmVnaXN0ZXIoIGZhY3RvcnkubmV3U3RyZWFtSGFuZGxlciggc2MsIGZhbHNlICkgKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBsaXN0ZW5pbmcgYWRkcmVzcyBvZiB0aGlzIGFjY2VwdCBoYW5kbGVyLgorCSAqLworCXB1YmxpYyBJbmV0U29ja2V0QWRkcmVzcyBnZXRMb2NhbFNvY2tldEFkZHJlc3MoKQorCXsKKwkJcmV0dXJuIChJbmV0U29ja2V0QWRkcmVzcykgY2hhbm5lbCgpLnNvY2tldCgpLmdldExvY2FsU29ja2V0QWRkcmVzcygpOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9BY2NlcHRIYW5kbGVyRmFjdG9yeS5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL0FjY2VwdEhhbmRsZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3ZTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9BY2NlcHRIYW5kbGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pbzsKKworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CisKKy8qKgorICogRmFjdG9yeSB0byBjcmVhdGUgU3RyZWFtSGFuZGxlciBmb3IgQWNjZXB0SGFuZGxlci4KKyAqLworcHVibGljIGludGVyZmFjZSBBY2NlcHRIYW5kbGVyRmFjdG9yeQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQWNjZXB0SGFuZGxlciBmb3IgYSBTZXJ2ZXJTb2NrZXRDaGFubmVsLgorCSAqIEBwYXJhbSBjaGFubmVsIGEgY2hhbm5lbCBtYW5hZ2VkIGJ5IEFjY2VwdEhhbmRsZXIuCisJICogQHJldHVybiBhbiBBY2NlcHRIYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwuCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJcHVibGljIEFjY2VwdEhhbmRsZXIgbmV3QWNjZXB0SGFuZGxlciggU2VydmVyU29ja2V0Q2hhbm5lbCBjaGFubmVsICkKKwkJdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9CeXRlQnVmZmVyUG9vbC5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL0J5dGVCdWZmZXJQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5ZWQyMwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9CeXRlQnVmZmVyUG9vbC5qYXZhCkBAIC0wLDAgKzEsMzkwIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5uaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFsYXJtTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQWxhcm1NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRvZG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuVG9kb01hbmFnZXI7CisKKworLyoqCisgKiBBIHNoYXJlZCBwb29sIG9mIGJ1ZmZlcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlQnVmZmVyUG9vbCBpbXBsZW1lbnRzIEFsYXJtTGlzdGVuZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgQnl0ZUJ1ZmZlclBvb2wuCisJICogQHBhcmFtIGJ1ZmZlclNpemUgdGhlIHNpemUgb2YgZWFjaCBpbmRpdmlkdWFsIGJ1ZmZlci4KKwkgKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIGtlZXAgaW4gdGhlIHBvb2wuCisJICogQHBhcmFtIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIGFsbG93LgorCSAqIEBwYXJhbSBpbnRlcnZhbCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGhpc3RvcnkgdGlja2xlLgorCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiBoaXN0b3J5IHRvIG1haW50YWluLgorCSAqLworCXB1YmxpYyBCeXRlQnVmZmVyUG9vbCggaW50IGJ1ZmZlclNpemUsIGludCBtaW4sIGludCBsaW1pdCwKKwkJaW50IGludGVydmFsLCBpbnQgbGVuZ3RoICkKKwl7CisJCWlmIChidWZmZXJTaXplIDw9IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiYnVmZmVyU2l6ZSA8PSAwIiApOworCQkKKwkJaWYgKGludGVydmFsIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJpbnRlcnZhbCA8IDAiICk7CisJCQorCQlpZiAoaW50ZXJ2YWwgPT0gMCB8fCBsZW5ndGggPT0gMCkKKwkJeworCQkJLy8gaWYgZWl0aGVyIGlzIDAsIGZvcmNlIGJvdGggdG8gMC4KKwkJCWludGVydmFsID0gMDsKKwkJCWxlbmd0aCA9IDA7CisJCX0KKwkJCisJCXRoaXMuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisJCXRoaXMuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKwkJCisJCWhpc3RvcnkgPSBuZXcgSGlzdG9yeSggbWluLCBsaW1pdCwgbGVuZ3RoICk7CisJCQorCQlpZiAoaW50ZXJ2YWwgPiAwKQorCQkJQWxhcm1NYW5hZ2VyLnN0YXRpY0FkZCggdGhpcywgbnVsbCwgaW50ZXJ2YWwgKTsKKwl9CisKKwkvKiogVGhlIHNpemUgb2YgYnVmZmVycyB0byBhbGxvY2F0ZS4gKi8KKwlwcml2YXRlIGZpbmFsIGludCBidWZmZXJTaXplOworCQorCS8qKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGhpc3RvcnkgdGlja2xlcy4gKi8KKwlwcml2YXRlIGZpbmFsIGludCBpbnRlcnZhbDsKKworCXByaXZhdGUgZmluYWwgSGlzdG9yeSBoaXN0b3J5OworCisJLyoqCisJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycyBiZWluZyBtYW5hZ2VkLgorCSAqLworCXB1YmxpYyBpbnQgYnVmZmVyU2l6ZSgpCisJeworCQlyZXR1cm4gYnVmZmVyU2l6ZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIG1haW50YWluLgorCSAqLworCXB1YmxpYyBpbnQgbWluKCkKKwl7CisJCXJldHVybiBoaXN0b3J5Lm1pbigpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYWxsb2NhdGUuCisJICovCisJcHVibGljIGludCBsaW1pdCgpCisJeworCQlyZXR1cm4gaGlzdG9yeS5saW1pdCgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGhpc3RvcnkgdGlja2xlIGludGVydmFsIGluIG1zLgorCSAqLworCXB1YmxpYyBpbnQgaW50ZXJ2YWwoKQorCXsKKwkJcmV0dXJuIGludGVydmFsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGhpc3RvcnkgdGlja2xlIGxlbmd0aC4KKwkgKi8KKwlwdWJsaWMgaW50IGxlbmd0aCgpCisJeworCQlyZXR1cm4gaGlzdG9yeS5sZW5ndGgoKTsKKwl9CisKKwkvKioKKwkgKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSB0aGUgcG9vbC4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZ5IG9iamVjdCB0byBiZSBub3RpZmllZCB3aGVuIGEgYnVmZmVyIGlzIHJlbGVhc2VkIGludG8gdGhlCisJICogcG9vbC4KKwkgKiBAcmV0dXJuIGEgYnVmZmVyIGZyb20gdGhlIHBvb2wgb3IgbnVsbCBpZiB0aGUgcG9vbCBpcyBlbXB0eSBhbmQgbm90aWZ5IGlzCisJICogbm90IG51bGwuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aGUgcG9vbCBpcyBlbXB0eSBhbmQgbm90aWZ5IGlzIG51bGwuCisJICovCisJcHVibGljIEJ5dGVCdWZmZXIgYWxsb2MoIE5vdGlmeSBub3RpZnkgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXN5bmNocm9uaXplZCAoc2F2ZWQpCisJCXsKKwkJCWlmICghaGlzdG9yeS51c2VkKCAxICkpCisJCQl7CisJCQkJaWYgKG5vdGlmeSA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJvdXQgb2YgYnVmZmVycyIgKTsKKworCQkJCS8vIG5vdGlmeSAhPSBudWxsCisJCQkJcmVnaXN0ZXIoIG5vdGlmeSApOworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQl0cnkKKwkJCXsKKwkJCQlyZXR1cm4gYWxsb2NCdWYoKTsKKwkJCX0KKwkJCWNhdGNoICggRXJyb3IgZSApCisJCQl7CisJCQkJaGlzdG9yeS51c2VkKCAtMSApOworCQkJCXRocm93IGU7CisJCQl9CisJCQljYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gZSApCisJCQl7CisJCQkJaGlzdG9yeS51c2VkKCAtMSApOworCQkJCXRocm93IGU7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBbGxvY2F0ZXMgc29tZSBidWZmZXJzIGZyb20gdGhlIHBvb2wuCisJICogCisJICogQHBhcmFtIG5vdGlmeSBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hlbiBhIGJ1ZmZlciBpcyByZWxlYXNlZCBpbnRvIHRoZQorCSAqIHBvb2wuCisJICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZC4KKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbG9jYXRlZCBidWZmZXJzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgQnl0ZUJ1ZmZlcltdIGFsbG9jKCBOb3RpZnkgbm90aWZ5LCBpbnQgY291bnQgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWlmIChjb3VudCA8PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNvdW50IDw9IDAiICk7CisKKwkJaWYgKGNvdW50ID4gaGlzdG9yeS5saW1pdCgpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImNvdW50ID4gbGltaXQiICk7CisKKwkJc3luY2hyb25pemVkIChzYXZlZCkKKwkJeworCQkJaWYgKCFoaXN0b3J5LnVzZWQoIGNvdW50ICkpCisJCQl7CisJCQkJaWYgKG5vdGlmeSA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJvdXQgb2YgYnVmZmVycyIgKTsKKworCQkJCS8vIG5vdGlmeSAhPSBudWxsCisJCQkJcmVnaXN0ZXIoIG5vdGlmeSApOworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlCeXRlQnVmZmVyW10gYnVmcyA9IG5ldyBCeXRlQnVmZmVyW2NvdW50XTsKKwkJCQorCQkJdHJ5CisJCQl7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCQlidWZzW2ldID0gYWxsb2NCdWYoKTsKKwkJCX0KKwkJCWNhdGNoICggRXJyb3IgZSApCisJCQl7CisJCQkJcmVsZWFzZSggYnVmcyApOworCQkJCXRocm93IGU7CisJCQl9CisJCQljYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gZSApCisJCQl7CisJCQkJcmVsZWFzZSggYnVmcyApOworCQkJCXRocm93IGU7CisJCQl9CisJCQkKKwkJCXJldHVybiBidWZzOworCQl9CisJfQorCisJLyoqCisJICogUmVsZWFzZXMgYSBidWZmZXIgYmFjayBpbnRvIHRoZSBwb29sLiBJZiB0aGVyZSBhcmUgd2FpdGVycyBmb3IgYSBidWZmZXIKKwkgKiBiZWluZyByZWxlYXNlZCBpbnRvIHRoZSBwb29sLCB0aGV5IGFyZSBub3RpZmllZC4KKwkgKiAKKwkgKiBAcGFyYW0gYnVmCisJICovCisJcHVibGljIHZvaWQgcmVsZWFzZSggQnl0ZUJ1ZmZlciBidWYgKQorCXsKKwkJc3luY2hyb25pemVkIChzYXZlZCkKKwkJeworCQkJcmVsZWFzZUJ1ZiggYnVmICk7CisJCQlub3RpZnlXYWl0ZXJzKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlcyBzb21lIGJ1ZmZlcnMgYmFjayBpbnRvIHRoZSBwb29sLiBJZiB0aGVyZSBhcmUgd2FpdGVycyBmb3IgYQorCSAqIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBpbnRvIHRoZSBwb29sLCB0aGV5IGFyZSBub3RpZmllZC4KKwkgKiAKKwkgKiBAcGFyYW0gYnVmcworCSAqLworCXB1YmxpYyB2b2lkIHJlbGVhc2UoIEJ5dGVCdWZmZXJbXSBidWZzICkKKwl7CisJCWlmIChidWZzID09IG51bGwgfHwgYnVmcy5sZW5ndGggPT0gMCkKKwkJCXJldHVybjsKKworCQlzeW5jaHJvbml6ZWQgKHNhdmVkKQorCQl7CisJCQlmb3IgKEJ5dGVCdWZmZXIgYnVmIDogYnVmcykKKwkJCQlyZWxlYXNlQnVmKCBidWYgKTsKKworCQkJbm90aWZ5V2FpdGVycygpOworCQl9CisJfQorCisJcHJpdmF0ZSBCeXRlQnVmZmVyIGFsbG9jQnVmKCkKKwl7CisJCS8vIHVzZWQgaGFzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZC4KKwkJCisJCS8vIHdlIG5lZWQgYSBidWZmZXIsIGdldCBhIHNhdmVkIG9uZSBpZiBhbnkuLi4KKworCQlpZiAoIXNhdmVkLmlzRW1wdHkoKSkKKwkJeworCQkJQnl0ZUJ1ZmZlciBidWYgPSBzYXZlZC5yZW1vdmUoIHNhdmVkLnNpemUoKSAtIDEgKTsKKwkJCWJ1Zi5jbGVhcigpOworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCisJCUJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCggYnVmZmVyU2l6ZSApOworCQloaXN0b3J5LmFsbG9jKCAxICk7CisJCXJldHVybiBidWY7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlbGVhc2VCdWYoIEJ5dGVCdWZmZXIgYnVmICkKKwl7CisJCWlmIChidWYgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWhpc3RvcnkudXNlZCggLTEgKTsKKworCQkvLyBzYXZlIHRoZSBidWZmZXIgaWYgdGhlcmUgYXJlbid0IGFscmVhZHkgdG9vIG1hbnksIGRyb3AgdGhlIHJlc3QuCisJCQorCQlpZiAoc2F2ZWQuc2l6ZSgpIDwgaGlzdG9yeS5zdWdnZXN0ZWQoKSkKKwkJCXNhdmVkLmFkZCggYnVmICk7CisJCWVsc2UKKwkJCWhpc3RvcnkuYWxsb2MoIC0xICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0cmltU2F2ZWQoKQorCXsKKwkJc3luY2hyb25pemVkIChzYXZlZCkKKwkJeworCQkJaW50IG4gPSBoaXN0b3J5LnN1Z2dlc3RlZCgpOworCQkJd2hpbGUgKHNhdmVkLnNpemUoKSA+IG4pCisJCQl7CisJCQkJc2F2ZWQucmVtb3ZlKCBzYXZlZC5zaXplKCktMSApOworCQkJCWhpc3RvcnkuYWxsb2MoIC0xICk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2F2ZWQgPSBuZXcgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+KCk7CisKKwkvKioKKwkgKiBSZWdpc3RlcnMgZm9yIG5vdGlmaWNhdGlvbiBvZiBhdmFpbGFibGUgYnVmZmVyLiBOb3RlIHRoYXQgd2hlbiB5b3UgYXJlCisJICogbm90aWZpZWQsIHlvdXIgcmVnaXN0cmF0aW9uIGlzIGNhbmNlbGVkLiBZb3UgY2FuIGFsd2F5cyByZS1yZWdpc3RlciBpbgorCSAqIHRoZSBidWZmZXJBdmFpbGFibGUgbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBub3RpZnkKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWdpc3RlciggTm90aWZ5IG5vdGlmeSApCisJeworCQlzeW5jaHJvbml6ZWQgKHdhaXRlcnMpCisJCXsKKwkJCXdhaXRlcnMuYWRkKCBub3RpZnkgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZXMgYSByZWdpc3RyYXRpb24gZm9yIG5vdGlmaWNhdGlvbiBvZiBhdmFpbGFibGUgYnVmZmVyLgorCSAqIAorCSAqIEBwYXJhbSBub3RpZnkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKCBOb3RpZnkgbm90aWZ5ICkKKwl7CisJCXN5bmNocm9uaXplZCAod2FpdGVycykKKwkJeworCQkJd2FpdGVycy5yZW1vdmUoIG5vdGlmeSApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIG5vdGlmeVdhaXRlcnMoKQorCXsKKwkJZmluYWwgTm90aWZ5W10gbm90aWZpZXM7CisKKwkJc3luY2hyb25pemVkICh3YWl0ZXJzKQorCQl7CisJCQlpbnQgbiA9IHdhaXRlcnMuc2l6ZSgpOworCQkJaWYgKG4gPT0gMCkKKwkJCQlyZXR1cm47CisKKwkJCW5vdGlmaWVzID0gd2FpdGVycy50b0FycmF5KCBuZXcgTm90aWZ5W25dICk7CisJCQl3YWl0ZXJzLmNsZWFyKCk7CisJCX0KKworCQlUb2RvTWFuYWdlci5hZGRUb2RvKCBuZXcgVG9kbygpCisJCXsKKwkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG1nciApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlmb3IgKE5vdGlmeSBuIDogbm90aWZpZXMpCisJCQkJCW4uYnVmZmVyQXZhaWxhYmxlKCBCeXRlQnVmZmVyUG9vbC50aGlzICk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGV4Y2VwdGlvbiggVG9kb01hbmFnZXIgbWdyLCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfSApOworCX0KKworCXByaXZhdGUgZmluYWwgTGlzdDxOb3RpZnk+IHdhaXRlcnMgPSBuZXcgTGlua2VkTGlzdDxOb3RpZnk+KCk7CisKKwlwdWJsaWMgaW50IHdha2V1cCggQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIE9iamVjdCBzdGF0ZSwgbG9uZyBkdWUgKQorCXsKKwkJaGlzdG9yeS50aWNrbGUoKTsKKwkJdHJpbVNhdmVkKCk7CisJCXJldHVybiBpbnRlcnZhbDsKKwl9CisJCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhpcyBCeXRlQnVmZmVyUG9vbCBpcyBubyBsb25nZXIgYWN0aXZlLiBSZW1vdmVzIHRoZSBoaXN0b3J5CisJICogdGlja2xlLgorCSAqLworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkKKwl7CisJCUFsYXJtTWFuYWdlci5zdGF0aWNSZW1vdmUoIHRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBJbnRlcmZhY2UgdG8gbm90aWZ5IGludGVyZXN0ZWQgcGFydGllcyBhYm91dCBhdmFpbGFibGUgYnVmZmVycy4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIE5vdGlmeQorCXsKKwkJLyoqCisJCSAqIE5vdGlmaWVzIHRoYXQgdGhlIHBvb2wgaGFzIGFuIGF2YWlsYWJsZSBidWZmZXIuCisJCSAqIAorCQkgKiBAcGFyYW0gcG9vbAorCQkgKi8KKwkJcHVibGljIHZvaWQgYnVmZmVyQXZhaWxhYmxlKCBCeXRlQnVmZmVyUG9vbCBwb29sICk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgY291bnQgb2YgYnVmZmVycyBjdXJyZW50bHkgYWxsb2NhdGVkLgorCSAqLworCXB1YmxpYyBpbnQgdXNlZCgpCisJeworCQlyZXR1cm4gaGlzdG9yeS5nZXRVc2VkKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL0hhbmRsZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5OGZjMwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9IYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUubmlvOworCitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworCisvKioKKyAqIEEgaGFuZGxlciB3aGljaCB3cmFwcyBhIFNlbGVjdGFibGVDaGFubmVsLgorICogQHBhcmFtIDxUPiB0aGUgc3ViY2xhc3Mgb2YgU2VsZWN0YWJsZUNoYW5uZWwgZm9yIHRoaXMgSGFuZGxlci4KKyAqLworcHVibGljIGludGVyZmFjZSBIYW5kbGVyPFQgZXh0ZW5kcyBTZWxlY3RhYmxlQ2hhbm5lbD4KK3sKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBoYW5kbGVyJ3MgY2hhbm5lbC4KKwkgKi8KKwlwdWJsaWMgVCBjaGFubmVsKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb21wdXRlZCBpbnRlcmVzdCBvcHMuCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJcHVibGljIGludCBnZXRJbnRlcmVzdE9wcygpIHRocm93cyBFeGNlcHRpb247CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBsYXN0IGNvbXB1dGVkIGludGVyZXN0IG9wcyBzYXZlZCBwZXIKKwkgKiB7QGxpbmsgI3NldExhc3RJbnRlcmVzdE9wcyhpbnQpfS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldExhc3RJbnRlcmVzdE9wcygpOworCisJLyoqCisJICogU2F2ZXMgdGhlIGxhc3QgY29tcHV0ZWQgaW50ZXJlc3Qgb3BzIHNldCBpbiB0aGUgc2VsZWN0aW9uIGtleS4KKwkgKiBAcGFyYW0gb3BzCisJICovCisJcHVibGljIHZvaWQgc2V0TGFzdEludGVyZXN0T3BzKCBpbnQgb3BzICk7CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGUgaGFuZGxlciB0aGF0IGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgU2VsZWN0b3IuCisJICogQHBhcmFtIHNlbGVjdG9yIHRoZSBTZWxlY3RvciBob2xkaW5nIHRoZSByZWdpc3RyYXRpb24uCisJICogQHBhcmFtIGtleSB0aGUgc2VsZWN0aW9uIGtleS4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWdpc3RlcmVkKCBTZWxlY3RvciBzZWxlY3RvciwgU2VsZWN0aW9uS2V5IGtleSApCisJCXRocm93cyBFeGNlcHRpb247CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24ga2V5IG9mIHRoZSBjaGFubmVsLgorCSAqLworCXB1YmxpYyBTZWxlY3Rpb25LZXkga2V5KCk7CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGUgaGFuZGxlciB0aGF0IGl0IGhhcyBiZWVuIHNlbGVjdGVkLiBXaGVuIHNlbGVjdGVkIHJldHVybnMsCisJICogdGhlIHtAbGluayAjZ2V0SW50ZXJlc3RPcHMoKX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHRvIGdldCBhbnkgdXBkYXRlcworCSAqIHRvIHRoZSBpbnRlcmVzdHMuIElmIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBIYW5kbGVyIHdpbGwKKwkgKiBiZSBjYW5jZWxlZC4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb247CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGUgaGFuZGxlciB0aGF0IGl0cyByZWdpc3RyYXRpb24gaGFzIGJlZW4gY2FuY2VsZWQuIEFueQorCSAqIFNlbGVjdG9yIG9yIFNlbGVjdGlvbktleSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZm9yZ290dGVuLCBhbmQgcGVyaGFwcworCSAqIHRoZSBjaGFubmVsIHNob3VsZCBiZSBjbG9zZWQuCisJICogQHBhcmFtIGUgYW4gZXhjZXB0aW9uIHdoaWNoIGNhdXNlZCB0aGUgY2FuY2VsbGF0aW9uLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCXB1YmxpYyB2b2lkIGNhbmNlbGVkKCBFeGNlcHRpb24gZSApIHRocm93cyBFeGNlcHRpb247CisJCisJLyoqCisJICogUmVwb3J0cyBhbiBleGNlcHRpb24gd2hpY2ggaXMgY2F1c2luZyB0aGlzIGhhbmRsZXIgdG8gYmUgY2FuY2VsZWQuIFRoZQorCSAqIGV4Y2VwdGlvbiBpcyBieSBkZWZhdWx0IHJlcG9ydGVkIHRvIHRoZSBzZWxlY3RvciBpZiBzdGlsbCByZWdpc3RlcmVkLAorCSAqIG9yIHByaW50ZWQgb24gc3RkZXJyIGlmIG5vdCByZWdpc3RlcmVkLiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXBvcnQKKwkgKiB0aGUgcHJvYmxlbSBzb21lIG90aGVyIHdheS4KKwkgKiBAcGFyYW0gZQorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydEV4Y2VwdGlvbiggRXhjZXB0aW9uIGUgKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vSGlzdG9yeS5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL0hpc3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQzYTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL0hpc3RvcnkuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUubmlvOworCisvKioKKyAqIEhpc3Rvcnkga2VlcHMgdHJhY2sgb2YgcG9vbGVkIHJlc291cmNlIGFsbG9jYXRpb25zLCBwbHVzIG1haW50YWlucyBoaXN0b3JpY2FsCisgKiBpbmZvcm1hdGlvbiB0byBiZXR0ZXIganVkZ2Ugd2hhdCBhIHJlYXNvbmFibGUgcG9vbCBzaXplIGZvciByZXNvdXJjZXMgaXMuCisgKi8KK3B1YmxpYyBjbGFzcyBIaXN0b3J5Cit7CisJLyoqCisJICogQ29uc3RydWN0cyBhIEhpc3RvcnkuCisJICogQHBhcmFtIG1pbiB0aGUgbWluaW11bSBudW1iZXIgb2YgdXNlZCBpdGVtcy4KKwkgKiBAcGFyYW0gbGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVzZWQgaXRlbXMuCisJICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBoaXN0b3J5IG9mIHVzZWQgaXRlbXMgb3ZlciB0aW1lLgorCSAqLworCXB1YmxpYyBIaXN0b3J5KCBpbnQgbWluLCBpbnQgbGltaXQsIGludCBsZW4gKQorCXsKKwkJaWYgKG1pbiA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAibWluIDwgMCIgKTsKKwkJCisJCWlmIChsaW1pdCA8IG1pbikKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJsaW1pdCA8IG1pbiIgKTsKKworCQlpZiAobGVuIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJsZW4gPCAwIiApOworCisJCXRoaXMubWluID0gbWluOworCQl0aGlzLmxpbWl0ID0gbGltaXQ7CisJCWhpc3RvcnkgPSBuZXcgaW50W2xlbl07CisJCQorCQlpbml0KCk7CisJfQorCisJLyoqIFRoZSBtaW5pbXVtIG51bWJlciBvZiB1c2VkIGl0ZW1zLiAqLworCXByaXZhdGUgZmluYWwgaW50IG1pbjsKKworCS8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdXNlZCBpdGVtcy4gKi8KKwlwcml2YXRlIGZpbmFsIGludCBsaW1pdDsKKworCS8qKiBUaGUgaGlzdG9yeSBvZiB1c2VkIGl0ZW1zIG92ZXIgdGltZS4gKi8KKwlwcml2YXRlIGZpbmFsIGludFtdIGhpc3Rvcnk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1c2VkIGl0ZW1zLgorCSAqLworCXB1YmxpYyBpbnQgbGltaXQoKQorCXsKKwkJcmV0dXJuIGxpbWl0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1pbmltdW0gbnVtYmVyIG9mIHVzZWQgaXRlbXMuCisJICovCisJcHVibGljIGludCBtaW4oKQorCXsKKwkJcmV0dXJuIG1pbjsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBoaXN0b3J5LgorCSAqLworCXB1YmxpYyBpbnQgbGVuZ3RoKCkKKwl7CisJCXJldHVybiBoaXN0b3J5Lmxlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBBZGp1c3RzIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgdXNlZC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHdoaWNoCisJICogaGF2ZSBiZWVuIGFsbG9jYXRlZCBidXQgbm90IHlldCByZWxlYXNlZC4KKwkgKiAKKwkgKiBAcGFyYW0gayBwb3NpdGl2ZSBpZiBpdGVtcyBhcmUgYmVpbmcgYWxsb2NhdGVkLCBuZWdhdGl2ZSBpZiBpdGVtcyBhcmUKKwkgKiBiZWluZyByZWxlYXNlZC4gSXRlbXMgbWlnaHQgYmUgcmVsZWFzZWQgYnkgYmVpbmcgcmV0dXJuZWQgdG8gc29tZSBzeXN0ZW0KKwkgKiBmYWNpbGl0eSwgb3IgdGhleSBtaWdodCBiZSBzYXZlZCBpbiBhIHBvb2wuCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBuZXcgdmFsdWUgb2YgdXNlZCBkb2VzIG5vdCBleGNlZWQgdGhlIGxpbWl0LgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXcgdmFsdWUgb2YgdXNlZCB3b3VsZCBiZSA8IDAuCisJICovCisJcHVibGljIGJvb2xlYW4gdXNlZCggaW50IGsgKQorCXsKKwkJaWYgKGsgPT0gMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJrID09IDAiICk7CisKKwkJaW50IG5ld1VzZWQgPSB1c2VkICsgazsKKworCQlpZiAobmV3VXNlZCA+IGxpbWl0KQorCQkJcmV0dXJuIGZhbHNlOyAvLyBvdmVyZmxvdworCisJCWlmIChuZXdVc2VkIDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJuZXdVc2VkIDwgMCIgKTsKKworCQl1c2VkID0gbmV3VXNlZDsKKwkJYnVtcCggdXNlZCApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgdXNlZC4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFVzZWQoKQorCXsKKwkJcmV0dXJuIHVzZWQ7CisJfQorCisJcHJpdmF0ZSBpbnQgdXNlZDsKKworCS8qKgorCSAqIEFkanVzdHMgdGhlIG51bWJlciBvZiBpdGVtcyBhY3R1YWxseSBhbGxvY2F0ZWQgb3IgZnJlZWQgZnJvbSBzb21lIHN5c3RlbQorCSAqIGZhY2lsaXR5IHJhdGhlciB0aGFuIGp1c3QgZnJvbSBhIHBvb2wuIFRoZSBudW1iZXIgb2YgdXNlZCBpdGVtcworCSAqIGNhbiBuZXZlciBleGNlZWQgdGhlIG51bWJlciBhbGxvY2F0ZWQuIFRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGl0ZW1zCisJICogZXF1YWxzIHVzZWQgcGx1cyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBwb29sLgorCSAqIAorCSAqIEBwYXJhbSBrIHBvc2l0aXZlIGlmIGl0ZW1zIGFyZSBiZWluZyBhbGxvY2F0ZWQsIG5lZ2F0aXZlIGlmIGl0ZW1zIGFyZQorCSAqIGJlaW5nIHJlbGVhc2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFsbG9jKCBpbnQgayApCisJeworCQlpZiAoayA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImsgPT0gMCIgKTsKKworCQlpbnQgbmV3QWxsb2MgPSBhbGxvYyArIGs7CisKKwkJaWYgKG5ld0FsbG9jID4gbGltaXQpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAibmV3QWxsb2MgPiBsaW1pdCIgKTsKKworCQlpZiAobmV3QWxsb2MgPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIm5ld0FsbG9jIDwgMCIgKTsKKworCQlhbGxvYyA9IG5ld0FsbG9jOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBhbGxvY2F0ZWQuCisJICovCisJcHVibGljIGludCBnZXRBbGxvYygpCisJeworCQlyZXR1cm4gYWxsb2M7CisJfQorCisJcHJpdmF0ZSBpbnQgYWxsb2M7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIChvciByZS1pbml0aWFsaXplKSB0aGUgaGlzdG9yeS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KCkKKwl7CisJCXN5bmNocm9uaXplZCAoaGlzdG9yeSkKKwkJeworCQkJaW50IGggPSBNYXRoLm1heCggbWluLCB1c2VkICk7CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykKKwkJCQloaXN0b3J5W2ldID0gaDsKKworCQkJaGlnaHdhdGVybWFyayA9IGg7CisJCQlzdWdnZXN0ZWQgPSBoOworCQl9CisJfQorCisJLyoqCisJICogVGlja2xlcyB0aGUgaGlzdG9yeS4gVGhlIG9sZGVzdCB2YWx1ZSBvZiBoaXN0b3J5IGlzIGRpc2NhcmRlZCwgYW5kIHRoZQorCSAqIG90aGVycyBhcmUgYWxsIHB1c2hlZCBkb3duIG9uZSwgYW5kIHRoZSBuZXdlc3QgdmFsdWUgaXMgaW5pdGlhbGl6ZWQgdG8KKwkgKiBtaW4uIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkgb24gYSByZWd1bGFyIHNjaGVkdWxlLgorCSAqLworCXB1YmxpYyB2b2lkIHRpY2tsZSgpCisJeworCQlzeW5jaHJvbml6ZWQgKGhpc3RvcnkpCisJCXsKKwkJCWlmIChoaXN0b3J5Lmxlbmd0aCA9PSAwKQorCQkJCXJldHVybjsKKwkJCQorCQkJU3lzdGVtLmFycmF5Y29weSggaGlzdG9yeSwgMCwgaGlzdG9yeSwgMSwgaGlzdG9yeS5sZW5ndGggLSAxICk7CisJCQloaXN0b3J5WzBdID0gaGlnaHdhdGVybWFyazsKKwkJCWhpZ2h3YXRlcm1hcmsgPSBNYXRoLm1heCggbWluLCB1c2VkICk7CisKKwkJCS8vIHJlY2FsY3VsYXRlIHN1Z2dlc3RlZCBzaXplCisKKwkJCXN1Z2dlc3RlZCA9IHJlY2FsYyggaGlzdG9yeSApOworCQl9CisJfQorCisJLyoqCisJICogUmVjYWxjdWxhdGVzIHRoZSBzdWdnZXN0ZWQgc2l6ZSBmb3IgcG9vbCBvZiBhbGxvY2F0ZWQgYnV0IHVudXNlZCBpdGVtcy4KKwkgKiBWYXJpb3VzIGFsZ29yaXRobXMgbWlnaHQgYmUgdXNlZCwgaW5jbHVkaW5nIHRob3NlIHRoYXQgbWlnaHQgdXNlIGF2ZXJhZ2UKKwkgKiBoaXN0b3J5ICh0aGUgZGVmYXVsdCkgb3Igc29tZXRoaW5nIGJhc2VkIG9uIDFzdCBvciAybmQgb3JkZXIgZGVyaXZpdGl2ZXMKKwkgKiBvZiB0aGF0LgorCSAqIAorCSAqIEByZXR1cm4gcmVjYWxjdWxhdGVkIHN1Z2dlc3RlZCBzaXplIGZvciBwb29sIG9mIGFsbG9jYXRlZCBidXQgdW51c2VkCisJICogaXRlbXMuCisJICovCisJcHJvdGVjdGVkIGludCByZWNhbGMoIGludFtdIGhzdHJ5ICkKKwl7CisJCWludCBzdW0gPSAwOworCQlmb3IgKGludCBoIDogaHN0cnkpCisJCQlzdW0gKz0gaDsKKwkJcmV0dXJuIHN1bSAvIGhzdHJ5Lmxlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBoaWdoIHdhdGVyIG1hcmsgaW4gbGlnaHQgb2YgYSBuZXcgdmFsdWUgb2YgdXNlZC4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB1c2VkLgorCSAqLworCXByaXZhdGUgdm9pZCBidW1wKCBpbnQgdmFsdWUgKQorCXsKKwkJc3luY2hyb25pemVkIChoaXN0b3J5KQorCQl7CisJCQlpZiAodmFsdWUgPiBoaWdod2F0ZXJtYXJrKQorCQkJCWhpZ2h3YXRlcm1hcmsgPSB2YWx1ZTsKKwkJfQorCX0KKworCXByaXZhdGUgaW50IGhpZ2h3YXRlcm1hcms7CisKKwlwcml2YXRlIGludCBzdWdnZXN0ZWQ7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdWdnZXN0ZWQgc2l6ZSBvZiBhIHBvb2wgZm9yIHF1aWNrIGFsbG9jYXRpb24uIFRoaXMKKwkgKiBtaWdodCBiZSBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQgb3IgYmFzZWQgb24gcmVjZW50IGFjdGl2aXR5LgorCSAqLworCXB1YmxpYyBpbnQgc3VnZ2VzdGVkKCkKKwl7CisJCXJldHVybiBzdWdnZXN0ZWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1NlbGVjdG9yLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzgyZThiCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1NlbGVjdG9yLmphdmEKQEAgLTAsMCArMSw0NDYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2FuY2VsbGVkS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworCisKKy8qKgorICogQW4gZXhwZXJpbWVudCBpbiBzZWxlY3Rpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTZWxlY3RvciBleHRlbmRzIFRocmVhZAoreworCS8qKgorCSAqIE1heGltdW0gbnVtYmVyIG9mIGtleXMgYWxsb3dlZCBpbiB0aGlzIFNlbGVjdG9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9LRVlTID0gNjQ7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBzZWxlY3Rvci4KKwkgKiBAcGFyYW0gaWQgYSB1bmlxdWUgaWQgZm9yIHRoaXMgc2VsZWN0b3IuCisJICogQHBhcmFtIHNzIHRoZSBjb250YWluaW5nIHN1cGVyIHNlbGVjdG9yLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCisJICovCisJcHVibGljIFNlbGVjdG9yKCBpbnQgaWQsIFN1cGVyU2VsZWN0b3Igc3MgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXRoaXMuaWQgPSBpZDsKKwkJdGhpcy5zcyA9IHNzOworCQlzZWxlY3RvciA9IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yLm9wZW4oKTsKKwkJc3NBZGQoKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7CisJCisJcHJpdmF0ZSBmaW5hbCBTdXBlclNlbGVjdG9yIHNzOworCisJcHJpdmF0ZSBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciBzZWxlY3RvcjsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZCBvZiB0aGlzIHNlbGVjdG9yLgorCSAqLworCXB1YmxpYyBpbnQgaWQoKQorCXsKKwkJcmV0dXJuIGlkOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiAiU2VsZWN0b3IuIitpZDsKKwl9CisKKwkvLy8vLy8vLy8vLy8KKwkvLyBUSFJFQUQgLy8KKwkvLy8vLy8vLy8vLy8KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJ1bigpCisJeworCQl0cnkKKwkJeworCQkJd2hpbGUgKHNlbGVjdG9yLmlzT3BlbigpKQorCQkJeworCQkJCXJ1bkFjdGlvbnMoKTsKKwkJCQkKKwkJCQlpbnQgbjsKKwkJCQl3aGlsZSAoIHRydWUgKQorCQkJCXsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCW4gPSBzZWxlY3Rvci5zZWxlY3QoKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKKwkJCQkJeworCQkJCQkJLy8gV29ya2Fyb3VuZCwgc2VlIHN1biBidWcgNjY5MzQ5MAorCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBjYXVnaHQgSU9FeGNlcHRpb24iKTsKKwkJCQkJCWlmICggZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJGaWxlIGV4aXN0cyIpICE9IC0xICkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCXRocm93IGU7CisJCQkJCX0KKwkJCQl9CisvLwkJCQlMb2cucmVwb3J0KCAic2VsZWN0ZWQiLCAic2VsZWN0b3IiLCB0aGlzLCAibiIsIG4gKTsKKwkJCQlpZiAobiA+IDApCisJCQkJeworCQkJCQlmb3IgKFNlbGVjdGlvbktleSBrZXkgOiBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKSkKKwkJCQkJCWhhbmRsZVNlbGVjdGlvbigga2V5ICk7CisJCQkJCXNlbGVjdG9yLnNlbGVjdGVkS2V5cygpLmNsZWFyKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoICggQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIGlnbm9yZS4KKwkJfQorCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJcmVwb3J0RXhjZXB0aW9uKCBlICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQlzcy5yZW1vdmUoIHRoaXMgKTsKKwkJCXRyeQorCQkJeworCQkJCS8vIFRPRE8gcmVtb3ZlIGFuZCBjYW5jZWwgYWxsIHRoZSBrZXlzCisJCQkJc2VsZWN0b3IuY2xvc2UoKTsKKwkJCX0KKwkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCXJlcG9ydEV4Y2VwdGlvbiggZSApOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCByZXBvcnRFeGNlcHRpb24oIEV4Y2VwdGlvbiBlICkKKwl7CisJCVN5c3RlbS5lcnIucHJpbnRmKCAiJXM6IGNhdWdodCBleGNlcHRpb246ICVzXG4iLCB0aGlzLCBlICk7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0FGRSBBQ1RJT05TIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBTY2hlZHVsZXMgYSByZWdpc3RyYXRpb24gb2YgdGhlIGhhbmRsZXIgd2l0aCB0aGlzIFNlbGVjdG9yIGlmIGl0CisJICogaXNuJ3QgZnVsbCwgY3JlYXRlcyBhIG5ldyBTZWxlY3RvciBpZiB0aGlzIFNlbGVjdG9yIGlzIGZ1bGwuCisJICogQHBhcmFtIGhhbmRsZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWdpc3RlciggZmluYWwgSGFuZGxlcjw/PiBoYW5kbGVyICkKKwl7CisJCWNoZWNrTm90U2h1dGRvd24oKTsKKwkJCisJCWVucXVldWVBY3Rpb24oIGZhbHNlLCBuZXcgQWN0aW9uKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWFjdGlvblJlZ2lzdGVyKCBoYW5kbGVyICk7CisJCQkJfQorCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCWFjdGlvbkNhbmNlbCggaGFuZGxlciwgZSApOworCQkJCQl9CisJCQkJCWNhdGNoICggRXhjZXB0aW9uIGUxICkKKwkJCQkJeworCQkJCQkJaGFuZGxlci5yZXBvcnRFeGNlcHRpb24oIGUxICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tOb3RTaHV0ZG93bigpCisJeworCQlpZiAoc2h1dGRvd24pCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAic2h1dGRvd24iICk7CisJfQorCisJLyoqCisJICogU2NoZWR1bGVzIGFuIHVwZGF0ZSB0byB0aGUgaGFuZGxlcidzIGludGVyZXN0IG9wcyB3aXRoIHRoaXMgU2VsZWN0b3IuCisJICogQHBhcmFtIGhhbmRsZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVJbnRlcmVzdE9wcyggZmluYWwgSGFuZGxlcjw/PiBoYW5kbGVyICkKKwl7CisJCWVucXVldWVBY3Rpb24oIGZhbHNlLCBuZXcgQWN0aW9uKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWFjdGlvblVwZGF0ZUludGVyZXN0T3BzKCBoYW5kbGVyICk7CisJCQkJfQorCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCWFjdGlvbkNhbmNlbCggaGFuZGxlciwgZSApOworCQkJCQl9CisJCQkJCWNhdGNoICggRXhjZXB0aW9uIGUxICkKKwkJCQkJeworCQkJCQkJaGFuZGxlci5yZXBvcnRFeGNlcHRpb24oIGUxICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gKTsKKwl9CisKKwkvKioKKwkgKiBTY2hlZHVsZXMgYSBjYW5jZWwgb2YgdGhlIGhhbmRsZXIgd2l0aCB0aGlzIFNlbGVjdG9yLgorCSAqIEBwYXJhbSBoYW5kbGVyCisJICovCisJcHVibGljIHZvaWQgY2FuY2VsKCBmaW5hbCBIYW5kbGVyPD8+IGhhbmRsZXIgKQorCXsKKwkJZW5xdWV1ZUFjdGlvbiggdHJ1ZSwgbmV3IEFjdGlvbigpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlhY3Rpb25DYW5jZWwoIGhhbmRsZXIsIG51bGwgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQloYW5kbGVyLnJlcG9ydEV4Y2VwdGlvbiggZSApOworCQkJCX0KKwkJCX0KKwkJfSApOworCX0KKworCS8qKgorCSAqIFNodXRzIGRvd24gdGhlIHNlbGVjdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIHNodXRkb3duKCkKKwl7CisJCWlmIChzaHV0ZG93bikKKwkJCXJldHVybjsKKwkJCisJCXNodXRkb3duID0gdHJ1ZTsKKwkJCisJCWVucXVldWVBY3Rpb24oIGZhbHNlLCBuZXcgQWN0aW9uKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWFjdGlvblNodXRkb3duKCk7CisJCQkJfQorCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJcmVwb3J0RXhjZXB0aW9uKCBlICk7CisJCQkJfQorCQkJfQorCQl9ICk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBzaHV0ZG93bjsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVU5TQUZFIEFDVElPTlMgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHJpdmF0ZSB2b2lkIGFjdGlvblJlZ2lzdGVyKCBIYW5kbGVyPD8+IGhhbmRsZXIgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB0aGlzIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgc2VsZWN0b3IgdGhyZWFkLgorCQkKKwkJaW50IG4gPSBzZWxlY3Rvci5rZXlzKCkuc2l6ZSgpOworCQlpZiAobiA+PSBNQVhfS0VZUykKKwkJeworCQkJc3MucmVnaXN0ZXIoIGhhbmRsZXIgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWludCBvcHMgPSBoYW5kbGVyLmdldEludGVyZXN0T3BzKCk7CisJCQorCQlBc3NlcnRpb24uY2hlY2soICFoYW5kbGVyLmNoYW5uZWwoKS5pc1JlZ2lzdGVyZWQoKSwgIiFoYW5kbGVyLmNoYW5uZWwoKS5pc1JlZ2lzdGVyZWQoKSIgKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBoYW5kbGVyLmtleSgpID09IG51bGwsICJoYW5kbGVyLmtleSgpID09IG51bGwiICk7CisJCQorCQlTZWxlY3Rpb25LZXkga2V5ID0gaGFuZGxlci5jaGFubmVsKCkucmVnaXN0ZXIoIHNlbGVjdG9yLCBvcHMsIGhhbmRsZXIgKTsKKwkJaGFuZGxlci5zZXRMYXN0SW50ZXJlc3RPcHMoIG9wcyApOworCQloYW5kbGVyLnJlZ2lzdGVyZWQoIHRoaXMsIGtleSApOworCX0KKworCXByaXZhdGUgdm9pZCBhY3Rpb25VcGRhdGVJbnRlcmVzdE9wcyggSGFuZGxlcjw/PiBoYW5kbGVyICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGhpcyBhY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHNlbGVjdG9yIHRocmVhZC4KKwkJCisJCVNlbGVjdGlvbktleSBrZXkgPSBoYW5kbGVyLmtleSgpOworCQlpZiAoa2V5ICE9IG51bGwpCisJCXsKKwkJCWludCBvcHMgPSBoYW5kbGVyLmdldEludGVyZXN0T3BzKCk7CisJCQlpZiAob3BzICE9IGhhbmRsZXIuZ2V0TGFzdEludGVyZXN0T3BzKCkpCisJCQl7CisJCQkJa2V5LmludGVyZXN0T3BzKCBvcHMgKTsKKwkJCQloYW5kbGVyLnNldExhc3RJbnRlcmVzdE9wcyggb3BzICk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWN0aW9uQ2FuY2VsKCBIYW5kbGVyPD8+IGhhbmRsZXIsIEV4Y2VwdGlvbiBlICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdGhpcyBhY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHNlbGVjdG9yIHRocmVhZC4KKwkJCisJCWhhbmRsZXIuY2FuY2VsZWQoIGUgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFjdGlvblNodXRkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc2VsZWN0b3IuY2xvc2UoKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLworCS8vIEFDVElPTiBMSVNUIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8KKworCXByaXZhdGUgdm9pZCBydW5BY3Rpb25zKCkKKwl7CisJCUFjdGlvbiBhY3Rpb247CisJCXdoaWxlICgoYWN0aW9uID0gZGVxdWV1ZUFjdGlvbigpKSAhPSBudWxsKQorCQkJYWN0aW9uLnJ1bigpOworCQlzc1VwZGF0ZSgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgc3NBZGQoKQorCXsKKwkJc2l6ZSA9IHNlbGVjdG9yLmtleXMoKS5zaXplKCk7CisJCXNzLmFkZCggdGhpcywgTUFYX0tFWVMtc2l6ZSApOworCX0KKworCXByaXZhdGUgdm9pZCBzc1VwZGF0ZSgpCisJeworCQlzaXplID0gc2VsZWN0b3Iua2V5cygpLnNpemUoKTsKKwkJc3MudXBkYXRlKCB0aGlzLCBNQVhfS0VZUy1zaXplICk7CisJfQorCQorCXByaXZhdGUgaW50IHNpemU7CisKKwlwcml2YXRlIHZvaWQgZW5xdWV1ZUFjdGlvbiggYm9vbGVhbiBwcmlvcml0eSwgQWN0aW9uIGFjdGlvbiApCisJeworCQlzeW5jaHJvbml6ZWQgKGFjdGlvbnMpCisJCXsKKwkJCWJvb2xlYW4gd2FzRW1wdHkgPSBhY3Rpb25zLmlzRW1wdHkoKTsKKwkJCQorCQkJaWYgKHByaW9yaXR5KQorCQkJCWFjdGlvbnMuYWRkRmlyc3QoIGFjdGlvbiApOworCQkJZWxzZQorCQkJCWFjdGlvbnMuYWRkTGFzdCggYWN0aW9uICk7CisJCQkKKwkJCWlmICh3YXNFbXB0eSkKKwkJCQlzZWxlY3Rvci53YWtldXAoKTsKKwkJfQorCX0KKworCXByaXZhdGUgQWN0aW9uIGRlcXVldWVBY3Rpb24oKQorCXsKKwkJc3luY2hyb25pemVkIChhY3Rpb25zKQorCQl7CisJCQlyZXR1cm4gYWN0aW9ucy5wb2xsKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8QWN0aW9uPiBhY3Rpb25zID0gbmV3IExpbmtlZExpc3Q8QWN0aW9uPigpOworCQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBIQU5ETEUgU0VMRUNUSU9OIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3Rpb24oIFNlbGVjdGlvbktleSBrZXkgKQorCXsKKwkJSGFuZGxlcjw/PiBoYW5kbGVyID0gKEhhbmRsZXI8Pz4pIGtleS5hdHRhY2htZW50KCk7CisJCQorCQlpZiAoaGFuZGxlciA9PSBudWxsKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlrZXkuY2hhbm5lbCgpLmNsb3NlKCk7CisJCQl9CisJCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorCQkJeworCQkJCXJlcG9ydEV4Y2VwdGlvbiggZSApOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5CisJCXsKKwkJCWhhbmRsZXIuc2VsZWN0ZWQoKTsKKwkJCWFjdGlvblVwZGF0ZUludGVyZXN0T3BzKCBoYW5kbGVyICk7CisJCX0KKwkJY2F0Y2ggKCBDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUgKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCQljYXRjaCAoIENhbmNlbGxlZEtleUV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gaWdub3JlCisJCX0KKwkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXRyeQorCQkJeworCQkJCWFjdGlvbkNhbmNlbCggaGFuZGxlciwgZSApOworCQkJfQorCQkJY2F0Y2ggKCBFeGNlcHRpb24gZTEgKQorCQkJeworCQkJCWhhbmRsZXIucmVwb3J0RXhjZXB0aW9uKCBlMSApOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUGVyZm9ybXMgYW4gYWN0aW9uIG9uIGEgaGFuZGxlciwgc3VjaCBhcyByZWdpc3RlcmluZyBpdCB3aXRoIHRoZQorCSAqIHNlbGVjdG9yLCB1cGRhdGluZyBpdHMgaW50ZXJlc3Qgb3BzLCBvciBjbG9zaW5nIGl0LgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uCisJeworCQkvKioKKwkJICogUnVucyB0aGUgYWN0aW9uIHdoZW4gdGhlIHNlbGVjdG9yIGlzIGF2YWlsYWJsZSB0byBjb250cm9sLgorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKCk7CisJfQorCisJLyoqCisJICogRHVtcHMgdGhlIGhhbmRsZXJzIGluIHRoaXMgc2VsZWN0b3IuCisJICovCisJcHVibGljIHZvaWQgZHVtcCgpCisJeworCQlmb3IgKFNlbGVjdGlvbktleSBrOiBzZWxlY3Rvci5rZXlzKCkpCisJCXsKKwkJCU9iamVjdCBhID0gay5hdHRhY2htZW50KCk7CisJCQlpZiAoYSA9PSBudWxsKQorCQkJeworCQkJCVN5c3RlbS5vdXQucHJpbnRmKCAiJXM6IGNoYW5uZWwgJXNcbiIsIHRoaXMsIGsuY2hhbm5lbCgpICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlTeXN0ZW0ub3V0LnByaW50ZiggIiVzOiBhdHRhY2htZW50ICVzXG4iLCB0aGlzLCBhICk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vU3RyZWFtSGFuZGxlci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1N0cmVhbUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdiNzFjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1N0cmVhbUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUubmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKKy8qKgorICogSGFuZGxlciBmb3IgVENQIHN0cmVhbSBjaGFubmVscy4KKyAqLworcHVibGljIGNsYXNzIFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXI8U29ja2V0Q2hhbm5lbD4KK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBTdHJlYW1IYW5kbGVyLgorCSAqIEBwYXJhbSBjaGFubmVsCisJICogQHBhcmFtIHdhbnRzQ29ubmVjdAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgU3RyZWFtSGFuZGxlciggU29ja2V0Q2hhbm5lbCBjaGFubmVsLCBib29sZWFuIHdhbnRzQ29ubmVjdCApCisJCXRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJc3VwZXIoIGNoYW5uZWwgKTsKKwkJCisJCXRoaXMud2FudHNDb25uZWN0ID0gd2FudHNDb25uZWN0OworCQkKKwkJaWYgKCF3YW50c0Nvbm5lY3QpCisJCQljb25uZWN0ZWQoKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIHdhbnRzQ29ubmVjdDsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjYW5Db25uZWN0KCkKKwl7CisJCXJldHVybiB3YW50c0Nvbm5lY3Q7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvQ29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJd2FudHNDb25uZWN0ID0gIWNoYW5uZWwoKS5maW5pc2hDb25uZWN0KCk7CisJCQorCQlpZiAoIXdhbnRzQ29ubmVjdCkKKwkJCWNvbm5lY3RlZCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjb25uZWN0ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCS8vIG5vdGhpbmcgdG8gZG8uCisJfQorCisJLyoqCisJICogUmVhZHMgZnJvbSB0aGUgY2hhbm5lbCBvZiB0aGlzIGhhbmRsZXIuCisJICogQHBhcmFtIHJidWYgdGhlIEJ5dGVCdWZmZXIgdG8gcmVhZCBpbnRvLgorCSAqIEByZXR1cm4gdGhlIGNvdW50IG9mIGJ5dGVzIHJlYWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBpbnQgcmVhZCggQnl0ZUJ1ZmZlciByYnVmICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZXR1cm4gY2hhbm5lbCgpLnJlYWQoIHJidWYgKTsKKwl9CisKKwkvKioKKwkgKiBXcml0ZXMgdG8gdGhlIGNoYW5uZWwgb2YgdGhpcyBoYW5kbGVyLgorCSAqIEBwYXJhbSB3YnVmIHRoZSBCeXRlQnVmZmVyIHRvIHdyaXRlIGZyb20uIEl0IGlzIGZsaXBwZWQgZmlyc3QsIGFuZAorCSAqIGNvbXBhY3RlZCBhZnRlci4KKwkgKiBAcmV0dXJuIHRoZSBjb3VudCBvZiBieXRlcyB3cml0dGVuLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgaW50IHdyaXRlKCBCeXRlQnVmZmVyIHdidWYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXRyeQorCQl7CisJCQl3YnVmLmZsaXAoKTsKKwkJCXJldHVybiB3YnVmLmhhc1JlbWFpbmluZygpID8gY2hhbm5lbCgpLndyaXRlKCB3YnVmICkgOiAwOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJd2J1Zi5jb21wYWN0KCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaHV0cyBkb3duIG91dHB1dCBvbiB0aGUgY2hhbm5lbCBvZiB0aGlzIGhhbmRsZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNodXRkb3duT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQljaGFubmVsKCkuc29ja2V0KCkuc2h1dGRvd25PdXRwdXQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vU3RyZWFtSGFuZGxlckZhY3RvcnkuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9TdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTBiYzgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vU3RyZWFtSGFuZGxlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5uaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKKy8qKgorICogRmFjdG9yeSB0byBjcmVhdGUgU3RyZWFtSGFuZGxlciBmb3IgQWNjZXB0SGFuZGxlci4KKyAqLworcHVibGljIGludGVyZmFjZSBTdHJlYW1IYW5kbGVyRmFjdG9yeQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgU3RyZWFtSGFuZGxlciBmb3IgYSBTb2NrZXRDaGFubmVsLgorCSAqIEBwYXJhbSBjaGFubmVsIGEgY2hhbm5lbCBhY2NlcHRlZCBieSBBY2NlcHRIYW5kbGVyLgorCSAqIEBwYXJhbSB3YW50c0Nvbm5lY3QgdHJ1ZSBpZiB0aGlzIHNvY2tldCBpcyBjb25uZWN0aW5nIGFuZAorCSAqIG5lZWRzIGEgY29ubmVjdGVkIGV2ZW50IHRvIGJlIHNlbGVjdGVkLgorCSAqIEByZXR1cm4gYSBTdHJlYW1IYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIFN0cmVhbUhhbmRsZXIgY2Fubm90IGJlIG1hZGUuCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJcHVibGljIFN0cmVhbUhhbmRsZXIgbmV3U3RyZWFtSGFuZGxlciggU29ja2V0Q2hhbm5lbCBjaGFubmVsLAorCQlib29sZWFuIHdhbnRzQ29ubmVjdCApIHRocm93cyBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vU3VwZXJTZWxlY3Rvci5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1N1cGVyU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmU5MjFkCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1N1cGVyU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDM1OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUubmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQXNzZXJ0aW9uOworCisKKy8qKgorICogTW9kZWxzIHRoZSBleHRlcm5hbCBhcGkgb2YgYSBTZWxlY3RvciB3aGlsZSBrZWVwaW5nIGEgbGlzdCBvZiBhdmFpbGFibGUKKyAqIHNlbGVjdG9ycyBhbmQgdGhlaXIgbG9hZC4KKyAqLworcHVibGljIGNsYXNzIFN1cGVyU2VsZWN0b3IKK3sKKwkvKioKKwkgKiBNYXJrcyB0aGUgU3VwZXJTZWxlY3RvciBhcyBvcGVuIGZvciBidXNpbmVzcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydCgpCisJeworCQljaGVja1N0YXJ0ZWQoIGZhbHNlICk7CisJCXN0YXJ0ZWQgPSB0cnVlOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tTdGFydGVkKCBib29sZWFuIGV4cGVjdGVkICkKKwl7CisJCWlmIChleHBlY3RlZCAhPSBzdGFydGVkKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZXhwZWN0ZWQgPyAibm90IHN0YXJ0ZWQiIDogInN0YXJ0ZWQiICk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQ7CisJCisJLyoqCisJICogU2h1dHMgZG93biB0aGUgU3VwZXJTZWxlY3RvciwgY2xvc2luZyBhbGwgdGhlIGV4aXN0aW5nIHNlbGVjdG9ycyBhbmQKKwkgKiBoYW5kbGVycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpCisJeworCQlzdGFydGVkID0gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEFkZHMgdGhlIFNlbGVjdG9yIHRvIHRoZSBzZXQgb2YgYXZhaWxhYmxlIHNlbGVjdG9ycywgaXQgaXMgbmV3IGNyZWF0ZWQuCisJICogQHBhcmFtIHNlbGVjdG9yCisJICogQHBhcmFtIGF2YWlsIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHNsb3RzLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZCggU2VsZWN0b3Igc2VsZWN0b3IsIGludCBhdmFpbCApCisJeworCQljaGVja1N0YXJ0ZWQoIHRydWUgKTsKKwkJS2V5IGsgPSBuZXcgS2V5KCBhdmFpbCwgc2VsZWN0b3IgKTsKKwkJaWYgKCFzZWwya2V5cy5jb250YWluc0tleSggc2VsZWN0b3IgKSkKKwkJeworCQkJc2VsMmtleXMucHV0KCBzZWxlY3RvciwgayApOworCQkJa2V5c0FkZCggayApOworCQl9CisJfQorCisJcHJpdmF0ZSBmaW5hbCBNYXA8U2VsZWN0b3IsIEtleT4gc2VsMmtleXMgPQorCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwPFNlbGVjdG9yLCBLZXk+KCkgKTsKKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIFNlbGVjdG9yJ3MgY2FwYWNpdHkgaW4gdGhlIHNldCBvZiBhdmFpbGFibGUgc2VsZWN0b3JzLgorCSAqIEBwYXJhbSBzZWxlY3RvcgorCSAqIEBwYXJhbSBhdmFpbCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzbG90cy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoIFNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgYXZhaWwgKQorCXsKKwkJY2hlY2tTdGFydGVkKCB0cnVlICk7CisJCQorCQlLZXkgayA9IHNlbDJrZXlzLmdldCggc2VsZWN0b3IgKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBrICE9IG51bGwsICJrICE9IG51bGwiICk7CisJCQorCQlzeW5jaHJvbml6ZWQgKF9rZXlzKQorCQl7CisJCQlpZiAoYXZhaWwgIT0gay5hdmFpbCgpKQorCQkJeworCQkJCWtleXNSZW1vdmUoIGsgKTsKKwkJCQlrLnNldEF2YWlsKCBhdmFpbCApOworCQkJCWtleXNBZGQoIGsgKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIFNlbGVjdG9yIGZyb20gdGhlIHNldCBvZiBhdmFpbGFibGUgc2VsZWN0b3JzLiBJdCBpcyBkZWFkLgorCSAqIEBwYXJhbSBzZWxlY3RvciAKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoIFNlbGVjdG9yIHNlbGVjdG9yICkKKwl7CisJCUtleSBrID0gc2VsMmtleXMucmVtb3ZlKCBzZWxlY3RvciApOworCQlpZiAoayAhPSBudWxsKQorCQkJa2V5c1JlbW92ZSggayApOworCX0KKwkKKwlwcml2YXRlIHZvaWQga2V5c0FkZCggS2V5IGsgKQorCXsKKwkJc3luY2hyb25pemVkIChfa2V5cykKKwkJeworCQkJaWYgKGsuYXZhaWwoKSA+IDApCisJCQl7CisJCQkJS2V5IG8gPSBfa2V5cy5wdXQoIGssIGsgKTsKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRmKCAiYWRkICVzID0+ICVzXG4iLCBrLCBvICk7CisJCQkJQXNzZXJ0aW9uLmNoZWNrKCBvID09IG51bGwsICJvID09IG51bGwiICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNzZXJ0aW9uLmNoZWNrKCBfa2V5cy5nZXQoIGsgKSA9PSBudWxsLCAiX2tleXMuZ2V0KCBrICkgPT0gbnVsbCIgKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBrZXlzUmVtb3ZlKCBLZXkgayApCisJeworCQlzeW5jaHJvbml6ZWQgKF9rZXlzKQorCQl7CisJCQlLZXkgbyA9IF9rZXlzLnJlbW92ZSggayApOworLy8JCQlTeXN0ZW0ub3V0LnByaW50ZiggInJlbW92ZSAlcyA9PiAlc1xuIiwgaywgbyApOworCQkJQXNzZXJ0aW9uLmNoZWNrKCBvID09IGsgfHwgbyA9PSBudWxsLCAibyA9PSBrIHx8IG8gPT0gbnVsbCIgKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFNlbGVjdG9yIGdldFNlbGVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlzeW5jaHJvbml6ZWQgKF9rZXlzKQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlLZXkgayA9IF9rZXlzLmZpcnN0S2V5KCk7CisJCQkJa2V5c1JlbW92ZSggayApOworCQkJCWsuc2V0QXZhaWwoIGsuYXZhaWwoKS0xICk7CisJCQkJa2V5c0FkZCggayApOworCQkJCXJldHVybiBrLnNlbGVjdG9yOworCQkJfQorCQkJY2F0Y2ggKCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUgKQorCQkJeworCQkJCVNlbGVjdG9yIHMgPSBuZXcgU2VsZWN0b3IoIF9pZCsrLCB0aGlzICk7CisJCQkJLy8gY29uc3RydWN0b3IgY2FsbHMgdXMgYmFjayBhdCAjYWRkKFNlbGVjdG9yLCBpbnQpCisJCQkJcy5zdGFydCgpOworCQkJCXJldHVybiBzOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgZmluYWwgVHJlZU1hcDxLZXksIEtleT4gX2tleXMgPSBuZXcgVHJlZU1hcDxLZXksIEtleT4oKTsKKwkKKwlwcml2YXRlIGludCBfaWQ7CisKKwkvKioKKwkgKiBSZWdpc3RlcnMgdGhlIGhhbmRsZXIgd2l0aCBhbiBhdmFpbGFibGUgU2VsZWN0b3IuIFRoaXMgbWF5IGJlIGNhbGxlZCBieQorCSAqIGFuIGV4dGVybmFsIHRocmVhZCBvciBieSBvbmUgb2YgdGhlIFNlbGVjdG9yIHRocmVhZHMuCisJICogQHBhcmFtIGhhbmRsZXIKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAorCSAqLworCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKCBIYW5kbGVyPD8+IGhhbmRsZXIgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWNoZWNrU3RhcnRlZCggdHJ1ZSApOworCQlnZXRTZWxlY3RvcigpLnJlZ2lzdGVyKCBoYW5kbGVyICk7CisJCQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhZGRyCisJICogQHBhcmFtIGJhY2tsb2cKKwkgKiBAcGFyYW0gZmFjdG9yeQorCSAqIEByZXR1cm4gYSBuZXcgQWNjZXB0SGFuZGxlciBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHNlbGVjdG9yLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIEFjY2VwdEhhbmRsZXIgbmV3QWNjZXB0SGFuZGxlciggSW5ldFNvY2tldEFkZHJlc3MgYWRkciwgaW50IGJhY2tsb2csCisJCUFjY2VwdEhhbmRsZXJGYWN0b3J5IGZhY3RvcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTZXJ2ZXJTb2NrZXRDaGFubmVsIHNzYyA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOworCQlzc2MuY29uZmlndXJlQmxvY2tpbmcoIGZhbHNlICk7CisJCVNlcnZlclNvY2tldCBzcyA9IHNzYy5zb2NrZXQoKTsKKwkJc3MuYmluZCggYWRkciwgYmFja2xvZyApOworCQlBY2NlcHRIYW5kbGVyIGFoID0gZmFjdG9yeS5uZXdBY2NlcHRIYW5kbGVyKCBzc2MgKTsKKwkJcmVnaXN0ZXIoIGFoICk7CisJCXJldHVybiBhaDsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFkZHIKKwkgKiBAcGFyYW0gZmFjdG9yeQorCSAqIEByZXR1cm4gYSBuZXcgU3RyZWFtSGFuZGxlciBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHNlbGVjdG9yLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cmVhbUhhbmRsZXIgbmV3U3RyZWFtSGFuZGxlciggSW5ldFNvY2tldEFkZHJlc3MgYWRkciwKKwkJU3RyZWFtSGFuZGxlckZhY3RvcnkgZmFjdG9yeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNvY2tldENoYW5uZWwgc2MgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKKwkJc2MuY29uZmlndXJlQmxvY2tpbmcoIGZhbHNlICk7CisJCVN0cmVhbUhhbmRsZXIgc2ggPSBmYWN0b3J5Lm5ld1N0cmVhbUhhbmRsZXIoIHNjLCB0cnVlICk7CisJCXJlZ2lzdGVyKCBzaCApOworCQlzYy5jb25uZWN0KCBhZGRyICk7CisJCXJldHVybiBzaDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2MKKwkgKiBAcGFyYW0gZmFjdG9yeQorCSAqIEByZXR1cm4gYSBuZXcgU3RyZWFtSGFuZGxlciBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHNlbGVjdG9yLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cmVhbUhhbmRsZXIgbmV3U3RyZWFtSGFuZGxlciggU29ja2V0Q2hhbm5lbCBzYywKKwkJU3RyZWFtSGFuZGxlckZhY3RvcnkgZmFjdG9yeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXNjLmNvbmZpZ3VyZUJsb2NraW5nKCBmYWxzZSApOworCQlTdHJlYW1IYW5kbGVyIHNoID0gZmFjdG9yeS5uZXdTdHJlYW1IYW5kbGVyKCBzYywgZmFsc2UgKTsKKwkJcmVnaXN0ZXIoIHNoICk7CisJCXJldHVybiBzaDsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2V5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxLZXk+CisJeworCQlwdWJsaWMgS2V5KCBpbnQgYXZhaWwsIFNlbGVjdG9yIHNlbGVjdG9yICkKKwkJeworCQkJX2F2YWlsID0gYXZhaWw7CisJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCX0KKworCQlwcml2YXRlIGludCBfYXZhaWw7CisJCQorCQlwcml2YXRlIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOworCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCQl7CisJCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIktleSglZCwgJXMpIiwgX2F2YWlsLCBzZWxlY3RvciApOworCQl9CisJCQorCQlwdWJsaWMgaW50IGF2YWlsKCkKKwkJeworCQkJcmV0dXJuIF9hdmFpbDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEF2YWlsKCBpbnQgYXZhaWwgKQorCQl7CisJCQlfYXZhaWwgPSBhdmFpbDsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKQorCQl7CisJCQlyZXR1cm4gX2F2YWlsIF4gc2VsZWN0b3IuaGFzaENvZGUoKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyggT2JqZWN0IG9iaiApCisJCXsKKwkJCWlmIChvYmogPT0gdGhpcykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQorCQkJaWYgKG9iaiA9PSBudWxsIHx8IG9iai5nZXRDbGFzcygpICE9IEtleS5jbGFzcykKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJCUtleSBrID0gKEtleSkgb2JqOworCQkJcmV0dXJuIF9hdmFpbCA9PSBrLl9hdmFpbCAmJiBzZWxlY3RvciA9PSBrLnNlbGVjdG9yOworCQl9CisKKwkJcHVibGljIGludCBjb21wYXJlVG8oIEtleSBrICkKKwkJeworCQkJaWYgKF9hdmFpbCA8IGsuX2F2YWlsKQorCQkJCXJldHVybiAtMTsKKwkJCQorCQkJaWYgKF9hdmFpbCA+IGsuX2F2YWlsKQorCQkJCXJldHVybiAxOworCQkJCisJCQkvLyBhdmFpbCA9PSBrLmF2YWlsCisJCQkKKwkJCWlmIChzZWxlY3Rvci5pZCgpIDwgay5zZWxlY3Rvci5pZCgpKQorCQkJCXJldHVybiAtMTsKKwkJCQorCQkJaWYgKHNlbGVjdG9yLmlkKCkgPiBrLnNlbGVjdG9yLmlkKCkpCisJCQkJcmV0dXJuIDE7CisJCQkKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgZHVtcCgpCisJeworCQlzeW5jaHJvbml6ZWQgKF9rZXlzKQorCQl7CisJCQlmb3IgKEtleSBrOiBfa2V5cy52YWx1ZXMoKSkKKwkJCQlTeXN0ZW0ub3V0LnByaW50ZiggImtleTogJWQgJXNcbiIsIGsuYXZhaWwoKSwgay5zZWxlY3RvciApOworCQkJCisJCQlmb3IgKEtleSBrOiBfa2V5cy52YWx1ZXMoKSkKKwkJCQlrLnNlbGVjdG9yLmR1bXAoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHN0YXRpY2FsbHkgY29uZmlndXJlZCBTZWxlY3Rvciwgb3Igb25lIG5ld2x5IGNvbmZpZ3VyZWQgaWYKKwkgKiBub25lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3VwZXJTZWxlY3RvciBnZXQoKQorCXsKKwkJaWYgKHNlbGVjdG9yID09IG51bGwpCisJCXsKKwkJCXN5bmNocm9uaXplZCAoc3luYykKKwkJCXsKKwkJCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCkKKwkJCQl7CisJCQkJCXNlbGVjdG9yID0gbmV3IFN1cGVyU2VsZWN0b3IoKTsKKwkJCQkJc2VsZWN0b3Iuc3RhcnQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHNlbGVjdG9yOworCX0KKwkKKwkvKioKKwkgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQgc2VsZWN0b3Igd2l0aCBhIG5ldyBvbmUuCisJICogQHBhcmFtIG5ld1NlbGVjdG9yCisJICogQHJldHVybiB0aGUgb2xkIHN0YXRpY2FsbHkgY29uZmlndXJlZCBzZWxlY3RlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN1cGVyU2VsZWN0b3IgcHV0KCBTdXBlclNlbGVjdG9yIG5ld1NlbGVjdG9yICkKKwl7CisJCXN5bmNocm9uaXplZCAoc3luYykKKwkJeworCQkJU3VwZXJTZWxlY3RvciBvbGRTZWxlY3RvciA9IHNlbGVjdG9yOworCQkJc2VsZWN0b3IgPSBuZXdTZWxlY3RvcjsKKwkJCXJldHVybiBvbGRTZWxlY3RvcjsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBTdXBlclNlbGVjdG9yIHNlbGVjdG9yOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBzeW5jID0gbmV3IE9iamVjdCgpOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1RjcDJDb25uZWN0aW9uLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vVGNwMkNvbm5lY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDRmODMxCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1RjcDJDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSw1OTYgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pbzsKKworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuQWxhcm1MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5BbGFybU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Ub2RvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRvZG9NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlRjcENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UY3BPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0RGF0YTsKKworCisvKioKKyAqIEEgVENQLWJhc2VkIHRyYW5zcG9ydCBiYXNlZCBvbiBzZWxlY3RvcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBUY3AyQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFRyYW5zcG9ydERhdGEsIFN0cmVhbUhhbmRsZXJGYWN0b3J5LCBBbGFybUxpc3RlbmVyCit7CisJLyoqCisJICogQHBhcmFtIHVyaQorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKi8KKwlwdWJsaWMgVGNwMkNvbm5lY3Rpb24oIFN0cmluZyB1cmksIFJlc291cmNlcyByZXNvdXJjZXMgKQorCXsKKwkJdGhpcyggbmV3IFVSTCggdXJpICksIHJlc291cmNlcyApOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICovCisJcHVibGljIFRjcDJDb25uZWN0aW9uKCBVUkwgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzICkKKwl7CisJCXNlbGVjdG9yID0gKFN1cGVyU2VsZWN0b3IpIHJlc291cmNlcy5nZXQoICJzZWxlY3RvciIgKTsKKwkJYnVmZmVyUG9vbCA9IChCeXRlQnVmZmVyUG9vbCkgcmVzb3VyY2VzLmdldCggImJ1ZmZlclBvb2wiICk7CisJCW9wdGlvbnMgPSBuZXcgVGNwT3B0aW9ucyggdXJpLCByZXNvdXJjZXMgKTsKKworCQljb25uZWN0aW9uID0gKFNvY2tldENoYW5uZWwpIHJlc291cmNlcy5yZW1vdmUoICJjb25uZWN0aW9uIiApOworCisJCWlmIChjb25uZWN0aW9uID09IG51bGwpCisJCXsKKwkJCVN0cmluZyBoID0gdXJpLmdldEhvc3QoKTsKKwkJCWlmIChoID09IG51bGwpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggImhvc3QgPT0gbnVsbCIgKTsKKworCQkJSW50ZWdlciBwID0gdXJpLmdldFBvcnQoKTsKKwkJCWlmIChwID09IG51bGwpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBvcnQgPT0gbnVsbCIgKTsKKworCQkJaWYgKHAgPD0gMCB8fCBwID4gNjU1MzUpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggInBvcnQgPD0gMCB8fCBwb3J0ID4gNjU1MzUiICk7CisKKwkJCWhvc3QgPSBoOworCQkJcG9ydCA9IHA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlob3N0ID0gbnVsbDsKKwkJCXBvcnQgPSAwOworCQl9CisJfQorCisJcHJpdmF0ZSBmaW5hbCBTdXBlclNlbGVjdG9yIHNlbGVjdG9yOworCQorCXByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlclBvb2wgYnVmZmVyUG9vbDsKKworCXByaXZhdGUgZmluYWwgVGNwT3B0aW9ucyBvcHRpb25zOworCisJcHJpdmF0ZSBTb2NrZXRDaGFubmVsIGNvbm5lY3Rpb247CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBob3N0OworCisJcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJdHJ5CisJCXsKKwkJCVNvY2tldCBzID0gY2hlY2tTb2NrZXQoKTsKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVGNwMkNvbm5lY3Rpb24odXAsICVzOiVkLCAlczolZCkiLCBzCisJCQkJLmdldExvY2FsQWRkcmVzcygpLCBzLmdldExvY2FsUG9ydCgpLCBzLmdldEluZXRBZGRyZXNzKCksIHMKKwkJCQkuZ2V0UG9ydCgpICk7CisJCX0KKwkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKwkJeworCQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJUY3AyQ29ubmVjdGlvbihkb3duLCAlczolZCkiLCBob3N0LCBwb3J0ICk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlcigpCisJeworCQlyZXR1cm4gaG9zdCA9PSBudWxsOworCX0KKworCS8vIC8vLy8vLy8vLy8vCisJLy8gU0VTU0lPTiAvLworCS8vIC8vLy8vLy8vLy8vCisKKwlwdWJsaWMgU2Vzc2lvbkRhdGEgZ2V0U2Vzc2lvbigpCisJeworCQlyZXR1cm4gc2Vzc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKCBTZXNzaW9uRGF0YSBzZXNzaW9uICkKKwl7CisJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisJfQorCisJcHJpdmF0ZSBTZXNzaW9uRGF0YSBzZXNzaW9uOworCisJLy8gLy8vLy8vLy8vLy8vLworCS8vIFRSQU5TUE9SVCAvLworCS8vIC8vLy8vLy8vLy8vLy8KKworCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWlmIChxdWVyeSA9PSBJU19TRVJWRVIpCisJCQlyZXR1cm4gaXNTZXJ2ZXIoKTsKKworCQlpZiAocXVlcnkgPT0gVGNwQ29ubmVjdGlvbi5MT0NBTF9BRERSRVNTKQorCQkJcmV0dXJuIGxvY2FsQWRkcmVzcygpOworCisJCWlmIChxdWVyeSA9PSBUY3BDb25uZWN0aW9uLlJFTU9URV9BRERSRVNTKQorCQkJcmV0dXJuIHJlbW90ZUFkZHJlc3MoKTsKKworCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBXYWl0VXApCisJCXsKKwkJCXdhaXRVcCggKChXYWl0VXApIHF1ZXJ5KS5tYXhEZWxheSApOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBXYWl0RG93bikKKwkJeworCQkJd2FpdERvd24oICgoV2FpdERvd24pIHF1ZXJ5KS5tYXhEZWxheSApOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIHF1ZXJ5OiAiICsgcXVlcnkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnRDb250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGNvbnRyb2wgPT0gU1RBUlQpCisJCXsKKwkJCXN0YXJ0KCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY29udHJvbCA9PSBTVEFSVF9BTkRfV0FJVF9VUCkKKwkJeworCQkJc3RhcnQoKTsKKwkJCXdhaXRVcCggKEludGVnZXIpIHZhbHVlICk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY29udHJvbCA9PSBTVE9QKQorCQl7CisJCQlzdG9wKCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY29udHJvbCA9PSBTVE9QX0FORF9XQUlUX0RPV04pCisJCXsKKwkJCXN0b3AoKTsKKwkJCXdhaXREb3duKCAoSW50ZWdlcikgdmFsdWUgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb250cm9sID09IFJFU0VUKQorCQl7CisJCQljbG9zZSggdHJ1ZSApOworCQkJcmV0dXJuOworCQl9CisKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sOiAiICsgY29udHJvbCApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFuc3BvcnREYXRhKCBXaG8gcmVjaXBpZW50LCBGbGV4QnVmZmVyIGJ1ZiApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludCBuID0gYnVmLmF2YWlsKCk7CisJCWlmIChuID09IDApCisJCQlyZXR1cm47CisJCQorCQlNeVN0cmVhbUhhbmRsZXIgaCA9IGNoZWNrSGFuZGxlcigpOworCisJCS8vIFRPRE8gYmV0dGVyIGpvYiB3aXRoIGJ1ZmZlcnMKKwkJCisJCUJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KCBuICk7CisJCWJiLnB1dCggYnVmLmdldEJ1ZigpLCBidWYuaW5kZXgoKSwgbiApOworCQkKKwkJYmIuZmxpcCgpOworCQloLndyaXRlQnVmKCBiYiApOworCX0KKworCS8vIC8vLy8vLy8vLy8vLy8vLy8vLworCS8vIElNUExFTUVOVEFUSU9OIC8vCisJLy8gLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3luY2hyb25pemVkIChzdGFydGVkU3luYykKKwkJeworCQkJaWYgKHN0YXJ0ZWQpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggInN0YXJ0ZWQiICk7CisJCQkKKwkJCXN0YXJ0ZWQgPSB0cnVlOworCQkJcmVzdGFydCgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCByZXN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaWYgKGhvc3QgIT0gbnVsbCkKKwkJeworLy8JCQlNeVN0cmVhbUhhbmRsZXIgaCA9IChNeVN0cmVhbUhhbmRsZXIpCisJCQlzZWxlY3Rvci5uZXdTdHJlYW1IYW5kbGVyKCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoIGhvc3QsIHBvcnQgKSwgdGhpcyApOworCQkJLy9zZXRIYW5kbGVyKCBoICk7IC8vIGZpcmVVcCB3aWxsIGRvIGl0CisJCQlyZXR1cm47CisJCX0KKworCQlTb2NrZXRDaGFubmVsIGMgPSBjb25uZWN0aW9uOworCQlpZiAoYyAhPSBudWxsKQorCQl7CisJCQljb25uZWN0aW9uID0gbnVsbDsKKy8vCQkJTXlTdHJlYW1IYW5kbGVyIGggPSAoTXlTdHJlYW1IYW5kbGVyKQorCQkJc2VsZWN0b3IubmV3U3RyZWFtSGFuZGxlciggYywgdGhpcyApOworCQkJLy9zZXRIYW5kbGVyKCBoICk7IC8vIGZpcmVVcCB3aWxsIGRvIGl0CisJCQlyZXR1cm47CisJCX0KKworCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJjYW5ub3Qgc3RhcnQsIG5vIGNvbm5lY3Rpb24iICk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQ7CisJCisJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc3RhcnRlZFN5bmMgPSBuZXcgT2JqZWN0KCk7CisKKwlwcml2YXRlIE15U3RyZWFtSGFuZGxlciBzZXRIYW5kbGVyKCBNeVN0cmVhbUhhbmRsZXIgbmV3SGFuZGxlciApCisJeworCQlzeW5jaHJvbml6ZWQgKGhhbmRsZXJTeW5jKQorCQl7CisJCQlpZiAobmV3SGFuZGxlciA9PSBoYW5kbGVyKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlpZiAobmV3SGFuZGxlciAhPSBudWxsICYmIGhhbmRsZXIgIT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorCQkJCQkibmV3SGFuZGxlciAhPSBudWxsICYmIGhhbmRsZXIgIT0gbnVsbCAmJiBuZXdIYW5kbGVyICE9IGhhbmRsZXIiICk7CisJCQkKKwkJCU15U3RyZWFtSGFuZGxlciBvbGRIYW5kbGVyID0gaGFuZGxlcjsKKwkJCWhhbmRsZXIgPSBuZXdIYW5kbGVyOworCQkJcmV0dXJuIG9sZEhhbmRsZXI7CisJCX0KKwl9CisKKwlwcml2YXRlIE15U3RyZWFtSGFuZGxlciBoYW5kbGVyOworCQorCXByaXZhdGUgZmluYWwgT2JqZWN0IGhhbmRsZXJTeW5jID0gbmV3IE9iamVjdCgpOworCisJdm9pZCBzdG9wKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlzdGFydGVkID0gZmFsc2U7CisJCQorCQlNeVN0cmVhbUhhbmRsZXIgaCA9IHNldEhhbmRsZXIoIG51bGwgKTsKKwkJaWYgKGggIT0gbnVsbCkKKwkJeworCQkJaC5zaHV0ZG93bk91dHB1dCgpOworCQkJaC5jYW5jZWwoKTsKKwkJfQorCX0KKworCXZvaWQgY2xvc2UoIGJvb2xlYW4gcmVzZXQgKQorCXsKKwkJTXlTdHJlYW1IYW5kbGVyIGggPSBzZXRIYW5kbGVyKCBudWxsICk7CisJCWlmIChoICE9IG51bGwpCisJCXsKKwkJCWlmIChyZXNldCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWguc2V0TGluZ2VyKCBmYWxzZSwgMCApOworCQkJCX0KKwkJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQkJaC5jYW5jZWwoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaXJlVXAoIE15U3RyZWFtSGFuZGxlciBoICkKKwl7CisJCXNldEhhbmRsZXIoIGggKTsKKwkJc3RhdHVzLnNldCggU2Vzc2lvbi5VUCApOworCQkKKwkJVG9kb01hbmFnZXIuYWRkVG9kbyggbmV3IFRvZG8oKQorCQl7CisJCQlwdWJsaWMgdm9pZCBkb2l0KCBUb2RvTWFuYWdlciBtICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5VUCApOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBleGNlcHRpb24oIFRvZG9NYW5hZ2VyIG0sIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9ICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpcmVEb3duKCkKKwl7CisJCXNldEhhbmRsZXIoIG51bGwgKTsKKwkJc3RhdHVzLnNldCggU2Vzc2lvbi5ET1dOICk7CisJCQorCQlpZiAoc3RhcnRlZCAmJiBob3N0ICE9IG51bGwgJiYgb3B0aW9ucy5yZWNvbm5lY3REZWxheSA+IDApCisJCQlBbGFybU1hbmFnZXIuc3RhdGljQWRkKCB0aGlzLCAwLCBvcHRpb25zLnJlY29ubmVjdERlbGF5ICk7CisJCQorCQlUb2RvTWFuYWdlci5hZGRUb2RvKCBuZXcgVG9kbygpCisJCXsKKwkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG0gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLkRPV04gKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgZXhjZXB0aW9uKCBUb2RvTWFuYWdlciBtLCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfSApOworCX0KKworCXByaXZhdGUgdm9pZCBmaXJlRXhjZXB0aW9uKCBTdHJpbmcgd2hhdCwgZmluYWwgRXhjZXB0aW9uIGUgKQorCXsKKwkJVG9kb01hbmFnZXIuYWRkVG9kbyggbmV3IFRvZG8oKQorCQl7CisJCQlwdWJsaWMgdm9pZCBkb2l0KCBUb2RvTWFuYWdlciBtICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggZSApOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBleGNlcHRpb24oIFRvZG9NYW5hZ2VyIG0sIEV4Y2VwdGlvbiBleCApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlpZiAoZXggIT0gZSkKKwkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0gKTsKKwl9CisKKwl2b2lkIHdhaXRVcCggaW50IG1heERlbGF5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3RhdHVzLndhaXRVbnRpbEVxKCBTZXNzaW9uLlVQLCBtYXhEZWxheSApOworCX0KKworCXZvaWQgd2FpdERvd24oIGludCBtYXhEZWxheSApIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN0YXR1cy53YWl0VW50aWxFcSggU2Vzc2lvbi5ET1dOLCBtYXhEZWxheSApOworCX0KKworCXByaXZhdGUgZmluYWwgTW9uaXRvcjxTdHJpbmc+IHN0YXR1cyA9IG5ldyBNb25pdG9yPFN0cmluZz4oICJzdGF0dXMiLAorCQlTZXNzaW9uLkRPV04gKTsKKworCVNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcmVzcygpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGNoZWNrU29ja2V0KCkuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpOworCX0KKworCVNvY2tldEFkZHJlc3MgbG9jYWxBZGRyZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlyZXR1cm4gY2hlY2tTb2NrZXQoKS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKTsKKwl9CisKKwlwcml2YXRlIFNvY2tldCBjaGVja1NvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJU29ja2V0IHMgPSBjaGVja0NoYW5uZWwoKS5zb2NrZXQoKTsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggIm5vIHNvY2tldCIgKTsKKwkJcmV0dXJuIHM7CisJfQorCisJcHJpdmF0ZSBTb2NrZXRDaGFubmVsIGNoZWNrQ2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJU29ja2V0Q2hhbm5lbCBjID0gY2hlY2tIYW5kbGVyKCkuY2hhbm5lbCgpOworCQlpZiAoYyA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCAibm8gY2hhbm5lbCIgKTsKKwkJcmV0dXJuIGM7CisJfQorCisJcHJpdmF0ZSBNeVN0cmVhbUhhbmRsZXIgY2hlY2tIYW5kbGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlNeVN0cmVhbUhhbmRsZXIgaCA9IGhhbmRsZXI7CisJCWlmIChoID09IG51bGwpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJubyBoYW5kbGVyIiApOworCQlyZXR1cm4gaDsKKwl9CisKKwlwdWJsaWMgTXlTdHJlYW1IYW5kbGVyIG5ld1N0cmVhbUhhbmRsZXIoIFNvY2tldENoYW5uZWwgY2hhbm5lbCwKKwkJYm9vbGVhbiB3YW50c0Nvbm5lY3QgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlyZXR1cm4gbmV3IE15U3RyZWFtSGFuZGxlciggY2hhbm5lbCwgd2FudHNDb25uZWN0ICk7CisJfQorCisJY2xhc3MgTXlTdHJlYW1IYW5kbGVyIGV4dGVuZHMgU3RyZWFtSGFuZGxlcgorCXsKKwkJcHVibGljIE15U3RyZWFtSGFuZGxlciggU29ja2V0Q2hhbm5lbCBjaGFubmVsLCBib29sZWFuIHdhbnRzQ29ubmVjdCApCisJCQl0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJc3VwZXIoIGNoYW5uZWwsIHdhbnRzQ29ubmVjdCApOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGNvbm5lY3RlZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQlzdXBlci5jb25uZWN0ZWQoKTsKKwkJCQorCQkJU29ja2V0IHMgPSBjaGFubmVsKCkuc29ja2V0KCk7CisKKwkJCXMuc2V0S2VlcEFsaXZlKCBvcHRpb25zLmtlZXBBbGl2ZSApOworCQkJcy5zZXRTb0xpbmdlciggb3B0aW9ucy5saW5nZXJUaW1lID49IDAsCisJCQkJb3B0aW9ucy5saW5nZXJUaW1lID49IDAgPyBvcHRpb25zLmxpbmdlclRpbWUgOiAwICk7CisJCQlzLnNldFRjcE5vRGVsYXkoIG9wdGlvbnMubm9EZWxheSApOworCQkJcy5zZXRUcmFmZmljQ2xhc3MoIG9wdGlvbnMudHJhZmZpY0NsYXNzICk7CisKKwkJCWZpcmVVcCggdGhpcyApOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0TGluZ2VyKCBib29sZWFuIG9uLCBpbnQgbGluZ2VyICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCVNvY2tldCBzID0gY2hhbm5lbCgpLnNvY2tldCgpOworCQkJcy5zZXRTb0xpbmdlciggb24sIGxpbmdlciApOworCQl9CisKKwkJcHVibGljIHZvaWQgd3JpdGVCdWYoIEJ5dGVCdWZmZXIgYmIgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJc3luY2hyb25pemVkICh3bGlzdCkKKwkJCXsKKwkJCQlpZiAoIWJiLmhhc1JlbWFpbmluZygpKQorCQkJCQlyZXR1cm47CisKKwkJCQlpZiAoIXdsaXN0LmlzRW1wdHkoKSkKKwkJCQl7CisJCQkJCXdsaXN0LmFkZCggYmIgKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWNoYW5uZWwoKS53cml0ZSggYmIgKTsKKwkJCQlpZiAoIWJiLmhhc1JlbWFpbmluZygpKQorCQkJCQlyZXR1cm47CisKKwkJCQkvLyB0aGVyZSdzIHNvbWUgbGVmdG92ZXJzLi4uCisKKwkJCQl3bGlzdC5hZGQoIGJiICk7CisJCQkJdXBkYXRlSW50ZXJlc3RPcHMoKTsKKwkJCX0KKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIGNhblJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9SZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlCeXRlQnVmZmVyIGJ1ZiA9IGJ1ZmZlclBvb2wuYWxsb2MoIG51bGwgKTsKKwkJCXRyeQorCQkJeworCQkJCWludCBuID0gcmVhZCggYnVmICk7CisJCQkJaWYgKG4gPD0gMCkKKwkJCQkJdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbiggIm4gPD0gMCIgKTsKKwkJCQkKKwkJCQlidWYuZmxpcCgpOworCQkJCWJ5dGVbXSBiYnVmID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKKwkJCQlidWYuZ2V0KCBiYnVmICk7CisJCQkJCisJCQkJRmxleEJ1ZmZlciBmYnVmID0gbmV3IEZsZXhCdWZmZXIoIGJidWYgKTsKKwkJCQlzZXNzaW9uLnNlc3Npb25EYXRhKCBudWxsLCBmYnVmICk7CisJCQl9CisJCQlmaW5hbGx5CisJCQl7CisJCQkJaWYgKGJ1ZiAhPSBudWxsKQorCQkJCQlidWZmZXJQb29sLnJlbGVhc2UoIGJ1ZiApOworCQkJfQorCQkJCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIGJvb2xlYW4gY2FuV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXJldHVybiAhd2xpc3QuaXNFbXB0eSgpOworCQl9CisKKwkJcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PEJ5dGVCdWZmZXI+IHdsaXN0ID0gbmV3IExpbmtlZExpc3Q8Qnl0ZUJ1ZmZlcj4oKTsKKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9Xcml0ZSgpIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJc3luY2hyb25pemVkICh3bGlzdCkKKwkJCXsKKwkJCQlCeXRlQnVmZmVyIGJ1ZiA9IHdsaXN0LmdldEZpcnN0KCk7CisJCQkJd3JpdGUoIGJ1ZiApOworCQkJCWlmICghYnVmLmhhc1JlbWFpbmluZygpKQorCQkJCQl3bGlzdC5yZW1vdmVGaXJzdCgpOworCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgd3JpdGUoIEJ5dGVCdWZmZXIgd2J1ZiApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJkb24ndCB1c2UgdGhpcyEiICk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2FuY2VsZWQoIEV4Y2VwdGlvbiBlICkKKwkJeworCQkJc3VwZXIuY2FuY2VsZWQoIGUgKTsKKwkJCWZpcmVEb3duKCk7CisJCX0KKwl9CisKKwlib29sZWFuIGlzU3RhcnRlZCgpCisJeworCQlyZXR1cm4gc3RhcnRlZDsKKwl9CisKKwl2b2lkIGNsb3NlKCkKKwl7CisJCWNsb3NlKCBmYWxzZSApOworCX0KKworCS8qKgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzaHV0ZG93bk91dHB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJU3RyZWFtSGFuZGxlciBoID0gaGFuZGxlcjsKKwkJaWYgKGggIT0gbnVsbCkKKwkJCWguc2h1dGRvd25PdXRwdXQoKTsKKwl9CisKKwlwdWJsaWMgaW50IHdha2V1cCggQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIE9iamVjdCBzdGF0ZSwgbG9uZyBkdWUgKQorCXsKKwkJdHJ5CisJCXsKKwkJCXJlc3RhcnQoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorCQl7CisJCQlmaXJlRXhjZXB0aW9uKCAicmVjb25uZWN0IiwgZSApOworCQkJcmV0dXJuIHN0YXJ0ZWQgPyBvcHRpb25zLnJlY29ubmVjdERlbGF5IDogMDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9UY3AyTGlzdGVuZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9UY3AyTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNmMDEwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1RjcDJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDI3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5uaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Ub2RvOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRvZG9NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5UY3BDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uVHJhbnNwb3J0OworCisKKy8qKgorICogU2VsZWN0b3IgYmFzZWQgVENQIGxpc3RlbmVyLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBUY3AyTGlzdGVuZXIgaW1wbGVtZW50cyBUcmFuc3BvcnQ8U2Vzc2lvbkxpc3RlbmVyPFNvY2tldENoYW5uZWw+PiwKKwlBY2NlcHRIYW5kbGVyRmFjdG9yeQoreworCS8qKgorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcGFyYW0gcmVzb3VyY2VzCisJICovCisJcHVibGljIFRjcDJMaXN0ZW5lciggU3RyaW5nIHVyaSwgUmVzb3VyY2VzIHJlc291cmNlcyApCisJeworCQl0aGlzKCBuZXcgVVJMKCB1cmkgKSwgcmVzb3VyY2VzICk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHVyaQorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKi8KKwlwdWJsaWMgVGNwMkxpc3RlbmVyKCBVUkwgdXJpLCBSZXNvdXJjZXMgcmVzb3VyY2VzICkKKwl7CisJCXRoaXMoIHVyaS5nZXRIb3N0KCksIHVyaS5nZXRQb3J0KCksIHVyaQorCQkJLmdldEludGVnZXJUZXJtKCAiYmFja2xvZyIsIDAgKSwgcmVzb3VyY2VzICk7CisJfQorCisJcHJpdmF0ZSBUY3AyTGlzdGVuZXIoIFN0cmluZyBob3N0LCBJbnRlZ2VyIHBvcnQsIGludCBiYWNrbG9nLAorCQlSZXNvdXJjZXMgcmVzb3VyY2VzICkKKwl7CisJCWlmIChwb3J0ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAicG9ydCBub3Qgc3BlY2lmaWVkIiApOworCQkKKwkJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzUiICk7CisJCQorCQlpZiAoYmFja2xvZyA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiYmFja2xvZyA8IDAiICk7CisKKwkJc2VsZWN0b3IgPSAoU3VwZXJTZWxlY3RvcikgcmVzb3VyY2VzLmdldCggInNlbGVjdG9yIiApOworCisJCXRoaXMuaG9zdCA9IGhvc3Q7CisJCXRoaXMucG9ydCA9IHBvcnQ7CisJCXRoaXMuYmFja2xvZyA9IGJhY2tsb2c7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBTdXBlclNlbGVjdG9yIHNlbGVjdG9yOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKKworCXByaXZhdGUgZmluYWwgaW50IHBvcnQ7CisKKwlwcml2YXRlIGZpbmFsIGludCBiYWNrbG9nOworCisJLyoqCisJICogSG9zdCBuYW1lIHRvIHNwZWNpZnkgdG8gc2VsZWN0IGxpc3RlbmluZyBvbiBhbGwgaW50ZXJmYWNlcy4gVGhlIHZhbHVlIGlzCisJICogIjAuMC4wLjAiLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9JTlRGUyA9ICIwLjAuMC4wIjsKKworCS8qKgorCSAqIEBwYXJhbSBzCisJICogQHJldHVybiBudWxsIGlmIHMgaXMgbnVsbCBvciBBTExfSU5URlMgKCIwLjAuMC4wIikuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdHJhbnNsYXRlSG9zdCggU3RyaW5nIHMgKQorCXsKKwkJaWYgKHMgIT0gbnVsbCAmJiBzLmVxdWFscyggQUxMX0lOVEZTICkpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlTZXJ2ZXJTb2NrZXQgcyA9IG51bGw7CisKKwkJaWYgKHMgIT0gbnVsbCkKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCAiVGNwMkxpc3RlbmVyKHVwLCAlcywgJWQpIiwgcworCQkJCS5nZXRJbmV0QWRkcmVzcygpLCBzLmdldExvY2FsUG9ydCgpICk7CisKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoICJUY3AyTGlzdGVuZXIoZG93biwgJXMsICVkKSIsIGhvc3QsIHBvcnQgKTsKKwl9CisKKwkvLyAvLy8vLy8vLy8vLworCS8vIFNFU1NJT04gLy8KKwkvLyAvLy8vLy8vLy8vLworCisJcHVibGljIFNlc3Npb25MaXN0ZW5lcjxTb2NrZXRDaGFubmVsPiBnZXRTZXNzaW9uKCkKKwl7CisJCXJldHVybiBzZXNzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25MaXN0ZW5lcjxTb2NrZXRDaGFubmVsPiBzZXNzaW9uICkKKwl7CisJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisJfQorCisJcHJpdmF0ZSBTZXNzaW9uTGlzdGVuZXI8U29ja2V0Q2hhbm5lbD4gc2Vzc2lvbjsKKworCS8vIC8vLy8vLy8vLy8vLy8KKwkvLyBUUkFOU1BPUlQgLy8KKwkvLyAvLy8vLy8vLy8vLy8vCisKKwlwdWJsaWMgT2JqZWN0IHRyYW5zcG9ydFF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAocXVlcnkgPT0gVGNwQ29ubmVjdGlvbi5MT0NBTF9BRERSRVNTKQorCQkJcmV0dXJuIGxvY2FsQWRkcmVzcygpOworCisJCWlmIChxdWVyeSBpbnN0YW5jZW9mIFdhaXRVcCkKKwkJeworCQkJd2FpdFVwKCAoKFdhaXRVcCkgcXVlcnkpLm1heERlbGF5ICk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWlmIChxdWVyeSBpbnN0YW5jZW9mIFdhaXREb3duKQorCQl7CisJCQl3YWl0RG93biggKChXYWl0RG93bikgcXVlcnkpLm1heERlbGF5ICk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnk6ICIgKyBxdWVyeSApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoY29udHJvbCA9PSBTVEFSVCkKKwkJeworCQkJc3RhcnQoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb250cm9sID09IFNUQVJUX0FORF9XQUlUX1VQKQorCQl7CisJCQlzdGFydCgpOworCQkJd2FpdFVwKCAoSW50ZWdlcikgdmFsdWUgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb250cm9sID09IFNUT1ApCisJCXsKKwkJCXN0b3AoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb250cm9sID09IFNUT1BfQU5EX1dBSVRfRE9XTikKKwkJeworCQkJc3RvcCgpOworCQkJd2FpdERvd24oIChJbnRlZ2VyKSB2YWx1ZSApOworCQkJcmV0dXJuOworCQl9CisKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sOiAiICsgY29udHJvbCApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYW5zcG9ydE5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisKKwkvLyAvLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTVBMRU1FTlRBVElPTiAvLworCS8vIC8vLy8vLy8vLy8vLy8vLy8vLworCisJdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXN5bmNocm9uaXplZCAoc3RhcnRlZFN5bmMpCisJCXsKKwkJCWlmIChzdGFydGVkKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJzdGFydGVkIiApOworCQkJCisJCQlzdGFydGVkID0gdHJ1ZTsKKwkJCXJlc3RhcnQoKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgcmVzdGFydCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGZpcmVVcCB3aWxsIHNhdmUgdGhlIGhhbmRsZXIuCisJCXRyeQorCQl7CisJCQlzZWxlY3Rvci5uZXdBY2NlcHRIYW5kbGVyKAorCQkJCW5ldyBJbmV0U29ja2V0QWRkcmVzcyggaG9zdCwgcG9ydCApLCBiYWNrbG9nLCB0aGlzICk7CisJCX0KKwkJY2F0Y2ggKCBFcnJvciBlICkKKwkJeworCQkJLy8gVGhpcyBpcyBhIGhhY2sgd29yayBhcm91bmQgZm9yIGpka18xLjUuMF8xNSwgd2hpY2ggaGFzIG5vCisJCQkvLyB0cmFuc2xhdGlvbiBmb3IgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHR1cm5zIGl0IGludG8gYW4KKwkJCS8vIEVycm9yLgorCQkJCisJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisJCQlpZiAobXNnID09IG51bGwgfHwgIW1zZy5lcXVhbHMoICJVbnRyYW5zbGF0ZWQgZXhjZXB0aW9uIiApKQorCQkJCXRocm93IGU7CisJCQkKKwkJCVRocm93YWJsZSB4ID0gZS5nZXRDYXVzZSgpOworCQkJaWYgKHggPT0gbnVsbCB8fCAhKHggaW5zdGFuY2VvZiBTb2NrZXRFeGNlcHRpb24pKQorCQkJCXRocm93IGU7CisJCQkKKwkJCXRocm93IChTb2NrZXRFeGNlcHRpb24pIHg7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZDsKKwkKKwlwcml2YXRlIGZpbmFsIE9iamVjdCBzdGFydGVkU3luYyA9IG5ldyBPYmplY3QoKTsKKwkKKwlwcml2YXRlIE15QWNjZXB0SGFuZGxlciBoYW5kbGVyOworCQorCXByaXZhdGUgZmluYWwgT2JqZWN0IGhhbmRsZXJTeW5jID0gbmV3IE9iamVjdCgpOworCisJdm9pZCBzdG9wKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlzdGFydGVkID0gZmFsc2U7CisJCQorCQlNeUFjY2VwdEhhbmRsZXIgaCA9IHNldEhhbmRsZXIoIG51bGwgKTsKKwkJaWYgKGggIT0gbnVsbCkKKwkJeworCQkJaC5jYW5jZWwoKTsKKwkJfQorCX0KKworCXByaXZhdGUgTXlBY2NlcHRIYW5kbGVyIHNldEhhbmRsZXIoIE15QWNjZXB0SGFuZGxlciBuZXdIYW5kbGVyICkKKwl7CisJCXN5bmNocm9uaXplZCAoaGFuZGxlclN5bmMpCisJCXsKKwkJCWlmIChuZXdIYW5kbGVyID09IGhhbmRsZXIpCisJCQkJcmV0dXJuIG51bGw7CisJCQkKKwkJCWlmIChuZXdIYW5kbGVyICE9IG51bGwgJiYgaGFuZGxlciAhPSBudWxsKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisJCQkJCSJuZXdIYW5kbGVyICE9IG51bGwgJiYgaGFuZGxlciAhPSBudWxsICYmIG5ld0hhbmRsZXIgIT0gaGFuZGxlciIgKTsKKwkJCQorCQkJTXlBY2NlcHRIYW5kbGVyIG9sZEhhbmRsZXIgPSBoYW5kbGVyOworCQkJaGFuZGxlciA9IG5ld0hhbmRsZXI7CisJCQlyZXR1cm4gb2xkSGFuZGxlcjsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaXJlVXAoIE15QWNjZXB0SGFuZGxlciBoICkKKwl7CisJCXNldEhhbmRsZXIoIGggKTsKKwkJc3RhdHVzLnNldCggU2Vzc2lvbi5VUCApOworCQkKKwkJVG9kb01hbmFnZXIuYWRkVG9kbyggbmV3IFRvZG8oKQorCQl7CisJCQlwdWJsaWMgdm9pZCBkb2l0KCBUb2RvTWFuYWdlciBtICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCXNlc3Npb24uc2Vzc2lvbk5vdGlmeSggU2Vzc2lvbi5VUCApOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBleGNlcHRpb24oIFRvZG9NYW5hZ2VyIG0sIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9ICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpcmVEb3duKCkKKwl7CisJCXNldEhhbmRsZXIoIG51bGwgKTsKKwkJc3RhdHVzLnNldCggU2Vzc2lvbi5ET1dOICk7CisJCQorCQlUb2RvTWFuYWdlci5hZGRUb2RvKCBuZXcgVG9kbygpCisJCXsKKwkJCXB1YmxpYyB2b2lkIGRvaXQoIFRvZG9NYW5hZ2VyIG0gKSB0aHJvd3MgRXhjZXB0aW9uCisJCQl7CisJCQkJc2Vzc2lvbi5zZXNzaW9uTm90aWZ5KCBTZXNzaW9uLkRPV04gKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgZXhjZXB0aW9uKCBUb2RvTWFuYWdlciBtLCBFeGNlcHRpb24gZSApCisJCQl7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfSApOworCX0KKworCXZvaWQgd2FpdFVwKCBpbnQgbWF4RGVsYXkgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlzdGF0dXMud2FpdFVudGlsRXEoIFNlc3Npb24uVVAsIG1heERlbGF5ICk7CisJfQorCisJdm9pZCB3YWl0RG93biggaW50IG1heERlbGF5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJc3RhdHVzLndhaXRVbnRpbEVxKCBTZXNzaW9uLkRPV04sIG1heERlbGF5ICk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBNb25pdG9yPFN0cmluZz4gc3RhdHVzID0gbmV3IE1vbml0b3I8U3RyaW5nPiggInN0YXR1cyIsCisJCVNlc3Npb24uRE9XTiApOworCisJU29ja2V0QWRkcmVzcyBsb2NhbEFkZHJlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXJldHVybiBjaGVja1NvY2tldCgpLmdldExvY2FsU29ja2V0QWRkcmVzcygpOworCX0KKworCXByaXZhdGUgU2VydmVyU29ja2V0IGNoZWNrU29ja2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlTZXJ2ZXJTb2NrZXQgcyA9IGNoZWNrQ2hhbm5lbCgpLnNvY2tldCgpOworCQlpZiAocyA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCAibm8gc29ja2V0IiApOworCQlyZXR1cm4gczsKKwl9CisKKwlwcml2YXRlIFNlcnZlclNvY2tldENoYW5uZWwgY2hlY2tDaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlTZXJ2ZXJTb2NrZXRDaGFubmVsIGMgPSBjaGVja0hhbmRsZXIoKS5jaGFubmVsKCk7CisJCWlmIChjID09IG51bGwpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJjID09IG51bGwiICk7CisJCXJldHVybiBjOworCX0KKworCXByaXZhdGUgQWNjZXB0SGFuZGxlciBjaGVja0hhbmRsZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCUFjY2VwdEhhbmRsZXIgaCA9IGhhbmRsZXI7CisJCWlmIChoID09IG51bGwpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJoID09IG51bGwiICk7CisJCXJldHVybiBoOworCX0KKworCXB1YmxpYyBBY2NlcHRIYW5kbGVyIG5ld0FjY2VwdEhhbmRsZXIoIFNlcnZlclNvY2tldENoYW5uZWwgY2hhbm5lbCApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCXJldHVybiBuZXcgTXlBY2NlcHRIYW5kbGVyKCBjaGFubmVsLCBudWxsICk7CisJfQorCQorCS8qKiAqLworCXB1YmxpYyBjbGFzcyBNeUFjY2VwdEhhbmRsZXIgZXh0ZW5kcyBBY2NlcHRIYW5kbGVyCisJeworCQkvKioKKwkJICogQHBhcmFtIGNoYW5uZWwKKwkJICogQHBhcmFtIGZhY3RvcnkKKwkJICovCisJCXB1YmxpYyBNeUFjY2VwdEhhbmRsZXIoIFNlcnZlclNvY2tldENoYW5uZWwgY2hhbm5lbCwKKwkJCVN0cmVhbUhhbmRsZXJGYWN0b3J5IGZhY3RvcnkgKQorCQl7CisJCQlzdXBlciggY2hhbm5lbCwgZmFjdG9yeSApOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJlZCgpCisJCXsKKwkJCXN1cGVyLnJlZ2lzdGVyZWQoKTsKKwkJCWZpcmVVcCggdGhpcyApOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgYWNjZXB0ZWRDaGFubmVsKCBTb2NrZXRDaGFubmVsIHNjICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlzZXNzaW9uLnNlc3Npb25BY2NlcHRlZCggc2MgKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGNhbmNlbGVkKCBFeGNlcHRpb24gZSApCisJCXsKKwkJCXN1cGVyLmNhbmNlbGVkKCBlICk7CisJCQlmaXJlRG93bigpOworCQl9CisJfQorCisJYm9vbGVhbiBpc1N0YXJ0ZWQoKQorCXsKKwkJcmV0dXJuIHN0YXJ0ZWQ7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaG9zdCBpbnRlcmZhY2UgdG8gbGlzdGVuIG9uLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpCisJeworCQlyZXR1cm4gaG9zdDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBwb3J0IHRvIGxpc3RlbiBvbi4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFBvcnQoKQorCXsKKwkJcmV0dXJuIHBvcnQ7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgYmFja2xvZyAodGhlIG51bWJlciBvZiB1bmFjY2VwdGVkIGNvbm5lY3Rpb25zIHRvIGFsbG93KS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldEJhY2tsb2coKQorCXsKKwkJcmV0dXJuIGJhY2tsb2c7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL0NpcmN1bGFyU3RyaW5nQnVmLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS94bWwvQ2lyY3VsYXJTdHJpbmdCdWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDgzZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL0NpcmN1bGFyU3RyaW5nQnVmLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLkFzc2VydGlvbjsKKworLyoqCisgKiBBIFN0cmluZ0J1ZiBpbXBsZW1lbnRlZCBhcyBhIGNpcmN1bGFyIGZpeGVkLXNpemUgbGlzdCBvZiBjaGFyYWN0ZXJzLgorICovCitmaW5hbCBwdWJsaWMgY2xhc3MgQ2lyY3VsYXJTdHJpbmdCdWYgaW1wbGVtZW50cyBTdHJpbmdCdWYKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBDaXJjdWxhclN0cmluZ0J1Zi4KKwkgKiBAcGFyYW0gZGVzY3IgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIGJ1ZmZlcgorCSAqCisJICogQHBhcmFtIG1heExlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBrZWVwCisJICogaW4gdGhlIGJ1Zi4KKwkgKi8KKwlwdWJsaWMgQ2lyY3VsYXJTdHJpbmdCdWYoIFN0cmluZyBkZXNjciwgaW50IG1heExlbiApCisJeworCQl0aGlzLmRlc2NyID0gZGVzY3I7CisJCXRoaXMubWF4TGVuID0gbWF4TGVuOworCQljaGFycyA9IG5ldyBjaGFyW21heExlbl07CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyOworCQorCXByaXZhdGUgZmluYWwgaW50IG1heExlbjsKKwkKKwlwcml2YXRlIGZpbmFsIGNoYXJbXSBjaGFyczsKKwkKKwlwcml2YXRlIGludCBpbmRleDsKKwkKKwlwcml2YXRlIGludCBsZW5ndGg7CisKKwlwdWJsaWMgdm9pZCBhcHBlbmQoIGNoYXIgYyApCisJeworCQlmaXh1cEluZGV4KCk7CisJCQorCQljaGFyc1tpbmRleCsrXSA9IGM7CisJCQorCQlpZiAobGVuZ3RoIDwgbWF4TGVuKQorCQkJbGVuZ3RoKys7CisJfQorCQorCXByaXZhdGUgdm9pZCBmaXh1cEluZGV4KCkKKwl7CisJCXdoaWxlIChpbmRleCA+PSBtYXhMZW4pCisJCQlpbmRleCAtPSBtYXhMZW47CisJfQorCisJcHVibGljIHZvaWQgYXBwZW5kKCBTdHJpbmcgcyApCisJeworCQkvLyBpZiB0aGUgbGVuZ3RoIG9mIHMgaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gbWF4TGVuLAorCQkvLyB0aGVuIHdlIG9ubHkgbmVlZCBjb25zaWRlciB0aGUgbGFzdCBtYXhMZW4gY2hhcmFjdGVycworCQkvLyBhbmQgcHV0IHRoZW0gZGlyZWN0bHkgaW50byB0aGUgYnVmZmVyLiBvdGhlcndpc2UsIHdlCisJCS8vIG11c3QgZGVwb3NpdCB0aGUgY2hhcmFjdGVycyBpbiB0d28gc2VnbWVudHM6CisJCS8vIFtpbmRleC4ubWF4TGVuKSBhbmQgWzAuLmluZGV4KS4KKwkJCisJCWludCBuID0gcy5sZW5ndGgoKTsKKwkJaWYgKG4gPT0gMCkKKwkJCXJldHVybjsKKworCQkvLyBvZmZzZXQgaW4gcyAoaWYgbmVnYXRpdmUsIHRoZW4gbiA8IG1heExlbikKKwkJaW50IGkgPSBuIC0gbWF4TGVuOworCQlpZiAoaSA8IDApCisJCQlpID0gMDsKKwkJCisJCS8vIGhvdyBtYW55IGNoYXJhY3RlcnMgZnJvbSBzIHdlIGFjdHVhbGx5IHdhbnQuCisJCW4gPSBuIC0gaTsKKwkJCisJCUFzc2VydGlvbi5jaGVjayggaSA+PSAwICYmIGkgPCBzLmxlbmd0aCgpLCAiaSA+PSAwICYmIGkgPCBzLmxlbmd0aCgpIiApOworCQlBc3NlcnRpb24uY2hlY2soIG4gPiAwICYmIG4gPD0gbWF4TGVuLCAibiA+IDAgJiYgbiA8PSBtYXhMZW4iICk7CisJCUFzc2VydGlvbi5jaGVjayggaStuID09IHMubGVuZ3RoKCksICJpK24gPT0gcy5sZW5ndGgoKSIgKTsKKwkJCisJCS8vIGhlcmUgaXMgYW4gb3B0aW1pemF0aW9uOiBpZiB3ZSdyZSBnZXR0aW5nIG1heExlbiBjaGFycworCQkvLyBmcm9tIHMsIGp1c3QgZ2V0IHRoZSBjaGFycyBkaXJlY3RseSBpbnRvIHRoZSBidWZmZXIgaW4KKwkJLy8gb25lIHRyeSBhbmQgcmVzZXQgaW5kZXggYW5kIGxlbmd0aC4KKwkJCisJCWlmIChuID09IG1heExlbikKKwkJeworCQkJcy5nZXRDaGFycyggaSwgaStuLCBjaGFycywgMCApOworCQkJaW5kZXggPSBuOworCQkJbGVuZ3RoID0gbjsKKwkJCXJldHVybjsKKwkJfQorCisJCUFzc2VydGlvbi5jaGVjayggbiA8IG1heExlbiwgIm4gPCBtYXhMZW4iICk7CisKKwkJZml4dXBJbmRleCgpOworCQkKKwkJaW50IHNlZzFsZW4gPSBtYXhMZW4gLSBpbmRleDsKKwkJaWYgKHNlZzFsZW4gPiBuKQorCQkJc2VnMWxlbiA9IG47CisJCW4gLT0gc2VnMWxlbjsKKwkJCisJCWludCBzZWcybGVuID0gaW5kZXg7CisJCWlmIChzZWcybGVuID4gbikKKwkJCXNlZzJsZW4gPSBuOworCQluIC09IHNlZzJsZW47CisJCQorCQlBc3NlcnRpb24uY2hlY2soIG4gPT0gMCwgIm4gPT0gMCIgKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBzZWcxbGVuID4gMCwgInNlZzFsZW4gPiAwIiApOworCQlBc3NlcnRpb24uY2hlY2soIHNlZzJsZW4gPj0gMCwgInNlZzJsZW4gPj0gMCIgKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBzZWcxbGVuICsgc2VnMmxlbiA8IG1heExlbiwgIihzZWcxbGVuICsgc2VnMmxlbikgPCBtYXhMZW4iICk7CisJCQorCQkvLyBoYW5kbGUgc2VnbWVudCAxOgorCQkKKwkJcy5nZXRDaGFycyggaSwgaStzZWcxbGVuLCBjaGFycywgaW5kZXggKTsKKwkJaSArPSBzZWcxbGVuOworCQlpbmRleCArPSBzZWcxbGVuOworCQlsZW5ndGggKz0gc2VnMWxlbjsKKwkJCisJCS8vIGhhbmRsZSBzZWdtZW50IDI6CisJCQorCQlpZiAoc2VnMmxlbiA+IDApCisJCXsKKwkJCXMuZ2V0Q2hhcnMoIGksIGkrc2VnMmxlbiwgY2hhcnMsIDAgKTsKKwkJCWluZGV4ID0gc2VnMmxlbjsKKwkJCWxlbmd0aCArPSBzZWcybGVuOworCQl9CisJCQorCQlpZiAobGVuZ3RoID4gbWF4TGVuKQorCQkJbGVuZ3RoID0gbWF4TGVuOworCX0KKworCXB1YmxpYyBpbnQgbGVuZ3RoKCkKKwl7CisJCXJldHVybiBsZW5ndGg7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlmaXh1cEluZGV4KCk7CisJCQorCQlpZiAoaW5kZXggPT0gbGVuZ3RoKQorCQl7CisJCQkvLyBjaGFycyBhcmUgaW4gb25lIHNlZ21lbnQ6IFswLi5pbmRleCkKKwkJCXJldHVybiBuZXcgU3RyaW5nKCBjaGFycywgMCwgaW5kZXggKTsKKwkJfQorCQkKKwkJLy8gY2hhcnMgYXJlIGluIHR3byBzZWdtZW50czogW2luZGV4Li5tYXhMZW4pIGFuZCBbMC4uaW5kZXgpCisJCQorCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCBtYXhMZW4gKTsKKwkJc2IuYXBwZW5kKCBjaGFycywgaW5kZXgsIG1heExlbiAtIGluZGV4ICk7CisJCXNiLmFwcGVuZCggY2hhcnMsIDAsIGluZGV4ICk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjbGVhcigpCisJeworCQlpbmRleCA9IDA7CisJCWxlbmd0aCA9IDA7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcigpCisJeworCQlyZXR1cm4gZGVzY3I7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL1BhcnNlRXhjZXB0aW9uLmphdmEgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS94bWwvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGIyNzliCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sLlhtbFBhcnNlci5UYWdFbGVtZW50OworCisKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBTeW50YXhFeGNlcHRpb24KKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY0OTE1MjQ3NDY0ODgwOTY5NUw7CisKKwkvKioKKwkgKiBAcGFyYW0gbXNnCisJICovCisJcHVibGljIFBhcnNlRXhjZXB0aW9uKCBTdHJpbmcgbXNnICkKKwl7CisJCXN1cGVyKCBtc2cgKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG1zZworCSAqIEBwYXJhbSBjYXVzZQorCSAqLworCXB1YmxpYyBQYXJzZUV4Y2VwdGlvbiggU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlICkKKwl7CisJCXN1cGVyKCBtc2cgKTsKKwkJaW5pdENhdXNlKCBjYXVzZSApOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbnRleHQgb2YgdGhlIGVycm9yCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250ZXh0KCkKKwl7CisJCXJldHVybiBjb250ZXh0OworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbnRleHQoIFN0cmluZyBjb250ZXh0ICkKKwl7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiIGluICciK2NvbnRleHQrIicgYXQgIit0YWdFbGVtZW50U3RhY2s7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGNvbnRleHQ7CisKKwkvKioKKwkgKiBAcGFyYW0gdGFnRWxlbWVudFN0YWNrCisJICovCisJcHVibGljIHZvaWQgc2V0VGFnRWxlbWVudFN0YWNrKCBMaXN0PFRhZ0VsZW1lbnQ+IHRhZ0VsZW1lbnRTdGFjayApCisJeworCQl0aGlzLnRhZ0VsZW1lbnRTdGFjayA9IHRhZ0VsZW1lbnRTdGFjazsKKwl9CisJCisJcHJpdmF0ZSBMaXN0PFRhZ0VsZW1lbnQ+IHRhZ0VsZW1lbnRTdGFjazsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC9QbGFpblN0cmluZ0J1Zi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL1BsYWluU3RyaW5nQnVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0NjI1YQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC9QbGFpblN0cmluZ0J1Zi5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBQbGFpblN0cmluZ0J1Zi4KKyAqLworcHVibGljIGNsYXNzIFBsYWluU3RyaW5nQnVmIGltcGxlbWVudHMgU3RyaW5nQnVmCit7CisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgUGxhaW5TdHJpbmdCdWYuCisJICoKKwkgKiBAcGFyYW0gZGVzY3IKKwkgKiBAcGFyYW0gbWF4TGVuCisJICovCisJcHVibGljIFBsYWluU3RyaW5nQnVmKCBTdHJpbmcgZGVzY3IsIGludCBtYXhMZW4gKQorCXsKKwkJdGhpcy5kZXNjciA9IGRlc2NyOworCQl0aGlzLm1heExlbiA9IG1heExlbjsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3I7CisJCisJcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGVuOworCisJLyoqCisJICogQHJldHVybiB0aGUgZGVzY3Igb2YgdGhpcyBzdHJpbmcgYnVmLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3IoKQorCXsKKwkJcmV0dXJuIGRlc2NyOworCX0KKworCXB1YmxpYyB2b2lkIGFwcGVuZCggY2hhciBjICkKKwl7CisJCWlmIChzYi5sZW5ndGgoKSA+PSBtYXhMZW4pCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisJCQkJIm1heGltdW0gbGVuZ3RoIG9mICIrZGVzY3IrIiBleGNlZWRlZDogIittYXhMZW4gKTsKKworCQlzYi5hcHBlbmQoIGMgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhcHBlbmQoIFN0cmluZyBzICkKKwl7CisJCS8vIHRoaXMgbXVzdCBwcm9jZXNzIGEgY2hhcmFjdGVyIGF0IGEgdGltZSBzbyB0aGF0IHN1YmNsYXNzZXJzCisJCS8vIHdpbGwgd29yayBwcm9wZXJseS4KKwkJaW50IG4gPSBzLmxlbmd0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCWFwcGVuZCggcy5jaGFyQXQoIGkgKSAgKTsKKwl9CisKKwlwdWJsaWMgaW50IGxlbmd0aCgpCisJeworCQlyZXR1cm4gc2IubGVuZ3RoKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisJCisJcHVibGljIHZvaWQgY2xlYXIoKQorCXsKKwkJc2Iuc2V0TGVuZ3RoKCAwICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL1N0cmluZ0J1Zi5qYXZhIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL1N0cmluZ0J1Zi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjY0NDIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS94bWwvU3RyaW5nQnVmLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sOworCisvKioKKyAqIEEgc2ltcGxlIGludGVyZmFjZSB0byBhIHN0cmluZyBidWZmZXIuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RyaW5nQnVmCit7CisJLyoqCisJICogQXBwZW5kIGEgY2hhcmFjdGVyIHRvIHRoZSBzdHJpbmcgYnVmZmVyLgorCSAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorCSAqLworCXB1YmxpYyB2b2lkIGFwcGVuZCggY2hhciBjICk7CisJCisJLyoqCisJICogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBzdHJpbmcgYnVmZmVyLgorCSAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgb2YgY2hhcnMgdG8gYXBwZW5kLgorCSAqLworCXB1YmxpYyB2b2lkIGFwcGVuZCggU3RyaW5nIHMgKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYnVmZmVyLgorCSAqLworCXB1YmxpYyBpbnQgbGVuZ3RoKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNvbnRlbnRzIGFzIGEgc3RyaW5nLgorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKKworCS8qKgorCSAqIFJlc2V0IHRoZSBzdHJpbmcgYnVmZmVyIHRvIGhhdmluZyBubyBjb250ZW50LgorCSAqLworCXB1YmxpYyB2b2lkIGNsZWFyKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN0cmluZyBidWZmZXIuCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcigpOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL1N0cmluZ0J1ZldpdGhFc2NhcGUuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC9TdHJpbmdCdWZXaXRoRXNjYXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZDhlYgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC9TdHJpbmdCdWZXaXRoRXNjYXBlLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgU3RyaW5nQnVmV2l0aEVzY2FwZS4KKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0J1ZldpdGhFc2NhcGUgZXh0ZW5kcyBQbGFpblN0cmluZ0J1ZgoreworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIFN0cmluZ0J1ZldpdGhFc2NhcGUuCisJICoKKwkgKiBAcGFyYW0gZGVzY3IKKwkgKiBAcGFyYW0gbWF4TGVuCisJICogQHBhcmFtIG1heEVzY2FwZUxlbgorCSAqIEBwYXJhbSBlc2NhcGVzCisJICovCisJcHVibGljIFN0cmluZ0J1ZldpdGhFc2NhcGUoIFN0cmluZyBkZXNjciwgaW50IG1heExlbiwKKwkJaW50IG1heEVzY2FwZUxlbiwgTWFwPFN0cmluZyxDaGFyYWN0ZXI+IGVzY2FwZXMgKQorCXsKKwkJc3VwZXIoIGRlc2NyLCBtYXhMZW4gKTsKKwkJdGhpcy5tYXhFc2NhcGVMZW4gPSBtYXhFc2NhcGVMZW47CisJCXRoaXMuZXNjYXBlcyA9IGVzY2FwZXM7CisJfQorCQorCXByaXZhdGUgZmluYWwgaW50IG1heEVzY2FwZUxlbjsKKwkKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsQ2hhcmFjdGVyPiBlc2NhcGVzOworCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFwcGVuZCggY2hhciBjICkKKwl7CisJCWlmIChjID09ICcmJykKKwkJeworCQkJaWYgKGVzY2FwZUJ1ZmZlciAhPSBudWxsKQorCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggImJhZCBjaGFyICciK2MrIicgaW4gZXNjYXBlIiApOworCQkJZXNjYXBlQnVmZmVyID0gbmV3IFBsYWluU3RyaW5nQnVmKCAiZXNjYXBlIiwgbWF4RXNjYXBlTGVuICk7CisJCX0KKwkJZWxzZSBpZiAoZXNjYXBlQnVmZmVyICE9IG51bGwpCisJCXsKKwkJCWlmIChjID09ICc7JykKKwkJCXsKKwkJCQlTdHJpbmcgcyA9IGVzY2FwZUJ1ZmZlci50b1N0cmluZygpOworCQkJCWVzY2FwZUJ1ZmZlciA9IG51bGw7CisJCQkJc3VwZXIuYXBwZW5kKCBwYXJzZUVzY2FwZSggcyApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZXNjYXBlQnVmZmVyLmFwcGVuZCggYyApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc3VwZXIuYXBwZW5kKCBjICk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBjaGFyIHBhcnNlRXNjYXBlKCBTdHJpbmcgcyApCisJeworCQlpZiAocy5sZW5ndGgoKSA9PSAwKQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiZW1wdHkgZXNjYXBlIiApOworCQkKKwkJaWYgKHMuc3RhcnRzV2l0aCggIiMiICkpCisJCXsKKwkJCXRyeQorCQkJeworCQkJCWludCBrID0gSW50ZWdlci5wYXJzZUludCggcy5zdWJzdHJpbmcoIDEgKSApOworCQkJCQorCQkJCWlmIChrIDwgMCB8fCBrID4gNjU1MzUpCisJCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm51bWVyaWMgZXNjYXBlIG91dCBvZiByYW5nZSAnIitzKyInIiApOworCQkJCQorCQkJCXJldHVybiAoY2hhcikgazsKKwkJCX0KKwkJCWNhdGNoICggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQorCQkJeworCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggImJhZCBudW1lcmljIGVzY2FwZSAnIitzKyInIiApOworCQkJfQorCQl9CisJCQorCQlDaGFyYWN0ZXIgYyA9IGVzY2FwZXMuZ2V0KCBzICk7CisJCWlmIChjICE9IG51bGwpCisJCQlyZXR1cm4gYy5jaGFyVmFsdWUoKTsKKwkJCisJCWMgPSBlc2NhcGVzLmdldCggcy50b0xvd2VyQ2FzZSgpICk7CisJCWlmIChjICE9IG51bGwpCisJCQlyZXR1cm4gYy5jaGFyVmFsdWUoKTsKKwkJCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gZW50aXR5IGVzY2FwZSAnIitzKyInIiApOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGxlbmd0aCgpCisJeworCQlpbnQgbiA9IHN1cGVyLmxlbmd0aCgpOworCQkKKwkJaWYgKGVzY2FwZUJ1ZmZlciAhPSBudWxsKQorCQkJcmV0dXJuIG4rMTsKKwkJCisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVzY2FwZUJ1ZmZlciAhPSBudWxsKQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5maW5pc2hlZCBlc2NhcGUiICk7CisJCQorCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIFBsYWluU3RyaW5nQnVmIGVzY2FwZUJ1ZmZlcjsKK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC9YbWxQYXJzZXIuamF2YSBiL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC9YbWxQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZkNjEzCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL1htbFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjE4MSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Bc3NlcnRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5TaW5nbGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5TdHJpbmdVdGlsOworCisKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBYbWxQYXJzZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxQYXJzZXIKK3sKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSB4bWwgcGFyc2VyLgorCSAqLworCXB1YmxpYyBYbWxQYXJzZXIoKQorCXsKKwkJLy8gbm90aGluZyB0byBkbyB5ZXQuCisJfQorCQorCS8qKgorCSAqIExpbmUgc2VwYXJhdG9yIGZvciBYTUwgZmlsZXMuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1JMRiA9ICJcclxuIjsKKwkKKwkvKioKKwkgKiBAcGFyYW0gZmlsZQorCSAqIEBwYXJhbSBxdWFsaWZpZXIKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHRvcCB0YWcgZWxlbWVudAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGZpbGUKKwkgKiBvciBpZiB0aGUgdG9wIHRhZyBlbGVtZW50IGlzbid0IGFzIHNwZWNpZmllZAorCSAqLworCXB1YmxpYyBUYWdFbGVtZW50IHBhcnNlT25lKCBGaWxlIGZpbGUsIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICkKKwkJdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlSZWFkZXIgcmRyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlciggZmlsZSApICk7CisJCXRyeQorCQl7CisJCQlyZXR1cm4gcGFyc2VPbmUoIHJkciwgcXVhbGlmaWVyLCBuYW1lICk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQlyZHIuY2xvc2UoKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gaXMKKwkgKiBAcGFyYW0gcXVhbGlmaWVyCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB0YWcgZWxlbWVudCBmb3VuZCBieSBwYXJzaW5nIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtCisJICogdG8gdGhlIHZlcnkgZW5kLgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIFRhZ0VsZW1lbnQgcGFyc2VPbmUoIElucHV0U3RyZWFtIGlzLCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKwl7CisJCXJldHVybiBwYXJzZU9uZSggbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpcyApLCBxdWFsaWZpZXIsIG5hbWUgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcmRyCisJICogQHBhcmFtIHF1YWxpZmllcgorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdGFnIGVsZW1lbnQgZm91bmQgYnkgcGFyc2luZyB0aGUgc3BlY2lmaWVkIHJlYWRlcgorCSAqIHRvIHRoZSB2ZXJ5IGVuZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBUYWdFbGVtZW50IHBhcnNlT25lKCBSZWFkZXIgcmRyLCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKwl7CisJCXdoaWxlIChwYXJzZSggcmRyLnJlYWQoKSApKQorCQl7CisJCQkvLyBub3RoaW5nIHRvIGRvLgorCQl9CisJCQorCQlUYWdFbGVtZW50IHRlID0gZmluaXNoKCk7CisJCQorCQlpZiAobmFtZSAhPSBudWxsICYmIHRlICE9IG51bGwgJiYgIXRlLm1hdGNoZXMoIHF1YWxpZmllciwgbmFtZSApKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorCQkJCSJ0b3AgdGFnICIrdGUuZ2V0UU5hbWUoKSsiIGRvZXMgbm90IG1hdGNoICIrCisJCQkJCW5ldyBRTmFtZSggcXVhbGlmaWVyLCBuYW1lICkgKTsKKwkJCisJCXJldHVybiB0ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHMKKwkgKiBAcmV0dXJuIGZhbHNlIGlmIHBhcnNpbmcgaXMgZmluaXNoZWQsIHRydWUgb3RoZXJ3aXNlLgorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgVGFnRWxlbWVudCBwYXJzZU9uZSggU3RyaW5nIHMgKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCWNsZWFyKCk7CisJCQorCQlpZiAocGFyc2UoIHMgKSkKKwkJCXJldHVybiBmaW5pc2goKTsKKwkJCisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBAcGFyYW0gcworCSAqIEByZXR1cm4gZmFsc2UgaWYgcGFyc2luZyBpcyBmaW5pc2hlZCwgdHJ1ZSBvdGhlcndpc2UuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBib29sZWFuIHBhcnNlKCBTdHJpbmcgcyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaW50IG4gPSBzLmxlbmd0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCWlmICghcGFyc2UoIHMuY2hhckF0KCBpICkgKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIFRhZ0VsZW1lbnQgaWYgdGhlIHBhcnNlIHdvcmtlZC4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIFRhZ0VsZW1lbnQgZmluaXNoKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlpZiAocGFyc2UoIC0xICkpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCXJldHVybiByb290VGFnRWxlbWVudDsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGMgdGhlIG5leHQgY2hhcmFjdGVyIHRvIHBhcnNlLCBvciAtMSB0byBpbmRpY2F0ZQorCSAqIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMuCisJICogQHJldHVybiBmYWxzZSBpZiBwYXJzaW5nIGlzIGZpbmlzaGVkLCB0cnVlIG90aGVyd2lzZS4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gcGFyc2UoIGludCBjICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQl0cnkKKwkJeworCQkJaWYgKGMgPj0gMCkKKwkJCQljb250ZXh0LmFwcGVuZCggKGNoYXIpIGMgKTsKKwkJCXJldHVybiBwYXJzZTAoIGMgKTsKKwkJfQorCQljYXRjaCAoIFBhcnNlRXhjZXB0aW9uIGUgKQorCQl7CisJCQllLnNldENvbnRleHQoIGNvbnRleHQudG9TdHJpbmcoKSApOworCQkJZS5zZXRUYWdFbGVtZW50U3RhY2soIGdldFRhZ0VsZW1lbnRzKCkgKTsKKwkJCXRocm93IGU7CisJCX0KKwkJY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIGUgKQorCQl7CisJCQlQYXJzZUV4Y2VwdGlvbiBwZSA9IG5ldyBQYXJzZUV4Y2VwdGlvbiggImNhdWdodCBleGNlcHRpb24iLCBlICk7CisJCQlwZS5zZXRDb250ZXh0KCBjb250ZXh0LnRvU3RyaW5nKCkgKTsKKwkJCXBlLnNldFRhZ0VsZW1lbnRTdGFjayggZ2V0VGFnRWxlbWVudHMoKSApOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFN0cmluZ0J1ZiBjb250ZXh0ID0gbmV3IENpcmN1bGFyU3RyaW5nQnVmKCBudWxsLCAxMDAgKTsKKwkKKwlwcml2YXRlIGJvb2xlYW4gcGFyc2UwKCBpbnQgYyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBOU1RBVEVTKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggInRoZSBwYXJzZXIgaXMgaW4gYW4gaWxsZWdhbCBzdGF0ZTogIitzdGF0ZSApOworCQkKKwkJaW50IGNjID0gZ2V0Q2hhckNsYXNzKCBjICk7CisJCWludCBzdGF0ZUFjdGlvbiA9IHRyYW5zaXRpb25zW3N0YXRlXVtjY107CisJCWludCBuZXdTdGF0ZSA9IHN0YXRlQWN0aW9uICYgU1RBVEVfTUFTSzsKKwkJaW50IGFjdGlvbiA9IHN0YXRlQWN0aW9uID4+PiBBQ1RJT05fU0hJRlQgJiBBQ1RJT05fTUFTSzsKKwkJc3dpdGNoIChhY3Rpb24pCisJCXsKKwkJCWNhc2UgQV9FUlJPUjoKKwkJCXsKKwkJCQlpbnQgcyA9IHN0YXRlOworCQkJCXN0YXRlID0gLTE7CisJCQkJCisJCQkJaWYgKGMgPT0gLTEpCisJCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggInVuZXhwZWN0ZWQgRU9GIHdoaWxlICIrCisJCQkJCQlkZXNjcmliZVN0YXRlKCBzICkrCisJCQkJCQkiOiBleHBlY3RlZCBvbmUgb2YgIitleHBlY3RlZENoYXJzKCBzICkgKTsKKwkJCQkKKwkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oICJ1bmV4cGVjdGVkIGNoYXJhY3RlciAiKworCQkJCQlkZXNjcmliZUNoYXIoIGMgKSsiIHdoaWxlICIrZGVzY3JpYmVTdGF0ZSggcyApKworCQkJCQkiOiBleHBlY3RlZCBvbmUgb2YgIitleHBlY3RlZENoYXJzKCBzICkgKTsKKwkJCX0KKwkJCQorCQkJY2FzZSBBX0lHTk9SRToKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBBX1NUT1A6CisJCQkJZmluaXNoQ2RhdGEoKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJCWNhc2UgQV9BRERfQ0hBUl9UT19DREFUQToKKwkJCQlhZGRUb0NkYXRhKCBjICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgQV9BRERfTFRfQ0hBUl9UT19DREFUQToKKwkJCQlhZGRUb0NkYXRhKCAnPCcgKTsKKwkJCQlhZGRUb0NkYXRhKCBjICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgQV9BRERfTFRfU0xBU0hfQ0hBUl9UT19DREFUQToKKwkJCQlhZGRUb0NkYXRhKCAnPCcgKTsKKwkJCQlhZGRUb0NkYXRhKCAnLycgKTsKKwkJCQlhZGRUb0NkYXRhKCBjICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgQV9BRERfTFRfQkFOR19DSEFSX1RPX0NEQVRBOgorCQkJCWFkZFRvQ2RhdGEoICc8JyApOworCQkJCWFkZFRvQ2RhdGEoICchJyApOworCQkJCWFkZFRvQ2RhdGEoIGMgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBBX0FERF9MVF9RVUVTVElPTl9DSEFSX1RPX0NEQVRBOgorCQkJCWFkZFRvQ2RhdGEoICc8JyApOworCQkJCWFkZFRvQ2RhdGEoICc/JyApOworCQkJCWFkZFRvQ2RhdGEoIGMgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBBX0FERF9DSEFSX1RPX1RBR19OQU1FOgorCQkJCWZpbmlzaENkYXRhKCk7CisJCQkJYWRkVG9UYWdOYW1lKCAoY2hhcikgYyApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIEFfU0VUX1RBR19OQU1FX1FVQUxJRklFUjoKKwkJCQlzZXRUYWdOYW1lUXVhbGlmaWVyKCk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgQV9TVEFSVF9UQUc6CisJCQkJc3RhcnRUYWcoKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBBX0VNUFRZX1RBRzoKKwkJCQllbXB0eVRhZygpOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIEFfRU5EX1RBRzoKKwkJCQllbmRUYWcoKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBBX0FERF9DSEFSX1RPX0FUVFJfTkFNRToKKwkJCQlhZGRUb0F0dHJOYW1lKCAoY2hhcikgYyApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIEFfU0VUX0FUVFJfTkFNRV9RVUFMSUZJRVI6CisJCQkJc2V0QXR0ck5hbWVRdWFsaWZpZXIoKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBBX0FERF9UT19BVFRSX1ZBTFVFOgorCQkJCWFkZFRvQXR0clZhbHVlKCAoY2hhcikgYyApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIEFfRklOSVNIX0FUVFI6CisJCQkJZmluaXNoQXR0cigpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gYWN0aW9uICIrYWN0aW9uICk7CisJCX0KKwkJc3RhdGUgPSBuZXdTdGF0ZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBpbnQgc3RhdGUgPSAwOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBQ1RJT04gTUVUSE9EUyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NEQVRBX0xFTiA9IDEwMjQqMTAyNDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVEFHX05BTUVfTEVOID0gMjU1OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9BVFRSX05BTUVfTEVOID0gMjU1OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9BVFRSX1ZBTFVFX0xFTiA9IDEwKjEwMjQ7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0VTQ0FQRV9MRU4gPSAzMTsKKwkKKwlwcml2YXRlIHZvaWQgYWRkVG9DZGF0YSggaW50IGMgKQorCXsKKwkJaWYgKGMgPj0gMCkKKwkJCWNkYXRhQnVmLmFwcGVuZCggKGNoYXIpIGMgKTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIFBsYWluU3RyaW5nQnVmIGNkYXRhQnVmID0KKwkJbmV3IFN0cmluZ0J1ZldpdGhFc2NhcGUoICJjZGF0YSIsIE1BWF9DREFUQV9MRU4sCisJCQlNQVhfRVNDQVBFX0xFTiwgZXNjYXBlcyApOworCQorCXByaXZhdGUgdm9pZCBmaW5pc2hDZGF0YSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGNkYXRhID0gZmluaXNoU3RyaW5nQnVmKCBjZGF0YUJ1ZiwgdHJ1ZSApOworCQlpZiAoY2RhdGEubGVuZ3RoKCkgPiAwKQorCQkJZGVsaXZlckNkYXRhKCBjZGF0YSApOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRUb1RhZ05hbWUoIGNoYXIgYyApCisJeworCQl0YWdOYW1lQnVmLmFwcGVuZCggYyApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZiB0YWdOYW1lQnVmID0KKwkJbmV3IFBsYWluU3RyaW5nQnVmKCAidGFnIG5hbWUiLCBNQVhfVEFHX05BTUVfTEVOICk7CisKKwlwcml2YXRlIHZvaWQgc2V0VGFnTmFtZVF1YWxpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJdGFnTmFtZVF1YWxpZmllciA9IGZpbmlzaFN0cmluZ0J1ZiggdGFnTmFtZUJ1ZiwgZmFsc2UgKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZVF1YWxpZmllcjsKKworCXByaXZhdGUgdm9pZCBlbXB0eVRhZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIHRhZ05hbWUgPSBmaW5pc2hTdHJpbmdCdWYoIHRhZ05hbWVCdWYsIGZhbHNlICk7CisJCWRlbGl2ZXJTdGFydFRhZyggdGFnTmFtZVF1YWxpZmllciwgdGFnTmFtZSwgdHJ1ZSApOworCQl0YWdOYW1lUXVhbGlmaWVyID0gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgc3RhcnRUYWcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCVN0cmluZyB0YWdOYW1lID0gZmluaXNoU3RyaW5nQnVmKCB0YWdOYW1lQnVmLCBmYWxzZSApOworCQlkZWxpdmVyU3RhcnRUYWcoIHRhZ05hbWVRdWFsaWZpZXIsIHRhZ05hbWUsIGZhbHNlICk7CisJCXRhZ05hbWVRdWFsaWZpZXIgPSBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCBlbmRUYWcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCVN0cmluZyB0YWdOYW1lID0gZmluaXNoU3RyaW5nQnVmKCB0YWdOYW1lQnVmLCBmYWxzZSApOworCQlkZWxpdmVyRW5kVGFnKCB0YWdOYW1lUXVhbGlmaWVyLCB0YWdOYW1lICk7CisJCXRhZ05hbWVRdWFsaWZpZXIgPSBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRUb0F0dHJOYW1lKCBjaGFyIGMgKQorCXsKKwkJYXR0ck5hbWVCdWYuYXBwZW5kKCBjICk7CisJfQorCQorCXByaXZhdGUgZmluYWwgUGxhaW5TdHJpbmdCdWYgYXR0ck5hbWVCdWYgPQorCQluZXcgUGxhaW5TdHJpbmdCdWYoICJhdHRyIG5hbWUiLCBNQVhfQVRUUl9OQU1FX0xFTiApOworCisJcHJpdmF0ZSB2b2lkIHNldEF0dHJOYW1lUXVhbGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlhdHRyTmFtZVF1YWxpZmllciA9IGZpbmlzaFN0cmluZ0J1ZiggYXR0ck5hbWVCdWYsIGZhbHNlICk7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGF0dHJOYW1lUXVhbGlmaWVyOworCisJcHJpdmF0ZSB2b2lkIGFkZFRvQXR0clZhbHVlKCBjaGFyIGMgKQorCXsKKwkJYXR0clZhbHVlQnVmLmFwcGVuZCggYyApOworCX0KKwkKKwlwcml2YXRlIGZpbmFsIFBsYWluU3RyaW5nQnVmIGF0dHJWYWx1ZUJ1ZiA9CisJCW5ldyBTdHJpbmdCdWZXaXRoRXNjYXBlKCAiYXR0ciB2YWx1ZSIsIE1BWF9BVFRSX1ZBTFVFX0xFTiwKKwkJCU1BWF9FU0NBUEVfTEVOLCBlc2NhcGVzICk7CisKKwlwcml2YXRlIHZvaWQgZmluaXNoQXR0cigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGF0dHJOYW1lID0gZmluaXNoU3RyaW5nQnVmKCBhdHRyTmFtZUJ1ZiwgZmFsc2UgKTsKKwkJU3RyaW5nIGF0dHJWYWx1ZSA9IGZpbmlzaFN0cmluZ0J1ZiggYXR0clZhbHVlQnVmLCB0cnVlICk7CisJCWRlbGl2ZXJBdHRyKCBhdHRyTmFtZVF1YWxpZmllciwgYXR0ck5hbWUsIGF0dHJWYWx1ZSApOworCQlhdHRyTmFtZVF1YWxpZmllciA9IG51bGw7CisJfQorCQorCS8qKgorCSAqIENsZWFycyB0aGUgc3RhdGUgb2YgdGhlIHhtbCBwYXJzZXIuCisJICovCisJcHVibGljIHZvaWQgY2xlYXIoKQorCXsKKwkJYXR0ck5hbWVCdWYuY2xlYXIoKTsKKwkJYXR0ck5hbWVRdWFsaWZpZXIgPSBudWxsOworCQlhdHRyVmFsdWVCdWYuY2xlYXIoKTsKKwkJY2RhdGFCdWYuY2xlYXIoKTsKKwkJY29udGV4dC5jbGVhcigpOworCQlzdGF0ZSA9IDA7CisJCXRhZ0F0dHJzID0gbnVsbDsKKwkJY2xlYXJUYWdFbGVtZW50cygpOworCQl0YWdOYW1lQnVmLmNsZWFyKCk7CisJCXRhZ05hbWVRdWFsaWZpZXIgPSBudWxsOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUxJVkVSWSBNRVRIT0RTIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogRGVsaXZlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiB0YWdzIGlmIGFueS4KKwkgKiAKKwkgKiBAcGFyYW0gY2RhdGEgKGVzY2FwZSBzZXF1ZW5jZXMgaGF2ZSBiZWVuIGV4cGFuZGVkKS4KKwkgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVsaXZlckNkYXRhKCBTdHJpbmcgY2RhdGEgKQorCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwl7CisJCVRhZ0VsZW1lbnQgdG9wID0gcGVla1RhZ0VsZW1lbnQoKTsKKwkJCisJCWlmICh0b3AgIT0gbnVsbCkKKwkJCXRvcC5hZGRDZGF0YSggY2RhdGEgKTsKKwkJZWxzZQorCQkJYWRkUm9vdENkYXRhKCBjZGF0YSApOworCX0KKworCS8qKgorCSAqIERlbGl2ZXJzIGFuIG9wZW4gdGFnLgorCSAqIAorCSAqIEBwYXJhbSBxdWFsaWZpZXIgYW55IHF1YWxpZmllciBwcmVwZW5kZWQgdG8gdGhlIG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIHRhZyBuYW1lIChtaW51cyBhbnkgcXVhbGlmaWVyKS4KKwkgKiAKKwkgKiBAcGFyYW0gZW1wdHkgdHJ1ZSBpZiB0aGUgdGFnIHdhcyBvcGVuZWQgYW5kIGNsb3NlZCBhbGwgaW4gb25lIHN0ZXAuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVsaXZlclN0YXJ0VGFnKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBlbXB0eSApCisJeworCQlUYWdFbGVtZW50IHRvcCA9IHBlZWtUYWdFbGVtZW50KCk7CisKKwkJUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUoIHF1YWxpZmllciwgbmFtZSApOworCQkKKwkJVGFnRWxlbWVudCB0YWdFbGVtZW50OworCQlpZiAodG9wICE9IG51bGwpCisJCQl0YWdFbGVtZW50ID0gdG9wLmFkZFRhZyggcU5hbWUsIHRhZ0F0dHJzICk7CisJCWVsc2UKKwkJCXJvb3RUYWdFbGVtZW50ID0gdGFnRWxlbWVudCA9IGFkZFJvb3RUYWcoIHFOYW1lLCB0YWdBdHRycyApOworCQl0YWdBdHRycyA9IG51bGw7CisJCQorCQlpZiAoZW1wdHkpCisJCQl0YWdFbGVtZW50LmZpbmlzaCgpOworCQllbHNlCisJCQlwdXNoVGFnRWxlbWVudCggdGFnRWxlbWVudCApOworCX0KKworCS8qKgorCSAqIERlbGl2ZXJzIGEgY2xvc2UgdGFnLiBBIGNsb3NlIHRhZyB3aWxsIG5vdCBiZSBkZWxpdmVyZWQgZm9yIGEKKwkgKiB0YWcgd2hpY2ggd2FzIG9wZW5lZCBhbmQgY2xvc2VkIGFsbCBpbiBvbmUgc3RlcC4KKwkgKiAKKwkgKiBAcGFyYW0gcXVhbGlmaWVyIGFueSBxdWFsaWZpZXIgcHJlcGVuZGVkIHRvIHRoZSBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSB0YWcgbmFtZSAobWludXMgYW55IHF1YWxpZmllcikuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlbGl2ZXJFbmRUYWcoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICkKKwkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlUYWdFbGVtZW50IHRvcCA9IHBlZWtUYWdFbGVtZW50KCk7CisJCWlmICh0b3AgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggImVuZCB0YWcgd2l0aCBlbXB0eSBzdGFjazogIisKKwkJCQlRTmFtZS50b1N0cmluZyggcXVhbGlmaWVyLCBuYW1lICkgKTsKKwkJCisJCWlmICghdG9wLm1hdGNoZXMoIHF1YWxpZmllciwgbmFtZSApKQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCAiZW5kIHRhZyAiKworCQkJCVFOYW1lLnRvU3RyaW5nKCBxdWFsaWZpZXIsIG5hbWUgKSsKKwkJCQkiIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgdG9wIG9mIHN0YWNrIiApOworCQkKKwkJcG9wVGFnRWxlbWVudCgpLmZpbmlzaCgpOworCX0KKworCS8qKgorCSAqIERlbGl2ZXJzIGFuIGF0dHJpYnV0ZSBvZiBhIHRhZyB3aGljaCBpcyBiZWluZyBwYXJzZWQuIFRoZSB0YWcKKwkgKiB3aWxsIGJlIGRlbGl2ZXJlZCB3aXRoIGRlbGl2ZXJPcGVuVGFnIHdoZW4gaXQgaXMgZG9uZSwgYWZ0ZXIKKwkgKiBhbnkgYW5kIGFsbCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBkZWxpdmVyZWQuCisJICogCisJICogQHBhcmFtIHF1YWxpZmllciBhbnkgcXVhbGlmaWVyIHByZXBlbmRlZCB0byB0aGUgbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUgKG1pbnVzIGFueSBxdWFsaWZpZXIpLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgYXR0cmlidXRlIHZhbHVlIChlc2NhcGUgc2VxdWVuY2VzIGhhdmUgYmVlbiBleHBhbmRlZCkuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVsaXZlckF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJaWYgKHRhZ0F0dHJzID09IG51bGwpCisJCQl0YWdBdHRycyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBTdHJpbmc+KCk7CisJCQorCQlRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZSggcXVhbGlmaWVyLCBuYW1lICk7CisJCXRhZ0F0dHJzLnB1dCggcU5hbWUsIHZhbHVlICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUQUcgRUxFTUVOVCBTVEFDSyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJcHJpdmF0ZSBUYWdFbGVtZW50IHBlZWtUYWdFbGVtZW50KCkKKwl7CisJCWlmICh0YWdFbGVtZW50U3RhY2suaXNFbXB0eSgpKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlyZXR1cm4gdGFnRWxlbWVudFN0YWNrLnBlZWsoKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHRhZ0VsZW1lbnQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwdXNoVGFnRWxlbWVudCggVGFnRWxlbWVudCB0YWdFbGVtZW50ICkKKwl7CisJCXRhZ0VsZW1lbnRTdGFjay5wdXNoKCB0YWdFbGVtZW50ICk7CisJfQorCQorCXByaXZhdGUgVGFnRWxlbWVudCBwb3BUYWdFbGVtZW50KCkKKwl7CisJCXJldHVybiB0YWdFbGVtZW50U3RhY2sucG9wKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjbGVhclRhZ0VsZW1lbnRzKCkKKwl7CisJCXRhZ0VsZW1lbnRTdGFjay5jbGVhcigpOworCQlyb290VGFnRWxlbWVudCA9IG51bGw7CisJfQorCQorCS8qKgorCSAqIER1bXBzIHRoZSB0YWcgc3RhY2sgb2YgdGhlIHhtbCBwYXJzZXIuCisJICovCisJcHVibGljIHZvaWQgZHVtcCgpCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJ0YWcgc3RhY2s6ICIrdGFnRWxlbWVudFN0YWNrICk7CisJCVN5c3RlbS5vdXQuZmx1c2goKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIGN1cnJlbnQgdGFnIGVsZW1lbnQgc3RhY2suCisJICovCisJcHVibGljIExpc3Q8VGFnRWxlbWVudD4gZ2V0VGFnRWxlbWVudHMoKQorCXsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8VGFnRWxlbWVudD4oIHRhZ0VsZW1lbnRTdGFjayApOworCX0KKwkKKwlwcml2YXRlIFN0YWNrPFRhZ0VsZW1lbnQ+IHRhZ0VsZW1lbnRTdGFjayA9IG5ldyBTdGFjazxUYWdFbGVtZW50PigpOworCQorCXByaXZhdGUgTWFwPFFOYW1lLCBTdHJpbmc+IHRhZ0F0dHJzOworCQorCXByaXZhdGUgVGFnRWxlbWVudCByb290VGFnRWxlbWVudDsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1VCQ0xBU1MgUkVTUE9OU0lCSUxJVFkgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCS8qKgorCSAqIEBwYXJhbSBjZGF0YQorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRSb290Q2RhdGEoIFN0cmluZyBjZGF0YSApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJaWYgKGNkYXRhLnRyaW0oKS5sZW5ndGgoKSA+IDApCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oICJjYW5ub3QgYWRkIHJvb3QgY2RhdGEiICk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBxTmFtZQorCSAqIEBwYXJhbSBhdHRycworCSAqIEByZXR1cm4gYSBuZXcgdGFnIGVsZW1lbnQgc3VpdGFibGUgdG8gYmUgYSByb290IHRhZyBlbGVtZW50LgorCSAqLworCXB1YmxpYyBUYWdFbGVtZW50IGFkZFJvb3RUYWcoIFFOYW1lIHFOYW1lLCBNYXA8UU5hbWUsIFN0cmluZz4gYXR0cnMgKQorCXsKKwkJcmV0dXJuIG5ldyBSb290VGFnRWxlbWVudCggcU5hbWUsIGF0dHJzICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBtaXNjIHN1cHBvcnQgbWV0aG9kcyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwPFN0cmluZyxDaGFyYWN0ZXI+IGVzY2FwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ2hhcmFjdGVyPigpOworCXN0YXRpYworCXsKKwkJZXNjYXBlcy5wdXQoICJhbXAiLCBuZXcgQ2hhcmFjdGVyKCAnJicgKSApOworCQllc2NhcGVzLnB1dCggImFwb3MiLCBuZXcgQ2hhcmFjdGVyKCAnXCcnICkgKTsKKwkJZXNjYXBlcy5wdXQoICJndCIsIG5ldyBDaGFyYWN0ZXIoICc+JyApICk7CisJCWVzY2FwZXMucHV0KCAibHQiLCBuZXcgQ2hhcmFjdGVyKCAnPCcgKSApOworCQllc2NhcGVzLnB1dCggInF1b3QiLCBuZXcgQ2hhcmFjdGVyKCAnIicgKSApOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5pc2hTdHJpbmdCdWYoIFN0cmluZ0J1ZiBzYiwKKwkJYm9vbGVhbiBlbXB0eU9rICkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisJeworCQlpZiAoc2IubGVuZ3RoKCkgPT0gMCkKKwkJeworCQkJaWYgKCFlbXB0eU9rKQorCQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbiggImVtcHR5ICciK3NiLmdldERlc2NyKCkrIicgbm90IGFsbG93ZWQiICk7CisJCQkKKwkJCXJldHVybiAiIjsKKwkJfQorCQkKKwkJU3RyaW5nIHMgPSBzYi50b1N0cmluZygpOworCQlzYi5jbGVhcigpOworCQlyZXR1cm4gczsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlc2NyaWJlQ2hhciggaW50IGMgKQorCXsKKwkJaWYgKGMgPCAzMiB8fCBjID4gMTI2KQorCQkJcmV0dXJuICImIyIrYysnOyc7CisJCQorCQlpZiAoYyA9PSAnXCcnKQorCQkJcmV0dXJuICInXFwnJyI7CisJCQorCQlpZiAoYyA9PSAnXFwnKQorCQkJcmV0dXJuICInXFxcXCciOworCQkKKwkJcmV0dXJuICInIisoY2hhcikgYysnXCcnOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHBlY3RlZENoYXJzKCBpbnQgc3RhdGUgKQorCXsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IE5DQzsgaSsrKQorCQl7CisJCQlpZiAodHJhbnNpdGlvbnNbc3RhdGVdW2ldPj4+QUNUSU9OX1NISUZUICE9IEFfRVJST1IpCisJCQl7CisJCQkJaWYgKHNiLmxlbmd0aCgpID4gMCkKKwkJCQkJc2IuYXBwZW5kKCAnfCcgKTsKKwkJCQlzYi5hcHBlbmQoIGRlc2NyaWJlQ2hhckNsYXNzKCBpICkgKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX01BU0sgPSAyNTU7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFDVElPTl9TSElGVCA9IDg7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFDVElPTl9NQVNLID0gMjU1OworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDSEFSQUNURVIgQ0xBU1NFUyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0NfT1RIRVIgPSAwOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19FT0YgPSAxOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19YID0gMjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0NfTSA9IDM7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX0wgPSA0OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19PVEhSX0xUUiA9IDU7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX0RJR0lUID0gNjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0NfV1MgPSA3OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19TTEFTSCA9IDg7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX0JBTkcgPSA5OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19FUSA9IDEwOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19TUSA9IDExOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19EUSA9IDEyOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19EQVNIID0gMTM7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX0NPTE9OID0gMTQ7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX0xUID0gMTU7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX0dUID0gMTY7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX0RPVCA9IDE3OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDQ19VTkRFUlNDT1JFID0gMTg7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IENDX1FVRVNUSU9OID0gMTk7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE5DQyA9IDIwOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNjRGVzY3IgPSBuZXcgU3RyaW5nW05DQ107CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE5DSEFSUyA9IDEyODsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gY2NzID0gbmV3IGJ5dGVbTkNIQVJTXTsKKwlzdGF0aWMKKwl7CisJCWFkZENoYXIoIENDX0VPRiwgIkVPRiIgKTsKKwkJYWRkQ2hhciggQ0NfT1RIRVIsICJhbGwgb3RoZXJzIiApOworCisJCWFkZENoYXIoIENDX09USFJfTFRSLCAnYScsICdrJywgImEtayIgKTsKKwkJYWRkQ2hhciggQ0NfTCwgJ2wnLCAibCIgKTsKKwkJYWRkQ2hhciggQ0NfTSwgJ20nLCAibSIgKTsKKwkJYWRkQ2hhciggQ0NfT1RIUl9MVFIsICduJywgJ3cnLCAibi13IiApOworCQlhZGRDaGFyKCBDQ19YLCAneCcsICJ4IiApOworCQlhZGRDaGFyKCBDQ19PVEhSX0xUUiwgJ3knLCAneicsICJ5LXoiICk7CisKKwkJYWRkQ2hhciggQ0NfT1RIUl9MVFIsICdBJywgJ0snLCAiQS1LIiApOworCQlhZGRDaGFyKCBDQ19MLCAnTCcsICJMIiApOworCQlhZGRDaGFyKCBDQ19NLCAnTScsICJNIiApOworCQlhZGRDaGFyKCBDQ19PVEhSX0xUUiwgJ04nLCAnVycsICJOLVciICk7CisJCWFkZENoYXIoIENDX1gsICdYJywgIlgiICk7CisJCWFkZENoYXIoIENDX09USFJfTFRSLCAnWScsICdaJywgIlktWiIgKTsKKwkJCisJCWFkZENoYXIoIENDX0RJR0lULCAnMCcsICc5JywgIjAtOSIgKTsKKwkJCisJCWFkZENoYXIoIENDX1dTLCAnICcsICJTUCIgKTsKKwkJYWRkQ2hhciggQ0NfV1MsICdcdCcsICJUQUIiICk7CisJCWFkZENoYXIoIENDX1dTLCAnXHInLCAiQ1IiICk7CisJCWFkZENoYXIoIENDX1dTLCAnXG4nLCAiTEYiICk7CisJCQorCQlhZGRDaGFyKCBDQ19TTEFTSCwgJy8nLCAiLyIgKTsKKwkJYWRkQ2hhciggQ0NfQkFORywgJyEnLCAiISIgKTsKKwkJYWRkQ2hhciggQ0NfRVEsICc9JywgIj0iICk7CisJCWFkZENoYXIoIENDX1NRLCAnXCcnLCAiJyIgKTsKKwkJYWRkQ2hhciggQ0NfRFEsICciJywgIlwiIiApOworCQlhZGRDaGFyKCBDQ19EQVNILCAnLScsICItIiApOworCQlhZGRDaGFyKCBDQ19DT0xPTiwgJzonLCAiOiIgKTsKKwkJYWRkQ2hhciggQ0NfTFQsICc8JywgIjwiICk7CisJCWFkZENoYXIoIENDX0dULCAnPicsICI+IiApOworCQlhZGRDaGFyKCBDQ19ET1QsICcuJywgIi4iICk7CisJCWFkZENoYXIoIENDX1VOREVSU0NPUkUsICdfJywgIl8iICk7CisJCWFkZENoYXIoIENDX1FVRVNUSU9OLCAnPycsICI/IiApOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Q2hhckNsYXNzKCBpbnQgYyApCisJeworCQlpZiAoYyA8IDApIHJldHVybiBDQ19FT0Y7CisJCWlmIChjID49IE5DSEFSUykgcmV0dXJuIENDX09USEVSOworCQlyZXR1cm4gY2NzW2NdOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ2hhciggaW50IGNjLCBTdHJpbmcgZGVzY3IgKQorCXsKKwkJYWRkQ0NEZXNjciggY2MsIGRlc2NyICk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDaGFyKCBpbnQgY2MsIGNoYXIgYywgU3RyaW5nIGRlc2NyICkKKwl7CisJCUFzc2VydGlvbi5jaGVjayggY2NzW2NdID09IENDX09USEVSLCAiY2NzW2NdID09IENDX09USEVSIiApOworCQljY3NbY10gPSAoYnl0ZSkgY2M7CisJCWFkZENDRGVzY3IoIGNjLCBkZXNjciApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ2hhciggaW50IGNjLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCwgU3RyaW5nIGRlc2NyICkKKwl7CisJCXdoaWxlIChzdGFydCA8PSBlbmQpCisJCXsKKwkJCUFzc2VydGlvbi5jaGVjayggY2NzW3N0YXJ0XSA9PSBDQ19PVEhFUiwgImNjc1tzdGFydF0gPT0gQ0NfT1RIRVIiICk7CisJCQljY3Nbc3RhcnQrK10gPSAoYnl0ZSkgY2M7CisJCX0KKwkJYWRkQ0NEZXNjciggY2MsIGRlc2NyICk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDQ0Rlc2NyKCBpbnQgY2MsIFN0cmluZyBkZXNjciApCisJeworCQlTdHJpbmcgcyA9IGNjRGVzY3JbY2NdOworCQlpZiAocyAhPSBudWxsKQorCQkJY2NEZXNjcltjY10gPSBzKyd8JytkZXNjcjsKKwkJZWxzZQorCQkJY2NEZXNjcltjY10gPSBkZXNjcjsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVzY3JpYmVDaGFyQ2xhc3MoIGludCBjYyApCisJeworCQlyZXR1cm4gY2NEZXNjcltjY107CisJfQorCisJLy8vLy8vLy8vLy8vLworCS8vIEFDVElPTlMgLy8KKwkvLy8vLy8vLy8vLy8vCisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfRVJST1IgPSAwOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBX0lHTk9SRSA9IDE7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfU1RPUCA9IDI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfQUREX0NIQVJfVE9fQ0RBVEEgPSAzOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBX0FERF9MVF9DSEFSX1RPX0NEQVRBID0gNDsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQV9BRERfTFRfU0xBU0hfQ0hBUl9UT19DREFUQSA9IDU7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfQUREX0xUX0JBTkdfQ0hBUl9UT19DREFUQSA9IDE1OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBX0FERF9MVF9RVUVTVElPTl9DSEFSX1RPX0NEQVRBID0gMTY7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfQUREX0NIQVJfVE9fVEFHX05BTUUgPSA2OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBX1NFVF9UQUdfTkFNRV9RVUFMSUZJRVIgPSA3OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBX1NUQVJUX1RBRyA9IDg7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfRU1QVFlfVEFHID0gOTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQV9FTkRfVEFHID0gMTA7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfQUREX0NIQVJfVE9fQVRUUl9OQU1FID0gMTE7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFfU0VUX0FUVFJfTkFNRV9RVUFMSUZJRVIgPSAxMjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQV9BRERfVE9fQVRUUl9WQUxVRSA9IDEzOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBX0ZJTklTSF9BVFRSID0gMTQ7CisKKwkvLy8vLy8vLy8vLy8KKwkvLyBTVEFURVMgLy8KKwkvLy8vLy8vLy8vLy8KKworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0NEQVRBID0gMDsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19HT1RfTFQgPSAxOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0dFVF9TVEFHX05NID0gMjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19TS05HX0dUID0gMzsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19TS05HX0FUVFJfTk0gPSA0OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0dFVF9BVFRSX05NID0gNTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19TS05HX0FUVFJfVkFMID0gNjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19HRVRfRFFfVkFMVUUgPSA3OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0dFVF9TUV9WQUxVRSA9IDg7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfR09UX0xUX1NMQVNIID0gOTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19HRVRfRVRBR19OTSA9IDEwOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX1NLTkdfV1NfU1RBUl9HVCA9IDExOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0dPVF9MVF9CQU5HID0gMTI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfU0tOR19EQVNIMiA9IDEzOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX0dFVF9DTU1OVCA9IDE0OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTX1NLTkdfREFTSDQgPSAxNTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU19TS05HX0VRID0gMTY7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfR09UX0xUX1FVRVNUSU9OID0gMTc7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNfR0VUX0RJUl9OTSA9IDE4OworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTXzEgPSAxOTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU18yID0gMjA7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE5TVEFURVMgPSAyMjsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZXNjcmliZVN0YXRlKCBpbnQgc3RhdGUgKQorCXsKKwkJcmV0dXJuIHN0YXRlRGVzY3Jbc3RhdGVdOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzdGF0ZURlc2NyID0gbmV3IFN0cmluZ1tOU1RBVEVTXTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUUkFOU0lUSU9OIFRBQkxFIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIHNob3J0W11bXSB0cmFuc2l0aW9ucyA9IG5ldyBzaG9ydFtOU1RBVEVTXVtOQ0NdOworCXN0YXRpYworCXsKKwkJYWRkU3RhdGUoIFNfQ0RBVEEsICJnYXRoZXJpbmcgQ0RBVEEsIGxvb2tpbmcgZm9yIHRhZyBzdGFydCBvciBFT0YiICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0xULCBTX0dPVF9MVCwgQV9JR05PUkUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfRU9GLCBTX0NEQVRBLCBBX1NUT1AgKTsKKwkJYWRkQmFja3N0b3AoIFNfQ0RBVEEsIEFfQUREX0NIQVJfVE9fQ0RBVEEgKTsKKworCQkvLyBwZW5kaW5nIENEQVRBOiBMVAorCQlhZGRTdGF0ZSggU19HT1RfTFQsICJsb29raW5nIGZvciBzdGFnIG5hbWUsIHNsYXNoLCBiYW5nLCBvciBxdWVzdGlvbiIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfWCwgU19HRVRfU1RBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19NLCBTX0dFVF9TVEFHX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0wsIFNfR0VUX1NUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfT1RIUl9MVFIsIFNfR0VUX1NUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfVU5ERVJTQ09SRSwgU19HRVRfU1RBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19TTEFTSCwgU19HT1RfTFRfU0xBU0gsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0JBTkcsIFNfR09UX0xUX0JBTkcsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1FVRVNUSU9OLCBTX0dPVF9MVF9RVUVTVElPTiwgQV9JR05PUkUgKTsKKwkJYWRkQmFja3N0b3AoIFNfQ0RBVEEsIEFfQUREX0xUX0NIQVJfVE9fQ0RBVEEgKTsKKworCQkvLyBwZW5kaW5nIENEQVRBOiBMVCBTTEFTSAorCQlhZGRTdGF0ZSggU19HT1RfTFRfU0xBU0gsICJsb29raW5nIGZvciBldGFnIG5hbWUiICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1gsIFNfR0VUX0VUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfTSwgU19HRVRfRVRBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19MLCBTX0dFVF9FVEFHX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX09USFJfTFRSLCBTX0dFVF9FVEFHX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1VOREVSU0NPUkUsIFNfR0VUX0VUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkQmFja3N0b3AoIFNfQ0RBVEEsIEFfQUREX0xUX1NMQVNIX0NIQVJfVE9fQ0RBVEEgKTsKKworCQkvLyBwZW5kaW5nIENEQVRBOiBMVCBCQU5HCisJCWFkZFN0YXRlKCBTX0dPVF9MVF9CQU5HLCAibG9va2luZyBmb3IgZGlyZWN0aXZlIG5hbWUgb3IgZmlyc3QgZGFzaCBvZiBjb21tZW50IiApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19YLCBTX0dFVF9ESVJfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfTSwgU19HRVRfRElSX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0wsIFNfR0VUX0RJUl9OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19PVEhSX0xUUiwgU19HRVRfRElSX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1VOREVSU0NPUkUsIFNfR0VUX0RJUl9OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19EQVNILCBTX1NLTkdfREFTSDIsIEFfSUdOT1JFICk7CisJCWFkZEJhY2tzdG9wKCBTX0NEQVRBLCBBX0FERF9MVF9CQU5HX0NIQVJfVE9fQ0RBVEEgKTsKKwkJCisJCS8vIHBlbmRpbmcgQ0RBVEE6IExUIFFVRVNUSU9OCisJCWFkZFN0YXRlKCBTX0dPVF9MVF9RVUVTVElPTiwgImxvb2tpbmcgZm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24iICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1gsIFNfMSwgQV9JR05PUkUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfTSwgU18xLCBBX0lHTk9SRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19MLCBTXzEsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX09USFJfTFRSLCBTXzEsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1VOREVSU0NPUkUsIFNfMSwgQV9JR05PUkUgKTsKKwkJYWRkQmFja3N0b3AoIFNfQ0RBVEEsIEFfQUREX0xUX1FVRVNUSU9OX0NIQVJfVE9fQ0RBVEEgKTsKKwkJCisJCWFkZFN0YXRlKCBTXzEsICJnYXRoZXIgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfUVVFU1RJT04sIFNfMiwgQV9JR05PUkUgKTsKKwkJYWRkQmFja3N0b3AoIFNfMSwgQV9JR05PUkUgKTsKKwkJCisJCWFkZFN0YXRlKCBTXzIsICJlbmRpbmcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfR1QsIFNfQ0RBVEEsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1FVRVNUSU9OLCBTXzIsIEFfSUdOT1JFICk7CisJCWFkZEJhY2tzdG9wKCBTXzEsIEFfSUdOT1JFICk7CisJCQorCQlhZGRTdGF0ZSggU19HRVRfU1RBR19OTSwgImdhdGhlcmluZyBzdGFnIG5hbWUiICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1gsIFNfR0VUX1NUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfTSwgU19HRVRfU1RBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19MLCBTX0dFVF9TVEFHX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX09USFJfTFRSLCBTX0dFVF9TVEFHX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1VOREVSU0NPUkUsIFNfR0VUX1NUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfRElHSVQsIFNfR0VUX1NUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfREFTSCwgU19HRVRfU1RBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19ET1QsIFNfR0VUX1NUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfQ09MT04sIFNfR0VUX1NUQUdfTk0sIEFfU0VUX1RBR19OQU1FX1FVQUxJRklFUiApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19XUywgU19TS05HX0FUVFJfTk0sIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1NMQVNILCBTX1NLTkdfR1QsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0dULCBTX0NEQVRBLCBBX1NUQVJUX1RBRyApOworCisJCWFkZFN0YXRlKCBTX1NLTkdfR1QsICJsb29raW5nIGZvciBHVCB0byBjbG9zZSBlbXB0eSB0YWciICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0dULCBTX0NEQVRBLCBBX0VNUFRZX1RBRyApOworCisJCWFkZFN0YXRlKCBTX1NLTkdfQVRUUl9OTSwgImxvb2tpbmcgZm9yIGF0dHJpYnV0ZSBuYW1lLCBvciB0YWcgY2xvc2Ugb3IgdGFnIGVuZCIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfWCwgU19HRVRfQVRUUl9OTSwgQV9BRERfQ0hBUl9UT19BVFRSX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfTSwgU19HRVRfQVRUUl9OTSwgQV9BRERfQ0hBUl9UT19BVFRSX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfTCwgU19HRVRfQVRUUl9OTSwgQV9BRERfQ0hBUl9UT19BVFRSX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfT1RIUl9MVFIsIFNfR0VUX0FUVFJfTk0sIEFfQUREX0NIQVJfVE9fQVRUUl9OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1VOREVSU0NPUkUsIFNfR0VUX0FUVFJfTk0sIEFfQUREX0NIQVJfVE9fQVRUUl9OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1dTLCBTX1NLTkdfQVRUUl9OTSwgQV9JR05PUkUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfU0xBU0gsIFNfU0tOR19HVCwgQV9JR05PUkUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfR1QsIFNfQ0RBVEEsIEFfU1RBUlRfVEFHICk7CisKKwkJYWRkU3RhdGUoIFNfR0VUX0FUVFJfTk0sICJjb2xsZWN0IGF0dHJpYnV0ZSBuYW1lIiApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19YLCBTX0dFVF9BVFRSX05NLCBBX0FERF9DSEFSX1RPX0FUVFJfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19NLCBTX0dFVF9BVFRSX05NLCBBX0FERF9DSEFSX1RPX0FUVFJfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19MLCBTX0dFVF9BVFRSX05NLCBBX0FERF9DSEFSX1RPX0FUVFJfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19PVEhSX0xUUiwgU19HRVRfQVRUUl9OTSwgQV9BRERfQ0hBUl9UT19BVFRSX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfVU5ERVJTQ09SRSwgU19HRVRfQVRUUl9OTSwgQV9BRERfQ0hBUl9UT19BVFRSX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfRElHSVQsIFNfR0VUX0FUVFJfTk0sIEFfQUREX0NIQVJfVE9fQVRUUl9OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0RBU0gsIFNfR0VUX0FUVFJfTk0sIEFfQUREX0NIQVJfVE9fQVRUUl9OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0RPVCwgU19HRVRfQVRUUl9OTSwgQV9BRERfQ0hBUl9UT19BVFRSX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfQ09MT04sIFNfR0VUX0FUVFJfTk0sIEFfU0VUX0FUVFJfTkFNRV9RVUFMSUZJRVIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfV1MsIFNfU0tOR19FUSwgQV9JR05PUkUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfRVEsIFNfU0tOR19BVFRSX1ZBTCwgQV9JR05PUkUgKTsKKworCQlhZGRTdGF0ZSggU19TS05HX0VRLCAic2Vla2luZyB0aGUgRVEgb2YgYW4gYXR0cmlidXRlIHNwZWMiICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1dTLCBTX1NLTkdfRVEsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0VRLCBTX1NLTkdfQVRUUl9WQUwsIEFfSUdOT1JFICk7CisJCQorCQlhZGRTdGF0ZSggU19TS05HX0FUVFJfVkFMLCAibG9va2luZyBmb3IgYXR0cmlidXRlIHZhbHVlIiApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19XUywgU19TS05HX0FUVFJfVkFMLCBBX0lHTk9SRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19TUSwgU19HRVRfU1FfVkFMVUUsIEFfSUdOT1JFICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0RRLCBTX0dFVF9EUV9WQUxVRSwgQV9JR05PUkUgKTsKKworCQlhZGRTdGF0ZSggU19HRVRfRFFfVkFMVUUsICJjb2xsZWN0aW5nIERRIGF0dHJpYnV0ZSB2YWx1ZSIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfRFEsIFNfU0tOR19BVFRSX05NLCBBX0ZJTklTSF9BVFRSICk7CisJCWFkZEJhY2tzdG9wKCBTX0dFVF9EUV9WQUxVRSwgQV9BRERfVE9fQVRUUl9WQUxVRSApOworCisJCWFkZFN0YXRlKCBTX0dFVF9TUV9WQUxVRSwgImNvbGxlY3RpbmcgU1EgYXR0cmlidXRlIHZhbHVlIiApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19TUSwgU19TS05HX0FUVFJfTk0sIEFfRklOSVNIX0FUVFIgKTsKKwkJYWRkQmFja3N0b3AoIFNfR0VUX1NRX1ZBTFVFLCBBX0FERF9UT19BVFRSX1ZBTFVFICk7CisKKwkJYWRkU3RhdGUoIFNfR0VUX0VUQUdfTk0sICJjb2xsZWN0aW5nIGV0YWcgbmFtZSIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfWCwgU19HRVRfRVRBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19NLCBTX0dFVF9FVEFHX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0wsIFNfR0VUX0VUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfT1RIUl9MVFIsIFNfR0VUX0VUQUdfTk0sIEFfQUREX0NIQVJfVE9fVEFHX05BTUUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfVU5ERVJTQ09SRSwgU19HRVRfRVRBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19ESUdJVCwgU19HRVRfRVRBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19EQVNILCBTX0dFVF9FVEFHX05NLCBBX0FERF9DSEFSX1RPX1RBR19OQU1FICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0RPVCwgU19HRVRfRVRBR19OTSwgQV9BRERfQ0hBUl9UT19UQUdfTkFNRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19DT0xPTiwgU19HRVRfRVRBR19OTSwgQV9TRVRfVEFHX05BTUVfUVVBTElGSUVSICk7CisJCWFkZFRyYW5zaXRpb24oIENDX1dTLCBTX1NLTkdfV1NfU1RBUl9HVCwgQV9JR05PUkUgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfR1QsIFNfQ0RBVEEsIEFfRU5EX1RBRyApOworCisJCWFkZFN0YXRlKCBTX1NLTkdfV1NfU1RBUl9HVCwgImxvb2tpbmcgZm9yIGVuZCBvZiBjbG9zaW5nIHRhZyIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfV1MsIFNfU0tOR19XU19TVEFSX0dULCBBX0lHTk9SRSApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19HVCwgU19DREFUQSwgQV9FTkRfVEFHICk7CisJCQorCQlhZGRTdGF0ZSggU19TS05HX0RBU0gyLCAibG9va2luZyBmb3Igc2Vjb25kIGRhc2ggb2YgY29tbWVudCIgKTsKKwkJYWRkVHJhbnNpdGlvbiggQ0NfREFTSCwgU19HRVRfQ01NTlQsIEFfSUdOT1JFICk7CisKKwkJYWRkU3RhdGUoIFNfR0VUX0NNTU5ULCAiY29sbGVjdGluZyBjb21tZW50IiApOworCQlhZGRUcmFuc2l0aW9uKCBDQ19EQVNILCBTX1NLTkdfREFTSDQsIEFfSUdOT1JFICk7CisJCWFkZEJhY2tzdG9wKCBTX0dFVF9DTU1OVCwgQV9JR05PUkUgKTsKKworCQlhZGRTdGF0ZSggU19TS05HX0RBU0g0LCAibG9va2luZyBmb3Igc2Vjb25kIGRhc2ggb2YgY29tbWVudCBlbmQiICk7CisJCWFkZFRyYW5zaXRpb24oIENDX0RBU0gsIFNfR09UX0xUX0JBTkcsIEFfSUdOT1JFICk7CisJCWFkZEJhY2tzdG9wKCBTX0dFVF9DTU1OVCwgQV9JR05PUkUgKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTdGF0ZSggaW50IHN0YXRlLCBTdHJpbmcgZGVzY3IgKQorCXsKKwkJQXNzZXJ0aW9uLmNoZWNrKCBzdGF0ZURlc2NyW3N0YXRlXSA9PSBudWxsLCAic3RhdGVzW3N0YXRlXSA9PSBudWxsIiApOworCQlzdGF0aWNOZXh0U3RhdGUgPSBzdGF0ZTsKKwkJc3RhdGVEZXNjcltzdGF0ZV0gPSBkZXNjcjsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgaW50IHN0YXRpY05leHRTdGF0ZSA9IC0xOworCQorCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVHJhbnNpdGlvbiggaW50IGNjLCBpbnQgbmV3U3RhdGUsIGludCBhY3Rpb24gKQorCXsKKwkJQXNzZXJ0aW9uLmNoZWNrKCB0cmFuc2l0aW9uc1tzdGF0aWNOZXh0U3RhdGVdW2NjXSA9PSAwLCAic3RhdGVBY3Rpb25zW3N0YXRpY05leHRTdGF0ZV1bY2NdID09IDAiICk7CisJCUFzc2VydGlvbi5jaGVjayggKG5ld1N0YXRlICYgflNUQVRFX01BU0spID09IDAsICIobmV3U3RhdGUgJiB+U1RBVEVfTUFTSykgPT0gMCIgKTsKKwkJQXNzZXJ0aW9uLmNoZWNrKCAoYWN0aW9uICYgfkFDVElPTl9NQVNLKSA9PSAwLCAiKGFjdGlvbiAmIH5BQ1RJT05fTUFTSykgPT0gMCIgKTsKKwkJaW50IHNhID0gbmV3U3RhdGUgfCBhY3Rpb24gPDwgQUNUSU9OX1NISUZUOworCQl0cmFuc2l0aW9uc1tzdGF0aWNOZXh0U3RhdGVdW2NjXSA9IChzaG9ydCkgc2E7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQmFja3N0b3AoIGludCBuZXdTdGF0ZSwgaW50IGFjdGlvbiApCisJeworCQlBc3NlcnRpb24uY2hlY2soIChuZXdTdGF0ZSAmIH5TVEFURV9NQVNLKSA9PSAwLCAiKG5ld1N0YXRlICYgflNUQVRFX01BU0spID09IDAiICk7CisJCUFzc2VydGlvbi5jaGVjayggKGFjdGlvbiAmIH5BQ1RJT05fTUFTSykgPT0gMCwgIihhY3Rpb24gJiB+QUNUSU9OX01BU0spID09IDAiICk7CisJCWludCBzYSA9IG5ld1N0YXRlIHwgYWN0aW9uIDw8IEFDVElPTl9TSElGVDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0M7IGkrKykKKwkJeworCQkJaWYgKGkgPT0gQ0NfRU9GKQorCQkJCWNvbnRpbnVlOworCQkJCisJCQlpZiAodHJhbnNpdGlvbnNbc3RhdGljTmV4dFN0YXRlXVtpXSA9PSAwKQorCQkJCXRyYW5zaXRpb25zW3N0YXRpY05leHRTdGF0ZV1baV0gPSAoc2hvcnQpIHNhOworCQl9CisJfQorCQorCS8qKgorCSAqIERlc2NyaXB0aW9uIG9mIEVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnQKKwl7CisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGR1bXBlZCBpbiBhcHByb3ByaWF0ZSBmb3JtYXQuCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7CisJCQorCQkvKioKKwkJICogQHBhcmFtIG5ld2xpbmVCZXR3ZWVuVGFncworCQkgKiBAcGFyYW0gY29sbGFwc2VFbXB0eVRhZ3MKKwkJICogQHJldHVybiB0aGUgZWxlbWVudCBkdW1wZWQgaW4gYXBwcm9wcmlhdGUgZm9ybWF0LgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZyggYm9vbGVhbiBuZXdsaW5lQmV0d2VlblRhZ3MsCisJCQlib29sZWFuIGNvbGxhcHNlRW1wdHlUYWdzICk7CisJCQorCQkvKioKKwkJICogdGhlIGVsZW1lbnQgZHVtcGVkIGluIGFwcHJvcHJpYXRlIGZvcm1hdCB0byB0aGUgc3RyaW5nIGJ1ZmZlci4KKwkJICogQHBhcmFtIHd0cgorCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJCSAqLworCQlwdWJsaWMgdm9pZCB0b1N0cmluZyggV3JpdGVyIHd0ciApIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkJCisJCS8qKgorCQkgKiB0aGUgZWxlbWVudCBkdW1wZWQgaW4gYXBwcm9wcmlhdGUgZm9ybWF0IHRvIHRoZSBzdHJpbmcgYnVmZmVyLgorCQkgKiBAcGFyYW0gd3RyCisJCSAqIEBwYXJhbSBuZXdsaW5lQmV0d2VlblRhZ3MKKwkJICogQHBhcmFtIGNvbGxhcHNlRW1wdHlUYWdzIGlmIHRydWUgYWxsb3dzIDxmb28+PC9mb28+IHRvIGJlCisJCSAqIGNvbGxhcHNlZCBpbnRvIDxmb28vPgorCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJCSAqLworCQlwdWJsaWMgdm9pZCB0b1N0cmluZyggV3JpdGVyIHd0ciwgYm9vbGVhbiBuZXdsaW5lQmV0d2VlblRhZ3MsCisJCQlib29sZWFuIGNvbGxhcHNlRW1wdHlUYWdzICkgdGhyb3dzIElPRXhjZXB0aW9uOworCX0KKwkKKwkvKioKKwkgKiBEZXNjcmlwdGlvbiBvZiBBYnN0cmFjdEVsZW1lbnQuCisJICovCisJYWJzdHJhY3QgcHVibGljIHN0YXRpYyBjbGFzcyBBYnN0cmFjdEVsZW1lbnQgaW1wbGVtZW50cyBFbGVtZW50CisJeworCQlAT3ZlcnJpZGUKKwkJZmluYWwgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJCXsKKwkJCXRyeQorCQkJeworCQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJCQl0b1N0cmluZyggc3cgKTsKKwkJCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKKwkJCX0KKwkJCWNhdGNoICggSU9FeGNlcHRpb24gZSApCisJCQl7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJjYXVnaHQgZXhjZXB0aW9uIiwgZSApOworCQkJfQorCQl9CisJCQorCQlmaW5hbCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCBib29sZWFuIG5ld2xpbmVCZXR3ZWVuVGFncywgYm9vbGVhbiBjb2xsYXBzZUVtcHR5VGFncyApCisJCXsKKwkJCXRyeQorCQkJeworCQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJCQl0b1N0cmluZyggc3csIG5ld2xpbmVCZXR3ZWVuVGFncywgY29sbGFwc2VFbXB0eVRhZ3MgKTsKKwkJCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKKwkJCX0KKwkJCWNhdGNoICggSU9FeGNlcHRpb24gZSApCisJCQl7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJjYXVnaHQgZXhjZXB0aW9uIiwgZSApOworCQkJfQorCQl9CisKKwkJZmluYWwgcHVibGljIHZvaWQgdG9TdHJpbmcoIFdyaXRlciB3dHIgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJdG9TdHJpbmcoIHd0ciwgdHJ1ZSwgZmFsc2UgKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBEZXNjcmlwdGlvbiBvZiBDZGF0YUVsZW1lbnQuCisJICovCisJcHVibGljIGludGVyZmFjZSBDZGF0YUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50CisJeworCQkvKioKKwkJICogQHJldHVybiB0aGUgY2RhdGEgb2YgdGhpcyBlbGVtZW50LgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRDZGF0YSgpOworCX0KKwkKKwkvKioKKwkgKiBEZXNjcmlwdGlvbiBvZiBEZWZhdWx0Q2RhdGFFbGVtZW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdENkYXRhRWxlbWVudCBleHRlbmRzIEFic3RyYWN0RWxlbWVudAorCQlpbXBsZW1lbnRzIENkYXRhRWxlbWVudAorCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIERlZmF1bHRDZGF0YUVsZW1lbnQuCisJCSAqCisJCSAqIEBwYXJhbSBjZGF0YQorCQkgKi8KKwkJcHVibGljIERlZmF1bHRDZGF0YUVsZW1lbnQoIFN0cmluZyBjZGF0YSApCisJCXsKKwkJCXRoaXMuY2RhdGEgPSBjZGF0YTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXRDZGF0YSgpCisJCXsKKwkJCXJldHVybiBjZGF0YTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2RhdGE7CisJCQorCQlwdWJsaWMgdm9pZCB0b1N0cmluZyggV3JpdGVyIHd0ciwgYm9vbGVhbiBuZXdsaW5lQmV0d2VlblRhZ3MsCisJCQlib29sZWFuIGNvbGxhcHNlRW1wdHlUYWdzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCVByb3RlY3RDRGF0YS53cml0ZSggd3RyLCBjZGF0YSApOworCQl9CisJfQorCQorCS8qKgorCSAqIERlc2NyaXB0aW9uIG9mIFRhZ0VsZW1lbnQuCisJICovCisJcHVibGljIGludGVyZmFjZSBUYWdFbGVtZW50IGV4dGVuZHMgRWxlbWVudCwgSXRlcmFibGU8RWxlbWVudD4KKwl7CisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHRhZyBlbGVtZW50LgorCQkgKi8KKwkJcHVibGljIFFOYW1lIGdldFFOYW1lKCk7CisJCQorCQkvKioKKwkJICogQHBhcmFtIHF1YWxpZmllcgorCQkgKiBAcGFyYW0gbmFtZQorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0YWcgZWxlbWVudCBtYXRjaGVzIHF1YWxpZmllciBhbmQgbmFtZS4KKwkJICovCisJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICk7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBxTmFtZQorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBxTmFtZSBtYXRjaGVzIHRoaXMgdGFnIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKCBRTmFtZSBxTmFtZSApOworCisJCS8qKgorCQkgKiBAcGFyYW0gY2RhdGEgYWRkcyBzb21lIGNkYXRhIHRvIHRoaXMgdGFnIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRDZGF0YSggU3RyaW5nIGNkYXRhICk7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBjaGlsZFFOYW1lCisJCSAqIEBwYXJhbSBjaGlsZEF0dHJzCisJCSAqIEByZXR1cm4gYSBuZXcgdGFnIGVsZW1lbnQgc3VpdGFibGUgdG8gYmUgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgVGFnRWxlbWVudCBhZGRUYWcoIFFOYW1lIGNoaWxkUU5hbWUsIE1hcDxRTmFtZSwgU3RyaW5nPiBjaGlsZEF0dHJzICk7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBjaGlsZFFOYW1lCisJCSAqIEByZXR1cm4gYSBuZXcgdGFnIGVsZW1lbnQgc3VpdGFibGUgdG8gYmUgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgVGFnRWxlbWVudCBhZGRUYWcoIFFOYW1lIGNoaWxkUU5hbWUgKTsKKworCQkvKioKKwkJICogQHBhcmFtIGNoaWxkTmFtZQorCQkgKiBAcGFyYW0gY2hpbGRBdHRycworCQkgKiBAcmV0dXJuIHRoZSBuZXcgdGFnIHRoYXQgd2FzIGFkZGVkLgorCQkgKi8KKwkJcHVibGljIFRhZ0VsZW1lbnQgYWRkVGFnKCBTdHJpbmcgY2hpbGROYW1lLCBNYXA8UU5hbWUsIFN0cmluZz4gY2hpbGRBdHRycyApOworCisJCS8qKgorCQkgKiBAcGFyYW0gY2hpbGROYW1lCisJCSAqIEByZXR1cm4gdGhlIG5ldyB0YWcgdGhhdCB3YXMgYWRkZWQuCisJCSAqLworCQlwdWJsaWMgVGFnRWxlbWVudCBhZGRUYWcoIFN0cmluZyBjaGlsZE5hbWUgKTsKKwkJCisJCS8qKgorCQkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2hpbGQgZWxlbWVudC4KKwkJICogQHBhcmFtIGUKKwkJICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyByZW1vdmVkLgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKCBFbGVtZW50IGUgKTsKKwkJCisJCS8qKgorCQkgKiBSZW1vdmVzIGFsbCB0aGUgY2hpbGQgZWxlbWVudHMuCisJCSAqLworCQlwdWJsaWMgdm9pZCBjbGVhcigpOworCQkKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGNvdW50IG9mIGNoaWxkcmVuLgorCQkgKi8KKwkJcHVibGljIGludCBjb3VudENoaWxkcmVuKCk7CisJCQorCQkvKioKKwkJICogQHBhcmFtIGluZGV4CisJCSAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCBjaGlsZC4KKwkJICovCisJCXB1YmxpYyBFbGVtZW50IGdldENoaWxkKCBpbnQgaW5kZXggKTsKKworCQkvKioKKwkJICogQ2FsbGVkIGFzIHRoaXMgdGFnIGVsZW1lbnQgaXMgcG9wcGVkIG9mZiB0aGUgdGFnIGVsZW1lbnQgc3RhY2suCisJCSAqIFRoaXMgbWVhbnMgcHJvY2Vzc2luZyBvZiB0aGlzIHRhZyBlbGVtZW50IGlzIG5vdyBmaW5pc2hlZC4KKwkJICovCisJCXB1YmxpYyB2b2lkIGZpbmlzaCgpOworCisJCS8qKgorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGNoaWxkcmVuLgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKKwkJCisJCS8qKgorCQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdGFnIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgSXRlcmF0b3I8RWxlbWVudD4gZ2V0Q2hpbGRyZW4oKTsKKworCQkvKioKKwkJICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgZ2V0Q2RhdGFWYWx1ZSgpIHdvdWxkIHJldHVybiBvay4KKwkJICogQHNlZSAjZ2V0Q2RhdGFWYWx1ZSgpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBoYXNDZGF0YVZhbHVlKCk7CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgY2hpbGQgY2RhdGEgZWxlbWVudC4KKwkJICogCisJCSAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4KKwkJICogb25lIGNoaWxkIG9yIGlmIHRoZXJlIGlzIG9uZSBjaGlsZCBhbmQgaXQgaXMgbm90IGEKKwkJICogY2RhdGEgZWxlbWVudC4KKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q2RhdGFWYWx1ZSgpOworCQkKKwkJLyoqCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRycygpOworCQkKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyIG5hbWVzIGZvciB0aGlzIHRhZworCQkgKi8KKwkJcHVibGljIEl0ZXJhdG9yPFFOYW1lPiBnZXRBdHRyTmFtZXMoKTsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gcXVhbGlmaWVyCisJCSAqIEBwYXJhbSBuYW1lCisJCSAqIEByZXR1cm4gYXR0ciBtYXRjaGluZyBzcGVjaWZpZWQgcGFyYW1ldGVycywgZWxzZSBudWxsLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApOworCisJCS8qKgorCQkgKiBAcGFyYW0gcXVhbGlmaWVyCisJCSAqIEBwYXJhbSBuYW1lCisJCSAqIEBwYXJhbSB2YWx1ZQorCQkgKiBAcmV0dXJuIHRoaXMgdGFnIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICk7CisJCQorCQkvKioKKwkJICogQHBhcmFtIHF1YWxpZmllcgorCQkgKiBAcGFyYW0gbmFtZQorCQkgKiBAcmV0dXJuIGF0dHIgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLCBlbHNlIG51bGwuCisJCSAqLworCQlwdWJsaWMgSW50ZWdlciBnZXRJbnRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApOworCisJCS8qKgorCQkgKiBAcGFyYW0gcXVhbGlmaWVyCisJCSAqIEBwYXJhbSBuYW1lCisJCSAqIEBwYXJhbSB2YWx1ZQorCQkgKiBAcmV0dXJuIHRoaXMgdGFnIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgaW50IHZhbHVlICk7CisJCQorCQkvKioKKwkJICogQHBhcmFtIHF1YWxpZmllcgorCQkgKiBAcGFyYW0gbmFtZQorCQkgKiBAcmV0dXJuIGF0dHIgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLCBlbHNlIG51bGwuCisJCSAqLworCQlwdWJsaWMgTG9uZyBnZXRMb25nQXR0ciggU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUgKTsKKworCQkvKioKKwkJICogQHBhcmFtIHF1YWxpZmllcgorCQkgKiBAcGFyYW0gbmFtZQorCQkgKiBAcGFyYW0gdmFsdWUKKwkJICogQHJldHVybiB0aGlzIHRhZyBlbGVtZW50LgorCQkgKi8KKwkJcHVibGljIFRhZ0VsZW1lbnQgc2V0QXR0ciggU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUgKTsKKworCQkvKioKKwkJICogRmluZHMgdGhlIHRhZyBlbGVtZW50IGdpdmVuIHRoZSBzcGVjaWZpZWQgcGF0aC4gTm90ZSB0aGF0IGl0CisJCSAqIHdpbGwgb25seSBtYXRjaCB0aGUgZmlyc3QgbmFtZWQgZWxlbWVudCBhdCBldmVyeSBzdGVwLgorCQkgKiBAcGFyYW0gcGF0aCBhIHFOYW1lIHBhdGggc3BlY2lmaWVkIGFzIHFOYW1lIXFOYW1lIXFOYW1lLi4uCisJCSAqIEByZXR1cm4gdGhlIHRlcm1pbmFsIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBwYXRoLCBlbHNlIG51bGwuCisJCSAqLworCQlwdWJsaWMgVGFnRWxlbWVudCBmaW5kKCBTdHJpbmcgcGF0aCApOworCisJCS8qKgorCQkgKiBGaW5kcyB0aGUgdGFnIGVsZW1lbnQgdW5kZXIgdGhpcyBvbmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJCSAqIE5vdGUgdGhhdCBpdCB3aWxsIG9ubHkgbWF0Y2ggdGhlIGZpcnN0IG5hbWVkIGVsZW1lbnQuCisJCSAqIEBwYXJhbSBvcXVhbGlmaWVyCisJCSAqIEBwYXJhbSBvbmFtZQorCQkgKiBAcmV0dXJuIHRoZSBuYW1lZCBlbGVtZW50LCBlbHNlIG51bGwuCisJCSAqLworCQlwdWJsaWMgVGFnRWxlbWVudCBmaW5kKCBTdHJpbmcgb3F1YWxpZmllciwgU3RyaW5nIG9uYW1lICk7CisKKwkJLyoqCisJCSAqIEZpbmRzIHRoZSB0YWcgZWxlbWVudCB1bmRlciB0aGlzIG9uZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkJICogTm90ZSB0aGF0IGl0IHdpbGwgb25seSBtYXRjaCB0aGUgZmlyc3QgbmFtZWQgZWxlbWVudC4KKwkJICogQHBhcmFtIHN1YlFOYW1lCisJCSAqIEByZXR1cm4gdGhlIG5hbWVkIGVsZW1lbnQsIGVsc2UgbnVsbC4KKwkJICovCisJCXB1YmxpYyBUYWdFbGVtZW50IGZpbmQoIFFOYW1lIHN1YlFOYW1lICk7CisJfQorCQorCS8qKgorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgVGFnRWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHRUYWdFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50CisJCWltcGxlbWVudHMgVGFnRWxlbWVudAorCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIERlZmF1bHRUYWdFbGVtZW50LgorCQkgKgorCQkgKiBAcGFyYW0gcU5hbWUKKwkJICogQHBhcmFtIGF0dHJzCisJCSAqLworCQlwdWJsaWMgRGVmYXVsdFRhZ0VsZW1lbnQoIFFOYW1lIHFOYW1lLCBNYXA8UU5hbWUsIFN0cmluZz4gYXR0cnMgKQorCQl7CisJCQl0aGlzLnFOYW1lID0gcU5hbWU7CisJCQl0aGlzLmF0dHJzID0gYXR0cnM7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggImNvbnN0cnVjdGVkIERlZmF1bHRUYWdFbGVtZW50KCAiK3FOYW1lKyIgKSIgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIERlZmF1bHRUYWdFbGVtZW50LgorCQkgKgorCQkgKiBAcGFyYW0gcU5hbWUKKwkJICovCisJCXB1YmxpYyBEZWZhdWx0VGFnRWxlbWVudCggUU5hbWUgcU5hbWUgKQorCQl7CisJCQl0aGlzKCBxTmFtZSwgbnVsbCApOworCQl9CisJCQorCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgRGVmYXVsdFRhZ0VsZW1lbnQuCisJCSAqCisJCSAqIEBwYXJhbSBuYW1lCisJCSAqIEBwYXJhbSBhdHRycworCQkgKi8KKwkJcHVibGljIERlZmF1bHRUYWdFbGVtZW50KCBTdHJpbmcgbmFtZSwgTWFwPFFOYW1lLCBTdHJpbmc+IGF0dHJzICkKKwkJeworCQkJdGhpcyggbmV3IFFOYW1lKCBuYW1lICksIGF0dHJzICk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RzIHRoZSBEZWZhdWx0VGFnRWxlbWVudC4KKwkJICoKKwkJICogQHBhcmFtIG5hbWUKKwkJICovCisJCXB1YmxpYyBEZWZhdWx0VGFnRWxlbWVudCggU3RyaW5nIG5hbWUgKQorCQl7CisJCQl0aGlzKCBuZXcgUU5hbWUoIG5hbWUgKSwgbnVsbCApOworCQl9CisKKwkJcHJpdmF0ZSBmaW5hbCBRTmFtZSBxTmFtZTsKKwkJCisJCXByaXZhdGUgTWFwPFFOYW1lLCBTdHJpbmc+IGF0dHJzOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gVGFnRWxlbWVudCBJbXBsZW1lbnRhdGlvbiAvLworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQorCQlwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQorCQl7CisJCQlyZXR1cm4gcU5hbWU7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGFkZENkYXRhKCBTdHJpbmcgY2RhdGEgKQorCQl7CisJCQlhZGQoIG5ldyBEZWZhdWx0Q2RhdGFFbGVtZW50KCBjZGF0YSApICk7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBhZGRUYWcoIFFOYW1lIGNoaWxkUU5hbWUsIE1hcDxRTmFtZSwgU3RyaW5nPiBjaGlsZEF0dHJzICkKKwkJeworCQkJRGVmYXVsdFRhZ0VsZW1lbnQgdGFnRWxlbWVudCA9IG5ldyBEZWZhdWx0VGFnRWxlbWVudCggY2hpbGRRTmFtZSwgY2hpbGRBdHRycyApOworCQkJYWRkKCB0YWdFbGVtZW50ICk7CisJCQlyZXR1cm4gdGFnRWxlbWVudDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGFkZFRhZyggUU5hbWUgY2hpbGRRTmFtZSApCisJCXsKKwkJCXJldHVybiBhZGRUYWcoIGNoaWxkUU5hbWUsIG51bGwgKTsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGFkZFRhZyggU3RyaW5nIGNoaWxkTmFtZSwgTWFwPFFOYW1lLCBTdHJpbmc+IGNoaWxkQXR0cnMgKQorCQl7CisJCQlyZXR1cm4gYWRkVGFnKCBuZXcgUU5hbWUoIGNoaWxkTmFtZSApLCBudWxsICk7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBhZGRUYWcoIFN0cmluZyBjaGlsZE5hbWUgKQorCQl7CisJCQlyZXR1cm4gYWRkVGFnKCBuZXcgUU5hbWUoIGNoaWxkTmFtZSApLCBudWxsICk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoIEVsZW1lbnQgZSApCisJCXsKKwkJCUl0ZXJhdG9yPEVsZW1lbnQ+IGkgPSBnZXRDaGlsZHJlbigpOworCQkJd2hpbGUgKGkuaGFzTmV4dCgpKQorCQkJeworCQkJCWlmIChpLm5leHQoKSA9PSBlKQorCQkJCXsKKwkJCQkJaS5yZW1vdmUoKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIHZvaWQgY2xlYXIoKQorCQl7CisJCQlpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwpCisJCQkJZmlyc3RFbGVtZW50ID0gbnVsbDsKKwkJCQorCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpCisJCQl7CisJCQkJZWxlbWVudHMuY2xlYXIoKTsKKwkJCQllbGVtZW50cyA9IG51bGw7CisJCQl9CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRycygpCisJCXsKKwkJCXJldHVybiBhdHRycyAhPSBudWxsICYmICFhdHRycy5pc0VtcHR5KCk7CisJCX0KKwkJCisJCXB1YmxpYyBJdGVyYXRvcjxRTmFtZT4gZ2V0QXR0ck5hbWVzKCkKKwkJeworCQkJaWYgKGF0dHJzID09IG51bGwpCisJCQkJcmV0dXJuIG5ldyBFbXB0eUl0ZXJhdG9yPFFOYW1lPigpOworCQkJCisJCQlyZXR1cm4gYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCWlmIChhdHRycyA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlyZXR1cm4gYXR0cnMuZ2V0KCBuZXcgUU5hbWUoIHF1YWxpZmllciwgbmFtZSApICk7CisJCX0KKwkJCisJCXB1YmxpYyBUYWdFbGVtZW50IHNldEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQorCQl7CisJCQlpZiAoYXR0cnMgPT0gbnVsbCkKKwkJCQlhdHRycyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBTdHJpbmc+KCk7CisJCQkKKwkJCWF0dHJzLnB1dCggbmV3IFFOYW1lKCBxdWFsaWZpZXIsIG5hbWUgKSwgdmFsdWUgKTsKKwkJCQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCXJldHVybiBxTmFtZS5tYXRjaGVzKCBxdWFsaWZpZXIsIG5hbWUgKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoIFFOYW1lIG90aGVyUU5hbWUgKQorCQl7CisJCQlyZXR1cm4gcU5hbWUubWF0Y2hlcyggb3RoZXJRTmFtZSApOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQorCQl7CisJCQlpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwpCisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCXJldHVybiBlbGVtZW50cyAhPSBudWxsICYmICFlbGVtZW50cy5pc0VtcHR5KCk7CisJCX0KKwkJCisJCXB1YmxpYyBJdGVyYXRvcjxFbGVtZW50PiBnZXRDaGlsZHJlbigpCisJCXsKKwkJCWlmIChmaXJzdEVsZW1lbnQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUl0ZXJhdG9yPEVsZW1lbnQ+KCBmaXJzdEVsZW1lbnQgKTsKKwkJCQorCQkJaWYgKGVsZW1lbnRzID09IG51bGwpCisJCQkJcmV0dXJuIG5ldyBFbXB0eUl0ZXJhdG9yPEVsZW1lbnQ+KCk7CisJCQkKKwkJCXJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOworCQl9CisKKwkJcHVibGljIEl0ZXJhdG9yPEVsZW1lbnQ+IGl0ZXJhdG9yKCkKKwkJeworCQkJcmV0dXJuIGdldENoaWxkcmVuKCk7CisJCX0KKworCQlwdWJsaWMgaW50IGNvdW50Q2hpbGRyZW4oKQorCQl7CisJCQlpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwpCisJCQkJcmV0dXJuIDE7CisJCQkKKwkJCXJldHVybiBlbGVtZW50cyAhPSBudWxsID8gZWxlbWVudHMuc2l6ZSgpIDogMDsKKwkJfQorCisJCXB1YmxpYyBFbGVtZW50IGdldENoaWxkKCBpbnQgaW5kZXggKQorCQl7CisJCQlpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwgJiYgaW5kZXggPT0gMCkKKwkJCQlyZXR1cm4gZmlyc3RFbGVtZW50OworCQkJCisJCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkJCisJCQlyZXR1cm4gZWxlbWVudHMuZ2V0KCBpbmRleCApOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBmaW5pc2goKQorCQl7CisJCQkvLyBub3RoaW5nIHRvIGRvLgorCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDZGF0YVZhbHVlKCkKKwkJeworCQkJaW50IG4gPSBjb3VudENoaWxkcmVuKCk7CisJCQlpZiAobiA9PSAwKQorCQkJCXJldHVybiB0cnVlOworCQkJCisJCQlpZiAobiA+IDEpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlFbGVtZW50IGUgPSBnZXRDaGlsZCggMCApOworCQkJCisJCQlyZXR1cm4gZSBpbnN0YW5jZW9mIENkYXRhRWxlbWVudDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q2RhdGFWYWx1ZSgpCisJCXsKKwkJCWludCBuID0gY291bnRDaGlsZHJlbigpOworCQkJCisJCQlpZiAobiA9PSAwKQorCQkJCXJldHVybiAiIjsKKwkJCQorCQkJaWYgKG4gPiAxKQorCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCAibm90IGp1c3Qgb25lIGNoaWxkIiApOworCQkJCisJCQlFbGVtZW50IGUgPSBnZXRDaGlsZCggMCApOworCQkJCisJCQlpZiAoIShlIGluc3RhbmNlb2YgQ2RhdGFFbGVtZW50KSkKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiggImNoaWxkIG5vdCBjZGF0YSBlbGVtZW50IiApOworCQkJCisJCQlyZXR1cm4gKChDZGF0YUVsZW1lbnQpIGUpLmdldENkYXRhKCk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIGVsZW1lbnQKKwkJICogQHJldHVybiB0aGUgZWxlbWVudCBhZGRlZAorCQkgKi8KKwkJcHVibGljIEVsZW1lbnQgYWRkKCBFbGVtZW50IGVsZW1lbnQgKQorCQl7CisJCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoZmlyc3RFbGVtZW50ID09IG51bGwpCisJCQkJeworCQkJCQlmaXJzdEVsZW1lbnQgPSBlbGVtZW50OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQllbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oIDQgKTsKKwkJCQkJZWxlbWVudHMuYWRkKCBmaXJzdEVsZW1lbnQgKTsKKwkJCQkJZmlyc3RFbGVtZW50ID0gbnVsbDsKKwkJCQkJZWxlbWVudHMuYWRkKCBlbGVtZW50ICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVsZW1lbnRzLmFkZCggZWxlbWVudCApOworCQkJfQorCQkJcmV0dXJuIGVsZW1lbnQ7CisJCX0KKwkJCisJCXByaXZhdGUgTGlzdDxFbGVtZW50PiBlbGVtZW50czsKKwkJCisJCXByaXZhdGUgRWxlbWVudCBmaXJzdEVsZW1lbnQ7CisJCQorCQlwdWJsaWMgdm9pZCB0b1N0cmluZyggV3JpdGVyIHd0ciwgYm9vbGVhbiBuZXdsaW5lQmV0d2VlblRhZ3MsCisJCQlib29sZWFuIGNvbGxhcHNlRW1wdHlUYWdzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCWlmIChoYXNDaGlsZHJlbigpIHx8ICFjb2xsYXBzZUVtcHR5VGFncykKKwkJCXsKKwkJCQkvLyA8dGFnbmFtZSBhdHRycz5jaGlsZHJlbjwvdGFnbmFtZT4KKwkJCQl3dHIud3JpdGUoICc8JyApOworCQkJCXFOYW1lLnRvU3RyaW5nKCB3dHIgKTsKKwkJCQlpZiAoaGFzQXR0cnMoKSkKKwkJCQkJZHVtcEF0dHJzKCB3dHIgKTsKKwkJCQl3dHIud3JpdGUoICc+JyApOworCQkJCWlmIChuZXdsaW5lQmV0d2VlblRhZ3MgJiYgd2FudE5ld2xpbmVCZWZvcmVDaGlsZHJlbigpKQorCQkJCQl3dHIud3JpdGUoIENSTEYgKTsKKwkJCQkKKwkJCQlkdW1wQ2hpbGRyZW4oIHd0ciwgbmV3bGluZUJldHdlZW5UYWdzLCBjb2xsYXBzZUVtcHR5VGFncyApOworCQkJCQorCQkJCXd0ci53cml0ZSggIjwvIiApOworCQkJCXFOYW1lLnRvU3RyaW5nKCB3dHIgKTsKKwkJCQl3dHIud3JpdGUoICc+JyApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIDx0YWduYW1lIGF0dHJzLz4KKwkJCQl3dHIud3JpdGUoICc8JyApOworCQkJCXFOYW1lLnRvU3RyaW5nKCB3dHIgKTsKKwkJCQlpZiAoaGFzQXR0cnMoKSkKKwkJCQkJZHVtcEF0dHJzKCB3dHIgKTsKKwkJCQl3dHIud3JpdGUoICIvPiIgKTsKKwkJCX0KKwkJCQorCQkJaWYgKG5ld2xpbmVCZXR3ZWVuVGFncykKKwkJCQl3dHIud3JpdGUoIENSTEYgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBib29sZWFuIHdhbnROZXdsaW5lQmVmb3JlQ2hpbGRyZW4oKQorCQl7CisJCQkvLyB3ZSB3YW50IG5ld2xpbmUgdW5sZXNzIHRoZXJlIGFyZSBubyBjaGlsZHJlbgorCQkJLy8gb3Igb25seSBhIHNpbmdsZSBjaGlsZCBhbmQgdGhlIGNoaWxkIGlzIGEKKwkJCS8vIGNkYXRhLgorCQkJCisJCQlpbnQgbiA9IGNvdW50Q2hpbGRyZW4oKTsKKwkJCQorCQkJaWYgKG4gPiAxKQorCQkJCXJldHVybiB0cnVlOworCQkJCisJCQlpZiAobiA9PSAwKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJcmV0dXJuICEoZ2V0Q2hpbGQoIDAgKSBpbnN0YW5jZW9mIENkYXRhRWxlbWVudCk7CisJCX0KKwkJCisJCXByaXZhdGUgdm9pZCBkdW1wQXR0cnMoIFdyaXRlciB3dHIgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJZm9yIChNYXAuRW50cnk8UU5hbWUsIFN0cmluZz4gbWUgOiBhdHRycy5lbnRyeVNldCgpKQorCQkJeworCQkJCVFOYW1lIHFuID0gbWUuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gbWUuZ2V0VmFsdWUoKTsKKwkJCQkKKwkJCQl3dHIud3JpdGUoICcgJyApOworCQkJCXFuLnRvU3RyaW5nKCB3dHIgKTsKKwkJCQl3dHIud3JpdGUoICI9XCIiICk7CisJCQkJUHJvdGVjdEF0dHJWYWx1ZS53cml0ZSggd3RyLCB2YWx1ZSApOworCQkJCXd0ci53cml0ZSggJyInICk7CisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgZHVtcENoaWxkcmVuKCBXcml0ZXIgd3RyLCBib29sZWFuIG5ld2xpbmVCZXR3ZWVuVGFncywKKwkJCWJvb2xlYW4gY29sbGFwc2VFbXB0eVRhZ3MgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJZm9yIChFbGVtZW50IGUgOiB0aGlzKQorCQkJCWUudG9TdHJpbmcoIHd0ciwgbmV3bGluZUJldHdlZW5UYWdzLCBjb2xsYXBzZUVtcHR5VGFncyApOworCQl9CisKKwkJcHVibGljIFRhZ0VsZW1lbnQgZmluZCggU3RyaW5nIHBhdGggKQorCQl7CisJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBwYXRoLCAiISIgKTsKKwkJCVRhZ0VsZW1lbnQgZSA9IHRoaXM7CisJCQl3aGlsZSAoZSAhPSBudWxsICYmIHN0Lmhhc01vcmVUb2tlbnMoKSkKKwkJCXsKKwkJCQlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKKwkJCQlRTmFtZSBzdWJRTmFtZSA9IG5ldyBRTmFtZSggdG9rZW4gKTsKKwkJCQllID0gZS5maW5kKCBzdWJRTmFtZSApOworCQkJfQorCQkJcmV0dXJuIGU7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBmaW5kKCBTdHJpbmcgb3F1YWxpZmllciwgU3RyaW5nIG9uYW1lICkKKwkJeworCQkJZm9yIChFbGVtZW50IGU6IHRoaXMpCisJCQl7CisJCQkJaWYgKGUgaW5zdGFuY2VvZiBUYWdFbGVtZW50KQorCQkJCXsKKwkJCQkJVGFnRWxlbWVudCB0ZSA9IChUYWdFbGVtZW50KSBlOworCQkJCQlpZiAodGUubWF0Y2hlcyggb3F1YWxpZmllciwgb25hbWUgKSkKKwkJCQkJCXJldHVybiB0ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGZpbmQoIFFOYW1lIHN1YlFOYW1lICkKKwkJeworCQkJZm9yIChFbGVtZW50IGU6IHRoaXMpCisJCQl7CisJCQkJaWYgKGUgaW5zdGFuY2VvZiBUYWdFbGVtZW50KQorCQkJCXsKKwkJCQkJVGFnRWxlbWVudCB0ZSA9IChUYWdFbGVtZW50KSBlOworCQkJCQlpZiAodGUubWF0Y2hlcyggc3ViUU5hbWUgKSkKKwkJCQkJCXJldHVybiB0ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBJbnRlZ2VyIGdldEludEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICkKKwkJeworCQkJU3RyaW5nIHMgPSBnZXRBdHRyKCBxdWFsaWZpZXIsIG5hbWUgKTsKKwkJCQorCQkJaWYgKHMgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCQorCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKCBzICk7CisJCX0KKwkJCisJCXB1YmxpYyBUYWdFbGVtZW50IHNldEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUgKQorCQl7CisJCQlyZXR1cm4gc2V0QXR0ciggcXVhbGlmaWVyLCBuYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKCB2YWx1ZSApICk7CisJCX0KKworCQlwdWJsaWMgTG9uZyBnZXRMb25nQXR0ciggU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUgKQorCQl7CisJCQlTdHJpbmcgcyA9IGdldEF0dHIoIHF1YWxpZmllciwgbmFtZSApOworCQkJCisJCQlpZiAocyA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlyZXR1cm4gbmV3IExvbmcoIHMgKTsKKwkJfQorCQkKKwkJcHVibGljIFRhZ0VsZW1lbnQgc2V0QXR0ciggU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUgKQorCQl7CisJCQlyZXR1cm4gc2V0QXR0ciggcXVhbGlmaWVyLCBuYW1lLCBMb25nLnRvU3RyaW5nKCB2YWx1ZSApICk7CisJCX0KKwl9CisJCisJLyoqCisJICogU3ViY2xhc3Mgb2YgRGVmYXVsdFRhZ0VsZW1lbnQgZm9yIHJvb3QgdGFncy4gTmVlZGVkIHRvIHB1dAorCSAqIG91dCB4bWwgdmVyc2lvbiB0YWcgcHJlZml4IG9uIHRvU3RyaW5nLCBldGMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBSb290VGFnRWxlbWVudCBleHRlbmRzIERlZmF1bHRUYWdFbGVtZW50CisJeworCQkvKioKKwkJICogQHBhcmFtIHFOYW1lCisJCSAqIEBwYXJhbSBhdHRycworCQkgKi8KKwkJcHVibGljIFJvb3RUYWdFbGVtZW50KCBRTmFtZSBxTmFtZSwgTWFwPFFOYW1lLCBTdHJpbmc+IGF0dHJzICkKKwkJeworCQkJc3VwZXIoIHFOYW1lLCBhdHRycyApOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBxTmFtZQorCQkgKi8KKwkJcHVibGljIFJvb3RUYWdFbGVtZW50KCBRTmFtZSBxTmFtZSApCisJCXsKKwkJCXN1cGVyKCBxTmFtZSApOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBuYW1lCisJCSAqIEBwYXJhbSBhdHRycworCQkgKi8KKwkJcHVibGljIFJvb3RUYWdFbGVtZW50KCBTdHJpbmcgbmFtZSwgTWFwPFFOYW1lLCBTdHJpbmc+IGF0dHJzICkKKwkJeworCQkJc3VwZXIoIG5hbWUsIGF0dHJzICk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIG5hbWUKKwkJICovCisJCXB1YmxpYyBSb290VGFnRWxlbWVudCggU3RyaW5nIG5hbWUgKQorCQl7CisJCQlzdXBlciggbmFtZSApOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCB0b1N0cmluZyggV3JpdGVyIHd0ciwgYm9vbGVhbiBuZXdsaW5lQmV0d2VlblRhZ3MsCisJCQlib29sZWFuIGNvbGxhcHNlRW1wdHlUYWdzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCS8vIFRPRE8gZ2V0IHByb3BlciBlbmNvZGluZyBmcm9tIHNvbWV3aGVyZQorCQkJd3RyLndyaXRlKCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiApOworCQkJd3RyLndyaXRlKCBDUkxGICk7CisJCQlzdXBlci50b1N0cmluZyggd3RyLCBuZXdsaW5lQmV0d2VlblRhZ3MsIGNvbGxhcHNlRW1wdHlUYWdzICk7CisJCX0KKwl9CisJCisJLyoqCisJICogRGVzY3JpcHRpb24gb2YgUU5hbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFFOYW1lCisJeworCQkvKioKKwkJICogQHBhcmFtIHF1YWxpZmllcgorCQkgKiBAcGFyYW0gbmFtZQorCQkgKi8KKwkJcHVibGljIFFOYW1lKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCXRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyOworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCAiY29uc3RydWN0ZWQgUU5hbWUoICIrdGhpcysiICkiICk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIHFOYW1lCisJCSAqLworCQlwdWJsaWMgUU5hbWUoIFN0cmluZyBxTmFtZSApCisJCXsKKwkJCVN0cmluZ1tdIHggPSBTdHJpbmdVdGlsLmxlZnRTcGxpdCggcU5hbWUsICc6JyApOworCQkJaWYgKHggIT0gbnVsbCkKKwkJCXsKKwkJCQlxdWFsaWZpZXIgPSB4WzBdOworCQkJCW5hbWUgPSB4WzFdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXF1YWxpZmllciA9IG51bGw7CisJCQkJbmFtZSA9IHFOYW1lOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIERlc2NyaXB0aW9uIG9mIHF1YWxpZmllcgorCQkgKi8KKwkJcHVibGljIGZpbmFsIFN0cmluZyBxdWFsaWZpZXI7CisJCQorCQkvKioKKwkJICogRGVzY3JpcHRpb24gb2YgbmFtZQorCQkgKi8KKwkJcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOworCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBvcXVhbGlmaWVyCisJCSAqIEBwYXJhbSBvbmFtZQorCQkgKiBAcmV0dXJuIHRydWUgaWYgb3F1YWxpZmllciBhbmQgb25hbWUgbWF0Y2ggdXMKKwkJICovCisJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoIFN0cmluZyBvcXVhbGlmaWVyLCBTdHJpbmcgb25hbWUgKQorCQl7CisJCQlyZXR1cm4gbWF0Y2hlcyggb3F1YWxpZmllciwgcXVhbGlmaWVyLCBvbmFtZSwgbmFtZSApOworCQl9CisJCQorCQkvKioKKwkJICogQHBhcmFtIG90aGVyCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiBvdGhlciBtYXRjaGVzIHVzLgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyggUU5hbWUgb3RoZXIgKQorCQl7CisJCQlyZXR1cm4gbWF0Y2hlcyggb3RoZXIucXVhbGlmaWVyLCBxdWFsaWZpZXIsIG90aGVyLm5hbWUsIG5hbWUgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBxdWFsaWZpZXIxCisJCSAqIEBwYXJhbSBxdWFsaWZpZXIyCisJCSAqIEBwYXJhbSBuYW1lMQorCQkgKiBAcGFyYW0gbmFtZTIKKwkJICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWFsaWZpZXJzIG1hdGNoIGVhY2ggb3RoZXIgYW5kIHRoZSBuYW1lcyBtYXRjaAorCQkgKiBlYWNoIG90aGVyLgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoIFN0cmluZyBxdWFsaWZpZXIxLCBTdHJpbmcgcXVhbGlmaWVyMiwKKwkJCVN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyICkKKwkJeworCQkJcmV0dXJuIFN0cmluZ1V0aWwuZXF1YWxzKCBxdWFsaWZpZXIxLCBxdWFsaWZpZXIyKSAmJgorCQkJCVN0cmluZ1V0aWwuZXF1YWxzKCBuYW1lMSwgbmFtZTIgKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkKKwkJeworCQkJLy8gbXVzdCBtYXRjaCB0aGUgdXNhZ2Ugb2YgU3RyaW5nVXRpbC5lcXVhbHMgYWJvdmUuCisJCQlyZXR1cm4gU3RyaW5nVXRpbC5oYXNoQ29kZSggcXVhbGlmaWVyICkgXiBTdHJpbmdVdGlsLmhhc2hDb2RlKCBuYW1lICk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKCBPYmplY3Qgb2JqICkKKwkJeworCQkJaWYgKG9iaiA9PSB0aGlzKQorCQkJCXJldHVybiB0cnVlOworCQkJCisJCQlpZiAob2JqID09IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlpZiAob2JqLmdldENsYXNzKCkgIT0gUU5hbWUuY2xhc3MpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlRTmFtZSBvdGhlciA9IChRTmFtZSkgb2JqOworCQkJCisJCQlyZXR1cm4gbWF0Y2hlcyggcXVhbGlmaWVyLCBvdGhlci5xdWFsaWZpZXIsIG5hbWUsIG90aGVyLm5hbWUgKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJU3RyaW5nV3JpdGVyIHd0ciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJCQl0b1N0cmluZyggd3RyICk7CisJCQkJcmV0dXJuIHd0ci50b1N0cmluZygpOworCQkJfQorCQkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggImNhdWdodCBleGNlcHRpb24iLCBlICk7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gd3RyCisJCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkJICovCisJCXB1YmxpYyB2b2lkIHRvU3RyaW5nKCBXcml0ZXIgd3RyICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCWlmIChxdWFsaWZpZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQl3dHIud3JpdGUoIHF1YWxpZmllciApOworCQkJCXd0ci53cml0ZSggJzonICk7CisJCQl9CisJCQl3dHIud3JpdGUoIG5hbWUgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBxdWFsaWZpZXIKKwkJICogQHBhcmFtIG5hbWUKKwkJICogQHJldHVybiBwcmludGFibGUgZm9ybSBvZiBhIHF1YWxpZmllZCBuYW1lCisJCSAqLworCQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyggU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUgKQorCQl7CisJCQlpZiAocXVhbGlmaWVyICE9IG51bGwpCisJCQkJcmV0dXJuIHF1YWxpZmllcisnOicrbmFtZTsKKwkJCXJldHVybiBuYW1lOworCQl9CisJfQorCQorCS8qKgorCSAqIAorCSAqLworCWFic3RyYWN0IHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdGVjdEJhc2UgZXh0ZW5kcyBXcml0ZXIKKwl7CisJCS8qKgorCQkgKiBAcGFyYW0gd3RyCisJCSAqLworCQlwdWJsaWMgUHJvdGVjdEJhc2UoIFdyaXRlciB3dHIgKQorCQl7CisJCQl0aGlzLnd0ciA9IHd0cjsKKwkJfQorCQkKKwkJLyoqCisJCSAqIERlc2NyaXB0aW9uIG9mIHd0cgorCQkgKi8KKwkJcHJvdGVjdGVkIGZpbmFsIFdyaXRlciB3dHI7CisJCQorCQkvKioKKwkJICogCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVCA9ICImbHQ7IjsKKwkJCisJCS8qKgorCQkgKiAKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdUID0gIiZndDsiOworCQkKKwkJLyoqCisJCSAqIAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QID0gIiZhbXA7IjsKKwkJCisJCS8qKgorCQkgKiAKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1QgPSAiJnF1b3Q7IjsKKwkJCisJCS8qKgorCQkgKiAKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICImIzk7IjsKKwkJCisJCS8qKgorCQkgKiAKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gIiYjMTM7IjsKKwkJCisJCS8qKgorCQkgKiAKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExGID0gIiYjMTA7IjsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xvc2UoKQorCQl7CisJCQkvLyBpZ25vcmUuCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgZmx1c2goKQorCQl7CisJCQkvLyBpZ25vcmUuCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgd3JpdGUoIGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJd3JpdGUoIGNidWZbb2ZmK2ldICk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgd3JpdGUoIFN0cmluZyBzdHIsIGludCBvZmYsIGludCBsZW4gKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQl3cml0ZSggc3RyLmNoYXJBdCggb2ZmK2kgKSApOworCQl9CisKKwkJQE92ZXJyaWRlCisJCWFic3RyYWN0IHB1YmxpYyB2b2lkIHdyaXRlKCBpbnQgYyApIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCQkvKioKKwkJICogV3JpdGVzIGEgY2hhcmFjdGVyIHRoZSBub3JtYWwgd2F5OiBhc2NpaSBjaGFyYWN0ZXIgcmFuZ2UKKwkJICogKDksIDEwLCAxMywgMzItMTI2KSBpcyBwdXQgb3V0IGFzIGl0c2VsZiwgd2hpbGUgYW55IG90aGVyCisJCSAqIGNoYXJhY3RlcnMgYXJlIHB1dCBvdXQgYXMgJiNubm5ubjsKKwkJICogQHBhcmFtIHd0cgorCQkgKiBAcGFyYW0gYworCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJCSAqLworCQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVmYXVsdFdyaXRlKCBXcml0ZXIgd3RyLCBpbnQgYyApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQlpZiAoYyA+PSAzMiAmJiBjIDw9IDEyNikKKwkJCXsKKwkJCQl3dHIud3JpdGUoIGMgKTsgLy8gcHJpbnRhYmxlIGFzY2lpIGlzIG9rCisJCQl9CisJCQllbHNlIGlmIChjID09ICdcdCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKKwkJCXsKKwkJCQl3dHIud3JpdGUoIGMgKTsgLy8gdGFiLCBsaW5lZmVlZCwgYW5kIGNhcnJpYWdlIHJldHVybiBhcmUgb2suCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJd3RyLndyaXRlKCAiJiMiICk7CisJCQkJd3RyLndyaXRlKCBJbnRlZ2VyLnRvU3RyaW5nKCBjICkgKTsKKwkJCQl3dHIud3JpdGUoICc7JyApOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIAorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdGVjdEF0dHJWYWx1ZSBleHRlbmRzIFByb3RlY3RCYXNlCisJeworCQkvKioKKwkJICogQHBhcmFtIHd0cgorCQkgKi8KKwkJcHVibGljIFByb3RlY3RBdHRyVmFsdWUoIFdyaXRlciB3dHIgKQorCQl7CisJCQlzdXBlciggd3RyICk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgd3JpdGUoIGludCBjICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCXdyaXRlKCB3dHIsIGMgKTsKKwkJfQorCisJCS8qKgorCQkgKiBAcGFyYW0gd3RyCisJCSAqIEBwYXJhbSBzCisJCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZSggV3JpdGVyIHd0ciwgU3RyaW5nIHMgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJaW50IG4gPSBzLmxlbmd0aCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJd3JpdGUoIHd0ciwgcy5jaGFyQXQoIGkgKSApOworCQl9CisJCQorCQkvKioKKwkJICogQHBhcmFtIHMgYW4gYXR0cmlidXRlIG5hbWUgd2hpY2ggbWlnaHQgaGF2ZSBzcGVjaWFsIGNoYXJhY3RlcnMuCisJCSAqIEByZXR1cm4gdGhlIHN0cmluZyBwcm90ZWN0ZWQgYXMgYXBwcm9wcmlhdGUgZm9yIGFuCisJCSAqIGF0dHJpYnV0ZS4KKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoIFN0cmluZyBzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJCXdyaXRlKCBzdywgcyApOworCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gd3RyCisJCSAqIEBwYXJhbSBjCisJCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZSggV3JpdGVyIHd0ciwgaW50IGMgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJc3dpdGNoIChjKQorCQkJeworCQkJCWNhc2UgJzwnOgorCQkJCQl3dHIud3JpdGUoIExUICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJz4nOgorCQkJCQl3dHIud3JpdGUoIEdUICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyYnOgorCQkJCQl3dHIud3JpdGUoIEFNUCApOworCQkJCQlicmVhazsKKwkJCQljYXNlICciJzoKKwkJCQkJd3RyLndyaXRlKCBRVU9UICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1x0JzoKKwkJCQkJd3RyLndyaXRlKCBUQUIgKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXHInOgorCQkJCQl3dHIud3JpdGUoIENSICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xuJzoKKwkJCQkJd3RyLndyaXRlKCBMRiApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlkZWZhdWx0V3JpdGUoIHd0ciwgYyApOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlmaW5hbCBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3RlY3RDRGF0YSBleHRlbmRzIFByb3RlY3RCYXNlCisJeworCQkvKioKKwkJICogQHBhcmFtIHd0cgorCQkgKi8KKwkJcHVibGljIFByb3RlY3RDRGF0YSggV3JpdGVyIHd0ciApCisJCXsKKwkJCXN1cGVyKCB3dHIgKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCB3cml0ZSggaW50IGMgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJd3JpdGUoIHd0ciwgYyApOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSB3dHIKKwkJICogQHBhcmFtIHMKKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKCBXcml0ZXIgd3RyLCBTdHJpbmcgcyApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQlpbnQgbiA9IHMubGVuZ3RoKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCQl3cml0ZSggd3RyLCBzLmNoYXJBdCggaSApICk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gcyBhbiBhdHRyaWJ1dGUgbmFtZSB3aGljaCBtaWdodCBoYXZlIHNwZWNpYWwgY2hhcmFjdGVycy4KKwkJICogQHJldHVybiB0aGUgc3RyaW5nIHByb3RlY3RlZCBhcyBhcHByb3ByaWF0ZSBmb3IgYW4KKwkJICogYXR0cmlidXRlLgorCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJCSAqLworCQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyggU3RyaW5nIHMgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJd3JpdGUoIHN3LCBzICk7CisJCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSB3dHIKKwkJICogQHBhcmFtIGMKKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKCBXcml0ZXIgd3RyLCBpbnQgYyApIHRocm93cyBJT0V4Y2VwdGlvbgorCQl7CisJCQlzd2l0Y2ggKGMpCisJCQl7CisJCQkJY2FzZSAnPCc6CisJCQkJCXd0ci53cml0ZSggTFQgKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnPic6CisJCQkJCXd0ci53cml0ZSggR1QgKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnJic6CisJCQkJCXd0ci53cml0ZSggQU1QICk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWRlZmF1bHRXcml0ZSggd3RyLCBjICk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1BlcmZCYXNpY3MuamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9QZXJmQmFzaWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NjBmMgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9QZXJmQmFzaWNzLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQmFzaWMgcGVyZiB0ZXN0cy4KKyAqLworcHVibGljIGNsYXNzIFBlcmZCYXNpY3MKK3sKKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlmaW5hbCBpbnQgdGltZSA9IDE1OworCQlmaW5hbCBpbnQgY291bnQgPSAxOworCQkKKy8vCQluZXcgUGVyZlRlc3QoICJudWxsIiwgdGltZSwgY291bnQgKQorLy8JCXsKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyB2b2lkIHJ1biggbG9uZyBuICkgdGhyb3dzIEV4Y2VwdGlvbgorLy8JCQl7CisvLwkJCQl3aGlsZSAobi0tID4gMCk7CisvLwkJCX0KKy8vCQl9LnJ1bigpOworCQkKKy8vCQluZXcgUGVyZlRlc3QoICJhZGQiLCB0aW1lLCBjb3VudCApCisvLwkJeworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHVibGljIHZvaWQgcnVuKCBsb25nIG4gKSB0aHJvd3MgRXhjZXB0aW9uCisvLwkJCXsKKy8vCQkJCWludCB4ID0gMDsKKy8vCQkJCXdoaWxlIChuLS0gPiAwKQorLy8JCQkJCXggKz0gMTsKKy8vCQkJfQorLy8JCX0ucnVuKCk7CisJCQorLy8JCW5ldyBQZXJmVGVzdCggImZ1bmMiLCB0aW1lLCBjb3VudCApCisvLwkJeworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHVibGljIHZvaWQgcnVuKCBsb25nIG4gKSB0aHJvd3MgRXhjZXB0aW9uCisvLwkJCXsKKy8vCQkJCXdoaWxlIChuLS0gPiAwKQorLy8JCQkJCWZ1bmMoKTsKKy8vCQkJfQorLy8JCX0ucnVuKCk7CisJCQorLy8JCW5ldyBQZXJmVGVzdCggInNmdW5jIiwgdGltZSwgY291bnQgKQorLy8JCXsKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyB2b2lkIHJ1biggbG9uZyBuICkgdGhyb3dzIEV4Y2VwdGlvbgorLy8JCQl7CisvLwkJCQl3aGlsZSAobi0tID4gMCkKKy8vCQkJCQlzZnVuYygpOworLy8JCQl9CisvLwkJfS5ydW4oKTsKKwkJCisvLwkJbmV3IFBlcmZUZXN0KCAiYWRkV2l0aFRyeSIsIHRpbWUsIGNvdW50ICkKKy8vCQl7CisvLwkJCUBPdmVycmlkZQorLy8JCQlwdWJsaWMgdm9pZCBydW4oIGxvbmcgbiApIHRocm93cyBFeGNlcHRpb24KKy8vCQkJeworLy8JCQkJaW50IHggPSAwOworLy8JCQkJd2hpbGUgKG4tLSA+IDApCisvLwkJCQl7CisvLwkJCQkJdHJ5CisvLwkJCQkJeworLy8JCQkJCQl4ICs9IDE7CisvLwkJCQkJfQorLy8JCQkJCWNhdGNoICggRXhjZXB0aW9uIGUgKQorLy8JCQkJCXsKKy8vCQkJCQkJLy8gZG8gbm90aGluZy4KKy8vCQkJCQl9CisvLwkJCQl9CisvLwkJCX0KKy8vCQl9LnJ1bigpOworCQkKKwkJZmluYWwgU3RyaW5nIGsxID0gImEiOworCQlmaW5hbCBTdHJpbmcgazIgPSAiYiI7CisJCWZpbmFsIFN0cmluZyBrMyA9ICJjIjsKKwkJZmluYWwgU3RyaW5nIGs0ID0gImQiOworCQkKKwkJZmluYWwgU3RyaW5nIHYxID0gIjEiOworCQlmaW5hbCBTdHJpbmcgdjIgPSAiMiI7CisJCWZpbmFsIFN0cmluZyB2MyA9ICIzIjsKKwkJCisJCW5ldyBQZXJmVGVzdCggImdldEhpdCIsIHRpbWUsIGNvdW50ICkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oIGxvbmcgbiApIHRocm93cyBFeGNlcHRpb24KKwkJCXsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCQlkLnB1dCggazEsIHYxICk7CisJCQkJZC5wdXQoIGsyLCB2MiApOworCQkJCWQucHV0KCBrMywgdjMgKTsKKwkJCQl3aGlsZSAobi0tID4gMCkKKwkJCQkJZC5nZXQoIGsxICk7CisJCQl9CisJCX0ucnVuKCk7CisJCQorCQluZXcgUGVyZlRlc3QoICJnZXRNaXNzIiwgdGltZSwgY291bnQgKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1biggbG9uZyBuICkgdGhyb3dzIEV4Y2VwdGlvbgorCQkJeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJCWQucHV0KCBrMSwgdjEgKTsKKwkJCQlkLnB1dCggazIsIHYyICk7CisJCQkJZC5wdXQoIGszLCB2MyApOworCQkJCXdoaWxlIChuLS0gPiAwKQorCQkJCQlkLmdldCggazQgKTsKKwkJCX0KKwkJfS5ydW4oKTsKKwl9CisJCisJLyoqCisJICogCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGZ1bmMoKQorCXsKKwkJLy8gbm90aGluZyB0byBkby4KKwl9CisJCisJLyoqCisJICogCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzZnVuYygpCisJeworCQkvLyBub3RoaW5nIHRvIGRvLgorCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UZXN0QWxhcm1NYW5hZ2VyLmphdmEgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVGVzdEFsYXJtTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjFkZTIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVGVzdEFsYXJtTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDI2IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKiogVGVzdCBvZiBBbGFybU1hbmFnZXIgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QWxhcm1NYW5hZ2VyCit7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFExID0gNTA7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUTIgPSAxMDA7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUTMgPSAxNTA7CisJCisJcHJpdmF0ZSBmaW5hbCBPYmplY3QgczEgPSBuZXcgT2JqZWN0KCk7CisJCisJcHJpdmF0ZSBmaW5hbCBPYmplY3QgczIgPSBuZXcgT2JqZWN0KCk7CisJCisJcHJpdmF0ZSBmaW5hbCBNeUFsYXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTXlBbGFybUxpc3RlbmVyKCAwICk7CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN0YXJ0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKwkJYXNzZXJ0RmFsc2UoIGFtLmlzU3RhcnRlZCgpICk7CisJCWFtLnN0YXJ0KCk7CisJCWFzc2VydFRydWUoIGFtLmlzU3RhcnRlZCgpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBzdGFydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBhbHJlYWR5IHN0YXJ0ZWQKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQlhc3NlcnRGYWxzZSggYW0uaXNTdGFydGVkKCkgKTsKKwkJYW0uc3RhcnQoKTsKKwkJYXNzZXJ0VHJ1ZSggYW0uaXNTdGFydGVkKCkgKTsKKwkJYW0uc3RhcnQoKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHN0b3AxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gaXMgbm90IHN0YXJ0ZWQKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQlhc3NlcnRGYWxzZSggYW0uaXNTdGFydGVkKCkgKTsKKwkJYW0uc3RvcCgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RvcDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisJCWFzc2VydEZhbHNlKCBhbS5pc1N0YXJ0ZWQoKSApOworCQlhbS5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBhbS5pc1N0YXJ0ZWQoKSApOworCQlhbS5zdG9wKCk7CisJCWFzc2VydEZhbHNlKCBhbS5pc1N0YXJ0ZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN0YXRpYzEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBbGFybU1hbmFnZXIuc2h1dGRvd24oKTsKKwkJCisJCWFzc2VydE51bGwoIEFsYXJtTWFuYWdlci5nZXRBbGFybU1hbmFnZXIoIGZhbHNlICkgKTsKKwkJYXNzZXJ0TnVsbCggQWxhcm1NYW5hZ2VyLmdldEFsYXJtTWFuYWdlciggZmFsc2UgKSApOworCQkKKwkJQWxhcm1NYW5hZ2VyIGFtMSA9IEFsYXJtTWFuYWdlci5nZXRBbGFybU1hbmFnZXIoIHRydWUgKTsKKwkJYXNzZXJ0Tm90TnVsbCggYW0xICk7CisJCWFzc2VydFRydWUoIGFtMS5pc1N0YXJ0ZWQoKSApOworCQkKKwkJQWxhcm1NYW5hZ2VyIGFtMiA9IEFsYXJtTWFuYWdlci5nZXRBbGFybU1hbmFnZXIoIHRydWUgKTsKKwkJYXNzZXJ0U2FtZSggYW0yLCBhbTEgKTsKKwkJYXNzZXJ0VHJ1ZSggYW0xLmlzU3RhcnRlZCgpICk7CisJCQorCQlBbGFybU1hbmFnZXIuc2h1dGRvd24oKTsKKwkJYXNzZXJ0RmFsc2UoIGFtMS5pc1N0YXJ0ZWQoKSApOworCQlhc3NlcnROdWxsKCBBbGFybU1hbmFnZXIuZ2V0QWxhcm1NYW5hZ2VyKCBmYWxzZSApICk7CisJCQorCQlBbGFybU1hbmFnZXIuc2h1dGRvd24oKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxpc3RlbmVyMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggMCwgbGlzdGVuZXIuZGVsYXkgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKworCQlsaXN0ZW5lci53YWtldXAoIG51bGwsIG51bGwsIDEyMzQ1ICk7CisJCWFzc2VydEVxdWFscyggMCwgbGlzdGVuZXIuZGVsYXkgKTsKKwkJYXNzZXJ0VHJ1ZSggbGlzdGVuZXIud2FrZS5nZXQoKSApOworCQlhc3NlcnROdWxsKCBsaXN0ZW5lci5zdGF0ZSApOworCQkKKwkJbGlzdGVuZXIud2FrZXVwKCBudWxsLCBzMSwgMjM0NTYgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBsaXN0ZW5lci5kZWxheSApOworCQlhc3NlcnRUcnVlKCBsaXN0ZW5lci53YWtlLmdldCgpICk7CisJCWFzc2VydFNhbWUoIHMxLCBsaXN0ZW5lci5zdGF0ZSApOworCisJCU15QWxhcm1MaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTXlBbGFybUxpc3RlbmVyKCAxICk7CisJCWFzc2VydEVxdWFscyggMSwgbGlzdGVuZXIxLmRlbGF5ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBhZGQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gaXMgbm90IHN0YXJ0ZWQKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQkKKwkJYW0uYWRkKCBsaXN0ZW5lciwgbnVsbCwgUTEgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgYWRkMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGxpc3RlbmVyID09IG51bGwKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQlhbS5zdGFydCgpOworCQkKKwkJYW0uYWRkKCBudWxsLCBudWxsLCBRMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgYWRkMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGRlbGF5IDw9IDAKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQlhbS5zdGFydCgpOworCQkKKwkJYW0uYWRkKCBsaXN0ZW5lciwgbnVsbCwgLTEgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisJCWFtLnN0YXJ0KCk7CisKKwkJYW0uYWRkKCBsaXN0ZW5lciwgbnVsbCwgUTEgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKworCQlUaHJlYWQuc2xlZXAoIFEyICk7CisJCWFzc2VydFRydWUoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZDUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisJCWFtLnN0YXJ0KCk7CisKKwkJYW0uYWRkKCBsaXN0ZW5lciwgczEsIFExICk7CisJCWFzc2VydEZhbHNlKCBsaXN0ZW5lci53YWtlLmdldCgpICk7CisJCWFzc2VydE51bGwoIGxpc3RlbmVyLnN0YXRlICk7CisKKwkJVGhyZWFkLnNsZWVwKCBRMiApOworCQlhc3NlcnRUcnVlKCBsaXN0ZW5lci53YWtlLmdldCgpICk7CisJCWFzc2VydFNhbWUoIHMxLCBsaXN0ZW5lci5zdGF0ZSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKwkJYW0uc3RhcnQoKTsKKworCQlhbS5hZGQoIGxpc3RlbmVyLCBzMSwgUTMgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKworCQlhbS5hZGQoIGxpc3RlbmVyLCBzMiwgUTEgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKworCQlUaHJlYWQuc2xlZXAoIFEyICk7CisJCWFzc2VydFRydWUoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0U2FtZSggczIsIGxpc3RlbmVyLnN0YXRlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGQ3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQlhbS5zdGFydCgpOworCisJCWxpc3RlbmVyLmV4Y3AgPSB0cnVlOworCQlhbS5hZGQoIGxpc3RlbmVyLCBzMSwgUTEgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKworCQlUaHJlYWQuc2xlZXAoIFEyICk7CisJCWFzc2VydFRydWUoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0U2FtZSggczEsIGxpc3RlbmVyLnN0YXRlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCByZW1vdmUxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gaXMgbm90IHN0YXJ0ZWQKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQkKKwkJYW0ucmVtb3ZlKCBsaXN0ZW5lciApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcmVtb3ZlMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKwkJYW0uc3RhcnQoKTsKKwkJCisJCWFtLnJlbW92ZSggbGlzdGVuZXIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlbW92ZTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBbGFybU1hbmFnZXIgYW0gPSBuZXcgQWxhcm1NYW5hZ2VyKCk7CisJCWFtLnN0YXJ0KCk7CisKKwkJYW0uYWRkKCBsaXN0ZW5lciwgbnVsbCwgUTEgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKwkJCisJCWFtLnJlbW92ZSggbGlzdGVuZXIgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKwkJCisJCVRocmVhZC5zbGVlcCggUTIgKTsKKwkJYXNzZXJ0RmFsc2UoIGxpc3RlbmVyLndha2UuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggbGlzdGVuZXIuc3RhdGUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZXBlYXQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQlhbS5zdGFydCgpOworCQkKKwkJbGlzdGVuZXIuZGVsYXkgPSBRMjsKKwkJYW0uYWRkKCBsaXN0ZW5lciwgbnVsbCwgUTIgKTsKKwkJCisJCWxpc3RlbmVyLndha2Uud2FpdFVudGlsRXFBbmRTZXQoIHRydWUsIFEzLCBmYWxzZSApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggImR1ZTAgPSAlZFxuIiwgbGlzdGVuZXIuZHVlICk7CisJCWxvbmcgdDAgPSBsaXN0ZW5lci5kdWU7CisJCQorCQlsaXN0ZW5lci53YWtlLndhaXRVbnRpbEVxQW5kU2V0KCB0cnVlLCBRMywgZmFsc2UgKTsKKwkJU3lzdGVtLm91dC5wcmludGYoICJkdWUxID0gJWRcbiIsIGxpc3RlbmVyLmR1ZSApOworCQlsb25nIGQxID0gbGlzdGVuZXIuZHVlIC0gdDA7CisJCQorCQlsaXN0ZW5lci53YWtlLndhaXRVbnRpbEVxQW5kU2V0KCB0cnVlLCBRMywgZmFsc2UgKTsKKwkJU3lzdGVtLm91dC5wcmludGYoICJkdWUyID0gJWRcbiIsIGxpc3RlbmVyLmR1ZSApOworCQlsb25nIGQyID0gbGlzdGVuZXIuZHVlIC0gdDA7CisJCQorCQlsaXN0ZW5lci53YWtlLndhaXRVbnRpbEVxQW5kU2V0KCB0cnVlLCBRMywgZmFsc2UgKTsKKwkJU3lzdGVtLm91dC5wcmludGYoICJkdWUzID0gJWRcbiIsIGxpc3RlbmVyLmR1ZSApOworCQlsb25nIGQzID0gbGlzdGVuZXIuZHVlIC0gdDA7CisJCQorCQlUaHJlYWQuc2xlZXAoIFExICk7CisJCWxpc3RlbmVyLmRlbGF5ID0gMDsKKwkJCisJCWxpc3RlbmVyLndha2Uud2FpdFVudGlsRXFBbmRTZXQoIHRydWUsIFEzLCBmYWxzZSApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggImR1ZTQgPSAlZFxuIiwgbGlzdGVuZXIuZHVlICk7CisJCWxvbmcgZDQgPSBsaXN0ZW5lci5kdWUgLSB0MDsKKwkJCisJCWxvbmcgbTEgPSBNYXRoLnJvdW5kKCBkMS8oZG91YmxlKSBkMSApOworCQlsb25nIG0yID0gTWF0aC5yb3VuZCggZDIvKGRvdWJsZSkgZDEgKTsKKwkJbG9uZyBtMyA9IE1hdGgucm91bmQoIGQzLyhkb3VibGUpIGQxICk7CisJCWxvbmcgbTQgPSBNYXRoLnJvdW5kKCBkNC8oZG91YmxlKSBkMSApOworCQkKKwkJU3lzdGVtLm91dC5wcmludGYoICJ0aW1lcyAlZCAlZCAlZCAlZCAlZFxuIiwgdDAsIGQxLCBkMiwgZDMsIGQ0ICk7CisJCQorCQlhc3NlcnRFcXVhbHMoIDEsIG0xICk7CisJCWFzc2VydEVxdWFscyggMiwgbTIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBtMyApOworCQlhc3NlcnRFcXVhbHMoIDQsIG00ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcmVwZWF0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUFsYXJtTWFuYWdlciBhbSA9IG5ldyBBbGFybU1hbmFnZXIoKTsKKwkJYW0uc3RhcnQoKTsKKwkJCisJCWxpc3RlbmVyLmRlbGF5ID0gLVEyOworCQlhbS5hZGQoIGxpc3RlbmVyLCBudWxsLCBRMiApOworCQkKKwkJbGlzdGVuZXIud2FrZS53YWl0VW50aWxFcUFuZFNldCggdHJ1ZSwgUTMsIGZhbHNlICk7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiZHVlMCA9ICVkXG4iLCBsaXN0ZW5lci5kdWUgKTsKKwkJbG9uZyB0MCA9IGxpc3RlbmVyLmR1ZTsKKwkJCisJCWxpc3RlbmVyLndha2Uud2FpdFVudGlsRXFBbmRTZXQoIHRydWUsIFEzLCBmYWxzZSApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggImR1ZTEgPSAlZFxuIiwgbGlzdGVuZXIuZHVlICk7CisJCWxvbmcgZDEgPSBsaXN0ZW5lci5kdWUgLSB0MDsKKwkJCisJCWxpc3RlbmVyLndha2Uud2FpdFVudGlsRXFBbmRTZXQoIHRydWUsIFEzLCBmYWxzZSApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggImR1ZTIgPSAlZFxuIiwgbGlzdGVuZXIuZHVlICk7CisJCWxvbmcgZDIgPSBsaXN0ZW5lci5kdWUgLSB0MDsKKwkJCisJCWxpc3RlbmVyLndha2Uud2FpdFVudGlsRXFBbmRTZXQoIHRydWUsIFEzLCBmYWxzZSApOworCQlTeXN0ZW0ub3V0LnByaW50ZiggImR1ZTMgPSAlZFxuIiwgbGlzdGVuZXIuZHVlICk7CisJCWxvbmcgZDMgPSBsaXN0ZW5lci5kdWUgLSB0MDsKKwkJCisJCVRocmVhZC5zbGVlcCggUTEgKTsKKwkJbGlzdGVuZXIuZGVsYXkgPSAwOworCQkKKwkJbGlzdGVuZXIud2FrZS53YWl0VW50aWxFcUFuZFNldCggdHJ1ZSwgUTMsIGZhbHNlICk7CisJCVN5c3RlbS5vdXQucHJpbnRmKCAiZHVlNCA9ICVkXG4iLCBsaXN0ZW5lci5kdWUgKTsKKwkJbG9uZyBkNCA9IGxpc3RlbmVyLmR1ZSAtIHQwOworCQkKKwkJbG9uZyBtMSA9IE1hdGgucm91bmQoIGQxLyhkb3VibGUpIGQxICk7CisJCWxvbmcgbTIgPSBNYXRoLnJvdW5kKCBkMi8oZG91YmxlKSBkMSApOworCQlsb25nIG0zID0gTWF0aC5yb3VuZCggZDMvKGRvdWJsZSkgZDEgKTsKKwkJbG9uZyBtNCA9IE1hdGgucm91bmQoIGQ0Lyhkb3VibGUpIGQxICk7CisJCQorCQlTeXN0ZW0ub3V0LnByaW50ZiggInRpbWVzICVkICVkICVkICVkICVkXG4iLCB0MCwgZDEsIGQyLCBkMywgZDQgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMSwgbTEgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBtMiApOworCQlhc3NlcnRFcXVhbHMoIDMsIG0zICk7CisJCWFzc2VydEVxdWFscyggNCwgbTQgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gVGltZW91dEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcmVwZWF0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRpbWVvdXQKKwkJQWxhcm1NYW5hZ2VyIGFtID0gbmV3IEFsYXJtTWFuYWdlcigpOworCQlhbS5zdGFydCgpOworCQkKKwkJbGlzdGVuZXIuZGVsYXkgPSBRMjsKKwkJYW0uYWRkKCBsaXN0ZW5lciwgbnVsbCwgUTIgKTsKKwkJCisJCWxpc3RlbmVyLndha2Uud2FpdFVudGlsRXFBbmRTZXQoIHRydWUsIFEzLCBmYWxzZSApOworCQkKKwkJbGlzdGVuZXIud2FrZS53YWl0VW50aWxFcUFuZFNldCggdHJ1ZSwgUTMsIGZhbHNlICk7CisJCQorCQlsaXN0ZW5lci53YWtlLndhaXRVbnRpbEVxQW5kU2V0KCB0cnVlLCBRMywgZmFsc2UgKTsKKwkJCisJCVRocmVhZC5zbGVlcCggUTEgKTsKKwkJbGlzdGVuZXIuZGVsYXkgPSAwOworCQkKKwkJbGlzdGVuZXIud2FrZS53YWl0VW50aWxFcUFuZFNldCggdHJ1ZSwgUTMsIGZhbHNlICk7CisJCS8vIGFsYXJtIGlzIG5vdyBjYW5jZWxlZAorCQkKKwkJLy8gdGhpcyBzaG91bGQgdGltZW91dC4uLgorCQlsaXN0ZW5lci53YWtlLndhaXRVbnRpbEVxQW5kU2V0KCB0cnVlLCBRMywgZmFsc2UgKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUFsYXJtTGlzdGVuZXIgaW1wbGVtZW50cyBBbGFybUxpc3RlbmVyCisJeworCQlwdWJsaWMgTXlBbGFybUxpc3RlbmVyKCBpbnQgZGVsYXkgKQorCQl7CisJCQl0aGlzLmRlbGF5ID0gZGVsYXk7CisJCX0KKworCQlwcml2YXRlIGludCBkZWxheTsKKwkJCisJCXByaXZhdGUgYm9vbGVhbiBleGNwOworCisJCXByaXZhdGUgTW9uaXRvcjxCb29sZWFuPiB3YWtlID0gbmV3IE1vbml0b3I8Qm9vbGVhbj4oICJ3YWtlIiwgZmFsc2UgKTsKKworCQlwcml2YXRlIE9iamVjdCBzdGF0ZTsKKwkJCisJCXByaXZhdGUgbG9uZyBkdWU7CisKKwkJcHVibGljIGludCB3YWtldXAoIEFsYXJtTWFuYWdlciBtYW5hZ2VyLCBPYmplY3Qgc3RhdGUsIGxvbmcgZHVlICkKKwkJeworCQkJdGhpcy5zdGF0ZSA9IHN0YXRlOworCQkJdGhpcy5kdWUgPSBkdWU7CisJCQl3YWtlLnNldCggdHJ1ZSApOworCQkJCisJCQlpZiAoZXhjcCkKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJCisJCQlyZXR1cm4gZGVsYXk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVGVzdENpcmN1bGFyUXVldWUuamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UZXN0Q2lyY3VsYXJRdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTU2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVGVzdENpcmN1bGFyUXVldWUuamF2YQpAQCAtMCwwICsxLDY4NyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKiBUZXN0IG9mIENpcmN1bGFyUXVldWUgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q2lyY3VsYXJRdWV1ZQoreworCS8vIGNoYW5nZSB0aGlzIHRvIGEgbXVjaCBzbWFsbGVyIG51bWJlciAoZS5nLiwgMC4xKSB0byBhY3R1YWxseSB0ZXN0IHRoZQorCS8vIGNpcmN1bGFyIHF1ZXVlIHRpbWVvdXQgYWNjdXJhY3kuCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZG91YmxlIFJFTF9FUlJPUiA9IDEwMDAwMDsKKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RnZXR0aW1lcygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlkb3VibGVbXSB0aW1lczsKKwkJCisJCXRpbWVzID0gZ2V0dGltZXMoKTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50ZiggInRpbWVzOiBocCAlZiAvIHRvZCAlZlxuIiwgdGltZXNbMF0sIHRpbWVzWzFdICk7CisJCQorCQl0aW1lcyA9IGdldHRpbWVzKCk7CisvLwkJU3lzdGVtLm91dC5wcmludGYoICJ0aW1lczogaHAgJWYgLyB0b2QgJWZcbiIsIHRpbWVzWzBdLCB0aW1lc1sxXSApOworCQkKKwkJdGltZXMgPSBnZXR0aW1lcygpOworLy8JCVN5c3RlbS5vdXQucHJpbnRmKCAidGltZXM6IGhwICVmIC8gdG9kICVmXG4iLCB0aW1lc1swXSwgdGltZXNbMV0gKTsKKwl9CisJCisJcHJpdmF0ZSBkb3VibGVbXSBnZXR0aW1lcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCXsKKwkJbG9uZyB0MCA9IFRpbWVyLmdldE5hbm9zKCk7CisJCWxvbmcgczAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCisJCVRocmVhZC5zbGVlcCggMTAwMCApOworCQkKKwkJZG91YmxlIHQgPSBUaW1lci5nZXRTZWNvbmRzU2luY2UoIHQwICk7CisJCWRvdWJsZSBzID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gczApIC8gMTAwMC4wOworCQkKKwkJcmV0dXJuIG5ldyBkb3VibGVbXSB7IHQsIHMgfTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbmV3IENpcmN1bGFyUXVldWU8SW50ZWdlcj4oIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQluZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiggLTEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPEludGVnZXI+KCAxICk7CisJCWFzc2VydEVxdWFscyggMSwgcXVldWUuc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiggMiApOworCQlhc3NlcnRFcXVhbHMoIDIsIHF1ZXVlLnNpemUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDaXJjdWxhclF1ZXVlPEludGVnZXI+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8SW50ZWdlcj4oKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMCwgcXVldWUuc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0Z2V0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCAwLCBxdWV1ZS5jb3VudCgpICk7CisJCWFzc2VydFRydWUoIHF1ZXVlLmlzRW1wdHkoKSApOworCQlhc3NlcnRGYWxzZSggcXVldWUuaXNGdWxsKCkgKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKwkJeworCQkJcXVldWUucHV0KCBpICk7CisJCQlhc3NlcnRFcXVhbHMoIDEsIHF1ZXVlLmNvdW50KCkgKTsKKwkJCWFzc2VydEZhbHNlKCBxdWV1ZS5pc0VtcHR5KCkgKTsKKwkJCQorCQkJYXNzZXJ0RXF1YWxzKCBpLCBxdWV1ZS5nZXQoKSApOworCQkJYXNzZXJ0RXF1YWxzKCAwLCBxdWV1ZS5jb3VudCgpICk7CisJCQlhc3NlcnRUcnVlKCBxdWV1ZS5pc0VtcHR5KCkgKTsKKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dGdldDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDaXJjdWxhclF1ZXVlPEludGVnZXI+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8SW50ZWdlcj4oKTsKKwkJCisJCWFzc2VydE51bGwoIHF1ZXVlLmdldCggMSApICk7CisJCWFzc2VydE51bGwoIHF1ZXVlLmdldCggLTEgKSApOworCQlhc3NlcnROdWxsKCBxdWV1ZS5nZXQoIDEwICkgKTsKKwkJCisJCXF1ZXVlLnB1dCggOSApOworCQlhc3NlcnRFcXVhbHMoIDksIHF1ZXVlLmdldCggMSApICk7CisJCQorCQlxdWV1ZS5wdXQoIDkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA5LCBxdWV1ZS5nZXQoIC0xICkgKTsKKwkJCisJCXF1ZXVlLnB1dCggOSApOworCQlhc3NlcnRFcXVhbHMoIDksIHF1ZXVlLmdldCggMTAgKSApOworCQkKKwkJYXNzZXJ0TnVsbCggcXVldWUuZ2V0KCAxICkgKTsKKwkJYXNzZXJ0TnVsbCggcXVldWUuZ2V0KCAtMSApICk7CisJCWFzc2VydE51bGwoIHF1ZXVlLmdldCggMTAgKSApOworCQkKKwkJbG9uZyB0MDsKKwkJZG91YmxlIHQ7CisJCQorCQl0MCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQlhc3NlcnROdWxsKCBxdWV1ZS5nZXQoIDEwICkgKTsKKwkJdCA9IChTeXN0ZW0ubmFub1RpbWUoKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJLy8gVE9ETyBpcyB0aGVyZSBhIGJldHRlciB3YXkgZm9yIGNob29zaW5nIHJlbGF0aXZlIGVycm9yPworCQlUZXN0SGVscC5hc3NlcnRSZWxFcnJvciggMTAsIHQsIFJFTF9FUlJPUiApOworCQkKKwkJdDAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJYXNzZXJ0TnVsbCggcXVldWUuZ2V0KCAyMCApICk7CisJCXQgPSAoU3lzdGVtLm5hbm9UaW1lKCkgLSB0MCkgLyAxMDAwMDAwLjA7CisJCS8vIFRPRE8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IGZvciBjaG9vc2luZyByZWxhdGl2ZSBlcnJvcj8KKwkJVGVzdEhlbHAuYXNzZXJ0UmVsRXJyb3IoIDIwLCB0LCBSRUxfRVJST1IgKTsKKwkJCisJCXQwID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCWFzc2VydE51bGwoIHF1ZXVlLmdldCggMzAgKSApOworCQl0ID0gKFN5c3RlbS5uYW5vVGltZSgpIC0gdDApIC8gMTAwMDAwMC4wOworCQkvLyBUT0RPIGlzIHRoZXJlIGEgYmV0dGVyIHdheSBmb3IgY2hvb3NpbmcgcmVsYXRpdmUgZXJyb3I/CisJCVRlc3RIZWxwLmFzc2VydFJlbEVycm9yKCAzMCwgdCwgUkVMX0VSUk9SICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0Z2V0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPigpOworCQkKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAxICkgKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAyICkgKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAzICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBxdWV1ZS5nZXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHF1ZXVlLmdldCgpICk7CisJCWFzc2VydEVxdWFscyggMywgcXVldWUuZ2V0KCkgKTsKKwkJCisJCWFzc2VydFRydWUoIHF1ZXVlLnB1dCggMSwgMCApICk7CisJCWFzc2VydFRydWUoIHF1ZXVlLnB1dCggMiwgMCApICk7CisJCWFzc2VydFRydWUoIHF1ZXVlLnB1dCggMywgMCApICk7CisJCWFzc2VydEVxdWFscyggMSwgcXVldWUuZ2V0KCAwICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBxdWV1ZS5nZXQoIDAgKSApOworCQlhc3NlcnRFcXVhbHMoIDMsIHF1ZXVlLmdldCggMCApICk7CisJCQorCQlhc3NlcnRUcnVlKCBxdWV1ZS5wdXQoIDEsIC0xICkgKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAyLCAtMSApICk7CisJCWFzc2VydFRydWUoIHF1ZXVlLnB1dCggMywgLTEgKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHF1ZXVlLmdldCggLTEgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHF1ZXVlLmdldCggLTEgKSApOworCQlhc3NlcnRFcXVhbHMoIDMsIHF1ZXVlLmdldCggLTEgKSApOworCQkKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAxLCAxICkgKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAyLCAxICkgKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAzLCAxICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBxdWV1ZS5nZXQoIDEgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIHF1ZXVlLmdldCggMSApICk7CisJCWFzc2VydEVxdWFscyggMywgcXVldWUuZ2V0KCAxICkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDaXJjdWxhclF1ZXVlPEludGVnZXI+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8SW50ZWdlcj4oIDEgKTsKKwkJCisJCVN5c3RlbS5uYW5vVGltZSgpOworCQlhc3NlcnROdWxsKCBxdWV1ZS5nZXQoIDEwICkgKTsKKwkJVGVzdEhlbHAuYXNzZXJ0UmVsRXJyb3IoIDEsIDEsIDEgKTsKKworCQlmb3IgKGludCBpOiBuZXcgaW50W10geyAxMCwgMjAsIDMwLCA1MCwgODAsIDEzMCwgMjEwLCAzNDAsIDU1MCwgODkwLCAxNDQwIH0gKQorCQl7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRmKCAiZ2V0IGRlbGF5ID0gJWRcbiIsIGkgKTsKKwkJCWxvbmcgdDAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJCWFzc2VydE51bGwoIHF1ZXVlLmdldCggaSApICk7CisJCQlkb3VibGUgdCA9IChTeXN0ZW0ubmFub1RpbWUoKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJCS8vIFRPRE8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IGZvciBjaG9vc2luZyByZWxhdGl2ZSBlcnJvcj8KKwkJCVRlc3RIZWxwLmFzc2VydFJlbEVycm9yKCBpLCB0LCBSRUxfRVJST1IgKTsKKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcHV0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPEludGVnZXI+KCk7CisJCXF1ZXVlLnB1dCggbnVsbCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlDaXJjdWxhclF1ZXVlPEludGVnZXI+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8SW50ZWdlcj4oIDEgKTsKKwkJCisJCWFzc2VydEZhbHNlKCBxdWV1ZS5pc0Z1bGwoKSApOworCQlhc3NlcnRUcnVlKCBxdWV1ZS5wdXQoIDAgKSApOworCQlhc3NlcnRUcnVlKCBxdWV1ZS5pc0Z1bGwoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHF1ZXVlLmdldCgpICk7CisJCWFzc2VydEZhbHNlKCBxdWV1ZS5pc0Z1bGwoKSApOworCQkKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAwICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlLnB1dCggMCwgLTEgKSApOworCQlhc3NlcnRGYWxzZSggcXVldWUucHV0KCAwLCAxICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlLnB1dCggMCwgMTAgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsb3NlMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPigpOworCQkKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlLmlzQ2xvc2VkKCkgKTsKKwkJcXVldWUuY2xvc2UoKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUuaXNDbG9zZWQoKSApOworCQkKKwkJYXNzZXJ0TnVsbCggcXVldWUuZ2V0KCkgKTsKKwkJYXNzZXJ0TnVsbCggcXVldWUuZ2V0KCAtMSApICk7CisJCWFzc2VydE51bGwoIHF1ZXVlLmdldCggMCApICk7CisJCWFzc2VydE51bGwoIHF1ZXVlLmdldCggMSApICk7CisJCQorCQlxdWV1ZS5jbG9zZSgpOworCQlhc3NlcnRUcnVlKCBxdWV1ZS5pc0Nsb3NlZCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2xvc2UyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPEludGVnZXI+KCk7CisKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlLmlzQ2xvc2VkKCkgKTsKKwkJcXVldWUuY2xvc2UoKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUuaXNDbG9zZWQoKSApOworCQkKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlLnB1dCggMCApICk7CisJCWFzc2VydEZhbHNlKCBxdWV1ZS5wdXQoIDAsIC0xICkgKTsKKwkJYXNzZXJ0RmFsc2UoIHF1ZXVlLnB1dCggMCwgMCApICk7CisJCWFzc2VydEZhbHNlKCBxdWV1ZS5wdXQoIDAsIDEgKSApOworCQkKKwkJcXVldWUuY2xvc2UoKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUuaXNDbG9zZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNsb3NlMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUNpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPigpOworCQlxdWV1ZS5wdXQoIDEgKTsKKwkJcXVldWUucHV0KCAyICk7CisJCXF1ZXVlLnB1dCggMyApOworCQlxdWV1ZS5jbG9zZSgpOworCQlhc3NlcnRFcXVhbHMoIDEsIHF1ZXVlLmdldCgpICk7CisJCWFzc2VydEVxdWFscyggMiwgcXVldWUuZ2V0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBxdWV1ZS5nZXQoKSApOworCQlhc3NlcnROdWxsKCBxdWV1ZS5nZXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGF5MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIENpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPigpOworCQkKKwkJVGVzdEhlbHAuZGVsYXlBbmRTdGFydCggMTAsIG5ldyBUZXN0SGVscC5EZWxheVJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVldWUucHV0KCA5OSApOyB9IH0gKTsKKwkJYXNzZXJ0RXF1YWxzKCA5OSwgcXVldWUuZ2V0KCkgKTsKKwkJCisJCVRlc3RIZWxwLmRlbGF5QW5kU3RhcnQoIDEwLCBuZXcgVGVzdEhlbHAuRGVsYXlSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1ZXVlLmNsb3NlKCk7IH0gfSApOworCQlhc3NlcnROdWxsKCBxdWV1ZS5nZXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGF5MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIENpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiggMSApOworCQkKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAxICkgKTsKKwkJVGVzdEhlbHAuZGVsYXlBbmRTdGFydCggMTAsIG5ldyBUZXN0SGVscC5EZWxheVJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsgYXNzZXJ0RXF1YWxzKCAxLCBxdWV1ZS5nZXQoKSApOyB9IH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAyICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBxdWV1ZS5nZXQoKSApOworCQkKKwkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCAxICkgKTsKKwkJVGVzdEhlbHAuZGVsYXlBbmRTdGFydCggMTAsIG5ldyBUZXN0SGVscC5EZWxheVJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVldWUuY2xvc2UoKTsgfSB9ICk7CisJCWFzc2VydEZhbHNlKCBxdWV1ZS5wdXQoIDIgKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIHF1ZXVlLmdldCgpICk7CisJCWFzc2VydE51bGwoIHF1ZXVlLmdldCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RyZXNzMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIENpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiggMSApOworCQlmaW5hbCBpbnQgbiA9IDEwMDAwOworCQkKKwkJbmV3IFRocmVhZCggbmV3IFJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCQl7CisJCQkJCXRyeQorCQkJCQl7CisJCQkJCQlxdWV1ZS5wdXQoIGkgKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQkvLy9DTE9WRVI6T0ZGCisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJLy8vQ0xPVkVSOk9OCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gKS5zdGFydCgpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQlhc3NlcnRFcXVhbHMoIGksIHF1ZXVlLmdldCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RyZXNzMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIENpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiggMSApOworCQlmaW5hbCBpbnQgbiA9IDEwMDA7CisJCQorCQluZXcgVGhyZWFkKCBuZXcgUnVubmFibGUoKQorCQl7CisJCQlwdWJsaWMgdm9pZCBydW4oKQorCQkJeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJCXsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCVRocmVhZC5zbGVlcCggNSApOworCQkJCQkJcXVldWUucHV0KCBpICk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQkJeworCQkJCQkJLy8vQ0xPVkVSOk9GRgorCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJCS8vL0NMT1ZFUjpPTgorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9ICkuc3RhcnQoKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJYXNzZXJ0RXF1YWxzKCBpLCBxdWV1ZS5nZXQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN0cmVzczMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlmaW5hbCBDaXJjdWxhclF1ZXVlPEludGVnZXI+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8SW50ZWdlcj4oIDEgKTsKKwkJZmluYWwgaW50IG4gPSAxMDAwOworCQkKKwkJbmV3IFRocmVhZCggbmV3IFJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCQl7CisJCQkJCXRyeQorCQkJCQl7CisJCQkJCQlxdWV1ZS5wdXQoIGkgKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCQl7CisJCQkJCQkvLy9DTE9WRVI6T0ZGCisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJLy8vQ0xPVkVSOk9OCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gKS5zdGFydCgpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCXsKKwkJCVRocmVhZC5zbGVlcCggNSApOworCQkJYXNzZXJ0RXF1YWxzKCBpLCBxdWV1ZS5nZXQoKSApOworCQl9CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RyZXNzNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIENpcmN1bGFyUXVldWU8SW50ZWdlcj4gcXVldWUgPSBuZXcgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPigpOworCQkKKwkJLy8gd2Ugd2lsbCBzZXR1cCB0d28gdGhyZWFkcyB3YWl0aW5nIHRvIGdldCBhbmQKKwkJLy8gdGhlbiBpbiBhIHNpbmdsZSBzeW5jaHJvbml6ZWQgc3RlcCBwdXQgdHdvCisJCS8vIGl0ZW1zIGluIHRoZSBxdWV1ZS4gdGhlIGZpcnN0IHRocmVhZCB3aWxsIGJlCisJCS8vIHdva2VuIHRvIGdldCwgYW5kIG9uY2UgZG9uZSB0aGUgc2Vjb25kIHRocmVhZAorCQkvLyBzaG91bGQgYmUgd29rZW4gYnkgdGhlIGZpcnN0LgorCQkKKwkJVGhyZWFkIHQxID0gbmV3IFRocmVhZCggbmV3IFJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWFzc2VydE5vdE51bGwoIHF1ZXVlLmdldCgpICk7CisJCQkJfQorCQkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfSwgInQxIiApOworCQkKKwkJVGhyZWFkIHQyID0gbmV3IFRocmVhZCggbmV3IFJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWFzc2VydE5vdE51bGwoIHF1ZXVlLmdldCgpICk7CisJCQkJfQorCQkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfSwgInQyIiApOworCisJCXQxLnN0YXJ0KCk7CisJCXQyLnN0YXJ0KCk7CisJCQorCQkvLyB3YWl0IHVudGlsIGJvdGggdGhyZWFkcyBhcmUgd2FpdGluZyBvbiBxdWV1ZS4uLgorCQkKKwkJVGhyZWFkLnNsZWVwKCAxMDAgKTsKKwkJCisJCXN5bmNocm9uaXplZCAocXVldWUpCisJCXsKKwkJCXF1ZXVlLnB1dCggMSApOworCQkJcXVldWUucHV0KCAyICk7CisJCX0KKworCQloYXJ2ZXN0KCB0MSApOworCQloYXJ2ZXN0KCB0MiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN0cmVzczUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlmaW5hbCBDaXJjdWxhclF1ZXVlPEludGVnZXI+IHF1ZXVlID0gbmV3IENpcmN1bGFyUXVldWU8SW50ZWdlcj4oIDMgKTsKKwkJCisJCS8vIHdlIHdpbGwgc2V0dXAgdHdvIHRocmVhZHMgd2FpdGluZyB0byBwdXQgdG8gdGhlIHF1ZXVlLAorCQkvLyB0aGVuIGluIGEgc2luZ2xlIHN5bmNocm9uaXplZCBzdGVwLCByZWFkIHR3byBpdGVtcyBmcm9tCisJCS8vIHRoZSBxdWV1ZS4gdGhlIGZpcnN0IHRocmVhZCB3aWxsIGJlIHdva2VuIHRvIHB1dCwgYW5kCisJCS8vIG9uY2UgZG9uZSB0aGUgc2Vjb25kIHRocmVhZCBzaG91bGQgYmUgd29rZW4gYnkgdGhlIGZpcnN0LgorCQkKKwkJcXVldWUucHV0KCAwICk7CisJCXF1ZXVlLnB1dCggMSApOworCQlxdWV1ZS5wdXQoIDIgKTsKKwkJYXNzZXJ0VHJ1ZSggcXVldWUuaXNGdWxsKCkgKTsKKwkJCisJCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQoIG5ldyBSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlhc3NlcnRUcnVlKCBxdWV1ZS5wdXQoIDMgKSApOworCQkJCX0KKwkJCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0sICJ0MSIgKTsKKwkJCisJCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQoIG5ldyBSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlhc3NlcnRUcnVlKCBxdWV1ZS5wdXQoIDQgKSApOworCQkJCX0KKwkJCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0sICJ0MiIgKTsKKwkJCisJCXQxLnN0YXJ0KCk7CisJCXQyLnN0YXJ0KCk7CisJCQorCQkvLyB3YWl0IHVudGlsIGJvdGggdGhyZWFkcyBhcmUgd2FpdGluZyBvbiBxdWV1ZS4uLgorCQkKKwkJVGhyZWFkLnNsZWVwKCAxMDAgKTsKKwkJCisJCXN5bmNocm9uaXplZCAocXVldWUpCisJCXsKKwkJCWFzc2VydE5vdE51bGwoIHF1ZXVlLmdldCgpICk7CisJCQlhc3NlcnROb3ROdWxsKCBxdWV1ZS5nZXQoKSApOworCQl9CisKKwkJaGFydmVzdCggdDEgKTsKKwkJaGFydmVzdCggdDIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdHJlc3M2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZmluYWwgQ2lyY3VsYXJRdWV1ZTxJbnRlZ2VyPiBxdWV1ZSA9IG5ldyBDaXJjdWxhclF1ZXVlPEludGVnZXI+KCA1ICk7CisJCQorCQkvLyBzdGFydCB0d28gZ2V0dGVycyBhbmQgdHdvIHB1dHRlcnMgYW5kIGxldCAnZW0gZHVrZSBpdCBvdXQuLi4KKwkJCisJCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQoIG5ldyBSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJCQkJYXNzZXJ0VHJ1ZSggcXVldWUucHV0KCBpICkgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9LCAidDEiICk7CisJCQorCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCBuZXcgUnVubmFibGUoKQorCQl7CisJCQlwdWJsaWMgdm9pZCBydW4oKQorCQkJeworCQkJCXRyeQorCQkJCXsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKKwkJCQkJCWFzc2VydFRydWUoIHF1ZXVlLnB1dCggaSApICk7CisJCQkJfQorCQkJCWNhdGNoICggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfSwgInQyIiApOworCQkKKwkJVGhyZWFkIHQzID0gbmV3IFRocmVhZCggbmV3IFJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisJCQkJCQlhc3NlcnROb3ROdWxsKCBxdWV1ZS5nZXQoKSApOworCQkJCX0KKwkJCQljYXRjaCAoIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKQorCQkJCXsKKwkJCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0sICJ0MyIgKTsKKwkJCisJCVRocmVhZCB0NCA9IG5ldyBUaHJlYWQoIG5ldyBSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorCQkJCQkJYXNzZXJ0Tm90TnVsbCggcXVldWUuZ2V0KCkgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9LCAidDQiICk7CisJCQorCQl0MS5zdGFydCgpOworCQl0Mi5zdGFydCgpOworCQl0My5zdGFydCgpOworCQl0NC5zdGFydCgpOworCisJCWhhcnZlc3QoIHQxICk7CisJCWhhcnZlc3QoIHQyICk7CisJCWhhcnZlc3QoIHQzICk7CisJCWhhcnZlc3QoIHQ0ICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgaGFydmVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIG5ldyBSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJLy8gbm90aGluZyB0byBkby4KKwkJCX0KKwkJfSwgInQiICk7CisJCXQuc3RhcnQoKTsKKwkJaGFydmVzdCggdCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBUaW1lb3V0RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBoYXJ2ZXN0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRocmVhZCB0ID0gbmV3IFRocmVhZCggbmV3IFJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCVRocmVhZC5zbGVlcCggMTAwMDAgKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlICkKKwkJCQl7CisJCQkJCS8vIGlnbm9yZS4KKwkJCQl9CisJCQl9CisJCX0sICJ0IiApOworCQl0LnN0YXJ0KCk7CisJCWhhcnZlc3QoIHQgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGhhcnZlc3QoIFRocmVhZCB0ICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdC5qb2luKCAxMDAwICk7CisJCWlmICh0LmlzQWxpdmUoKSkKKwkJeworCQkJdC5pbnRlcnJ1cHQoKTsKKwkJCXRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCB0LmdldE5hbWUoKSsiIGlzIHN0dWNrIiApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Rlc3RGbGV4QnVmZmVyLmphdmEgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVGVzdEZsZXhCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU2OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Rlc3RGbGV4QnVmZmVyLmphdmEKQEAgLTAsMCArMSwxNjAzIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgRmxleEJ1ZmZlci4KKyAqLworcHVibGljIGNsYXNzIFRlc3RGbGV4QnVmZmVyCit7CisJcHJpdmF0ZSB2b2lkIGNoZWNrQnVmKCBGbGV4QnVmZmVyIGJ1ZiwgaW50IGxlbmd0aCwgaW50IGluZGV4LCBpbnQgYXZhaWwgKQorCXsKKwkJYXNzZXJ0RXF1YWxzKCAibGVuZ3RoIiwgbGVuZ3RoLCBidWYubGVuZ3RoKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiaW5kZXgiLCBpbmRleCwgYnVmLmluZGV4KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYXZhaWwiLCBhdmFpbCwgYnVmLmF2YWlsKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbml0aWFsMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMCwgMCwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGluaXRpYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbNV0gKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgNSwgMCwgNSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGluaXRpYWwzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbNV0sIDIgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMiwgMCwgMiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGluaXRpYWw0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbNV0sIDEsIDMgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgNCwgMSwgMyApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2V0TGVuZ3RoMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnNldExlbmd0aCggMCApOworCQljaGVja0J1ZiggYnVmLCAwLCAwLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuc2V0TGVuZ3RoKCAxICk7CisJCWNoZWNrQnVmKCBidWYsIDEsIDAsIDEgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNldExlbmd0aDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5zZXRMZW5ndGgoIDIgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMiwgMCwgMiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2V0TGVuZ3RoMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnNldExlbmd0aCggMiApOworCQlidWYuc2V0TGVuZ3RoKCAwICk7CisJCWNoZWNrQnVmKCBidWYsIDAsIDAsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHNldExlbmd0aDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5zZXRMZW5ndGgoIC0xICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXRJbmRleDAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5zZXRJbmRleCggMCApOworCQljaGVja0J1ZiggYnVmLCAwLCAwLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBzZXRJbmRleDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5zZXRJbmRleCggMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgc2V0SW5kZXgyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuc2V0SW5kZXgoIC0xICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXRJbmRleDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5zZXRMZW5ndGgoIDUgKTsKKwkJYnVmLnNldEluZGV4KCAxICk7CisJCWNoZWNrQnVmKCBidWYsIDUsIDEsIDQgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNldEluZGV4NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnNldExlbmd0aCggNSApOworCQlidWYuc2V0SW5kZXgoIDQgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgNSwgNCwgMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2V0SW5kZXg1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuc2V0TGVuZ3RoKCA1ICk7CisJCWJ1Zi5zZXRJbmRleCggNSApOworCQljaGVja0J1ZiggYnVmLCA1LCA1LCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXRJbmRleDYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5zZXRMZW5ndGgoIDUgKTsKKwkJYnVmLnNldEluZGV4KCA1ICk7CisJCWJ1Zi5zZXRMZW5ndGgoIDAgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMCwgMCwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2V0SW5kZXg3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuc2V0TGVuZ3RoKCA1ICk7CisJCWJ1Zi5zZXRJbmRleCggNSApOworCQlidWYuc2V0TGVuZ3RoKCAyICk7CisJCWNoZWNrQnVmKCBidWYsIDIsIDIsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuc2V0TGVuZ3RoKCAyICk7CisJCWJ1Zi5zZXRJbmRleCggMSApOworCQlidWYucmVzZXQoKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMCwgMCwgMCApOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhc2VzIGZvciBwdXQoIGludCApOgorCS8vIHB1dCBvbmNlIG9yIHR3aWNlICh0aGUgcHV0IDAgY2FzZSBoYXMgYWxyZWFkeSBiZWVuIHRlc3RlZCkuCisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDFhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYucHV0KCAxICk7CisJCWNoZWNrQnVmKCBidWYsIDEsIDEsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDFiKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYucHV0KCAxICk7CisJCWJ1Zi5wdXQoIDIgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMiwgMiwgMCApOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhc2VzIGZvciBwdXQoIGJ5dGVbXSBidWYgKToKKwkvLyBidWYubGVuZ3RoID0gbnVsbCwgMCwgMSwgMgorCisJcHJpdmF0ZSB2b2lkIHRlc3RQdXRCeXRlcyggaW50IGJ1ZkxlbiApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnB1dCggMSApOworCQlidWYucHV0KCBidWZMZW4gPj0gMCA/IG5ldyBieXRlW2J1Zkxlbl0gOiBudWxsICk7CisJCWNoZWNrQnVmKCBidWYsIGJ1ZkxlbisxLCBidWZMZW4rMSwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQyYSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlcyggLTEgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDJiKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzKCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXQyYygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlcyggMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0MmQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXMoIDIgKTsKKwl9CisJCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY2FzZXMgZm9yIHB1dCggYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbiApOgorCS8vIGJ1Zi5sZW5ndGgsIG9mZiwgbGVuIC8vIGZhaWx1cmUgcmVhc29uCisJLy8gLS0tIGdyb3VwIDM6CisJLy8gbnVsbCwgMCwgMCAvLyBmYWlsIChidWYgaXMgbnVsbCkKKwkvLyBudWxsLCAwLCAxIC8vIGZhaWwgKGJ1ZiBpcyBudWxsKQorCS8vIG51bGwsIDEsIDAgLy8gZmFpbCAoYnVmIGlzIG51bGwpCisJLy8gLS0tIGdyb3VwIDQ6CisJLy8gMCwgMCwgMAorCS8vIDAsIDAsIDEgLy8gZmFpbCAob2ZmK2xlbiA+IGJ1Zi5sZW5ndGgpCisJLy8gMCwgMSwgMCAvLyBmYWlsIChvZmYgPiBidWYubGVuZ3RoKQorCS8vIC0tLSBncm91cCA1OgorCS8vIDEsIDAsIDAKKwkvLyAxLCAwLCAxCisJLy8gMSwgMCwgMiAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwkvLyAxLCAxLCAwCisJLy8gMSwgMSwgMSAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwkvLyAxLCAxLCAyIC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorCS8vIDEsIDIsIDAgLy8gZmFpbCAob2ZmID4gYnVmLmxlbmd0aCkKKwkvLyAxLCAyLCAxIC8vIGZhaWwgKG9mZiA+IGJ1Zi5sZW5ndGgpCisJLy8gMSwgMiwgMiAvLyBmYWlsIChvZmYgPiBidWYubGVuZ3RoKQorCS8vIC0tLSBncm91cCA2OgorCS8vIDIsIDAsIDAKKwkvLyAyLCAwLCAxCisJLy8gMiwgMCwgMgorCS8vIDIsIDEsIDAKKwkvLyAyLCAxLCAxCisJLy8gMiwgMSwgMiAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwkvLyAyLCAyLCAwCisJLy8gMiwgMiwgMSAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwkvLyAyLCAyLCAyIC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorCQorCXByaXZhdGUgdm9pZCB0ZXN0UHV0Qnl0ZXNPZmZMZW4oIGludCBidWZMZW4sIGludCBvZmZzZXQsIGludCBsZW5ndGggKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5wdXQoIDEgKTsKKwkJYnVmLnB1dCggYnVmTGVuID49IDAgPyBuZXcgYnl0ZVtidWZMZW5dIDogbnVsbCwgb2Zmc2V0LCBsZW5ndGggKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgbGVuZ3RoKzEsIGxlbmd0aCsxLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDNhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAtMSwgMCwgMCApOyAvLyBmYWlsIChidWYgaXMgbnVsbCkKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcHV0M2IoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNPZmZMZW4oIC0xLCAwLCAxICk7IC8vIGZhaWwgKGJ1ZiBpcyBudWxsKQorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQzYygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggLTEsIDEsIDAgKTsgLy8gZmFpbCAoYnVmIGlzIG51bGwpCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0NGEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNPZmZMZW4oIDAsIDAsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ0YigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMCwgMCwgMSApOyAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ0YygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMCwgMSwgMCApOyAvLyBmYWlsIChvZmYgPiBidWYubGVuZ3RoKQorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0NWEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNPZmZMZW4oIDEsIDAsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDViKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAwLCAxICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ1YygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMSwgMCwgMiApOyAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAxLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ1ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMSwgMSwgMSApOyAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDVmKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAxLCAyICk7IC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcHV0NWcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNPZmZMZW4oIDEsIDIsIDAgKTsgLy8gZmFpbCAob2ZmID4gYnVmLmxlbmd0aCkKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDVoKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAxLCAyLCAxICk7IC8vIGZhaWwgKG9mZiA+IGJ1Zi5sZW5ndGgpCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ1aSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMSwgMiwgMiApOyAvLyBmYWlsIChvZmYgPiBidWYubGVuZ3RoKQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDZhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAyLCAwLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0NmIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDAsIDEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXQ2YygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMiwgMCwgMiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dDZkKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAyLCAxLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0NmUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNPZmZMZW4oIDIsIDEsIDEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXQ2ZigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMiwgMSwgMiApOyAvLyBmYWlsIChvZmYrbGVuID4gYnVmLmxlbmd0aCkKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXQ2ZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc09mZkxlbiggMiwgMiwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDZoKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAyLCAyLCAxICk7IC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dDZpKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzT2ZmTGVuKCAyLCAyLCAyICk7IC8vIGZhaWwgKG9mZitsZW4gPiBidWYubGVuZ3RoKQorCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhc2VzIGZvciBwdXQoaW50KSwgZ2V0KCk6CisJLy8gcHV0IDAsIGdldCAwLiAvLyBhbHJlYWR5IHRlc3RlZCBhYm92ZQorCS8vIHB1dCAwLCBnZXQgMS4gLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwkvLyBwdXQgMSwgZ2V0IDAuCisJLy8gcHV0IDEsIGdldCAxLgorCS8vIHB1dCAxLCBnZXQgMi4gLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwkvLyBwdXQgMiwgZ2V0IDAuCisJLy8gcHV0IDIsIGdldCAxLgorCS8vIHB1dCAyLCBnZXQgMi4KKwkvLyBwdXQgMiwgZ2V0IDMuIC8vIGZhaWxzIHdpdGggRU9GRXhjZXB0aW9uCisJLy8gcHV0IDEwMDAwLCBnZXQgMTAwMDAuCisJCisJLy8ganVzdCBsaWtlIGFib3ZlLCBwdXR0aW5nIGJ5dGUgYXJyYXkgaW5zdGVhZAorCS8vIGp1c3QgbGlrZSBhYm92ZSwgZ2V0dGluZyBieXRlIGFycmF5IGluc3RlYWQuCisJLy8ganVzdCBsaWtlIGFib3ZlLCBwdXR0aW5nIGFuZCBnZXR0aW5nIGJ5dGUgYXJyYXkuCisJCisJcHJpdmF0ZSB2b2lkIHRlc3RQdXRHZXQoIGludCBuUHV0cywgaW50IG5HZXRzICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHV0czsgaSsrKQorCQkJYnVmLnB1dCggaSApOworCQkKKwkJYnVmLnNldEluZGV4KCAwICk7CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG5HZXRzOyBpKyspCisJCQlhc3NlcnRFcXVhbHMoIChieXRlKSBpLCAoYnl0ZSkgYnVmLmdldCgpICk7CisJCQorCQljaGVja0J1ZiggYnVmLCBuUHV0cywgbkdldHMsIG5QdXRzLW5HZXRzICk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0UHV0Qnl0ZXNHZXQoIGludCBuUHV0cywgaW50IG5HZXRzICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQkKKwkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW25QdXRzXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHV0czsgaSsrKQorCQkJYnVmZmVyW2ldID0gKGJ5dGUpIGk7CisJCQorCQlidWYucHV0KCAgYnVmZmVyICk7CisJCWJ1Zi5zZXRJbmRleCggMCApOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuR2V0czsgaSsrKQorCQkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgaSwgKGJ5dGUpIGJ1Zi5nZXQoKSApOworCQkKKwkJY2hlY2tCdWYoIGJ1ZiwgblB1dHMsIG5HZXRzLCBuUHV0cy1uR2V0cyApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFB1dEdldEJ5dGVzKCBpbnQgblB1dHMsIGludCBuR2V0cyApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgblB1dHM7IGkrKykKKwkJCWJ1Zi5wdXQoIGkgKTsKKwkJCisJCWJ1Zi5zZXRJbmRleCggMCApOworCQkKKwkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW25HZXRzXTsKKwkJaW50IG4gPSBidWYuZ2V0KCBidWZmZXIgKTsKKwkJYXNzZXJ0RXF1YWxzKCBNYXRoLm1pbiggblB1dHMsIG5HZXRzICksIG4gKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgaSwgYnVmZmVyW2ldICk7CisJCQorCQljaGVja0J1ZiggYnVmLCBuUHV0cywgbiwgblB1dHMtbiApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdFB1dEJ5dGVzR2V0Qnl0ZXMoIGludCBuUHV0cywgaW50IG5HZXRzICkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQkKKwkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW25QdXRzXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHV0czsgaSsrKQorCQkJYnVmZmVyW2ldID0gKGJ5dGUpIGk7CisKKwkJYnVmLnB1dCggIGJ1ZmZlciApOworCQlidWYuc2V0SW5kZXgoIDAgKTsKKwkJCisJCWJ1ZmZlciA9IG5ldyBieXRlW25HZXRzXTsKKwkJaW50IG4gPSBidWYuZ2V0KCBidWZmZXIgKTsKKwkJYXNzZXJ0RXF1YWxzKCBNYXRoLm1pbiggblB1dHMsIG5HZXRzICksIG4gKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgaSwgYnVmZmVyW2ldICk7CisJCQorCQljaGVja0J1ZiggYnVmLCBuUHV0cywgbiwgblB1dHMtbiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEVPRkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0MWEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0KCAwLCAxICk7IC8vIGZhaWxzIHdpdGggRU9GRXhjZXB0aW9uCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQxYigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRHZXQoIDEsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDFjKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEdldCggMSwgMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEVPRkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0MWQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0KCAxLCAyICk7IC8vIGZhaWxzIHdpdGggRU9GRXhjZXB0aW9uCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQxZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRHZXQoIDIsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDFmKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEdldCggMiwgMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0MWcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0KCAyLCAyICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXQxaCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRHZXQoIDIsIDMgKTsgLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDFpKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEdldCggMTAwMDAsIDk5OTUgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDFqKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEdldCggMTAwMDAsIDEwMDAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQxaygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRHZXQoIDEwMDAwMCwgMTAwMDAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXQyYSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldCggMCwgMSApOyAvLyBmYWlscyB3aXRoIEVPRkV4Y2VwdGlvbgorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0MmIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNHZXQoIDEsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDJjKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzR2V0KCAxLCAxICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXQyZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldCggMSwgMiApOyAvLyBmYWlscyB3aXRoIEVPRkV4Y2VwdGlvbgorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0MmUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNHZXQoIDIsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDJmKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzR2V0KCAyLCAxICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQyZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldCggMiwgMiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEVPRkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0MmgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNHZXQoIDIsIDMgKTsgLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDJpKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEJ5dGVzR2V0KCAxMDAwMCwgOTk5NSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0MmooKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNHZXQoIDEwMDAwLCAxMDAwMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0MmsoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNHZXQoIDEwMDAwMCwgMTAwMDAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXQzYSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRHZXRCeXRlcyggMCwgMSApOyAvLyBmYWlscyB3aXRoIEVPRkV4Y2VwdGlvbgorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0M2IoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0Qnl0ZXMoIDEsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDNjKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEdldEJ5dGVzKCAxLCAxICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQzZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRHZXRCeXRlcyggMSwgMiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0M2UoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0Qnl0ZXMoIDIsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDNmKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEdldEJ5dGVzKCAyLCAxICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQzZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRHZXRCeXRlcyggMiwgMiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0M2goKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0Qnl0ZXMoIDIsIDMgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDNpKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGVzdFB1dEdldEJ5dGVzKCAxMDAwMCwgOTk5NSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0M2ooKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0Qnl0ZXMoIDEwMDAwLCAxMDAwMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0M2soKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0R2V0Qnl0ZXMoIDEwMDAwMCwgMTAwMDAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXQ0YSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAwLCAxICk7IC8vIGZhaWxzIHdpdGggRU9GRXhjZXB0aW9uCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0YigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAxLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0YygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAxLCAxICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0ZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAxLCAyICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0ZSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAyLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0ZigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAyLCAxICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0ZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAyLCAyICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0aCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAyLCAzICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0aSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAxMDAwMCwgOTk5NSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0NGooKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0UHV0Qnl0ZXNHZXRCeXRlcyggMTAwMDAsIDEwMDAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ0aygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3RQdXRCeXRlc0dldEJ5dGVzKCAxMDAwMDAsIDEwMDAwMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0NWEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9ICk7CisJCWFzc2VydEVxdWFscyggMSwgYnVmLmdldCgpICk7CisJCWFzc2VydEVxdWFscyggMiwgYnVmLmdldCgpICk7CisJCWFzc2VydEVxdWFscyggMywgYnVmLmdldCgpICk7CisJCWNoZWNrQnVmKCBidWYsIDMsIDMsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldDViKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIsIDMgfSwgMiApOworCQlhc3NlcnRFcXVhbHMoIDEsIGJ1Zi5nZXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIGJ1Zi5nZXQoKSApOworCQljaGVja0J1ZiggYnVmLCAyLCAyLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXQ1YygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH0sIDEsIDIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBidWYuZ2V0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBidWYuZ2V0KCkgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMywgMywgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0NigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyA1LCA2LCA3LCA4IH0gKTsKKwkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW10geyAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKKwkJYnVmLmdldCggYnVmZmVyLCAxLCAzICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDExLCBidWZmZXJbMF0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgNSwgYnVmZmVyWzFdICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDYsIGJ1ZmZlclsyXSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSA3LCBidWZmZXJbM10gKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMTUsIGJ1ZmZlcls0XSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29tcGFjdCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH0sIDEsIDMgKTsKKwkJYnVmLmNvbXBhY3QoKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMywgMCwgMyApOworCQlhc3NlcnRFcXVhbHMoIDIsIGJ1Zi5nZXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDMsIGJ1Zi5nZXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDQsIGJ1Zi5nZXQoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0Qnl0ZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMTI3LCAxLCAwLCAtMSwgLTEyOCB9ICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDEyNywgYnVmLmdldEJ5dGUoKSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAxLCBidWYuZ2V0Qnl0ZSgpICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDAsIGJ1Zi5nZXRCeXRlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgLTEsIGJ1Zi5nZXRCeXRlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgLTEyOCwgYnVmLmdldEJ5dGUoKSApOworCQljaGVja0J1ZiggYnVmLCA1LCA1LCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRCeXRlMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLmdldEJ5dGUoKTsgLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFNob3J0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyLCAtMSwgLTIgfSApOworCQlhc3NlcnRFcXVhbHMoIChzaG9ydCkgMHgwMTAyLCBidWYuZ2V0U2hvcnQoKSApOworCQlhc3NlcnRFcXVhbHMoIChzaG9ydCkgMHhmZmZlLCBidWYuZ2V0U2hvcnQoKSApOworCQljaGVja0J1ZiggYnVmLCA0LCA0LCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRTaG9ydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5nZXRTaG9ydCgpOyAvLyBmYWlscyB3aXRoIEVPRkV4Y2VwdGlvbgorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0SW50MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCAtMSwgLTIsIC0zLCAtNCB9ICk7CisJCWFzc2VydEVxdWFscyggMHgwMTAyMDMwNCwgYnVmLmdldEludCgpICk7CisJCWFzc2VydEVxdWFscyggMHhmZmZlZmRmYywgYnVmLmdldEludCgpICk7CisJCWNoZWNrQnVmKCBidWYsIDgsIDgsIDAgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBFT0ZFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGdldEludDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5nZXRJbnQoKTsgLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldExvbmcxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQkxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LAorCQkJLTEsIC0yLCAtMywgLTQsIC01LCAtNiwgLTcsIC04CisJCX0gKTsKKwkJCisJCWFzc2VydEVxdWFscyggMHgwMTAyMDMwNDA1MDYwNzA4TCwgYnVmLmdldExvbmcoKSApOworCQlhc3NlcnRFcXVhbHMoIDB4ZmZmZWZkZmNmYmZhZjlmOEwsIGJ1Zi5nZXRMb25nKCkgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMTYsIDE2LCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXRMb25nMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLmdldExvbmcoKTsgLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEZsb2F0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJMCwgMCwgMCwgMAorCQkJLCA2MywgLTEyOCwgMCwgMAorCQkJLCA4MywgLTExMywgNDgsIC0zNworCQkJLCAxMDAsIC05OCwgLTExMiwgLTEyMAorCQkJLCAxMTcsIC0xMjAsIDIwLCAyNQorCQkJLCAtNjUsIC0xMjgsIDAsIDAKKwkJCSwgLTQ1LCAtMTEzLCA0OCwgLTM3CisJCQksIC0yOCwgLTk4LCAtMTEyLCAtMTIwCisJCQksIC0xMSwgLTEyMCwgMjAsIDI1CisJCQksIDUwLCA4MywgNzksIC03CisJCQksIDM0LCA0NCwgLTg3LCA5MAorCQkJLCAxNywgLTM4LCAtODUsIDExNQorCQkJLCAtNzgsIDgzLCA3OSwgLTcKKwkJCSwgLTk0LCA0NCwgLTg3LCA5MAorCQkJLCAtMTExLCAtMzgsIC04NSwgMTE1CisJCX0gKTsKKworCQlhc3NlcnRFcXVhbHMoIDAuMGYsIGJ1Zi5nZXRGbG9hdCgpICk7CisJCWFzc2VydEVxdWFscyggMS4wZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMjNlMTBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDIzNGUyMGYsIGJ1Zi5nZXRGbG9hdCgpICk7CisJCWFzc2VydEVxdWFscyggMzQ1ZTMwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMS4wZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMTIzZTEwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMjM0ZTIwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMzQ1ZTMwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMjNlLTEwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMzRlLTIwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzNDVlLTMwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMTIzZS0xMGYsIGJ1Zi5nZXRGbG9hdCgpICk7CisJCWFzc2VydEVxdWFscyggLTIzNGUtMjBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIC0zNDVlLTMwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMTUqNCwgMTUqNCwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEVPRkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0RmxvYXQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuZ2V0RmxvYXQoKTsgLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldERvdWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKwkJCSwgNjMsIC0xNiwgMCwgMCwgMCwgMCwgMCwgMAorCQkJLCA2NiwgMTEzLCAtMjYsIDI3LCAxMDQsIC02NCwgMCwgMAorCQkJLCA4NSwgNDgsIC03MywgODgsIDY4LCA4OSwgLTYsIC04MAorCQkJLCAxMDUsIC00LCA0MywgMTEyLCAxMjIsIC0zMSwgNjcsIC0xMTYKKwkJCSwgLTY1LCAtMTYsIDAsIDAsIDAsIDAsIDAsIDAKKwkJCSwgLTYyLCAxMTMsIC0yNiwgMjcsIDEwNCwgLTY0LCAwLCAwCisJCQksIC00MywgNDgsIC03MywgODgsIDY4LCA4OSwgLTYsIC04MAorCQkJLCAtMjMsIC00LCA0MywgMTEyLCAxMjIsIC0zMSwgNjcsIC0xMTYKKwkJCSwgNjIsIDc0LCAxMDUsIC0xLCAyNywgODUsIDgwLCA4MQorCQkJLCA0MywgLTg3LCAtMTA1LCA2NCwgLTM2LCAtMjMsIC00OCwgLTY2CisJCQksIDIyLCAtMTYsIC0xMjcsIDczLCAxMTEsIDkxLCAtNzUsIC0yOQorCQkJLCAtNjYsIDc0LCAxMDUsIC0xLCAyNywgODUsIDgwLCA4MQorCQkJLCAtODUsIC04NywgLTEwNSwgNjQsIC0zNiwgLTIzLCAtNDgsIC02NgorCQkJLCAtMTA2LCAtMTYsIC0xMjcsIDczLCAxMTEsIDkxLCAtNzUsIC0yOQorCQl9KTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKCAwLjAsICAgICAgICAgICAgICBidWYuZ2V0RG91YmxlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCAxLjAsICAgICAgICAgICAgICBidWYuZ2V0RG91YmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIDEyM2UxMCwgICAgICAgICAgIGJ1Zi5nZXREb3VibGUoKSk7CisJCWFzc2VydEVxdWFscyggMjM0ZTEwMCwgICAgICAgICAgYnVmLmdldERvdWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCAzNDVlMjAwLCAgICAgICAgICBidWYuZ2V0RG91YmxlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCAtMS4wLCAgICAgICAgICAgICBidWYuZ2V0RG91YmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIC0xMjNlMTAsICAgICAgICAgIGJ1Zi5nZXREb3VibGUoKSk7CisJCWFzc2VydEVxdWFscyggLTIzNGUxMDAsICAgICAgICAgYnVmLmdldERvdWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMzQ1ZTIwMCwgICAgICAgICBidWYuZ2V0RG91YmxlKCkpOworCisJCWFzc2VydEVxdWFscyggMTIzZS0xMCwgICAgICAgICAgYnVmLmdldERvdWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMzRlLTEwMCwgICAgICAgICBidWYuZ2V0RG91YmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIDM0NWUtMjAwLCAgICAgICAgIGJ1Zi5nZXREb3VibGUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCAtMTIzZS0xMCwgICAgICAgICAgYnVmLmdldERvdWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMjM0ZS0xMDAsICAgICAgICAgYnVmLmdldERvdWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMzQ1ZS0yMDAsICAgICAgICAgYnVmLmdldERvdWJsZSgpKTsKKworCQljaGVja0J1ZiggYnVmLCAxNSo4LCAxNSo4LCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBnZXREb3VibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuZ2V0RG91YmxlKCk7IC8vIGZhaWxzIHdpdGggRU9GRXhjZXB0aW9uCisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRGdWxseTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiwgMywgNCwgNSwgNiB9ICk7CisJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbM107CisJCWJ1Zi5nZXRGdWxseSggYiApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAxLCBiWzBdICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDIsIGJbMV0gKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMywgYlsyXSApOworCQlidWYuZ2V0RnVsbHkoIGIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgNCwgYlswXSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSA1LCBiWzFdICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDYsIGJbMl0gKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgNiwgNiwgMCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IEVPRkV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgZ2V0RnVsbHkyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIgfSApOworCQlieXRlW10gYiA9IG5ldyBieXRlWzNdOworCQlidWYuZ2V0RnVsbHkoIGIgKTsgLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwl9CisJCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY2FzZXMgZm9yIEZsZXhCdWZmZXIgcHV0KCBGbGV4QnVmZmVyICk6CisJLy8gcHV0LCBwdXQgRmxleEJ1ZmZlciB3aXRoIHZhbGlkIGJ1ZmZlcgorICAgIC8vIHB1dCwgcHV0IEZsZXhidWZmZXIgdG8gYSBGbGV4YnVmZmVyIGFwcHJvYWNoaW5nIG1heCBsZW5ndGgsIGZhaWxzIHdpdGggSU9FeGNlcHRpb24uCisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXRGbGV4QnVmZmVyMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmMCA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnB1dCggYnVmMCApOworCQljaGVja0J1ZiggYnVmLCBidWYwLmxlbmd0aCgpLCBidWYwLmxlbmd0aCgpLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dEZsZXhCdWZmZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYwID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKwkJCisJCWludCBtYXggPSA0KjEwMjQqMTAyNDsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbbWF4XSApOworCQlidWYuc2V0SW5kZXgobWF4KTsKKwkJYnVmLnB1dCggYnVmMCApOworCX0KKwkJCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY2FzZXMgZm9yIEZsZXhCdWZmZXIgcHV0KCBGbGV4QnVmZmVyLCBpbnQgKToKKwkvLyBwdXQsIHB1dCBGbGV4QnVmZmVyIHdpdGggbGVuZ3RoIGxhcmdlciB0aGFuIGF2YWlsYWJsZSBieXRlcywgZmFpbHMgd2l0aCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkvLyBwdXQsIHB1dCBGbGV4QnVmZmVyIHdpdGggdmFsaWQgbGVuZ3RoIHZhbHVlCisgICAgLy8gcHV0LCBwdXQgRmxleGJ1ZmZlciB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dEZsZXhCdWZmZXIzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYwID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKwkJCisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnNldEluZGV4KDApOworCQlidWYucHV0KCBidWYwLCAzKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXRGbGV4QnVmZmVyNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmMCA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnB1dCggYnVmMCwgMSApOworCQljaGVja0J1ZiggYnVmLCAxLCAxLCAwICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dEZsZXhCdWZmZXI1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYwID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKwkJaW50IG1heCA9IDQqMTAyNCoxMDI0OworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVttYXhdICk7CisJCWJ1Zi5zZXRJbmRleChtYXgpOworCQlidWYucHV0KCBidWYwLCAxKTsKKwl9CisJCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY2FzZXMgZm9yIHZvaWQgcHV0Qnl0ZSggYnl0ZSApOgorCS8vIHB1dEJ5dGUsIHB1dCBieXRlIHZhbHVlIGFuZCBleHBlY3QgZ2V0Qnl0ZSB0byByZXR1cm4gbWF0Y2hlZCB2YWx1ZS4KKyAgICAvLyBwdXRCeXRlIHRvIGEgRmxleGJ1ZmZlciBhcHByb2FjaGluZyBtYXggbGVuZ3RoLCBmYWlscyB3aXRoIElPRXhjZXB0aW9uLgorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0Qnl0ZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5wdXRCeXRlKCAoYnl0ZSkgMHgwMSApOworCQljaGVja0J1ZiggYnVmLCAxLCAxLCAwICk7CisJCWJ1Zi5zZXRJbmRleCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMHgwMSwgYnVmLmdldEJ5dGUoKSApOworCQljaGVja0J1ZiggYnVmLCAxLCAxLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXRCeXRlMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludCBtYXggPSA0KjEwMjQqMTAyNDsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbbWF4XSApOworCQlidWYuc2V0SW5kZXgobWF4KTsKKwkJYnVmLnB1dEJ5dGUoIChieXRlKSAweDAxICk7CisJfQorCQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhc2VzIGZvciB2b2lkIHB1dERvdWJsZSggZG91YmxlICk6CisJLy8gcHV0RG91YmxlLCBwdXQgRG91YmxlIGFuZCBleHBlY3QgZ2V0RG91YmxlIHRvIHJldHVybiBtYXRjaGVkIHZhbHVlLgorICAgIC8vIHB1dERvdWJsZSB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dERvdWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCS8vIHNvbWUgcmVhc29uYWJsZSB2YWx1ZXMKKwkJYnVmLnB1dERvdWJsZSggMC4wICk7CisJCWJ1Zi5wdXREb3VibGUoIDEuMCApOworCQlidWYucHV0RG91YmxlKCAxMjNlMTAgKTsKKwkJYnVmLnB1dERvdWJsZSggMjM0ZTEwMCApOworCQlidWYucHV0RG91YmxlKCAzNDVlMjAwICk7CisJCS8vIG5lZ2F0aXZlIG9mIHNvbWUgcmVhc29uYWJsZSB2YWx1ZXMKKwkJYnVmLnB1dERvdWJsZSggLTEuMCApOworCQlidWYucHV0RG91YmxlKCAtMTIzZTEwICk7CisJCWJ1Zi5wdXREb3VibGUoIC0yMzRlMTAwICk7CisJCWJ1Zi5wdXREb3VibGUoIC0zNDVlMjAwICk7CisJCS8vIHRpbnkKKwkJYnVmLnB1dERvdWJsZSggMTIzZS0xMCApOworCQlidWYucHV0RG91YmxlKCAyMzRlLTEwMCApOworCQlidWYucHV0RG91YmxlKCAzNDVlLTIwMCApOworCQkvLyB0aW55IGFuZCBuZWdhdGl2ZQorCQlidWYucHV0RG91YmxlKCAtMTIzZS0xMCApOworCQlidWYucHV0RG91YmxlKCAtMjM0ZS0xMDAgKTsKKwkJYnVmLnB1dERvdWJsZSggLTM0NWUtMjAwICk7CisJCWNoZWNrQnVmKCBidWYsIDE1KjgsIDE1KjgsIDAgKTsKKwkJCisJCS8vIHZlcmlmeSB3ZSBjYW4gcmVsaWFibHkgcmVhZCB0aGUgZGF0YSB3ZSB3cm90ZS4KKwkJCisJCWJ1Zi5zZXRJbmRleCggMCApOworCQlhc3NlcnRFcXVhbHMoIDAuMCwgYnVmLmdldERvdWJsZSgpICk7CisJCWFzc2VydEVxdWFscyggMS4wLCBidWYuZ2V0RG91YmxlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMjNlMTAsIGJ1Zi5nZXREb3VibGUoKSApOworCQlhc3NlcnRFcXVhbHMoIDIzNGUxMDAsIGJ1Zi5nZXREb3VibGUoKSApOworCQlhc3NlcnRFcXVhbHMoIDM0NWUyMDAsIGJ1Zi5nZXREb3VibGUoKSApOworCQlhc3NlcnRFcXVhbHMoIC0xLjAsIGJ1Zi5nZXREb3VibGUoKSApOworCQlhc3NlcnRFcXVhbHMoIC0xMjNlMTAsIGJ1Zi5nZXREb3VibGUoKSApOworCQlhc3NlcnRFcXVhbHMoIC0yMzRlMTAwLCBidWYuZ2V0RG91YmxlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMzQ1ZTIwMCwgYnVmLmdldERvdWJsZSgpICk7CisJCWFzc2VydEVxdWFscyggMTIzZS0xMCwgYnVmLmdldERvdWJsZSgpICk7CisJCWFzc2VydEVxdWFscyggMjM0ZS0xMDAsIGJ1Zi5nZXREb3VibGUoKSApOworCQlhc3NlcnRFcXVhbHMoIDM0NWUtMjAwLCBidWYuZ2V0RG91YmxlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMTIzZS0xMCwgYnVmLmdldERvdWJsZSgpICk7CisJCWFzc2VydEVxdWFscyggLTIzNGUtMTAwLCBidWYuZ2V0RG91YmxlKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMzQ1ZS0yMDAsIGJ1Zi5nZXREb3VibGUoKSApOworCQljaGVja0J1ZiggYnVmLCAxNSo4LCAxNSo4LCAwICk7CisJCQorCQkvLyB1bmNvbW1lbnQgdGhpcyBjb2RlIHRvIGdldCBhIGR1bXAgb2YgdGhlIGFjdHVhbAorCQkvLyBieXRlcyBmb3IgdGhlIGFib3ZlIGRhdGEuCisJCQorLy8JCWJ1Zi5zZXRJbmRleCggMCApOworLy8JCWludCBpID0gMDsKKy8vCQl3aGlsZSAoYnVmLmF2YWlsKCkgPiAwKQorLy8JCXsKKy8vCQkJU3lzdGVtLm91dC5wcmludGYoIGkgPT0gMCA/ICIlZCIgOiAiLCAlZCIsIGJ1Zi5nZXRCeXRlKCkgKTsKKy8vCQkJaWYgKGkrKyAlIDggPT0gNykKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8JCX0KKwkJCisJCWJ5dGVbXSBleHBlY3RlZCA9CisJCXsKKwkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKwkJCSwgNjMsIC0xNiwgMCwgMCwgMCwgMCwgMCwgMAorCQkJLCA2NiwgMTEzLCAtMjYsIDI3LCAxMDQsIC02NCwgMCwgMAorCQkJLCA4NSwgNDgsIC03MywgODgsIDY4LCA4OSwgLTYsIC04MAorCQkJLCAxMDUsIC00LCA0MywgMTEyLCAxMjIsIC0zMSwgNjcsIC0xMTYKKwkJCSwgLTY1LCAtMTYsIDAsIDAsIDAsIDAsIDAsIDAKKwkJCSwgLTYyLCAxMTMsIC0yNiwgMjcsIDEwNCwgLTY0LCAwLCAwCisJCQksIC00MywgNDgsIC03MywgODgsIDY4LCA4OSwgLTYsIC04MAorCQkJLCAtMjMsIC00LCA0MywgMTEyLCAxMjIsIC0zMSwgNjcsIC0xMTYKKwkJCSwgNjIsIDc0LCAxMDUsIC0xLCAyNywgODUsIDgwLCA4MQorCQkJLCA0MywgLTg3LCAtMTA1LCA2NCwgLTM2LCAtMjMsIC00OCwgLTY2CisJCQksIDIyLCAtMTYsIC0xMjcsIDczLCAxMTEsIDkxLCAtNzUsIC0yOQorCQkJLCAtNjYsIDc0LCAxMDUsIC0xLCAyNywgODUsIDgwLCA4MQorCQkJLCAtODUsIC04NywgLTEwNSwgNjQsIC0zNiwgLTIzLCAtNDgsIC02NgorCQkJLCAtMTA2LCAtMTYsIC0xMjcsIDczLCAxMTEsIDkxLCAtNzUsIC0yOQorCQl9OworCQkKKwkJYnVmLnNldEluZGV4KCAwICk7CisJCWJ5dGVbXSBhY3R1YWwgPSBidWYuZ2V0QXZhaWxCeXRlcygpOworCQkKKwkJYnl0ZXNBc3NlcnRFcXVhbHMoIGV4cGVjdGVkLCBhY3R1YWwgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGJ5dGVzQXNzZXJ0RXF1YWxzKCBieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwgKQorCXsKKwkJYXNzZXJ0RXF1YWxzKCBleHBlY3RlZC5sZW5ndGgsIGFjdHVhbC5sZW5ndGggKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKKwkJCWFzc2VydEVxdWFscyggImV4cGVjdGVkWyIraSsiXS9hY3R1YWxbIitpKyJdIiwgZXhwZWN0ZWRbaV0sIGFjdHVhbFtpXSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXREb3VibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IG1heCA9IDQqMTAyNCoxMDI0OworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVttYXhdICk7CisJCWJ1Zi5zZXRJbmRleCggbWF4ICk7CisJCWJ1Zi5wdXREb3VibGUoIDAuMCApOworCX0KKwkJCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY2FzZXMgZm9yIHZvaWQgcHV0RmxvYXQoIGZsb2F0ICk6CisJLy8gcHV0RmxvYXQsIHB1dCBGbG9hdCBhbmQgZXhwZWN0IGdldEZsb2F0IHRvIHJldHVybiBtYXRjaGVkIHZhbHVlLgorICAgIC8vIHB1dEZsb2F0IHRvIGEgRmxleGJ1ZmZlciBhcHByb2FjaGluZyBtYXggbGVuZ3RoLCBmYWlscyB3aXRoIElPRXhjZXB0aW9uLgorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcHV0RmxvYXQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQkvLyBzb21lIHJlYXNvbmFibGUgdmFsdWVzCisJCWJ1Zi5wdXRGbG9hdCggMC4wZiApOworCQlidWYucHV0RmxvYXQoIDEuMGYgKTsKKwkJYnVmLnB1dEZsb2F0KCAxMjNlMTBmICk7CisJCWJ1Zi5wdXRGbG9hdCggMjM0ZTIwZiApOworCQlidWYucHV0RmxvYXQoIDM0NWUzMGYgKTsKKwkJLy8gbmVnYXRpdmUgb2Ygc29tZSByZWFzb25hYmxlIHZhbHVlcworCQlidWYucHV0RmxvYXQoIC0xLjBmICk7CisJCWJ1Zi5wdXRGbG9hdCggLTEyM2UxMGYgKTsKKwkJYnVmLnB1dEZsb2F0KCAtMjM0ZTIwZiApOworCQlidWYucHV0RmxvYXQoIC0zNDVlMzBmICk7CisJCS8vIHRpbnkKKwkJYnVmLnB1dEZsb2F0KCAxMjNlLTEwZiApOworCQlidWYucHV0RmxvYXQoIDIzNGUtMjBmICk7CisJCWJ1Zi5wdXRGbG9hdCggMzQ1ZS0zMGYgKTsKKwkJLy8gdGlueSBhbmQgbmVnYXRpdmUKKwkJYnVmLnB1dEZsb2F0KCAtMTIzZS0xMGYgKTsKKwkJYnVmLnB1dEZsb2F0KCAtMjM0ZS0yMGYgKTsKKwkJYnVmLnB1dEZsb2F0KCAtMzQ1ZS0zMGYgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMTUqNCwgMTUqNCwgMCApOworCQkKKwkJLy8gdmVyaWZ5IHdlIGNhbiByZWxpYWJseSByZWFkIHRoZSBkYXRhIHdlIHdyb3RlLgorCQkKKwkJYnVmLnNldEluZGV4KCAwICk7CisJCWFzc2VydEVxdWFscyggMC4wZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLjBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDEyM2UxMGYsIGJ1Zi5nZXRGbG9hdCgpICk7CisJCWFzc2VydEVxdWFscyggMjM0ZTIwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzNDVlMzBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIC0xLjBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIC0xMjNlMTBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIC0yMzRlMjBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIC0zNDVlMzBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDEyM2UtMTBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDIzNGUtMjBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDM0NWUtMzBmLCBidWYuZ2V0RmxvYXQoKSApOworCQlhc3NlcnRFcXVhbHMoIC0xMjNlLTEwZiwgYnVmLmdldEZsb2F0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAtMjM0ZS0yMGYsIGJ1Zi5nZXRGbG9hdCgpICk7CisJCWFzc2VydEVxdWFscyggLTM0NWUtMzBmLCBidWYuZ2V0RmxvYXQoKSApOworCQljaGVja0J1ZiggYnVmLCAxNSo0LCAxNSo0LCAwICk7CisJCQorCQkvLyB1bmNvbW1lbnQgdGhpcyBjb2RlIHRvIGdldCBhIGR1bXAgb2YgdGhlIGFjdHVhbAorCQkvLyBieXRlcyBmb3IgdGhlIGFib3ZlIGRhdGEuCisJCQorLy8JCWJ1Zi5zZXRJbmRleCggMCApOworLy8JCWludCBpID0gMDsKKy8vCQl3aGlsZSAoYnVmLmF2YWlsKCkgPiAwKQorLy8JCXsKKy8vCQkJU3lzdGVtLm91dC5wcmludGYoIGkgPT0gMCA/ICIlZCIgOiAiLCAlZCIsIGJ1Zi5nZXRCeXRlKCkgKTsKKy8vCQkJaWYgKGkrKyAlIDggPT0gNykKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8JCX0KKwkJCisJCWJ5dGVbXSBleHBlY3RlZCA9CisJCXsKKwkJCTAsIDAsIDAsIDAKKwkJCSwgNjMsIC0xMjgsIDAsIDAKKwkJCSwgODMsIC0xMTMsIDQ4LCAtMzcKKwkJCSwgMTAwLCAtOTgsIC0xMTIsIC0xMjAKKwkJCSwgMTE3LCAtMTIwLCAyMCwgMjUKKwkJCSwgLTY1LCAtMTI4LCAwLCAwCisJCQksIC00NSwgLTExMywgNDgsIC0zNworCQkJLCAtMjgsIC05OCwgLTExMiwgLTEyMAorCQkJLCAtMTEsIC0xMjAsIDIwLCAyNQorCQkJLCA1MCwgODMsIDc5LCAtNworCQkJLCAzNCwgNDQsIC04NywgOTAKKwkJCSwgMTcsIC0zOCwgLTg1LCAxMTUKKwkJCSwgLTc4LCA4MywgNzksIC03CisJCQksIC05NCwgNDQsIC04NywgOTAKKwkJCSwgLTExMSwgLTM4LCAtODUsIDExNQorCQl9OworCQkKKwkJYnVmLnNldEluZGV4KCAwICk7CisJCWJ5dGVbXSBhY3R1YWwgPSBidWYuZ2V0QXZhaWxCeXRlcygpOworCQkKKwkJYnl0ZXNBc3NlcnRFcXVhbHMoIGV4cGVjdGVkLCBhY3R1YWwgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dEZsb2F0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludCBtYXggPSA0KjEwMjQqMTAyNDsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbbWF4XSApOworCQlidWYuc2V0SW5kZXgobWF4KTsKKwkJYnVmLnB1dEZsb2F0KCAwLjBmICk7CisJfQorCQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhc2VzIGZvciB2b2lkIHB1dEludCggaW50ICk6CisJLy8gcHV0SW50LCBwdXQgSW50IGFuZCBleHBlY3QgZ2V0SW50IHRvIHJldHVybiBtYXRjaGVkIHZhbHVlLgorICAgIC8vIHB1dEludCB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dEludDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5wdXRJbnQoIEludGVnZXIuTUFYX1ZBTFVFICk7CisJCWNoZWNrQnVmKCBidWYsIDQsIDQsIDAgKTsKKwkJYnVmLnNldEluZGV4KDApOworCQlhc3NlcnRFcXVhbHMoIEludGVnZXIuTUFYX1ZBTFVFLCBidWYuZ2V0SW50KCkgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgNCwgNCwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgcHV0SW50MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludCBtYXggPSA0KjEwMjQqMTAyNDsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbbWF4XSApOworCQlidWYuc2V0SW5kZXgobWF4KTsKKwkJYnVmLnB1dEludCggSW50ZWdlci5NSU5fVkFMVUUgKTsKKwl9CisJCQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhc2VzIGZvciB2b2lkIHB1dExvbmcoIGxvbmcgKToKKwkvLyBwdXRMb25nLCBwdXQgTG9uZyBhbmQgZXhwZWN0IGdldExvbmcgdG8gcmV0dXJuIG1hdGNoZWQgdmFsdWUuCisgICAgLy8gcHV0U2hvcnQgdG8gYSBGbGV4YnVmZmVyIGFwcHJvYWNoaW5nIG1heCBsZW5ndGgsIGZhaWxzIHdpdGggSU9FeGNlcHRpb24uCisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXRMb25nMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnB1dExvbmcoIExvbmcuTUFYX1ZBTFVFICk7CisJCWNoZWNrQnVmKCBidWYsIDgsIDgsIDAgKTsKKwkJYnVmLnNldEluZGV4KDApOworCQlhc3NlcnRFcXVhbHMoIExvbmcuTUFYX1ZBTFVFLCBidWYuZ2V0TG9uZygpICk7CisJCWNoZWNrQnVmKCBidWYsIDgsIDgsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHB1dExvbmcyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IG1heCA9IDQqMTAyNCoxMDI0OworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVttYXhdICk7CisJCWJ1Zi5zZXRJbmRleChtYXgpOworCQlidWYucHV0TG9uZyggTG9uZy5NSU5fVkFMVUUgKTsKKwl9CisJCQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhc2VzIGZvciB2b2lkIHB1dFNob3J0KCBzaG9ydCApOgorCS8vIHB1dFNob3J0LCBwdXQgc2hvcnQgYW5kIGV4cGVjdCBnZXRTaG9ydCB0byByZXR1cm4gbWF0Y2hlZCB2YWx1ZS4KKyAgICAvLyBwdXRTaG9ydCB0byBhIEZsZXhidWZmZXIgYXBwcm9hY2hpbmcgbWF4IGxlbmd0aCwgZmFpbHMgd2l0aCBJT0V4Y2VwdGlvbi4KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dFNob3J0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnB1dFNob3J0KCBTaG9ydC5NQVhfVkFMVUUgKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMiwgMiwgMCApOworCQlidWYuc2V0SW5kZXgoMCk7CisJCWFzc2VydEVxdWFscyggU2hvcnQuTUFYX1ZBTFVFLCBidWYuZ2V0U2hvcnQoKSApOworCQljaGVja0J1ZiggYnVmLCAyLCAyLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwdXRTaG9ydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpbnQgbWF4ID0gNCoxMDI0KjEwMjQ7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW21heF0gKTsKKwkJYnVmLnNldEluZGV4KG1heCk7CisJCWJ1Zi5wdXRTaG9ydCggKHNob3J0KSAxICk7CisJfQorCQkKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBjYXNlcyBmb3IgRmxleEJ1ZmZlciBza2lwKCBpbnQsIGJvb2xlYW4gKToKKwkvLyBza2lwIGxlbmd0aCA8IDAsIHB1dCA9IGZhbHNlLiAgCQkJCS8vIGZhaWxzIHdpdGggaWxsZWdhbCBhcmd1bWVudAorCS8vIHNraXAgbGVuZ3RoID4gYnVmZmVyIGxlbmd0aCwgcHV0ID0gZmFsc2UuICAJLy8gZmFpbHMgd2l0aCBFT0ZFeGNlcHRpb24KKwkvLyBza2lwIGxlbmd0aCA9IDAsIHB1dCA9IGZhbHNlLgorCS8vIHNraXAgbGVuZ3RoID0gYnVmZmVyIGxlbmd0aCwgcHV0ID0gZmFsc2UuCisJLy8gc2tpcCBsZW5ndGggPCBidWZmZXIgbGVuZ3RoLCBwdXQgPSBmYWxzZS4KKwkvLyBza2lwIGxlbmd0aCA+IGJ1ZmZlciBsZW5ndGgsIHB1dCA9IHRydWUuCisJLy8gc2tpcCBsZW5ndGggPCBidWZmZXIgbGVuZ3RoLCBwdXQgPSB0cnVlLgorICAgIC8vIHNraXAgbGVuZ3RoID0gbWF4IGJ1ZmZlciBsZW5ndGgsIHB1dCA9IHRydWUuCS8vIGZhaWxzIHdpdGggSU9FeGNlcHRpb24KKwkJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBza2lwMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoKTsKKwkJYnVmLnNraXAoLTEsIGZhbHNlKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBza2lwMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKwkJYnVmLnNraXAoMywgZmFsc2UpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNraXAzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlcigpOworCQlidWYuc2tpcCgwLCBmYWxzZSk7CisJCWNoZWNrQnVmKCBidWYsIDAsIDAsIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBza2lwNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKwkJYnVmLnNraXAoMiwgZmFsc2UpOworCQljaGVja0J1ZiggYnVmLCAyLCAyLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2tpcDUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisJCWJ1Zi5za2lwKDEsIGZhbHNlKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMiwgMSwgMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNraXA2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXSB7IDEsIDIgfSApOworCQlidWYuc2tpcCgxLCB0cnVlKTsKKwkJY2hlY2tCdWYoIGJ1ZiwgMiwgMSwgMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2tpcDcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMSwgMiB9ICk7CisJCWJ1Zi5za2lwKDUsIHRydWUpOworCQljaGVja0J1ZiggYnVmLCA1LCA1LCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBza2lwOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAxLCAyIH0gKTsKKwkJaW50IG1heCA9IDQqMTAyNCoxMDI0OworCQlidWYuc2tpcChtYXgrMSwgdHJ1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Rlc3RIZWxwLmphdmEgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvVGVzdEhlbHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVhMWFiCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Rlc3RIZWxwLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBIZWxwIGZvciBqdW5pdCB0ZXN0cy4KKyAqLworcHVibGljIGNsYXNzIFRlc3RIZWxwCit7CisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVsRXJyb3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0UmVsRXJyb3IoIDEwLCA5LCAuMTEgKTsKKwkJYXNzZXJ0UmVsRXJyb3IoIDEwLCAxMSwgLjE0ICk7CisJCWFzc2VydFJlbEVycm9yKCAyMCwgMTksIC4wNyApOworCQlhc3NlcnRSZWxFcnJvciggMTksIDIzLCAuMjIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RSZWxFcnJvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRSZWxFcnJvciggOSwgOCwgLjEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RSZWxFcnJvcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRSZWxFcnJvciggOSwgMTAsIC4xICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFic0Vycm9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEFic0Vycm9yKCAxMSwgMTUsIDQgKTsKKwkJYXNzZXJ0QWJzRXJyb3IoIDE1LCAxMCwgNSApOworCQlhc3NlcnRBYnNFcnJvciggNSwgMywgMiApOworCQlhc3NlcnRBYnNFcnJvciggNCwgNywgMyApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBBc3NlcnRpb25FcnJvci5jbGFzcyApCisJcHVibGljIHZvaWQgdGVzdEFic0Vycm9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEFic0Vycm9yKCAxMSwgMTUsIDMgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RBYnNFcnJvcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRBYnNFcnJvciggMTksIDE1LCAzICk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSB0aHJlYWQgdG8gZGVsYXkgcnVubmluZyBzb21ldGhpbmcuCisJICogQHBhcmFtIGRlbGF5CisJICogQHBhcmFtIHJ1bm5hYmxlCisJICogQHJldHVybiB0aGUgdGhyZWFkIHdoaWNoIGlzIG5vdCBzdGFydGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVGhyZWFkIGRlbGF5KCBmaW5hbCBpbnQgZGVsYXksIGZpbmFsIERlbGF5UnVubmFibGUgcnVubmFibGUgKQorCXsKKwkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCBuZXcgUnVubmFibGUoKQorCQl7CisJCQlwdWJsaWMgdm9pZCBydW4oKQorCQkJeworCQkJCXRyeQorCQkJCXsKKwkJCQkJVGhyZWFkLnNsZWVwKCBkZWxheSApOworCQkJCQlydW5uYWJsZS5ydW4oKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBFeGNlcHRpb24gZSApCisJCQkJeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfSApOworCQlyZXR1cm4gdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgdGhyZWFkIHRvIGRlbGF5IHJ1bm5pbmcgc29tZXRoaW5nLgorCSAqIEBwYXJhbSBkZWxheQorCSAqIEBwYXJhbSBydW5uYWJsZQorCSAqIEByZXR1cm4gdGhlIHRocmVhZCB3aGljaCBpcyBzdGFydGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVGhyZWFkIGRlbGF5QW5kU3RhcnQoIGZpbmFsIGludCBkZWxheSwgZmluYWwgRGVsYXlSdW5uYWJsZSBydW5uYWJsZSApCisJeworCQlUaHJlYWQgdCA9IGRlbGF5KCBkZWxheSwgcnVubmFibGUgKTsKKwkJdC5zdGFydCgpOworCQlyZXR1cm4gdDsKKwl9CisJCisJLyoqCisJICogSW50ZXJmYWNlIHRvIGltcGxlbWVudCB3aGVuIHVzaW5nIGRlbGF5LgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgRGVsYXlSdW5uYWJsZQorCXsKKwkJLyoqCisJCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJCSAqLworCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uOworCX0KKworCS8qKgorCSAqIENvbXBhcmUgZG91YmxlcyB3aXRoIHJlbGF0aXZlIGVycm9yLgorCSAqIEBwYXJhbSBleHBlY3RlZAorCSAqIEBwYXJhbSBhY3R1YWwKKwkgKiBAcGFyYW0gbWF4UmVsRXJyb3IKKwkgKiBAc2VlICNyZWxFcnJvcihkb3VibGUsIGRvdWJsZSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UmVsRXJyb3IoIGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgZG91YmxlIG1heFJlbEVycm9yICkKKwl7CisJCWRvdWJsZSByZWxFcnJvciA9IHJlbEVycm9yKCBleHBlY3RlZCwgYWN0dWFsICk7CisJCWlmIChyZWxFcnJvciA+IG1heFJlbEVycm9yKQorCQkJZmFpbCggU3RyaW5nLmZvcm1hdCggImV4cGVjdGVkOiA8JWY+IGJ1dCB3YXM6IDwlZj4gcmVsYXRpdmUgZXJyb3I6IDwlZj4iLCBleHBlY3RlZCwgYWN0dWFsLCByZWxFcnJvciApICk7CisJfQorCQorCS8qKgorCSAqIENvbXBhcmUgZG91YmxlcyB3aXRoIGFic29sdXRlIGVycm9yLgorCSAqIEBwYXJhbSBleHBlY3RlZAorCSAqIEBwYXJhbSBhY3R1YWwKKwkgKiBAcGFyYW0gbWF4QWJzRXJyb3IKKwkgKiBAc2VlICNhYnNFcnJvcihkb3VibGUsIGRvdWJsZSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QWJzRXJyb3IoIGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgZG91YmxlIG1heEFic0Vycm9yICkKKwl7CisJCWRvdWJsZSBhYnNFcnJvciA9IGFic0Vycm9yKCBleHBlY3RlZCwgYWN0dWFsICk7CisJCWlmIChhYnNFcnJvciA+IG1heEFic0Vycm9yKQorCQkJZmFpbCggU3RyaW5nLmZvcm1hdCggImV4cGVjdGVkOiA8JWY+IGJ1dCB3YXM6IDwlZj4gYWJzb2x1dGUgZXJyb3I6IDwlZj4iLCBleHBlY3RlZCwgYWN0dWFsLCBhYnNFcnJvciApICk7CisJfQorCQorCS8qKgorCSAqIENvbXB1dGVzIHRoZSByZWxhdGl2ZSBlcnJvciBiZXR3ZWVuIGFjdHVhbCBhbmQgZXhwZWN0ZWQuCisJICogQHBhcmFtIGV4cGVjdGVkCisJICogQHBhcmFtIGFjdHVhbAorCSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIGVycm9yIGFic0Vycm9yKCBleHBlY3RlZCwgYWN0dWFsICkgLyBleHBlY3RlZC4KKwkgKiBAc2VlICNhYnNFcnJvcihkb3VibGUsIGRvdWJsZSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZSByZWxFcnJvciggZG91YmxlIGV4cGVjdGVkLCBkb3VibGUgYWN0dWFsICkKKwl7CisJCXJldHVybiBhYnNFcnJvciggZXhwZWN0ZWQsIGFjdHVhbCApIC8gZXhwZWN0ZWQ7CisJfQorCQorCS8qKgorCSAqIENvbXB1dGVzIHRoZSBhYnNvbHV0ZSBlcnJvciBiZXR3ZWVuIGFjdHVhbCBhbmQgZXhwZWN0ZWQuCisJICogQHBhcmFtIGV4cGVjdGVkCisJICogQHBhcmFtIGFjdHVhbAorCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIGVycm9yIE1hdGguYWJzKCBleHBlY3RlZCAtIGFjdHVhbCApLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGFic0Vycm9yKCBkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwgKQorCXsKKwkJcmV0dXJuIE1hdGguYWJzKCBleHBlY3RlZCAtIGFjdHVhbCApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UZXN0TW9uaXRvci5qYXZhIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Rlc3RNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViN2E1NgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UZXN0TW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsNDI3IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKiBUZXN0IG9mIE1vbml0b3IgKi8KK3B1YmxpYyBjbGFzcyBUZXN0TW9uaXRvcgoreworCS8vIGNoYW5nZSB0aGlzIHRvIGEgbXVjaCBzbWFsbGVyIG51bWJlciAoZS5nLiwgMC4xKSB0byBhY3R1YWxseSB0ZXN0IHRoZQorCS8vIGNpcmN1bGFyIHF1ZXVlIHRpbWVvdXQgYWNjdXJhY3kuCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZG91YmxlIFJFTF9FUlJPUiA9IDEwMDAwMDsKKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQl0ZXN0Y29uc3RydWN0MSggbnVsbCApOworCQl0ZXN0Y29uc3RydWN0MSggImEiICk7CisJCXRlc3Rjb25zdHJ1Y3QxKCAiYiIgKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRlc3Rjb25zdHJ1Y3QxKCBTdHJpbmcgZGVzY3IgKQorCXsKKwkJTW9uaXRvcjxPYmplY3Q+IG0gPSBuZXcgTW9uaXRvcjxPYmplY3Q+KCBkZXNjciApOworCQlhc3NlcnRFcXVhbHMoIGRlc2NyLCBtLmdldERlc2NyaXB0aW9uKCkgKTsKKwkJYXNzZXJ0TnVsbCggbS5nZXQoKSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCBudWxsICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCB0cnVlICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCAxICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCBudWxsLCAiYWJjIiApOworCQl0ZXN0Y29uc3RydWN0MiggbnVsbCwgMy4xNDE1OSApOworCQkKKwkJdGVzdGNvbnN0cnVjdDIoICJhIiwgbnVsbCApOworCQl0ZXN0Y29uc3RydWN0MiggImIiLCB0cnVlICk7CisJCXRlc3Rjb25zdHJ1Y3QyKCAiYyIsIDEgKTsKKwkJdGVzdGNvbnN0cnVjdDIoICJkIiwgImFiYyIgKTsKKwkJdGVzdGNvbnN0cnVjdDIoICJlIiwgMy4xNDE1OSApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdGNvbnN0cnVjdDIoIFN0cmluZyBkZXNjciwgT2JqZWN0IHZhbHVlICkKKwl7CisJCU1vbml0b3I8T2JqZWN0PiBtID0gbmV3IE1vbml0b3I8T2JqZWN0PiggZGVzY3IsIHZhbHVlICk7CisJCWFzc2VydEVxdWFscyggZGVzY3IsIG0uZ2V0RGVzY3JpcHRpb24oKSApOworCQlhc3NlcnRFcXVhbHMoIHZhbHVlLCBtLmdldCgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbVRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAiTW9uaXRvciBudWxsOiBudWxsIiwgbmV3IE1vbml0b3I8T2JqZWN0PiggbnVsbCwgbnVsbCApLnRvU3RyaW5nKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiTW9uaXRvciBudWxsOiB0cnVlIiwgbmV3IE1vbml0b3I8T2JqZWN0PiggbnVsbCwgdHJ1ZSApLnRvU3RyaW5nKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiTW9uaXRvciBudWxsOiAxIiwgbmV3IE1vbml0b3I8T2JqZWN0PiggbnVsbCwgMSApLnRvU3RyaW5nKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiTW9uaXRvciBudWxsOiBhYmMiLCBuZXcgTW9uaXRvcjxPYmplY3Q+KCBudWxsLCAiYWJjIiApLnRvU3RyaW5nKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiTW9uaXRvciBudWxsOiAzLjE0MTU5IiwgbmV3IE1vbml0b3I8T2JqZWN0PiggbnVsbCwgMy4xNDE1OSApLnRvU3RyaW5nKCkgKTsKKworCQlhc3NlcnRFcXVhbHMoICJNb25pdG9yIGE6IG51bGwiLCBuZXcgTW9uaXRvcjxPYmplY3Q+KCAiYSIsIG51bGwgKS50b1N0cmluZygpICk7CisJCWFzc2VydEVxdWFscyggIk1vbml0b3IgYjogdHJ1ZSIsIG5ldyBNb25pdG9yPE9iamVjdD4oICJiIiwgdHJ1ZSApLnRvU3RyaW5nKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiTW9uaXRvciBjOiAxIiwgbmV3IE1vbml0b3I8T2JqZWN0PiggImMiLCAxICkudG9TdHJpbmcoKSApOworCQlhc3NlcnRFcXVhbHMoICJNb25pdG9yIGQ6IGFiYyIsIG5ldyBNb25pdG9yPE9iamVjdD4oICJkIiwgImFiYyIgKS50b1N0cmluZygpICk7CisJCWFzc2VydEVxdWFscyggIk1vbml0b3IgZTogMy4xNDE1OSIsIG5ldyBNb25pdG9yPE9iamVjdD4oICJlIiwgMy4xNDE1OSApLnRvU3RyaW5nKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxPYmplY3Q+IG0gPSBuZXcgTW9uaXRvcjxPYmplY3Q+KCAiYSIsIG51bGwgKTsKKwkJYXNzZXJ0RXF1YWxzKCBudWxsLCBtLnNldCggMSApICk7CisJCWFzc2VydEVxdWFscyggMSwgbS5zZXQoIDIgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIG0uc2V0KCBudWxsICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBudWxsLCBtLnNldCggbnVsbCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2V0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1vbml0b3I8T2JqZWN0PiBtID0gbmV3IE1vbml0b3I8T2JqZWN0PiggImEiLCAxICk7CisJCWFzc2VydEVxdWFscyggMSwgbS5zZXQoIDIgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIG0uc2V0KCBudWxsICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBudWxsLCBtLnNldCggbnVsbCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2V0Z2V0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxPYmplY3Q+IG0gPSBuZXcgTW9uaXRvcjxPYmplY3Q+KCAiYSIsIDEgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMSwgbS5zZXQoIDIgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIG0uZ2V0KCkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMiwgbS5zZXQoIG51bGwgKSApOworCQlhc3NlcnRFcXVhbHMoIG51bGwsIG0uZ2V0KCkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggbnVsbCwgbS5zZXQoIG51bGwgKSApOworCQlhc3NlcnRFcXVhbHMoIG51bGwsIG0uZ2V0KCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXRzeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZmluYWwgTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQlmaW5hbCBib29sZWFuW10gZmxhZyA9IG5ldyBib29sZWFuWzIwMDBdOworCQkKKwkJVGhyZWFkIHQxID0gVGVzdEhlbHAuZGVsYXkoIDAsIG5ldyBUZXN0SGVscC5EZWxheVJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkJCQl7CisJCQkJCUludGVnZXIgeCA9IG0uc2V0KCBpICk7CisJCQkJCWlmICh4ICE9IG51bGwpCisJCQkJCQlmbGFnW3hdID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0gKTsKKwkJCisJCVRocmVhZCB0MiA9IFRlc3RIZWxwLmRlbGF5KCAwLCBuZXcgVGVzdEhlbHAuRGVsYXlSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJZm9yIChpbnQgaSA9IDEwMDA7IGkgPCAyMDAwOyBpKyspCisJCQkJeworCQkJCQlJbnRlZ2VyIHggPSBtLnNldCggaSApOworCQkJCQlpZiAoeCAhPSBudWxsKQorCQkJCQkJZmxhZ1t4XSA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9ICk7CisKKwkJdDEuc3RhcnQoKTsKKwkJdDIuc3RhcnQoKTsKKwkJCisJCXQxLmpvaW4oKTsKKwkJdDIuam9pbigpOworCQkKKwkJSW50ZWdlciB4ID0gbS5zZXQoIG51bGwgKTsKKwkJaWYgKHggIT0gbnVsbCkKKwkJCWZsYWdbeF0gPSB0cnVlOworCQkKKwkJZm9yIChib29sZWFuIGI6IGZsYWcpCisJCQlhc3NlcnRUcnVlKCBiICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVudGlsRXExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQltLndhaXRVbnRpbEVxKCBudWxsICk7CisJCW0ud2FpdFVudGlsRXEoIG51bGwsIDAgKTsKKwkJCisJCW0uc2V0KCAxICk7CisJCW0ud2FpdFVudGlsRXEoIDEgKTsKKwkJbS53YWl0VW50aWxFcSggMSwgMCApOworCQkKKwkJbS5zZXQoIDIgKTsKKwkJbS53YWl0VW50aWxFcSggMiApOworCQltLndhaXRVbnRpbEVxKCAyLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IFRpbWVvdXRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1vbml0b3I8SW50ZWdlcj4gbSA9IG5ldyBNb25pdG9yPEludGVnZXI+KCAiYSIsIDEgKTsKKwkJbS53YWl0VW50aWxFcSggMiwgMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBUaW1lb3V0RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxFcTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNb25pdG9yPEludGVnZXI+IG0gPSBuZXcgTW9uaXRvcjxJbnRlZ2VyPiggImEiLCBudWxsICk7CisJCW0ud2FpdFVudGlsRXEoIDIsIDEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gVGltZW91dEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgd2FpdFVudGlsRXE0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgMSApOworCQltLndhaXRVbnRpbEVxKCBudWxsLCAxICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQltLndhaXRVbnRpbE5vdEVxKCAxICk7CisJCW0ud2FpdFVudGlsTm90RXEoIDEsIDAgKTsKKwkJCisJCW0uc2V0KCAxICk7CisJCW0ud2FpdFVudGlsTm90RXEoIG51bGwgKTsKKwkJbS53YWl0VW50aWxOb3RFcSggbnVsbCwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBUaW1lb3V0RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3RFcTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNb25pdG9yPEludGVnZXI+IG0gPSBuZXcgTW9uaXRvcjxJbnRlZ2VyPiggImEiLCBudWxsICk7CisJCW0ud2FpdFVudGlsTm90RXEoIG51bGwsIDEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gVGltZW91dEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXEzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgMSApOworCQltLndhaXRVbnRpbE5vdEVxKCAxLCAxICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVudGlsRXFBbmRTZXQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQlhc3NlcnRFcXVhbHMoIG51bGwsIG0ud2FpdFVudGlsRXFBbmRTZXQoIG51bGwsIDEgKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIG0ud2FpdFVudGlsRXFBbmRTZXQoIDEsIDIgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIG0ud2FpdFVudGlsRXFBbmRTZXQoIDIsIG51bGwgKSApOworCQlhc3NlcnRFcXVhbHMoIG51bGwsIG0ud2FpdFVudGlsRXFBbmRTZXQoIG51bGwsIG51bGwgKSApOworCisJCWFzc2VydEVxdWFscyggbnVsbCwgbS53YWl0VW50aWxFcUFuZFNldCggbnVsbCwgMCwgMSApICk7CisJCWFzc2VydEVxdWFscyggMSwgbS53YWl0VW50aWxFcUFuZFNldCggMSwgMCwgMiApICk7CisJCWFzc2VydEVxdWFscyggMiwgbS53YWl0VW50aWxFcUFuZFNldCggMiwgMCwgbnVsbCApICk7CisJCWFzc2VydEVxdWFscyggbnVsbCwgbS53YWl0VW50aWxFcUFuZFNldCggbnVsbCwgMCwgbnVsbCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IFRpbWVvdXRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxQW5kU2V0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1vbml0b3I8SW50ZWdlcj4gbSA9IG5ldyBNb25pdG9yPEludGVnZXI+KCAiYSIsIG51bGwgKTsKKwkJdHJ5CisJCXsKKwkJCW0ud2FpdFVudGlsRXFBbmRTZXQoIDEsIDEsIDIgKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWFzc2VydEVxdWFscyggbnVsbCwgbS5nZXQoKSApOworCQl9CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IFRpbWVvdXRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxQW5kU2V0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1vbml0b3I8SW50ZWdlcj4gbSA9IG5ldyBNb25pdG9yPEludGVnZXI+KCAiYSIsIDEgKTsKKwkJdHJ5CisJCXsKKwkJCW0ud2FpdFVudGlsRXFBbmRTZXQoIG51bGwsIDEsIDIgKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWFzc2VydEVxdWFscyggMSwgbS5nZXQoKSApOworCQl9CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXFBbmRTZXQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQlhc3NlcnRFcXVhbHMoIG51bGwsIG0ud2FpdFVudGlsTm90RXFBbmRTZXQoIDIsIDEgKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIG0ud2FpdFVudGlsTm90RXFBbmRTZXQoIDMsIDIgKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIG0ud2FpdFVudGlsTm90RXFBbmRTZXQoIDQsIG51bGwgKSApOworCQlhc3NlcnRFcXVhbHMoIG51bGwsIG0ud2FpdFVudGlsTm90RXFBbmRTZXQoIDUsIG51bGwgKSApOworCisJCWFzc2VydEVxdWFscyggbnVsbCwgbS53YWl0VW50aWxOb3RFcUFuZFNldCggMiwgMCwgMSApICk7CisJCWFzc2VydEVxdWFscyggMSwgbS53YWl0VW50aWxOb3RFcUFuZFNldCggMywgMCwgMiApICk7CisJCWFzc2VydEVxdWFscyggMiwgbS53YWl0VW50aWxOb3RFcUFuZFNldCggNCwgMCwgbnVsbCApICk7CisJCWFzc2VydEVxdWFscyggbnVsbCwgbS53YWl0VW50aWxOb3RFcUFuZFNldCggNSwgMCwgbnVsbCApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IFRpbWVvdXRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxQW5kU2V0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1vbml0b3I8SW50ZWdlcj4gbSA9IG5ldyBNb25pdG9yPEludGVnZXI+KCAiYSIsIG51bGwgKTsKKwkJdHJ5CisJCXsKKwkJCW0ud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIDEsIDEgKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWFzc2VydEVxdWFscyggbnVsbCwgbS5nZXQoKSApOworCQl9CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IFRpbWVvdXRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxQW5kU2V0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU1vbml0b3I8SW50ZWdlcj4gbSA9IG5ldyBNb25pdG9yPEludGVnZXI+KCAiYSIsIDEgKTsKKwkJdHJ5CisJCXsKKwkJCW0ud2FpdFVudGlsTm90RXFBbmRTZXQoIDEsIDEsIG51bGwgKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWFzc2VydEVxdWFscyggMSwgbS5nZXQoKSApOworCQl9CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVudGlsRXE1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZmluYWwgTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQkKKwkJVGhyZWFkIHQgPSBUZXN0SGVscC5kZWxheUFuZFN0YXJ0KCAyMDAsIG5ldyBUZXN0SGVscC5EZWxheVJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQltLnNldCggMSApOworCQkJfQorCQl9ICk7CisKKwkJbG9uZyB0MCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQltLndhaXRVbnRpbEVxKCAxICk7CisJCWRvdWJsZSB0MSA9IChTeXN0ZW0ubmFub1RpbWUoKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJVGVzdEhlbHAuYXNzZXJ0UmVsRXJyb3IoIDIwMCwgdDEsIFJFTF9FUlJPUiApOworCQkKKwkJdC5qb2luKCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXE0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZmluYWwgTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQkKKwkJVGhyZWFkIHQgPSBUZXN0SGVscC5kZWxheUFuZFN0YXJ0KCAyMDAsIG5ldyBUZXN0SGVscC5EZWxheVJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQltLnNldCggMSApOworCQkJfQorCQl9ICk7CisKKwkJbG9uZyB0MCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQltLndhaXRVbnRpbE5vdEVxKCBudWxsICk7CisJCWRvdWJsZSB0MSA9IChTeXN0ZW0ubmFub1RpbWUoKSAtIHQwKSAvIDEwMDAwMDAuMDsKKwkJVGVzdEhlbHAuYXNzZXJ0UmVsRXJyb3IoIDIwMCwgdDEsIFJFTF9FUlJPUiApOworCQkKKwkJdC5qb2luKCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgd2FpdFVudGlsRXFBbmRTZXQ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJZmluYWwgTW9uaXRvcjxJbnRlZ2VyPiBtID0gbmV3IE1vbml0b3I8SW50ZWdlcj4oICJhIiwgbnVsbCApOworCQkKKwkJVGhyZWFkIHQgPSBUZXN0SGVscC5kZWxheUFuZFN0YXJ0KCAyMDAsIG5ldyBUZXN0SGVscC5EZWxheVJ1bm5hYmxlKCkKKwkJeworCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCXsKKwkJCQltLnNldCggMSApOworCQkJfQorCQl9ICk7CisJCQorCQlsb25nIHQwID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCW0ud2FpdFVudGlsRXFBbmRTZXQoIDEsIDIgKTsKKwkJZG91YmxlIHQxID0gKFN5c3RlbS5uYW5vVGltZSgpIC0gdDApIC8gMTAwMDAwMC4wOworCQkvLyBUT0RPIGlzIHRoZXJlIGEgYmV0dGVyIHdheSBmb3IgY2hvb3NpbmcgcmVsYXRpdmUgZXJyb3I/CisJCVRlc3RIZWxwLmFzc2VydFJlbEVycm9yKCAyMDAsIHQxLCBSRUxfRVJST1IgKTsKKwkJCisJCXQuam9pbigpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxQW5kU2V0NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWZpbmFsIE1vbml0b3I8SW50ZWdlcj4gbSA9IG5ldyBNb25pdG9yPEludGVnZXI+KCAiYSIsIG51bGwgKTsKKwkJCisJCVRocmVhZCB0ID0gVGVzdEhlbHAuZGVsYXlBbmRTdGFydCggMjAwLCBuZXcgVGVzdEhlbHAuRGVsYXlSdW5uYWJsZSgpCisJCXsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQl7CisJCQkJbS5zZXQoIDEgKTsKKwkJCX0KKwkJfSApOworCisJCWxvbmcgdDAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJbS53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgMiApOworCQlkb3VibGUgdDEgPSAoU3lzdGVtLm5hbm9UaW1lKCkgLSB0MCkgLyAxMDAwMDAwLjA7CisJCVRlc3RIZWxwLmFzc2VydFJlbEVycm9yKCAyMDAsIHQxLCBSRUxfRVJST1IgKTsKKwkJCisJCXQuam9pbigpOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UZXN0VXJsMS5qYXZhIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL1Rlc3RVcmwxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjZWI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9UZXN0VXJsMS5qYXZhCkBAIC0wLDAgKzEsMTkwMCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgamFjYXBwcworICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RVcmwxCit7CisJU3RyaW5nIG51bGxTY2hlbWUgPSBudWxsOworCVN0cmluZyBudWxsVXNlciA9IG51bGw7CisJU3RyaW5nIG51bGxQYXNzd29yZCA9IG51bGw7CisJU3RyaW5nIG51bGxIb3N0ID0gbnVsbDsKKwlJbnRlZ2VyIG51bGxQb3J0ID0gbnVsbDsKKwlTdHJpbmcgbnVsbFVyaSA9IG51bGw7CisJU2V0PFN0cmluZz4gbnVsbFBhcmFtcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwlNYXA8U3RyaW5nLE9iamVjdD4gbnVsbFRlcm1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJU3RyaW5nIG51bGxGcmFnbWVudCA9IG51bGw7CisKKwlTdHJpbmcgZGVmU2NoZW1lID0gInRjcCI7CisJU3RyaW5nIGRlZlVzZXIgPSAiYWRtaW4iOworCVN0cmluZyBkZWZQYXNzd29yZCA9ICJtZXRyZW9zIjsKKwlTdHJpbmcgZGVmSG9zdCA9ICJsb2NhbGhvc3QiOworCWludCBkZWZQb3J0ID0gMTAwMDA7CisJU3RyaW5nIGRlZlVyaSA9ICJ1cmkiOworCVNldDxTdHJpbmc+IGRlZlBhcmFtcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwlNYXA8U3RyaW5nLE9iamVjdD4gZGVmVGVybXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwlTdHJpbmcgZGVmRnJhZ21lbnQgPSAiZnJhZyI7CisKKwlTdHJpbmcgdXJsU3RyMSA9ICJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMC91cmk7cGFyYW0xO3BhcmFtMj90ZXJtMT12YWx1ZTEmdGVybTI9dmFsdWUyI2ZyYWciOworCVN0cmluZyB1cmxTdHIyID0gInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL3VyaTtwYXJhbTI7cGFyYW0xP3Rlcm0xPXZhbHVlMSZ0ZXJtMj12YWx1ZTIjZnJhZyI7CisKKy8vCXByaXZhdGUgVVJMIHVybCA9IG5ldyBVUkwoKTsKKworCS8qKgorCSAqIFZlcmlmeSBhbGwgZmllbGRzIGluIHVybCBhZ2FpbnN0IGV4cGVjdGVkIHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSB1cmwgdXJsIHRvIHZlcmlmeQorCSAqIEBwYXJhbSBmcmFnbWVudCBleHBlY3RlZCBmcmFnbWVudAorCSAqIEBwYXJhbSBob3N0IGV4cGVjdGVkIGhvc3QKKwkgKiBAcGFyYW0gbnVtUGFyYW1zIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbXMKKwkgKiBAcGFyYW0gcGFzc3dvcmQgZXhwZWN0ZWQgcGFzc3dvcmQKKwkgKiBAcGFyYW0gcG9ydCBleHBlY3RlZCBwb3J0CisJICogQHBhcmFtIHNjaGVtZSBleHBlY3RlZCBzY2hlbWUKKwkgKiBAcGFyYW0gaGFzVGVybXMgdmFsdWUgZm9yIGhhc1Rlcm1zCisJICogQHBhcmFtIHVyaSBleHBlY3RlZCB1cmkKKwkgKiBAcGFyYW0gdXNlciBleHBlY3RlZCB1c2VyCisJICovCisJcHVibGljIHZvaWQgdmVyaWZ5VVJMKFVSTCB1cmwsIFN0cmluZyBmcmFnbWVudCwgU3RyaW5nIGhvc3QsCisJCQlpbnQgbnVtUGFyYW1zLCBTdHJpbmcgcGFzc3dvcmQsIEludGVnZXIgcG9ydCwKKwkJCVN0cmluZyBzY2hlbWUsIGJvb2xlYW4gaGFzVGVybXMsIFN0cmluZyB1cmksIFN0cmluZyB1c2VyKQorCXsKKwkJLy8gVmVyaWZ5IGFsbCBmaWVsZHMgaW4gdXJsIGFnYWluc3QgZXhwZWN0ZWQgdmFsdWVzLgorCQlhc3NlcnRFcXVhbHMoc2NoZW1lLCB1cmwuZ2V0U2NoZW1lKCkpOworCQlhc3NlcnRFcXVhbHModXNlciwgdXJsLmdldFVzZXIoKSk7CisJCWFzc2VydEVxdWFscyhwYXNzd29yZCwgdXJsLmdldFBhc3N3b3JkKCkpOworCQlhc3NlcnRFcXVhbHMoaG9zdCwgdXJsLmdldEhvc3QoKSk7CisJCWFzc2VydEVxdWFscyhwb3J0LCB1cmwuZ2V0UG9ydCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHVyaSwgdXJsLmdldFVyaSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZyYWdtZW50LCB1cmwuZ2V0RnJhZ21lbnQoKSk7CisKKwkJLy8gVmVyaWZ5IHRoYXQgdGhlIG51bWJlciBvZiBwYXJhbXMgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgdmFsdWUKKwkJaW50IGNvdW50ID0gdXJsLmdldFBhcmFtcygpLmxlbmd0aDsKKwkJYXNzZXJ0RXF1YWxzKGNvdW50LCBudW1QYXJhbXMpOworCisJCS8qKgorCQkgKiBWZXJpZnkgdGhhdCBoYXNUZXJtcyBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZQorCQkgKi8KKwkJYXNzZXJ0RXF1YWxzKGhhc1Rlcm1zLCB1cmwuaGFzVGVybXMoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGNyZWF0aW9uIG9mIGVtcHR5IFVSTAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCk7CisKKwkJaW50IG51bVBhcmFtcyA9IDA7CisJCWJvb2xlYW4gaGFzVGVybXMgPSBmYWxzZTsKKworCQl2ZXJpZnlVUkwodXJsLCBudWxsRnJhZ21lbnQsIG51bGxIb3N0LCBudW1QYXJhbXMsIG51bGxQYXNzd29yZCwgbnVsbFBvcnQsCisJCQkJbnVsbFNjaGVtZSwgaGFzVGVybXMsIG51bGxVcmksIG51bGxVc2VyKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgY3JlYXRpb24gb2YgVVJMIGZyb20gc3RyaW5nCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwodXJsU3RyMSk7CisKKwkJaW50IG51bVBhcmFtcyA9IDI7CisJCWJvb2xlYW4gaGFzVGVybXMgPSB0cnVlOworCisJCXZlcmlmeVVSTCh1cmwsIGRlZkZyYWdtZW50LCBkZWZIb3N0LCBudW1QYXJhbXMsIGRlZlBhc3N3b3JkLCBkZWZQb3J0LAorCQkJCWRlZlNjaGVtZSwgaGFzVGVybXMsIGRlZlVyaSwgZGVmVXNlcik7CisKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgY3JlYXRpb24gb2YgVVJMIHdpdGggbnVsbCBzdHJpbmcKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICoKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIG5ldyBVUkwoKSwgbmV3IFVSTCggKFN0cmluZykgbnVsbCApICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGNyZWF0aW9uIG9mIFVSTCB3aXRoIGVtcHR5IHN0cmluZworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yM2EoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoIG5ldyBVUkwoKSwgbmV3IFVSTCggIiIgKSApOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBjcmVhdGlvbiBvZiBVUkwgd2l0aCBpbnZhbGlkIHN0cmluZworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKgorCSAqLworCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcjQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQluZXcgVVJMKCJ3aGF0ZXZlcmJsYWh+Kn19WyIpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBjcmVhdGlvbiBvZiBVUkwgZnJvbSBVUkwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3I1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IG51bVBhcmFtcyA9IDA7CisJCWJvb2xlYW4gaGFzVGVybXMgPSBmYWxzZTsKKwkJU3RyaW5nIHVyaSA9ICIiOworCisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKworCQl2ZXJpZnlVUkwodXJsLCBudWxsRnJhZ21lbnQsIGRlZkhvc3QsIG51bVBhcmFtcywgbnVsbFBhc3N3b3JkLCBkZWZQb3J0LAorCQkJCWRlZlNjaGVtZSwgaGFzVGVybXMsIHVyaSwgbnVsbFVzZXIpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBhZGRQYXJhbSAtIG5vIHBhcmFtcyBleGlzdAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRQYXJhbTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisJCXVybC5hZGRQYXJhbSgicGFyYW0xPXZhbHVlMSIpOworCQlhc3NlcnRFcXVhbHMoInBhcmFtMT12YWx1ZTEiLCB1cmwuZ2V0UGFyYW0oInBhcmFtMT0iKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGFkZFBhcmFtIC0gcGFyYW1zIGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJdXJsLmFkZFBhcmFtKCJwYXJhbTE9dmFsdWUxIik7CisJCXVybC5hZGRQYXJhbSgicGFyYW0yPXZhbHVlMiIpOworCQlhc3NlcnRFcXVhbHMoInBhcmFtMT12YWx1ZTEiLCB1cmwuZ2V0UGFyYW0oInBhcmFtMT0iKSk7CisJCWFzc2VydEVxdWFscygicGFyYW0yPXZhbHVlMiIsIHVybC5nZXRQYXJhbSgicGFyYW0yPSIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgYWRkUGFyYW0gLSBwYXJhbSBwcmVmaXggaXMgZHVwbGljYXRlCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJdXJsLmFkZFBhcmFtKCJwYXJhbTE9dmFsdWUxIik7CisJCXVybC5hZGRQYXJhbSgicGFyYW0xPXZhbHVlMSIpOworCisJCWFzc2VydEVxdWFscygicGFyYW0xPXZhbHVlMSIsIHVybC5nZXRQYXJhbSgicGFyYW0xPSIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgYWRkUGFyYW0gLSBwYXJhbSBwcmVmaXggaXMgbnVsbAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdChleHBlY3RlZCA9IE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RBZGRQYXJhbTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisJCXVybC5hZGRQYXJhbShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgYWRkUGFyYW0gLSBwYXJhbSBwcmVmaXggaXMgYmxhbmsKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUGFyYW01KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCQl1cmwuYWRkUGFyYW0oIiIpOworCQlhc3NlcnRFcXVhbHMoICIiLCB1cmwuZ2V0UGFyYW0oIiIpICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGFkZFRlcm0gYWRkIGRvdWJsZSB0ZXJtCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFRlcm1fZG91YmxlMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWRvdWJsZSB2YWx1ZSA9IDEuNzk3NjkzMTM0ODYyMzE1N2UzMDhkOworCQlTdHJpbmcgbmFtZSA9ICJ0ZXJtMSI7CisKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCQl1cmwuYWRkVGVybShuYW1lLCB2YWx1ZSk7CisKKwkJZG91YmxlIHRlcm1WYWx1ZSA9IG5ldyBEb3VibGUodXJsLmdldFRlcm0obmFtZSkpOworCisJCWFzc2VydEVxdWFscyh2YWx1ZSwgdGVybVZhbHVlKTsKKworCX0KKworCS8qKgorCSAqIFZlcmlmeSBhZGRUZXJtIGFkZCBkb3VibGUgdGVybQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRUZXJtX0RvdWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlEb3VibGUgdmFsdWUgPSAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4ZDsKKwkJU3RyaW5nIG5hbWUgPSAidGVybTEiOworCisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJdXJsLmFkZFRlcm0obmFtZSwgdmFsdWUpOworCisJCWRvdWJsZSB0ZXJtVmFsdWUgPSBuZXcgRG91YmxlICh1cmwuZ2V0VGVybShuYW1lKSk7CisJCWFzc2VydEVxdWFscyh2YWx1ZSwgdGVybVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgYWRkVGVybSBhZGQgaW50IHRlcm0KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkVGVybV9pbnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IHZhbHVlID0gMjE0NzQ4MzY0NzsKKwkJU3RyaW5nIG5hbWUgPSAidGVybTEiOworCisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJdXJsLmFkZFRlcm0obmFtZSwgdmFsdWUpOworCisJCWludCB0ZXJtVmFsdWUgPSBuZXcgSW50ZWdlciAodXJsLmdldFRlcm0obmFtZSkpOworCQlhc3NlcnRFcXVhbHModmFsdWUsIHRlcm1WYWx1ZSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGFkZFRlcm0gYWRkIEludGVnZXIgdGVybQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRUZXJtX2ludDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlJbnRlZ2VyIHZhbHVlID0gMjE0NzQ4MzY0NzsKKwkJU3RyaW5nIG5hbWUgPSAidGVybTEiOworCisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJdXJsLmFkZFRlcm0obmFtZSwgdmFsdWUpOworCisJCWludCB0ZXJtVmFsdWUgPSBuZXcgSW50ZWdlciAodXJsLmdldFRlcm0obmFtZSkpOworCQlhc3NlcnRFcXVhbHModmFsdWUsIHRlcm1WYWx1ZSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGFkZFRlcm0gYWRkIFN0cmluZyB0ZXJtCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFRlcm1TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmcgdmFsdWUgPSAidmFsdWUxIjsKKwkJU3RyaW5nIG5hbWUgPSAidGVybTEiOworCisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJdXJsLmFkZFRlcm0obmFtZSwgdmFsdWUpOworCisJCWFzc2VydEVxdWFscyh2YWx1ZSwgdXJsLmdldFRlcm0obmFtZSkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBjbGVhclBhcmFtcyBwYXJhbXMgZXhpc3QKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJQYXJhbXMxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKworCQlVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHIxKTsKKworCQlhc3NlcnRUcnVlKHVybC5oYXNQYXJhbXMoKSk7CisJCXVybC5jbGVhclBhcmFtcygpOworCQlhc3NlcnRGYWxzZSh1cmwuaGFzUGFyYW1zKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBjbGVhclBhcmFtcyBwYXJhbXMgZG8gbm90IGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFyUGFyYW1zMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKworCQlhc3NlcnRGYWxzZSh1cmwuaGFzUGFyYW1zKCkpOworCQl1cmwuY2xlYXJQYXJhbXMoKTsKKwkJYXNzZXJ0RmFsc2UodXJsLmhhc1BhcmFtcygpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgY2xlYXJUZXJtcyB0ZXJtcyBleGlzdAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhclRlcm1zMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisKKwkJVVJMIHVybCA9IG5ldyBVUkwodXJsU3RyMSk7CisKKwkJYXNzZXJ0VHJ1ZSh1cmwuaGFzVGVybXMoKSk7CisJCXVybC5jbGVhclRlcm1zKCk7CisJCWFzc2VydEZhbHNlKHVybC5oYXNUZXJtcygpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgY2xlYXJUZXJtcyB0ZXJtcyBkbyBub3QgZXhpc3QKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJUZXJtczIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisKKwkJYXNzZXJ0RmFsc2UodXJsLmhhc1Rlcm1zKCkpOworCQl1cmwuY2xlYXJUZXJtcygpOworCQlhc3NlcnRGYWxzZSh1cmwuaGFzVGVybXMoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGR1bXAKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RHVtcCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cjEpOworCQl1cmwuZHVtcCgpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBlcXVhbHMgdHJ1ZQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwodXJsU3RyMSk7CisJCVVSTCB1cmwyID0gbmV3IFVSTCh1cmxTdHIxKTsKKworCQlhc3NlcnRUcnVlKHVybC5lcXVhbHModXJsMikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBlcXVhbHMgZmFsc2UKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cjEpOworCQlVUkwgdXJsMiA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCisJCWFzc2VydEZhbHNlKHVybC5lcXVhbHModXJsMikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBlcXVhbHMgb2JqIG5vdCB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cjEpOworCQlTdHJpbmcgdXJsMiA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiOworCisJCWFzc2VydEZhbHNlKHVybC5lcXVhbHModXJsMikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBlcXVhbHMgb2JqIG51bGwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cjEpOworCQlVUkwgdXJsMiA9IG5ldyBVUkwoKTsKKworCQlhc3NlcnRGYWxzZSh1cmwuZXF1YWxzKHVybDIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0Qm9vbGVhblRlcm0gdmFsdWVzIGFyZSBib29sZWFuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5UZXJtMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT10cnVlJnRlcm0yPWZhbHNlI2RlZkZyYWdtZW50Iik7CisJCWFzc2VydFRydWUodXJsLmdldEJvb2xlYW5UZXJtKCJ0ZXJtMSIpKTsKKwkJYXNzZXJ0RmFsc2UodXJsLmdldEJvb2xlYW5UZXJtKCJ0ZXJtMiIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0Qm9vbGVhblRlcm0gdmFsdWVzIGFyZSBub3QgYm9vbGVhbgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuVGVybTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9dmFsdWUxJnRlcm0yPXZhbHVlMiNkZWZGcmFnbWVudCIpOworCQlhc3NlcnRGYWxzZSh1cmwuZ2V0Qm9vbGVhblRlcm0oInRlcm0xIikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRCb29sZWFuVGVybSAoU3RyaW5nLCBib29sZWFuKQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuVGVybTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9dHJ1ZSZ0ZXJtMj1mYWxzZSZ0ZXJtMz1vdGhlciNkZWZGcmFnbWVudCIpOworCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaXMgdHJ1ZSAqLworCQlhc3NlcnRUcnVlKHVybC5nZXRCb29sZWFuVGVybSgidGVybTEiLGZhbHNlKSk7CisKKwkJLyoqIFRlcm0gZXhpc3RzIGFuZCBpcyBmYWxzZSAqLworCQlhc3NlcnRGYWxzZSh1cmwuZ2V0Qm9vbGVhblRlcm0oInRlcm0yIix0cnVlKSk7CisKKwkJLyoqIFRlcm0gZXhpc3RzIGFuZCBpcyBub3QgYSBib29sZWFuIHZhbHVlICovCisJCWFzc2VydEZhbHNlKHVybC5nZXRCb29sZWFuVGVybSgidGVybTMiLHRydWUpKTsKKworCQkvKiogVGVybSBkb2VzIG5vdCBleGlzdHMgYW5kIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZSAqLworCQlhc3NlcnRUcnVlKHVybC5nZXRCb29sZWFuVGVybSgidGVybTQiLHRydWUpKTsKKworCQkvKiogVGVybSBkb2VzIG5vdCBleGlzdHMgYW5kIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UgKi8KKwkJYXNzZXJ0RmFsc2UodXJsLmdldEJvb2xlYW5UZXJtKCJ0ZXJtNSIsZmFsc2UpKTsKKworCQkvKiogVGVybSBkb2VzIG5vdCBleGlzdHMgYW5kIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UgKi8KKwkJYXNzZXJ0RmFsc2UodXJsLmdldEJvb2xlYW5UZXJtKCJ0ZXJtNSIsZmFsc2UpKTsKKworCQkvKiogVGVybSBpbnZhbGlkICovCisJCWFzc2VydEZhbHNlKHVybC5nZXRCb29sZWFuVGVybSgiJiY/IyIsZmFsc2UpKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuVGVybTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9dHJ1ZSZ0ZXJtMj1mYWxzZSZ0ZXJtMz1vdGhlciNkZWZGcmFnbWVudCIpOworCisJCS8qKiBUZXJtIG51bGwgKi8KKwkJdXJsLmdldEJvb2xlYW5UZXJtKG51bGwpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5UZXJtNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT10cnVlJnRlcm0yPWZhbHNlJnRlcm0zPW90aGVyI2RlZkZyYWdtZW50Iik7CisKKwkJLyoqIFRlcm0gYmxhbmsgKi8KKwkJdXJsLmdldEJvb2xlYW5UZXJtKCIiKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0RG91YmxlVGVybQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVUZXJtMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT0xLjc5NzY5MzEzNDg2MjMxNTdlMzA4ZCZ0ZXJtMj0xZCNkZWZGcmFnbWVudCIpOworCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaXMgZG91YmxlICovCisJCWFzc2VydEVxdWFscygxLjc5NzY5MzEzNDg2MjMxNTdlMzA4ZCwgdXJsLmdldERvdWJsZVRlcm0oInRlcm0xIikpOworCisJCS8qKiBUZXJtIGRvZXMgbm90IGV4aXN0ICovCisJCWFzc2VydEVxdWFscyhudWxsLCB1cmwuZ2V0RG91YmxlVGVybSgiRE5FIikpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgdGVzdEdldERvdWJsZVRlcm0yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPTEuNzk3NjkzMTM0ODYyMzE1N2UzMDhkJnRlcm0yPTFkI2RlZkZyYWdtZW50Iik7CisKKwkJdXJsLmdldERvdWJsZVRlcm0obnVsbCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlVGVybTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9MS43OTc2OTMxMzQ4NjIzMTU3ZTMwOGQmdGVybTI9MWQjZGVmRnJhZ21lbnQiKTsKKworCQl1cmwuZ2V0RG91YmxlVGVybSgiIik7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldEZyYWdtZW50CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldEZyYWdtZW50MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3RAMTAwMDAjZGVmRnJhZ21lbnQiKTsKKwkJVVJMIHVybDIgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3RAMTAwMDAiKTsKKworCQkvKiogRnJhZ21lbnQgZXhpc3RzICovCisJCWFzc2VydEVxdWFscygiZGVmRnJhZ21lbnQiLCB1cmwuZ2V0RnJhZ21lbnQoKSk7CisKKwkJLyoqIEZyYWdtZW50IGRvZXMgbm90IGV4aXN0ICovCisJCWFzc2VydEVxdWFscyhudWxsLCB1cmwyLmdldEZyYWdtZW50KCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRIb3N0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldEhvc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCQlVUkwgdXJsMiA9IG5ldyBVUkwoKTsKKworCQkvKiogSG9zdCBkZWZpbmVkIGZvciB1cmwgKi8KKwkJYXNzZXJ0RXF1YWxzKCJsb2NhbGhvc3QiLCB1cmwuZ2V0SG9zdCgpKTsKKworCQkvKiogSG9zdCBub3QgZGVmaW5lZCBmb3IgdXJsICovCisJCWFzc2VydE51bGwodXJsMi5nZXRIb3N0KCkpOworCisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldEludGVnZXJUZXJtKFN0cmluZykKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZWdlclRlcm0xKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPTEmdGVybTI9MTAjZGVmRnJhZ21lbnQiKTsKKworCQkvKiogVGVybSBleGlzdHMgYW5kIGlzIGludGVnZXIgKi8KKwkJYXNzZXJ0RXF1YWxzKDEsIHVybC5nZXRJbnRlZ2VyVGVybSgidGVybTEiKSk7CisKKwkJLyoqIFRlcm0gZG9lcyBub3QgZXhpc3QgKi8KKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHVybC5nZXRJbnRlZ2VyVGVybSgiRE5FIikpOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZWdlclRlcm01KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPTEmdGVybTI9MTAjZGVmRnJhZ21lbnQiKTsKKworCQl1cmwuZ2V0SW50ZWdlclRlcm0obnVsbCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlZ2VyVGVybTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9MSZ0ZXJtMj0xMCNkZWZGcmFnbWVudCIpOworCisJCXVybC5nZXRJbnRlZ2VyVGVybSgiIik7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldEludGVnZXJUZXJtIChTdHJpbmcsIGludCkKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZWdlclRlcm0yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPTEmdGVybTI9MS43ZCZ0ZXJtMz1zdHJpbmdWYWx1ZSNkZWZGcmFnbWVudCIpOworCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaXMgaW50ZWdlciAqLworCQlhc3NlcnRFcXVhbHMoMSx1cmwuZ2V0SW50ZWdlclRlcm0oInRlcm0xIiwxMDAwKSk7CisKKwkJLyoqIFRlcm0gZG9lcyBub3QgZXhpc3QgYW5kIGRlZmF1bHQgdmFsdWUgaXMgaW50ZWdlciAqLworCQlhc3NlcnRFcXVhbHMoMTAwMCx1cmwuZ2V0SW50ZWdlclRlcm0oInRlcm00IiwxMDAwKSk7CisKKwkJLyoqIFRlcm0gaW52YWxpZCAqLworCQlhc3NlcnRFcXVhbHMoMTAwMCx1cmwuZ2V0SW50ZWdlclRlcm0oIiYmPyMiLDEwMDApKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0SW50ZWdlclRlcm0gKFN0cmluZywgaW50KQorCSAqIFRlcm0gZXhpc3RzIGFuZCBpcyBhIGRvdWJsZQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdChleHBlY3RlZCA9IE51bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZWdlclRlcm0zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPTEmdGVybTI9MS43ZCZ0ZXJtMz1zdHJpbmdWYWx1ZSNkZWZGcmFnbWVudCIpOworCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaXMgYSBkb3VibGUgKi8KKwkJYXNzZXJ0RXF1YWxzKDEuN2QsdXJsLmdldEludGVnZXJUZXJtKCJ0ZXJtMiIsMTAwMCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRJbnRlZ2VyVGVybSAoU3RyaW5nLCBpbnQpCisJICogVGVybSBleGlzdHMgYW5kIGlzIGEgU3RyaW5nCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0KGV4cGVjdGVkID0gTnVtYmVyRm9ybWF0RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlZ2VyVGVybTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9MSZ0ZXJtMj0xLjdkJnRlcm0zPXN0cmluZ1ZhbHVlI2RlZkZyYWdtZW50Iik7CisKKwkJLyoqIFRlcm0gZXhpc3RzIGFuZCBpcyBhIHN0cmluZyAqLworCQlhc3NlcnRFcXVhbHMoInN0cmluZ1ZhbHVlIiwgdXJsLmdldEludGVnZXJUZXJtKCJ0ZXJtMyIsMTAwMCkpOworCX0KKworCisJLyoqCisJICogVmVyaWZ5IGdldFBhcmFtcyAtIG5vIHBhcmFtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRQYXJhbXMxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCQlhc3NlcnRFcXVhbHMoIDAsIHVybC5nZXRQYXJhbXMoKS5sZW5ndGggKTsKKworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRQYXJhbXMgLSBwYXJhbXMgZXhpc3QKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1zMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMT12YWx1ZTE7cGFyYW0yPXZhbHVlMjtwYXJhbTMiKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCB1cmwuZ2V0UGFyYW1zKCkubGVuZ3RoICk7CisKKwkJdXJsLnJlbW92ZVBhcmFtKCJwYXJhbTE9Iik7CisJCWFzc2VydEVxdWFscyggMiwgdXJsLmdldFBhcmFtcygpLmxlbmd0aCApOworCisJCXVybC5yZW1vdmVQYXJhbSgicGFyYW0yPSIpOworCQlhc3NlcnRFcXVhbHMoIDEsIHVybC5nZXRQYXJhbXMoKS5sZW5ndGggKTsKKworCQl1cmwucmVtb3ZlUGFyYW0oInBhcmFtMyIpOworCQlhc3NlcnRFcXVhbHMoIDAsIHVybC5nZXRQYXJhbXMoKS5sZW5ndGggKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0UGFzc3dvcmQgLSBwYXNzd29yZCBleGlzdHMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFzc3dvcmQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwIik7CisJCWFzc2VydEVxdWFscygibWV0cmVvcyIsdXJsLmdldFBhc3N3b3JkKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRQYXNzd29yZCAtIHBhc3N3b3JkIGRvZXMgbm90IGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFBhc3N3b3JkMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0UGFzc3dvcmQoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldFNjaGVtZSAtIHNjaGVtZSBleGlzdHMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1lMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0Y3AiLHVybC5nZXRTY2hlbWUoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldFNjaGVtZSAtIHBvcnQgZG9lcyBub3QgZXhpc3QKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1lMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCk7CisJCWFzc2VydE51bGwodXJsLmdldFNjaGVtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0VGVybShTdHJpbmcpIC0gbm8gdGVybXMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVybTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgpOworCQlhc3NlcnROdWxsKHVybC5nZXRUZXJtKCJ0ZXJtMSIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0VGVybSAtIHRlcm0gZXhpc3RzCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFRlcm0yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPXZhbHVlMSZ0ZXJtMj0jZGVmRnJhZ21lbnQiKTsKKworCQkvKiogVGVybSBleGlzdHMgYW5kIGhhcyB2YWx1ZSAqLworCQlhc3NlcnRFcXVhbHMoInZhbHVlMSIsdXJsLmdldFRlcm0oInRlcm0xIikpOworCisJCS8qKiBUZXJtIGV4aXN0cyBidXQgaGFzIG5vIHZhbHVlICovCisJCWFzc2VydEVxdWFscygiIix1cmwuZ2V0VGVybSgidGVybTIiKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldFRlcm0gKFN0cmluZywgU3RyaW5nKSAtIG5vIHRlcm1zCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFRlcm0zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoKTsKKworCQkvKiogTm8gdGVybXMgZXhpc3QgKi8KKwkJYXNzZXJ0RXF1YWxzKCJkZWZhdWx0IiwgdXJsLmdldFRlcm0oInRlcm0xIiwiZGVmYXVsdCIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0VGVybSAoU3RyaW5nLCBTdHJpbmcpIC0gdGVybSBleGlzdHMgYW5kIGhhdmUgdmFsdWUKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVybTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9dmFsdWUxJnRlcm0yPSNkZWZGcmFnbWVudCIpOworCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaGFzIHZhbHVlICovCisJCWFzc2VydEVxdWFscygidmFsdWUxIiwgdXJsLmdldFRlcm0oInRlcm0xIiwiZGVmYXVsdCIpKTsKKworCQkvKiogVE9ETyBJIHRoaW5rIHRoaXMgc2hvdWxkIHNldCB0aGUgdmFsdWUgZm9yIHRlcm0yIGJ1dCBpdCBkb2Vzbid0ICovCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaGFzIG5vIHZhbHVlICovCisJCS8vYXNzZXJ0RXF1YWxzKCJkZWZhdWx0IiwgdXJsLmdldFRlcm0oInRlcm0yIiwiZGVmYXVsdCIpKTsKKworCQkvKiogVGVybXMgZXhpc3RzIGJ1dCBub3QgdGhpcyB0ZXJtICovCisJCWFzc2VydEVxdWFscygiZGVmYXVsdCIsIHVybC5nZXRUZXJtKCJ0ZXJtMyIsImRlZmF1bHQiKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldFRlcm1OYW1lcyAtIG5vIHRlcm1zIGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFRlcm1OYW1lczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgpOworCQlhc3NlcnRFcXVhbHMoIDAsIHVybC5nZXRUZXJtTmFtZXMoKS5sZW5ndGggKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0VGVybU5hbWVzIC0gdGVybXMgZXhpc3QKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVybU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT12YWx1ZTEmdGVybTI9dmFsdWUyI2RlZkZyYWdtZW50Iik7CisKKwkJZm9yKCBTdHJpbmcgczogdXJsLmdldFRlcm1OYW1lcygpKQorCQl7CisJCQlhc3NlcnRUcnVlKHMuZXF1YWxzKCJ0ZXJtMSIpIHx8IHMuZXF1YWxzKCJ0ZXJtMiIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRUZXJtcyAtIG5vIHRlcm1zIGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFRlcm1zMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCk7CisJCWFzc2VydEVxdWFscyggMCwgdXJsLmdldFRlcm1zKCJ0ZXJtMSIpLmxlbmd0aCApOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRUZXJtcyAtIHRlcm1zIGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFRlcm1zMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT12YWx1ZTEmdGVybTI9dmFsdWUyI2RlZkZyYWdtZW50Iik7CisKKwkJYXNzZXJ0RXF1YWxzKCAxLCB1cmwuZ2V0VGVybXMoInRlcm0xIikubGVuZ3RoICk7CisJCWFzc2VydEVxdWFscyggInZhbHVlMSIsIHVybC5nZXRUZXJtcygidGVybTEiKVswXSApOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRVcmkgLSB1cmkgZXhpc3RzCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFVyaTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwL2RlZlVyaSIpOworCQlhc3NlcnRFcXVhbHMoImRlZlVyaSIsdXJsLmdldFVyaSgpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgZ2V0VXJpIC0gdXJpIGRvZXMgbm90IGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFVyaTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisJCWFzc2VydEVxdWFscygiIix1cmwuZ2V0VXJpKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBnZXRVc2VyIC0gdXNlciBleGlzdHMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VXNlcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAiKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZG1pbiIsdXJsLmdldFVzZXIoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGdldFVyaSAtIHVyaSBkb2VzIG5vdCBleGlzdAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRVc2VyMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0VXNlcigpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzTXVsdGlwbGVWYWx1ZXMgLSBubyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNNdWx0aXBsZVZhbHVlczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisJCWFzc2VydEZhbHNlKHVybC5oYXNNdWx0aXBsZVZhbHVlcygidGVybTEiKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGhhc011bHRpcGxlVmFsdWVzIC0gdGVybSBleGlzdHMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SGFzTXVsdGlwbGVWYWx1ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPXZhbHVlMSZ0ZXJtMj12YWx1ZTImdGVybTM9I2RlZkZyYWdtZW50Iik7CisKKwkJLyoqIFRlcm0gZXhpc3RzIGFuZCBoYXMgMSB2YWx1ZSAqLworCQlhc3NlcnRGYWxzZSh1cmwuaGFzTXVsdGlwbGVWYWx1ZXMoInRlcm0xIikpOworCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaGFzIG11bHRpcGxlIHZhbHVlcyAqLworCQkvKiogVE9ETzogRmluZCBvdXQgZm9ybWF0IGZvciBtdWx0aXBsZSB2YWx1ZXMgaW4gcXVlcnkgdGVybSAqLworCQkvL2Fzc2VydFRydWUodXJsLmhhc011bHRpcGxlVmFsdWVzKCJ0ZXJtMiIpKTsKKworCQkvKiogVGVybSBleGlzdHMgYW5kIGhhcyBubyB2YWx1ZXMgKi8KKwkJYXNzZXJ0RmFsc2UodXJsLmhhc011bHRpcGxlVmFsdWVzKCJ0ZXJtMyIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzUGFyYW1zIC0gbm8gcGFyYW1zCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhc1BhcmFtczEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisJCWFzc2VydEZhbHNlKHVybC5oYXNQYXJhbXMoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGhhc1BhcmFtcyAtIHBhcmFtcyBleGlzdAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNQYXJhbXMyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMiIpOworCisJCS8qKiAgVXJsIGhhcyBwYXJhbXMgKi8KKwkJYXNzZXJ0VHJ1ZSh1cmwuaGFzUGFyYW1zKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBoYXNUZXJtKFN0cmluZykgLSBubyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNUZXJtMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJYXNzZXJ0RmFsc2UodXJsLmhhc1Rlcm0oInRlcm0xIikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBoYXNUZXJtKFN0cmluZykgLSB1cmwgaGFzIHRlcm1zCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhc1Rlcm0yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT12YWx1ZTEmdGVybTI9dmFsdWUyJnRlcm0zPSIpOworCisJCS8qKiBUZXJtIGV4aXN0cyAqLworCQlhc3NlcnRUcnVlKHVybC5oYXNUZXJtKCJ0ZXJtMSIpKTsKKworCQkvKiogVGVybSBkb2VzIG5vdCBleGlzdCAqLworCQlhc3NlcnRGYWxzZSh1cmwuaGFzVGVybSgiRE5FIikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBoYXNUZXJtKFN0cmluZywgZG91YmxlKSAtIG5vIHRlcm1zCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhc1Rlcm0zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCQlhc3NlcnRGYWxzZSh1cmwuaGFzVGVybSgidGVybTEiLDEuN2QpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzVGVybShTdHJpbmcsIGRvdWJsZSkgLSB1cmwgaGFzIHRlcm1zCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhc1Rlcm00KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT0xLjciKTsKKworCQkvKiogIFRlcm0gZXhpc3RzIHdpdGggbWF0Y2hpbmcgdmFsdWUgICovCisJCWFzc2VydFRydWUodXJsLmhhc1Rlcm0oInRlcm0xIiwxLjdkKSk7CisKKwkJLyoqIFRlcm0gZXhpc3RzIGJ1dCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCAqLworCQlhc3NlcnRGYWxzZSh1cmwuaGFzVGVybSgidGVybTEiLDMuMGQpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzVGVybShTdHJpbmcsIERvdWJsZSkgLSBubyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNUZXJtNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCURvdWJsZSBkID0gbmV3IERvdWJsZSgxLjdkKTsKKworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisJCWFzc2VydEZhbHNlKHVybC5oYXNUZXJtKCJ0ZXJtMSIsZCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBoYXNUZXJtKFN0cmluZywgRG91YmxlKSAtIHVybCBoYXMgdGVybXMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SGFzVGVybTYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlEb3VibGUgZDEgPSBuZXcgRG91YmxlKDEuN2QpOworCQlEb3VibGUgZDIgPSBuZXcgRG91YmxlKDMuMGQpOworCisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9MS43Iik7CisKKwkJLyoqICBUZXJtIGV4aXN0cyB3aXRoIG1hdGNoaW5nIHZhbHVlICAqLworCQlhc3NlcnRUcnVlKHVybC5oYXNUZXJtKCJ0ZXJtMSIsZDEpKTsKKworCQkvKiogVGVybSBleGlzdHMgYnV0IHZhbHVlIGRvZXMgbm90IG1hdGNoICovCisJCWFzc2VydEZhbHNlKHVybC5oYXNUZXJtKCJ0ZXJtMSIsZDIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzVGVybShTdHJpbmcsIGludCkgLSBubyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNUZXJtNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWludCBpID0gMTA7CisKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCQlhc3NlcnRGYWxzZSh1cmwuaGFzVGVybSgidGVybTEiLGkpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzVGVybShTdHJpbmcsIGludCkgLSB1cmwgaGFzIHRlcm1zCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhc1Rlcm04KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJaW50IGkxID0gMTA7CisJCWludCBpMiA9IDEwMDsKKworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPTEwIik7CisKKwkJLyoqICBUZXJtIGV4aXN0cyB3aXRoIG1hdGNoaW5nIHZhbHVlICAqLworCQlhc3NlcnRUcnVlKHVybC5oYXNUZXJtKCJ0ZXJtMSIsaTEpKTsKKworCQkvKiogVGVybSBleGlzdHMgYnV0IHZhbHVlIGRvZXMgbm90IG1hdGNoICovCisJCWFzc2VydEZhbHNlKHVybC5oYXNUZXJtKCJ0ZXJtMSIsaTIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzVGVybShTdHJpbmcsIEludGVnZXIpIC0gbm8gdGVybXMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SGFzVGVybTkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcigxMCk7CisKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCQlhc3NlcnRGYWxzZSh1cmwuaGFzVGVybSgidGVybTEiLGkpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzVGVybShTdHJpbmcsIEludGVnZXIpIC0gdXJsIGhhcyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNUZXJtMTAoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlJbnRlZ2VyIGkxID0gbmV3IEludGVnZXIoMTApOworCQlJbnRlZ2VyIGkyID0gbmV3IEludGVnZXIoMTAwKTsKKworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwL2RlZlVyaTtwYXJhbTE7cGFyYW0yP3Rlcm0xPTEwIik7CisKKwkJLyoqICBUZXJtIGV4aXN0cyB3aXRoIG1hdGNoaW5nIHZhbHVlICAqLworCQlhc3NlcnRUcnVlKHVybC5oYXNUZXJtKCJ0ZXJtMSIsaTEpKTsKKworCQkvKiogVGVybSBleGlzdHMgYnV0IHZhbHVlIGRvZXMgbm90IG1hdGNoICovCisJCWFzc2VydEZhbHNlKHVybC5oYXNUZXJtKCJ0ZXJtMSIsaTIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgaGFzVGVybShTdHJpbmcsIFN0cmluZykgLSBubyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNUZXJtMTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmcgcyA9ICJ2YWx1ZTEiOworCisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJYXNzZXJ0RmFsc2UodXJsLmhhc1Rlcm0oInRlcm0xIixzKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGhhc1Rlcm0oU3RyaW5nLCBTdHJpbmcpIC0gdXJsIGhhcyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYXNUZXJtMTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTdHJpbmcgczEgPSAidmFsdWUxIjsKKwkJU3RyaW5nIHMyID0gIkRORSI7CisKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xO3BhcmFtMj90ZXJtMT12YWx1ZTEiKTsKKworCQkvKiogIFRlcm0gZXhpc3RzIHdpdGggbWF0Y2hpbmcgdmFsdWUgICovCisJCWFzc2VydFRydWUodXJsLmhhc1Rlcm0oInRlcm0xIixzMSkpOworCisJCS8qKiBUZXJtIGV4aXN0cyBidXQgdmFsdWUgZG9lcyBub3QgbWF0Y2ggKi8KKwkJYXNzZXJ0RmFsc2UodXJsLmhhc1Rlcm0oInRlcm0xIixzMikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBoYXNUZXJtcyAtIG5vIHRlcm1zCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhc1Rlcm1zMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKwkJYXNzZXJ0RmFsc2UodXJsLmhhc1Rlcm1zKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBoYXNUZXJtcyAtIHRlcm1zIGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhc1Rlcm1zMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMTtwYXJhbTI/dGVybTE9dmFsdWUxJnRlcm0yPXZhbHVlMiIpOworCisJCS8qKiAgVXJsIGhhcyBwYXJhbXMgKi8KKwkJYXNzZXJ0VHJ1ZSh1cmwuaGFzVGVybXMoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IGlzU2NoZW1lIC0gbm8gc2NoZW1lCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElzU2NoZW1lMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCk7CisJCWFzc2VydEZhbHNlKHVybC5pc1NjaGVtZSgidGNwIikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBpc1NjaGVtZSAtIHNjaGVtZSBleGlzdHMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SXNTY2hlbWUyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCisJCS8qKiAgdHJ1ZSAtIHNhbWUgY2FzZSAqLworCQlhc3NlcnRUcnVlKHVybC5pc1NjaGVtZSgidGNwIikpOworCisJCS8qKiAgdHJ1ZSBkaWZmZXJlbnQgY2FzZSAqLworCQlhc3NlcnRUcnVlKHVybC5pc1NjaGVtZSgiVENQIikpOworCisJCS8qKiBmYWxzZSAqLworCQlhc3NlcnRGYWxzZSh1cmwuaXNTY2hlbWUoInVkcCIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgcmVtb3ZlUGFyYW0gLSBubyBwYXJhbXMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGFyYW0xKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCisJCS8qKiBObyBwYXJhbXMgKi8KKwkJYXNzZXJ0TnVsbCh1cmwucmVtb3ZlUGFyYW0oInBhcmFtMSIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgcmVtb3ZlUGFyYW0gLSBwYXJhbXMgZXhpc3QKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGFyYW0yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xPXZhbHVlMTtwYXJhbTI9Iik7CisKKwkJLyoqIFBhcmFtIGV4aXN0cyBhbmQgaGFzIHZhbHVlICovCisJCWFzc2VydEVxdWFscygicGFyYW0xPXZhbHVlMSIsdXJsLmdldFBhcmFtKCJwYXJhbTE9IikpOworCQlhc3NlcnRFcXVhbHMoInBhcmFtMT12YWx1ZTEiLHVybC5yZW1vdmVQYXJhbSgicGFyYW0xPSIpKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0UGFyYW0oInBhcmFtMT0iKSk7CisKKwkJLyoqIFBhcmFtIGV4aXN0cyBhbmQgaGFzIGJsYW5rIHZhbHVlICovCisJCWFzc2VydEVxdWFscygicGFyYW0yPSIsdXJsLmdldFBhcmFtKCJwYXJhbTI9IikpOworCQlhc3NlcnRFcXVhbHMoInBhcmFtMj0iLHVybC5yZW1vdmVQYXJhbSgicGFyYW0yPSIpKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0UGFyYW0oInBhcmFtMj0iKSk7CisKKwkJLyoqIFBhcmFtIGRvZXMgbm90IGV4aXN0ICovCisJCWFzc2VydE51bGwodXJsLnJlbW92ZVBhcmFtKCJETkU9IikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSByZW1vdmVUZXJtKFN0cmluZykgLSBubyB0ZXJtcworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUZXJtMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogTm8gdGVybXMgKi8KKwkJYXNzZXJ0RmFsc2UoIHVybC5yZW1vdmVUZXJtKCJETkUiKSApOworCQkKKwkJdXJsLmFkZFRlcm0oICJhIiwgMSApOworCQlhc3NlcnRGYWxzZSggdXJsLnJlbW92ZVRlcm0oIkRORSIpICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHJlbW92ZVRlcm0oU3RyaW5nKSAtIFRlcm1zIGV4aXN0CisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlbW92ZVRlcm0yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMC9kZWZVcmk7cGFyYW0xPXZhbHVlMTtwYXJhbTI9P3Rlcm0xPXZhbHVlMSZ0ZXJtMj0iKTsKKworCQkvKiogVGVybSBleGlzdHMgYW5kIGhhcyB2YWx1ZSAqLworCQlhc3NlcnRFcXVhbHMoInZhbHVlMSIsdXJsLmdldFRlcm0oInRlcm0xIikpOworCQlhc3NlcnRUcnVlKHVybC5yZW1vdmVUZXJtKCJ0ZXJtMSIpKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0VGVybSgidGVybTEiKSk7CisKKwkJLyoqIFRlcm0gZXhpc3RzIGFuZCBoYXMgYmxhbmsgdmFsdWUgKi8KKwkJYXNzZXJ0RXF1YWxzKCIiLHVybC5nZXRUZXJtKCJ0ZXJtMiIpKTsKKwkJYXNzZXJ0VHJ1ZSh1cmwucmVtb3ZlVGVybSgidGVybTIiKSk7CisJCWFzc2VydE51bGwodXJsLmdldFRlcm0oInRlcm0yIikpOworCisJCS8qKiBQYXJhbSBkb2VzIG5vdCBleGlzdCAqLworCQlhc3NlcnRGYWxzZSh1cmwucmVtb3ZlVGVybSgiRE5FIikpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSByZW1vdmVUZXJtKFN0cmluZyxTdHJpbmcpIC0gbm8gdGVybXMKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGVybTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisKKwkJLyoqIE5vIHRlcm1zICovCisJCWFzc2VydEZhbHNlKHVybC5yZW1vdmVUZXJtKCJETkUiLCJ2YWx1ZTEiKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHJlbW92ZVRlcm0oU3RyaW5nLFN0cmluZykgLSBUZXJtcyBleGlzdAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUZXJtNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAvZGVmVXJpO3BhcmFtMT12YWx1ZTE7cGFyYW0yPT90ZXJtMT12YWx1ZTEmdGVybTI9Iik7CisKKwkJLyoqIFRlcm0gZXhpc3RzIGFuZCBoYXMgdmFsdWUgKi8KKwkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLHVybC5nZXRUZXJtKCJ0ZXJtMSIpKTsKKwkJYXNzZXJ0VHJ1ZSh1cmwucmVtb3ZlVGVybSgidGVybTEiLCJ2YWx1ZTEiKSk7CisJCWFzc2VydE51bGwodXJsLmdldFRlcm0oInRlcm0xIikpOworCisJCS8qKiBUZXJtIGV4aXN0cyBhbmQgaGFzIGJsYW5rIHZhbHVlICovCisJCWFzc2VydEVxdWFscygiIix1cmwuZ2V0VGVybSgidGVybTIiKSk7CisJCWFzc2VydFRydWUodXJsLnJlbW92ZVRlcm0oInRlcm0yIiwiIikpOworCQlhc3NlcnROdWxsKHVybC5nZXRUZXJtKCJ0ZXJtMiIpKTsKKworCQkvKiogUGFyYW0gZG9lcyBub3QgZXhpc3QgKi8KKwkJYXNzZXJ0RmFsc2UodXJsLnJlbW92ZVRlcm0oIkRORSIsInZhbHVlMSIpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgc2V0RnJhZ21lbnQgLSBubyBmcmFnbWVudCBpbiB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RnJhZ21lbnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMCIpOworCisJCS8qKiBTZXQgZnJhZ21lbnQuICBObyBmcmFnbWVudCBleGlzdHMgaW4gdXJsICovCisJCXVybC5zZXRGcmFnbWVudCgiZnJhZ21lbnQxIik7CisJCWFzc2VydEVxdWFscygiZnJhZ21lbnQxIix1cmwuZ2V0RnJhZ21lbnQoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldEZyYWdtZW50IC0gZnJhZ21lbnQgZXhpc3RzIGluIHVybAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRGcmFnbWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwLyNkZWZGcmFnbWVudCIpOworCisJCS8qKiBTZXQgZnJhZ21lbnQuICBGcmFnbWVudCBleGlzdHMgaW4gdXJsICovCisJCXVybC5zZXRGcmFnbWVudCgiZnJhZ21lbnQxIik7CisJCWFzc2VydEVxdWFscygiZnJhZ21lbnQxIix1cmwuZ2V0RnJhZ21lbnQoKSk7CisKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgc2V0RnJhZ21lbnQgLSBzZXQgZnJhZ21lbnQgdG8gbnVsbAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRGcmFnbWVudDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwLyNkZWZGcmFnbWVudCIpOworCisJCS8qKiBTZXQgZnJhZ21lbnQgdG8gbnVsbCAqLworCQl1cmwuc2V0RnJhZ21lbnQobnVsbCk7CisJCWFzc2VydE51bGwodXJsLmdldEZyYWdtZW50KCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRGcmFnbWVudCAtIHNldCBmcmFnbWVudCB0byBibGFuaworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RnJhZ21lbnQ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2xvY2FsaG9zdDoxMDAwMC8jZGVmRnJhZ21lbnQiKTsKKworCQkvKiogU2V0IGZyYWdtZW50IHRvIGJsYW5rICovCisJCXVybC5zZXRGcmFnbWVudCgiIik7CisJCWFzc2VydEVxdWFscygiIix1cmwuZ2V0RnJhZ21lbnQoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldEZIb3N0IC0gbm8gaG9zdCBpbiB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0SG9zdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgpOworCisJCS8qKiBTZXQgaG9zdC4gIE5vIGhvc3QgZXhpc3RzIGluIHVybCAqLworCQl1cmwuc2V0SG9zdCgiaG9zdDEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJob3N0MSIsdXJsLmdldEhvc3QoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldEhvc3QgLSBob3N0IGV4aXN0cyBpbiB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0SG9zdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisKKwkJLyoqIFNldCBob3N0LiAgSG9zdCBleGlzdHMgaW4gdXJsICovCisJCXVybC5zZXRIb3N0KCJob3N0MSIpOworCQlhc3NlcnRFcXVhbHMoImhvc3QxIix1cmwuZ2V0SG9zdCgpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgc2V0SG9zdC0gc2V0IGhvc3QgdG8gbnVsbAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRIb3N0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9sb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogU2V0IGhvc3QgdG8gbnVsbCAqLworCQl1cmwuc2V0SG9zdChudWxsKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0SG9zdCgpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgc2V0SG9zdHQgLSBzZXQgaG9zdCB0byBibGFuaworCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0SG9zdDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vbG9jYWxob3N0OjEwMDAwIik7CisKKwkJLyoqIFNldCBob3N0IHRvIGJsYW5rICovCisJCXVybC5zZXRIb3N0KCIiKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLHVybC5nZXRIb3N0KCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRQYXNzd29yZCAtIG5vIHBhc3N3b3JkIGluIHVybAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRQYXNzd29yZDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgpOworCisJCS8qKiBTZXQgcGFzc3dvcmQuICBObyBwYXNzd29yZCBleGlzdHMgaW4gdXJsICovCisJCXVybC5zZXRQYXNzd29yZCgicGFzc3dvcmQxIik7CisJCWFzc2VydEVxdWFscygicGFzc3dvcmQxIix1cmwuZ2V0UGFzc3dvcmQoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFBhc3N3b3JkIC0gcGFzc3dvcmQgZXhpc3RzIGluIHVybAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRQYXNzd29yZDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogU2V0IHBhc3N3b3JkLiAgUGFzc3dvcmQgZXhpc3RzIGluIHVybCAqLworCQl1cmwuc2V0UGFzc3dvcmQoInBhc3N3b3JkMSIpOworCQlhc3NlcnRFcXVhbHMoInBhc3N3b3JkMSIsdXJsLmdldFBhc3N3b3JkKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRQYXNzd29yZC0gc2V0IHBhc3N3b3JkIHRvIG51bGwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0UGFzc3dvcmQzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwIik7CisKKwkJLyoqIFNldCBwYXNzd29yZCB0byBudWxsICovCisJCXVybC5zZXRQYXNzd29yZChudWxsKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0UGFzc3dvcmQoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFBhc3N3b3JkIC0gc2V0IHBhc3N3b3JkIHRvIGJsYW5rCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNldFBhc3N3b3JkNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMCIpOworCisJCS8qKiBTZXQgcGFzc3dvcmQgdG8gYmxhbmsgKi8KKwkJdXJsLnNldFBhc3N3b3JkKCIiKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLHVybC5nZXRQYXNzd29yZCgpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgc2V0UG9ydCAtIG5vIHBvcnQgaW4gdXJsCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNldFBvcnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoKTsKKworCQkvKiogU2V0IHBvcnQuICBObyBwb3J0IGV4aXN0cyBpbiB1cmwgKi8KKwkJdXJsLnNldFBvcnQoMTAwMDApOworCQlhc3NlcnRFcXVhbHMoMTAwMDAsdXJsLmdldFBvcnQoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFBvcnQgLSBwb3J0IGV4aXN0cyBpbiB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0UG9ydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogU2V0IHBvcnQuICBQb3J0IGV4aXN0cyBpbiB1cmwgKi8KKwkJdXJsLnNldFBvcnQoNTAwMCk7CisJCWFzc2VydEVxdWFscyg1MDAwLHVybC5nZXRQb3J0KCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRQb3J0IC0gc2V0IHBvcnQgbGVzcyB0aGFuIG1pbiB2YWx1ZQorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0UG9ydDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogU2V0IHBvcnQgbGVzcyB0aGFuIG1pbiB2YWx1ZSAqLworCQl1cmwuc2V0UG9ydCgtMSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFBvcnQgLSBzZXQgcG9ydCBncmVhdGVyIHRoYW4gbWF4IHZhbHVlCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RTZXRQb3J0NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMCIpOworCisJCS8qKiBTZXQgcG9ydCB0byBuZWdhdGl2ZSBudW1iZXIgKi8KKwkJdXJsLnNldFBvcnQoNjU1MzYpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRTY2hlbWUgLSBubyBzY2hlbWUgaW4gdXJsCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNldFNjaGVtZTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgpOworCisJCS8qKiBTZXQgc2NoZW1lLiAgTm8gc2NoZW1lIGV4aXN0cyBpbiB1cmwgKi8KKwkJdXJsLnNldFNjaGVtZSgic2NoZW1lMSIpOworCQlhc3NlcnRFcXVhbHMoInNjaGVtZTEiLHVybC5nZXRTY2hlbWUoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFNjaGVtZSAtIHNjaGVtZSBleGlzdHMgaW4gdXJsCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNldFNjaGVtZTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogU2V0IHNjaGVtZS4gIFNjaGVtZSBleGlzdHMgaW4gdXJsICovCisJCXVybC5zZXRTY2hlbWUoInNjaGVtZTEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJzY2hlbWUxIix1cmwuZ2V0U2NoZW1lKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRTY2hlbWUtIHNldCBzY2hlbWUgdG8gbnVsbAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWUzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwIik7CisKKwkJLyoqIFNldCBzY2hlbWUgdG8gbnVsbCAqLworCQl1cmwuc2V0U2NoZW1lKG51bGwpOworCQlhc3NlcnROdWxsKHVybC5nZXRTY2hlbWUoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFNjaGVtZSAtIHNldCBzY2hlbWUgdG8gYmxhbmsKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdFNldFNjaGVtZTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogU2V0IHNjaGVtZSB0byBibGFuayAqLworCQl1cmwuc2V0U2NoZW1lKCIiKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLHVybC5nZXRTY2hlbWUoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFVyaSAtIG5vIHVyaSBpbiB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VXJpMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCk7CisKKwkJLyoqIFNldCB1cmkuICBObyB1cmkgZXhpc3RzIGluIHVybCAqLworCQl1cmwuc2V0VXJpKCJ1cmkxIik7CisJCWFzc2VydEVxdWFscygidXJpMSIsdXJsLmdldFVyaSgpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgc2V0VXJpIC0gdXJpIGV4aXN0cyBpbiB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VXJpMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMC9kZWZVcmkiKTsKKworCQkvKiogU2V0IHVyaS4gIFVyaSBleGlzdHMgaW4gdXJsICovCisJCXVybC5zZXRVcmkoInVyaTEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1cmkxIix1cmwuZ2V0VXJpKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRVcmktIHNldCB1cmkgdG8gbnVsbAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRVcmkzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwoInRjcDovL2FkbWluOm1ldHJlb3NAbG9jYWxob3N0OjEwMDAwL2RlZlVyaSIpOworCisJCS8qKiBTZXQgdXJpIHRvIG51bGwgKi8KKwkJdXJsLnNldFVyaShudWxsKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0VXJpKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRVcmkgLSBzZXQgdXJpIHRvIGJsYW5rCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNldFVyaTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAvZGVmVXJpIik7CisJCWFzc2VydEVxdWFscygiZGVmVXJpIix1cmwuZ2V0VXJpKCkpOworCQkKKwkJLyoqIFNldCB1cmkgdG8gYmxhbmsgKi8KKwkJdXJsLnNldFVyaSgiIik7CisJCWFzc2VydEVxdWFscygiIix1cmwuZ2V0VXJpKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRVc2VyIC0gbm8gdXNlciBpbiB1cmwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VXNlcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgpOworCQlhc3NlcnROdWxsKCB1cmwuZ2V0VXNlcigpICk7CisJCQorCQkvKiogU2V0IHVzZXIuICBObyB1c2VyIGV4aXN0cyBpbiB1cmwgKi8KKwkJdXJsLnNldFVzZXIoInVzZXIxIik7CisJCWFzc2VydEVxdWFscygidXNlcjEiLHVybC5nZXRVc2VyKCkpOworCX0KKworCS8qKgorCSAqIFZlcmlmeSBzZXRVc2VyIC0gdXNlciBleGlzdHMgaW4gdXJsCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNldFVzZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVVJMIHVybCA9IG5ldyBVUkwodXJsU3RyMSk7CisJCWFzc2VydEVxdWFscygiYWRtaW4iLHVybC5nZXRVc2VyKCkpOworCisJCS8qKiBTZXQgdXNlci4gIFVzZXIgZXhpc3RzIGluIHVybCAqLworCQl1cmwuc2V0VXNlcigidXNlcjEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1c2VyMSIsdXJsLmdldFVzZXIoKSk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHNldFVzZXItIHNldCB1c2VyIHRvIG51bGwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VXNlcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlVUkwgdXJsID0gbmV3IFVSTCgidGNwOi8vYWRtaW46bWV0cmVvc0Bsb2NhbGhvc3Q6MTAwMDAiKTsKKworCQkvKiogU2V0IHVzZXIgdG8gbnVsbCAqLworCQl1cmwuc2V0VXNlcihudWxsKTsKKwkJYXNzZXJ0TnVsbCh1cmwuZ2V0VXNlcigpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgc2V0VXNlciAtIHNldCB1c2VyIHRvIGJsYW5rCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RTZXRVc2VyNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJ0Y3A6Ly9hZG1pbjptZXRyZW9zQGxvY2FsaG9zdDoxMDAwMCIpOworCisJCS8qKiBTZXQgdXNlciB0byBibGFuayAqLworCQl1cmwuc2V0VXNlcigiIik7CisJCWFzc2VydEVxdWFscygiIix1cmwuZ2V0VXNlcigpKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgdG9TdHJpbmcgLSB1cmwgaXMgbnVsbAorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZzFhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0RXF1YWxzKCAibnVsbDoiLCBuZXcgVVJMKCkudG9TdHJpbmcoKSApOworCX0KKworCS8qKgorCSAqIFZlcmlmeSB0b1N0cmluZyAtIHVybCBpcyBudWxsCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nMWIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhc3NlcnRFcXVhbHMoICJudWxsOiIsIG5ldyBVUkwoIChTdHJpbmcpIG51bGwgKS50b1N0cmluZygpICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHRvU3RyaW5nIC0gdXJsIGlzIG51bGwKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcxYygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggIm51bGw6IiwgbmV3IFVSTCggIiIgKS50b1N0cmluZygpICk7CisJfQorCisJLyoqCisJICogVmVyaWZ5IHRvU3RyaW5nCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisvLwkJY2hlY2tUb1N0cmluZyggdXJsU3RyMSApOworCQkKKwkJY2hlY2tUb1N0cmluZyggIm51bGw6IiApOworCQkKKwkJY2hlY2tUb1N0cmluZyggImE6YiIgKTsKKwkJY2hlY2tUb1N0cmluZyggImE6Yi9jIiApOworCQljaGVja1RvU3RyaW5nKCAiYTovYiIgKTsKKwkJY2hlY2tUb1N0cmluZyggImE6Yi8iICk7CisJCQorLy8JCWNoZWNrVG9TdHJpbmcoICJhOi8vaG9zdCIgKTsgLy8gY2Fubm90IGRpc3Rpbmd1aXNoIGZyb20gbmV4dCBjYXNlLgorCQljaGVja1RvU3RyaW5nKCAiYTovL2gvIiApOworCQljaGVja1RvU3RyaW5nKCAiYTovL2gvYiIgKTsKKy8vCQljaGVja1RvU3RyaW5nKCAiYTovLy9iIiApOyAvLyBob3N0IGlzIGJsYW5rLgorCisvLwkJY2hlY2tUb1N0cmluZyggImE6Ly9oOi0xIiApOyAvLyBwb3J0IHRvbyBuZWdhdGl2ZQorCQljaGVja1RvU3RyaW5nKCAiYTovL2g6MC8iICk7CisJCWNoZWNrVG9TdHJpbmcoICJhOi8vaDoxLyIgKTsKKwkJY2hlY2tUb1N0cmluZyggImE6Ly9oOjY1NTM1LyIgKTsKKy8vCQljaGVja1RvU3RyaW5nKCAiYTovL2g6NjU1MzYiICk7IC8vIHBvcnQgdG9vIGJpZworLy8JCWNoZWNrVG9TdHJpbmcoICJhOi8vaDovIiApOyAvLyBwb3J0IGlzIGJsYW5rCisvLwkJY2hlY2tUb1N0cmluZyggImE6Ly9oOmIvIiApOyAvLyBwb3J0IGlzIG5vdCBpbnRlZ2VyCisKKwkJY2hlY2tUb1N0cmluZyggImE6Ly91OnBAaC8iICk7CisvLwkJY2hlY2tUb1N0cmluZyggImE6Ly86cEBoLyIgKTsgLy8gdXNlciBpcyBibGFuaworLy8JCWNoZWNrVG9TdHJpbmcoICJhOi8vdTpAaC8iICk7IC8vIHBhc3N3b3JkIGlzIGJsYW5rCisvLwkJY2hlY2tUb1N0cmluZyggImE6Ly86QGgvIiApOyAvLyB1c2VyIGlzIGJsYW5rCisKKwkJY2hlY2tUb1N0cmluZyggImE6P2I9YyIgKTsKKwkJY2hlY2tUb1N0cmluZyggImE6P2Q9ZSIgKTsKKworCQljaGVja1RvU3RyaW5nKCAiYTo7cCIgKTsKKwkJY2hlY2tUb1N0cmluZyggImE6O3EiICk7CisKKwkJY2hlY2tUb1N0cmluZyggImE6I2YiICk7CisJCWNoZWNrVG9TdHJpbmcoICJhOiNnIiApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja1RvU3RyaW5nKCBTdHJpbmcgcyApCisJeworCQlhc3NlcnRFcXVhbHMoIHMsIG5ldyBVUkwoIHMgKS50b1N0cmluZygpICk7CisJfQorfQorCisKZGlmZiAtLWdpdCBhL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvVGVzdENvbW1hbmRQYXJzZXIuamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jbWQvVGVzdENvbW1hbmRQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWIzMTEwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NtZC9UZXN0Q29tbWFuZFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNTkyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY21kOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IG9mIENvbW1hbmRQYXJzZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q29tbWFuZFBhcnNlciBleHRlbmRzIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNtZC5Qcm9ncmFtCit7CisJLyoqCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCisJeworCQl0cnkKKwkJeworCQkJcHJvZyA9IG5ldyBUZXN0Q29tbWFuZFBhcnNlcigpOworCQkJbWFpbiggcHJvZywgYXJncyApOworCQl9CisJCWNhdGNoICggVGhyb3dhYmxlIGUgKQorCQl7CisJCQljbWRQYXJzZUVycm9yID0gdHJ1ZTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVGVzdENvbW1hbmRQYXJzZXIgcHJvZzsKKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNtZFBhcnNlRXJyb3I7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBkZWZpbmVPcHRpb25zQW5kUGFyYW1ldGVycyggQ29tbWFuZFBhcnNlciBjcCApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCWNwLmRlZmluZU51bGxPcHRpb24oICItYXwtLWFscGhhIiwgInNldEFscGhhIiwKKwkJCSJzZXQgdGhlIGFscGhhIG9wdGlvbiIsCisJCQlPcHRpb24uTk9ORSApOworCisJCWNwLmRlZmluZU51bGxPcHRpb24oICItYnwtLWJldGEiLCAic2V0QmV0YSIsCisJCQkic2V0IHRoZSBiZXRhIG9wdGlvbiIsCisJCQlPcHRpb24uTk9ORSApOworCisJCWNwLmRlZmluZVN0cmluZ09wdGlvbiggIi1mfC0tZm9vIiwgInZhbHVlIiwKKwkJCSJzZXRGb29WYWx1ZSIsCisJCQkic3BlY2lmaWVzIHRoZSBmb28gdmFsdWUiLAorCQkJT3B0aW9uLk5PTkUsIG51bGwsIG51bGwgKTsKKworCQljcC5kZWZpbmVTdHJpbmdPcHRpb24oICItQnwtLWJhciIsICJ2YWx1ZSIsCisJCQkic2V0QmFyVmFsdWUiLAorCQkJInNwZWNpZmllcyB0aGUgYmFyIHZhbHVlIiwKKwkJCU9wdGlvbi5OT05FLCBudWxsLCBudWxsICk7CisJCQorCQljcC5kZWZpbmVTdHJpbmdQYXJhbWV0ZXIoICJvbmUiLAorCQkJIm9uZSIsCisJCQkiZmlyc3QgcGFyYW0iLAorCQkJZmFsc2UsIGZhbHNlLCBudWxsICk7CisJCQorCQljcC5kZWZpbmVTdHJpbmdQYXJhbWV0ZXIoICJ0d28iLAorCQkJInR3byIsCisJCQkic2Vjb25kIHBhcmFtIiwKKwkJCWZhbHNlLCBmYWxzZSwgbnVsbCApOworCQkKKwkJY3AuZGVmaW5lU3RyaW5nUGFyYW1ldGVyKCAicmVzdCIsCisJCQkicmVzdCIsCisJCQkiYXJncyIsCisJCQlmYWxzZSwgdHJ1ZSwgbnVsbCApOworCX0KKworCS8qKgorCSAqIENvbW1hbmQgcGFyc2VyIG1ldGhvZCB0byBzZXQgdGhlIGFscGhhIGZsYWcuCisJICogCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIG9wdGlvbgorCSAqIEBwYXJhbSB0b2tlbgorCSAqLworCXB1YmxpYyB2b2lkIHNldEFscGhhKCBDb21tYW5kUGFyc2VyIGNwLCBPcHRpb24gb3B0aW9uLCBTdHJpbmcgdG9rZW4gKQorCXsKKwkJYWxwaGEgPSB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBhbHBoYTsKKworCS8qKgorCSAqIENvbW1hbmQgcGFyc2VyIG1ldGhvZCB0byBzZXQgdGhlIGJldGEgZmxhZy4KKwkgKiAKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gb3B0aW9uCisJICogQHBhcmFtIHRva2VuCisJICovCisJcHVibGljIHZvaWQgc2V0QmV0YSggQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHRva2VuICkKKwl7CisJCWJldGEgPSB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBiZXRhOworCisJLyoqCisJICogQ29tbWFuZCBwYXJzZXIgbWV0aG9kIHRvIHNldCB0aGUgZm9vIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSBvcHRpb24KKwkgKiBAcGFyYW0gdG9rZW4KKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb29WYWx1ZSggQ29tbWFuZFBhcnNlciBjcCwgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHRva2VuLAorCQlTdHJpbmcgdmFsdWUgKQorCXsKKwkJZm9vVmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBmb29WYWx1ZTsKKworCS8qKgorCSAqIENvbW1hbmQgcGFyc2VyIG1ldGhvZCB0byBzZXQgdGhlIGJhciB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gb3B0aW9uCisJICogQHBhcmFtIHRva2VuCisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgc2V0QmFyVmFsdWUoIENvbW1hbmRQYXJzZXIgY3AsIE9wdGlvbiBvcHRpb24sIFN0cmluZyB0b2tlbiwKKwkJU3RyaW5nIHZhbHVlICkKKwl7CisJCWJhclZhbHVlID0gdmFsdWU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYmFyVmFsdWU7CisJCisJLyoqCisJICogQHBhcmFtIGNwCisJICogQHBhcmFtIHBhcmFtCisJICogQHBhcmFtIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgb25lKCBDb21tYW5kUGFyc2VyIGNwLCBQYXJhbWV0ZXIgcGFyYW0sIFN0cmluZyB2YWx1ZSApCisJeworCQlvbmUgPSB2YWx1ZTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgb25lOworCQorCS8qKgorCSAqIEBwYXJhbSBjcAorCSAqIEBwYXJhbSBwYXJhbQorCSAqIEBwYXJhbSB2YWx1ZQorCSAqLworCXB1YmxpYyB2b2lkIHR3byggQ29tbWFuZFBhcnNlciBjcCwgUGFyYW1ldGVyIHBhcmFtLCBTdHJpbmcgdmFsdWUgKQorCXsKKwkJdHdvID0gdmFsdWU7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIHR3bzsKKwkKKwkvKioKKwkgKiBAcGFyYW0gY3AKKwkgKiBAcGFyYW0gcGFyYW0KKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXN0KCBDb21tYW5kUGFyc2VyIGNwLCBQYXJhbWV0ZXIgcGFyYW0sIFN0cmluZyB2YWx1ZSApCisJeworCQlyZXN0LmFkZCggdmFsdWUgKTsKKwl9CisJCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGV4aXQoIGludCBjb2RlLCBTdHJpbmcgc291cmNlLCBTdHJpbmcgcmVhc29uLCBib29sZWFuIGVtZXJnZW5jeSApCisJeworCQlleGl0Q29kZSA9IGNvZGU7CisJfQorCQorCXByaXZhdGUgaW50IGV4aXRDb2RlOworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcnVuID0gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gcnVuOworCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbm90aGluZygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW1haW4oIG5ldyBTdHJpbmdbXSB7fSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYmV0YSApOworCQlhc3NlcnROdWxsKCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydE51bGwoIHByb2cuYmFyVmFsdWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzaG9ydDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLWEiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydFRydWUoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYmV0YSApOworCQlhc3NlcnROdWxsKCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydE51bGwoIHByb2cuYmFyVmFsdWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzaG9ydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLWIiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLmFscGhhICk7CisJCWFzc2VydFRydWUoIHByb2cuYmV0YSApOworCQlhc3NlcnROdWxsKCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydE51bGwoIHByb2cuYmFyVmFsdWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzaG9ydDNhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi1mIiwgImFiYyIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYmV0YSApOworCQlhc3NlcnRFcXVhbHMoICJhYmMiLCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydE51bGwoIHByb2cuYmFyVmFsdWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzaG9ydDNiKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi1mYWJjIiB9ICk7CisJCWFzc2VydFRydWUoIHByb2cucnVuICk7CisJCWFzc2VydEZhbHNlKCBjbWRQYXJzZUVycm9yICk7CisJCWFzc2VydEVxdWFscyggMCwgcHJvZy5leGl0Q29kZSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5hbHBoYSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5iZXRhICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNob3J0NGEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLUIiLCAiZGVmIiB9ICk7CisJCWFzc2VydFRydWUoIHByb2cucnVuICk7CisJCWFzc2VydEZhbHNlKCBjbWRQYXJzZUVycm9yICk7CisJCWFzc2VydEVxdWFscyggMCwgcHJvZy5leGl0Q29kZSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5hbHBoYSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5iZXRhICk7CisJCWFzc2VydE51bGwoIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZGVmIiwgcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNob3J0NGIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLUJkZWYiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLmFscGhhICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLmJldGEgKTsKKwkJYXNzZXJ0TnVsbCggcHJvZy5mb29WYWx1ZSApOworCQlhc3NlcnRFcXVhbHMoICJkZWYiLCBwcm9nLmJhclZhbHVlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWxsc2hvcnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi1hYmYiLCAiYWJjIiB9ICk7CisJCWFzc2VydFRydWUoIHByb2cucnVuICk7CisJCWFzc2VydEZhbHNlKCBjbWRQYXJzZUVycm9yICk7CisJCWFzc2VydEVxdWFscyggMCwgcHJvZy5leGl0Q29kZSApOworCQlhc3NlcnRUcnVlKCBwcm9nLmFscGhhICk7CisJCWFzc2VydFRydWUoIHByb2cuYmV0YSApOworCQlhc3NlcnRFcXVhbHMoICJhYmMiLCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydE51bGwoIHByb2cuYmFyVmFsdWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhbGxzaG9ydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLWFiZmFiYyIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5hbHBoYSApOworCQlhc3NlcnRUcnVlKCBwcm9nLmJldGEgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYWJjIiwgcHJvZy5mb29WYWx1ZSApOworCQlhc3NlcnROdWxsKCBwcm9nLmJhclZhbHVlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbG9uZzEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLS1hbHBoYSIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5hbHBoYSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5iZXRhICk7CisJCWFzc2VydE51bGwoIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxvbmcyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi0tYmV0YSIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5iZXRhICk7CisJCWFzc2VydE51bGwoIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxvbmczYSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW1haW4oIG5ldyBTdHJpbmdbXSB7ICItLWZvbyIsICJhYmMiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLmFscGhhICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLmJldGEgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYWJjIiwgcHJvZy5mb29WYWx1ZSApOworCQlhc3NlcnROdWxsKCBwcm9nLmJhclZhbHVlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbG9uZzNiKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi0tZm9vIiwgIiIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYmV0YSApOworCQlhc3NlcnRFcXVhbHMoICIiLCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydE51bGwoIHByb2cuYmFyVmFsdWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsb25nM2MoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLS1mb289YWJjIiB9ICk7CisJCWFzc2VydFRydWUoIHByb2cucnVuICk7CisJCWFzc2VydEZhbHNlKCBjbWRQYXJzZUVycm9yICk7CisJCWFzc2VydEVxdWFscyggMCwgcHJvZy5leGl0Q29kZSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5hbHBoYSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5iZXRhICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0TnVsbCggcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxvbmczZCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW1haW4oIG5ldyBTdHJpbmdbXSB7ICItLWZvbz0iIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLmFscGhhICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLmJldGEgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiIiwgcHJvZy5mb29WYWx1ZSApOworCQlhc3NlcnROdWxsKCBwcm9nLmJhclZhbHVlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbG9uZzRhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi0tYmFyIiwgImRlZiIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYmV0YSApOworCQlhc3NlcnROdWxsKCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydEVxdWFscyggImRlZiIsIHByb2cuYmFyVmFsdWUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsb25nNGIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQltYWluKCBuZXcgU3RyaW5nW10geyAiLS1iYXI9ZGVmIiB9ICk7CisJCWFzc2VydFRydWUoIHByb2cucnVuICk7CisJCWFzc2VydEZhbHNlKCBjbWRQYXJzZUVycm9yICk7CisJCWFzc2VydEVxdWFscyggMCwgcHJvZy5leGl0Q29kZSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5hbHBoYSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5iZXRhICk7CisJCWFzc2VydE51bGwoIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZGVmIiwgcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFsbGxvbmcxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi0tYWxwaGEiLCAiLS1iZXRhIiwgIi0tZm9vIiwgImFiYyIsICItLWJhciIsICJkZWYiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydFRydWUoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5iZXRhICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZGVmIiwgcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFsbGxvbmcyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi0tYWxwaGEiLCAiLS1iZXRhIiwgIi0tZm9vPWFiYyIsICItLWJhcj1kZWYiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydFRydWUoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5iZXRhICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHByb2cuZm9vVmFsdWUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZGVmIiwgcHJvZy5iYXJWYWx1ZSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcmFtMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW1haW4oIG5ldyBTdHJpbmdbXSB7ICJhYmMiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHByb2cub25lICk7CisJCWFzc2VydEVxdWFscyggbnVsbCwgcHJvZy50d28gKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLnJlc3Quc2l6ZSgpICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFyYW0yKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgImFiYyIsICJkZWYiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHByb2cub25lICk7CisJCWFzc2VydEVxdWFscyggImRlZiIsIHByb2cudHdvICk7CisJCWFzc2VydEVxdWFscyggMCwgcHJvZy5yZXN0LnNpemUoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcmFtMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW1haW4oIG5ldyBTdHJpbmdbXSB7ICJhYmMiLCAiZGVmIiwgImdoaSIgfSApOworCQlhc3NlcnRUcnVlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDAsIHByb2cuZXhpdENvZGUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiYWJjIiwgcHJvZy5vbmUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZGVmIiwgcHJvZy50d28gKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBwcm9nLnJlc3Quc2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggImdoaSIsIHByb2cucmVzdC5nZXQoIDAgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhcmFtNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCW1haW4oIG5ldyBTdHJpbmdbXSB7ICJhYmMiLCAiZGVmIiwgImdoaSIsICJqa2wiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydEVxdWFscyggImFiYyIsIHByb2cub25lICk7CisJCWFzc2VydEVxdWFscyggImRlZiIsIHByb2cudHdvICk7CisJCWFzc2VydEVxdWFscyggMiwgcHJvZy5yZXN0LnNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoICJnaGkiLCBwcm9nLnJlc3QuZ2V0KCAwICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiamtsIiwgcHJvZy5yZXN0LmdldCggMSApICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgbWl4ZWQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgImFiYyIsICItYSIsICJkZWYiLCAiZ2hpIiwgIi1mIiwgIjEyMyIsICJqa2wiIH0gKTsKKwkJYXNzZXJ0VHJ1ZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwcm9nLmV4aXRDb2RlICk7CisJCWFzc2VydFRydWUoIHByb2cuYWxwaGEgKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cuYmV0YSApOworCQlhc3NlcnRFcXVhbHMoICIxMjMiLCBwcm9nLmZvb1ZhbHVlICk7CisJCWFzc2VydEVxdWFscyggbnVsbCwgcHJvZy5iYXJWYWx1ZSApOworCQlhc3NlcnRFcXVhbHMoICJhYmMiLCBwcm9nLm9uZSApOworCQlhc3NlcnRFcXVhbHMoICJkZWYiLCBwcm9nLnR3byApOworCQlhc3NlcnRFcXVhbHMoIDIsIHByb2cucmVzdC5zaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiZ2hpIiwgcHJvZy5yZXN0LmdldCggMCApICk7CisJCWFzc2VydEVxdWFscyggImprbCIsIHByb2cucmVzdC5nZXQoIDEgKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGVycm9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHVua25vd24gc2hvcnQgb3B0aW9uCisJCW1haW4oIG5ldyBTdHJpbmdbXSB7ICIteCIgfSApOworCQlhc3NlcnRGYWxzZSggcHJvZy5ydW4gKTsKKwkJYXNzZXJ0RmFsc2UoIGNtZFBhcnNlRXJyb3IgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBwcm9nLmV4aXRDb2RlICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZXJyb3IyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gdW5rbm93biBsb25nIG9wdGlvbgorCQltYWluKCBuZXcgU3RyaW5nW10geyAiLS14IiB9ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDEsIHByb2cuZXhpdENvZGUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlcnJvcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBtaXNzaW5nIHZhbHVlIGZvciBzaG9ydCBvcHRpb24KKwkJbWFpbiggbmV3IFN0cmluZ1tdIHsgIi1mIiB9ICk7CisJCWFzc2VydEZhbHNlKCBwcm9nLnJ1biApOworCQlhc3NlcnRGYWxzZSggY21kUGFyc2VFcnJvciApOworCQlhc3NlcnRFcXVhbHMoIDEsIHByb2cuZXhpdENvZGUgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBlcnJvcjQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBtaXNzaW5nIHZhbHVlIGZvciBsb25nIG9wdGlvbgorCQltYWluKCBuZXcgU3RyaW5nW10geyAiLS1mb28iIH0gKTsKKwkJYXNzZXJ0RmFsc2UoIHByb2cucnVuICk7CisJCWFzc2VydEZhbHNlKCBjbWRQYXJzZUVycm9yICk7CisJCWFzc2VydEVxdWFscyggMSwgcHJvZy5leGl0Q29kZSApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rlc3RQYWNrZXRpemVyLmphdmEgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UZXN0UGFja2V0aXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2M2Y3MjgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UZXN0UGFja2V0aXplci5qYXZhCkBAIC0wLDAgKzEsOTcxIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogSlVuaXQgVGVzdCBmb3IgUGFja2V0aXplcgorICovCitwdWJsaWMgY2xhc3MgVGVzdFBhY2tldGl6ZXIKK3sKKwlwcml2YXRlIGZpbmFsIE15VHJhbnNwb3J0RGF0YSB0cmFuc3BvcnQgPSBuZXcgTXlUcmFuc3BvcnREYXRhKCk7CisJcHJpdmF0ZSBmaW5hbCBNeVNlc3Npb25QYWNrZXQgc2Vzc2lvbiA9IG5ldyBNeVNlc3Npb25QYWNrZXQoKTsKKwlwcml2YXRlIGZpbmFsIFBhY2tldGl6ZXIgcCA9IG5ldyBQYWNrZXRpemVyKCB0cmFuc3BvcnQsICJ0Y3A6IiwgbnVsbCApOworCXByaXZhdGUgZmluYWwgV2hvIHdobyA9IG5ldyBXaG8oKSB7IC8qIG5vdGhpbmcgKi8gfTsKKworCS8qKiBzZXR1cCB0ZXN0ICovCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkKKwl7CisJCXAuc2V0U2Vzc2lvbiggc2Vzc2lvbiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJYXNzZXJ0U2FtZSggdHJhbnNwb3J0LCBwLmdldFRyYW5zcG9ydCgpICk7CisJCWFzc2VydFNhbWUoIHNlc3Npb24sIHAuZ2V0U2Vzc2lvbigpICk7CisJCWFzc2VydFNhbWUoIHAsIHRyYW5zcG9ydC5nZXRTZXNzaW9uKCkgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gdGhlc2UgdGVzdHMgYXJlIGZvciBwYWNrZXRzIGRlbGl2ZXJlZCB0byB0aGUgcGFja2V0IHNvdXJjZSAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFja2V0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIENyZWF0ZSBlbXB0eSBwYWNrZXQgdG8gc2VuZAorCQlhc3NlcnQgcC5oZWFkZXJTaXplKCkgPT0gODsKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQkvLyBzcGFjZSBmb3IgaGVhZGVyOgorCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorCQkgICAgLy8gcGFja2V0IGRhdGE6CisJCX0gKTsKKwkJCisJCS8vIHRoaXMgaXMgdGhlIHJlc3VsdCB3ZSBleHBlY3QuCisJCWJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW11bXQorCQl7CisJCQl7CisJCQkJLy8gaGVhZGVyOgorCQkJCS0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMCwgMCwgMAorCQkJICAgIC8vIHBhY2tldCBkYXRhOgorCQkJfQorCQl9OworCisJCXAudHJhbnNwb3J0UGFja2V0KCB3aG8sIGJ1ZiApOworCQkKKwkJYXNzZXJ0U2FtZSggV2hhdC5EQVRBLCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnRUcnVlKCB0cmFuc3BvcnQuY2hlY2soIHJlc3VsdCApICk7CisJCWFzc2VydFNhbWUoIHdobywgdHJhbnNwb3J0LnJlY2lwaWVudCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgcGFja2V0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIENyZWF0ZSAxIGJ5dGUgcGFja2V0IHRvIHNlbmQKKwkJYXNzZXJ0IHAuaGVhZGVyU2l6ZSgpID09IDg7CisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJLy8gc3BhY2UgZm9yIGhlYWRlcjoKKwkJICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCSAgICAvLyBwYWNrZXQgZGF0YToKKwkJICAgIDEKKwkJfSApOworCQkKKwkJLy8gdGhpcyBpcyB0aGUgcmVzdWx0IHdlIGV4cGVjdC4KKwkJYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdCisJCXsKKwkJCXsKKwkJCQkvLyBoZWFkZXI6CisJCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAxLAorCQkJICAgIC8vIHBhY2tldCBkYXRhOgorCQkJICAgIDEKKwkJCX0KKwkJfTsKKworCQlwLnRyYW5zcG9ydFBhY2tldCggd2hvLCBidWYgKTsKKwkJCisJCWFzc2VydFNhbWUoIFdoYXQuREFUQSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggdHJhbnNwb3J0LmNoZWNrKCByZXN1bHQgKSApOworCQlhc3NlcnRTYW1lKCB3aG8sIHRyYW5zcG9ydC5yZWNpcGllbnQgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBhY2tldDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBDcmVhdGUgMiBieXRlIHBhY2tldCB0byBzZW5kCisJCWFzc2VydCBwLmhlYWRlclNpemUoKSA9PSA4OworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHNwYWNlIGZvciBoZWFkZXI6CisJCSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkgICAgLy8gcGFja2V0IGRhdGE6CisJCSAgICAyLCAzCisJCX0gKTsKKwkJCisJCWJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW11bXQorCQl7CisJCQl7CisJCQkJLy8gaGVhZGVyOgorCQkJCS0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMCwgMCwgMiwKKwkJCSAgICAvLyBwYWNrZXQgZGF0YToKKwkJCSAgICAyLCAzCisJCQl9CisJCX07CisKKwkJcC50cmFuc3BvcnRQYWNrZXQoIHdobywgYnVmICk7CisJCQorCQlhc3NlcnRTYW1lKCBXaGF0LkRBVEEsIHRyYW5zcG9ydC53aGF0ICk7CisJCWFzc2VydFRydWUoIHRyYW5zcG9ydC5jaGVjayggcmVzdWx0ICkgKTsKKwkJYXNzZXJ0U2FtZSggd2hvLCB0cmFuc3BvcnQucmVjaXBpZW50ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYWNrZXQ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQ3JlYXRlIHRvby1zbWFsbCBwYWNrZXQgdG8gc2VuZAorCQlhc3NlcnQgcC5oZWFkZXJTaXplKCkgPiA3OworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHNwYWNlIGZvciBoZWFkZXI6CisJCQkwLCAwLCAwLCAwLCAwLCAwLCAwIC8vIHRvbyBzaG9ydCEKKwkJICAgIC8vIHBhY2tldCBkYXRhOgorCQl9ICk7CisKKwkJcC50cmFuc3BvcnRQYWNrZXQoIHdobywgYnVmICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBwYWNrZXQ1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQ3JlYXRlIHRvby1zbWFsbCBwYWNrZXQgdG8gc2VuZAorCQlhc3NlcnQgcC5oZWFkZXJTaXplKCkgPiAwOworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHt9ICk7CisJCXAudHJhbnNwb3J0UGFja2V0KCB3aG8sIGJ1ZiApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHRoZXNlIHRlc3RzIGFyZSBmb3IgdmFyaW91cyBiYWQgcGFja2V0cyAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGJhZDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBDcmVhdGUgZGF0YSB0byBzZW5kCisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJLy8gcGFja2V0IGhlYWRlcjoKKwkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgLy8gYmFkIHNpZworCQkgICAgLy8gcGFja2V0IGRhdGE6CisJCX0gKTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBiYWQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQ3JlYXRlIGRhdGEgdG8gc2VuZAorCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHBhY2tldCBoZWFkZXI6CisJCQkxLCAyLCAzLCA0LCAwLCAwLCAwLCAwIC8vIGJhZCBzaWcKKwkJICAgIC8vIHBhY2tldCBkYXRhOgorCQl9ICk7CisKKwkJcC5zZXNzaW9uRGF0YSggd2hvLCBidWYgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgYmFkMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIENyZWF0ZSBkYXRhIHRvIHNlbmQKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQkvLyBwYWNrZXQgaGVhZGVyOgorCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAxLCAwLCAwIC8vIHNpemUgdG9vIGJpZworCQkgICAgLy8gcGFja2V0IGRhdGE6CisJCX0gKTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBiYWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gQ3JlYXRlIGRhdGEgdG8gc2VuZAorCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHBhY2tldCBoZWFkZXI6CisJCQktMzQsIC04MywgLTY2LCAtMTcsIC0xLCAtMSwgLTEsIC0xIC8vIG5lZ2F0aXZlIHBhY2tldCBzaXplCisJCSAgICAvLyBwYWNrZXQgZGF0YToKKwkJfSApOworCisJCXAuc2Vzc2lvbkRhdGEoIHdobywgYnVmICk7CisJfQorCQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHRoZXNlIHRlc3RzIGFyZSBmb3IgYSBzaW5nbGUgcGFja2V0IGluIGEgc2luZ2xlIGJ1ZmZlciAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzaW5nbGVTaW5nbGVEYXRhMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIENyZWF0ZSBkYXRhIHRvIHNlbmQKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQkvLyBwYWNrZXQgaGVhZGVyOgorCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAwCisJCSAgICAvLyBwYWNrZXQgZGF0YToKKwkJfSApOworCisJCXAuc2Vzc2lvbkRhdGEoIHdobywgYnVmICk7CisJCQorCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi5jaGVjayggbnVsbCApICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uc2VuZGVyICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzaW5nbGVTaW5nbGVEYXRhMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGxlbmd0aCA9IDEKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQkvLyBwYWNrZXQgaGVhZGVyOgorCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAxLAorCQkgICAgLy8gcGFja2V0IGRhdGE6CisJCSAgICAxCisJCX0gKTsKKwkJYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdCisJCXsKKwkJCXsKKwkJCSAgICAvLyBwYWNrZXQgZGF0YToKKwkJCQkxCisJCQl9CisJCX07CisKKwkJcC5zZXNzaW9uRGF0YSggd2hvLCBidWYgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlBBQ0tFVCwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFRydWUoIHNlc3Npb24uY2hlY2soIHJlc3VsdCApICk7CisJCWFzc2VydFNhbWUoIHdobywgc2Vzc2lvbi5zZW5kZXIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNpbmdsZVNpbmdsZURhdGEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbGVuZ3RoID0gMgorCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHBhY2tldCBoZWFkZXI6CisJCQktMzQsIC04MywgLTY2LCAtMTcsIDAsIDAsIDAsIDIsCisJCSAgICAvLyBwYWNrZXQgZGF0YToKKwkJICAgIDMsIDQKKwkJfSApOworCQlieXRlW11bXSByZXN1bHQgPSBuZXcgYnl0ZVtdW10KKwkJeworCQkJeworCQkJICAgIC8vIHBhY2tldCBkYXRhOgorCQkJICAgIDMsIDQKKwkJCX0KKwkJfTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCisJCWFzc2VydFNhbWUoIFdoYXQuUEFDS0VULCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi5jaGVjayggcmVzdWx0ICkgKTsKKwkJYXNzZXJ0U2FtZSggd2hvLCBzZXNzaW9uLnNlbmRlciApOworCX0KKworCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHRoZXNlIHRlc3RzIGFyZSBmb3IgdHdvIHBhY2tldHMgaW4gYSBzaW5nbGUgYnVmZmVyIC8vCisJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRhdGExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gMnggbGVuZ3RoID0gMAorCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHBhY2tldCBoZWFkZXI6CisJCQktMzQsIC04MywgLTY2LCAtMTcsIDAsIDAsIDAsIDAsCisJCQkvLyBwYWNrZXQgaGVhZGVyOgorCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAwCisJCX0gKTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRUcnVlKCBzZXNzaW9uLmNoZWNrKCBudWxsICkgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRhdGEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbGVuZ3RoID0gMSwgbGVuZ3RoID0gMAorCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHBhY2tldCAxIGhlYWRlcjoKKwkJCS0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMCwgMCwgMSwKKwkJICAgIC8vIHBhY2tldCAxIGRhdGE6CisJCSAgICAxLAorCQkJLy8gcGFja2V0IDIgaGVhZGVyOgorCQkgICAgLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAwLAorCQkgICAgLy8gcGFja2V0IDIgZGF0YToKKwkJfSApOworCQkKKwkJYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdCisJCXsKKwkJICAgIHsKKwkJCSAgICAvLyBwYWNrZXQgMSBkYXRhOgorCQkJICAgIDEKKwkJICAgIH0KKwkJfTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCisJCWFzc2VydFNhbWUoIFdoYXQuUEFDS0VULCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi5jaGVjayggcmVzdWx0ICkgKTsKKwkJYXNzZXJ0U2FtZSggd2hvLCBzZXNzaW9uLnNlbmRlciApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZGF0YTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBsZW5ndGggPSAwLCBsZW5ndGggPSAxCisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJLy8gcGFja2V0IDEgaGVhZGVyOgorCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAwLAorCQkgICAgLy8gcGFja2V0IDEgZGF0YToKKwkJCS8vIHBhY2tldCAyIGhlYWRlcjoKKwkJCS0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMCwgMCwgMSwKKwkJICAgIC8vIHBhY2tldCAyIGRhdGE6CisJCSAgICAyCisJCX0gKTsKKwkJCisJCWJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW11bXQorCQl7CisJCSAgICB7CisJCQkgICAgLy8gcGFja2V0IDIgZGF0YToKKwkJCSAgICAyCisJCSAgICB9CisJCX07CisKKwkJcC5zZXNzaW9uRGF0YSggd2hvLCBidWYgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlBBQ0tFVCwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFRydWUoIHNlc3Npb24uY2hlY2soIHJlc3VsdCApICk7CisJCWFzc2VydFNhbWUoIHdobywgc2Vzc2lvbi5zZW5kZXIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRhdGE0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gMnggbGVuZ3RoID0gMQorCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHBhY2tldCAxIGhlYWRlcjoKKwkJCS0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMCwgMCwgMSwKKwkJICAgIC8vIHBhY2tldCAxIGRhdGE6CisJCSAgICAxLAorCQkJLy8gcGFja2V0IDIgaGVhZGVyOgorCQkgICAgLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAxLAorCQkgICAgLy8gcGFja2V0IDIgZGF0YToKKwkJICAgIDIKKwkJfSApOworCQkKKwkJYnl0ZVtdW10gcmVzdWx0ID0gbmV3IGJ5dGVbXVtdCisJCXsKKwkJICAgIHsKKwkJCSAgICAvLyBwYWNrZXQgMSBkYXRhOgorCQkJICAgIDEKKwkJICAgIH0sCisJCSAgICB7CisJCQkgICAgLy8gcGFja2V0IDIgZGF0YToKKwkJCSAgICAyCisJCSAgICB9CisJCX07CisKKwkJcC5zZXNzaW9uRGF0YSggd2hvLCBidWYgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlBBQ0tFVCwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFRydWUoIHNlc3Npb24uY2hlY2soIHJlc3VsdCApICk7CisJCWFzc2VydFNhbWUoIHdobywgc2Vzc2lvbi5zZW5kZXIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvdWJsZVNpbmdsZURhdGEyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbGVuZ3RoID0gMgorCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJCS8vIHBhY2tldCAxIGhlYWRlcjoKKwkJCS0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMCwgMCwgMiwKKwkJICAgIC8vIHBhY2tldCAxIGRhdGE6CisJCSAgICAzLCA0LAorCQkJLy8gcGFja2V0IDIgaGVhZGVyOgorCQkgICAgLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAyLAorCQkgICAgLy8gcGFja2V0IDIgZGF0YToKKwkJICAgIDUsIDYKKwkJfSApOworCQlieXRlW11bXSByZXN1bHQgPSBuZXcgYnl0ZVtdW10KKwkJeworCQkgICAgeworCQkJICAgIC8vIHBhY2tldCAxIGRhdGE6CisJCSAgICAgICAgMywgNAorCQkgICAgfSwKKwkJICAgIHsKKwkJCSAgICAvLyBwYWNrZXQgMiBkYXRhOgorCQkgICAgICAgIDUsIDYKKwkJICAgIH0KKwkJfTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCisJCWFzc2VydFNhbWUoIFdoYXQuUEFDS0VULCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi5jaGVjayggcmVzdWx0ICkgKTsKKwkJYXNzZXJ0U2FtZSggd2hvLCBzZXNzaW9uLnNlbmRlciApOworCX0KKworCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gdGhlc2UgdGVzdHMgYXJlIGZvciB0d28gcGFja2V0cyBpbiB0d28gYnVmZmVycyB3aXRoIGhlYWRlciBzcGxpdCAvLworCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvdWJsZVNpbmdsZV9IZWFkZXJTcGxpdF9EYXRhMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGxlbmd0aCA9IDAKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQkvLyBwYWNrZXQgMSBoZWFkZXIgKHBhcnRpYWwpOgorCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwCisJCX0gKTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRUcnVlKCBzZXNzaW9uLmNoZWNrKCBudWxsICkgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKworCQlGbGV4QnVmZmVyIGJ1ZjIgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQkvLyBwYWNrZXQgMSBoZWFkZXIgKHJlbWFpbmRlcik6CisJCSAgICAwLCAwLAorCQkJLy8gcGFja2V0IDIgaGVhZGVyCisJCSAgICAtMzQsIC04MywgLTY2LCAtMTcsIDAsIDAsIDAsIDAKKwkJfSApOworCisJCXAuc2Vzc2lvbkRhdGEoIG51bGwsIGJ1ZjIgKTsKKworCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi5jaGVjayggbnVsbCApICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uc2VuZGVyICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3VibGVTaW5nbGVfSGVhZGVyU3BsaXRfRGF0YTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBsZW5ndGggPSAxCisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJLy8gcGFja2V0IDEgaGVhZGVyIChwYXJ0aWFsKToKKwkJCS0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMAorCQl9ICk7CisKKwkJcC5zZXNzaW9uRGF0YSggd2hvLCBidWYgKTsKKworCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi5jaGVjayggbnVsbCApICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uc2VuZGVyICk7CisKKwkJRmxleEJ1ZmZlciBidWYyID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJLy8gcGFja2V0IDEgaGVhZGVyIChyZW1haW5kZXIpOgorCQkgICAgMCwgMSwKKwkJICAgIC8vIHBhY2tldCAxIGRhdGE6CisJCSAgICAxLAorCQkJLy8gcGFja2V0IDIgaGVhZGVyOgorCQkgICAgLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAxLAorCQkgICAgLy8gcGFja2V0IDIgZGF0YToKKwkJICAgIDIKKwkJfSApOworCQkKKwkJYnl0ZVtdW10gcmVzdWx0MiA9IG5ldyBieXRlW11bXQorCQl7CisJCSAgICB7CisJCQkgICAgLy8gcGFja2V0IDEgZGF0YToKKwkJCSAgICAxCisJCSAgICB9LAorCQkgICAgeworCQkJICAgIC8vIHBhY2tldCAyIGRhdGE6CisJCQkgICAgMgorCQkgICAgfQorCQl9OworCisJCXAuc2Vzc2lvbkRhdGEoIHdobywgYnVmMiApOworCisJCWFzc2VydFNhbWUoIFdoYXQuUEFDS0VULCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0VHJ1ZSggc2Vzc2lvbi5jaGVjayggcmVzdWx0MiApICk7CisJCWFzc2VydFNhbWUoIHdobywgc2Vzc2lvbi5zZW5kZXIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvdWJsZVNpbmdsZV9IZWFkZXJTcGxpdF9EYXRhMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGxlbmd0aCA9IDIKKwkJRmxleEJ1ZmZlciBidWYgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCQktMzQsIC04MywgLTY2LCAtMTcsIDAsIDAKKwkJfSApOworCisJCXAuc2Vzc2lvbkRhdGEoIHdobywgYnVmICk7CisKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFRydWUoIHNlc3Npb24uY2hlY2soIG51bGwgKSApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCisJCUZsZXhCdWZmZXIgYnVmMiA9IG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdCisJCXsKKwkJICAgIDAsIDIsIDMsIDQsIC0zNCwgLTgzLCAtNjYsIC0xNywgMCwgMCwgMCwgMiwgNSwgNgorCQl9ICk7CisJCWJ5dGVbXVtdIHJlc3VsdDIgPSBuZXcgYnl0ZVtdW10KKwkJeworCQkgICAgeworCQkgICAgICAgIDMsIDQKKwkJICAgIH0sCisJCSAgICB7CisJCSAgICAgICAgNSwgNgorCQkgICAgfQorCQl9OworCisJCXAuc2Vzc2lvbkRhdGEoIG51bGwsIGJ1ZjIgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlBBQ0tFVCwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFRydWUoIHNlc3Npb24uY2hlY2soIHJlc3VsdDIgKSApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCX0KKworCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHRoZXNlIHRlc3RzIGFyZSBmb3IgdHdvIHBhY2tldHMgaW4gdHdvIGJ1ZmZlcnMgd2l0aCBib2R5IHNwbGl0IC8vCisJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvdWJsZVNpbmdsZV9Cb2R5U3BsaXRfRGF0YTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBsZW5ndGggPSAyCisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAyLCAxCisJCX0gKTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRUcnVlKCBzZXNzaW9uLmNoZWNrKCBudWxsICkgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKworCQlGbGV4QnVmZmVyIGJ1ZjIgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCSAgICAyLCAtMzQsIC04MywgLTY2LCAtMTcsIDAsIDAsIDAsIDIsIDMsIDQKKwkJfSApOworCQlieXRlW11bXSByZXN1bHQyID0gbmV3IGJ5dGVbXVtdCisJCXsKKwkJICAgIHsKKwkJICAgICAgICAxLCAyCisJCSAgICB9LAorCQkgICAgeworCQkgICAgICAgIDMsIDQKKwkJICAgIH0KKwkJfTsKKworCQlwLnNlc3Npb25EYXRhKCBudWxsLCBidWYyICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5QQUNLRVQsIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRUcnVlKCBzZXNzaW9uLmNoZWNrKCByZXN1bHQyICkgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvdWJsZVNpbmdsZV9Cb2R5U3BsaXRfRGF0YTMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBsZW5ndGggPSAzCisJCUZsZXhCdWZmZXIgYnVmID0gbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10KKwkJeworCQkJLTM0LCAtODMsIC02NiwgLTE3LCAwLCAwLCAwLCAzLCA1LCA2CisJCX0gKTsKKworCQlwLnNlc3Npb25EYXRhKCB3aG8sIGJ1ZiApOworCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRUcnVlKCBzZXNzaW9uLmNoZWNrKCBudWxsICkgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5zZW5kZXIgKTsKKworCQlGbGV4QnVmZmVyIGJ1ZjIgPSBuZXcgRmxleEJ1ZmZlciggbmV3IGJ5dGVbXQorCQl7CisJCSAgICA3LCAtMzQsIC04MywgLTY2LCAtMTcsIDAsIDAsIDAsIDMsIDgsIDksIDEwCisJCX0gKTsKKwkJYnl0ZVtdW10gcmVzdWx0MiA9IG5ldyBieXRlW11bXQorCQl7CisJCSAgICB7CisJCSAgICAgICAgNSwgNiwgNworCQkgICAgfSwKKwkJICAgIHsKKwkJICAgICAgICA4LCA5LCAxMAorCQkgICAgfQorCQl9OworCisJCXAuc2Vzc2lvbkRhdGEoIG51bGwsIGJ1ZjIgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlBBQ0tFVCwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFRydWUoIHNlc3Npb24uY2hlY2soIHJlc3VsdDIgKSApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnNlbmRlciApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2Vzc2lvblF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IFFVRVJZID0gImZvbyI7CisJCU9iamVjdCBSRVNVTFQgPSAiYmFyIjsKKwkJCisJCWFzc2VydE51bGwoIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnF1ZXJ5ICk7CisJCXNlc3Npb24ucXVlcnlfcmVzdWx0ID0gUkVTVUxUOworCQkKKwkJT2JqZWN0IHJlc3VsdCA9IHAuc2Vzc2lvblF1ZXJ5KCBRVUVSWSApOworCisJCWFzc2VydFNhbWUoIFdoYXQuU0VTU0lPTl9RVUVSWSwgc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydFNhbWUoIFFVRVJZLCBzZXNzaW9uLnF1ZXJ5ICk7CisJCWFzc2VydFNhbWUoIFJFU1VMVCwgcmVzdWx0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBDT05UUk9MID0gImZvbyI7CisJCU9iamVjdCBWQUxVRSA9ICJiYXIiOworCQkKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi53aGF0ICk7CisJCWFzc2VydE51bGwoIHNlc3Npb24uY29udHJvbCApOworCQlhc3NlcnROdWxsKCBzZXNzaW9uLnZhbHVlICk7CisJCQorCQlwLnNlc3Npb25Db250cm9sKCBDT05UUk9MLCBWQUxVRSApOworCisJCWFzc2VydFNhbWUoIFdoYXQuU0VTU0lPTl9DT05UUk9MLCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggQ09OVFJPTCwgc2Vzc2lvbi5jb250cm9sICk7CisJCWFzc2VydFNhbWUoIFZBTFVFLCBzZXNzaW9uLnZhbHVlICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IEVWRU5UID0gImZvbyI7CisJCQorCQlhc3NlcnROdWxsKCBzZXNzaW9uLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggc2Vzc2lvbi5ldmVudCApOworCQkKKwkJcC5zZXNzaW9uTm90aWZ5KCBFVkVOVCApOworCisJCWFzc2VydFNhbWUoIFdoYXQuU0VTU0lPTl9OT1RJRlksIHNlc3Npb24ud2hhdCApOworCQlhc3NlcnRTYW1lKCBFVkVOVCwgc2Vzc2lvbi5ldmVudCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlPYmplY3QgUVVFUlkgPSAiZm9vIjsKKwkJT2JqZWN0IFJFU1VMVCA9ICJiYXIiOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnF1ZXJ5ICk7CisJCXRyYW5zcG9ydC5xdWVyeV9yZXN1bHQgPSBSRVNVTFQ7CisJCQorCQlPYmplY3QgcmVzdWx0ID0gcC50cmFuc3BvcnRRdWVyeSggUVVFUlkgKTsKKworCQlhc3NlcnRTYW1lKCBXaGF0LlRSQU5TUE9SVF9RVUVSWSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggUVVFUlksIHRyYW5zcG9ydC5xdWVyeSApOworCQlhc3NlcnRTYW1lKCBSRVNVTFQsIHJlc3VsdCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0Q29udHJvbCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU9iamVjdCBDT05UUk9MID0gImZvbyI7CisJCU9iamVjdCBWQUxVRSA9ICJiYXIiOworCQkKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LmNvbnRyb2wgKTsKKwkJYXNzZXJ0TnVsbCggdHJhbnNwb3J0LnZhbHVlICk7CisJCQorCQlwLnRyYW5zcG9ydENvbnRyb2woIENPTlRST0wsIFZBTFVFICk7CisKKwkJYXNzZXJ0U2FtZSggV2hhdC5UUkFOU1BPUlRfQ09OVFJPTCwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggQ09OVFJPTCwgdHJhbnNwb3J0LmNvbnRyb2wgKTsKKwkJYXNzZXJ0U2FtZSggVkFMVUUsIHRyYW5zcG9ydC52YWx1ZSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdHJhbnNwb3J0Tm90aWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJT2JqZWN0IEVWRU5UID0gImZvbyI7CisJCQorCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQud2hhdCApOworCQlhc3NlcnROdWxsKCB0cmFuc3BvcnQuZXZlbnQgKTsKKwkJCisJCXAudHJhbnNwb3J0Tm90aWZ5KCBFVkVOVCApOworCisJCWFzc2VydFNhbWUoIFdoYXQuVFJBTlNQT1JUX05PVElGWSwgdHJhbnNwb3J0LndoYXQgKTsKKwkJYXNzZXJ0U2FtZSggRVZFTlQsIHRyYW5zcG9ydC5ldmVudCApOworCX0KKworCS8qKgorCSAqIHRlc3RpbmcgZXZlbnRzLgorCSAqLworCWVudW0gV2hhdAorCXsKKwkJLyoqICovIERBVEEsCisJCS8qKiAqLyBQQUNLRVQsCisJCS8qKiAqLyBTRVNTSU9OX1FVRVJZLAorCQkvKiogKi8gU0VTU0lPTl9DT05UUk9MLAorCQkvKiogKi8gU0VTU0lPTl9OT1RJRlksCisJCS8qKiAqLyBUUkFOU1BPUlRfUVVFUlksCisJCS8qKiAqLyBUUkFOU1BPUlRfQ09OVFJPTCwKKwkJLyoqICovIFRSQU5TUE9SVF9OT1RJRlkKKwl9OworCQorCS8qKgorCSAqIFRlc3QgamlnCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBNeVRyYW5zcG9ydERhdGEgaW1wbGVtZW50cyBUcmFuc3BvcnREYXRhCisJeworCQkvKiogKi8gcHVibGljIFdoYXQgd2hhdDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgcXVlcnk7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IHF1ZXJ5X3Jlc3VsdDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgY29udHJvbDsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgdmFsdWU7CisJCS8qKiAqLyBwdWJsaWMgT2JqZWN0IGV2ZW50OworCQkvKiogKi8gcHVibGljIFdobyByZWNpcGllbnQ7CisJCS8qKiAqLyBwdWJsaWMgTGlzdDxieXRlW10+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKwkJCisJCXB1YmxpYyBPYmplY3QgdHJhbnNwb3J0UXVlcnkoIE9iamVjdCBxdWVyeSApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJd2hhdCA9IFdoYXQuVFJBTlNQT1JUX1FVRVJZOworCQkJdGhpcy5xdWVyeSA9IHF1ZXJ5OworCQkJcmV0dXJuIHF1ZXJ5X3Jlc3VsdDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRyYW5zcG9ydENvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5UUkFOU1BPUlRfQ09OVFJPTDsKKwkJCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0cmFuc3BvcnROb3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJd2hhdCA9IFdoYXQuVFJBTlNQT1JUX05PVElGWTsKKwkJCXRoaXMuZXZlbnQgPSBldmVudDsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgdHJhbnNwb3J0RGF0YSggV2hvIHJlY2lwaWVudCwgRmxleEJ1ZmZlciBidWYgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl3aGF0ID0gV2hhdC5EQVRBOworCQkJdGhpcy5yZWNpcGllbnQgPSByZWNpcGllbnQ7CisJCQlsaXN0LmFkZCggYnVmLmdldEF2YWlsQnl0ZXMoKSApOworCQl9CisKKwkJcHVibGljIFNlc3Npb25EYXRhIGdldFNlc3Npb24oKQorCQl7CisJCQlyZXR1cm4gc2Vzc2lvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oIFNlc3Npb25EYXRhIHNlc3Npb24gKQorCQl7CisJCQl0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworCQl9CisJCQorCQlwcml2YXRlIFNlc3Npb25EYXRhIHNlc3Npb247CisKKwkJLy8gQXV4aWxpYXJ5IG1ldGhvZHMKKworCQkvKioKKwkJICogQHBhcmFtIHJlc3VsdAorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdCBtYXRjaGVzIGxpc3QuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBjaGVjayggYnl0ZVtdW10gcmVzdWx0ICkKKwkJeworCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCXJldHVybiBsaXN0LnNpemUoKSA9PSAwOworCQkJCisJCQlpZiAobGlzdC5zaXplKCkgIT0gcmVzdWx0Lmxlbmd0aCkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKKwkJCQlpZiAoIWNoZWNrKCBsaXN0LmdldCggaSApLCByZXN1bHRbaV0gKSkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBjaGVjayggYnl0ZVtdIGEsIGJ5dGVbXSBiICkKKwkJeworCQkJaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmIChhW2ldICE9IGJbaV0pCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBIHBhY2tldCBoYW5kbGVyIHRlc3QgamlnLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXNzaW9uUGFja2V0IGltcGxlbWVudHMgU2Vzc2lvblBhY2tldAorCXsKKwkJLyoqICovIHB1YmxpYyBXaGF0IHdoYXQ7CisJCS8qKiAqLyBwdWJsaWMgV2hvIHNlbmRlcjsKKwkJLyoqICovIHB1YmxpYyBMaXN0PGJ5dGVbXT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOworCQkvKiogKi8gcHVibGljIE9iamVjdCBxdWVyeTsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgcXVlcnlfcmVzdWx0OworCQkvKiogKi8gcHVibGljIE9iamVjdCBjb250cm9sOworCQkvKiogKi8gcHVibGljIE9iamVjdCB2YWx1ZTsKKwkJLyoqICovIHB1YmxpYyBPYmplY3QgZXZlbnQ7CisKKwkJLy8gQXV4aWxpYXJ5IG1ldGhvZHMKKworCQkvKioKKwkJICogQHBhcmFtIHJlc3VsdAorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdCBtYXRjaGVzIGxpc3QuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBjaGVjayggYnl0ZVtdW10gcmVzdWx0ICkKKwkJeworCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCXJldHVybiBsaXN0LnNpemUoKSA9PSAwOworCQkJCisJCQlpZiAobGlzdC5zaXplKCkgIT0gcmVzdWx0Lmxlbmd0aCkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKKwkJCQlpZiAoIWNoZWNrKCBsaXN0LmdldCggaSApLCByZXN1bHRbaV0gKSkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBjaGVjayggYnl0ZVtdIGEsIGJ5dGVbXSBiICkKKwkJeworCQkJaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmIChhW2ldICE9IGJbaV0pCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkvLyBQYWNrZXRIYW5kbGVyIG1ldGhvZHMKKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uUGFja2V0KCBXaG8gc2VuZGVyLCBGbGV4QnVmZmVyIGJ1ZiApCisJCSAgICB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXdoYXQgPSBXaGF0LlBBQ0tFVDsKKwkJCXRoaXMuc2VuZGVyID0gc2VuZGVyOworCQkJbGlzdC5hZGQoIGJ1Zi5nZXRBdmFpbEJ5dGVzKCkgKTsKKworCQl9CisKKwkJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApCisJCXsKKwkJCXdoYXQgPSBXaGF0LlNFU1NJT05fUVVFUlk7CisJCQl0aGlzLnF1ZXJ5ID0gcXVlcnk7CisJCQlyZXR1cm4gcXVlcnlfcmVzdWx0OworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQl7CisJCQl3aGF0ID0gV2hhdC5TRVNTSU9OX0NPTlRST0w7CisJCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkKKwkJeworCQkJd2hhdCA9IFdoYXQuU0VTU0lPTl9OT1RJRlk7CisJCQl0aGlzLmV2ZW50ID0gZXZlbnQ7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9pby9UZXN0VGNwQ29ubmVjdGlvbi5qYXZhIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGVzdFRjcENvbm5lY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc4MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGVzdFRjcENvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDc2OCBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLldobzsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0cyBUY3BDb25uZWN0aW9uLgorICovCitwdWJsaWMgY2xhc3MgVGVzdFRjcENvbm5lY3Rpb24KK3sKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBNeUxpc3RlbmVyIGxoID0gbmV3IE15TGlzdGVuZXIoKTsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFRjcExpc3RlbmVyIGwgPSBuZXcgVGNwTGlzdGVuZXIoICJ0Y3A6Ly8wLjAuMC4wOjAiLCBudWxsICk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVCA9IDQwMDA7CisJCisJcHJpdmF0ZSBzdGF0aWMgaW50IHBvcnQ7CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWwuc2V0U2Vzc2lvbiggbGggKTsKKwkJCisJCS8vIHN0YXJ0IGxpc3RlbmVyCisJCWwuc3RhcnQoKTsKKwkJbC53YWl0VXAoIFRJTUVPVVQgKTsKKwkJCisJCXBvcnQgPSAoKEluZXRTb2NrZXRBZGRyZXNzKSBsLmxvY2FsQWRkcmVzcygpKS5nZXRQb3J0KCk7CisJCQorCQlMb2cuYWRkU2luayggbnVsbCApOworCQlMb2cucmVwb3J0KCAiVGVzdFRjcENvbm5lY3Rpb24iICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHN0b3BMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWwuc3RvcCgpOworCQlsLndhaXREb3duKCBUSU1FT1VUICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm8gaG9zdCBvciBwb3J0CisJCW5ldyBUY3BDb25uZWN0aW9uKCBudWxsLCAidGNwOiIsIG51bGwgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNvY2tldCBzID0gbmV3IFNvY2tldCggIjEyNy4wLjAuMSIsIHBvcnQgKTsKKwkJU29ja2V0IHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJVGNwVHJhbnNwb3J0IGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggcywgInRjcDoiLCBudWxsICk7CisJCWFzc2VydE51bGwoIGMuZ2V0U2Vzc2lvbigpICk7CisJCQorCQlzLmNsb3NlKCk7CisJCXQuY2xvc2UoKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNlc3Npb25EYXRhIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJU29ja2V0IHMgPSBuZXcgU29ja2V0KCAiMTI3LjAuMC4xIiwgcG9ydCApOworCQlTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLndhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisJCQorCQlUY3BUcmFuc3BvcnQgYyA9IG5ldyBUY3BDb25uZWN0aW9uKCBzLCAidGNwOiIsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQlhc3NlcnRTYW1lKCBkaCwgYy5nZXRTZXNzaW9uKCkgKTsKKwkJCisJCXMuY2xvc2UoKTsKKwkJdC5jbG9zZSgpOworCX0KKworLy8JLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisvLwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorLy8JcHVibGljIHZvaWQgY29uc3RydWN0b3I0KCkgdGhyb3dzIEV4Y2VwdGlvbgorLy8JeworLy8JCS8vIG51bGwgaG9zdAorLy8JCW5ldyBUY3BDb25uZWN0aW9uKCBudWxsLCAidGNwOi8vMC4wLjAuMDoxIiwgbnVsbCApOworLy8JfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjVhKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbm8gcG9ydAorCQluZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovL2xvY2FsaG9zdCIsIG51bGwgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNWIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB6ZXJvIHBvcnQKKwkJbmV3IFRjcENvbm5lY3Rpb24oIG51bGwsICJ0Y3A6Ly9sb2NhbGhvc3Q6MCIsIG51bGwgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRvbyBiaWcgcG9ydAorCQluZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovL2xvY2FsaG9zdDo2NTUzNiIsIG51bGwgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5lZ2F0aXZlIHJlY29ubmVjdCBkZWxheQorCQluZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovL2xvY2FsaG9zdDoxP1RjcFRyYW5zcG9ydC5yZWNvbm5lY3REZWxheT0tMSIsIG51bGwgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRjcFRyYW5zcG9ydCBjID0gbmV3IFRjcENvbm5lY3Rpb24oIG51bGwsICJ0Y3A6Ly9sb2NhbGhvc3Q6Iitwb3J0LCBudWxsICk7CisJCWFzc2VydE51bGwoIGMuZ2V0U2Vzc2lvbigpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTZXNzaW9uRGF0YSBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCVRjcFRyYW5zcG9ydCBjID0gbmV3IFRjcENvbm5lY3Rpb24oIG51bGwsICJ0Y3A6Ly9sb2NhbGhvc3Q6Iitwb3J0LCBudWxsICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKwkJYXNzZXJ0U2FtZSggZGgsIGMuZ2V0U2Vzc2lvbigpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTb2NrZXQgcyA9IG5ldyBTb2NrZXQoICIxMjcuMC4wLjEiLCBwb3J0ICk7CisJCVNvY2tldCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKwkJCisJCU15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCQlUY3BUcmFuc3BvcnQgYyA9IG5ldyBUY3BDb25uZWN0aW9uKCBzLCAidGNwOiIsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCisJCWFzc2VydEZhbHNlKCBjLmlzU3RhcnRlZCgpICk7CisJCWMuc3RhcnQoKTsKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQkKKwkJYy53YWl0VXAoIFRJTUVPVVQgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQljLmZsdXNoKCk7CisJCWFzc2VydE5vdE51bGwoIGMucmVtb3RlQWRkcmVzcygpICk7CisJCWFzc2VydE5vdE51bGwoIGMubG9jYWxBZGRyZXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBjLnJlbW90ZUFkZHJlc3MoKSwgdC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSApOworCQlhc3NlcnRFcXVhbHMoIGMubG9jYWxBZGRyZXNzKCksIHQuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpICk7CisJCQorCQl0LmNsb3NlKCk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTb2NrZXQgcyA9IG5ldyBTb2NrZXQoICIxMjcuMC4wLjEiLCBwb3J0ICk7CisJCVNvY2tldCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKwkJCisJCU15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCQlUY3BUcmFuc3BvcnQgYyA9IG5ldyBUY3BDb25uZWN0aW9uKCBzLCAidGNwOiIsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0b3AoKTsKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCWMud2FpdERvd24oIFRJTUVPVVQgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN0YXJ0MygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNvY2tldCBzID0gbmV3IFNvY2tldCggIjEyNy4wLjAuMSIsIHBvcnQgKTsKKwkJU29ja2V0IHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCVRjcFRyYW5zcG9ydCBjID0gbmV3IFRjcENvbm5lY3Rpb24oIHMsICJ0Y3A6IiwgbnVsbCApOworCQljLnNldFNlc3Npb24oIGRoICk7CisJCQorCQlhc3NlcnRGYWxzZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0YXJ0KCk7CisJCWFzc2VydFRydWUoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCWMuY2xvc2UoKTsKKwkJCisJCWMud2FpdERvd24oIFRJTUVPVVQgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN0YXJ0NCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNvY2tldCBzID0gbmV3IFNvY2tldCggIjEyNy4wLjAuMSIsIHBvcnQgKTsKKwkJU29ja2V0IHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCVRjcFRyYW5zcG9ydCBjID0gbmV3IFRjcENvbm5lY3Rpb24oIHMsICJ0Y3A6IiwgbnVsbCApOworCQljLnNldFNlc3Npb24oIGRoICk7CisJCQorCQlhc3NlcnRGYWxzZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0YXJ0KCk7CisJCWFzc2VydFRydWUoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCWMuY2xvc2UoIGZhbHNlICk7CisJCQorCQljLndhaXREb3duKCBUSU1FT1VUICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQl0LmNsb3NlKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTb2NrZXQgcyA9IG5ldyBTb2NrZXQoICIxMjcuMC4wLjEiLCBwb3J0ICk7CisJCVNvY2tldCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKwkJCisJCU15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCQlUY3BUcmFuc3BvcnQgYyA9IG5ldyBUY3BDb25uZWN0aW9uKCBzLCAidGNwOiIsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLmNsb3NlKCB0cnVlICk7CisJCQorCQljLndhaXREb3duKCBUSU1FT1VUICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQl0LmNsb3NlKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJVGNwVHJhbnNwb3J0IGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovLzEyNy4wLjAuMToiK3BvcnQsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLndhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0b3AoKTsKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZXN0YXJ0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLS0gcmVzdGFydDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiApOworCQkKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCVRjcFRyYW5zcG9ydCBjID0gbmV3IFRjcENvbm5lY3Rpb24oIG51bGwsICJ0Y3A6Ly8xMjcuMC4wLjE6Iitwb3J0KyI/VGNwVHJhbnNwb3J0LnJlY29ubmVjdERlbGF5PTIwMCIsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYy5zdGFydCgpOworCQljLndhaXRVcCggVElNRU9VVCApOworCQkKKwkJaW50IG4gPSAxMDsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAoKytpIDw9IG4pCisJCXsKKwkJCVNvY2tldCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKworCQkJTG9nLnJlcG9ydCggImFjY2VwdGVkIiwgImkiLCBpLAorCQkJCSJ0LmxvY2FsIiwgdC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKKwkJCQkidC5yZW1vdGUiLCB0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSApOworCQkJCisJCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCQkKKwkJCWFzc2VydEVxdWFscyggdC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwgYy5yZW1vdGVBZGRyZXNzKCkgKTsKKwkJCWFzc2VydEVxdWFscyggdC5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCksIGMubG9jYWxBZGRyZXNzKCkgKTsKKwkJCQorCQkJdC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSggaSApOworCQkJYXNzZXJ0V2hhdCggV2hhdC5EQVRBLCBkaC53aGF0ICk7CisJCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCQlhc3NlcnROb3ROdWxsKCBkaC54YnVmICk7CisJCQlhc3NlcnRFcXVhbHMoIDEsIGRoLnhidWYubGVuZ3RoICk7CisJCQlhc3NlcnRFcXVhbHMoIChieXRlKSBpLCBkaC54YnVmWzBdICk7CisKKwkJCXQuc2h1dGRvd25PdXRwdXQoKTsKKwkJCXQuY2xvc2UoKTsKKwkJCXQgPSBudWxsOworCQkJCisJCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJfQorCQkKKwkJVGhyZWFkIHQxID0gbmV3IE1vbml0b3JIYXJ2ZXN0ZXI8U29ja2V0PiggbGguYWNjZXB0ZWQgKTsKKwkJdDEuc3RhcnQoKTsKKwkJVGhyZWFkIHQyID0gbmV3IE1vbml0b3JIYXJ2ZXN0ZXI8V2hhdD4oIGRoLndoYXQgKTsKKwkJdDIuc3RhcnQoKTsKKworCQlMb2cucmVwb3J0KCAic3RvcHBpbmciICk7CisJCWMuc3RvcCgpOworCQljLndhaXREb3duKCBUSU1FT1VUICk7CisJCUxvZy5yZXBvcnQoICJzdG9wcHBlZCIgKTsKKwkJCisJCXQxLmpvaW4oKTsKKwkJdDIuam9pbigpOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gPFQ+CisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBNb25pdG9ySGFydmVzdGVyPFQ+IGV4dGVuZHMgVGhyZWFkCisJeworCQkvKioKKwkJICogQHBhcmFtIG1vbgorCQkgKi8KKwkJcHVibGljIE1vbml0b3JIYXJ2ZXN0ZXIoIE1vbml0b3I8VD4gbW9uICkKKwkJeworCQkJdGhpcy5tb24gPSBtb247CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgTW9uaXRvcjxUPiBtb247CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpCisJCXsKKwkJCXRyeQorCQkJeworCQkJCU9iamVjdCB0OworCQkJCXdoaWxlICgodCA9IG1vbi53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApKSAhPSBudWxsKQorCQkJCQlMb2cucmVwb3J0KCAiaGFydmVzdGVkIiwgIm1vbiIsIG1vbiwgInQiLCB0ICk7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlc3RhcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLnJlcG9ydCggIi0tLSByZXN0YXJ0MiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICk7CisJCQorCQlNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJVGNwVHJhbnNwb3J0IGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovLzEyNy4wLjAuMToiK3BvcnQrIj9UY3BUcmFuc3BvcnQucmVjb25uZWN0RGVsYXk9MjAwIiwgbnVsbCApOworCQljLnNldFNlc3Npb24oIGRoICk7CisJCQorCQljLnN0YXJ0KCk7CisJCWMud2FpdFVwKCBUSU1FT1VUICk7CisJCQorCQlpbnQgbiA9IDEwOworCQlpbnQgaSA9IDA7CisJCXdoaWxlICgrK2kgPD0gbikKKwkJeworLy8JCQlMb2cucmVwb3J0KCAiLS0tIHdhaXRBY2NlcHRlZCIgKTsKKwkJCVNvY2tldCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKworCQkJTG9nLnJlcG9ydCggImFjY2VwdGVkIiwgImkiLCBpLAorCQkJCSJ0LmxvY2FsIiwgdC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKKwkJCQkidC5yZW1vdGUiLCB0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSApOworCQkJCisJCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisvLwkJCUxvZy5yZXBvcnQoICJ1cCIsICJjLmxvY2FsIiwgYy5sb2NhbEFkZHJlc3MoKSwgImMucmVtb3RlIiwgYy5yZW1vdGVBZGRyZXNzKCkgKTsKKwkJCQorCQkJYXNzZXJ0RXF1YWxzKCB0LmdldExvY2FsU29ja2V0QWRkcmVzcygpLCBjLnJlbW90ZUFkZHJlc3MoKSApOworCQkJYXNzZXJ0RXF1YWxzKCB0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSwgYy5sb2NhbEFkZHJlc3MoKSApOworCQkJCisJCQl0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKCBpICk7CisJCQlhc3NlcnRXaGF0KCBXaGF0LkRBVEEsIGRoLndoYXQgKTsKKwkJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJCWFzc2VydE5vdE51bGwoIGRoLnhidWYgKTsKKwkJCWFzc2VydEVxdWFscyggMSwgZGgueGJ1Zi5sZW5ndGggKTsKKwkJCWFzc2VydEVxdWFscyggKGJ5dGUpIGksIGRoLnhidWZbMF0gKTsKKworLy8JCQlMb2cucmVwb3J0KCAiYy5zaHV0aW5nRG93bk91dHB1dCIgKTsKKwkJCWMuc2h1dGRvd25PdXRwdXQoKTsKKy8vCQkJTG9nLnJlcG9ydCggImMuc2h1dGRvd25PdXRwdXQiICk7CisJCQkKKy8vCQkJTG9nLnJlcG9ydCggInQucmVhZGluZyIgKTsKKwkJCWFzc2VydEVxdWFscyggLTEsIHQuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKCkgKTsKKy8vCQkJTG9nLnJlcG9ydCggInQuZW9mIiApOworCQkJCisJCQl0LnNodXRkb3duT3V0cHV0KCk7CisJCQl0LmNsb3NlKCk7CisJCQl0ID0gbnVsbDsKKwkJCQorCQkJYXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisvLwkJCUxvZy5yZXBvcnQoICJkb3duIiApOworCQl9CisJCQorCQlUaHJlYWQgdDEgPSBuZXcgTW9uaXRvckhhcnZlc3RlcjxTb2NrZXQ+KCBsaC5hY2NlcHRlZCApOworCQl0MS5zdGFydCgpOworCQlUaHJlYWQgdDIgPSBuZXcgTW9uaXRvckhhcnZlc3RlcjxXaGF0PiggZGgud2hhdCApOworCQl0Mi5zdGFydCgpOworCQkKKwkJTG9nLnJlcG9ydCggInN0b3BwaW5nIiApOworCQljLnN0b3AoKTsKKwkJYy53YWl0RG93biggVElNRU9VVCApOworCQlMb2cucmVwb3J0KCAic3RvcHBlZCIgKTsKKwkJCisJCXQxLmpvaW4oKTsKKwkJdDIuam9pbigpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZGF0YTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJVGNwVHJhbnNwb3J0IGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovLzEyNy4wLjAuMToiK3BvcnQsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLndhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJdC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSggMjMgKTsKKwkJdC5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5EQVRBLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0Tm90TnVsbCggZGgueGJ1ZiApOworCQlhc3NlcnRFcXVhbHMoIDEsIGRoLnhidWYubGVuZ3RoICk7CisJCWFzc2VydEVxdWFscyggKGJ5dGUpIDIzLCBkaC54YnVmWzBdICk7CisJCQorCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCWMuc3RvcCgpOworCQlhc3NlcnRGYWxzZSggYy5pc1N0YXJ0ZWQoKSApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJdC5jbG9zZSgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZGF0YTIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJVGNwVHJhbnNwb3J0IGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovLzEyNy4wLjAuMToiK3BvcnQsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlTb2NrZXQgdCA9IGxoLmFjY2VwdGVkLndhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJYnl0ZVtdIGJ1ZiA9IHsgMjEsIDIyLCAyMyB9OworCQkKKwkJdC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSggYnVmICk7CisJCXQuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuREFUQSwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE5vdE51bGwoIGRoLnhidWYgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBkaC54YnVmLmxlbmd0aCApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAyMSwgZGgueGJ1ZlswXSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAyMiwgZGgueGJ1ZlsxXSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAyMywgZGgueGJ1ZlsyXSApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0b3AoKTsKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRhdGEzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCVRjcFRyYW5zcG9ydCBjID0gbmV3IFRjcENvbm5lY3Rpb24oIG51bGwsICJ0Y3A6Ly8xMjcuMC4wLjE6Iitwb3J0LCBudWxsICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKwkJCisJCWFzc2VydEZhbHNlKCBjLmlzU3RhcnRlZCgpICk7CisJCWMuc3RhcnQoKTsKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQkKKwkJU29ja2V0IHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuc2h1dGRvd25PdXRwdXQoKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwkJYy5jbG9zZSgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZGF0YTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJVGNwVHJhbnNwb3J0IGMgPSBuZXcgVGNwQ29ubmVjdGlvbiggbnVsbCwgInRjcDovLzEyNy4wLjAuMToiK3BvcnQsIG51bGwgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCisJCWMuc3RhcnQoKTsKKwkJCisJCVNvY2tldCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQljLnRyYW5zcG9ydERhdGEoIG51bGwsIG5ldyBGbGV4QnVmZmVyKCBuZXcgYnl0ZVtdIHsgMjEsIDIyLCAyMyB9ICkgKTsKKwkJYy5mbHVzaCgpOworCQkKKwkJSW5wdXRTdHJlYW0gaXMgPSB0LmdldElucHV0U3RyZWFtKCk7CisJCWFzc2VydEVxdWFscyggMjEsIGlzLnJlYWQoKSApOworCQlhc3NlcnRFcXVhbHMoIDIyLCBpcy5yZWFkKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMywgaXMucmVhZCgpICk7CisJCQorCQljLnNodXRkb3duT3V0cHV0KCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIC0xLCBpcy5yZWFkKCkgKTsKKwkJCisJCWMuY2xvc2UoKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFzc2VydFdoYXQoIFdoYXQgd2hhdCwgTW9uaXRvcjxXaGF0PiBtb24gKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQltb24ud2FpdFVudGlsRXFBbmRTZXQoIHdoYXQsIFRJTUVPVVQsIG51bGwgKTsKKwl9CisJCisJLyoqCisJICogVGVzdCBldmVudHMuCisJICovCisJZW51bSBXaGF0CisJeworCQkvKiogY29ubmVjdGlvbiBpcyB1cCAqLworCQlVUCwKKwkJLyoqIGNvbm5lY3Rpb24gaXMgZG93biAqLworCQlET1dOLAorCQkvKiogY29ubmVjdGlvbiByZWFkIHNvbWUgZGF0YSAqLworCQlEQVRBCisJfQorCisJLyoqCisJICogTGlzdGVuZXJIYW5kbGVyIGZvciB0ZXN0aW5nLgorCSAqLworCXN0YXRpYyBjbGFzcyBNeUxpc3RlbmVyIGltcGxlbWVudHMgU2Vzc2lvbkxpc3RlbmVyPFNvY2tldD4KKwl7CisJCS8qKiBtb25pdG9yIHRvIHJlcG9ydCBhY2NlcHRlZCBzb2NrZXQgKi8KKwkJcHVibGljIE1vbml0b3I8U29ja2V0PiBhY2NlcHRlZCA9IG5ldyBNb25pdG9yPFNvY2tldD4oICJhY2NlcHRlZCIgKTsKKwkJCisJCXB1YmxpYyB2b2lkIHNlc3Npb25BY2NlcHRlZCggU29ja2V0IHMgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKy8vCQkJTG9nLnJlcG9ydCggImxpc3RlbmVyLmFjY2VwdGVkIiwKKy8vCQkJCSJzLmxvY2FsIiwgcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwKKy8vCQkJCSJzLnJlbW90ZSIsIHMuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpICk7CisJCQkKKwkJCWFjY2VwdGVkLndhaXRVbnRpbEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBzICk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkKKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBxdWVyeSAiK3F1ZXJ5ICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gY29udHJvbCAiK2NvbnRyb2wgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApCisJCXsKKwkJCWlmIChldmVudCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKKwkJCQlMb2cucmVwb3J0KCAibGlzdGVuZXIubm90aWZ5IiwgImV2ZW50IiwgZXZlbnQgKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBEYXRhSGFuZGxlciBmb3IgdGVzdGluZy4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgTXlEYXRhSGFuZGxlciBpbXBsZW1lbnRzIFNlc3Npb25EYXRhCisJeworCQkvKiogaG9sZHMgZXZlbnQgdHlwZSAqLworCQlwdWJsaWMgTW9uaXRvcjxXaGF0PiB3aGF0ID0gbmV3IE1vbml0b3I8V2hhdD4oICJ3aGF0IiApOworCisJCS8qKiBzZW5kZXIgb2YgdGhlIGV2ZW50IGlmIERBVEEgKi8KKwkJcHVibGljIFdobyB4c2VuZGVyOworCisJCS8qKiBkYXRhIG9mIHRoZSBldmVudCBpZiBEQVRBICovCisJCXB1YmxpYyBieXRlW10geGJ1ZjsKKwkJCisJCXB1YmxpYyB2b2lkIHNlc3Npb25EYXRhKCBXaG8gc2VuZGVyLCBGbGV4QnVmZmVyIGJ1ZiApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJeHNlbmRlciA9IHNlbmRlcjsKKwkJCXhidWYgPSBidWYuZ2V0QXZhaWxCeXRlcygpOworCQkJd2hhdC53YWl0VW50aWxFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgV2hhdC5EQVRBICk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIHF1ZXJ5ICIrcXVlcnkgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Db250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKy8vCQkJTG9nLnJlcG9ydCggImRhdGEubm90aWZ5IiwgImV2ZW50IiwgZXZlbnQgKTsKKwkJCQorCQkJaWYgKGV2ZW50LmVxdWFscyggU2Vzc2lvbi5VUCApKQorCQkJeworCQkJCXhidWYgPSBudWxsOworCQkJCXdoYXQud2FpdFVudGlsRXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIFdoYXQuVVAgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCWlmIChldmVudC5lcXVhbHMoIFNlc3Npb24uRE9XTiApKQorCQkJeworCQkJCXhidWYgPSBudWxsOworCQkJCXdoYXQud2FpdFVudGlsRXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIFdoYXQuRE9XTiApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJTG9nLnJlcG9ydCggImRhdGEubm90aWZ5IiwgImV2ZW50IiwgZXZlbnQgKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rlc3RUY3BMaXN0ZW5lci5qYXZhIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGVzdFRjcExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmMzkzYQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rlc3RUY3BMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDA4IEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdHMgTGlzdGVuZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VGNwTGlzdGVuZXIKK3sKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVElNRU9VVCA9IDQwMDA7CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5lZ2F0aXZlIHBvcnQKKwkJbmV3IFRjcExpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDotMSIsIG51bGwgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIHRvbyBwb3NpdGl2ZSBwb3J0CisJCW5ldyBUY3BMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6NjU1MzYiLCBudWxsICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBuZWdhdGl2ZSBiYWNrbG9nCisJCW5ldyBUY3BMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6MD9UY3BMaXN0ZW5lci5iYWNrbG9nPS0xIiwgbnVsbCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3I2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlMaXN0ZW5lckhhbmRsZXIgbGggPSBuZXcgTXlMaXN0ZW5lckhhbmRsZXIoKTsKKworCQlUY3BMaXN0ZW5lciBsID0gbmV3IFRjcExpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDowIiwgbnVsbCApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisJCQorCQlhc3NlcnRTYW1lKCBsaCwgbC5nZXRTZXNzaW9uKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNldEhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeUxpc3RlbmVySGFuZGxlciBsaCA9IG5ldyBNeUxpc3RlbmVySGFuZGxlcigpOworCisJCVRjcExpc3RlbmVyIGwgPSBuZXcgVGNwTGlzdGVuZXIoICJ0Y3A6Ly8wLjAuMC4wOjAiLCBudWxsICk7CisJCWFzc2VydE51bGwoIGwuZ2V0U2Vzc2lvbigpICk7CisKKwkJbC5zZXRTZXNzaW9uKCBsaCApOworCQlhc3NlcnRTYW1lKCBsaCwgbC5nZXRTZXNzaW9uKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHN0b3AxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVGNwTGlzdGVuZXIgbCA9IG5ldyBUY3BMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6MCIsIG51bGwgKTsKKwkJbC5zdG9wKCk7IC8vIGlsbGVnYWwgc3RhdGU6IG5vdCBzdGFydGVkLgorCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlMaXN0ZW5lckhhbmRsZXIgbGggPSBuZXcgTXlMaXN0ZW5lckhhbmRsZXIoKTsKKwkJCisJCVRjcExpc3RlbmVyIGwgPSBuZXcgVGNwTGlzdGVuZXIoICJ0Y3A6Ly8wLjAuMC4wOjAiLCBudWxsICk7CisJCWwuc2V0U2Vzc2lvbiggbGggKTsKKwkJCisJCWFzc2VydFdoYXQoIG51bGwsIGxoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggbGgueHNvY2tldCApOworCisJCWwuc3RhcnQoKTsKKwkJbC53YWl0VXAoIFRJTUVPVVQgKTsKKworCQlhc3NlcnRUcnVlKCBsLmlzU3RhcnRlZCgpICk7CisKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJSW5ldFNvY2tldEFkZHJlc3MgYSA9IChJbmV0U29ja2V0QWRkcmVzcykgbC5sb2NhbEFkZHJlc3MoKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMC4wLjAuMCIsIGEuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkudG9TdHJpbmcoKSApOworCQlhc3NlcnRUcnVlKCBhLmdldFBvcnQoKSA+IDAgJiYgYS5nZXRQb3J0KCkgPCA2NTUzNiApOworCisJCWwuc3RvcCgpOworCQlsLndhaXREb3duKCBUSU1FT1VUICk7CisKKwkJYXNzZXJ0RmFsc2UoIGwuaXNTdGFydGVkKCkgKTsKKworCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGxoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggbGgueHNvY2tldCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlMaXN0ZW5lckhhbmRsZXIgbGggPSBuZXcgTXlMaXN0ZW5lckhhbmRsZXIoKTsKKwkJVGNwTGlzdGVuZXIgbCA9IG5ldyBUY3BMaXN0ZW5lciggInRjcDovLzEyNy4wLjAuMTowIiwgbnVsbCApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisJCQorCQlhc3NlcnRXaGF0KCBudWxsLCBsaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGxoLnhzb2NrZXQgKTsKKworCQlsLnN0YXJ0KCk7CisJCWwud2FpdFVwKCBUSU1FT1VUICk7CisKKwkJYXNzZXJ0VHJ1ZSggbC5pc1N0YXJ0ZWQoKSApOworCisJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGxoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggbGgueHNvY2tldCApOworCisJCUluZXRTb2NrZXRBZGRyZXNzIGEgPSAoSW5ldFNvY2tldEFkZHJlc3MpIGwubG9jYWxBZGRyZXNzKCk7CisJCWFzc2VydEVxdWFscyggIjEyNy4wLjAuMSIsIGEuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkudG9TdHJpbmcoKSApOworCQlhc3NlcnRUcnVlKCBhLmdldFBvcnQoKSA+IDAgJiYgYS5nZXRQb3J0KCkgPCA2NTUzNiApOworCisJCWwuc3RvcCgpOworCQlsLndhaXREb3duKCBUSU1FT1VUICk7CisJCWFzc2VydEZhbHNlKCBsLmlzU3RhcnRlZCgpICk7CisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeUxpc3RlbmVySGFuZGxlciBsaCA9IG5ldyBNeUxpc3RlbmVySGFuZGxlcigpOworCQlUY3BMaXN0ZW5lciBsID0gbmV3IFRjcExpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDo0MDA5IiwgbnVsbCApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisKKwkJYXNzZXJ0V2hhdCggbnVsbCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJbC5zdGFydCgpOworCQlsLndhaXRVcCggVElNRU9VVCApOworCQlhc3NlcnRUcnVlKCBsLmlzU3RhcnRlZCgpICk7CisKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJSW5ldFNvY2tldEFkZHJlc3MgYSA9IChJbmV0U29ja2V0QWRkcmVzcykgbC5sb2NhbEFkZHJlc3MoKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMC4wLjAuMCIsIGEuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkudG9TdHJpbmcoKSApOworCQlhc3NlcnRFcXVhbHMoIDQwMDksIGEuZ2V0UG9ydCgpICk7CisKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKworCQlhc3NlcnRGYWxzZSggbC5pc1N0YXJ0ZWQoKSApOworCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeUxpc3RlbmVySGFuZGxlciBsaCA9IG5ldyBNeUxpc3RlbmVySGFuZGxlcigpOworCQlUY3BMaXN0ZW5lciBsID0gbmV3IFRjcExpc3RlbmVyKCAidGNwOi8vMTI3LjAuMC4xOjQwMDYiLCBudWxsICk7CisJCWwuc2V0U2Vzc2lvbiggbGggKTsKKworCQlhc3NlcnRXaGF0KCBudWxsLCBsaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGxoLnhzb2NrZXQgKTsKKworCQlsLnN0YXJ0KCk7CisJCWwud2FpdFVwKCBUSU1FT1VUICk7CisKKwkJYXNzZXJ0VHJ1ZSggbC5pc1N0YXJ0ZWQoKSApOworCisJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGxoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggbGgueHNvY2tldCApOworCisJCUluZXRTb2NrZXRBZGRyZXNzIGEgPSAoSW5ldFNvY2tldEFkZHJlc3MpIGwubG9jYWxBZGRyZXNzKCk7CisJCWFzc2VydEVxdWFscyggIjEyNy4wLjAuMSIsIGEuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkudG9TdHJpbmcoKSApOworCQlhc3NlcnRFcXVhbHMoIDQwMDYsIGEuZ2V0UG9ydCgpICk7CisKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKworCQlhc3NlcnRGYWxzZSggbC5pc1N0YXJ0ZWQoKSApOworCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gVGltZW91dEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgc3RhcnQ1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlMaXN0ZW5lckhhbmRsZXIgbGggPSBuZXcgTXlMaXN0ZW5lckhhbmRsZXIoKTsKKwkJVGNwTGlzdGVuZXIgbCA9IG5ldyBUY3BMaXN0ZW5lciggInRjcDovLzEuMi4zLjQuNTo0MDA3IiwgbnVsbCApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisKKwkJYXNzZXJ0V2hhdCggbnVsbCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJbC5zdGFydCgpOworCQlsLndhaXRVcCggVElNRU9VVCApOworCisJCWFzc2VydFRydWUoIGwuaXNTdGFydGVkKCkgKTsKKworCQkvLyB0aGlzIHdpbGwgdGltZW91dCBiZWNhdXNlIG9mIGJhZCBsaXN0ZW5pbmcgYWRkcmVzcy4KKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFjY2VwdDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeUxpc3RlbmVySGFuZGxlciBsaCA9IG5ldyBNeUxpc3RlbmVySGFuZGxlcigpOworCQlUY3BMaXN0ZW5lciBsID0gbmV3IFRjcExpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDo0MDA4IiwgbnVsbCApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisKKwkJbC5zdGFydCgpOworCQlsLndhaXRVcCggVElNRU9VVCApOworCisJCVNvY2tldCBzID0gbmV3IFNvY2tldCggIjEyNy4wLjAuMSIsIDQwMDggKTsKKwkJYXNzZXJ0V2hhdCggV2hhdC5BQ0NFUFRFRCwgbGgud2hhdCApOworCQlhc3NlcnROb3ROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJLy8gdmVyaWZ5IHRoZXkgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyCisKKwkJYXNzZXJ0RXF1YWxzKCBzLmdldExvY2FsU29ja2V0QWRkcmVzcygpLCBsaC54c29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSApOworCQlhc3NlcnRFcXVhbHMoIHMuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpLCBsaC54c29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpICk7CisKKwkJLy8gdmVyaWZ5IHRoZXkgY2FuIHRhbGsgdG8gZWFjaCBvdGhlcgorCisJCXMuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoIDIzICk7CisJCXMuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMywgbGgueHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoKSApOworCisJCWxoLnhzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoIDIzICk7CisJCWxoLnhzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMywgcy5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoKSApOworCisJCS8vIHNodXQgJ2VtIGRvd24uCisKKwkJcy5jbG9zZSgpOworCQlsaC54c29ja2V0LmNsb3NlKCk7CisKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFjY2VwdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeU90aGVyTGlzdGVuZXJIYW5kbGVyIGxoID0gbmV3IE15T3RoZXJMaXN0ZW5lckhhbmRsZXIoKTsKKwkJVGNwTGlzdGVuZXIgbCA9IG5ldyBUY3BMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6MD9UY3BMaXN0ZW5lci5iYWNrbG9nPTEwMCIsIG51bGwgKTsKKwkJbC5zZXRTZXNzaW9uKCBsaCApOworCisJCWwuc3RhcnQoKTsKKwkJbC53YWl0VXAoIFRJTUVPVVQgKTsKKworCQlpbnQgcG9ydCA9ICgoSW5ldFNvY2tldEFkZHJlc3MpIGwubG9jYWxBZGRyZXNzKCkpLmdldFBvcnQoKTsKKworCQlpbnQgbiA9IDEwMDA7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQluZXcgU29ja2V0KCAiMTI3LjAuMC4xIiwgcG9ydCApLmNsb3NlKCk7CisKKwkJLy8gd2FpdCBmb3IgdGhpbmdzIHRvIHNldHRsZSBkb3duLi4uCisJCVRocmVhZC5zbGVlcCggMTAwICk7CisKKwkJYXNzZXJ0RXF1YWxzKCBuLCBsaC5hY2NlcHRlZCApOworCisJCWwuc3RvcCgpOworCQlsLndhaXREb3duKCBUSU1FT1VUICk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFzc2VydFdoYXQoIFdoYXQgd2hhdCwgTW9uaXRvcjxXaGF0PiBtb24gKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQltb24ud2FpdFVudGlsRXFBbmRTZXQoIHdoYXQsIDQwMDAsIG51bGwgKTsKKwl9CisKKwkvKioKKwkgKiBFdmVudCB0eXBlcy4KKwkgKi8KKwllbnVtIFdoYXQKKwl7CisJCS8qKiB0aGUgZXZlbnQgc2VlbiB3YXMgQUNDRVBURUQgKi8KKwkJQUNDRVBURUQsCisJCS8qKiB0aGUgZXZlbnQgc2VlbiB3YXMgVVAgKi8KKwkJVVAsCisJCS8qKiB0aGUgZXZlbnQgc2VlbiB3YXMgRE9XTiAqLworCQlET1dOCisJfQorCisJLyoqCisJICogTGlzdGVuZXJIYW5kbGVyIGZvciB0ZXN0aW5nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlMaXN0ZW5lckhhbmRsZXIgaW1wbGVtZW50cyBTZXNzaW9uTGlzdGVuZXI8U29ja2V0PgorCXsKKwkJLyoqIHRoZSBldmVudCBzZWVuICovCisJCXB1YmxpYyBNb25pdG9yPFdoYXQ+IHdoYXQgPSBuZXcgTW9uaXRvcjxXaGF0PiggbnVsbCApOworCisJCS8qKiB0aGUgc29ja2V0IGFjY2VwdGVkIChpZiBhY2NlcHQpICovCisJCXB1YmxpYyBTb2NrZXQgeHNvY2tldDsKKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQWNjZXB0ZWQoIFNvY2tldCBzb2NrZXQgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXhzb2NrZXQgPSBzb2NrZXQ7CisJCQl3aGF0LnNldCggV2hhdC5BQ0NFUFRFRCApOworCQl9CisJCQorCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkKKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBxdWVyeSAiK3F1ZXJ5ICk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Db250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAidW5rbm93biBjb250cm9sICIrY29udHJvbCApOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKQorCQl7CisJCQlpZiAoZXZlbnQuZXF1YWxzKCBTZXNzaW9uLlVQICkpCisJCQl7CisJCQkJd2hhdC5zZXQoIFdoYXQuVVAgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCWlmIChldmVudC5lcXVhbHMoIFNlc3Npb24uRE9XTiApKQorCQkJeworCQkJCXdoYXQuc2V0KCBXaGF0LkRPV04gKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTXlMaXN0ZW5lckhhbmRsZXIgIiArIGV2ZW50KTsKKwkJfQorCX0KKworCS8qKgorCSAqIExpc3RlbmVySGFuZGxlciBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15T3RoZXJMaXN0ZW5lckhhbmRsZXIgaW1wbGVtZW50cyBTZXNzaW9uTGlzdGVuZXI8U29ja2V0PgorCXsKKwkJLyoqIGNvdW50IG9mIGFjY2VwdGVkIGNvbm5lY3Rpb25zLiAqLworCQlwdWJsaWMgaW50IGFjY2VwdGVkOworCisJCXB1YmxpYyB2b2lkIHNlc3Npb25BY2NlcHRlZCggU29ja2V0IHNvY2tldCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJYWNjZXB0ZWQrKzsKKwkJCXNvY2tldC5jbG9zZSgpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQkJdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJLy8gaWdub3JlCisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvaW8vVGVzdFVkcENvbm5lY3Rpb24uamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rlc3RVZHBDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4ODhjNQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL2lvL1Rlc3RVZHBDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5GbGV4QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuV2hvOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqIFRlc3QgVWRwQ29ubmVjdGlvbi4gKi8KK3B1YmxpYyBjbGFzcyBUZXN0VWRwQ29ubmVjdGlvbgoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBCZWZvcmUgQElnbm9yZQorCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhcGggPSBuZXcgTXlQYWNrZXRIYW5kbGVyKCk7CisJCWFjID0gbmV3IFVkcENvbm5lY3Rpb24oICJ1ZHA6Ly9sb2NhbGhvc3Q6NDAxMSIsIG51bGwgKTsKKwkJYWMuc2V0U2Vzc2lvbiggYXBoICk7CisJCWFjLnN0YXJ0KCk7CisJCWFjLndhaXRVcCggNDAwMCApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJhYyB1cCIgKTsKKwkJCisJCWJwaCA9IG5ldyBNeVBhY2tldEhhbmRsZXIoKTsKKwkJYmMgPSBuZXcgVWRwQ29ubmVjdGlvbiggInVkcDovL2xvY2FsaG9zdDo0MDEwIiwgbnVsbCApOworCQliYy5zZXRTZXNzaW9uKCBicGggKTsKKwkJYmMuc3RhcnQoKTsKKwkJYmMud2FpdFVwKCA0MDAwICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggImJjIHVwIiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAQWZ0ZXIgQElnbm9yZQorCXB1YmxpYyB2b2lkIGZpbmkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlhYy5jbG9zZSggZmFsc2UgKTsKKwkJYmMuY2xvc2UoIGZhbHNlICk7CisJfQorCQorCXByaXZhdGUgTXlQYWNrZXRIYW5kbGVyIGFwaDsKKwkKKwlwcml2YXRlIFVkcENvbm5lY3Rpb24gYWM7CisJCisJcHJpdmF0ZSBNeVBhY2tldEhhbmRsZXIgYnBoOworCQorCXByaXZhdGUgVWRwQ29ubmVjdGlvbiBiYzsKKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCBASWdub3JlCisJcHVibGljIHZvaWQgYmxhaCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCWFzc2VydEVxdWFscyggV2hhdC5VUCwgYXBoLndoYXQgKTsKKwkJYXNzZXJ0RXF1YWxzKCBXaGF0LlVQLCBicGgud2hhdCApOworCQlGbGV4QnVmZmVyIGJ1ZiA9IG5ldyBGbGV4QnVmZmVyKCk7CisJCWJ1Zi5wdXQoIDEgKTsKKwkJYnVmLnB1dCggMiApOworCQlidWYucHV0KCAzICk7CisJCWJ1Zi5wdXQoIDQgKTsKKwkJYnVmLnB1dCggNSApOworCQlidWYuc2V0SW5kZXgoIDAgKTsKKwkJYWMudHJhbnNwb3J0UGFja2V0KCBudWxsLCBidWYgKTsKKwkJVGhyZWFkLnNsZWVwKCA1MDAgKTsKKwkJYXNzZXJ0RXF1YWxzKCBXaGF0LlBBQ0tFVCwgYnBoLndoYXQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggYnBoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0Tm90U2FtZSggYnVmLCBicGgueGJ1ZiApOworCQlhc3NlcnRFcXVhbHMoIDAsIGJwaC54YnVmLmluZGV4KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCA1LCBicGgueGJ1Zi5sZW5ndGgoKSApOworCQlhc3NlcnRFcXVhbHMoIDEsIGJwaC54YnVmLmdldCgpICk7CisJCWFzc2VydEVxdWFscyggMiwgYnBoLnhidWYuZ2V0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBicGgueGJ1Zi5nZXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDQsIGJwaC54YnVmLmdldCgpICk7CisJCWFzc2VydEVxdWFscyggNSwgYnBoLnhidWYuZ2V0KCkgKTsKKwl9CisJCisJLyoqICovCisJcHVibGljIGVudW0gV2hhdAorCXsKKwkJLyoqICovIFVQLAorCQkvKiogKi8gUEFDS0VULAorCQkvKiogKi8gRE9XTgorCX0KKwkKKwkvKioKKwkgKiByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgdWRwIGNvbm5lY3Rpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15UGFja2V0SGFuZGxlciBpbXBsZW1lbnRzIFNlc3Npb25QYWNrZXQKKwl7CisJCS8qKiAqLworCQlwdWJsaWMgV2hhdCB3aGF0OworCQkvKiogKi8KKwkJcHVibGljIFdobyB4c2VuZGVyOworCQkvKiogKi8KKwkJcHVibGljIEZsZXhCdWZmZXIgeGJ1ZjsKKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uUGFja2V0KCBXaG8gc2VuZGVyLCBGbGV4QnVmZmVyIGJ1ZiApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJYXNzZXJ0RXF1YWxzKCBXaGF0LlVQLCB3aGF0ICk7CisJCQl3aGF0ID0gV2hhdC5QQUNLRVQ7CisJCQl4c2VuZGVyID0gc2VuZGVyOworCQkJeGJ1ZiA9IGJ1ZjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Db250cm9sKCBPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlICkKKwkJeworCQkJLy8gaWdub3JlLgorCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkKKwkJeworCQkJaWYgKGV2ZW50LmVxdWFscyggU2Vzc2lvbi5VUCApKQorCQkJeworCQkJCWFzc2VydE51bGwoIHdoYXQgKTsKKwkJCQl3aGF0ID0gV2hhdC5VUDsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCWlmIChldmVudC5lcXVhbHMoIFNlc3Npb24uRE9XTiApKQorCQkJeworCQkJCWFzc2VydFRydWUoIHdoYXQgPT0gV2hhdC5VUCB8fCB3aGF0ID09IFdoYXQuUEFDS0VUICk7CisJCQkJd2hhdCA9IFdoYXQuRE9XTjsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IHNlc3Npb25RdWVyeSggT2JqZWN0IHF1ZXJ5ICkKKwkJeworCQkJLy8gaWdub3JlLgorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vVGVzdEJ5dGVCdWZmZXJQb29sLmphdmEgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vVGVzdEJ5dGVCdWZmZXJQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzZWY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9UZXN0Qnl0ZUJ1ZmZlclBvb2wuamF2YQpAQCAtMCwwICsxLDI4NyBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUubmlvOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5uaW8uQnl0ZUJ1ZmZlclBvb2wuTm90aWZ5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKworCisvKiogVGVzdCBvZiBCeXRlQnVmZmVyUG9vbCAqLworcHVibGljIGNsYXNzIFRlc3RCeXRlQnVmZmVyUG9vbAoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGJ1ZmZlclNpemUgPD0gMAorCQluZXcgQnl0ZUJ1ZmZlclBvb2woIC0xLCAtMSwgLTEsIC0xLCAtMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0MigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGJ1ZmZlclNpemUgPD0gMAorCQluZXcgQnl0ZUJ1ZmZlclBvb2woIDAsIC0xLCAtMSwgLTEsIC0xICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gaGlzdG9yeUludGVydmFsIDwgMAorCQluZXcgQnl0ZUJ1ZmZlclBvb2woIDQwOTYsIC0xLCAtMSwgLTEsIC0xICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Q0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbWluIDwgMAorCQluZXcgQnl0ZUJ1ZmZlclBvb2woIDQwOTYsIC0xLCAtMSwgMCwgLTEgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBsaW1pdCA8IG1pbgorCQluZXcgQnl0ZUJ1ZmZlclBvb2woIDQwOTYsIDAsIC0xLCAwLCAtMSApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0NigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGxlbiA8IDAKKwkJbmV3IEJ5dGVCdWZmZXJQb29sKCA0MDk2LCAwLCAxMCwgMSwgLTEgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlCeXRlQnVmZmVyUG9vbCBwID0gbmV3IEJ5dGVCdWZmZXJQb29sKCAxLCAyLCAzLCA0LCA1ICk7CisJCWFzc2VydEVxdWFscyggMSwgcC5idWZmZXJTaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyLCBwLm1pbigpICk7CisJCWFzc2VydEVxdWFscyggMywgcC5saW1pdCgpICk7CisJCWFzc2VydEVxdWFscyggNCwgcC5pbnRlcnZhbCgpICk7CisJCWFzc2VydEVxdWFscyggNSwgcC5sZW5ndGgoKSApOworCQlwLnNodXRkb3duKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Q4KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQnl0ZUJ1ZmZlclBvb2wgcCA9IG5ldyBCeXRlQnVmZmVyUG9vbCggMTAxLCAxMDMsIDEwNSwgMTA3LCAxMDkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMDEsIHAuYnVmZmVyU2l6ZSgpICk7CisJCWFzc2VydEVxdWFscyggMTAzLCBwLm1pbigpICk7CisJCWFzc2VydEVxdWFscyggMTA1LCBwLmxpbWl0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMDcsIHAuaW50ZXJ2YWwoKSApOworCQlhc3NlcnRFcXVhbHMoIDEwOSwgcC5sZW5ndGgoKSApOworCQlwLnNodXRkb3duKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQnl0ZUJ1ZmZlclBvb2wgcCA9IG5ldyBCeXRlQnVmZmVyUG9vbCggMTAxLCAxMDMsIDEwNSwgMCwgMTA5ICk7CisJCWFzc2VydEVxdWFscyggMTAxLCBwLmJ1ZmZlclNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoIDEwMywgcC5taW4oKSApOworCQlhc3NlcnRFcXVhbHMoIDEwNSwgcC5saW1pdCgpICk7CisJCWFzc2VydEVxdWFscyggMCwgcC5pbnRlcnZhbCgpICk7CisJCWFzc2VydEVxdWFscyggMCwgcC5sZW5ndGgoKSApOworCQlwLnNodXRkb3duKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QxMCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUJ5dGVCdWZmZXJQb29sIHAgPSBuZXcgQnl0ZUJ1ZmZlclBvb2woIDEwMSwgMTAzLCAxMDUsIDEwNywgMCApOworCQlhc3NlcnRFcXVhbHMoIDEwMSwgcC5idWZmZXJTaXplKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMDMsIHAubWluKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMDUsIHAubGltaXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHAuaW50ZXJ2YWwoKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIHAubGVuZ3RoKCkgKTsKKwkJcC5zaHV0ZG93bigpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0MTEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlCeXRlQnVmZmVyUG9vbCBwID0gbmV3IEJ5dGVCdWZmZXJQb29sKCAxMDEsIDEwMywgMTA1LCAwLCAwICk7CisJCWFzc2VydEVxdWFscyggMTAxLCBwLmJ1ZmZlclNpemUoKSApOworCQlhc3NlcnRFcXVhbHMoIDEwMywgcC5taW4oKSApOworCQlhc3NlcnRFcXVhbHMoIDEwNSwgcC5saW1pdCgpICk7CisJCWFzc2VydEVxdWFscyggMCwgcC5pbnRlcnZhbCgpICk7CisJCWFzc2VydEVxdWFscyggMCwgcC5sZW5ndGgoKSApOworCQlwLnNodXRkb3duKCk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWxsb2MxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQnl0ZUJ1ZmZlclBvb2wgcCA9IG5ldyBCeXRlQnVmZmVyUG9vbCggNDA5NiwgMCwgMTAsIDAsIDAgKTsKKwkJQnl0ZUJ1ZmZlciBiID0gcC5hbGxvYyggbnVsbCApOworCQlhc3NlcnROb3ROdWxsKCBiICk7CisJCWFzc2VydEVxdWFscyggNDA5NiwgYi5saW1pdCgpICk7CisJCWFzc2VydEVxdWFscyggMSwgcC51c2VkKCkgKTsKKwkJcC5yZWxlYXNlKCBiICk7CisJCWFzc2VydEVxdWFscyggMCwgcC51c2VkKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhbGxvYzIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlCeXRlQnVmZmVyUG9vbCBwID0gbmV3IEJ5dGVCdWZmZXJQb29sKCAxMDI0LCAwLCAxMCwgMCwgMCApOworCQlCeXRlQnVmZmVyIGIgPSBwLmFsbG9jKCBudWxsICk7CisJCWFzc2VydE5vdE51bGwoIGIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMDI0LCBiLmxpbWl0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxLCBwLnVzZWQoKSApOworCQlwLnJlbGVhc2UoIGIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwLnVzZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFsbG9jMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUJ5dGVCdWZmZXJQb29sIHAgPSBuZXcgQnl0ZUJ1ZmZlclBvb2woIDQwOTYsIDAsIDEwLCAwLCAwICk7CisJCUJ5dGVCdWZmZXJbXSBiID0gcC5hbGxvYyggbnVsbCwgMiApOworCQlhc3NlcnROb3ROdWxsKCBiICk7CisJCWFzc2VydEVxdWFscyggMiwgYi5sZW5ndGggKTsKKwkJYXNzZXJ0Tm90TnVsbCggYlswXSApOworCQlhc3NlcnRFcXVhbHMoIDQwOTYsIGJbMF0ubGltaXQoKSApOworCQlhc3NlcnROb3ROdWxsKCBiWzFdICk7CisJCWFzc2VydEVxdWFscyggNDA5NiwgYlsxXS5saW1pdCgpICk7CisJCWFzc2VydEVxdWFscyggMiwgcC51c2VkKCkgKTsKKwkJcC5yZWxlYXNlKCBiICk7CisJCWFzc2VydEVxdWFscyggMCwgcC51c2VkKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFsbG9jNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG91dCBvZiBidWZmZXJzCisJCUJ5dGVCdWZmZXJQb29sIHAgPSBuZXcgQnl0ZUJ1ZmZlclBvb2woIDEwMjQsIDAsIDEsIDAsIDAgKTsKKwkJcC5hbGxvYyggbnVsbCApOworCQlwLmFsbG9jKCBudWxsICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWxsb2M1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gc2xvd2VyIGJlY2F1c2Ugb2Ygbm8gcG9vbGluZy4KKwkJQnl0ZUJ1ZmZlclBvb2wgcCA9IG5ldyBCeXRlQnVmZmVyUG9vbCggMTAyNCwgMCwgMSwgMCwgMCApOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKQorCQkJcC5yZWxlYXNlKCBwLmFsbG9jKCBudWxsICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwLnVzZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFsbG9jNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGZhc3RlciBiZWNhdXNlIG9mIHBvb2xpbmcuCisJCUJ5dGVCdWZmZXJQb29sIHAgPSBuZXcgQnl0ZUJ1ZmZlclBvb2woIDEwMjQsIDEsIDEsIDAsIDAgKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykKKwkJCXAucmVsZWFzZSggcC5hbGxvYyggbnVsbCApICk7CisJCWFzc2VydEVxdWFscyggMCwgcC51c2VkKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBub3RpZnkxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJQnl0ZUJ1ZmZlclBvb2wgcCA9IG5ldyBCeXRlQnVmZmVyUG9vbCggMTAyNCwgMSwgMSwgMCwgMCApOworCQlNeU5vdGlmeSBuMSA9IG5ldyBNeU5vdGlmeSgpOworCQlNeU5vdGlmeSBuMiA9IG5ldyBNeU5vdGlmeSgpOworCQkKKwkJQnl0ZUJ1ZmZlciBiMSA9IHAuYWxsb2MoIG4xICk7CisJCWFzc2VydE5vdE51bGwoIGIxICk7CisJCWFzc2VydEVxdWFscyggMSwgcC51c2VkKCkgKTsKKwkJVGhyZWFkLnNsZWVwKCAxNSApOworCQlhc3NlcnRGYWxzZSggbjEuYXZhaWxhYmxlICk7CisJCWFzc2VydEZhbHNlKCBuMi5hdmFpbGFibGUgKTsKKwkJCisJCUJ5dGVCdWZmZXIgYjIgPSBwLmFsbG9jKCBuMiApOworCQlhc3NlcnROdWxsKCBiMiApOworCQlhc3NlcnRFcXVhbHMoIDEsIHAudXNlZCgpICk7CisJCVRocmVhZC5zbGVlcCggMTUgKTsKKwkJYXNzZXJ0RmFsc2UoIG4xLmF2YWlsYWJsZSApOworCQlhc3NlcnRGYWxzZSggbjIuYXZhaWxhYmxlICk7CisJCQorCQkvLyB0aGUgYWxsb2Mgb2YgYjIgZmFpbGVkLCBidXQgbjIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdG8gYmUgbm90aWZpZWQKKwkJLy8gd2hlbiBhIGJsb2NrIGlzIGZyZWVkLiByZWxlYXNlIG9mIGIxIHNob3VsZCBub3RpZnkgbjIgb2YgYXZhaWxhYmlsaXR5CisJCQorCQlwLnJlbGVhc2UoIGIxICk7CisJCWIxID0gbnVsbDsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwLnVzZWQoKSApOworCQlUaHJlYWQuc2xlZXAoIDE1ICk7CisJCWFzc2VydEZhbHNlKCBuMS5hdmFpbGFibGUgKTsKKwkJYXNzZXJ0VHJ1ZSggbjIuYXZhaWxhYmxlICk7CisJCQorCQluMi5hdmFpbGFibGUgPSBmYWxzZTsKKwkJYjIgPSBwLmFsbG9jKCBuMiApOworCQlhc3NlcnROb3ROdWxsKCBiMiApOworCQlhc3NlcnRFcXVhbHMoIDEsIHAudXNlZCgpICk7CisJCVRocmVhZC5zbGVlcCggMTUgKTsKKwkJYXNzZXJ0RmFsc2UoIG4xLmF2YWlsYWJsZSApOworCQlhc3NlcnRGYWxzZSggbjIuYXZhaWxhYmxlICk7CisJCQorCQlwLnJlbGVhc2UoIGIyICk7CisJCWIyID0gbnVsbDsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBwLnVzZWQoKSApOworCQlUaHJlYWQuc2xlZXAoIDE1ICk7CisJCWFzc2VydEZhbHNlKCBuMS5hdmFpbGFibGUgKTsKKwkJYXNzZXJ0RmFsc2UoIG4yLmF2YWlsYWJsZSApOworCX0KKwkKKwkvKiogKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15Tm90aWZ5IGltcGxlbWVudHMgTm90aWZ5CisJeworCQkvKiogKi8KKwkJcHVibGljIGJvb2xlYW4gYXZhaWxhYmxlOworCQlwdWJsaWMgdm9pZCBidWZmZXJBdmFpbGFibGUoIEJ5dGVCdWZmZXJQb29sIHBvb2wgKQorCQl7CisJCQlhdmFpbGFibGUgPSB0cnVlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1Rlc3RIaXN0b3J5LmphdmEgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS9uaW8vVGVzdEhpc3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE3NGQwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1Rlc3RIaXN0b3J5LmphdmEKQEAgLTAsMCArMSw0MzkgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisKKy8qKiBUZXN0IG9mIEhpc3RvcnkgKi8KK3B1YmxpYyBjbGFzcyBUZXN0SGlzdG9yeQoreworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUhpc3RvcnkgaCA9IG5ldyBIaXN0b3J5KCAxLCAyLCAzICk7CisJCWFzc2VydEVxdWFscyggMSwgaC5taW4oKSApOworCQlhc3NlcnRFcXVhbHMoIDIsIGgubGltaXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDMsIGgubGVuZ3RoKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMTAyLCAxMTksIDcgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMDIsIGgubWluKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMTksIGgubGltaXQoKSApOworCQlhc3NlcnRFcXVhbHMoIDcsIGgubGVuZ3RoKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbWluIDwgMAorCQluZXcgSGlzdG9yeSggLTEsIDIsIDMgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3Q0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbGltaXQgPCBtaW4KKwkJbmV3IEhpc3RvcnkoIDAsIC0xLCAzICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0NSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGxlbiA8IDAKKwkJbmV3IEhpc3RvcnkoIDAsIDAsIC0xICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXNlZDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAxICkgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDEsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAtMSApICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXNlZDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAyICkgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDIsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAtMiApICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXNlZDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAxICkgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDEsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAxICkgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDIsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAtMSApICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAxLCAwICk7CisJCWFzc2VydFRydWUoIGgudXNlZCggLTEgKSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVzZWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCA1ICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJCS8vIHRyeSB0byBvdmVyZmxvdworCQlhc3NlcnRGYWxzZSggaC51c2VkKCAxMSApICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXNlZDUoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAxICkgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDEsIDAgKTsKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCA5ICkgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDEwLCAwICk7CisJCS8vIHRyeSB0byBvdmVyZmxvdworCQlhc3NlcnRGYWxzZSggaC51c2VkKCAxICkgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDEwLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgdXNlZDYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBuZXdVc2VkIDwgMAorCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDAgKTsKKwkJaC51c2VkKCAtMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHVzZWQ3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbmV3VXNlZCA8IDAKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCA1ICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJCWgudXNlZCggMSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMSwgMCApOworCQloLnVzZWQoIC0yICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdXNlZDgoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDAgKTsKKwkJaC51c2VkKCAxICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAxLCAwICk7CisJCXRyeQorCQl7CisJCQloLnVzZWQoIC0yICk7CisJCQlmYWlsKCAibmV2ZXIgcmVhY2hlZCIgKTsKKwkJfQorCQljYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKKwkJeworCQkJLy8gbWFrZSBzdXJlIHVzZWQgd2FzIG5vdCBhZGp1c3RlZC4uLgorCQkJY2hlY2tVc2VkQWxsb2MoIGgsIDEsIDAgKTsKKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHVzZWQ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gayA9PSAwCisJCUhpc3RvcnkgaCA9IG5ldyBIaXN0b3J5KCAwLCAxMCwgNSApOworCQloLnVzZWQoIDAgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhbGxvYzEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDAgKTsKKwkJaC5hbGxvYyggMSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMSApOworCQloLmFsbG9jKCAtMSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFsbG9jMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUhpc3RvcnkgaCA9IG5ldyBIaXN0b3J5KCAwLCAxMCwgNSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMCApOworCQloLmFsbG9jKCAyICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAyICk7CisJCWguYWxsb2MoIC0yICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWxsb2MzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCA1ICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJCWguYWxsb2MoIDEgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDEgKTsKKwkJaC5hbGxvYyggMSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMiApOworCQloLmFsbG9jKCAtMSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMSApOworCQloLmFsbG9jKCAtMSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMCApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFsbG9jNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5ld0FsbG9jID4gbGltaXQKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCA1ICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJCS8vIHRyeSB0byBvdmVyZmxvdworCQloLmFsbG9jKCAxMSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGFsbG9jNSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5ld0FsbG9jID4gbGltaXQKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCA1ICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJCWguYWxsb2MoIDEgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDEgKTsKKwkJaC5hbGxvYyggOSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMTAgKTsKKwkJLy8gdHJ5IHRvIG92ZXJmbG93CisJCWguYWxsb2MoIDEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBhbGxvYzYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBuZXdBbGxvYyA8IDAKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCA1ICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJCS8vIHRyeSB0byB1bmRlcmZsb3cKKwkJaC5hbGxvYyggLTEgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBhbGxvYzcoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBuZXdBbGxvYyA8IDAKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCA1ICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAwICk7CisJCWguYWxsb2MoIDEgKTsKKwkJY2hlY2tVc2VkQWxsb2MoIGgsIDAsIDEgKTsKKwkJLy8gdHJ5IHRvIHVuZGVyZmxvdworCQloLmFsbG9jKCAtMiApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFsbG9jOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUhpc3RvcnkgaCA9IG5ldyBIaXN0b3J5KCAwLCAxMCwgNSApOworCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMCApOworCQloLmFsbG9jKCAxICk7CisJCWNoZWNrVXNlZEFsbG9jKCBoLCAwLCAxICk7CisJCXRyeQorCQl7CisJCQkvLyB0cnkgdG8gdW5kZXJmbG93CisJCQloLmFsbG9jKCAtMiApOworCQkJZmFpbCggIm5ldmVyIHJlYWNoZWQiICk7CisJCX0KKwkJY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCisJCXsKKwkJCS8vIG1ha2Ugc3VyZSBhbGxvYyB3YXMgbm90IGFkanVzdGVkLi4uCisJCQljaGVja1VzZWRBbGxvYyggaCwgMCwgMSApOworCQl9CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgYWxsb2M5KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gayA9PSAwCisJCUhpc3RvcnkgaCA9IG5ldyBIaXN0b3J5KCAwLCAxMCwgNSApOworCQloLmFsbG9jKCAwICk7CisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3VnZ2VzdGVkMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUhpc3RvcnkgaCA9IG5ldyBIaXN0b3J5KCAwLCAxMCwgNSApOworCQlhc3NlcnRFcXVhbHMoIDAsIGguc3VnZ2VzdGVkKCkgKTsKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBoLnN1Z2dlc3RlZCgpICk7CisJCWguaW5pdCgpOworCQlhc3NlcnRFcXVhbHMoIDAsIGguc3VnZ2VzdGVkKCkgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWdnZXN0ZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDIsIDEwLCA1ICk7CisJCWFzc2VydEVxdWFscyggMiwgaC5zdWdnZXN0ZWQoKSApOworCQloLnRpY2tsZSgpOworCQlhc3NlcnRFcXVhbHMoIDIsIGguc3VnZ2VzdGVkKCkgKTsKKwkJaC5pbml0KCk7CisJCWFzc2VydEVxdWFscyggMiwgaC5zdWdnZXN0ZWQoKSApOworCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1Z2dlc3RlZDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlIaXN0b3J5IGggPSBuZXcgSGlzdG9yeSggMCwgMTAsIDUgKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBoLnN1Z2dlc3RlZCgpICk7CisJCQorCQlhc3NlcnRUcnVlKCBoLnVzZWQoIDEwICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMCwgaC5nZXRVc2VkKCkgKTsKKwkJCisJCWFzc2VydEVxdWFscyggMCwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMCwgMCwgMCwgMCwgMCkgPT0gMAorCQloLnRpY2tsZSgpOworCQlhc3NlcnRFcXVhbHMoIDIsIGguc3VnZ2VzdGVkKCkgKTsgLy8gYXZnKDEwLCAwLCAwLCAwLCAwKSA9PSAyCisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggNCwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMTAsIDEwLCAwLCAwLCAwKSA9PSA0CisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggNiwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMTAsIDEwLCAxMCwgMCwgMCkgPT0gNgorCQloLnRpY2tsZSgpOworCQlhc3NlcnRFcXVhbHMoIDgsIGguc3VnZ2VzdGVkKCkgKTsgLy8gYXZnKDEwLCAxMCwgMTAsIDEwLCAwKSA9PSA4CisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggMTAsIGguc3VnZ2VzdGVkKCkgKTsgLy8gYXZnKDEwLCAxMCwgMTAsIDEwLCAxMCkgPT0gMTAKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMCwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMTAsIDEwLCAxMCwgMTAsIDEwKSA9PSAxMAorCQkKKwkJYXNzZXJ0VHJ1ZSggaC51c2VkKCAtMTAgKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIGguZ2V0VXNlZCgpICk7CisJCQorCQloLnRpY2tsZSgpOworCQlhc3NlcnRFcXVhbHMoIDEwLCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygxMCwgMTAsIDEwLCAxMCwgMTApID09IDEwCisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggOCwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMCwgMTAsIDEwLCAxMCwgMTApID09IDgKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCA2LCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygwLCAwLCAxMCwgMTAsIDEwKSA9PSA2CisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggNCwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMCwgMCwgMCwgMTAsIDEwKSA9PSA0CisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggMiwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMCwgMCwgMCwgMCwgMTApID09IDIKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygwLCAwLCAwLCAwLCAwKSA9PSAwCisJfQorCQorCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3VnZ2VzdGVkNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUhpc3RvcnkgaCA9IG5ldyBIaXN0b3J5KCAyLCAxMCwgNSApOworCQlhc3NlcnRFcXVhbHMoIDIsIGguc3VnZ2VzdGVkKCkgKTsKKwkJCisJCWFzc2VydFRydWUoIGgudXNlZCggMTAgKSApOworCQlhc3NlcnRFcXVhbHMoIDEwLCBoLmdldFVzZWQoKSApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCAyLCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygyLCAyLCAyLCAyLCAyKSA9PSAyCisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggMywgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMTAsIDIsIDIsIDIsIDIpID09IDMKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCA1LCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygxMCwgMTAsIDIsIDIsIDIpID09IDUKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCA2LCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygxMCwgMTAsIDEwLCAyLCAyKSA9PSA2CisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggOCwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMTAsIDEwLCAxMCwgMTAsIDIpID09IDgKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCAxMCwgaC5zdWdnZXN0ZWQoKSApOyAvLyBhdmcoMTAsIDEwLCAxMCwgMTAsIDEwKSA9PSAxMAorCQloLnRpY2tsZSgpOworCQlhc3NlcnRFcXVhbHMoIDEwLCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygxMCwgMTAsIDEwLCAxMCwgMTApID09IDEwCisJCQorCQlhc3NlcnRUcnVlKCBoLnVzZWQoIC0xMCApICk7CisJCWFzc2VydEVxdWFscyggMCwgaC5nZXRVc2VkKCkgKTsKKwkJCisJCWgudGlja2xlKCk7CisJCWFzc2VydEVxdWFscyggMTAsIGguc3VnZ2VzdGVkKCkgKTsgLy8gYXZnKDEwLCAxMCwgMTAsIDEwLCAxMCkgPT0gMTAKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCA4LCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygyLCAxMCwgMTAsIDEwLCAxMCkgPT0gOAorCQloLnRpY2tsZSgpOworCQlhc3NlcnRFcXVhbHMoIDYsIGguc3VnZ2VzdGVkKCkgKTsgLy8gYXZnKDIsIDIsIDEwLCAxMCwgMTApID09IDYKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCA1LCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygyLCAyLCAyLCAxMCwgMTApID09IDUKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBoLnN1Z2dlc3RlZCgpICk7IC8vIGF2ZygyLCAyLCAyLCAyLCAxMCkgPT0gMworCQloLnRpY2tsZSgpOworCQlhc3NlcnRFcXVhbHMoIDIsIGguc3VnZ2VzdGVkKCkgKTsgLy8gYXZnKDIsIDIsIDIsIDIsIDIpID09IDIKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWdnZXN0ZWQ1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJSGlzdG9yeSBoID0gbmV3IEhpc3RvcnkoIDAsIDEwLCAwICk7CisJCWFzc2VydEVxdWFscyggMCwgaC5zdWdnZXN0ZWQoKSApOworCQlhc3NlcnRUcnVlKCBoLnVzZWQoIDUgKSApOworCQlhc3NlcnRFcXVhbHMoIDAsIGguc3VnZ2VzdGVkKCkgKTsKKwkJaC50aWNrbGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCAwLCBoLnN1Z2dlc3RlZCgpICk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja1VzZWRBbGxvYyggSGlzdG9yeSBoLCBpbnQgdSwgaW50IGEgKQorCXsKKwkJYXNzZXJ0RXF1YWxzKCB1LCBoLmdldFVzZWQoKSApOworCQlhc3NlcnRFcXVhbHMoIGEsIGguZ2V0QWxsb2MoKSApOworCX0KK30KZGlmZiAtLWdpdCBhL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9UZXN0VGNwMkNvbm5lY3Rpb24uamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9UZXN0VGNwMkNvbm5lY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTYxZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1Rlc3RUY3AyQ29ubmVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsODQyIEBACisvKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5uaW87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuRmxleEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuTW9uaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5XaG87CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUuaW8uU2Vzc2lvbkRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGVzdHMgVGNwMkNvbm5lY3Rpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VGNwMkNvbm5lY3Rpb24KK3sKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBNeUxpc3RlbmVyIGxoID0gbmV3IE15TGlzdGVuZXIoKTsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBUSU1FT1VUID0gNDAwMDsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdXBlclNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFN1cGVyU2VsZWN0b3IoKTsKKwlzdGF0aWMKKwl7CisJCXNlbGVjdG9yLnN0YXJ0KCk7CisJfQorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIEJ5dGVCdWZmZXJQb29sIHBvb2wgPSBuZXcgQnl0ZUJ1ZmZlclBvb2woMTAyNCwgMTAsIDEwMDAsIDAsIDAgKTsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZXMgciA9IG5ldyBSZXNvdXJjZXMoKTsKKwlzdGF0aWMKKwl7CisJCXIucHV0KCAiYnVmZmVyUG9vbCIsIHBvb2wgKTsKKwkJci5wdXQoICJzZWxlY3RvciIsIHNlbGVjdG9yICk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVGNwMkxpc3RlbmVyIGwgPSBuZXcgVGNwMkxpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDowIiwgciApOworCQorCXByaXZhdGUgc3RhdGljIGludCBwb3J0OworCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlsLnNldFNlc3Npb24oIGxoICk7CisJCQorCQkvLyBzdGFydCBsaXN0ZW5lcgorCQlsLnN0YXJ0KCk7CisJCWwud2FpdFVwKCBUSU1FT1VUICk7CisJCQorCQlwb3J0ID0gKChJbmV0U29ja2V0QWRkcmVzcykgbC5sb2NhbEFkZHJlc3MoKSkuZ2V0UG9ydCgpOworCQkKKwkJTG9nLmFkZFNpbmsoIG51bGwgKTsKKwkJTG9nLnJlcG9ydCggIlRlc3RUY3AyQ29ubmVjdGlvbiIgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBubyBob3N0IG9yIHBvcnQKKwkJbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOiIsIHIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVNvY2tldENoYW5uZWwgcyA9IG5ld1NvY2tldENoYW5uZWwoICIxMjcuMC4wLjEiLCBwb3J0ICk7CisJCVNvY2tldENoYW5uZWwgdCA9IGxoLmFjY2VwdGVkLndhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisJCQorCQlyLnB1dCggImNvbm5lY3Rpb24iLCBzICk7CisJCVRjcDJDb25uZWN0aW9uIGMgPSBuZXcgVGNwMkNvbm5lY3Rpb24oICJ0Y3A6IiwgciApOworCQlhc3NlcnROdWxsKCBjLmdldFNlc3Npb24oKSApOworCQkKKwkJcy5jbG9zZSgpOworCQl0LmNsb3NlKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU29ja2V0Q2hhbm5lbCBuZXdTb2NrZXRDaGFubmVsKCBTdHJpbmcgaG9zdCwgaW50IHBvcnQgKQorCQl0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCXJldHVybiBTb2NrZXRDaGFubmVsLm9wZW4oIG5ldyBJbmV0U29ja2V0QWRkcmVzcyggaG9zdCwgcG9ydCApICApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU2Vzc2lvbkRhdGEgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCQlTb2NrZXRDaGFubmVsIHMgPSBuZXdTb2NrZXRDaGFubmVsKCAiMTI3LjAuMC4xIiwgcG9ydCApOworCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisJCXIucHV0KCAiY29ubmVjdGlvbiIsIHMgKTsKKwkJVGNwMkNvbm5lY3Rpb24gYyA9IG5ldyBUY3AyQ29ubmVjdGlvbiggInRjcDoiLCByICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKwkJYXNzZXJ0U2FtZSggZGgsIGMuZ2V0U2Vzc2lvbigpICk7CisJCQorCQlzLmNsb3NlKCk7CisJCXQuY2xvc2UoKTsKKwl9CisKKy8vCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworLy8JQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKy8vCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNCgpIHRocm93cyBFeGNlcHRpb24KKy8vCXsKKy8vCQkvLyBudWxsIGhvc3QKKy8vCQluZXcgVGNwMkNvbm5lY3Rpb24oICJ0Y3A6Ly8wLjAuMC4wOjEiLCBudWxsICk7CisvLwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNWEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyBubyBwb3J0CisJCW5ldyBUY3AyQ29ubmVjdGlvbiggInRjcDovL2xvY2FsaG9zdCIsIHIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNWIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB6ZXJvIHBvcnQKKwkJbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOi8vbG9jYWxob3N0OjAiLCByICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjYoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB0b28gYmlnIHBvcnQKKwkJbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOi8vbG9jYWxob3N0OjY1NTM2IiwgciApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0KCBleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyApCisJcHVibGljIHZvaWQgY29uc3RydWN0b3I3KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbmVnYXRpdmUgcmVjb25uZWN0IGRlbGF5CisJCW5ldyBUY3AyQ29ubmVjdGlvbiggInRjcDovL2xvY2FsaG9zdDoxP1RjcFRyYW5zcG9ydC5yZWNvbm5lY3REZWxheT0tMSIsIHIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yOCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRjcDJDb25uZWN0aW9uIGMgPSBuZXcgVGNwMkNvbm5lY3Rpb24oICJ0Y3A6Ly9sb2NhbGhvc3Q6Iitwb3J0LCByICk7CisJCWFzc2VydE51bGwoIGMuZ2V0U2Vzc2lvbigpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjkoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTZXNzaW9uRGF0YSBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCVRjcDJDb25uZWN0aW9uIGMgPSBuZXcgVGNwMkNvbm5lY3Rpb24oICJ0Y3A6Ly9sb2NhbGhvc3Q6Iitwb3J0LCByICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKwkJYXNzZXJ0U2FtZSggZGgsIGMuZ2V0U2Vzc2lvbigpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDEoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTb2NrZXRDaGFubmVsIHMgPSBuZXdTb2NrZXRDaGFubmVsKCAiMTI3LjAuMC4xIiwgcG9ydCApOworCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCQorCQlyLnB1dCggImNvbm5lY3Rpb24iLCBzICk7CisJCVRjcDJDb25uZWN0aW9uIGMgPSBuZXcgVGNwMkNvbm5lY3Rpb24oICJ0Y3A6IiwgciApOworCQljLnNldFNlc3Npb24oIGRoICk7CisKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQljLndhaXRVcCggVElNRU9VVCApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisvLwkJYy5mbHVzaCgpOworCQlhc3NlcnROb3ROdWxsKCBjLnJlbW90ZUFkZHJlc3MoKSApOworCQlhc3NlcnROb3ROdWxsKCBjLmxvY2FsQWRkcmVzcygpICk7CisJCWFzc2VydEVxdWFscyggYy5yZW1vdGVBZGRyZXNzKCksIHQuc29ja2V0KCkuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBjLmxvY2FsQWRkcmVzcygpLCB0LnNvY2tldCgpLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSApOworCQkKKwkJdC5jbG9zZSgpOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU29ja2V0Q2hhbm5lbCBzID0gbmV3U29ja2V0Q2hhbm5lbCggIjEyNy4wLjAuMSIsIHBvcnQgKTsKKwkJU29ja2V0Q2hhbm5lbCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKwkJCisJCU15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCisJCXIucHV0KCAiY29ubmVjdGlvbiIsIHMgKTsKKwkJVGNwMkNvbm5lY3Rpb24gYyA9IG5ldyBUY3AyQ29ubmVjdGlvbiggInRjcDoiLCByICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKwkJCisJCWFzc2VydEZhbHNlKCBjLmlzU3RhcnRlZCgpICk7CisJCWMuc3RhcnQoKTsKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCWFzc2VydFRydWUoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdG9wKCk7CisJCWFzc2VydEZhbHNlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQljLndhaXREb3duKCBUSU1FT1VUICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQl0LmNsb3NlKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDMoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTb2NrZXRDaGFubmVsIHMgPSBuZXdTb2NrZXRDaGFubmVsKCAiMTI3LjAuMC4xIiwgcG9ydCApOworCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisKKwkJci5wdXQoICJjb25uZWN0aW9uIiwgcyApOworCQlUY3AyQ29ubmVjdGlvbiBjID0gbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOiIsIHIgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLmNsb3NlKCk7CisJCQorCQljLndhaXREb3duKCBUSU1FT1VUICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQl0LmNsb3NlKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlTb2NrZXRDaGFubmVsIHMgPSBuZXdTb2NrZXRDaGFubmVsKCAiMTI3LjAuMC4xIiwgcG9ydCApOworCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisKKwkJci5wdXQoICJjb25uZWN0aW9uIiwgcyApOworCQlUY3AyQ29ubmVjdGlvbiBjID0gbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOiIsIHIgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLmNsb3NlKCBmYWxzZSApOworCQkKKwkJYy53YWl0RG93biggVElNRU9VVCApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJdC5jbG9zZSgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnQ1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU29ja2V0Q2hhbm5lbCBzID0gbmV3U29ja2V0Q2hhbm5lbCggIjEyNy4wLjAuMSIsIHBvcnQgKTsKKwkJU29ja2V0Q2hhbm5lbCB0ID0gbGguYWNjZXB0ZWQud2FpdFVudGlsTm90RXFBbmRTZXQoIG51bGwsIFRJTUVPVVQsIG51bGwgKTsKKwkJCisJCU15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCisJCXIucHV0KCAiY29ubmVjdGlvbiIsIHMgKTsKKwkJVGNwMkNvbm5lY3Rpb24gYyA9IG5ldyBUY3AyQ29ubmVjdGlvbiggInRjcDoiLCByICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKwkJCisJCWFzc2VydEZhbHNlKCBjLmlzU3RhcnRlZCgpICk7CisJCWMuc3RhcnQoKTsKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCWFzc2VydFRydWUoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5jbG9zZSggdHJ1ZSApOworCQkKKwkJYy53YWl0RG93biggVElNRU9VVCApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJdC5jbG9zZSgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnQ2KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCQorCQlUY3AyQ29ubmVjdGlvbiBjID0gbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOi8vMTI3LjAuMC4xOiIrcG9ydCwgciApOworCQljLnNldFNlc3Npb24oIGRoICk7CisJCQorCQlhc3NlcnRGYWxzZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0YXJ0KCk7CisJCWFzc2VydFRydWUoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCVNvY2tldENoYW5uZWwgdCA9IGxoLmFjY2VwdGVkLndhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0b3AoKTsKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisJCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZXN0YXJ0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCUxvZy5yZXBvcnQoICItLS0gcmVzdGFydDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiApOworCQkKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCQorCQlUY3AyQ29ubmVjdGlvbiBjID0gbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOi8vMTI3LjAuMC4xOiIrcG9ydCsiP1RjcFRyYW5zcG9ydC5yZWNvbm5lY3REZWxheT0yMDAiLCByICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKwkJCisJCWMuc3RhcnQoKTsKKwkJYy53YWl0VXAoIFRJTUVPVVQgKTsKKwkJCisJCWludCBuID0gMTA7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKCsraSA8PSBuKQorCQl7CisJCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisJCQlMb2cucmVwb3J0KCAiYWNjZXB0ZWQiLCAiaSIsIGksCisJCQkJInQubG9jYWwiLCB0LnNvY2tldCgpLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorCQkJCSJ0LnJlbW90ZSIsIHQuc29ja2V0KCkuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpICk7CisJCQkKKwkJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKwkJCQorCQkJYXNzZXJ0RXF1YWxzKCB0LnNvY2tldCgpLmdldExvY2FsU29ja2V0QWRkcmVzcygpLCBjLnJlbW90ZUFkZHJlc3MoKSApOworCQkJYXNzZXJ0RXF1YWxzKCB0LnNvY2tldCgpLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSwgYy5sb2NhbEFkZHJlc3MoKSApOworCQkJCisJCQl3cml0ZSggdCwgaSApOworCQkJYXNzZXJ0V2hhdCggV2hhdC5EQVRBLCBkaC53aGF0ICk7CisJCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCQlhc3NlcnROb3ROdWxsKCBkaC54YnVmICk7CisJCQlhc3NlcnRFcXVhbHMoIDEsIGRoLnhidWYubGVuZ3RoICk7CisJCQlhc3NlcnRFcXVhbHMoIChieXRlKSBpLCBkaC54YnVmWzBdICk7CisKKwkJCXQuc29ja2V0KCkuc2h1dGRvd25PdXRwdXQoKTsKKwkJCXQuY2xvc2UoKTsKKwkJCXQgPSBudWxsOworCQkJCisJCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJfQorCQkKKwkJVGhyZWFkIHQxID0gbmV3IE1vbml0b3JIYXJ2ZXN0ZXI8U29ja2V0Q2hhbm5lbD4oIGxoLmFjY2VwdGVkICk7CisJCXQxLnN0YXJ0KCk7CisJCVRocmVhZCB0MiA9IG5ldyBNb25pdG9ySGFydmVzdGVyPFdoYXQ+KCBkaC53aGF0ICk7CisJCXQyLnN0YXJ0KCk7CisKKwkJTG9nLnJlcG9ydCggInN0b3BwaW5nIiApOworCQljLnN0b3AoKTsKKwkJYy53YWl0RG93biggVElNRU9VVCApOworCQlMb2cucmVwb3J0KCAic3RvcHBwZWQiICk7CisJCQorCQl0MS5qb2luKCk7CisJCXQyLmpvaW4oKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHdyaXRlKCBTb2NrZXRDaGFubmVsIHQsIGludCBiICkgdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoIDEgKTsKKwkJYnVmLnB1dCggKGJ5dGUpIGIgKTsKKwkJYnVmLmZsaXAoKTsKKwkJaW50IG4gPSB0LndyaXRlKCBidWYgKTsKKwkJaWYgKG4gIT0gMSkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggIm4gIT0gMSIgKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gPFQ+CisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBNb25pdG9ySGFydmVzdGVyPFQ+IGV4dGVuZHMgVGhyZWFkCisJeworCQkvKioKKwkJICogQHBhcmFtIG1vbgorCQkgKi8KKwkJcHVibGljIE1vbml0b3JIYXJ2ZXN0ZXIoIE1vbml0b3I8VD4gbW9uICkKKwkJeworCQkJdGhpcy5tb24gPSBtb247CisJCX0KKwkJCisJCXByaXZhdGUgZmluYWwgTW9uaXRvcjxUPiBtb247CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpCisJCXsKKwkJCXRyeQorCQkJeworCQkJCU9iamVjdCB0OworCQkJCXdoaWxlICgodCA9IG1vbi53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApKSAhPSBudWxsKQorCQkJCQlMb2cucmVwb3J0KCAiaGFydmVzdGVkIiwgIm1vbiIsIG1vbiwgInQiLCB0ICk7CisJCQl9CisJCQljYXRjaCAoIEV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCX0KKwkKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlc3RhcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTG9nLnJlcG9ydCggIi0tLSByZXN0YXJ0MiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICk7CisJCQorCQlNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJCisJCVRjcDJDb25uZWN0aW9uIGMgPSBuZXcgVGNwMkNvbm5lY3Rpb24oICJ0Y3A6Ly8xMjcuMC4wLjE6Iitwb3J0KyI/VGNwVHJhbnNwb3J0LnJlY29ubmVjdERlbGF5PTIwMCIsIHIgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYy5zdGFydCgpOworCQljLndhaXRVcCggVElNRU9VVCApOworCQkKKwkJaW50IG4gPSAxMDsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAoKytpIDw9IG4pCisJCXsKKy8vCQkJTG9nLnJlcG9ydCggIi0tLSB3YWl0QWNjZXB0ZWQiICk7CisJCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCisJCQlMb2cucmVwb3J0KCAiYWNjZXB0ZWQiLCAiaSIsIGksCisJCQkJInQubG9jYWwiLCB0LnNvY2tldCgpLmdldExvY2FsU29ja2V0QWRkcmVzcygpLAorCQkJCSJ0LnJlbW90ZSIsIHQuc29ja2V0KCkuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpICk7CisJCQkKKwkJCWFzc2VydFdoYXQoIFdoYXQuVVAsIGRoLndoYXQgKTsKKy8vCQkJTG9nLnJlcG9ydCggInVwIiwgImMubG9jYWwiLCBjLmxvY2FsQWRkcmVzcygpLCAiYy5yZW1vdGUiLCBjLnJlbW90ZUFkZHJlc3MoKSApOworCQkJCisJCQlhc3NlcnRFcXVhbHMoIHQuc29ja2V0KCkuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCksIGMucmVtb3RlQWRkcmVzcygpICk7CisJCQlhc3NlcnRFcXVhbHMoIHQuc29ja2V0KCkuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpLCBjLmxvY2FsQWRkcmVzcygpICk7CisJCQkKKwkJCXdyaXRlKCB0LCBpICk7CisJCQlhc3NlcnRXaGF0KCBXaGF0LkRBVEEsIGRoLndoYXQgKTsKKwkJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJCWFzc2VydE5vdE51bGwoIGRoLnhidWYgKTsKKwkJCWFzc2VydEVxdWFscyggMSwgZGgueGJ1Zi5sZW5ndGggKTsKKwkJCWFzc2VydEVxdWFscyggKGJ5dGUpIGksIGRoLnhidWZbMF0gKTsKKworLy8JCQlMb2cucmVwb3J0KCAiYy5zaHV0aW5nRG93bk91dHB1dCIgKTsKKwkJCWMuc2h1dGRvd25PdXRwdXQoKTsKKy8vCQkJTG9nLnJlcG9ydCggImMuc2h1dGRvd25PdXRwdXQiICk7CisJCQkKKy8vCQkJTG9nLnJlcG9ydCggInQucmVhZGluZyIgKTsKKwkJCWFzc2VydEVxdWFscyggLTEsIHJlYWQoIHQgKSApOworLy8JCQlMb2cucmVwb3J0KCAidC5lb2YiICk7CisJCQkKKwkJCXQuc29ja2V0KCkuc2h1dGRvd25PdXRwdXQoKTsKKwkJCXQuY2xvc2UoKTsKKwkJCXQgPSBudWxsOworCQkJCisJCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKy8vCQkJTG9nLnJlcG9ydCggImRvd24iICk7CisJCX0KKwkJCisJCVRocmVhZCB0MSA9IG5ldyBNb25pdG9ySGFydmVzdGVyPFNvY2tldENoYW5uZWw+KCBsaC5hY2NlcHRlZCApOworCQl0MS5zdGFydCgpOworCQlUaHJlYWQgdDIgPSBuZXcgTW9uaXRvckhhcnZlc3RlcjxXaGF0PiggZGgud2hhdCApOworCQl0Mi5zdGFydCgpOworCQkKKwkJTG9nLnJlcG9ydCggInN0b3BwaW5nIiApOworCQljLnN0b3AoKTsKKwkJYy53YWl0RG93biggVElNRU9VVCApOworCQlMb2cucmVwb3J0KCAic3RvcHBlZCIgKTsKKwkJCisJCXQxLmpvaW4oKTsKKwkJdDIuam9pbigpOworCX0KKworCXByaXZhdGUgaW50IHJlYWQoIFNvY2tldENoYW5uZWwgdCApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKCAxICk7CisJCWludCBuID0gdC5yZWFkKCBidWYgKTsKKwkJaWYgKG4gPD0gMCkKKwkJCXJldHVybiAtMTsKKwkJYnVmLmZsaXAoKTsKKwkJcmV0dXJuIGJ1Zi5nZXQoKSAmIDI1NTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRhdGExKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlEYXRhSGFuZGxlciBkaCA9IG5ldyBNeURhdGFIYW5kbGVyKCk7CisJCQorCQlUY3AyQ29ubmVjdGlvbiBjID0gbmV3IFRjcDJDb25uZWN0aW9uKCAidGNwOi8vMTI3LjAuMC4xOiIrcG9ydCwgciApOworCQljLnNldFNlc3Npb24oIGRoICk7CisJCQorCQlhc3NlcnRGYWxzZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0YXJ0KCk7CisJCWFzc2VydFRydWUoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCVNvY2tldENoYW5uZWwgdCA9IGxoLmFjY2VwdGVkLndhaXRVbnRpbE5vdEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBudWxsICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBkaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGRoLnhzZW5kZXIgKTsKKwkJYXNzZXJ0TnVsbCggZGgueGJ1ZiApOworCQkKKwkJd3JpdGUoIHQsIDIzICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LkRBVEEsIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROb3ROdWxsKCBkaC54YnVmICk7CisJCWFzc2VydEVxdWFscyggMSwgZGgueGJ1Zi5sZW5ndGggKTsKKwkJYXNzZXJ0RXF1YWxzKCAoYnl0ZSkgMjMsIGRoLnhidWZbMF0gKTsKKwkJCisJCWFzc2VydFRydWUoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdG9wKCk7CisJCWFzc2VydEZhbHNlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGRoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggZGgueHNlbmRlciApOworCQlhc3NlcnROdWxsKCBkaC54YnVmICk7CisJCQorCQl0LmNsb3NlKCk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkYXRhMigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCQkKKwkJVGNwMkNvbm5lY3Rpb24gYyA9IG5ldyBUY3AyQ29ubmVjdGlvbiggInRjcDovLzEyNy4wLjAuMToiK3BvcnQsIHIgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCWJ5dGVbXSBidWYgPSB7IDIxLCAyMiwgMjMgfTsKKwkJCisJCXdyaXRlKCB0LCBidWYgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuREFUQSwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE5vdE51bGwoIGRoLnhidWYgKTsKKwkJYXNzZXJ0RXF1YWxzKCAzLCBkaC54YnVmLmxlbmd0aCApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAyMSwgZGgueGJ1ZlswXSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAyMiwgZGgueGJ1ZlsxXSApOworCQlhc3NlcnRFcXVhbHMoIChieXRlKSAyMywgZGgueGJ1ZlsyXSApOworCQkKKwkJYXNzZXJ0VHJ1ZSggYy5pc1N0YXJ0ZWQoKSApOworCQljLnN0b3AoKTsKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGUoIFNvY2tldENoYW5uZWwgdCwgYnl0ZVtdIGIgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCUJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSggYi5sZW5ndGggKTsKKwkJYnVmLnB1dCggYiApOworCQlidWYuZmxpcCgpOworCQlpbnQgbiA9IHQud3JpdGUoIGJ1ZiApOworCQlpZiAobiAhPSBiLmxlbmd0aCkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggIm4gIT0gYi5sZW5ndGgiICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkYXRhMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU15RGF0YUhhbmRsZXIgZGggPSBuZXcgTXlEYXRhSGFuZGxlcigpOworCQkKKwkJVGNwMkNvbm5lY3Rpb24gYyA9IG5ldyBUY3AyQ29ubmVjdGlvbiggInRjcDovLzEyNy4wLjAuMToiK3BvcnQsIHIgKTsKKwkJYy5zZXRTZXNzaW9uKCBkaCApOworCQkKKwkJYXNzZXJ0RmFsc2UoIGMuaXNTdGFydGVkKCkgKTsKKwkJYy5zdGFydCgpOworCQlhc3NlcnRUcnVlKCBjLmlzU3RhcnRlZCgpICk7CisJCQorCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuc29ja2V0KCkuc2h1dGRvd25PdXRwdXQoKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwkJYy5jbG9zZSgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgZGF0YTQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeURhdGFIYW5kbGVyIGRoID0gbmV3IE15RGF0YUhhbmRsZXIoKTsKKwkJCisJCVRjcDJDb25uZWN0aW9uIGMgPSBuZXcgVGNwMkNvbm5lY3Rpb24oICJ0Y3A6Ly8xMjcuMC4wLjE6Iitwb3J0LCByICk7CisJCWMuc2V0U2Vzc2lvbiggZGggKTsKKworCQljLnN0YXJ0KCk7CisJCQorCQlTb2NrZXRDaGFubmVsIHQgPSBsaC5hY2NlcHRlZC53YWl0VW50aWxOb3RFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgbnVsbCApOworCQkKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCWMudHJhbnNwb3J0RGF0YSggbnVsbCwgbmV3IEZsZXhCdWZmZXIoIG5ldyBieXRlW10geyAyMSwgMjIsIDIzIH0gKSApOworLy8JCWMuZmx1c2goKTsKKwkJCisJCWFzc2VydEVxdWFscyggMjEsIHJlYWQoIHQgKSApOworCQlhc3NlcnRFcXVhbHMoIDIyLCByZWFkKCB0ICkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAyMywgcmVhZCggdCApICk7CisJCQorCQljLnNodXRkb3duT3V0cHV0KCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIC0xLCByZWFkKCB0ICkgKTsKKwkJCisJCWMuY2xvc2UoKTsKKwkJCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgZGgud2hhdCApOworCQlhc3NlcnROdWxsKCBkaC54c2VuZGVyICk7CisJCWFzc2VydE51bGwoIGRoLnhidWYgKTsKKwkJCisJCXQuY2xvc2UoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFzc2VydFdoYXQoIFdoYXQgd2hhdCwgTW9uaXRvcjxXaGF0PiBtb24gKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQltb24ud2FpdFVudGlsRXFBbmRTZXQoIHdoYXQsIFRJTUVPVVQsIG51bGwgKTsKKwl9CisJCisJLyoqCisJICogVGVzdCBldmVudHMuCisJICovCisJZW51bSBXaGF0CisJeworCQkvKiogY29ubmVjdGlvbiBpcyB1cCAqLworCQlVUCwKKwkJLyoqIGNvbm5lY3Rpb24gaXMgZG93biAqLworCQlET1dOLAorCQkvKiogY29ubmVjdGlvbiByZWFkIHNvbWUgZGF0YSAqLworCQlEQVRBCisJfQorCisJLyoqCisJICogTGlzdGVuZXJIYW5kbGVyIGZvciB0ZXN0aW5nLgorCSAqLworCXN0YXRpYyBjbGFzcyBNeUxpc3RlbmVyIGltcGxlbWVudHMgU2Vzc2lvbkxpc3RlbmVyPFNvY2tldENoYW5uZWw+CisJeworCQkvKiogbW9uaXRvciB0byByZXBvcnQgYWNjZXB0ZWQgc29ja2V0ICovCisJCXB1YmxpYyBNb25pdG9yPFNvY2tldENoYW5uZWw+IGFjY2VwdGVkID0gbmV3IE1vbml0b3I8U29ja2V0Q2hhbm5lbD4oICJhY2NlcHRlZCIgKTsKKwkJCisJCXB1YmxpYyB2b2lkIHNlc3Npb25BY2NlcHRlZCggU29ja2V0Q2hhbm5lbCBzICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisvLwkJCUxvZy5yZXBvcnQoICJsaXN0ZW5lci5hY2NlcHRlZCIsCisvLwkJCQkicy5sb2NhbCIsIHMuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCksCisvLwkJCQkicy5yZW1vdGUiLCBzLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSApOworCQkJCisJCQlhY2NlcHRlZC53YWl0VW50aWxFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgcyApOworCQl9CisKKwkJcHVibGljIE9iamVjdCBzZXNzaW9uUXVlcnkoIE9iamVjdCBxdWVyeSApCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnkgIitxdWVyeSApOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uTm90aWZ5KCBPYmplY3QgZXZlbnQgKQorCQl7CisJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBFeGNlcHRpb24pCisJCQkJTG9nLnJlcG9ydCggImxpc3RlbmVyLm5vdGlmeSIsICJldmVudCIsIGV2ZW50ICk7CisJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggIlRlc3RUY3AyQ29ubmVjdGlvbi5NeUxpc3RlbmVyOiBldmVudCA9ICIgKyBldmVudCApOworCQl9CisJfQorCQorCS8qKgorCSAqIERhdGFIYW5kbGVyIGZvciB0ZXN0aW5nLgorCSAqLworCXN0YXRpYyBjbGFzcyBNeURhdGFIYW5kbGVyIGltcGxlbWVudHMgU2Vzc2lvbkRhdGEKKwl7CisJCS8qKiBob2xkcyBldmVudCB0eXBlICovCisJCXB1YmxpYyBNb25pdG9yPFdoYXQ+IHdoYXQgPSBuZXcgTW9uaXRvcjxXaGF0PiggIndoYXQiICk7CisKKwkJLyoqIHNlbmRlciBvZiB0aGUgZXZlbnQgaWYgREFUQSAqLworCQlwdWJsaWMgV2hvIHhzZW5kZXI7CisKKwkJLyoqIGRhdGEgb2YgdGhlIGV2ZW50IGlmIERBVEEgKi8KKwkJcHVibGljIGJ5dGVbXSB4YnVmOworCQkKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkRhdGEoIFdobyBzZW5kZXIsIEZsZXhCdWZmZXIgYnVmICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQl4c2VuZGVyID0gc2VuZGVyOworCQkJeGJ1ZiA9IGJ1Zi5nZXRBdmFpbEJ5dGVzKCk7CisJCQl3aGF0LndhaXRVbnRpbEVxQW5kU2V0KCBudWxsLCBUSU1FT1VULCBXaGF0LkRBVEEgKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gcXVlcnkgIitxdWVyeSApOworCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInVua25vd24gY29udHJvbCAiK2NvbnRyb2wgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApIHRocm93cyBFeGNlcHRpb24KKwkJeworLy8JCQlMb2cucmVwb3J0KCAiZGF0YS5ub3RpZnkiLCAiZXZlbnQiLCBldmVudCApOworCQkJCisJCQlpZiAoZXZlbnQuZXF1YWxzKCBTZXNzaW9uLlVQICkpCisJCQl7CisJCQkJeGJ1ZiA9IG51bGw7CisJCQkJd2hhdC53YWl0VW50aWxFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgV2hhdC5VUCApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaWYgKGV2ZW50LmVxdWFscyggU2Vzc2lvbi5ET1dOICkpCisJCQl7CisJCQkJeGJ1ZiA9IG51bGw7CisJCQkJd2hhdC53YWl0VW50aWxFcUFuZFNldCggbnVsbCwgVElNRU9VVCwgV2hhdC5ET1dOICk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQlMb2cucmVwb3J0KCAiZGF0YS5ub3RpZnkiLCAiZXZlbnQiLCBldmVudCApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUvbmlvL1Rlc3RUY3AyTGlzdGVuZXIuamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9UZXN0VGNwMkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3ZjRhNgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL25pby9UZXN0VGNwMkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0NjcgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLm5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0NkFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5Nb25pdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLmlvLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5ldGNoLnV0aWwuY29yZS5pby5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUZXN0cyBMaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIFRlc3RUY3AyTGlzdGVuZXIKK3sKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVElNRU9VVCA9IDQwMDA7CisJCisJcHJpdmF0ZSBmaW5hbCBTdXBlclNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFN1cGVyU2VsZWN0b3IoKTsKKwl7CisJCXNlbGVjdG9yLnN0YXJ0KCk7CisJfQorCQorCXByaXZhdGUgZmluYWwgUmVzb3VyY2VzIHIgPSBuZXcgUmVzb3VyY2VzKCk7CisJeworCQlyLnB1dCggInNlbGVjdG9yIiwgc2VsZWN0b3IgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5lZ2F0aXZlIHBvcnQKKwkJbmV3IFRjcDJMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6LTEiLCByICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QoIGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKKwlwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcjIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQkvLyB0b28gcG9zaXRpdmUgcG9ydAorCQluZXcgVGNwMkxpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDo2NTUzNiIsIHIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yMygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG1pc3NpbmcgcG9ydAorCQluZXcgVGNwMkxpc3RlbmVyKCAidGNwOi8vMC4wLjAuMCIsIHIgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNCgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIG5lZ2F0aXZlIGJhY2tsb2cKKwkJbmV3IFRjcDJMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6MD9iYWNrbG9nPS0xIiwgciApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY29uc3RydWN0b3I1KCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJVGNwMkxpc3RlbmVyIGwgPSBuZXcgVGNwMkxpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDo0NSIsIHIgKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMC4wLjAuMCIsIGwuZ2V0SG9zdCgpICk7CisJCWFzc2VydEVxdWFscyggNDUsIGwuZ2V0UG9ydCgpICk7CisJCWFzc2VydEVxdWFscyggMCwgbC5nZXRCYWNrbG9nKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yNigpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCVRjcDJMaXN0ZW5lciBsID0gbmV3IFRjcDJMaXN0ZW5lciggInRjcDovL2ZvbzoyMDAxP2JhY2tsb2c9MTkiLCByICk7CisJCWFzc2VydEVxdWFscyggImZvbyIsIGwuZ2V0SG9zdCgpICk7CisJCWFzc2VydEVxdWFscyggMjAwMSwgbC5nZXRQb3J0KCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCAxOSwgbC5nZXRCYWNrbG9nKCkgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlc3Npb24xKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlMaXN0ZW5lckhhbmRsZXIgbGggPSBuZXcgTXlMaXN0ZW5lckhhbmRsZXIoKTsKKwkJCisJCVRjcDJMaXN0ZW5lciBsID0gbmV3IFRjcDJMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6MCIsIHIgKTsKKwkJbC5zZXRTZXNzaW9uKCBsaCApOworCQkKKwkJYXNzZXJ0U2FtZSggbGgsIGwuZ2V0U2Vzc2lvbigpICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdG9wMSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGlsbGVnYWwgc3RhdGU6IG5vdCBzdGFydGVkLgorCQlUY3AyTGlzdGVuZXIgbCA9IG5ldyBUY3AyTGlzdGVuZXIoICJ0Y3A6Ly8wLjAuMC4wOjAiLCByICk7CisJCWwuc3RvcCgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlMaXN0ZW5lckhhbmRsZXIgbGggPSBuZXcgTXlMaXN0ZW5lckhhbmRsZXIoKTsKKwkJCisJCVRjcDJMaXN0ZW5lciBsID0gbmV3IFRjcDJMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6MCIsIHIgKTsKKwkJbC5zZXRTZXNzaW9uKCBsaCApOworCQkKKwkJYXNzZXJ0V2hhdCggbnVsbCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJbC5zdGFydCgpOworCQlsLndhaXRVcCggVElNRU9VVCApOworCisJCWFzc2VydFRydWUoIGwuaXNTdGFydGVkKCkgKTsKKworCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBsaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGxoLnhzb2NrZXQgKTsKKworCQlJbmV0U29ja2V0QWRkcmVzcyBhID0gKEluZXRTb2NrZXRBZGRyZXNzKSBsLmxvY2FsQWRkcmVzcygpOworCQlpZiAoIGEuZ2V0QWRkcmVzcygpIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzICkKKwkJCWFzc2VydEVxdWFscyggIjA6MDowOjA6MDowOjA6MCIsIGEuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkudG9TdHJpbmcoKSApOworCQllbHNlCisJCQlhc3NlcnRFcXVhbHMoICIwLjAuMC4wIiwgYS5nZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKS50b1N0cmluZygpICk7CisJCWFzc2VydFRydWUoIGEuZ2V0UG9ydCgpID4gMCAmJiBhLmdldFBvcnQoKSA8IDY1NTM2ICk7CisKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKworCQlhc3NlcnRGYWxzZSggbC5pc1N0YXJ0ZWQoKSApOworCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeUxpc3RlbmVySGFuZGxlciBsaCA9IG5ldyBNeUxpc3RlbmVySGFuZGxlcigpOworCQlUY3AyTGlzdGVuZXIgbCA9IG5ldyBUY3AyTGlzdGVuZXIoICJ0Y3A6Ly8xMjcuMC4wLjE6MCIsIHIgKTsKKwkJbC5zZXRTZXNzaW9uKCBsaCApOworCQkKKwkJYXNzZXJ0V2hhdCggbnVsbCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJbC5zdGFydCgpOworCQlsLndhaXRVcCggVElNRU9VVCApOworCisJCWFzc2VydFRydWUoIGwuaXNTdGFydGVkKCkgKTsKKworCQlhc3NlcnRXaGF0KCBXaGF0LlVQLCBsaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGxoLnhzb2NrZXQgKTsKKworCQlJbmV0U29ja2V0QWRkcmVzcyBhID0gKEluZXRTb2NrZXRBZGRyZXNzKSBsLmxvY2FsQWRkcmVzcygpOworCQlhc3NlcnRFcXVhbHMoICIxMjcuMC4wLjEiLCBhLmdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLnRvU3RyaW5nKCkgKTsKKwkJYXNzZXJ0VHJ1ZSggYS5nZXRQb3J0KCkgPiAwICYmIGEuZ2V0UG9ydCgpIDwgNjU1MzYgKTsKKworCQlsLnN0b3AoKTsKKwkJbC53YWl0RG93biggVElNRU9VVCApOworCQlhc3NlcnRGYWxzZSggbC5pc1N0YXJ0ZWQoKSApOworCQlhc3NlcnRXaGF0KCBXaGF0LkRPV04sIGxoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggbGgueHNvY2tldCApOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnQzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJTXlMaXN0ZW5lckhhbmRsZXIgbGggPSBuZXcgTXlMaXN0ZW5lckhhbmRsZXIoKTsKKwkJVGNwMkxpc3RlbmVyIGwgPSBuZXcgVGNwMkxpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDo0OTk4IiwgciApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisKKwkJYXNzZXJ0V2hhdCggbnVsbCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJbC5zdGFydCgpOworCQlsLndhaXRVcCggVElNRU9VVCApOworCQlhc3NlcnRUcnVlKCBsLmlzU3RhcnRlZCgpICk7CisKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJSW5ldFNvY2tldEFkZHJlc3MgYSA9IChJbmV0U29ja2V0QWRkcmVzcykgbC5sb2NhbEFkZHJlc3MoKTsKKwkJaWYgKCBhLmdldEFkZHJlc3MoKSBpbnN0YW5jZW9mIEluZXQ2QWRkcmVzcyApCisJCQlhc3NlcnRFcXVhbHMoICIwOjA6MDowOjA6MDowOjAiLCBhLmdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLnRvU3RyaW5nKCkgKTsKKwkJZWxzZQorCQkJYXNzZXJ0RXF1YWxzKCAiMC4wLjAuMCIsIGEuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkudG9TdHJpbmcoKSApOworCQlhc3NlcnRFcXVhbHMoIDQ5OTgsIGEuZ2V0UG9ydCgpICk7CisKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKworCQlhc3NlcnRGYWxzZSggbC5pc1N0YXJ0ZWQoKSApOworCisJCWFzc2VydFdoYXQoIFdoYXQuRE9XTiwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisJfQorCisJLyoqIEB0aHJvd3MgRXhjZXB0aW9uICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydDQoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeUxpc3RlbmVySGFuZGxlciBsaCA9IG5ldyBNeUxpc3RlbmVySGFuZGxlcigpOworCQlUY3AyTGlzdGVuZXIgbCA9IG5ldyBUY3AyTGlzdGVuZXIoICJ0Y3A6Ly8xMjcuMC4wLjE6NDk5NiIsIHIgKTsKKwkJbC5zZXRTZXNzaW9uKCBsaCApOworCisJCWFzc2VydFdoYXQoIG51bGwsIGxoLndoYXQgKTsKKwkJYXNzZXJ0TnVsbCggbGgueHNvY2tldCApOworCisJCWwuc3RhcnQoKTsKKwkJbC53YWl0VXAoIFRJTUVPVVQgKTsKKworCQlhc3NlcnRUcnVlKCBsLmlzU3RhcnRlZCgpICk7CisKKwkJYXNzZXJ0V2hhdCggV2hhdC5VUCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJSW5ldFNvY2tldEFkZHJlc3MgYSA9IChJbmV0U29ja2V0QWRkcmVzcykgbC5sb2NhbEFkZHJlc3MoKTsKKwkJYXNzZXJ0RXF1YWxzKCAiMTI3LjAuMC4xIiwgYS5nZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKS50b1N0cmluZygpICk7CisJCWFzc2VydEVxdWFscyggNDk5NiwgYS5nZXRQb3J0KCkgKTsKKworCQlsLnN0b3AoKTsKKwkJbC53YWl0RG93biggVElNRU9VVCApOworCisJCWFzc2VydEZhbHNlKCBsLmlzU3RhcnRlZCgpICk7CisKKwkJYXNzZXJ0V2hhdCggV2hhdC5ET1dOLCBsaC53aGF0ICk7CisJCWFzc2VydE51bGwoIGxoLnhzb2NrZXQgKTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdCggZXhwZWN0ZWQgPSBTb2NrZXRFeGNlcHRpb24uY2xhc3MgKQorCXB1YmxpYyB2b2lkIHN0YXJ0NSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCS8vIGJhZCBhZGRyZXNzCisJCU15TGlzdGVuZXJIYW5kbGVyIGxoID0gbmV3IE15TGlzdGVuZXJIYW5kbGVyKCk7CisJCVRjcDJMaXN0ZW5lciBsID0gbmV3IFRjcDJMaXN0ZW5lciggInRjcDovLzEuMi4zLjQuNTo0OTk3IiwgciApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisKKwkJYXNzZXJ0V2hhdCggbnVsbCwgbGgud2hhdCApOworCQlhc3NlcnROdWxsKCBsaC54c29ja2V0ICk7CisKKwkJbC5zdGFydCgpOworCX0KKworCS8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAqLworCUBUZXN0CisJcHVibGljIHZvaWQgYWNjZXB0MSgpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCU15TGlzdGVuZXJIYW5kbGVyIGxoID0gbmV3IE15TGlzdGVuZXJIYW5kbGVyKCk7CisJCVRjcDJMaXN0ZW5lciBsID0gbmV3IFRjcDJMaXN0ZW5lciggInRjcDovLzAuMC4wLjA6NDk5NSIsIHIgKTsKKwkJbC5zZXRTZXNzaW9uKCBsaCApOworCisJCWwuc3RhcnQoKTsKKwkJbC53YWl0VXAoIFRJTUVPVVQgKTsKKworCQlTb2NrZXQgcyA9IG5ldyBTb2NrZXQoICIxMjcuMC4wLjEiLCA0OTk1ICk7CisJCWFzc2VydFdoYXQoIFdoYXQuQUNDRVBURUQsIGxoLndoYXQgKTsKKwkJYXNzZXJ0Tm90TnVsbCggbGgueHNvY2tldCApOworCisJCS8vIHZlcmlmeSB0aGV5IGFyZSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlcgorCisJCWFzc2VydEVxdWFscyggcy5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSwgbGgueHNvY2tldC5zb2NrZXQoKS5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkgKTsKKwkJYXNzZXJ0RXF1YWxzKCBzLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSwgbGgueHNvY2tldC5zb2NrZXQoKS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSApOworCisJCS8vIHZlcmlmeSB0aGV5IGNhbiB0YWxrIHRvIGVhY2ggb3RoZXIKKworCQlzLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKCAyMyApOworCQlzLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7CisJCWFzc2VydEVxdWFscyggMjMsIHJlYWQoIGxoLnhzb2NrZXQgKSApOworCisJCXMuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoIDY3ICk7CisJCXMuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKKwkJYXNzZXJ0RXF1YWxzKCA2NywgcmVhZCggbGgueHNvY2tldCApICk7CisKKwkJd3JpdGUoIGxoLnhzb2NrZXQsIDI0ICk7CisJCWFzc2VydEVxdWFscyggMjQsIHMuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKCkgKTsKKworCQl3cml0ZSggbGgueHNvY2tldCwgNzMgKTsKKwkJYXNzZXJ0RXF1YWxzKCA3Mywgcy5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoKSApOworCisJCS8vIHNodXQgJ2VtIGRvd24uCisKKwkJcy5jbG9zZSgpOworCQlsaC54c29ja2V0LmNsb3NlKCk7CisKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGUoIFNvY2tldENoYW5uZWwgYywgaW50IGIgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCUJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSggMSApOworCQlidWYucHV0KCAoYnl0ZSkgYiApOworCQlidWYuZmxpcCgpOworCQlpbnQgbiA9IGMud3JpdGUoIGJ1ZiApOworCQlpZiAobiAhPSAxKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCAibSAhPSAxIiApOworCX0KKworCXByaXZhdGUgaW50IHJlYWQoIFNvY2tldENoYW5uZWwgYyApIHRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKCAxICk7CisJCWludCBuID0gYy5yZWFkKCBidWYgKTsKKwkJaWYgKG4gPD0gMCkKKwkJCXJldHVybiAtMTsKKwkJYnVmLmZsaXAoKTsKKwkJcmV0dXJuIGJ1Zi5nZXQoKSAmIDI1NTsKKwl9CisKKwkvKiogQHRocm93cyBFeGNlcHRpb24gKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFjY2VwdDIoKSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlNeU90aGVyTGlzdGVuZXJIYW5kbGVyIGxoID0gbmV3IE15T3RoZXJMaXN0ZW5lckhhbmRsZXIoKTsKKwkJVGNwMkxpc3RlbmVyIGwgPSBuZXcgVGNwMkxpc3RlbmVyKCAidGNwOi8vMC4wLjAuMDowP1RjcExpc3RlbmVyLmJhY2tsb2c9MTAwIiwgciApOworCQlsLnNldFNlc3Npb24oIGxoICk7CisKKwkJbC5zdGFydCgpOworCQlsLndhaXRVcCggVElNRU9VVCApOworCisJCWludCBwb3J0ID0gKChJbmV0U29ja2V0QWRkcmVzcykgbC5sb2NhbEFkZHJlc3MoKSkuZ2V0UG9ydCgpOworCisJCWludCBuID0gMTAwMDsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJCW5ldyBTb2NrZXQoICIxMjcuMC4wLjEiLCBwb3J0ICkuY2xvc2UoKTsKKworCQkvLyB3YWl0IGZvciB0aGluZ3MgdG8gc2V0dGxlIGRvd24uLi4KKwkJVGhyZWFkLnNsZWVwKCAxMDAgKTsKKworCQlhc3NlcnRFcXVhbHMoIG4sIGxoLmFjY2VwdGVkICk7CisKKwkJbC5zdG9wKCk7CisJCWwud2FpdERvd24oIFRJTUVPVVQgKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXNzZXJ0V2hhdCggV2hhdCB3aGF0LCBNb25pdG9yPFdoYXQ+IG1vbiApCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCW1vbi53YWl0VW50aWxFcUFuZFNldCggd2hhdCwgNDAwMCwgbnVsbCApOworCX0KKworCS8qKgorCSAqIEV2ZW50IHR5cGVzLgorCSAqLworCWVudW0gV2hhdAorCXsKKwkJLyoqIHRoZSBldmVudCBzZWVuIHdhcyBBQ0NFUFRFRCAqLworCQlBQ0NFUFRFRCwKKwkJLyoqIHRoZSBldmVudCBzZWVuIHdhcyBVUCAqLworCQlVUCwKKwkJLyoqIHRoZSBldmVudCBzZWVuIHdhcyBET1dOICovCisJCURPV04KKwl9CisKKwkvKioKKwkgKiBMaXN0ZW5lckhhbmRsZXIgZm9yIHRlc3RpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBNeUxpc3RlbmVySGFuZGxlciBpbXBsZW1lbnRzIFNlc3Npb25MaXN0ZW5lcjxTb2NrZXRDaGFubmVsPgorCXsKKwkJLyoqIHRoZSBldmVudCBzZWVuICovCisJCXB1YmxpYyBNb25pdG9yPFdoYXQ+IHdoYXQgPSBuZXcgTW9uaXRvcjxXaGF0PiggbnVsbCApOworCisJCS8qKiB0aGUgc29ja2V0IGFjY2VwdGVkIChpZiBhY2NlcHQpICovCisJCXB1YmxpYyBTb2NrZXRDaGFubmVsIHhzb2NrZXQ7CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkFjY2VwdGVkKCBTb2NrZXRDaGFubmVsIHNvY2tldCApIHRocm93cyBFeGNlcHRpb24KKwkJeworCQkJeHNvY2tldCA9IHNvY2tldDsKKwkJCXdoYXQuc2V0KCBXaGF0LkFDQ0VQVEVEICk7CisJCX0KKwkJCisJCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIHF1ZXJ5ICIrcXVlcnkgKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgc2Vzc2lvbkNvbnRyb2woIE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUgKQorCQl7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJ1bmtub3duIGNvbnRyb2wgIitjb250cm9sICk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHNlc3Npb25Ob3RpZnkoIE9iamVjdCBldmVudCApCisJCXsKKwkJCWlmIChldmVudC5lcXVhbHMoIFNlc3Npb24uVVAgKSkKKwkJCXsKKwkJCQl3aGF0LnNldCggV2hhdC5VUCApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaWYgKGV2ZW50LmVxdWFscyggU2Vzc2lvbi5ET1dOICkpCisJCQl7CisJCQkJd2hhdC5zZXQoIFdoYXQuRE9XTiApOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIExpc3RlbmVySGFuZGxlciBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15T3RoZXJMaXN0ZW5lckhhbmRsZXIgaW1wbGVtZW50cyBTZXNzaW9uTGlzdGVuZXI8U29ja2V0Q2hhbm5lbD4KKwl7CisJCS8qKiBjb3VudCBvZiBhY2NlcHRlZCBjb25uZWN0aW9ucy4gKi8KKwkJcHVibGljIGludCBhY2NlcHRlZDsKKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQWNjZXB0ZWQoIFNvY2tldENoYW5uZWwgc29ja2V0ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQlhY2NlcHRlZCsrOworCQkJc29ja2V0LmNsb3NlKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXNzaW9uQ29udHJvbCggT2JqZWN0IGNvbnRyb2wsIE9iamVjdCB2YWx1ZSApCisJCQl0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCS8vIGlnbm9yZQorCQl9CisKKwkJcHVibGljIHZvaWQgc2Vzc2lvbk5vdGlmeSggT2JqZWN0IGV2ZW50ICkgdGhyb3dzIEV4Y2VwdGlvbgorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCisJCXB1YmxpYyBPYmplY3Qgc2Vzc2lvblF1ZXJ5KCBPYmplY3QgcXVlcnkgKSB0aHJvd3MgRXhjZXB0aW9uCisJCXsKKwkJCS8vIGlnbm9yZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS94bWwvdGVzdEpheHAuamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC90ZXN0SmF4cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2Y0YzkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9ldGNoL3V0aWwvY29yZS94bWwvdGVzdEpheHAuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuZXRjaC51dGlsLmNvcmUueG1sOworCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRpbWVyOworaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIHRlc3RKYXhwLgorICovCitwdWJsaWMgY2xhc3MgdGVzdEpheHAKK3sKKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworCQlEb2N1bWVudCBkID0gZGIucGFyc2UoIG5ldyBJbnB1dFNvdXJjZSggbmV3IFN0cmluZ1JlYWRlciggIjx4PmJsYWg8L3g+IiApICkgKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiZCA9ICIrZCApOworCQlkdW1wKCBkICk7CisJCQorCQlkdW1wKCBwYXJzZSggZGIsIFRFU1RfTVNHICkgKTsKKwkJCisJCWlmIChmYWxzZSkgcmV0dXJuOworCQkKKwkJaW50IG0gPSA1OworCQlpbnQgbiA9IDUwMDAwKjQ7CisJCWZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorCQl7CisJCQlpZiAoaiAhPSAwKQorCQkJCVRocmVhZC5zbGVlcCggNTAwMCApOworCQkJCisJCQlsb25nIHQwID0gVGltZXIuY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSArPSA0KQorCQkJeworCQkJCXBhcnNlKCBkYiwgVEVTVF9NU0cgKTsKKwkJCQlwYXJzZSggZGIsIFRFU1RfTVNHICk7CisJCQkJcGFyc2UoIGRiLCBURVNUX01TRyApOworCQkJCXBhcnNlKCBkYiwgVEVTVF9NU0cgKTsKKwkJCX0KKwkJCWxvbmcgdDEgPSBUaW1lci5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCisJCQlkb3VibGUgdCA9ICh0MS10MCkvMTAwMC4wOworCQkJZG91YmxlIHIgPSBuIC8gdDsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggInRvb2sgIit0KyIgZm9yICIrbisiIGl0ZXJhdGlvbnMgKCIrcisiIHBlciBzZWNvbmQpIiApOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcCggRG9jdW1lbnQgZCApCisJeworCQlkdW1wKCAiIiwgZC5nZXREb2N1bWVudEVsZW1lbnQoKSApOworCQkKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoIFN0cmluZyBwcmVmaXgsIEVsZW1lbnQgZSApCisJeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIHByZWZpeCsic3RhcnQgb2YgZWxlbWVudCBuYW1lPSIrZS5nZXRUYWdOYW1lKCkgKTsKKwkJCisJCU5hbWVkTm9kZU1hcCBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOworCQlpbnQgbiA9IGF0dHJzLmdldExlbmd0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKwkJeworCQkJTm9kZSBhID0gYXR0cnMuaXRlbSggaSApOworCQkJU3lzdGVtLm91dC5wcmludGxuKCBwcmVmaXgrIiAgYXR0ciBuYW1lICciK2EuZ2V0Tm9kZU5hbWUoKSsiJyB2YWx1ZSAnIithLmdldE5vZGVWYWx1ZSgpKyInIiApOworCQl9CisJCQorCQlOb2RlTGlzdCBubCA9IGUuZ2V0Q2hpbGROb2RlcygpOworCQluID0gbmwuZ2V0TGVuZ3RoKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorCQl7CisJCQlOb2RlIHNuID0gbmwuaXRlbSggaSApOworCQkJaWYgKHNuIGluc3RhbmNlb2YgRWxlbWVudCkKKwkJCQlkdW1wKCBwcmVmaXgrIiAgIiwgKEVsZW1lbnQpIHNuICk7CisJCQllbHNlCisJCQkJZHVtcCggcHJlZml4KyIgICIsIChDaGFyYWN0ZXJEYXRhICkgc24gKTsKKwkJfQorCQkKKwkJU3lzdGVtLm91dC5wcmludGxuKCBwcmVmaXgrImVuZCBvZiBlbGVtZW50IG5hbWU9IitlLmdldFRhZ05hbWUoKSApOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcCggU3RyaW5nIHByZWZpeCwgQ2hhcmFjdGVyRGF0YSBkYXRhICkKKwl7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggcHJlZml4KyJkYXRhID0gJyIrZGF0YSsiJyIgKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBwYXJzZSggRG9jdW1lbnRCdWlsZGVyIGRiLCBTdHJpbmcgbXNnICkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIGRiLnBhcnNlKCBuZXcgSW5wdXRTb3VyY2UoIG5ldyBTdHJpbmdSZWFkZXIoIG1zZyApICkgKTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVF9NU0cgPQorCQkiPG1lc3NhZ2U+IiArCisJCQkiPG1lc3NhZ2VJZD5jb25uZWN0PC9tZXNzYWdlSWQ+IiArCisJCQkiPGZpZWxkIG5hbWU9J21hY2hpbmVOYW1lJz54eHg8L2ZpZWxkPiIgKworCQkJIjxmaWVsZCBuYW1lPSdxdWV1ZU5hbWUnPnh4eDwvZmllbGQ+IiArCisJCQkiPGZpZWxkIG5hbWU9J2hlYXJ0YmVhdEludGVydmFsJz4xMDwvZmllbGQ+IiArCisJCQkiPGZpZWxkIG5hbWU9J2hlYXJ0YmVhdFBheWxvYWQnPm1lZGlhUmVzb3VyY2VzPC9maWVsZD4iICsKKwkJCSI8ZmllbGQgbmFtZT0nc2VydmVySWQnPjE8L2ZpZWxkPiIgKworCQkJIjxmaWVsZCBuYW1lPSd0cmFuc2FjdGlvbklkJz4xPC9maWVsZD4iICsKKwkJIjwvbWVzc2FnZT4iOworfQpkaWZmIC0tZ2l0IGEvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZXRjaC91dGlsL2NvcmUveG1sL3Rlc3RYbWxQYXJzZXIuamF2YSBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC90ZXN0WG1sUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyMmJlOQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2V0Y2gvdXRpbC9jb3JlL3htbC90ZXN0WG1sUGFyc2VyLmphdmEKQEAgLTAsMCArMSw4MjMgQEAKKy8qICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmV0Y2gudXRpbC5jb3JlLnhtbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuZXRjaC51dGlsLlRpbWVyOworCisKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgdGVzdFhtbFBhcnNlciBleHRlbmRzIFhtbFBhcnNlcgoreworCS8qKgorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwl7CisJCXRlc3RYbWxQYXJzZXIgeHAgPSBuZXcgdGVzdFhtbFBhcnNlcigpOworCisJCXBhcnNlKCB4cCwgIjx4PiIgKTsKKwkJCisJCXBhcnNlKCB4cCwgIjxhPiIgKTsKKwkJcGFyc2UoIHhwLCAiPC9hPiIgKTsKKworCQlwYXJzZSggeHAsICI8YTpkPiIgKTsKKwkJcGFyc2UoIHhwLCAiPC9hOmQ+IiApOworCisJCXBhcnNlKCB4cCwgIjxhYmM+IiApOworCQlwYXJzZSggeHAsICI8YWJjOmRlZj4iICk7CisJCQorCQlwYXJzZSggeHAsICI8YWJjID4iICk7CisJCXBhcnNlKCB4cCwgIjxhYmM6ZGVmID4iICk7CisJCQorCQlwYXJzZSggeHAsICI8YWJjLz4iICk7CisJCXBhcnNlKCB4cCwgIjxhYmM6ZGVmLz4iICk7CisJCQorCQlwYXJzZSggeHAsICI8YWJjIC8+IiApOworCQlwYXJzZSggeHAsICI8YWJjOmRlZiAvPiIgKTsKKwkJCisJCXBhcnNlKCB4cCwgIjwvYWJjOmRlZj4iICk7CisJCXBhcnNlKCB4cCwgIjwvYWJjPiIgKTsKKwkJCisJCXBhcnNlKCB4cCwgIjwvYWJjOmRlZiA+IiApOworCQlwYXJzZSggeHAsICI8L2FiYyA+IiApOworCisJCXBhcnNlKCB4cCwgIjxhIHg9JzEnLz4iICk7CisJCXBhcnNlKCB4cCwgIjxhIHggPScxJy8+IiApOworCQlwYXJzZSggeHAsICI8YSB4PSAnMScvPiIgKTsKKwkJcGFyc2UoIHhwLCAiPGEgeCA9ICcxJy8+IiApOworCQkKKwkJcGFyc2UoIHhwLCAiPGEgeHl6PScmIzE2OTsxMjMmIzE2OTsnLz4iICk7CisJCXBhcnNlKCB4cCwgIjxhIHg9JzEnIHk9JzInLz4iICk7CisKKwkJcGFyc2UoIHhwLCAiPGEgcTp4PScxJy8+IiApOworCQlwYXJzZSggeHAsICI8YSBxOnh5ej0nMTIzJy8+IiApOworCQlwYXJzZSggeHAsICI8YSBxOng9JzEnIHE6eT0nMicvPiIgKTsKKworCQlwYXJzZSggeHAsICI8YSB4PVwiMVwiLz4iICk7CisJCXBhcnNlKCB4cCwgIjxhIHh5ej1cIjEyM1wiLz4iICk7CisJCXBhcnNlKCB4cCwgIjxhIHg9XCIxXCIgeT1cIjJcIi8+IiApOworCQkKKwkJcGFyc2UoIHhwLCAiPC94PiIgKTsKKwkJVGFnRWxlbWVudCB0ZSA9IHhwLmZpbmlzaCgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICJwYXJzZWQ6ICIrdGUgKTsKKwkJCisJCXhwLmNsZWFyKCk7CisJCQorCQl4cC5wYXJzZU9uZSggVEVTVF9NU0cgKTsKKwkJCisJCXhwLmR1bXAoKTsKKwkJCisJCWlmIChmYWxzZSkKKwkJeworCQkJaW50IG0gPSA1OworCQkJaW50IG4gPSA1MDAwMCo0OworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCisJCQl7CisJCQkJaWYgKGogIT0gMCkKKwkJCQkJVGhyZWFkLnNsZWVwKCA1MDAwICk7CisJCQkJCisJCQkJbG9uZyB0MCA9IFRpbWVyLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpICs9IDQpCisJCQkJeworCQkJCQl4cC5wYXJzZSggVEVTVF9NU0cgKTsKKwkJCQkJeHAucGFyc2UoIFRFU1RfTVNHICk7CisJCQkJCXhwLnBhcnNlKCBURVNUX01TRyApOworCQkJCQl4cC5wYXJzZSggVEVTVF9NU0cgKTsKKwkJCQl9CisJCQkJbG9uZyB0MSA9IFRpbWVyLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJCisJCQkJZG91YmxlIHQgPSAodDEtdDApLzEwMDAuMDsKKwkJCQlkb3VibGUgciA9IG4gLyB0OworCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggInRvb2sgIit0KyIgZm9yICIrbisiIGl0ZXJhdGlvbnMgKCIrcisiIHBlciBzZWNvbmQpIiApOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFU1RfTVNHID0KKwkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi0xNlwiPz4iICsKKwkJIjxtZXNzYWdlIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj4iICsKKwkJCSI8ZmllbGQgbmFtZT1cImhlYXJ0YmVhdEludGVydmFsXCI+MTA8L2ZpZWxkPiIgKworCQkJIjxmaWVsZCBuYW1lPVwiaGVhcnRiZWF0UGF5bG9hZFwiPm1lZGlhUmVzb3VyY2VzPC9maWVsZD4iICsKKwkJCSI8ZmllbGQgbmFtZT1cIm1hY2hpbmVOYW1lXCI+SkFWQU1BTjwvZmllbGQ+IiArCisJCQkiPGZpZWxkIG5hbWU9XCJxdWV1ZU5hbWVcIj5OVUxMPC9maWVsZD4iICsKKwkJCSI8ZmllbGQgbmFtZT1cInNlcnZlcklkXCI+MTwvZmllbGQ+IiArCisJCQkiPGZpZWxkIG5hbWU9XCJ0cmFuc2FjdGlvbklkXCI+MzwvZmllbGQ+IiArCisJCQkiPGZpZWxkIG5hbWU9XCJzZXJ2ZXJJZFwiPjE8L2ZpZWxkPiIgKworCQkJIjxmaWVsZCBuYW1lPVwiY2xpZW50SWRcIj5OVUxMPC9maWVsZD4iICsKKwkJCSI8bWVzc2FnZUlkPmNvbm5lY3Q8L21lc3NhZ2VJZD4iICsKKwkJIjwvbWVzc2FnZT4iOworCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZSggWG1sUGFyc2VyIHhwLCBTdHJpbmcgcyApIHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAidHJ5aW5nICciK3MrIicuLi4iICk7CisJCVN5c3RlbS5vdXQuZmx1c2goKTsKKwkJCisJCXhwLnBhcnNlKCBzICk7CisJCQorCQlTeXN0ZW0ub3V0LnByaW50bG4oICIuLi4gb2shIiApOworCQlTeXN0ZW0ub3V0LmZsdXNoKCk7CisJCQorCQl4cC5kdW1wKCk7CisJfQorCQorCXB1YmxpYyBUYWdFbGVtZW50IGFkZFJvb3RUYWcoIFFOYW1lIHFOYW1lLCBNYXA8UU5hbWUsIFN0cmluZz4gYXR0cnMgKQorCXsKKwkJTWVzc2FnZVByb2Nlc3NvciBtcCA9IG5ldyBNZXNzYWdlUHJvY2Vzc29yKCk7CisJCXB1c2hUYWdFbGVtZW50KCBtcCApOworCQlyZXR1cm4gbXAuYWRkVGFnKCBxTmFtZSwgYXR0cnMgKTsKKwl9CisJCisJLyoqCisJICogRGVzY3JpcHRpb24gb2YgTWVzc2FnZVByb2Nlc3NvcgorCSAqLworCXB1YmxpYyBjbGFzcyBNZXNzYWdlUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50IGltcGxlbWVudHMgVGFnRWxlbWVudAorCXsKKwkJLyoqCisJCSAqLworCQlwdWJsaWMgTWVzc2FnZVByb2Nlc3NvcigpCisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIHZvaWQgYWRkQ2RhdGEoIFN0cmluZyBjZGF0YSApCisJCXsKKwkJCWlmIChjZGF0YS50cmltKCkubGVuZ3RoKCkgPiAwKQorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiY2RhdGEgbm90IGFsbG93ZWQgaW4gbWVzc2FnZSBwcm9jZXNzb3I6ICIrY2RhdGEgKTsKKwkJfQorCQkKKwkJcHVibGljIFRhZ0VsZW1lbnQgYWRkVGFnKCBRTmFtZSBjaGlsZFFOYW1lLCBNYXA8UU5hbWUsIFN0cmluZz4gY2hpbGRBdHRycyApCisJCXsKKwkJCWlmIChjaGlsZFFOYW1lLm1hdGNoZXMoIE1FU1NBR0VfUVVBTElGSUVSLCBNRVNTQUdFX05BTUUgKSkKKwkJCQlyZXR1cm4gbmV3IE1lc3NhZ2UoIGNoaWxkQXR0cnMgKTsKKwkJCQorCQkJcmV0dXJuIG5ldyBEZWZhdWx0VGFnRWxlbWVudCggY2hpbGRRTmFtZSwgY2hpbGRBdHRycyApOworCQl9CisKKwkJcHVibGljIHZvaWQgZmluaXNoKCkKKwkJeworCQkJLy8gbm90aGluZyB0byBkbworCQl9CisKKwkJcHVibGljIEl0ZXJhdG9yPEVsZW1lbnQ+IGdldENoaWxkcmVuKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRDZGF0YVZhbHVlKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIEl0ZXJhdG9yPFFOYW1lPiBnZXRBdHRyTmFtZXMoKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFFOYW1lIGdldFFOYW1lKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyggUU5hbWUgcU5hbWUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKCBFbGVtZW50IGUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIHZvaWQgY2xlYXIoKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRJbnRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBMb25nIGdldExvbmdBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGZpbmQoIFN0cmluZyBwYXRoICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFRhZ0VsZW1lbnQgZmluZCggU3RyaW5nIG9xdWFsaWZpZXIsIFN0cmluZyBvbmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGZpbmQoIFFOYW1lIHN1YlFOYW1lICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIEl0ZXJhdG9yPEVsZW1lbnQ+IGl0ZXJhdG9yKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQXR0cnMoKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIFRhZ0VsZW1lbnQgYWRkVGFnKCBRTmFtZSBjaGlsZFFOYW1lICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFRhZ0VsZW1lbnQgYWRkVGFnKCBTdHJpbmcgY2hpbGROYW1lLCBNYXA8UU5hbWUsIFN0cmluZz4gY2hpbGRBdHRycyApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGFkZFRhZyggU3RyaW5nIGNoaWxkTmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBpbnQgY291bnRDaGlsZHJlbigpCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXB1YmxpYyBFbGVtZW50IGdldENoaWxkKCBpbnQgaW5kZXggKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNDZGF0YVZhbHVlKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRvU3RyaW5nKCBXcml0ZXIgd3RyLCBib29sZWFuIG5ld2xpbmVCZXR3ZWVuVGFncywKKwkJCWJvb2xlYW4gY29sbGFwc2VFbXB0eVRhZ3MgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJd3RyLndyaXRlKCAibXAiICk7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICkKKwkJeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgaW50IHZhbHVlICkKKwkJeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSApCisJCXsKKwkJCXJldHVybiB0aGlzOworCQl9CisJfQorCQorCS8qKgorCSAqIERlc2NyaXB0aW9uIG9mIE1lc3NhZ2UuCisJICovCisJcHVibGljIGNsYXNzIE1lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnQgaW1wbGVtZW50cyBUYWdFbGVtZW50CisJeworCQkvKioKKwkJICogQ29uc3RydWN0cyB0aGUgTWVzc2FnZS4KKwkJICoKKwkJICogQHBhcmFtIGF0dHJzCisJCSAqLworCQlwdWJsaWMgTWVzc2FnZSggTWFwPFFOYW1lLCBTdHJpbmc+IGF0dHJzICkKKwkJeworCQkJdHlwZSA9IGF0dHJzLmdldCggbmV3IFFOYW1lKCBudWxsLCAidCIgKSApOworCQl9CisJCQorCQlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOworCisJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICkKKwkJeworCQkJcmV0dXJuIFFOYW1lLm1hdGNoZXMoIHF1YWxpZmllciwgTUVTU0FHRV9RVUFMSUZJRVIsIG5hbWUsIE1FU1NBR0VfTkFNRSApOworCQl9CisKKwkJcHVibGljIHZvaWQgYWRkQ2RhdGEoIFN0cmluZyBjZGF0YSApCisJCXsKKwkJCWlmIChjZGF0YS50cmltKCkubGVuZ3RoKCkgIT0gMCkKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggImNkYXRhIG5vdCBhbGxvd2VkIGluIG1lc3NhZ2UgYm9keSIgKTsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGFkZFRhZyggUU5hbWUgY2hpbGRRTmFtZSwgTWFwPFFOYW1lLCBTdHJpbmc+IGNoaWxkQXR0cnMgKQorCQl7CisJCQkvLyBvbmx5IGFsbG93IHBhcmFtZXRlciB0YWdzCisJCQlpZiAoIWNoaWxkUU5hbWUubWF0Y2hlcyggUEFSQU1FVEVSX1FVQUxJRklFUiwgUEFSQU1FVEVSX05BTUUgKSkKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggInRhZyAiK2NoaWxkUU5hbWUrIiBub3QgYWxsb3dlZCBpbiBtZXNzYWdlIGJvZHkiICk7CisJCQkKKwkJCVBhcmFtZXRlciBwID0gbmV3IFBhcmFtZXRlciggY2hpbGRBdHRycyApOworCQkJcGFyYW1zLmFkZCggcCApOworCQkJcmV0dXJuIHA7CisJCX0KKworCQlwdWJsaWMgdm9pZCBmaW5pc2goKQorCQl7CisJCQkvLyBub3RoaW5nIHRvIGRvLgorCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oICJtZXNzYWdlIGZpbmlzaGVkOiAiK3RoaXMgKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBMaXN0PFBhcmFtZXRlcj4gcGFyYW1zID0gbmV3IFZlY3RvcjxQYXJhbWV0ZXI+KCk7CisKKwkJcHVibGljIEl0ZXJhdG9yPEVsZW1lbnQ+IGdldENoaWxkcmVuKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRDZGF0YVZhbHVlKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIEl0ZXJhdG9yPFFOYW1lPiBnZXRBdHRyTmFtZXMoKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFFOYW1lIGdldFFOYW1lKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyggUU5hbWUgcU5hbWUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKCBFbGVtZW50IGUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIHZvaWQgY2xlYXIoKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRJbnRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBMb25nIGdldExvbmdBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGZpbmQoIFN0cmluZyBwYXRoICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFRhZ0VsZW1lbnQgZmluZCggU3RyaW5nIG9xdWFsaWZpZXIsIFN0cmluZyBvbmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGZpbmQoIFFOYW1lIHN1YlFOYW1lICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIEl0ZXJhdG9yPEVsZW1lbnQ+IGl0ZXJhdG9yKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQXR0cnMoKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIFRhZ0VsZW1lbnQgYWRkVGFnKCBRTmFtZSBjaGlsZFFOYW1lICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFRhZ0VsZW1lbnQgYWRkVGFnKCBTdHJpbmcgY2hpbGROYW1lLCBNYXA8UU5hbWUsIFN0cmluZz4gY2hpbGRBdHRycyApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGFkZFRhZyggU3RyaW5nIGNoaWxkTmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBpbnQgY291bnRDaGlsZHJlbigpCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXB1YmxpYyBFbGVtZW50IGdldENoaWxkKCBpbnQgaW5kZXggKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNDZGF0YVZhbHVlKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHRvU3RyaW5nKCBXcml0ZXIgd3RyLCBib29sZWFuIG5ld2xpbmVCZXR3ZWVuVGFncywKKwkJCWJvb2xlYW4gY29sbGFwc2VFbXB0eVRhZ3MgKSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJeworCQkJd3RyLndyaXRlKCB0eXBlICk7CisJCQl3dHIud3JpdGUoICI6ICIgKTsKKwkJCXd0ci53cml0ZSggcGFyYW1zLnRvU3RyaW5nKCkgKTsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IHNldEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQorCQl7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IHNldEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUgKQorCQl7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IHNldEF0dHIoIFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBsb25nIHZhbHVlICkKKwkJeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwl9CisJCisJLyoqCisJICogRGVzY3JpcHRpb24gb2YgUGFyYW1ldGVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50IGltcGxlbWVudHMgVGFnRWxlbWVudAorCXsKKwkJLyoqCisJCSAqIENvbnN0cnVjdHMgdGhlIFBhcmFtZXRlci4KKwkJICoKKwkJICogQHBhcmFtIGF0dHJzCisJCSAqLworCQlwdWJsaWMgUGFyYW1ldGVyKCBNYXA8UU5hbWUsIFN0cmluZz4gYXR0cnMgKQorCQl7CisJCQluID0gYXR0cnMuZ2V0KCBuZXcgUU5hbWUoIG51bGwsICJuIiApICk7CisJCQlpZiAobiA9PSBudWxsKQorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAibiBhdHRyaWJ1dGUgbm90IHNwZWNpZmllZCIgKTsKKwkJCQorCQkJdCA9IGF0dHJzLmdldCggbmV3IFFOYW1lKCBudWxsLCAidCIgKSApOworCQkJaWYgKHQgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggInQgYXR0cmlidXRlIG5vdCBzcGVjaWZpZWQiICk7CisJCQkKKwkJCXNldFZhbHVlKCBhdHRycy5nZXQoIG5ldyBRTmFtZSggbnVsbCwgInYiICkgKSApOworCQl9CisJCQorCQlwcml2YXRlIGZpbmFsIFN0cmluZyBuOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdDsKKworCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCXJldHVybiBRTmFtZS5tYXRjaGVzKCBxdWFsaWZpZXIsIFBBUkFNRVRFUl9RVUFMSUZJRVIsIG5hbWUsIFBBUkFNRVRFUl9OQU1FICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBhZGRDZGF0YSggU3RyaW5nIGNkYXRhICkKKwkJeworCQkJc2V0VmFsdWUoIGNkYXRhICk7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBhZGRUYWcoIFFOYW1lIGNoaWxkUU5hbWUsIE1hcDxRTmFtZSwgU3RyaW5nPiBjaGlsZEF0dHJzICkKKwkJeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJzdWJvcmRpbmF0ZSBlbGVtZW50cyBhcmUgbm90IHlldCBzdXBwb3J0ZWQiICk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBmaW5pc2goKQorCQl7CisJCQlpZiAodiA9PSBudWxsKQorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAicGFyYW1ldGVyICIrbisiIHdhcyBub3QgZ2l2ZW4gYSB2YWx1ZSIgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBuYW1lCisJCSAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIG1hdGNoZXMgdGhpcyBwYXJhbWV0ZXIncyBuYW1lCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzTmFtZSggU3RyaW5nIG5hbWUgKQorCQl7CisJCQlyZXR1cm4gbi5lcXVhbHMoIG5hbWUgKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJCXsKKwkJCXJldHVybiBuOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIuCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkKKwkJeworCQkJcmV0dXJuIHY7CisJCX0KKwkJCisJCXByaXZhdGUgdm9pZCBzZXRWYWx1ZSggU3RyaW5nIHMgKQorCQl7CisJCQlpZiAocyA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCQorCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oICJzZXRWYWx1ZTogbmFtZSAnIituKyInIHR5cGUgJyIrdCsiJyB2YWx1ZSAnIitzKyInIiApOworCQkJCisJCQlpZiAodiAhPSBudWxsKQorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAicGFyYW1ldGVyICIrbisiIGFscmVhZHkgaGFzIGEgdmFsdWUiICk7CisJCQkKKwkJCWlmICh0LmVxdWFscyggInMiICkpCisJCQkJdiA9IHM7CisJCQllbHNlIGlmICh0LmVxdWFscyggImkiICkpCisJCQkJdiA9IEludGVnZXIucGFyc2VJbnQoIHMgKTsKKwkJCWVsc2UgaWYgKHQuZXF1YWxzKCAiZCIgKSkKKwkJCQl2ID0gRG91YmxlLnBhcnNlRG91YmxlKCBzICk7CisJCQllbHNlCisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJwYXJhbWV0ZXIgIituKyIgdHlwZSAiK3QrIiBub3Qgc3VwcG9ydGVkIiApOworCQl9CisJCQorCQlwcml2YXRlIE9iamVjdCB2OworCisJCXB1YmxpYyBJdGVyYXRvcjxFbGVtZW50PiBnZXRDaGlsZHJlbigpCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q2RhdGFWYWx1ZSgpCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBJdGVyYXRvcjxRTmFtZT4gZ2V0QXR0ck5hbWVzKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoIFFOYW1lIHFOYW1lICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHJlbW92ZSggRWxlbWVudCBlICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGNsZWFyKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQorCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0SW50QXR0ciggU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgTG9uZyBnZXRMb25nQXR0ciggU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBmaW5kKCBTdHJpbmcgcGF0aCApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGZpbmQoIFN0cmluZyBvcXVhbGlmaWVyLCBTdHJpbmcgb25hbWUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBmaW5kKCBRTmFtZSBzdWJRTmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBJdGVyYXRvcjxFbGVtZW50PiBpdGVyYXRvcigpCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGhhc0F0dHJzKCkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGFkZFRhZyggUU5hbWUgY2hpbGRRTmFtZSApCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBUYWdFbGVtZW50IGFkZFRhZyggU3RyaW5nIGNoaWxkTmFtZSwgTWFwPFFOYW1lLCBTdHJpbmc+IGNoaWxkQXR0cnMgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBhZGRUYWcoIFN0cmluZyBjaGlsZE5hbWUgKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgaW50IGNvdW50Q2hpbGRyZW4oKQorCQl7CisJCQkvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIDA7CisJCX0KKworCQlwdWJsaWMgRWxlbWVudCBnZXRDaGlsZCggaW50IGluZGV4ICkKKwkJeworCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2RhdGFWYWx1ZSgpCisJCXsKKwkJCS8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlwdWJsaWMgdm9pZCB0b1N0cmluZyggV3JpdGVyIHd0ciwgYm9vbGVhbiBuZXdsaW5lQmV0d2VlblRhZ3MsCisJCQlib29sZWFuIGNvbGxhcHNlRW1wdHlUYWdzICkgdGhyb3dzIElPRXhjZXB0aW9uCisJCXsKKwkJCXd0ci53cml0ZSggbiApOworCQkJd3RyLndyaXRlKCAiID0oIiApOworCQkJd3RyLndyaXRlKCB0ICk7CisJCQl3dHIud3JpdGUoICIpICIgKTsKKwkJCXd0ci53cml0ZSggdi50b1N0cmluZygpICk7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICkKKwkJeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgaW50IHZhbHVlICkKKwkJeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQlwdWJsaWMgVGFnRWxlbWVudCBzZXRBdHRyKCBTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSApCisJCXsKKwkJCXJldHVybiB0aGlzOworCQl9CisJfQorCQorCS8qKgorCSAqIERlc2NyaXB0aW9uIG9mIE1FU1NBR0VfUVVBTElGSUVSLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfUVVBTElGSUVSID0gbnVsbDsKKwkKKwkvKioKKwkgKiBEZXNjcmlwdGlvbiBvZiBNRVNTQUdFX05BTUUuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9OQU1FID0gIm0iOworCQorCS8qKgorCSAqIERlc2NyaXB0aW9uIG9mIFBBUkFNRVRFUl9RVUFMSUZJRVIuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX1FVQUxJRklFUiA9IG51bGw7CisJCisJLyoqCisJICogRGVzY3JpcHRpb24gb2YgUEFSQU1FVEVSX05BTUUuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX05BTUUgPSAicCI7Cit9Cg==