LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqCSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwovL0NvZGVtaXJyb3IgZWRpdG9yCnZhciBpbnB1dEVkaXRvcgp2YXIgb3V0cHV0RWRpdG9yCnZhciBPVVRQVVRfU0VQID0gJ1xuLS0tLS0tLS0tLS0tLS0tLS0tXG4nCgpmdW5jdGlvbiBzZW5kRGF0YSh1cmwsIGRhdGEpIHsKICAgICQuYWpheCh7CiAgICAgICAgdHlwZToiUE9TVCIsCiAgICAgICAgdXJsOnVybCwKICAgICAgICBkYXRhOmRhdGEsCi8vICAgICAgICBkYXRhVHlwZToianNvbiIsCiAgICAgICAgdGltZW91dDozMDAwMCwgLy9JbiBtaWxsaXMKICAgICAgICBiZWZvcmVTZW5kOmZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnI2FqYXhTcGlubmVyJykuc2hvdygpOwogICAgICAgIH0sCiAgICAgICAgLyogZXJyb3I6IGZ1bmN0aW9uKCkgewogICAgICAgICAkKCcjc3RhdHVzJykudGV4dCgnVXBkYXRlIGZhaWxlZJd0cnkgYWdhaW4uJykuc2xpZGVEb3duKCdzbG93Jyk7CiAgICAgICAgIH0sKi8KICAgICAgICBjb21wbGV0ZTpmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQoJyNhamF4U3Bpbm5lcicpLmhpZGUoKTsKICAgICAgICB9LAogICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmVuZGVyRGF0YShkYXRhKQogICAgICAgIH0KICAgIH0pOwp9CgpmdW5jdGlvbiByZW5kZXJEYXRhKGRhdGEpewogICAgJCgnI2NvZGUtb3V0cHV0Jykuc2hvdygpOwogICAgdmFyIGN1cnJlbnREYXRhID0gb3V0cHV0RWRpdG9yLmdldFZhbHVlKCkKICAgIC8vSWYgd2UgbmVlZCB0byBhcHBlbmQgdGhlIGRhdGEgdGhlbiB1c2UgYmVsb3cKICAgIC8vRm9yIG5vdyB3ZSBqdXN0IHJlcGxhY2UgdGhlIGV4aXN0aW5nIG91dHB1dAogICAgLy92YXIgb3V0RGF0YSA9IGRhdGEgKyBPVVRQVVRfU0VQKyBjdXJyZW50RGF0YQoKICAgIG91dHB1dEVkaXRvci5zZXRWYWx1ZShkYXRhKQp9CgpmdW5jdGlvbiBzZXRVcENvZGVNaXJyb3IoKSB7CiAgICBDb2RlTWlycm9yLm1vZGVVUkwgPSBwbHVnaW5Sb290ICsgIi9yZXMvdWkvY29kZW1pcnJvci9tb2RlLyVOLyVOLmpzIjsKICAgIGlucHV0RWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOnRydWUsCiAgICAgICAgZXh0cmFLZXlzOiB7CiAgICAgICAgICAgICdDdHJsLVEnOmNsZWFyT3V0cHV0LAogICAgICAgICAgICAnQ3RybC1YJzpleGVjdXRlU2NyaXB0CiAgICAgICAgfQogICAgfSk7CiAgICBvdXRwdXRFZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzdWx0IiksIHsKICAgICAgICAgICAgbGluZU51bWJlcnM6dHJ1ZSwKICAgICAgICAgICAgcmVhZE9ubHk6Im5vY3Vyc29yIgogICAgICAgIH0pOwp9CgpmdW5jdGlvbiB1cGRhdGVXaXRoT3B0aW9uKG9wdCl7CiAgICBzZXRMYW5nTW9kZShpbnB1dEVkaXRvcixvcHQuYXR0cignbGFuZ01vZGUnKSkKICAgICQoJ1tuYW1lPWxhbmddJykudmFsKG9wdC52YWwoKSkKfQoKZnVuY3Rpb24gc2V0TGFuZ01vZGUoZWRpdG9yLCBtb2RlTmFtZSkgewogICAgaWYoIW1vZGVOYW1lKXsKICAgICAgICBtb2RlTmFtZSA9ICJ0ZXh0L3BsYWluIgogICAgfWVsc2V7CiAgICAgICAgQ29kZU1pcnJvci5hdXRvTG9hZE1vZGUoaW5wdXRFZGl0b3IsIG1vZGVOYW1lKTsKICAgIH0KICAgIGVkaXRvci5zZXRPcHRpb24oIm1vZGUiLCBtb2RlTmFtZSk7Cn0KCmZ1bmN0aW9uIHNldFVwTGFuZ09wdGlvbnMoKSB7CiAgICB2YXIgY29kZUxhbmcgPSAkKCcjY29kZUxhbmcnKQogICAgdmFyIG9wdGlvbnMgPSBjb2RlTGFuZy5wcm9wID8gY29kZUxhbmcucHJvcCgnb3B0aW9ucycpIDogY29kZUxhbmcuYXR0cignb3B0aW9ucycpOwogICAgY29kZUxhbmcuZW1wdHkoKQoKICAgIGZvcih2YXIgaSBpbiBzY3JpcHRDb25maWcpewogICAgICAgIHZhciBjb25maWcgPSBzY3JpcHRDb25maWdbaV0KICAgICAgICB2YXIgb3B0ID0gbmV3IE9wdGlvbihjb25maWcubGFuZ05hbWUsY29uZmlnLmxhbmdDb2RlKTsKICAgICAgICBpZihjb25maWcubW9kZSl7CiAgICAgICAgICAgIG9wdC5sYW5nTW9kZSA9IGNvbmZpZy5tb2RlOwogICAgICAgIH0KICAgICAgICBvcHRpb25zW29wdGlvbnMubGVuZ3RoXSA9IG9wdAogICAgfQogICAgJCgnI2NvZGVMYW5nJykuY2hhbmdlKGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIG9wdCA9ICQodGhpcykuZmluZCgiOnNlbGVjdGVkIik7CiAgICAgICAgdXBkYXRlV2l0aE9wdGlvbihvcHQpCiAgICB9KTsKCiAgICAkKCcjY29kZUxhbmcgb3B0aW9uOmVxKDApJykuYXR0cignc2VsZWN0ZWQnLCdzZWxlY3RlZCcpCiAgICB1cGRhdGVXaXRoT3B0aW9uKCQob3B0aW9uc1swXSkpCn0KCmZ1bmN0aW9uIGV4ZWN1dGVTY3JpcHQoKXsKICAgIGlucHV0RWRpdG9yLnNhdmUoKSAvL0NvcHkgdGhlIGNvbnRlbnRzIHRvIHRleHRhcmVhIGZvcm0gZmllbGQKICAgIHNlbmREYXRhKHBsdWdpblJvb3QsICQoIiNjb25zb2xlRm9ybSIpLnNlcmlhbGl6ZSgpKTsKfQoKZnVuY3Rpb24gY2xlYXJPdXRwdXQoKXsKICAgIG91dHB1dEVkaXRvci5zZXRWYWx1ZSgnJykKfQoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgiI2V4ZWN1dGVCdXR0b24iKS5jbGljayhleGVjdXRlU2NyaXB0KTsKICAgICQoJyNhamF4U3Bpbm5lcicpLmhpZGUoKTsKICAgICQoJyNjb2RlLW91dHB1dCcpLmhpZGUoKTsKICAgIHNldFVwQ29kZU1pcnJvcigpOwogICAgc2V0VXBMYW5nT3B0aW9ucygpOwp9KTsK